Príprava databázy, čistenie a úprava údajov
Rovnako ako v prípade predošlej úlohy, aj v tomto prípade pracujem s
údajmi výhradne pre Slovenskú republiku, takže v následujúcom kroku si
vyfiltrujem konkrétne hodnoty zvolených premenných pre túto krajinu.
library(dplyr)
library(knitr)
# Načítanie dát
wh_data <- read.csv("World Happiness Report 2005-2021.csv", sep = ",", dec = ".", header = TRUE)
# Filtrovanie a výber premenných
data_slovakia <- wh_data %>%
filter(Country.name == "Slovakia") %>%
select(Confidence.in.national.government,
Perceptions.of.corruption,
Freedom.to.make.life.choices,
Social.support)
# Zobrazenie tabuľky
kable(data_slovakia, caption = "Údaje pre Slovensko")
Údaje pre Slovensko
| Confidence.in.national.government |
Perceptions.of.corruption |
Freedom.to.make.life.choices |
Social.support |
| 0.1630792 |
0.9457313 |
0.5424797 |
0.9535792 |
| 0.3086795 |
0.9071360 |
0.6357577 |
0.9196400 |
| 0.2787239 |
0.9071323 |
0.7271631 |
0.9172934 |
| 0.3683802 |
0.9065322 |
0.6200043 |
0.9257514 |
| 0.2834932 |
0.9145399 |
0.5979358 |
0.9093785 |
| 0.3101815 |
0.9138702 |
0.6347917 |
0.9242427 |
| 0.2765307 |
0.9275451 |
0.5871577 |
0.9434537 |
| 0.3722222 |
0.9166092 |
0.7000985 |
0.9451791 |
| 0.3416801 |
0.9204227 |
0.7142247 |
0.9133866 |
| 0.3276586 |
0.9099447 |
0.7576340 |
0.9223787 |
| 0.2309728 |
0.9258467 |
0.7711216 |
0.9330883 |
| 0.3074445 |
0.9005337 |
0.7618966 |
0.9541600 |
| 0.2158076 |
0.8955466 |
0.7415332 |
0.9511639 |
Následne premenujem stĺpce pre jednoduchšiu prácu a imputujem
chýbajúce hodnoty (NA) v každom stĺpci pomocou mediánu, čím zabezpečím,
že regresný model bude môcť použiť maximálny počet pozorovaní.
wh_data <- read.csv("World Happiness Report 2005-2021.csv", sep = ",", dec = ".", header = TRUE)
data_slovakia <- wh_data %>%
filter(`Country.name` == "Slovakia") %>%
select(`Confidence.in.national.government`, `Perceptions.of.corruption`, `Freedom.to.make.life.choices`, `Social.support`)
# Premenovanie stĺpcov pre jednoduchšiu prácu
colnames(data_slovakia) <- c("Confidence", "Corruption", "Freedom", "Support")
# Imputácia chýbajúcich hodnôt mediánom
column_medians <- sapply(data_slovakia, median, na.rm = TRUE)
for (col in names(data_slovakia)) {
data_slovakia[[col]][is.na(data_slovakia[[col]])] <- column_medians[col]
}
Ďalej si pre každú premennú vygenerujem boxplot za účelom overenia
prípadných nezrovnalostí (konkrétne výskytu odľahlých hodnôt, tzv.
outliers).
par(mfrow = c(2, 2))
par(mar = c(4, 4, 2, 1))
# Vykreslenie boxplotov pre každú premennú
for (col in names(data_slovakia)) {
boxplot(data_slovakia[[col]],
main = col,
xlab = "Hodnota",
col = "lightblue",
border = "darkblue")
}
# Nadpis pre všetky grafy
mtext("Boxploty jednotlivých premenných (Slovensko)", outer = TRUE, cex = 1.4, font = 2)
# Resetovanie rozloženia na 1 graf
par(mfrow = c(1, 1))

Vizualizácia rozdelenia hodnôt pomocou boxplotov mi jasne ukázala, že
v prípade dvoch premenných, konkrétne Confidence (Dôvera vo vládu) a
Corruption (Vnímanie korupcie), mám prítomné odľahlé hodnoty. Tieto
extrémy musím teraz odstrániť, pretože ich ponechanie v dátach by mohlo
skresliť odhadované regresné koeficienty a vážne oslabiť spoľahlivosť
celého môjho lineárneho modelu.
remove_outliers <- function(x) {
q1 <- quantile(x, 0.25, na.rm = TRUE)
q3 <- quantile(x, 0.75, na.rm = TRUE)
iqr <- q3 - q1
lower <- q1 - 1.5 * iqr
upper <- q3 + 1.5 * iqr
x[x < lower | x > upper] <- NA
return(x)
}
# Aplikácia na všetky stĺpce
data_slovakia_clean <- data_slovakia %>%
mutate(
Confidence = remove_outliers(Confidence),
Corruption = remove_outliers(Corruption),
Freedom = remove_outliers(Freedom),
Support = remove_outliers(Support)
)
Ďalej som odstránila všetky riadky, v ktorých po odstránení odľahlých
hodnôt zostala aspoň jedna chýbajúca hodnota (NA), čím zabezpečím, že
môj regresný model bude pracovať len s kompletnými a čistými
pozorovaniami.
data_slovakia_clean <- na.omit(data_slovakia_clean)
Po všetkých vyššie uvedených korekciách nasleduje opätovná
vizualizácia všetkých 4 boxplotov.
par(mfrow = c(2, 2))
for (col in names(data_slovakia_clean)) {
boxplot(data_slovakia_clean[[col]],
main = col,
xlab = "Hodnota",
col = "lightblue",
border = "darkblue")
}
par(mfrow = c(1, 1))

Možno konštatovať, že vizuálna kontrola potvrdila úspešné odstránenie
odľahlých hodnôt.
Confidence (Dôvera vo vládu): Medián
dôvery sa nachádza na hodnote \(0.25\),
čo naznačuje dlhodobo nízku priemernú (v porovnaní s ostatnými
hodnotami) dôveru v národnú vládu. Napriek čisteniu dát je to najviac
rozptýlená premenná, čo potvrdzuje najdlhší vertikálny rozsah
jednotlivých úsečiek a boxu zo všetkých štyroch grafov. To znamená, že
dôvera občanov vo vládu je počas rokov veľmi nestála a
kolísavá.
Corruption (Vnímanie korupcie): Medián
sa pohybuje okolo \(0.895\), čo je
veľmi blízko hornej hranice (1.0). To ilustruje, že vnímanie korupcie je
na Slovensku chronicky vysoké a takmer v každom sledovanom roku bolo
vnímané ako vážny problém.
Freedom (Sloboda voľby): Medián je na
hodnote \(0.60\), čo značí, že
priemerný pocit slobody voľby je len mierne nad neutrálnym stredom
(\(0.50\)). Krátky rozsah fúzov a boxu
potvrdzuje, že vnímanie slobody je stabilné a v čase sa výrazne nemení,
no vzhľadom na vysoké skóre ostatných skúmaných premených je táto
hodnota relatívne nízka, čo naznačuje zreteľný priestor pre zlepšenie v
tom, ako obyvatelia vnímajú svoju osobnú slobodu.
Support (Sociálna podpora): Táto
premenná s mediánom na hodnote \(0.91\)
je najkoncentrovanejšia, t.j. s najkratším boxom a fúzami. Ukazuje to,
že vnímaná sociálna podpora (spoliehanie sa na priateľov/rodinu) je na
Slovensku extrémne stabilná a veľmi vysoká, čo ilustruje silnú a
spoľahlivú osobnú sociálnu sieť.
Lineárna regresia
model <- lm(Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)
summary(model)
Call:
lm(formula = Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)
Residuals:
Min 1Q Median 3Q Max
-0.070286 -0.031902 -0.003962 0.032197 0.081032
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.0501 2.0948 0.501 0.630
Corruption -0.1748 1.7882 -0.098 0.925
Freedom -0.1348 0.2596 -0.519 0.618
Support -0.5335 1.1512 -0.463 0.655
Residual standard error: 0.05442 on 8 degrees of freedom
Multiple R-squared: 0.07889, Adjusted R-squared: -0.2665
F-statistic: 0.2284 on 3 and 8 DF, p-value: 0.8741
Tento výstup mi zobrazil súhrn modelu a potvrdil, že žiadna z
mojich pracovných hypotéz nebola splnená, pretože Korupcia, Sloboda
a Sociálna podpora spoločne nevedia významne vysvetliť Dôveru vo vládu.
Tento záver je podložený extrémne vysokou p-hodnotou F-testu (\(0.8741\)), čo znamená, že
model ako celok je štatisticky nevýznamný. Navyše,
R-kvadrát s hodnotou len \(0.0789\)
ukazuje, že môj model dokáže vysvetliť iba \(8\%\) variability Dôvery vo vládu. Zistila
som, že žiadna z premenných nie je významná a dokonca Sloboda vyšla s
neočakávaným negatívnym znamienkom, hoci to nie je štatisticky
podstatné.
model <- lm(Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)
print("Odhadnuté koeficienty sú:")
[1] "Odhadnuté koeficienty sú:"
print(model$coefficients)
(Intercept) Corruption Freedom Support
1.0500560 -0.1748333 -0.1348024 -0.5334834
print("Odhadnuté rezíduá:")
[1] "Odhadnuté rezíduá:"
print(model$residuals)
2 3 4 5 6 7 8
-0.006464541 -0.025350999 0.054267282 -0.040929199 -0.001459967 -0.028892390 0.081032297
9 10 11 12 13
0.036100442 0.030895885 -0.055478171 0.026565799 -0.070286437
print("Vyrovnané hodnoty vysvetľovanej premennej sú:")
[1] "Vyrovnané hodnoty vysvetľovanej premennej sú:"
print(model$fitted.values)
2 3 4 5 6 7 8 9 10 11
0.3151441 0.3040749 0.3141129 0.3244224 0.3116415 0.3054231 0.2911899 0.3055796 0.2967627 0.2864510
12 13
0.2808787 0.2860940
print("Matica modelu X:")
[1] "Matica modelu X:"
X <- model.matrix(model)
print(X)
(Intercept) Corruption Freedom Support
2 1 0.9071360 0.6357577 0.9196400
3 1 0.9071323 0.7271631 0.9172934
4 1 0.9065322 0.6200043 0.9257514
5 1 0.9145399 0.5979358 0.9093785
6 1 0.9138702 0.6347917 0.9242427
7 1 0.9275451 0.5871577 0.9434537
8 1 0.9166092 0.7000985 0.9451791
9 1 0.9204227 0.7142247 0.9133866
10 1 0.9099447 0.7576340 0.9223787
11 1 0.9258467 0.7711216 0.9330883
12 1 0.9005337 0.7618966 0.9541600
13 1 0.8955466 0.7415332 0.9511639
attr(,"assign")
[1] 0 1 2 3
print("Diagonála hat-matrix (vplyv jednotlivých pozorovaní):")
[1] "Diagonála hat-matrix (vplyv jednotlivých pozorovaní):"
print(diag(X %*% solve(t(X) %*% X) %*% t(X)))
2 3 4 5 6 7 8 9 10 11
0.2176273 0.2451038 0.2432431 0.3365416 0.1397919 0.6657322 0.2203391 0.3060035 0.2481669 0.5207307
12 13
0.4035421 0.4531777
# Súhrnný výstup modelu
summary(model)
Call:
lm(formula = Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)
Residuals:
Min 1Q Median 3Q Max
-0.070286 -0.031902 -0.003962 0.032197 0.081032
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.0501 2.0948 0.501 0.630
Corruption -0.1748 1.7882 -0.098 0.925
Freedom -0.1348 0.2596 -0.519 0.618
Support -0.5335 1.1512 -0.463 0.655
Residual standard error: 0.05442 on 8 degrees of freedom
Multiple R-squared: 0.07889, Adjusted R-squared: -0.2665
F-statistic: 0.2284 on 3 and 8 DF, p-value: 0.8741
V druhom kroku som si “vyžiadala” detaily o vnútornej štruktúre
modelu, aby som preverila jeho metodologickú kvalitu. Zistila som, že
reziduá sú veľmi malé, čo je dobré. Najdôležitejšie je však to, že
kontrola pomocou diagonály hat-matrix potvrdila, že žiadne
jednotlivé pozorovanie nemá neprimerane veľký vplyv na výpočet
koeficientov. To je kľúčové zistenie, pretože aj keď je môj model
celkovo neúspešný vo vysvetľovaní Dôvery, môžem s istotou tvrdiť, že
jeho odhady sú spoľahlivé a nie sú skreslené chybami ani
extrémnymi dátovými bodmi.
par(mfrow = c(2, 2))
plot(model)
# Resetovanie rozloženia na 1 graf
par(mfrow = c(1, 1))

Residuals vs. Fitted
Tento graf vizuálne potvrdzuje splnenie predpokladu linearity a
homoskedasticity pre môj model. To znamená, že body sú rozptýlené
pomerne rovnomerne okolo nulovej horizontálnej osi a táto os je navyše
takmer rovná. To naznačuje, že vzťah medzi mojimi prediktormi (Korupcia,
Sloboda, Podpora) a Dôverou vo vládu nie je zásadne zakrivený a že chyby
modelu sú rozložené konzistentne.V praxi to znamená, že neexistuje
žiadny dôkaz, že by sa dôvera vo vládu začala pri určitom bode (napr.
pri veľmi nízkej korupcii) správať nelineárne, ako napríklad prudko
stúpať namiesto pomalého rastu.
Q-Q plot
Tento graf vizuálne preveruje normálne rozdelenie reziduí, čo je
kľúčový predpoklad pre spoľahlivosť \(t\)-testov a \(F\)-testu v OLS regresii. Vzhľadom na to,
že môj \(F\)-test už ukázal
nevýznamnosť, tento graf kontroluje kvalitu odhadov. Vizuálne možno
konštatovať odchýlku od normality, pretože body na chvostoch distribúcie
(extrémy) sa viditeľne vzdialili od teoretickej diagonálnej čiary, čo
indikuje, že distribúcia chýb môjho modelu má ťažšie chvosty (fat
tails). Z tohto dôvodu je kriticky dôležité spustiť následný Jarque-Bera
test, aby sme štatisticky zistili, či je táto vizuálna abnormalita
natoľko závažná, že by definitívne potvrdila neschopnosť modelu
spoľahlivo robiť akékoľvek závery.
Scale location plot
Tento graf slúži na definitívne overenie homoskedasticity, teda
predpokladu konštantného rozptylu chýb. Môžem potvrdiť splnenie tohto
kľúčového predpokladu, pretože červená os je takmer úplne plochá a body
nevykazujú žiaden zjavný lievikovitý tvar, čo by signalizovalo
problém.
V praxi to pre môj model Dôvery vo vládu znamená, že spoľahlivosť
chýb modelu je rovnaká bez ohľadu na to, akú úroveň Dôvery predikujem.
Inak povedané, model je rovnako spoľahlivý (alebo rovnako zlý) v
predpovedi pre roky s nízkou Dôverou (ľavá strana) ako aj pre roky s
vyššou Dôverou (pravá strana).
Hoci je celkový rozptyl konštantný, je možné vidieť jemný náznak
lievikovitého tvaru v extrémnych prípadoch. Ak by sa táto odchýlka
potvrdila, mohlo by to byť spôsobené tým, že chyba modelu je väčšia pri
extrémne nízkych hodnotách Dôvery, napríklad v krízových rokoch, kde je
Dôvera nízka, no politická reakcia je nepredvídateľná. Keďže je ale táto
odchýlka minimálna, možno ju ignorovať a považovať predpoklad za
splnený.
Residuals vs Leverage
Tento graf slúži na finálnu kontrolu dát, presnejšie na identifikáciu
vplyvných pozorovaní (bodov s vysokou pákou), ktoré by mohli ovplyvniť
regresnú čiaru. S potešením konštatujem, že žiaden dátový bod nemá
extrémne vysokú páku ani vplyv na výpočet koeficientov, pretože žiaden
bod neprekročil Cútove vzdialenosti (červené prerušované čiary \(0.5\) a \(1\)). Týmto sa definitívne potvrdzuje
robustnosť môjho modelu. Hoci som outliers z boxplotov odstránila už
predtým, tento graf mi dáva istotu, že v dátach nezostal žiaden skrytý
vplyvný bod, a môžem tvrdiť, že aj napriek nevýznamnosti \(F\)-testu neboli koeficienty skreslené
žiadnym jednotlivým rokom.
# Test normality reziduí
residuals <- residuals(model)
jb_test <- jarque.bera.test(residuals)
jb_test
Jarque Bera Test
data: residuals
X-squared = 0.56427, df = 2, p-value = 0.7542
# Test odľahlých hodnôt (Bonferroni korekcia)
outlier_test <- outlierTest(model)
outlier_test
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
Jarque-Bera test overuje predpoklad, či sú chyby
môjho modelu (reziduá) normálne rozdelené. Tento predpoklad je splnený,
pretože výsledná p-hodnota \(0.7542\)
je oveľa vyššia ako kritická hodnota \(0.05\). Preto môžem tvrdiť, že aj napriek
vizuálnej miernej odchýlke v Q-Q grafe, sú moje reziduá štatisticky
normálne rozdelené, čo zabezpečuje spoľahlivosť \(t\)-testov koeficientov (hoci vyšli
nevýznamné).
Bonferroniho korekcia slúži na definitívne
potvrdenie čistoty dát po tom, čo som už manuálne odstránila outliers z
boxplotov. Výstup “No Studentized residuals with Bonferroni p <
0.05” je kľúčový a znamená, že v mojom modeli nezostal žiadny
štatisticky významný outlier, ktorý by mohol pokaziť výsledky. Hoci mi R
vypísalo najpodozrivejšie pozorovanie (s ID \(13\)), jeho Bonferroni p-hodnota (\(0.91663\)) je extrémne vysoká, čo
potvrdzuje, že to nie je problém. Vďaka tomuto testu môžem s istotou
tvrdiť, že aj keď môj celkový regresný model vyšiel štatisticky
nevýznamný, viem, že táto nevýznamnosť nebola spôsobená nečistými
dátami. Inými slovami, model nefunguje kvôli povahe premenných, a nie
kvôli zlej dátovej príprave.
Nižšie je súhrn všetkého, čo som v rámci tejto kapitoly
interpretovala:
summary(model)
Call:
lm(formula = Confidence ~ Corruption + Freedom + Support, data = data_slovakia_clean)
Residuals:
Min 1Q Median 3Q Max
-0.070286 -0.031902 -0.003962 0.032197 0.081032
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.0501 2.0948 0.501 0.630
Corruption -0.1748 1.7882 -0.098 0.925
Freedom -0.1348 0.2596 -0.519 0.618
Support -0.5335 1.1512 -0.463 0.655
Residual standard error: 0.05442 on 8 degrees of freedom
Multiple R-squared: 0.07889, Adjusted R-squared: -0.2665
F-statistic: 0.2284 on 3 and 8 DF, p-value: 0.8741
par(mfrow = c(2, 2))
plot(model)
mtext("Diagnostické grafy regresného modelu: Dôvera vo vládu (Slovensko)",
outer = TRUE, cex = 1.2, font = 2, line = -1.5)
par(mfrow = c(1, 1))

library(tseries) # Pre Jarque-Bera test
library(car) # Pre outlierTest
print("--- TEST NORMALITY REZIDUÍ (Jarque-Bera test) ---")
[1] "--- TEST NORMALITY REZIDUÍ (Jarque-Bera test) ---"
residuals <- residuals(model)
jb_test <- jarque.bera.test(residuals)
print(jb_test)
Jarque Bera Test
data: residuals
X-squared = 0.56427, df = 2, p-value = 0.7542
print("--- TEST ODĽAHLÝCH HODNÔT (Outlier Test) ---")
[1] "--- TEST ODĽAHLÝCH HODNÔT (Outlier Test) ---"
outlier_test <- outlierTest(model)
print(outlier_test)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
Záver
Hlavným výsledkom analýzy je, že žiadna z mojich pracovných hypotéz
nebola potvrdená. Celý regresný model je štatisticky nevýznamný
(p-hodnota F-testu je \(0.8741\)), čo
znamená, že tri zvolené premenné spoločne nedokážu významne vysvetliť
zmeny v Dôvere vo vládu. Navyše, extrémne nízky \(R\)-kvadrát (\(0.0789\)) potvrdil, že model vysvetľuje len
necelých \(8\%\) variability
Dôvery.
Hoci koeficient Korupcie vyšiel s očakávaným negatívnym
znamienkom (\(-0.1748\)) a koeficient
Slobody vyšiel negatívne (\(-0.1348\))
v rozpore s očakávaním, žiaden z týchto vplyvov nebol
štatisticky významný.
Napriek štatistickej nevýznamnosti modelu bola celá analýza
metodologicky robustná a dátový súbor bol
dokonale čistý. Potvrdili to nasledovné zistenia:
Normalita a homoskedasticita: Štatistický Jarque-Bera test
(p-hodnota \(0.7542\)) potvrdil, že
reziduá sú normálne rozdelené, a vizualizácia Scale-Location grafu
potvrdila konštantný rozptyl chýb.
Čistota Dát: Bonferroniho korekcia a Outlier Test
definitívne potvrdili, že v dátovom súbore nezostal žiadny štatisticky
významný outlier. Rovnako graf Residuals vs. Leverage potvrdil, že
koeficienty neboli skreslené žiadnym vplyvným pozorovaním.
Na záver môžem s istotou konštatovať, že zlyhanie modelu
nebolo spôsobené chybami v dátach ani v metodike spracovania, ale
skutočnosťou, že Dôvera vo vládu na Slovensku nie je štatisticky
ovplyvnená faktormi Vnímanie korupcie, Sloboda voľby a Sociálna podpora
v rámci daného časového radu. Budúca analýza by sa mala zamerať
na odlišné, pravdepodobne makroekonomické alebo politické, faktory.
Hoci by bol tento konkrétny model v praxi považovaný za zbytočný,
keďže je štatisticky nevýznamný, no práve toto zistenie o
neexistencii významného vzťahu medzi zvolenými sociálnymi faktormi a
Dôverou vo vládu na Slovensku je samo o sebe cenným prínosom, ktorý
presúva focus na hľadanie odlišných, v modeli nezahrnutých,
vysvetľujúcich premenných.
Heteroskedasticita - CVIKO 7
Prítomnosť heteroskedasticity (nekonštantného rozptylu náhodnej
zložky) je kritický problém, pretože by viedla k nesprávnemu
vyhodnocovaniu \(t\)-testov
významnosti regresných koeficientov. Preto je nevyhnutné, aby
sme tento predpoklad dôkladne overili.
Aj keď sme už vizuálne preverili graf Scale-Location
a zistili, že rozptyl je konštantný, je potrebné tento záver
definitívne potvrdiť pre každú hlavnú vysvetľujúcu
premennú a následne štatistickým testom.
Preto sa v tejto sekcii zameriam na nasledovné kroky:
Vizuálna detekcia: Skúmanie závislosti štvorcov
rezíduí od premenných Vnímanie korupcie a Sloboda voľby
(pomocou grafov vygenerovaných v predošlom kroku). Týmto sa vizuálne
uistím, že rozptyl chýb nie je závislý od hodnôt prediktorov.
Štatistická detekcia: Použitie Breusch-Pagan
testu na formálne potvrdenie, že homoskedasticita je v tomto modeli
model splnená.
library(ggplot2)
library(patchwork)
p_corr <- ggplot(data_slovakia_clean, aes(x = Corruption, y = resid(model)^2)) +
geom_point(alpha = 0.7, color = "darkblue") + # Zmena farby bodov
geom_smooth(method = "lm", se = FALSE, color = "darkred", linetype = "dashed") +
labs(x = "Vnímanie korupcie (Corruption)",
y = "Štvorcové reziduá (Squared Residuals)",
title = "Reziduá vs. Korupcia") +
theme_classic()
p_free <- ggplot(data_slovakia_clean, aes(x = Freedom, y = resid(model)^2)) +
geom_point(alpha = 0.7, color = "darkgreen") +
geom_smooth(method = "lm", se = FALSE, color = "darkorange", linetype = "dotted") +
labs(x = "Sloboda voľby (Freedom)",
y = "Štvorcové reziduá (Squared Residuals)",
title = "Reziduá vs. Sloboda") +
theme_classic()
# Spojenie grafov vedľa seba
p_corr + p_free

Tieto grafy slúžia na detailnú vizuálnu kontrolu homoskedasticity
tým, že vykresľujú štvorcové reziduá modelu (mieru chyby) oproti dvom
hlavným vysvetľujúcim premenným.
Graf 1: Reziduá vs. Vnímanie Korupcie
Tento graf ukazuje, ako sa mení rozptyl chýb nášho modelu v
závislosti od úrovne vnímanej korupcie.
Chyba modelu: Body v grafe predstavujú druhú
mocninu chyby (reziduum), ktorú tento model urobil pre každý jednotlivý
rok. Vizuálne vidíme, že tieto body sú silne rozptýlené a ďaleko od
nuly. To je priamym dôsledkom toho, že je tento regresný model je
veľmi slabý (\(R^2 \approx 8\%\),
ako som uvádzala už na začiatku regresnej analýzy) a robí veľké chyby
pri predpovedi Dôvery vo vládu.
Interpretácia Červenej Čiary: Napriek veľkému
rozptylu jednotlivých chýb je kľúčové, že červená prerušovaná čiara,
ktorá ukazuje priemerný trend rozptylu, je úplne plochá. To
potvrdzuje, že rozptyl chýb je konštantný – veľkosť chyby nie je
systematicky závislá od úrovne korupcie.
Graf 2: Reziduá vs. Sloboda Voľby
Tento graf preveruje rovnaký predpoklad pre premennú Sloboda
voľby.
Chyba modelu: Podobne ako pri korupcii, aj v
tomto grafe je viditeľný veľký vertikálny rozptyl jednotlivých
zelených bodov. To opäť potvrdzuje, že model má nízku prediktívnu
silu.
Interpretácia Oranžovej Čiary: Oranžová
bodkovaná čiara, ktorá mapuje priemerný trend rozptylu, je plochá a
nemá žiaden sklon. To znamená, že chyba nášho modelu je rovnako
veľká bez ohľadu na úroveň Slobody voľby, čím je splnený predpoklad
konštantného rozptylu (homoskedasticity).
library(ggplot2)
library(patchwork)
data_slovakia_clean$log_Support <- log(data_slovakia_clean$Support)
p_log_supp <- ggplot(data_slovakia_clean, aes(x = log_Support, y = resid(model)^2)) +
geom_point(alpha = 0.7, color = "purple") +
geom_smooth(method = "lm", se = FALSE, color = "deeppink", linetype = "dotdash") + # Zmena štýlu čiary
labs(x = "Log(Sociálna podpora)",
y = "Štvorcové reziduá (Squared Residuals)",
title = "Reziduá vs. Log(Sociálna podpora)") +
theme_bw()
p_free_log <- ggplot(data_slovakia_clean, aes(x = Freedom, y = resid(model)^2)) +
geom_point(alpha = 0.7, color = "darkgreen") +
geom_smooth(method = "lm", se = FALSE, color = "darkorange", linetype = "dashed") +
labs(x = "Sloboda voľby (Freedom)",
y = "Štvorcové reziduá (Squared Residuals)",
title = "Reziduá vs. Sloboda") +
theme_bw()
# Spojenie grafov vedľa seba
p_log_supp + p_free_log

Napriek tomu, že tento model splnil predpoklad
homoskedasticity (vizuálne aj štatisticky), tento krok
demonštruje postup, akým by sme heteroskedasticitu odstránili, ak by sa
potvrdila.
Graf 1: Reziduá vs. Log(Sociálna podpora)
- Pozorovanie trendu: Na grafe vidíme, že vyhladená
ružová bodkovaná čiara je opäť horizontálna a nemá žiadny sklon. To
potvrdzuje, že aj po logaritmickej transformácii premennej Sociálna
podpora zostáva rozptyl chýb konštantný. Tento výsledok je v súlade s
našimi predchádzajúcimi zisteniami, že pôvodný model už je
homoskedastický a transformácia nebola nutná.
Graf 2: Reziduá vs. Sloboda Voľby
- Pozorovanie trendu: Opakovanie vizualizácie pre
Slobodu s použitím inej farebnej témy slúži len ako kontrolné
porovnanie. Oranžová prerušovaná čiara je rovnako plochá. Všetky
vizuálne kontroly teda súhlasia - model neobsahuje
heteroskedasticitu.
Testovanie prítomnosti heteroskedasticity
Pred vykonaním Breusch-Pagan testu stanovujeme nasledujúce hypotézy o
konštantnosti rozptylu chýb:
Nulová hypotéza (\(\boldsymbol{H}_{0}\)): Model je
homoskedastický (rozptyl chýb je konštantný).
Alternatívna hypotéza (\(\boldsymbol{H}_{1}\)): Model je
heteroskedastický (rozptyl chýb je nekonštantný).
library(lmtest)
bptest(model)
studentized Breusch-Pagan test
data: model
BP = 2.7629, df = 3, p-value = 0.4296
Keďže dosiahnutá \(p\)-hodnota
(\(0.4296\)) je výrazne vyššia ako
štandardná hladina významnosti \(\alpha =
0.05\), nulovú hypotézu nezamietame.
V praxi to znamená, že štandardné chyby regresných koeficientov sú
spoľahlivo a korektne vypočítané. Homoskedasticita tak nie je príčinou
štatistickej nevýznamnosti celého modelu (\(F\)-test \(p=0.8741\)), čím sa potvrdzuje
metodologická korektnosť analýzy.
library(sandwich)
library(lmtest)
coeftest(model, vcov = vcovHC(model))
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.05006 3.39223 0.3095 0.7648
Corruption -0.17483 3.21853 -0.0543 0.9580
Freedom -0.13480 0.36930 -0.3650 0.7246
Support -0.53348 1.58773 -0.3360 0.7455
Aplikácia robustných štandardných chýb slúžila na overenie,
či by prítomnosť prípadnej, hoci Breusch-Pagan testom nezistenej,
heteroskedasticity zmenila naše závery o významnosti.
Výsledok testu potvrdzuje náš predchádzajúci nález: Všetky \(p\)-hodnoty sú aj po aplikácii robustných
chýb (v rozsahu od \(0.7246\) do \(0.9580\)) výrazne vyššie ako hladina
významnosti \(\alpha = 0.05\). V
dôsledku toho hlavný záver zostáva nezmenený: ani jedna z
vysvetľujúcich premenných (Vnímanie korupcie, Sloboda voľby, Sociálna
podpora) nemá štatisticky významný vplyv na Dôveru vo vládu.
Nakoľko sa robustné štandardné chyby nelíšia signifikantne od pôvodných,
preukázali sme, že model je homoskedastický a robustný.
Záver
Cieľom tejto analýzy bolo preskúmať vplyv Korupcie, Slobody voľby a
Sociálnej podpory na Dôveru vo vládu pomocou lineárnej regresie.
Štatistická analýza preukázala, že ani jeden z faktorov
(Korupcia, Sloboda, Sociálna podpora) nemá štatisticky významný vplyv na
Dôveru vo vládu v sledovanom období. Nízka vysvetľujúca sila
modelu (\(R^2 \approx 8\%\)) potvrdila,
že táto trojica premenných nedokáže predpovedať Dôveru vo vládu.
Aj napriek neúspechu modelu sme podrobne preverili jeho metodologickú
kvalitu. Homoskedasticita (konštantný rozptyl chýb) bola
splnená – vizuálne aj štatisticky (Breusch-Pagan \(p = 0.4296\)).
Splnenie homoskedasticity znamená, že chyba tohto modelu je
rovnako veľká bez ohľadu na to, či meriame vplyv pri nízkej alebo
vysokej Slobode voľby.
LS0tCnRpdGxlOiAiRWtvbm9tZXRyaWEgdiBSIC0gY3ZpxI1lbmllIDUiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IExpbmRhIEtha2Fzb3ZhCi0tLQoKUyB2eXXFvml0w61tIGRhdGFiw6F6eSBbV29ybGQgSGFwcGluZXNzIFJlcG9ydCAyMDA1LTIwMjFdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvamFoYWlkdWxpc2xhbS93b3JsZC1oYXBwaW5lc3MtcmVwb3J0LTIwMDUtMjAyMSkgZGF0YWJhc2UuCgojIMOadm9kIGRvIHByb2Jsw6ltdQpQcmVkbWV0b20gdGVqdG8gZW1waXJpY2tlaiBhbmFsw716eSBqZSDFoXTDumRpdW0gKipEw7R2ZXJ5IHYgbsOhcm9kbsO6IHZsw6FkdSoqICgqQ29uZmlkZW5jZSBpbiBuYXRpb25hbCBnb3Zlcm5tZW50KikgbmEgU2xvdmVuc2t1IHBvxI1hcyBzbGVkb3ZhbsOpaG8gb2Jkb2JpYSwgcyB2eXXFvml0w61tIGTDoXQgeiBkYXRhYsOhenkgPHU+IFdvcmxkIEhhcHBpbmVzcyBSZXBvcnQ8L3U+LiBEw7R2ZXJhIHYgaW7FoXRpdMO6Y2llIGplIGvEvsO6xI1vdsO9bSBpbmRpa8OhdG9yb20gc29jacOhbG5laiBzw7pkcsW+bm9zdGkgYSBrdmFsaXR5IHNwcsOhdnkgdmVjw60gdmVyZWpuw71jaC4gTW9qw61tIGNpZcS+b20gamUgaWRlbnRpZmlrb3ZhxaUsIGt0b3LDqSBmYWt0b3J5IHogcG9udWt5IGRvc3R1cG7DvWNoIGTDoXQgbWFqw7ogxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gdnBseXYgbmEga29sw61zYW5pZSBkw7R2ZXJ5IG9ixI1hbm92IHYgbsOhcm9kbsO6IHZsw6FkdS4KClJvemhvZGxhIHNtZSBzYSBtb2RlbG92YcWlICoqRMO0dmVydSB2IG7DoXJvZG7DuiB2bMOhZHUqKiAoKkNvbmZpZGVuY2UqKSB2IHrDoXZpc2xvc3RpIG9kIHRyb2NoIGvEvsO6xI1vdsO9Y2ggdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaDogKipWbsOtbWFuaWUga29ydXBjaWUqKiAoKlBlcmNlcHRpb25zIG9mIGNvcnJ1cHRpb24qKSwgKipTbG9ib2RhIHZvxL5ieSoqICgqRnJlZWRvbSB0byBtYWtlIGxpZmUgY2hvaWNlcyopIGEgKipTb2Npw6FsbmEgcG9kcG9yYSoqICgqU29jaWFsIHN1cHBvcnQqKS4KCiMgU3Rhbm92ZW5pZSBoeXBvdMOpeiAKSmVkbm90bGl2w6kgaHlwb3TDqXp5IG8gc21lcmUgdnBseXZ1IHPDuiBuYXNsZWRvdm7DqToKCjEuICoqS29ydXBjaWEqKjogCgoqIE51bG92w6EgaHlwb3TDqXphICgkXGJvbGRzeW1ib2x7SH1fezB9JCk6IFZuw61tYW5pZSBrb3J1cGNpZSBuZW3DoSB2cGx5diBuYSBEw7R2ZXJ1IHZvIHZsw6FkdSAoJFxiZXRhX3tDb3JydXB0aW9ufSA9IDAkKS4KCiogQWx0ZXJuYXTDrXZuYSBoeXBvdMOpemEgKCRcYm9sZHN5bWJvbHtIfV97MX0kKTogT8SNYWvDoXZhbWUgPHU+bmVnYXTDrXZueSB2cGx5djwvdT4gKCRcYmV0YV97Q29ycnVwdGlvbn0gPCAwJCksIMSNbyB6bmFtZW7DoSwgxb5lIHp2w73FoWVuw6kgdm7DrW1hbmllIGtvcnVwY2llIHZlZGllIGsgem7DrcW+ZW5pdSBkw7R2ZXJ5IHYgbsOhcm9kbsOpIGluxaF0aXTDumNpZS4KCjIuICoqU2xvYm9kYSoqOiAKCiogTnVsb3bDoSBoeXBvdMOpemEgKCRcYm9sZHN5bWJvbHtIfV97MH0kKTogU2xvYm9kYSB2b8S+YnkgbmVtw6EgdnBseXYgbmEgRMO0dmVydSB2byB2bMOhZHUgKCRcYmV0YV97RnJlZWRvbX0gPSAwJCkuCgoqIEFsdGVybmF0w612bmEgaHlwb3TDqXphICgkXGJvbGRzeW1ib2x7SH1fezF9JCk6IE/EjWFrw6F2YW1lIDx1PnBveml0w612bnkgdnBseXY8L3U+ICgkXGJldGFfe0ZyZWVkb219ID4gMCQpLCBrZGUgdnnFocWhw60gcG9jaXQgb3NvYm5laiBzbG9ib2R5IGJ5IG1hbCB2aWVzxaUgayB6dsO9xaFlbml1IGTDtHZlcnkgb2LEjWFub3YgdiBzeXN0w6ltLgoKMy4gKipTb2Npw6FsbmEgcG9kcG9yYSoqOiAKCiogTnVsb3bDoSBoeXBvdMOpemEgKCRcYm9sZHN5bWJvbHtIfV97MH0kKTogU29jacOhbG5hIHBvZHBvcmEgbmVtw6EgdnBseXYgbmEgRMO0dmVydSB2byB2bMOhZHUgKCRcYmV0YV97U3VwcG9ydH0gPSAwJCkuCgoqIEFsdGVybmF0w612bmEgaHlwb3TDqXphICgkXGJvbGRzeW1ib2x7SH1fezF9JCk6IE/EjWFrw6F2YW1lIDx1Pm5ldsO9em5hbW7DvSBhbGVibyBtaWVybmUgbmVnYXTDrXZueSB2cGx5djwvdT4gKCRcYmV0YV97U3VwcG9ydH0gXG5lcSAwJCksIGtlxI/FvmUgZMO0dmVyYSB2IG9zb2Juw7ogc29jacOhbG51IHNpZcWlIHByaWFtbyBuZXPDunZpc8OtIHMgZMO0dmVyb3UgdiBuw6Fyb2Ruw7ogdmzDoWR1LgoKCiMgUHLDrXByYXZhIGRhdGFiw6F6eSwgxI1pc3RlbmllIGEgw7pwcmF2YSDDumRham92ClJvdm5ha28gYWtvIHYgcHLDrXBhZGUgcHJlZG/FoWxlaiDDumxvaHksIGFqIHYgdG9tdG8gcHLDrXBhZGUgcHJhY3VqZW0gcyDDumRham1pIHbDvWhyYWRuZSBwcmUgU2xvdmVuc2vDuiByZXB1Ymxpa3UsIHRha8W+ZSB2IG7DoXNsZWR1asO6Y29tIGtyb2t1IHNpIHZ5ZmlsdHJ1amVtIGtvbmtyw6l0bmUgaG9kbm90eSB6dm9sZW7DvWNoIHByZW1lbm7DvWNoIHByZSB0w7p0byBrcmFqaW51LgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCgojIE5hxI3DrXRhbmllIGTDoXQKd2hfZGF0YSA8LSByZWFkLmNzdigiV29ybGQgSGFwcGluZXNzIFJlcG9ydCAyMDA1LTIwMjEuY3N2Iiwgc2VwID0gIiwiLCBkZWMgPSAiLiIsIGhlYWRlciA9IFRSVUUpCgojIEZpbHRyb3ZhbmllIGEgdsO9YmVyIHByZW1lbm7DvWNoCmRhdGFfc2xvdmFraWEgPC0gd2hfZGF0YSAlPiUKICBmaWx0ZXIoQ291bnRyeS5uYW1lID09ICJTbG92YWtpYSIpICU+JQogIHNlbGVjdChDb25maWRlbmNlLmluLm5hdGlvbmFsLmdvdmVybm1lbnQsCiAgICAgICAgIFBlcmNlcHRpb25zLm9mLmNvcnJ1cHRpb24sCiAgICAgICAgIEZyZWVkb20udG8ubWFrZS5saWZlLmNob2ljZXMsCiAgICAgICAgIFNvY2lhbC5zdXBwb3J0KQoKIyBab2JyYXplbmllIHRhYnXEvmt5CmthYmxlKGRhdGFfc2xvdmFraWEsIGNhcHRpb24gPSAiw5pkYWplIHByZSBTbG92ZW5za28iKQpgYGAKCk7DoXNsZWRuZSBwcmVtZW51amVtIHN0xLpwY2UgcHJlIGplZG5vZHVjaMWhaXUgcHLDoWN1IGEgaW1wdXR1amVtIGNow71iYWrDumNlIGhvZG5vdHkgKE5BKSB2IGthxb5kb20gc3TEunBjaSBwb21vY291IG1lZGnDoW51LCDEjcOtbSB6YWJlenBlxI3DrW0sIMW+ZSByZWdyZXNuw70gbW9kZWwgYnVkZSBtw7RjxaUgcG91xb5pxaUgbWF4aW3DoWxueSBwb8SNZXQgcG96b3JvdmFuw60uCgpgYGB7cn0Kd2hfZGF0YSA8LSByZWFkLmNzdigiV29ybGQgSGFwcGluZXNzIFJlcG9ydCAyMDA1LTIwMjEuY3N2Iiwgc2VwID0gIiwiLCBkZWMgPSAiLiIsIGhlYWRlciA9IFRSVUUpCgpkYXRhX3Nsb3Zha2lhIDwtIHdoX2RhdGEgJT4lCiAgZmlsdGVyKGBDb3VudHJ5Lm5hbWVgID09ICJTbG92YWtpYSIpICU+JQogIHNlbGVjdChgQ29uZmlkZW5jZS5pbi5uYXRpb25hbC5nb3Zlcm5tZW50YCwgYFBlcmNlcHRpb25zLm9mLmNvcnJ1cHRpb25gLCBgRnJlZWRvbS50by5tYWtlLmxpZmUuY2hvaWNlc2AsIGBTb2NpYWwuc3VwcG9ydGApCgojIFByZW1lbm92YW5pZSBzdMS6cGNvdiBwcmUgamVkbm9kdWNoxaFpdSBwcsOhY3UKY29sbmFtZXMoZGF0YV9zbG92YWtpYSkgPC0gYygiQ29uZmlkZW5jZSIsICJDb3JydXB0aW9uIiwgIkZyZWVkb20iLCAiU3VwcG9ydCIpCgojIEltcHV0w6FjaWEgY2jDvWJhasO6Y2ljaCBob2Ruw7R0IG1lZGnDoW5vbQpjb2x1bW5fbWVkaWFucyA8LSBzYXBwbHkoZGF0YV9zbG92YWtpYSwgbWVkaWFuLCBuYS5ybSA9IFRSVUUpCmZvciAoY29sIGluIG5hbWVzKGRhdGFfc2xvdmFraWEpKSB7CiAgZGF0YV9zbG92YWtpYVtbY29sXV1baXMubmEoZGF0YV9zbG92YWtpYVtbY29sXV0pXSA8LSBjb2x1bW5fbWVkaWFuc1tjb2xdCn0KYGBgCgoKCsSOYWxlaiBzaSBwcmUga2HFvmTDuiBwcmVtZW5uw7ogdnlnZW5lcnVqZW0gYm94cGxvdCB6YSDDusSNZWxvbSBvdmVyZW5pYSBwcsOtcGFkbsO9Y2ggbmV6cm92bmFsb3N0w60gKGtvbmtyw6l0bmUgdsO9c2t5dHUgb2TEvmFobMO9Y2ggaG9kbsO0dCwgdHp2LiBvdXRsaWVycykuCgpgYGB7cn0KcGFyKG1mcm93ID0gYygyLCAyKSkKcGFyKG1hciA9IGMoNCwgNCwgMiwgMSkpICAKCiMgVnlrcmVzbGVuaWUgYm94cGxvdG92IHByZSBrYcW+ZMO6IHByZW1lbm7Dugpmb3IgKGNvbCBpbiBuYW1lcyhkYXRhX3Nsb3Zha2lhKSkgewogIGJveHBsb3QoZGF0YV9zbG92YWtpYVtbY29sXV0sCiAgICAgICAgICBtYWluID0gY29sLAogICAgICAgICAgeGxhYiA9ICJIb2Rub3RhIiwKICAgICAgICAgIGNvbCA9ICJsaWdodGJsdWUiLAogICAgICAgICAgYm9yZGVyID0gImRhcmtibHVlIikKfQoKIyBOYWRwaXMgcHJlIHbFoWV0a3kgZ3JhZnkKbXRleHQoIkJveHBsb3R5IGplZG5vdGxpdsO9Y2ggcHJlbWVubsO9Y2ggKFNsb3ZlbnNrbykiLCBvdXRlciA9IFRSVUUsIGNleCA9IDEuNCwgZm9udCA9IDIpCgojIFJlc2V0b3ZhbmllIHJvemxvxb5lbmlhIG5hIDEgZ3JhZgpwYXIobWZyb3cgPSBjKDEsIDEpKQpgYGAKClZpenVhbGl6w6FjaWEgcm96ZGVsZW5pYSBob2Ruw7R0IHBvbW9jb3UgYm94cGxvdG92IG1pIGphc25lIHVrw6F6YWxhLCDFvmUgdiBwcsOtcGFkZSBkdm9jaCBwcmVtZW5uw71jaCwga29ua3LDqXRuZSBDb25maWRlbmNlIChEw7R2ZXJhIHZvIHZsw6FkdSkgYSBDb3JydXB0aW9uIChWbsOtbWFuaWUga29ydXBjaWUpLCBtw6FtIHByw610b21uw6kgb2TEvmFobMOpIGhvZG5vdHkuIFRpZXRvIGV4dHLDqW15IG11c8OtbSB0ZXJheiBvZHN0csOhbmnFpSwgcHJldG/FvmUgaWNoIHBvbmVjaGFuaWUgdiBkw6F0YWNoIGJ5IG1vaGxvIHNrcmVzbGnFpSBvZGhhZG92YW7DqSByZWdyZXNuw6kga29lZmljaWVudHkgYSB2w6HFvm5lIG9zbGFiacWlIHNwb8S+YWhsaXZvc8WlIGNlbMOpaG8gbcO0amhvIGxpbmXDoXJuZWhvIG1vZGVsdS4KCmBgYHtyfQpyZW1vdmVfb3V0bGllcnMgPC0gZnVuY3Rpb24oeCkgewogIHExIDwtIHF1YW50aWxlKHgsIDAuMjUsIG5hLnJtID0gVFJVRSkKICBxMyA8LSBxdWFudGlsZSh4LCAwLjc1LCBuYS5ybSA9IFRSVUUpCiAgaXFyIDwtIHEzIC0gcTEKICBsb3dlciA8LSBxMSAtIDEuNSAqIGlxcgogIHVwcGVyIDwtIHEzICsgMS41ICogaXFyCiAgeFt4IDwgbG93ZXIgfCB4ID4gdXBwZXJdIDwtIE5BCiAgcmV0dXJuKHgpCn0KYGBgCgpgYGB7cn0KIyBBcGxpa8OhY2lhIG5hIHbFoWV0a3kgc3TEunBjZQpkYXRhX3Nsb3Zha2lhX2NsZWFuIDwtIGRhdGFfc2xvdmFraWEgJT4lCiAgbXV0YXRlKAogICAgQ29uZmlkZW5jZSA9IHJlbW92ZV9vdXRsaWVycyhDb25maWRlbmNlKSwKICAgIENvcnJ1cHRpb24gPSByZW1vdmVfb3V0bGllcnMoQ29ycnVwdGlvbiksCiAgICBGcmVlZG9tICAgID0gcmVtb3ZlX291dGxpZXJzKEZyZWVkb20pLAogICAgU3VwcG9ydCAgICA9IHJlbW92ZV9vdXRsaWVycyhTdXBwb3J0KQogICkKYGBgCgrEjmFsZWogc29tIG9kc3Ryw6FuaWxhIHbFoWV0a3kgcmlhZGt5LCB2IGt0b3LDvWNoIHBvIG9kc3Ryw6FuZW7DrSBvZMS+YWhsw71jaCBob2Ruw7R0IHpvc3RhbGEgYXNwb8WIIGplZG5hIGNow71iYWrDumNhIGhvZG5vdGEgKE5BKSwgxI3DrW0gemFiZXpwZcSNw61tLCDFvmUgbcO0aiByZWdyZXNuw70gbW9kZWwgYnVkZSBwcmFjb3ZhxaUgbGVuIHMga29tcGxldG7DvW1pIGEgxI1pc3TDvW1pIHBvem9yb3ZhbmlhbWkuCgpgYGB7cn0KZGF0YV9zbG92YWtpYV9jbGVhbiA8LSBuYS5vbWl0KGRhdGFfc2xvdmFraWFfY2xlYW4pCmBgYAoKUG8gdsWhZXRrw71jaCB2ecWhxaFpZSB1dmVkZW7DvWNoIGtvcmVrY2nDoWNoIG5hc2xlZHVqZSBvcMOkdG92bsOhIHZpenVhbGl6w6FjaWEgdsWhZXRrw71jaCA0IGJveHBsb3Rvdi4KYGBge3J9CnBhcihtZnJvdyA9IGMoMiwgMikpCmZvciAoY29sIGluIG5hbWVzKGRhdGFfc2xvdmFraWFfY2xlYW4pKSB7CiAgYm94cGxvdChkYXRhX3Nsb3Zha2lhX2NsZWFuW1tjb2xdXSwKICAgICAgICAgIG1haW4gPSBjb2wsCiAgICAgICAgICB4bGFiID0gIkhvZG5vdGEiLAogICAgICAgICAgY29sID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgICBib3JkZXIgPSAiZGFya2JsdWUiKQp9CnBhcihtZnJvdyA9IGMoMSwgMSkpCmBgYApNb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lIHZpenXDoWxuYSBrb250cm9sYSBwb3R2cmRpbGEgw7pzcGXFoW7DqSBvZHN0csOhbmVuaWUgb2TEvmFobMO9Y2ggaG9kbsO0dC4KCiogKipDb25maWRlbmNlKiogKCpEw7R2ZXJhIHZvIHZsw6FkdSopOiBNZWRpw6FuIGTDtHZlcnkgc2EgbmFjaMOhZHphIG5hIGhvZG5vdGUgJDAuMjUkLCDEjW8gbmF6bmHEjXVqZSBkbGhvZG9ibyBuw616a3UgcHJpZW1lcm7DuiAodiBwb3Jvdm5hbsOtIHMgb3N0YXRuw71taSBob2Rub3RhbWkpIGTDtHZlcnUgdiBuw6Fyb2Ruw7ogdmzDoWR1LiBOYXByaWVrIMSNaXN0ZW5pdSBkw6F0IGplIHRvIG5hanZpYWMgcm96cHTDvWxlbsOhIHByZW1lbm7DoSwgxI1vIHBvdHZyZHp1amUgbmFqZGxoxaHDrSB2ZXJ0aWvDoWxueSByb3pzYWggamVkbm90bGl2w71jaCDDunNlxI1pZWsgYSBib3h1IHpvIHbFoWV0a8O9Y2ggxaF0eXJvY2ggZ3JhZm92LiBUbyB6bmFtZW7DoSwgxb5lIGTDtHZlcmEgb2LEjWFub3Ygdm8gdmzDoWR1IGplIHBvxI1hcyByb2tvdiB2ZcS+bWkgbmVzdMOhbGEgYSBrb2zDrXNhdsOhLgoKKiAqKkNvcnJ1cHRpb24qKiAoKlZuw61tYW5pZSBrb3J1cGNpZSopOiBNZWRpw6FuIHNhIHBvaHlidWplIG9rb2xvICQwLjg5NSQsIMSNbyBqZSB2ZcS+bWkgYmzDrXprbyBob3JuZWogaHJhbmljZSAoMS4wKS4gVG8gaWx1c3RydWplLCDFvmUgdm7DrW1hbmllIGtvcnVwY2llIGplIG5hIFNsb3ZlbnNrdSBjaHJvbmlja3kgdnlzb2vDqSBhIHRha21lciB2IGthxb5kb20gc2xlZG92YW5vbSByb2t1IGJvbG8gdm7DrW1hbsOpIGFrbyB2w6HFvm55IHByb2Jsw6ltLgoKKiAqKkZyZWVkb20qKiAoKlNsb2JvZGEgdm/EvmJ5Kik6IE1lZGnDoW4gamUgbmEgaG9kbm90ZSAkMC42MCQsIMSNbyB6bmHEjcOtLCDFvmUgcHJpZW1lcm7DvSBwb2NpdCBzbG9ib2R5IHZvxL5ieSBqZSBsZW4gbWllcm5lIG5hZCBuZXV0csOhbG55bSBzdHJlZG9tICgkMC41MCQpLiBLcsOhdGt5IHJvenNhaCBmw7p6b3YgYSBib3h1IHBvdHZyZHp1amUsIMW+ZSB2bsOtbWFuaWUgc2xvYm9keSBqZSBzdGFiaWxuw6kgYSB2IMSNYXNlIHNhIHbDvXJhem5lIG5lbWVuw60sIG5vIHZ6aMS+YWRvbSBuYSB2eXNva8OpIHNrw7NyZSBvc3RhdG7DvWNoIHNrw7ptYW7DvWNoIHByZW1lbsO9Y2ggamUgdMOhdG8gaG9kbm90YSByZWxhdMOtdm5lIG7DrXprYSwgxI1vIG5hem5hxI11amUgenJldGXEvm7DvSBwcmllc3RvciBwcmUgemxlcMWhZW5pZSB2IHRvbSwgYWtvIG9ieXZhdGVsaWEgdm7DrW1hasO6IHN2b2p1IG9zb2Juw7ogc2xvYm9kdS4KCiogKipTdXBwb3J0KiogKCpTb2Npw6FsbmEgcG9kcG9yYSopOiBUw6F0byBwcmVtZW5uw6EgcyBtZWRpw6Fub20gbmEgaG9kbm90ZSAkMC45MSQgamUgbmFqa29uY2VudHJvdmFuZWrFoWlhLCB0LmouIHMgbmFqa3JhdMWhw61tIGJveG9tIGEgZsO6emFtaS4gVWthenVqZSB0bywgxb5lIHZuw61tYW7DoSBzb2Npw6FsbmEgcG9kcG9yYSAoc3BvbGllaGFuaWUgc2EgbmEgcHJpYXRlxL5vdi9yb2RpbnUpIGplIG5hIFNsb3ZlbnNrdSBleHRyw6ltbmUgc3RhYmlsbsOhIGEgdmXEvm1pIHZ5c29rw6EsIMSNbyBpbHVzdHJ1amUgc2lsbsO6IGEgc3BvxL5haGxpdsO6IG9zb2Juw7ogc29jacOhbG51IHNpZcWlLgoKIyMgTGluZcOhcm5hIHJlZ3Jlc2lhCgpgYGB7cn0KbW9kZWwgPC0gbG0oQ29uZmlkZW5jZSB+IENvcnJ1cHRpb24gKyBGcmVlZG9tICsgU3VwcG9ydCwgZGF0YSA9IGRhdGFfc2xvdmFraWFfY2xlYW4pCgpzdW1tYXJ5KG1vZGVsKQpgYGAKVGVudG8gdsO9c3R1cCBtaSB6b2JyYXppbCBzw7pocm4gbW9kZWx1IGEgcG90dnJkaWwsIMW+ZSAqxb5pYWRuYSB6IG1vamljaCBwcmFjb3Zuw71jaCBoeXBvdMOpeiBuZWJvbGEgc3BsbmVuw6EqLCBwcmV0b8W+ZSBLb3J1cGNpYSwgU2xvYm9kYSBhIFNvY2nDoWxuYSBwb2Rwb3JhIHNwb2xvxI1uZSBuZXZlZGlhIHbDvXpuYW1uZSB2eXN2ZXRsacWlIETDtHZlcnUgdm8gdmzDoWR1LiBUZW50byB6w6F2ZXIgamUgcG9kbG/FvmVuw70gZXh0csOpbW5lICp2eXNva291IHAtaG9kbm90b3UgRi10ZXN0dSAoJDAuODc0MSQpKiwgxI1vIHpuYW1lbsOhLCDFvmUgKiptb2RlbCBha28gY2Vsb2sgamUgxaF0YXRpc3RpY2t5IG5ldsO9em5hbW7DvSoqLiBOYXZ5xaFlLCBSLWt2YWRyw6F0IHMgaG9kbm90b3UgbGVuICQwLjA3ODkkIHVrYXp1amUsIMW+ZSBtw7RqIG1vZGVsIGRva8Ohxb5lIHZ5c3ZldGxpxaUgaWJhICQ4XCUkIHZhcmlhYmlsaXR5IETDtHZlcnkgdm8gdmzDoWR1LiBaaXN0aWxhIHNvbSwgxb5lIMW+aWFkbmEgeiBwcmVtZW5uw71jaCBuaWUgamUgdsO9em5hbW7DoSBhIGRva29uY2EgU2xvYm9kYSB2ecWhbGEgcyBuZW/EjWFrw6F2YW7DvW0gbmVnYXTDrXZueW0gem5hbWllbmtvbSwgaG9jaSB0byBuaWUgamUgxaF0YXRpc3RpY2t5IHBvZHN0YXRuw6kuCgpgYGB7cn0KbW9kZWwgPC0gbG0oQ29uZmlkZW5jZSB+IENvcnJ1cHRpb24gKyBGcmVlZG9tICsgU3VwcG9ydCwgZGF0YSA9IGRhdGFfc2xvdmFraWFfY2xlYW4pCgpwcmludCgiT2RoYWRudXTDqSBrb2VmaWNpZW50eSBzw7o6IikKcHJpbnQobW9kZWwkY29lZmZpY2llbnRzKQoKcHJpbnQoIk9kaGFkbnV0w6kgcmV6w61kdcOhOiIpCnByaW50KG1vZGVsJHJlc2lkdWFscykKCnByaW50KCJWeXJvdm5hbsOpIGhvZG5vdHkgdnlzdmV0xL5vdmFuZWogcHJlbWVubmVqIHPDujoiKQpwcmludChtb2RlbCRmaXR0ZWQudmFsdWVzKQoKcHJpbnQoIk1hdGljYSBtb2RlbHUgWDoiKQpYIDwtIG1vZGVsLm1hdHJpeChtb2RlbCkKcHJpbnQoWCkKCnByaW50KCJEaWFnb27DoWxhIGhhdC1tYXRyaXggKHZwbHl2IGplZG5vdGxpdsO9Y2ggcG96b3JvdmFuw60pOiIpCnByaW50KGRpYWcoWCAlKiUgc29sdmUodChYKSAlKiUgWCkgJSolIHQoWCkpKQoKIyBTw7pocm5uw70gdsO9c3R1cCBtb2RlbHUKc3VtbWFyeShtb2RlbCkKYGBgClYgZHJ1aG9tIGtyb2t1IHNvbSBzaSAidnnFvmlhZGFsYSIgZGV0YWlseSBvIHZuw7p0b3JuZWogxaF0cnVrdMO6cmUgbW9kZWx1LCBhYnkgc29tIHByZXZlcmlsYSBqZWhvIG1ldG9kb2xvZ2lja8O6IGt2YWxpdHUuIFppc3RpbGEgc29tLCDFvmUgcmV6aWR1w6Egc8O6IHZlxL5taSBtYWzDqSwgxI1vIGplIGRvYnLDqS4gTmFqZMO0bGXFvml0ZWrFoWllIGplIHbFoWFrIHRvLCDFvmUga29udHJvbGEgcG9tb2NvdSBkaWFnb27DoWx5IGhhdC1tYXRyaXggcG90dnJkaWxhLCDFvmUgKsW+aWFkbmUgamVkbm90bGl2w6kgcG96b3JvdmFuaWUgbmVtw6EgbmVwcmltZXJhbmUgdmXEvmvDvSB2cGx5diBuYSB2w71wb8SNZXQga29lZmljaWVudG92Ki4gVG8gamUga8S+w7rEjW92w6kgemlzdGVuaWUsIHByZXRvxb5lIGFqIGtlxI8gamUgbcO0aiBtb2RlbCBjZWxrb3ZvIG5lw7pzcGXFoW7DvSB2byB2eXN2ZXTEvm92YW7DrSBEw7R2ZXJ5LCBtw7TFvmVtIHMgaXN0b3RvdSB0dnJkacWlLCDFvmUgamVobyAqKm9kaGFkeSBzw7ogc3BvxL5haGxpdsOpIGEgbmllIHPDuiBza3Jlc2xlbsOpIGNoeWJhbWkgYW5pIGV4dHLDqW1ueW1pIGTDoXRvdsO9bWkgYm9kbWkqKi4KCgpgYGB7cn0KcGFyKG1mcm93ID0gYygyLCAyKSkKCnBsb3QobW9kZWwpCgojIFJlc2V0b3ZhbmllIHJvemxvxb5lbmlhIG5hIDEgZ3JhZgpwYXIobWZyb3cgPSBjKDEsIDEpKQpgYGAKCiMjIFJlc2lkdWFscyB2cy4gRml0dGVkClRlbnRvIGdyYWYgdml6dcOhbG5lIHBvdHZyZHp1amUgc3BsbmVuaWUgcHJlZHBva2xhZHUgbGluZWFyaXR5IGEgaG9tb3NrZWRhc3RpY2l0eSBwcmUgbcO0aiBtb2RlbC4gVG8gem5hbWVuw6EsIMW+ZSBib2R5IHPDuiByb3pwdMO9bGVuw6kgcG9tZXJuZSByb3Zub21lcm5lIG9rb2xvIG51bG92ZWogaG9yaXpvbnTDoWxuZWogb3NpIGEgdMOhdG8gb3MgamUgbmF2ecWhZSB0YWttZXIgcm92bsOhLiBUbyBuYXpuYcSNdWplLCDFvmUgdnrFpWFoIG1lZHppIG1vamltaSBwcmVkaWt0b3JtaSAoS29ydXBjaWEsIFNsb2JvZGEsIFBvZHBvcmEpIGEgRMO0dmVyb3Ugdm8gdmzDoWR1IG5pZSBqZSB6w6FzYWRuZSB6YWtyaXZlbsO9IGEgxb5lIGNoeWJ5IG1vZGVsdSBzw7ogcm96bG/FvmVuw6kga29uemlzdGVudG5lLlYgcHJheGkgdG8gem5hbWVuw6EsIMW+ZSBuZWV4aXN0dWplIMW+aWFkbnkgZMO0a2F6LCDFvmUgYnkgc2EgZMO0dmVyYSB2byB2bMOhZHUgemHEjWFsYSBwcmkgdXLEjWl0b20gYm9kZSAobmFwci4gcHJpIHZlxL5taSBuw616a2VqIGtvcnVwY2lpKSBzcHLDoXZhxaUgbmVsaW5lw6FybmUsIGFrbyBuYXByw61rbGFkIHBydWRrbyBzdMO6cGHFpSBuYW1pZXN0byBwb21hbMOpaG8gcmFzdHUuCgoKIyMgUS1RIHBsb3QKVGVudG8gZ3JhZiB2aXp1w6FsbmUgcHJldmVydWplIG5vcm3DoWxuZSByb3pkZWxlbmllIHJlemlkdcOtLCDEjW8gamUga8S+w7rEjW92w70gcHJlZHBva2xhZCBwcmUgc3BvxL5haGxpdm9zxaUgJHQkLXRlc3RvdiBhICRGJC10ZXN0dSB2IE9MUyByZWdyZXNpaS4gVnpoxL5hZG9tIG5hIHRvLCDFvmUgbcO0aiAkRiQtdGVzdCB1xb4gdWvDoXphbCBuZXbDvXpuYW1ub3PFpSwgdGVudG8gZ3JhZiBrb250cm9sdWplIGt2YWxpdHUgb2RoYWRvdi4gVml6dcOhbG5lIG1vxb5ubyBrb27FoXRhdG92YcWlIG9kY2jDvWxrdSBvZCBub3JtYWxpdHksIHByZXRvxb5lIGJvZHkgbmEgY2h2b3N0b2NoIGRpc3RyaWLDumNpZSAoZXh0csOpbXkpIHNhIHZpZGl0ZcS+bmUgdnpkaWFsaWxpIG9kIHRlb3JldGlja2VqIGRpYWdvbsOhbG5laiDEjWlhcnksIMSNbyBpbmRpa3VqZSwgxb5lIGRpc3RyaWLDumNpYSBjaMO9YiBtw7RqaG8gbW9kZWx1IG3DoSDFpWHFvsWhaWUgY2h2b3N0eSAoZmF0IHRhaWxzKS4gWiB0b2h0byBkw7R2b2R1IGplIGtyaXRpY2t5IGTDtGxlxb5pdMOpIHNwdXN0acWlIG7DoXNsZWRuw70gSmFycXVlLUJlcmEgdGVzdCwgYWJ5IHNtZSDFoXRhdGlzdGlja3kgemlzdGlsaSwgxI1pIGplIHTDoXRvIHZpenXDoWxuYSBhYm5vcm1hbGl0YSBuYXRvxL5rbyB6w6F2YcW+bsOhLCDFvmUgYnkgZGVmaW5pdMOtdm5lIHBvdHZyZGlsYSBuZXNjaG9wbm9zxaUgbW9kZWx1IHNwb8S+YWhsaXZvIHJvYmnFpSBha8Opa2/EvnZlayB6w6F2ZXJ5LgoKCiMjIFNjYWxlIGxvY2F0aW9uIHBsb3QKVGVudG8gZ3JhZiBzbMO6xb5pIG5hIGRlZmluaXTDrXZuZSBvdmVyZW5pZSBob21vc2tlZGFzdGljaXR5LCB0ZWRhIHByZWRwb2tsYWR1IGtvbsWhdGFudG7DqWhvIHJvenB0eWx1IGNow71iLiBNw7TFvmVtIHBvdHZyZGnFpSBzcGxuZW5pZSB0b2h0byBrxL7DusSNb3bDqWhvIHByZWRwb2tsYWR1LCBwcmV0b8W+ZSDEjWVydmVuw6Egb3MgamUgdGFrbWVyIMO6cGxuZSBwbG9jaMOhIGEgYm9keSBuZXZ5a2F6dWrDuiDFvmlhZGVuIHpqYXZuw70gbGlldmlrb3ZpdMO9IHR2YXIsIMSNbyBieSBzaWduYWxpem92YWxvIHByb2Jsw6ltLgoKViBwcmF4aSB0byBwcmUgbcO0aiBtb2RlbCBEw7R2ZXJ5IHZvIHZsw6FkdSB6bmFtZW7DoSwgxb5lIHNwb8S+YWhsaXZvc8WlIGNow71iIG1vZGVsdSBqZSByb3ZuYWvDoSBiZXogb2jEvmFkdSBuYSB0bywgYWvDuiDDunJvdmXFiCBEw7R2ZXJ5IHByZWRpa3VqZW0uIEluYWsgcG92ZWRhbsOpLCBtb2RlbCBqZSByb3ZuYWtvIHNwb8S+YWhsaXbDvSAoYWxlYm8gcm92bmFrbyB6bMO9KSB2IHByZWRwb3ZlZGkgcHJlIHJva3kgcyBuw616a291IETDtHZlcm91ICjEvmF2w6Egc3RyYW5hKSBha28gYWogcHJlIHJva3kgcyB2ecWhxaFvdSBEw7R2ZXJvdSAocHJhdsOhIHN0cmFuYSkuCgpIb2NpIGplIGNlbGtvdsO9IHJvenB0eWwga29uxaF0YW50bsO9LCBqZSBtb8W+bsOpIHZpZGllxaUgamVtbsO9IG7DoXpuYWsgbGlldmlrb3ZpdMOpaG8gdHZhcnUgdiBleHRyw6ltbnljaCBwcsOtcGFkb2NoLiBBayBieSBzYSB0w6F0byBvZGNow71sa2EgcG90dnJkaWxhLCBtb2hsbyBieSB0byBiecWlIHNww7Rzb2JlbsOpIHTDvW0sIMW+ZSBjaHliYSBtb2RlbHUgamUgdsOkxI3FoWlhIHByaSBleHRyw6ltbmUgbsOtemt5Y2ggaG9kbm90w6FjaCBEw7R2ZXJ5LCBuYXByw61rbGFkIHYga3LDrXpvdsO9Y2ggcm9rb2NoLCBrZGUgamUgRMO0dmVyYSBuw616a2EsIG5vIHBvbGl0aWNrw6EgcmVha2NpYSBqZSBuZXByZWR2w61kYXRlxL5uw6EuIEtlxI/FvmUgamUgYWxlIHTDoXRvIG9kY2jDvWxrYSBtaW5pbcOhbG5hLCBtb8W+bm8ganUgaWdub3JvdmHFpSBhIHBvdmHFvm92YcWlIHByZWRwb2tsYWQgemEgc3BsbmVuw70uCgoKIyMgUmVzaWR1YWxzIHZzIExldmVyYWdlClRlbnRvIGdyYWYgc2zDusW+aSBuYSBmaW7DoWxudSBrb250cm9sdSBkw6F0LCBwcmVzbmVqxaFpZSBuYSBpZGVudGlmaWvDoWNpdSB2cGx5dm7DvWNoIHBvem9yb3ZhbsOtIChib2RvdiBzIHZ5c29rb3UgcMOha291KSwga3RvcsOpIGJ5IG1vaGxpIG92cGx5dm5pxaUgcmVncmVzbsO6IMSNaWFydS4gUyBwb3RlxaFlbsOtbSBrb27FoXRhdHVqZW0sIMW+ZSDFvmlhZGVuIGTDoXRvdsO9IGJvZCBuZW3DoSBleHRyw6ltbmUgdnlzb2vDuiBww6FrdSBhbmkgdnBseXYgbmEgdsO9cG/EjWV0IGtvZWZpY2llbnRvdiwgcHJldG/FvmUgxb5pYWRlbiBib2QgbmVwcmVrcm/EjWlsIEPDunRvdmUgdnpkaWFsZW5vc3RpICjEjWVydmVuw6kgcHJlcnXFoW92YW7DqSDEjWlhcnkgJDAuNSQgYSAkMSQpLiBUw71tdG8gc2EgZGVmaW5pdMOtdm5lIHBvdHZyZHp1amUgcm9idXN0bm9zxaUgbcO0amhvIG1vZGVsdS4gSG9jaSBzb20gb3V0bGllcnMgeiBib3hwbG90b3Ygb2RzdHLDoW5pbGEgdcW+IHByZWR0w71tLCB0ZW50byBncmFmIG1pIGTDoXZhIGlzdG90dSwgxb5lIHYgZMOhdGFjaCBuZXpvc3RhbCDFvmlhZGVuIHNrcnl0w70gdnBseXZuw70gYm9kLCBhIG3DtMW+ZW0gdHZyZGnFpSwgxb5lIGFqIG5hcHJpZWsgbmV2w716bmFtbm9zdGkgJEYkLXRlc3R1IG5lYm9saSBrb2VmaWNpZW50eSBza3Jlc2xlbsOpIMW+aWFkbnltIGplZG5vdGxpdsO9bSByb2tvbS4KCgpgYGB7cn0KIyBUZXN0IG5vcm1hbGl0eSByZXppZHXDrQpyZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG1vZGVsKQpqYl90ZXN0IDwtIGphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKQpqYl90ZXN0CgojIFRlc3Qgb2TEvmFobMO9Y2ggaG9kbsO0dCAoQm9uZmVycm9uaSBrb3Jla2NpYSkKb3V0bGllcl90ZXN0IDwtIG91dGxpZXJUZXN0KG1vZGVsKQpvdXRsaWVyX3Rlc3QKYGBgCioqSmFycXVlLUJlcmEgdGVzdCoqIG92ZXJ1amUgcHJlZHBva2xhZCwgxI1pIHPDuiBjaHlieSBtw7RqaG8gbW9kZWx1IChyZXppZHXDoSkgbm9ybcOhbG5lIHJvemRlbGVuw6kuIFRlbnRvIHByZWRwb2tsYWQgamUgc3BsbmVuw70sIHByZXRvxb5lIHbDvXNsZWRuw6EgcC1ob2Rub3RhICQwLjc1NDIkIGplIG92ZcS+YSB2ecWhxaFpYSBha28ga3JpdGlja8OhIGhvZG5vdGEgJDAuMDUkLiBQcmV0byBtw7TFvmVtIHR2cmRpxaUsIMW+ZSBhaiBuYXByaWVrIHZpenXDoWxuZWogbWllcm5laiBvZGNow71sa2UgdiBRLVEgZ3JhZmUsIHPDuiBtb2plIHJlemlkdcOhIMWhdGF0aXN0aWNreSBub3Jtw6FsbmUgcm96ZGVsZW7DqSwgxI1vIHphYmV6cGXEjXVqZSBzcG/EvmFobGl2b3PFpSAkdCQtdGVzdG92IGtvZWZpY2llbnRvdiAoaG9jaSB2ecWhbGkgbmV2w716bmFtbsOpKS4KCioqQm9uZmVycm9uaWhvIGtvcmVrY2lhKiogc2zDusW+aSBuYSBkZWZpbml0w612bmUgcG90dnJkZW5pZSDEjWlzdG90eSBkw6F0IHBvIHRvbSwgxI1vIHNvbSB1xb4gbWFudcOhbG5lIG9kc3Ryw6FuaWxhIG91dGxpZXJzIHogYm94cGxvdG92LiBWw71zdHVwICoiTm8gU3R1ZGVudGl6ZWQgcmVzaWR1YWxzIHdpdGggQm9uZmVycm9uaSBwIDwgMC4wNSIqIGplIGvEvsO6xI1vdsO9IGEgem5hbWVuw6EsIMW+ZSB2IG1vam9tIG1vZGVsaSBuZXpvc3RhbCDFvmlhZG55IMWhdGF0aXN0aWNreSB2w716bmFtbsO9IG91dGxpZXIsIGt0b3LDvSBieSBtb2hvbCBwb2themnFpSB2w71zbGVka3kuIEhvY2kgbWkgUiB2eXDDrXNhbG8gbmFqcG9kb3pyaXZlasWhaWUgcG96b3JvdmFuaWUgKHMgSUQgJDEzJCksIGplaG8gQm9uZmVycm9uaSBwLWhvZG5vdGEgKCQwLjkxNjYzJCkgamUgZXh0csOpbW5lIHZ5c29rw6EsIMSNbyBwb3R2cmR6dWplLCDFvmUgdG8gbmllIGplIHByb2Jsw6ltLgpWxI9ha2EgdG9tdXRvIHRlc3R1IG3DtMW+ZW0gcyBpc3RvdG91IHR2cmRpxaUsIMW+ZSBhaiBrZcSPIG3DtGogY2Vsa292w70gcmVncmVzbsO9IG1vZGVsIHZ5xaFpZWwgxaF0YXRpc3RpY2t5IG5ldsO9em5hbW7DvSwgdmllbSwgxb5lIHTDoXRvIG5ldsO9em5hbW5vc8WlIG5lYm9sYSBzcMO0c29iZW7DoSBuZcSNaXN0w71taSBkw6F0YW1pLiBJbsO9bWkgc2xvdmFtaSwgPHU+bW9kZWwgbmVmdW5ndWplIGt2w7RsaSBwb3ZhaGUgcHJlbWVubsO9Y2gsIGEgbmllIGt2w7RsaSB6bGVqIGTDoXRvdmVqIHByw61wcmF2ZTwvdT4uCgoKTmnFvsWhaWUgamUgc8O6aHJuIHbFoWV0a8OpaG8sIMSNbyBzb20gdiByw6FtY2kgdGVqdG8ga2FwaXRvbHkgaW50ZXJwcmV0b3ZhbGE6CmBgYHtyfQpzdW1tYXJ5KG1vZGVsKQoKcGFyKG1mcm93ID0gYygyLCAyKSkKCnBsb3QobW9kZWwpCgptdGV4dCgiRGlhZ25vc3RpY2vDqSBncmFmeSByZWdyZXNuw6lobyBtb2RlbHU6IETDtHZlcmEgdm8gdmzDoWR1IChTbG92ZW5za28pIiwgCiAgICAgIG91dGVyID0gVFJVRSwgY2V4ID0gMS4yLCBmb250ID0gMiwgbGluZSA9IC0xLjUpIAoKcGFyKG1mcm93ID0gYygxLCAxKSkKYGBgCgpgYGB7cn0KCmxpYnJhcnkodHNlcmllcykgIyBQcmUgSmFycXVlLUJlcmEgdGVzdApsaWJyYXJ5KGNhcikgICAgICMgUHJlIG91dGxpZXJUZXN0CgpwcmludCgiLS0tIFRFU1QgTk9STUFMSVRZIFJFWklEVcONIChKYXJxdWUtQmVyYSB0ZXN0KSAtLS0iKQpyZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG1vZGVsKQpqYl90ZXN0IDwtIGphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKQpwcmludChqYl90ZXN0KQoKCnByaW50KCItLS0gVEVTVCBPRMS9QUhMw51DSCBIT0ROw5RUIChPdXRsaWVyIFRlc3QpIC0tLSIpCm91dGxpZXJfdGVzdCA8LSBvdXRsaWVyVGVzdChtb2RlbCkKcHJpbnQob3V0bGllcl90ZXN0KQoKYGBgCgoKIyMgWsOhdmVyCgpIbGF2bsO9bSB2w71zbGVka29tIGFuYWzDvXp5IGplLCDFvmUgxb5pYWRuYSB6IG1vamljaCBwcmFjb3Zuw71jaCBoeXBvdMOpeiBuZWJvbGEgcG90dnJkZW7DoS4gQ2Vsw70gcmVncmVzbsO9IG1vZGVsIGplIMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw70gKHAtaG9kbm90YSBGLXRlc3R1IGplICQwLjg3NDEkKSwgxI1vIHpuYW1lbsOhLCDFvmUgdHJpIHp2b2xlbsOpIHByZW1lbm7DqSBzcG9sb8SNbmUgbmVkb2vDocW+dSB2w716bmFtbmUgdnlzdmV0bGnFpSB6bWVueSB2IETDtHZlcmUgdm8gdmzDoWR1LiBOYXZ5xaFlLCBleHRyw6ltbmUgbsOtemt5ICRSJC1rdmFkcsOhdCAoJDAuMDc4OSQpIHBvdHZyZGlsLCDFvmUgbW9kZWwgdnlzdmV0xL51amUgbGVuIG5lY2Vsw71jaCAkOFwlJCB2YXJpYWJpbGl0eSBEw7R2ZXJ5LgoKSG9jaSBrb2VmaWNpZW50IEtvcnVwY2llIHZ5xaFpZWwgcyAqb8SNYWvDoXZhbsO9bSogbmVnYXTDrXZueW0gem5hbWllbmtvbSAoJC0wLjE3NDgkKSBhIGtvZWZpY2llbnQgU2xvYm9keSB2ecWhaWVsIG5lZ2F0w612bmUgKCQtMC4xMzQ4JCkgKnYgcm96cG9yZSBzIG/EjWFrw6F2YW7DrW0qLCDFvmlhZGVuIHogdMO9Y2h0byB2cGx5dm92IG5lYm9sIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKTmFwcmllayDFoXRhdGlzdGlja2VqIG5ldsO9em5hbW5vc3RpIG1vZGVsdSBib2xhIGNlbMOhIGFuYWzDvXphICoqbWV0b2RvbG9naWNreSByb2J1c3Ruw6EqKiBhICoqZMOhdG92w70gc8O6Ym9yIGJvbCBkb2tvbmFsZSDEjWlzdMO9KiouIFBvdHZyZGlsaSB0byBuYXNsZWRvdm7DqSB6aXN0ZW5pYToKCiogPHU+Tm9ybWFsaXRhIGEgaG9tb3NrZWRhc3RpY2l0YTwvdT46IMWgdGF0aXN0aWNrw70gSmFycXVlLUJlcmEgdGVzdCAocC1ob2Rub3RhICQwLjc1NDIkKSBwb3R2cmRpbCwgxb5lIHJlemlkdcOhIHPDuiBub3Jtw6FsbmUgcm96ZGVsZW7DqSwgYSB2aXp1YWxpesOhY2lhIFNjYWxlLUxvY2F0aW9uIGdyYWZ1IHBvdHZyZGlsYSBrb27FoXRhbnRuw70gcm96cHR5bCBjaMO9Yi4KCiogPHU+xIxpc3RvdGEgRMOhdDwvdT46IEJvbmZlcnJvbmlobyBrb3Jla2NpYSBhIE91dGxpZXIgVGVzdCBkZWZpbml0w612bmUgcG90dnJkaWxpLCDFvmUgdiBkw6F0b3ZvbSBzw7pib3JlIG5lem9zdGFsIMW+aWFkbnkgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gb3V0bGllci4gUm92bmFrbyBncmFmIFJlc2lkdWFscyB2cy4gTGV2ZXJhZ2UgcG90dnJkaWwsIMW+ZSBrb2VmaWNpZW50eSBuZWJvbGkgc2tyZXNsZW7DqSDFvmlhZG55bSB2cGx5dm7DvW0gcG96b3JvdmFuw61tLgoKTmEgesOhdmVyIG3DtMW+ZW0gcyBpc3RvdG91IGtvbsWhdGF0b3ZhxaUsIMW+ZSAqKnpseWhhbmllIG1vZGVsdSBuZWJvbG8gc3DDtHNvYmVuw6kgY2h5YmFtaSB2IGTDoXRhY2ggYW5pIHYgbWV0b2Rpa2Ugc3ByYWNvdmFuaWEsIGFsZSBza3V0b8SNbm9zxaVvdSwgxb5lIETDtHZlcmEgdm8gdmzDoWR1IG5hIFNsb3ZlbnNrdSBuaWUgamUgxaF0YXRpc3RpY2t5IG92cGx5dm5lbsOhIGZha3Rvcm1pIFZuw61tYW5pZSBrb3J1cGNpZSwgU2xvYm9kYSB2b8S+YnkgYSBTb2Npw6FsbmEgcG9kcG9yYSB2IHLDoW1jaSBkYW7DqWhvIMSNYXNvdsOpaG8gcmFkdSoqLiBCdWTDumNhIGFuYWzDvXphIGJ5IHNhIG1hbGEgemFtZXJhxaUgbmEgb2RsacWhbsOpLCBwcmF2ZGVwb2RvYm5lIG1ha3JvZWtvbm9taWNrw6kgYWxlYm8gcG9saXRpY2vDqSwgZmFrdG9yeS4KCkhvY2kgYnkgYm9sIHRlbnRvIGtvbmtyw6l0bnkgbW9kZWwgdiBwcmF4aSBwb3Zhxb5vdmFuw70gemEgemJ5dG/EjW7DvSwga2XEj8W+ZSBqZSDFoXRhdGlzdGlja3kgbmV2w716bmFtbsO9LCBubyA8dT5wcsOhdmUgdG90byB6aXN0ZW5pZSBvIG5lZXhpc3RlbmNpaSB2w716bmFtbsOpaG8gdnrFpWFodSBtZWR6aSB6dm9sZW7DvW1pIHNvY2nDoWxueW1pIGZha3Rvcm1pIGEgRMO0dmVyb3Ugdm8gdmzDoWR1IG5hIFNsb3ZlbnNrdSBqZSBzYW1vIG8gc2ViZSBjZW5uw71tIHByw61ub3NvbSwga3RvcsO9IHByZXPDunZhIGZvY3VzIG5hIGjEvmFkYW5pZSBvZGxpxaFuw71jaCwgdiBtb2RlbGkgbmV6YWhybnV0w71jaCwgdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaDwvdT4uCgoKIyBIZXRlcm9za2VkYXN0aWNpdGEgLSBDVklLTyA3CgpQcsOtdG9tbm9zxaUgaGV0ZXJvc2tlZGFzdGljaXR5IChuZWtvbsWhdGFudG7DqWhvIHJvenB0eWx1IG7DoWhvZG5laiB6bG/Fvmt5KSBqZSBrcml0aWNrw70gcHJvYmzDqW0sIHByZXRvxb5lIGJ5IHZpZWRsYSBrICoqbmVzcHLDoXZuZW11IHZ5aG9kbm9jb3Zhbml1ICR0JC10ZXN0b3YgdsO9em5hbW5vc3RpKiogcmVncmVzbsO9Y2gga29lZmljaWVudG92LiBQcmV0byBqZSBuZXZ5aG51dG7DqSwgYWJ5IHNtZSB0ZW50byBwcmVkcG9rbGFkIGTDtGtsYWRuZSBvdmVyaWxpLgoKQWoga2XEjyBzbWUgdcW+IHZpenXDoWxuZSBwcmV2ZXJpbGkgZ3JhZiAqKlNjYWxlLUxvY2F0aW9uKiogYSB6aXN0aWxpLCDFvmUgcm96cHR5bCBqZSBrb27FoXRhbnRuw70sIGplIHBvdHJlYm7DqSB0ZW50byB6w6F2ZXIgKipkZWZpbml0w612bmUgcG90dnJkacWlKiogcHJlIGthxb5kw7ogaGxhdm7DuiB2eXN2ZXTEvnVqw7pjdSBwcmVtZW5uw7ogYSBuw6FzbGVkbmUgxaF0YXRpc3RpY2vDvW0gdGVzdG9tLgoKUHJldG8gc2EgdiB0ZWp0byBzZWtjaWkgemFtZXJpYW0gbmEgbmFzbGVkb3Zuw6kga3Jva3k6CgoxLiAqKlZpenXDoWxuYSBkZXRla2NpYSoqOiBTa8O6bWFuaWUgesOhdmlzbG9zdGkgxaF0dm9yY292IHJlesOtZHXDrSBvZCBwcmVtZW5uw71jaCA8dT5WbsOtbWFuaWUga29ydXBjaWU8L3U+IGEgPHU+U2xvYm9kYSB2b8S+Ynk8L3U+IChwb21vY291IGdyYWZvdiB2eWdlbmVyb3ZhbsO9Y2ggdiBwcmVkb8WhbG9tIGtyb2t1KS4gVMO9bXRvIHNhIHZpenXDoWxuZSB1aXN0w61tLCDFvmUgcm96cHR5bCBjaMO9YiBuaWUgamUgesOhdmlzbMO9IG9kIGhvZG7DtHQgcHJlZGlrdG9yb3YuCgoyLiAqKsWgdGF0aXN0aWNrw6EgZGV0ZWtjaWEqKjogUG91xb5pdGllIDx1PkJyZXVzY2gtUGFnYW4gdGVzdHU8L3U+IG5hIGZvcm3DoWxuZSBwb3R2cmRlbmllLCDFvmUgaG9tb3NrZWRhc3RpY2l0YSBqZSB2IHRvbXRvIG1vZGVsaSBtb2RlbCBzcGxuZW7DoS4KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGF0Y2h3b3JrKQoKcF9jb3JyIDwtIGdncGxvdChkYXRhX3Nsb3Zha2lhX2NsZWFuLCBhZXMoeCA9IENvcnJ1cHRpb24sIHkgPSByZXNpZChtb2RlbCleMikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBjb2xvciA9ICJkYXJrYmx1ZSIpICsgIyBabWVuYSBmYXJieSBib2RvdgogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIAogIGxhYnMoeCA9ICJWbsOtbWFuaWUga29ydXBjaWUgKENvcnJ1cHRpb24pIiwKICAgICAgIHkgPSAixaB0dm9yY292w6kgcmV6aWR1w6EgKFNxdWFyZWQgUmVzaWR1YWxzKSIsCiAgICAgICB0aXRsZSA9ICJSZXppZHXDoSB2cy4gS29ydXBjaWEiKSArCiAgdGhlbWVfY2xhc3NpYygpIAoKcF9mcmVlIDwtIGdncGxvdChkYXRhX3Nsb3Zha2lhX2NsZWFuLCBhZXMoeCA9IEZyZWVkb20sIHkgPSByZXNpZChtb2RlbCleMikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBjb2xvciA9ICJkYXJrZ3JlZW4iKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAiZGFya29yYW5nZSIsIGxpbmV0eXBlID0gImRvdHRlZCIpICsgCiAgbGFicyh4ID0gIlNsb2JvZGEgdm/EvmJ5IChGcmVlZG9tKSIsCiAgICAgICB5ID0gIsWgdHZvcmNvdsOpIHJlemlkdcOhIChTcXVhcmVkIFJlc2lkdWFscykiLAogICAgICAgdGl0bGUgPSAiUmV6aWR1w6EgdnMuIFNsb2JvZGEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFNwb2plbmllIGdyYWZvdiB2ZWTEvmEgc2ViYQpwX2NvcnIgKyBwX2ZyZWUKYGBgCgpUaWV0byBncmFmeSBzbMO6xb5pYSBuYSBkZXRhaWxuw7ogdml6dcOhbG51IGtvbnRyb2x1IGhvbW9za2VkYXN0aWNpdHkgdMO9bSwgxb5lIHZ5a3Jlc8S+dWrDuiDFoXR2b3Jjb3bDqSByZXppZHXDoSBtb2RlbHUgKG1pZXJ1IGNoeWJ5KSBvcHJvdGkgZHZvbSBobGF2bsO9bSB2eXN2ZXTEvnVqw7pjaW0gcHJlbWVubsO9bS4KCiMjIyMgR3JhZiAxOiBSZXppZHXDoSB2cy4gVm7DrW1hbmllIEtvcnVwY2llCgpUZW50byBncmFmIHVrYXp1amUsIGFrbyBzYSBtZW7DrSByb3pwdHlsIGNow71iIG7DocWhaG8gbW9kZWx1IHYgesOhdmlzbG9zdGkgb2Qgw7pyb3ZuZSB2bsOtbWFuZWoga29ydXBjaWUuCgoqICoqQ2h5YmEgbW9kZWx1Kio6IEJvZHkgdiBncmFmZSBwcmVkc3RhdnVqw7ogZHJ1aMO6IG1vY25pbnUgY2h5YnkgKHJlemlkdXVtKSwga3RvcsO6IHRlbnRvIG1vZGVsIHVyb2JpbCBwcmUga2HFvmTDvSBqZWRub3RsaXbDvSByb2suIFZpenXDoWxuZSB2aWTDrW1lLCDFvmUgdGlldG8gYm9keSBzw7ogc2lsbmUgcm96cHTDvWxlbsOpIGEgxI9hbGVrbyBvZCBudWx5LiBUbyBqZSBwcmlhbXltIGTDtHNsZWRrb20gdG9obywgxb5lIGplIHRlbnRvIDx1PnJlZ3Jlc27DvSBtb2RlbCBqZSB2ZcS+bWkgc2xhYsO9PC91PiAoJFJeMiBcYXBwcm94IDhcJSQsIGFrbyBzb20gdXbDoWR6YWxhIHXFviBuYSB6YcSNaWF0a3UgcmVncmVzbmVqIGFuYWzDvXp5KSBhIHJvYsOtIHZlxL5rw6kgY2h5YnkgcHJpIHByZWRwb3ZlZGkgRMO0dmVyeSB2byB2bMOhZHUuCgoqICoqSW50ZXJwcmV0w6FjaWEgxIxlcnZlbmVqIMSMaWFyeSoqOiBOYXByaWVrIHZlxL5rw6ltdSByb3pwdHlsdSBqZWRub3RsaXbDvWNoIGNow71iIGplIGvEvsO6xI1vdsOpLCDFvmUgxI1lcnZlbsOhIHByZXJ1xaFvdmFuw6EgxI1pYXJhLCBrdG9yw6EgdWthenVqZSBwcmllbWVybsO9IHRyZW5kIHJvenB0eWx1LCBqZSDDunBsbmUgPHU+cGxvY2jDoTwvdT4uIFRvIHBvdHZyZHp1amUsIMW+ZSByb3pwdHlsIGNow71iIGplIDx1PmtvbsWhdGFudG7DvTwvdT4g4oCTIHZlxL5rb3PFpSBjaHlieSBuaWUgamUgc3lzdGVtYXRpY2t5IHrDoXZpc2zDoSBvZCDDunJvdm5lIGtvcnVwY2llLgoKIyMjIyBHcmFmIDI6IFJlemlkdcOhIHZzLiBTbG9ib2RhIFZvxL5ieQpUZW50byBncmFmIHByZXZlcnVqZSByb3ZuYWvDvSBwcmVkcG9rbGFkIHByZSBwcmVtZW5uw7ogU2xvYm9kYSB2b8S+YnkuCgoqICoqQ2h5YmEgbW9kZWx1Kio6IFBvZG9ibmUgYWtvIHByaSBrb3J1cGNpaSwgYWogdiB0b210byBncmFmZSBqZSB2aWRpdGXEvm7DvSA8dT52ZcS+a8O9IHZlcnRpa8OhbG55IHJvenB0eWw8L3U+IGplZG5vdGxpdsO9Y2ggemVsZW7DvWNoIGJvZG92LiBUbyBvcMOkxaUgcG90dnJkenVqZSwgxb5lIG1vZGVsIG3DoSBuw616a3UgcHJlZGlrdMOtdm51IHNpbHUuCgoqICoqSW50ZXJwcmV0w6FjaWEgT3JhbsW+b3ZlaiDEjGlhcnkqKjogT3JhbsW+b3bDoSBib2Rrb3ZhbsOhIMSNaWFyYSwga3RvcsOhIG1hcHVqZSBwcmllbWVybsO9IHRyZW5kIHJvenB0eWx1LCBqZSA8dT5wbG9jaMOhIGEgbmVtw6Egxb5pYWRlbiBza2xvbjwvdT4uIFRvIHpuYW1lbsOhLCDFvmUgY2h5YmEgbsOhxaFobyBtb2RlbHUgamUgcm92bmFrbyB2ZcS+a8OhIGJleiBvaMS+YWR1IG5hIMO6cm92ZcWIIFNsb2JvZHkgdm/EvmJ5LCDEjcOtbSBqZSBzcGxuZW7DvSBwcmVkcG9rbGFkIGtvbsWhdGFudG7DqWhvIHJvenB0eWx1IChob21vc2tlZGFzdGljaXR5KS4KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGF0Y2h3b3JrKQoKZGF0YV9zbG92YWtpYV9jbGVhbiRsb2dfU3VwcG9ydCA8LSBsb2coZGF0YV9zbG92YWtpYV9jbGVhbiRTdXBwb3J0KQoKcF9sb2dfc3VwcCA8LSBnZ3Bsb3QoZGF0YV9zbG92YWtpYV9jbGVhbiwgYWVzKHggPSBsb2dfU3VwcG9ydCwgeSA9IHJlc2lkKG1vZGVsKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcsIGNvbG9yID0gInB1cnBsZSIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJkZWVwcGluayIsIGxpbmV0eXBlID0gImRvdGRhc2giKSArICMgWm1lbmEgxaF0w71sdSDEjWlhcnkKICBsYWJzKHggPSAiTG9nKFNvY2nDoWxuYSBwb2Rwb3JhKSIsCiAgICAgICB5ID0gIsWgdHZvcmNvdsOpIHJlemlkdcOhIChTcXVhcmVkIFJlc2lkdWFscykiLAogICAgICAgdGl0bGUgPSAiUmV6aWR1w6EgdnMuIExvZyhTb2Npw6FsbmEgcG9kcG9yYSkiKSArCiAgdGhlbWVfYncoKSAKCnBfZnJlZV9sb2cgPC0gZ2dwbG90KGRhdGFfc2xvdmFraWFfY2xlYW4sIGFlcyh4ID0gRnJlZWRvbSwgeSA9IHJlc2lkKG1vZGVsKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcsIGNvbG9yID0gImRhcmtncmVlbiIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJkYXJrb3JhbmdlIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnMoeCA9ICJTbG9ib2RhIHZvxL5ieSAoRnJlZWRvbSkiLAogICAgICAgeSA9ICLFoHR2b3Jjb3bDqSByZXppZHXDoSAoU3F1YXJlZCBSZXNpZHVhbHMpIiwKICAgICAgIHRpdGxlID0gIlJlemlkdcOhIHZzLiBTbG9ib2RhIikgKwogIHRoZW1lX2J3KCkKCiMgU3BvamVuaWUgZ3JhZm92IHZlZMS+YSBzZWJhCnBfbG9nX3N1cHAgKyBwX2ZyZWVfbG9nCmBgYAoKTmFwcmllayB0b211LCDFvmUgdGVudG8gbW9kZWwgKipzcGxuaWwgcHJlZHBva2xhZCBob21vc2tlZGFzdGljaXR5KiogKHZpenXDoWxuZSBhaiDFoXRhdGlzdGlja3kpLCB0ZW50byBrcm9rIGRlbW9uxaF0cnVqZSBwb3N0dXAsIGFrw71tIGJ5IHNtZSBoZXRlcm9za2VkYXN0aWNpdHUgb2RzdHLDoW5pbGksIGFrIGJ5IHNhIHBvdHZyZGlsYS4gCgojIyMjIEdyYWYgMTogUmV6aWR1w6EgdnMuIExvZyhTb2Npw6FsbmEgcG9kcG9yYSkKCiogKipQb3pvcm92YW5pZSB0cmVuZHUqKjogTmEgZ3JhZmUgdmlkw61tZSwgxb5lIHZ5aGxhZGVuw6EgcnXFvm92w6EgYm9ka292YW7DoSDEjWlhcmEgamUgb3DDpMWlIGhvcml6b250w6FsbmEgYSBuZW3DoSDFvmlhZG55IHNrbG9uLiBUbyBwb3R2cmR6dWplLCDFvmUgYWogcG8gbG9nYXJpdG1pY2tlaiB0cmFuc2Zvcm3DoWNpaSBwcmVtZW5uZWogU29jacOhbG5hIHBvZHBvcmEgem9zdMOhdmEgcm96cHR5bCBjaMO9YiBrb27FoXRhbnRuw70uIFRlbnRvIHbDvXNsZWRvayBqZSB2IHPDumxhZGUgcyBuYcWhaW1pIHByZWRjaMOhZHphasO6Y2ltaSB6aXN0ZW5pYW1pLCDFvmUgcMO0dm9kbsO9IG1vZGVsIHXFviBqZSBob21vc2tlZGFzdGlja8O9IGEgdHJhbnNmb3Jtw6FjaWEgbmVib2xhIG51dG7DoS4KCiMjIyMgR3JhZiAyOiBSZXppZHXDoSB2cy4gU2xvYm9kYSBWb8S+YnkKCiogKipQb3pvcm92YW5pZSB0cmVuZHUqKjogT3Bha292YW5pZSB2aXp1YWxpesOhY2llIHByZSBTbG9ib2R1IHMgcG91xb5pdMOtbSBpbmVqIGZhcmVibmVqIHTDqW15IHNsw7rFvmkgbGVuIGFrbyBrb250cm9sbsOpIHBvcm92bmFuaWUuIE9yYW7Fvm92w6EgcHJlcnXFoW92YW7DoSDEjWlhcmEgamUgcm92bmFrbyBwbG9jaMOhLiBWxaFldGt5IHZpenXDoWxuZSBrb250cm9seSB0ZWRhIHPDumhsYXNpYSAtIG1vZGVsIG5lb2JzYWh1amUgaGV0ZXJvc2tlZGFzdGljaXR1LgoKIyMgVGVzdG92YW5pZSBwcsOtdG9tbm9zdGkgaGV0ZXJvc2tlZGFzdGljaXR5CgpQcmVkIHZ5a29uYW7DrW0gQnJldXNjaC1QYWdhbiB0ZXN0dSBzdGFub3Z1amVtZSBuYXNsZWR1asO6Y2UgaHlwb3TDqXp5IG8ga29uxaF0YW50bm9zdGkgcm96cHR5bHUgY2jDvWI6CgoqIE51bG92w6EgaHlwb3TDqXphICgkXGJvbGRzeW1ib2x7SH1fezB9JCk6IE1vZGVsIGplIGhvbW9za2VkYXN0aWNrw70gKHJvenB0eWwgY2jDvWIgamUga29uxaF0YW50bsO9KS4KCiogQWx0ZXJuYXTDrXZuYSBoeXBvdMOpemEgKCRcYm9sZHN5bWJvbHtIfV97MX0kKTogTW9kZWwgamUgaGV0ZXJvc2tlZGFzdGlja8O9IChyb3pwdHlsIGNow71iIGplIG5la29uxaF0YW50bsO9KS4KCmBgYHtyfQpsaWJyYXJ5KGxtdGVzdCkKYnB0ZXN0KG1vZGVsKQpgYGAKS2XEj8W+ZSBkb3NpYWhudXTDoSAkcCQtaG9kbm90YSAoJDAuNDI5NiQpIGplIHbDvXJhem5lIHZ5xaHFoWlhIGFrbyDFoXRhbmRhcmRuw6EgaGxhZGluYSB2w716bmFtbm9zdGkgJFxhbHBoYSA9IDAuMDUkLCA8dT5udWxvdsO6IGh5cG90w6l6dSBuZXphbWlldGFtZTwvdT4uCgpWIHByYXhpIHRvIHpuYW1lbsOhLCDFvmUgxaF0YW5kYXJkbsOpIGNoeWJ5IHJlZ3Jlc27DvWNoIGtvZWZpY2llbnRvdiBzw7ogc3BvxL5haGxpdm8gYSBrb3Jla3RuZSB2eXBvxI3DrXRhbsOpLiBIb21vc2tlZGFzdGljaXRhIHRhayBuaWUgamUgcHLDrcSNaW5vdSDFoXRhdGlzdGlja2VqIG5ldsO9em5hbW5vc3RpIGNlbMOpaG8gbW9kZWx1ICgkRiQtdGVzdCAkcD0wLjg3NDEkKSwgxI3DrW0gc2EgcG90dnJkenVqZSBtZXRvZG9sb2dpY2vDoSBrb3Jla3Rub3PFpSBhbmFsw716eS4KCgpgYGB7cn0KbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShsbXRlc3QpCmNvZWZ0ZXN0KG1vZGVsLCB2Y292ID0gdmNvdkhDKG1vZGVsKSkKYGBgCgoqQXBsaWvDoWNpYSByb2J1c3Ruw71jaCDFoXRhbmRhcmRuw71jaCBjaMO9Yiogc2zDusW+aWxhIG5hIG92ZXJlbmllLCDEjWkgYnkgcHLDrXRvbW5vc8WlIHByw61wYWRuZWosIGhvY2kgQnJldXNjaC1QYWdhbiB0ZXN0b20gbmV6aXN0ZW5laiwgaGV0ZXJvc2tlZGFzdGljaXR5IHptZW5pbGEgbmHFoWUgesOhdmVyeSBvIHbDvXpuYW1ub3N0aS4gCgpWw71zbGVkb2sgdGVzdHUgcG90dnJkenVqZSBuw6HFoSBwcmVkY2jDoWR6YWrDumNpIG7DoWxlejoKVsWhZXRreSAkcCQtaG9kbm90eSBzw7ogYWogcG8gYXBsaWvDoWNpaSByb2J1c3Ruw71jaCBjaMO9YiAodiByb3pzYWh1IG9kICQwLjcyNDYkIGRvICQwLjk1ODAkKSB2w71yYXpuZSB2ecWhxaFpZSBha28gaGxhZGluYSB2w716bmFtbm9zdGkgJFxhbHBoYSA9IDAuMDUkLiBWIGTDtHNsZWRrdSB0b2hvIGhsYXZuw70gesOhdmVyIHpvc3TDoXZhIG5lem1lbmVuw706ICoqYW5pIGplZG5hIHogdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaCAoVm7DrW1hbmllIGtvcnVwY2llLCBTbG9ib2RhIHZvxL5ieSwgU29jacOhbG5hIHBvZHBvcmEpIG5lbcOhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2IG5hIETDtHZlcnUgdm8gdmzDoWR1KiouIE5ha2/EvmtvIHNhIHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnkgbmVsw63FoWlhIHNpZ25pZmlrYW50bmUgb2QgcMO0dm9kbsO9Y2gsIHByZXVrw6F6YWxpIHNtZSwgxb5lIG1vZGVsIGplIGhvbW9za2VkYXN0aWNrw70gYSByb2J1c3Ruw70uCgojIyBaw6F2ZXIKQ2llxL5vbSB0ZWp0byBhbmFsw716eSBib2xvIHByZXNrw7ptYcWlIHZwbHl2IEtvcnVwY2llLCBTbG9ib2R5IHZvxL5ieSBhIFNvY2nDoWxuZWogcG9kcG9yeSBuYSBEw7R2ZXJ1IHZvIHZsw6FkdSBwb21vY291IGxpbmXDoXJuZWogcmVncmVzaWUuCgrFoHRhdGlzdGlja8OhIGFuYWzDvXphIHByZXVrw6F6YWxhLCDFvmUgKiphbmkgamVkZW4geiBmYWt0b3JvdiAoS29ydXBjaWEsIFNsb2JvZGEsIFNvY2nDoWxuYSBwb2Rwb3JhKSBuZW3DoSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSB2cGx5diBuYSBEw7R2ZXJ1IHZvIHZsw6FkdSoqIHYgc2xlZG92YW5vbSBvYmRvYsOtLiBOw616a2EgdnlzdmV0xL51asO6Y2Egc2lsYSBtb2RlbHUgKCRSXjIgXGFwcHJveCA4XCUkKSBwb3R2cmRpbGEsIMW+ZSB0w6F0byB0cm9qaWNhIHByZW1lbm7DvWNoIG5lZG9rw6HFvmUgcHJlZHBvdmVkYcWlIETDtHZlcnUgdm8gdmzDoWR1LgoKCkFqIG5hcHJpZWsgbmXDunNwZWNodSBtb2RlbHUgc21lIHBvZHJvYm5lIHByZXZlcmlsaSBqZWhvIG1ldG9kb2xvZ2lja8O6IGt2YWxpdHUuICpIb21vc2tlZGFzdGljaXRhKiAoa29uxaF0YW50bsO9IHJvenB0eWwgY2jDvWIpIGJvbGEgKnNwbG5lbsOhKiDigJMgdml6dcOhbG5lIGFqIMWhdGF0aXN0aWNreSAoQnJldXNjaC1QYWdhbiAkcCA9IDAuNDI5NiQpLgoKU3BsbmVuaWUgaG9tb3NrZWRhc3RpY2l0eSB6bmFtZW7DoSwgxb5lICpjaHliYSB0b2h0byBtb2RlbHUgamUgcm92bmFrbyB2ZcS+a8OhIGJleiBvaMS+YWR1IG5hIHRvLCDEjWkgbWVyaWFtZSB2cGx5diBwcmkgbsOtemtlaiBhbGVibyB2eXNva2VqIFNsb2JvZGUgdm/EvmJ5Ki4K