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

dwtest(model_pH)

    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
dwtest(model_koyck)

    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