knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE)
library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
library(dplyr)
library(ggplot2)
library(readr)
rm(list = ls())
Indian_water_data <- read_csv("Indian_water_data.csv")
# premenujeme Year kvôli istote
names(Indian_water_data)[names(Indian_water_data) == "Year"] <- "Year_clean"
Lineárna regresia
# vytvoríme pracovný dataset bez NA v použitých premenných
iw_data <- Indian_water_data %>%
dplyr::select(
Year_clean,
`pH - Max`,
`Temperature (C) - Max`,
`Dissolved - Max`,
`BOD (mg/L) - Max`
) %>%
na.omit() %>%
dplyr::arrange(Year_clean)
# základný lineárny model (odhad na CELOM iw_data)
model_pH <- lm(
`pH - Max` ~ `Temperature (C) - Max` + `Dissolved - Max` + `BOD (mg/L) - Max`,
data = iw_data
)
summary(model_pH)
Call:
lm(formula = `pH - Max` ~ `Temperature (C) - Max` + `Dissolved - Max` +
`BOD (mg/L) - Max`, data = iw_data)
Residuals:
Min 1Q Median 3Q Max
-1.2553 -0.2539 -0.0255 0.1957 3.3028
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.078251 0.251758 32.087 < 2e-16 ***
`Temperature (C) - Max` -0.015446 0.005304 -2.912 0.00406 **
`Dissolved - Max` 0.041305 0.021024 1.965 0.05104 .
`BOD (mg/L) - Max` 0.003518 0.003618 0.972 0.33222
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.4541 on 174 degrees of freedom
Multiple R-squared: 0.08658, Adjusted R-squared: 0.07083
F-statistic: 5.497 on 3 and 174 DF, p-value: 0.001245
Autokorelácia rezíduí
# reziduá a fitted hodnoty
res <- residuals(model_pH)
iw_data$fitted <- fitted(model_pH)
ggplot(iw_data, aes(x = Year_clean, y = `pH - Max`)) +
geom_point(color = "steelblue", size = 2) +
geom_line(aes(y = fitted), color = "red", linewidth = 1) +
labs(
title = "pH Max: empirické (body) vs. fitted (čiara)",
x = "Rok",
y = "pH Max"
) +
theme_minimal()

Komentár ku grafu empirických a fitted hodnôt
Modré body predstavujú skutočne namerané hodnoty pH v jednotlivých
rokoch.
Červená čiara zachytáva hodnoty predpovedané regresným modelom.
Vidíme, že fitted hodnoty sa v každom roku nachádzajú približne v
strede pozorovaného rozptylu.
Model teda približne vystihuje priemernú úroveň pH v jednotlivých
rokoch, ale nedokáže zachytiť jeho vnútro-ročnú variabilitu.
Rozdiel medzi empirickými hodnotami a červenou čiarou je pomerne
výrazný, čo zodpovedá nízkej hodnote R² v modeli.
ACF rezíduí
acf(res, lag.max = 4, main = "Autokorelačná funkcia rezíduí")

Komentár k ACF rezíduí
V ACF grafe vidíme, že všetky hodnoty autokorelácie (okrem lag 0) sa
nachádzajú v rámci 95 % konfidenčných intervalov (modré prerušované
čiary).
To znamená, že pre posuny 1 až 4 nebol zistený štatisticky významný
autokorelačný vzťah.
Na základe tohto grafu nevidíme dôkaz o prítomnosti autokorelácie
rezíduí.
Durbin–Watsonov test
Durbin-Watson test
data: model_pH
DW = 1.1819, p-value = 1.225e-08
alternative hypothesis: true autocorrelation is greater than 0
Komentár k Durbin–Watsonov testu
Hodnota Durbin–Watsonovej štatistiky je DW = 1.1819,
čo je menej ako 2.
To naznačuje pozitívnu autokoreláciu rezíduí.
P-hodnota je 1.225e-08, takže nulovú hypotézu o
neexistencii autokorelácie
zamietame. V reziduách je prítomná významná pozitívna
autokorelácia 1. rádu.
Breusch–Godfreyov test
bgtest(model_pH, order = 1)
Breusch-Godfrey test for serial correlation of order up to 1
data: model_pH
LM test = 29.61, df = 1, p-value = 5.283e-08
Komentár k Breusch–Godfreyov testu
BG test má hodnotu LM = 29.61, p-hodnota je
5.283e-08.
Keďže p-hodnota je veľmi nízka, nulovú hypotézu o neexistencii sériovej
korelácie
zamietame.
BG test teda potvrdzuje, že v reziduách modelu sa nachádza
významná autokorelácia 1. rádu.
Newey–West robustné štandardné chyby
coeftest(model_pH, vcov = NeweyWest(model_pH))
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.0782510 0.3287140 24.5753 < 2.2e-16 ***
`Temperature (C) - Max` -0.0154459 0.0039855 -3.8755 0.0001506 ***
`Dissolved - Max` 0.0413053 0.0324543 1.2727 0.2048151
`BOD (mg/L) - Max` 0.0035181 0.0027438 1.2822 0.2014702
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Komentár - Newey–West robustné štandardné chyby
Po úprave štandardných chýb pomocou Newey–West korekcie zostáva
teplota jediným štatisticky významným regresorom (p < 0.001), čo
potvrdzuje jej negatívny vplyv na pH.
Vplyv rozpusteného kyslíka ani BOD už pri robustných štandardných
chybách nie je štatisticky významný.
Korekcia teda potvrdzuje, že výsledky modelu sú citlivé najmä voči
zmene štandardnej chyby pri teplotnom regresore, zatiaľ čo ostatné
premenné nevykazujú výrazný a spoľahlivý vplyv na pH.
Dynamický (Koyckov) model
iw_data_dyn <- iw_data %>%
dplyr::arrange(Year_clean) %>%
dplyr::mutate(
pH_Max_lag1 = dplyr::lag(`pH - Max`)
)
model_koyck <- lm(
`pH - Max` ~ `Temperature (C) - Max` +
`Dissolved - Max` +
`BOD (mg/L) - Max` +
pH_Max_lag1,
data = iw_data_dyn
)
summary(model_koyck)
Call:
lm(formula = `pH - Max` ~ `Temperature (C) - Max` + `Dissolved - Max` +
`BOD (mg/L) - Max` + pH_Max_lag1, data = iw_data_dyn)
Residuals:
Min 1Q Median 3Q Max
-1.5115 -0.2005 -0.0020 0.1821 3.3285
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.680315 0.632552 7.399 5.80e-12 ***
`Temperature (C) - Max` -0.008198 0.005059 -1.620 0.1070
`Dissolved - Max` 0.041160 0.019344 2.128 0.0348 *
`BOD (mg/L) - Max` 0.003026 0.003329 0.909 0.3646
pH_Max_lag1 0.400714 0.069277 5.784 3.37e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.4177 on 172 degrees of freedom
(1 observation deleted due to missingness)
Multiple R-squared: 0.236, Adjusted R-squared: 0.2182
F-statistic: 13.28 on 4 and 172 DF, p-value: 1.883e-09
Durbin-Watson test
data: model_koyck
DW = 2.1011, p-value = 0.7141
alternative hypothesis: true autocorrelation is greater than 0
Komentár k - Koyckov (dynamický) model
Dynamický model je štatisticky významný (p-hodnota F-testu ≈
1.88e-09) a má vyššiu vysvetľovaciu schopnosť ako pôvodný model
(Adjusted R² ≈ 0.218).
Najvýznamnejším regresorom je oneskorená hodnota pH (pH_Max_lag1),
ktorá je silne štatisticky významná. Koeficient 0.40 naznačuje výraznú
zotrvačnosť vo vývoji pH medzi obdobiami.
Premenná Dissolved - Max zostáva štatisticky významná s
pozitívnym vplyvom, zatiaľ čo teplota a BOD významné nie sú.
komentár k - Durbin–Watsonov test pre dynamický model
Hodnota DW = 2.1011 je blízko 2 a p-hodnota = 0.7141 je vysoká.
Nulovú hypotézu o neexistencii autokorelácie preto nezamietame.
V Koyckovom modeli už nie je prítomná autokorelácia
rezíduí, čo znamená, že zahrnutie oneskorenej premennej vhodne
odstránilo problém autokorelácie zistený v pôvodnom modeli.
Porovnanie modelov
1. Pôvodný lineárny model
- Model je štatisticky významný, ale má nízku vysvetľovaciu
schopnosť
(Adjusted R² ≈ 0.07).
- Reziduá vykazujú významnú pozitívnu
autokoreláciu
(DW ≈ 1.18, BG p-hodnota veľmi nízka).
- Štatisticky významným regresorom bola len teplota, ostatné premenné
mali slabší alebo nevýznamný vplyv.
2. Model s Newey–West robustnými štandardnými
chybami
- Po korekcii štandardných chýb zostáva teplota naďalej
významná.
- Ostatné regresory už významné nie sú.
- NW korekcia potvrdzuje, že pôvodný model je ovplyvnený
autokoreláciou a robustné štandardné chyby upravujú spoľahlivosť testov
štatistickej významnosti.
3. Koyckov (dynamický) model
- Výrazne sa zlepšila vysvetľovacia schopnosť (Adjusted R² ≈
0.218).
- Regressor pH z minulého obdobia je silne významný a zachytáva
dynamiku pH v čase.
- Premenná Dissolved – Max zostáva významná, teplota a BOD nie
sú.
- Autokorelácia rezíduí už nie je prítomná (DW ≈ 2.10),
takže dynamický model efektívne odstránil problém autokorelácie.
Záver
Pôvodný model trpel autokoreláciou, čo spôsobovalo skreslené
štatistické testy. Newey–West korekcia zlepšila odhady štandardných
chýb, ale problém autokorelácie úplne neodstraňuje.
Koyckov dynamický model je kvalitatívne najlepší –
má vyššie Adjusted R², zachytáva časovú dynamiku pH a úspešne eliminuje
autokoreláciu rezíduí.
LS0tCnRpdGxlOiAiQ3ZpxI1lbmllIDcg4oCTIFByw6FjYSBzIGRhdGFiw6F6b3UgKEluZGlhbiBXYXRlciBEYXRhKSIKYXV0aG9yOiAiU8OhcmEgTmlrb2wgU2Nob2x0em92w6EiCmRhdGU6ICJOb3ZlbWJlciAyMDI1IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCmVkaXRvcl9vcHRpb25zOgogIG1hcmtkb3duOgogICAgd3JhcDogNzIKLS0tCmBgYHtyfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgICBlY2hvID0gVFJVRSwKICAgIG1lc3NhZ2UgPSBGQUxTRSwKICAgIHdhcm5pbmcgPSBGQUxTRSkKYGBgCmBgYHtyfQpsaWJyYXJ5KHpvbykKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZWFkcikKCnJtKGxpc3QgPSBscygpKQoKYGBgCgpgYGB7cn0KSW5kaWFuX3dhdGVyX2RhdGEgPC0gcmVhZF9jc3YoIkluZGlhbl93YXRlcl9kYXRhLmNzdiIpCgojIHByZW1lbnVqZW1lIFllYXIga3bDtGxpIGlzdG90ZQpuYW1lcyhJbmRpYW5fd2F0ZXJfZGF0YSlbbmFtZXMoSW5kaWFuX3dhdGVyX2RhdGEpID09ICJZZWFyIl0gPC0gIlllYXJfY2xlYW4iCmBgYAoKIyBMaW5lw6FybmEgcmVncmVzaWEKYGBge3J9CiMgdnl0dm9yw61tZSBwcmFjb3Zuw70gZGF0YXNldCBiZXogTkEgdiBwb3XFvml0w71jaCBwcmVtZW5uw71jaAppd19kYXRhIDwtIEluZGlhbl93YXRlcl9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoCiAgICBZZWFyX2NsZWFuLAogICAgYHBIIC0gTWF4YCwKICAgIGBUZW1wZXJhdHVyZSAoQykgLSBNYXhgLAogICAgYERpc3NvbHZlZCAtIE1heGAsCiAgICBgQk9EIChtZy9MKSAtIE1heGAKICApICU+JQogIG5hLm9taXQoKSAlPiUKICBkcGx5cjo6YXJyYW5nZShZZWFyX2NsZWFuKQoKIyB6w6FrbGFkbsO9IGxpbmXDoXJueSBtb2RlbCAob2RoYWQgbmEgQ0VMT00gaXdfZGF0YSkKbW9kZWxfcEggPC0gbG0oCiAgYHBIIC0gTWF4YCB+IGBUZW1wZXJhdHVyZSAoQykgLSBNYXhgICsgYERpc3NvbHZlZCAtIE1heGAgKyBgQk9EIChtZy9MKSAtIE1heGAsCiAgZGF0YSA9IGl3X2RhdGEKKQoKc3VtbWFyeShtb2RlbF9wSCkKYGBgCiMgQXV0b2tvcmVsw6FjaWEgcmV6w61kdcOtCmBgYHtyfQojIHJlemlkdcOhIGEgZml0dGVkIGhvZG5vdHkKcmVzIDwtIHJlc2lkdWFscyhtb2RlbF9wSCkKaXdfZGF0YSRmaXR0ZWQgPC0gZml0dGVkKG1vZGVsX3BIKQoKZ2dwbG90KGl3X2RhdGEsIGFlcyh4ID0gWWVhcl9jbGVhbiwgeSA9IGBwSCAtIE1heGApKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoeSA9IGZpdHRlZCksIGNvbG9yID0gInJlZCIsIGxpbmV3aWR0aCA9IDEpICsKICBsYWJzKAogICAgdGl0bGUgPSAicEggTWF4OiBlbXBpcmlja8OpIChib2R5KSB2cy4gZml0dGVkICjEjWlhcmEpIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAicEggTWF4IgogICkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKIyMjIEtvbWVudMOhciBrdSBncmFmdSBlbXBpcmlja8O9Y2ggYSBmaXR0ZWQgaG9kbsO0dAoKTW9kcsOpIGJvZHkgcHJlZHN0YXZ1asO6IHNrdXRvxI1uZSBuYW1lcmFuw6kgaG9kbm90eSBwSCB2IGplZG5vdGxpdsO9Y2ggcm9rb2NoLiAgCsSMZXJ2ZW7DoSDEjWlhcmEgemFjaHl0w6F2YSBob2Rub3R5IHByZWRwb3ZlZGFuw6kgcmVncmVzbsO9bSBtb2RlbG9tLgoKVmlkw61tZSwgxb5lIGZpdHRlZCBob2Rub3R5IHNhIHYga2HFvmRvbSByb2t1IG5hY2jDoWR6YWrDuiBwcmlibGnFvm5lIHYgc3RyZWRlIHBvem9yb3ZhbsOpaG8gcm96cHR5bHUuICAKTW9kZWwgdGVkYSBwcmlibGnFvm5lIHZ5c3RpaHVqZSBwcmllbWVybsO6IMO6cm92ZcWIIHBIIHYgamVkbm90bGl2w71jaCByb2tvY2gsIGFsZSBuZWRva8Ohxb5lIHphY2h5dGnFpSBqZWhvIHZuw7p0cm8tcm/EjW7DuiB2YXJpYWJpbGl0dS4gIAoKUm96ZGllbCBtZWR6aSBlbXBpcmlja8O9bWkgaG9kbm90YW1pIGEgxI1lcnZlbm91IMSNaWFyb3UgamUgcG9tZXJuZSB2w71yYXpuw70sIMSNbyB6b2Rwb3ZlZMOhIG7DrXprZWogaG9kbm90ZSBSwrIgdiBtb2RlbGkuCgojIyBBQ0YgcmV6w61kdcOtCmBgYHtyfQphY2YocmVzLCBsYWcubWF4ID0gNCwgbWFpbiA9ICJBdXRva29yZWxhxI1uw6EgZnVua2NpYSByZXrDrWR1w60iKQpgYGAKIyMjIEtvbWVudMOhciBrIEFDRiByZXrDrWR1w60KClYgQUNGIGdyYWZlIHZpZMOtbWUsIMW+ZSB2xaFldGt5IGhvZG5vdHkgYXV0b2tvcmVsw6FjaWUgKG9rcmVtIGxhZyAwKSBzYSBuYWNow6FkemFqw7ogdiByw6FtY2kKOTUgJSBrb25maWRlbsSNbsO9Y2ggaW50ZXJ2YWxvdiAobW9kcsOpIHByZXJ1xaFvdmFuw6kgxI1pYXJ5KS4gIApUbyB6bmFtZW7DoSwgxb5lIHByZSBwb3N1bnkgMSBhxb4gNCBuZWJvbCB6aXN0ZW7DvSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSBhdXRva29yZWxhxI1uw70gdnrFpWFoLgoKTmEgesOha2xhZGUgdG9odG8gZ3JhZnUgbmV2aWTDrW1lIGTDtGtheiBvIHByw610b21ub3N0aSBhdXRva29yZWzDoWNpZSByZXrDrWR1w60uCgojIyBEdXJiaW7igJNXYXRzb25vdiB0ZXN0CmBgYHtyfQpkd3Rlc3QobW9kZWxfcEgpCmBgYAojIyMgS29tZW50w6FyIGsgRHVyYmlu4oCTV2F0c29ub3YgdGVzdHUKCkhvZG5vdGEgRHVyYmlu4oCTV2F0c29ub3ZlaiDFoXRhdGlzdGlreSBqZSAqKkRXID0gMS4xODE5KiosIMSNbyBqZSBtZW5laiBha28gMi4gIApUbyBuYXpuYcSNdWplICoqcG96aXTDrXZudSBhdXRva29yZWzDoWNpdSByZXrDrWR1w60qKi4KClAtaG9kbm90YSBqZSAqKjEuMjI1ZS0wOCoqLCB0YWvFvmUgbnVsb3bDuiBoeXBvdMOpenUgbyBuZWV4aXN0ZW5jaWkgYXV0b2tvcmVsw6FjaWUgIAp6YW1pZXRhbWUuIFYgcmV6aWR1w6FjaCBqZSBwcsOtdG9tbsOhICoqdsO9em5hbW7DoSBwb3ppdMOtdm5hIGF1dG9rb3JlbMOhY2lhIDEuIHLDoWR1KiouCgojIyBCcmV1c2No4oCTR29kZnJleW92IHRlc3QKYGBge3J9CmJndGVzdChtb2RlbF9wSCwgb3JkZXIgPSAxKQpgYGAKIyMjIEtvbWVudMOhciBrIEJyZXVzY2jigJNHb2RmcmV5b3YgdGVzdHUKCkJHIHRlc3QgbcOhIGhvZG5vdHUgKipMTSA9IDI5LjYxKiosIHAtaG9kbm90YSBqZSAqKjUuMjgzZS0wOCoqLiAgCktlxI/FvmUgcC1ob2Rub3RhIGplIHZlxL5taSBuw616a2EsIG51bG92w7ogaHlwb3TDqXp1IG8gbmVleGlzdGVuY2lpIHPDqXJpb3ZlaiBrb3JlbMOhY2llICAKemFtaWV0YW1lLgoKQkcgdGVzdCB0ZWRhIHBvdHZyZHp1amUsIMW+ZSB2IHJlemlkdcOhY2ggbW9kZWx1IHNhIG5hY2jDoWR6YSAgCioqdsO9em5hbW7DoSBhdXRva29yZWzDoWNpYSAxLiByw6FkdSoqLgoKIyMgTmV3ZXnigJNXZXN0IHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnkKYGBge3J9CmNvZWZ0ZXN0KG1vZGVsX3BILCB2Y292ID0gTmV3ZXlXZXN0KG1vZGVsX3BIKSkKYGBgCiMjIyBLb21lbnTDoXIgLSBOZXdleeKAk1dlc3Qgcm9idXN0bsOpIMWhdGFuZGFyZG7DqSBjaHlieQoKUG8gw7pwcmF2ZSDFoXRhbmRhcmRuw71jaCBjaMO9YiBwb21vY291IE5ld2V54oCTV2VzdCBrb3Jla2NpZSB6b3N0w6F2YSB0ZXBsb3RhCmplZGluw71tIMWhdGF0aXN0aWNreSB2w716bmFtbsO9bSByZWdyZXNvcm9tIChwIDwgMC4wMDEpLCDEjW8gcG90dnJkenVqZSBqZWoKbmVnYXTDrXZueSB2cGx5diBuYSBwSC4KClZwbHl2IHJvenB1c3RlbsOpaG8ga3lzbMOta2EgYW5pIEJPRCB1xb4gcHJpIHJvYnVzdG7DvWNoIMWhdGFuZGFyZG7DvWNoIGNoeWLDoWNoCm5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvS4KCktvcmVrY2lhIHRlZGEgcG90dnJkenVqZSwgxb5lIHbDvXNsZWRreSBtb2RlbHUgc8O6IGNpdGxpdsOpIG5ham3DpCB2b8SNaSB6bWVuZQrFoXRhbmRhcmRuZWogY2h5YnkgcHJpIHRlcGxvdG5vbSByZWdyZXNvcmUsIHphdGlhxL4gxI1vIG9zdGF0bsOpIHByZW1lbm7DqQpuZXZ5a2F6dWrDuiB2w71yYXpuw70gYSBzcG/EvmFobGl2w70gdnBseXYgbmEgcEguCgojIyBEeW5hbWlja8O9IChLb3lja292KSBtb2RlbApgYGB7cn0KaXdfZGF0YV9keW4gPC0gaXdfZGF0YSAlPiUKICBkcGx5cjo6YXJyYW5nZShZZWFyX2NsZWFuKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgcEhfTWF4X2xhZzEgPSBkcGx5cjo6bGFnKGBwSCAtIE1heGApCiAgKQoKbW9kZWxfa295Y2sgPC0gbG0oCiAgYHBIIC0gTWF4YCB+IGBUZW1wZXJhdHVyZSAoQykgLSBNYXhgICsKICAgIGBEaXNzb2x2ZWQgLSBNYXhgICsKICAgIGBCT0QgKG1nL0wpIC0gTWF4YCArCiAgICBwSF9NYXhfbGFnMSwKICBkYXRhID0gaXdfZGF0YV9keW4KKQoKc3VtbWFyeShtb2RlbF9rb3ljaykKCmR3dGVzdChtb2RlbF9rb3ljaykKYGBgCiMjIyBLb21lbnTDoXIgayAtIEtveWNrb3YgKGR5bmFtaWNrw70pIG1vZGVsCgpEeW5hbWlja8O9IG1vZGVsIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChwLWhvZG5vdGEgRi10ZXN0dSDiiYggMS44OGUtMDkpIGEgbcOhCnZ5xaHFoWl1IHZ5c3ZldMS+b3ZhY2l1IHNjaG9wbm9zxaUgYWtvIHDDtHZvZG7DvSBtb2RlbCAoQWRqdXN0ZWQgUsKyIOKJiCAwLjIxOCkuCgpOYWp2w716bmFtbmVqxaHDrW0gcmVncmVzb3JvbSBqZSBvbmVza29yZW7DoSBob2Rub3RhIHBIIChwSF9NYXhfbGFnMSksIGt0b3LDoSBqZQpzaWxuZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DoS4gS29lZmljaWVudCAwLjQwIG5hem5hxI11amUgdsO9cmF6bsO6IHpvdHJ2YcSNbm9zxaUKdm8gdsO9dm9qaSBwSCBtZWR6aSBvYmRvYmlhbWkuCgpQcmVtZW5uw6EgYERpc3NvbHZlZCAtIE1heGAgem9zdMOhdmEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EgcyBwb3ppdMOtdm55bSB2cGx5dm9tLAp6YXRpYcS+IMSNbyB0ZXBsb3RhIGEgQk9EIHbDvXpuYW1uw6kgbmllIHPDui4KCiMjIyBrb21lbnTDoXIgayAtIER1cmJpbuKAk1dhdHNvbm92IHRlc3QgcHJlIGR5bmFtaWNrw70gbW9kZWwKCkhvZG5vdGEgRFcgPSAyLjEwMTEgamUgYmzDrXprbyAyIGEgcC1ob2Rub3RhID0gMC43MTQxIGplIHZ5c29rw6EuCk51bG92w7ogaHlwb3TDqXp1IG8gbmVleGlzdGVuY2lpIGF1dG9rb3JlbMOhY2llIHByZXRvIG5lemFtaWV0YW1lLgoKViBLb3lja292b20gbW9kZWxpICoqdcW+IG5pZSBqZSBwcsOtdG9tbsOhIGF1dG9rb3JlbMOhY2lhIHJlesOtZHXDrSoqLCDEjW8gem5hbWVuw6EsCsW+ZSB6YWhybnV0aWUgb25lc2tvcmVuZWogcHJlbWVubmVqIHZob2RuZSBvZHN0csOhbmlsbyBwcm9ibMOpbSBhdXRva29yZWzDoWNpZQp6aXN0ZW7DvSB2IHDDtHZvZG5vbSBtb2RlbGkuCgojIyBQb3Jvdm5hbmllIG1vZGVsb3YKCioqMS4gUMO0dm9kbsO9IGxpbmXDoXJueSBtb2RlbCoqCgotIE1vZGVsIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LCBhbGUgbcOhIG7DrXprdSB2eXN2ZXTEvm92YWNpdSBzY2hvcG5vc8WlICAKICAoQWRqdXN0ZWQgUsKyIOKJiCAwLjA3KS4KLSBSZXppZHXDoSB2eWthenVqw7ogKip2w716bmFtbsO6IHBveml0w612bnUgYXV0b2tvcmVsw6FjaXUqKiAgCiAgKERXIOKJiCAxLjE4LCBCRyBwLWhvZG5vdGEgdmXEvm1pIG7DrXprYSkuCi0gxaB0YXRpc3RpY2t5IHbDvXpuYW1uw71tIHJlZ3Jlc29yb20gYm9sYSBsZW4gdGVwbG90YSwgb3N0YXRuw6kgcHJlbWVubsOpIG1hbGkKICBzbGFixaHDrSBhbGVibyBuZXbDvXpuYW1uw70gdnBseXYuCgoqKjIuIE1vZGVsIHMgTmV3ZXnigJNXZXN0IHJvYnVzdG7DvW1pIMWhdGFuZGFyZG7DvW1pIGNoeWJhbWkqKgoKLSBQbyBrb3Jla2NpaSDFoXRhbmRhcmRuw71jaCBjaMO9YiB6b3N0w6F2YSB0ZXBsb3RhICoqbmHEj2FsZWogdsO9em5hbW7DoSoqLgotIE9zdGF0bsOpIHJlZ3Jlc29yeSB1xb4gdsO9em5hbW7DqSBuaWUgc8O6LgotIE5XIGtvcmVrY2lhIHBvdHZyZHp1amUsIMW+ZSBww7R2b2Ruw70gbW9kZWwgamUgb3ZwbHl2bmVuw70gYXV0b2tvcmVsw6FjaW91CiAgYSByb2J1c3Ruw6kgxaF0YW5kYXJkbsOpIGNoeWJ5IHVwcmF2dWrDuiBzcG/EvmFobGl2b3PFpSB0ZXN0b3YgxaF0YXRpc3RpY2tlagogIHbDvXpuYW1ub3N0aS4KCioqMy4gS295Y2tvdiAoZHluYW1pY2vDvSkgbW9kZWwqKgoKLSBWw71yYXpuZSBzYSB6bGVwxaFpbGEgdnlzdmV0xL5vdmFjaWEgc2Nob3Bub3PFpSAoQWRqdXN0ZWQgUsKyIOKJiCAwLjIxOCkuCi0gUmVncmVzc29yIHBIIHogbWludWzDqWhvIG9iZG9iaWEgamUgc2lsbmUgdsO9em5hbW7DvSBhIHphY2h5dMOhdmEgZHluYW1pa3UKICBwSCB2IMSNYXNlLgotIFByZW1lbm7DoSBEaXNzb2x2ZWQg4oCTIE1heCB6b3N0w6F2YSB2w716bmFtbsOhLCB0ZXBsb3RhIGEgQk9EIG5pZSBzw7ouCi0gQXV0b2tvcmVsw6FjaWEgcmV6w61kdcOtIHXFviBuaWUgamUgcHLDrXRvbW7DoSAoRFcg4omIIDIuMTApLCAgCiAgdGFrxb5lIGR5bmFtaWNrw70gbW9kZWwgZWZla3TDrXZuZSBvZHN0csOhbmlsIHByb2Jsw6ltIGF1dG9rb3JlbMOhY2llLgoKIyBaw6F2ZXIKClDDtHZvZG7DvSBtb2RlbCB0cnBlbCBhdXRva29yZWzDoWNpb3UsIMSNbyBzcMO0c29ib3ZhbG8gc2tyZXNsZW7DqSDFoXRhdGlzdGlja8OpCnRlc3R5LiBOZXdleeKAk1dlc3Qga29yZWtjaWEgemxlcMWhaWxhIG9kaGFkeSDFoXRhbmRhcmRuw71jaCBjaMO9YiwgYWxlIHByb2Jsw6ltCmF1dG9rb3JlbMOhY2llIMO6cGxuZSBuZW9kc3RyYcWIdWplLgoKS295Y2tvdiBkeW5hbWlja8O9IG1vZGVsIGplICoqa3ZhbGl0YXTDrXZuZSBuYWpsZXDFocOtKiog4oCTIG3DoSB2ecWhxaFpZSBBZGp1c3RlZCBSwrIsCnphY2h5dMOhdmEgxI1hc292w7ogZHluYW1pa3UgcEggYSDDunNwZcWhbmUgZWxpbWludWplIGF1dG9rb3JlbMOhY2l1IHJlesOtZHXDrS4KCgoK