Econometrics in R

Úvod a údaje

Rozhodla som sa modelovať infláciu v USA ako funkciu troch vysvetľujúcich premenných:

  • GDP_Growth — hospodársky rast

  • Unemployment — miera nezamestnanosti

  • Interest_Rate — úroková sadzba

Hypotézy:

  • H1: Vyšší hospodársky rast znižuje infláciu.

  • H2: Vyššia nezamestnanosť vedie k nižšiemu inflačnému tlaku.

  • H3: Vyššia úroková sadzba znižuje infláciu.

Príprava databázy

# Načítanie knižníc
library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
library(dplyr)
library(ggplot2)
rm(list = ls())
# Načítanie údajov
data <- read.csv("economic_indicators_dataset_2010_2023.csv",
                 dec = ".", sep = ",", header = TRUE)

# Dátum
data$Date <- as.Date(data$Date)

# Výber USA a užitočných premenných
dataUSA <- data %>%
  filter(Country == "USA") %>%
  select(Date,
         Inflation.Rate....,
         GDP.Growth.Rate....,
         Unemployment.Rate....,
         Interest.Rate....) %>%
  arrange(Date)

# Premenovanie
colnames(dataUSA) <- c("Date","Inflation","GDP_Growth","Unemployment","Interest_Rate")

Lineárna regresia

model <- lm(Inflation ~ GDP_Growth + Unemployment + Interest_Rate,
            data = dataUSA)

summary(model)

Call:
lm(formula = Inflation ~ GDP_Growth + Unemployment + Interest_Rate, 
    data = dataUSA)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.5414 -2.4185  0.3282  2.1848  4.7028 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    6.52358    1.37798   4.734 1.68e-05 ***
GDP_Growth    -0.05513    0.10357  -0.532   0.5967    
Unemployment  -0.25459    0.14127  -1.802   0.0772 .  
Interest_Rate  0.09603    0.12259   0.783   0.4369    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.928 on 53 degrees of freedom
Multiple R-squared:  0.09918,   Adjusted R-squared:  0.04819 
F-statistic: 1.945 on 3 and 53 DF,  p-value: 0.1335

Odhadnutý lineárny regresný model vykazuje nízku celkovú vysvetľujúcu silu, o čom svedčí koeficient determinácie (R-squared) 0.099, čo znamená, že premenné spolu vysvetľujú len 9,9 % variability inflácie. Celkový model nie je štatisticky významný (p-hodnota F-štatistiky = 0,134).

Posúdenie hypotéz:

  • H1: Záporný koeficient (-0,055) je v súlade s hypotézou, no je štatisticky nevýznamný (p=0,597). Hypotéza sa nepotvrdzuje.

  • H2: Záporný koeficient (-0,255) je v súlade s Phillipsovej krivkou a je slabo významný na hladine 10% (p=0,077). Hypotéza je obmedzene podporená.

  • H3: Kladný koeficient (0,096) je v priamom protiklade s hypotézou a je štatisticky nevýznamný (p=0,437). Hypotéza sa nepotvrdzuje.

Autokorelácia rezíduí

Graf znázorňuje porovnanie empirických (skutočných) hodnôt inflácie v USA s fitovanými hodnotami.

ggplot(dataUSA, aes(x = Date, y = Inflation)) +
  geom_point(color = "blue", size = 2) +
  geom_line(aes(y = fitted), color = "red", size = 1) +
  labs(title = "Inflation USA: Empirical vs Fitted values",
       x = "Date", y = "Inflation (%)") +
  theme_minimal()

  • Empirické hodnoty -> dosahujú rozsah 0,0 % až 9,7 % – prejavujú vysokú volatilitu.

  • Fitované hodnoty -> prevažne sa pohybujú okolo priemeru ~5,0 %, čo naznačuje silnú tendenciu k priemeru.

  • Kľúčové Zlyhanie -> model podceňuje infláciu po roku 2020; skutočné hodnoty sú nad 9,0 %, zatiaľ čo model predikuje len 5,0 % – 6,5 %.

Čiže model je neefektívny a má nízku presnosť pri zachytávaní extrémnych inflačných šokov.

ACF graf

Graf zobrazuje koreláciu medzi rezíduami (chybami modelu) v rôznych časových oneskoreniach (Lag).

Ide o kľúčový test, ktorý určuje, či model zachytil celú časovú závislosť dát.

res <- residuals(model)

acf(res, lag.max = 12, main = "ACF of residuals")

  • Empirické hodnoty -> pri oneskoreniach \(Lag \ge 1\) je zjavné, že existuje výrazná negatívna korelácia pri \(Lag = 1\) (približne \(–0,4\)).

  • Kľúčové Zlyhanie -> pretože stĺpec pri \(Lag = 1\) presahuje dolnú signifikačnú hranicu, rezíduá nie sú nezávislé.

To znamená, že chyba modelu v jednom období silne ovplyvňuje chybu v nasledujúcom období.

  • Ďalšie oneskorenia -> všetky ostatné oneskorenia (\(Lag = 2, 3, 4, ...\)) sa nachádzajú vo vnútri signifikačných limitov.

Je zrejmé, že koeficient autokorelácie pre posun (\(Lag\) \(k=1\)) je štatisticky významný, keďže jeho hodnota (približne \(-0,4\)) prekračuje dolnú hranicu konfidenčného intervalu (intervalu spoľahlivosti), ktorá je približne \(-0,3\). Ostatné koeficienty sú nevýznamné.

Durbin–Watson test

dwtest(model)

    Durbin-Watson test

data:  model
DW = 2.8521, p-value = 0.9996
alternative hypothesis: true autocorrelation is greater than 0
  • Štatistika \(\text{DW} = 2.8521\) je výrazne vyššia ako hodnota 2.

To indikuje prítomnosť štatisticky významnej negatívnej autokorelácie prvého rádu v rezíduách modelu.

6. Breusch–Godfrey test

bgtest(model, order = 1)

    Breusch-Godfrey test for serial correlation of order up to 1

data:  model
LM test = 12.326, df = 1, p-value = 0.0004467

Zistená hodnota p-value (\(0.0004467\)) je extrémne nízka, t. j. je výrazne nižšia ako štandardná hladina významnosti \(\alpha = 0,05\) (alebo \(\alpha = 0,01\)).

Zamietame nulovú hypotézu o absencii sériovej korelácie. Existuje štatisticky vysoko významná autokorelácia prvého rádu v rezíduách.

Koyckova transformácia

dataUSA <- dataUSA %>%
  mutate(Inflation_lag1 = lag(Inflation))

model_koyck <- lm(Inflation ~ GDP_Growth + Unemployment + Interest_Rate +
                    Inflation_lag1,
                  data = dataUSA)

summary(model_koyck)

Call:
lm(formula = Inflation ~ GDP_Growth + Unemployment + Interest_Rate + 
    Inflation_lag1, data = dataUSA)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.5476 -2.0242  0.3046  1.8316  4.9636 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)     9.67947    1.68796   5.734 5.33e-07 ***
GDP_Growth     -0.08743    0.09804  -0.892  0.37667    
Unemployment   -0.33972    0.13907  -2.443  0.01808 *  
Interest_Rate  -0.01099    0.11972  -0.092  0.92724    
Inflation_lag1 -0.40149    0.13029  -3.082  0.00332 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.735 on 51 degrees of freedom
  (1 пропущенное наблюдение удалено)
Multiple R-squared:  0.2342,    Adjusted R-squared:  0.1742 
F-statistic:   3.9 on 4 and 51 DF,  p-value: 0.007722
dwtest(model_koyck)

    Durbin-Watson test

data:  model_koyck
DW = 2.2805, p-value = 0.8605
alternative hypothesis: true autocorrelation is greater than 0
  • Hodnota \(p=0,007722\) (z F-testu) potvrdzuje, že je model ako celok štatisticky významný na úrovni \(\alpha=0,01\).

  • Model vysvetľuje približne \(17,42\%\) variability inflácie (Adjusted \(R^2\)). Táto hodnota je relatívne nízka.

  • Štatisticky významné sú premenné Nezamestnanosť (\(\text{Unemployment}\), \(p=0,018\)) a Oneskorená inflácia (\(\text{Inflation_lag1}\), \(p=0,003\)). Rast HDP a Úroková sadzba nie sú významné.

  • Hodnota \(\text{DW} = 2,2805\) je blízka hodnote 2. To signalizuje, že zahrnutie oneskorenej premennej výrazne zlepšilo špecifikáciu modelu a znížilo autokoreláciu rezíduí (v porovnaní s predchádzajúcim modelom).

Model je štatisticky významný a úspešne korigoval problém autokorelácie, avšak jeho celková prediktívna schopnosť je obmedzená (\(R^2 \approx 17\%\)).

Newey–West robustné štandardné chyby

coeftest(model, vcov = NeweyWest(model))

t test of coefficients:

               Estimate Std. Error t value  Pr(>|t|)    
(Intercept)    6.523581   1.223244  5.3330 2.035e-06 ***
GDP_Growth    -0.055135   0.083573 -0.6597   0.51229    
Unemployment  -0.254587   0.113666 -2.2398   0.02932 *  
Interest_Rate  0.096029   0.106435  0.9022   0.37101    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Intercept (Priesečník):

  • Koeficient je vysoko štatisticky významný (\(p < 0.001\)), čo naznačuje, že inflácia má nejakú základnú úroveň, aj keď sú všetky vysvetľujúce premenné nulové.

Unemployment (Nezamestnanosť):

  • Koeficient \(-0.254587\) je štatisticky významný (\(p = 0.02932\), t. j. \(p < 0.05\)).To naznačuje, že negatívny vzťah medzi nezamestnanosťou a infláciou (podobný Phillipsovej krivke) zostáva významný aj po korekcii na autokoreláciu a heteroskedasticitu.

Nevýznamné premenné:

  • GDP_Growth (\(p = 0.51229\)) a Interest_Rate (\(p = 0.37101\)) zostávajú štatisticky nevýznamné. Ich vplyv na infláciu nie je možné štatisticky odlíšiť od nuly, aj keď sú použité robustné chyby.

Záver

Analýza potvrdila, že pôvodný model inflácie bol neadekvátny z dôvodu nízkej vysvetľujúcej sily (\(R^2 \approx 10\%\)) a silnej negatívnej autokorelácie v rezíduách (\(\text{DW}=2,85\)). Zavedenie oneskorenej inflácie (\(\text{Inflation_lag1}\)) problém autokorelácie úspešne eliminovalo (\(\text{DW}=2,28\)), čím sa model stal štatisticky významným.

Model vysvetľuje iba \(17,42\%\) variability inflácie a jedinou robustne významnou premennou je Nezamestnanosť (potvrdenie Phillipsovej krivky), zatiaľ čo \(\text{GDP_Growth}\) a \(\text{Interest_Rate}\) sú nevýznamné. Model je validný, ale má obmedzenú prediktívnu schopnosť a potvrdzuje len negatívny vzťah s nezamestnanosťou.

LS0tDQp0aXRsZTogIsOabG9oYV85Ig0KYXV0aG9yOiAiWXVsaWlhIEx5c3l0c2lhIg0KZGF0ZTogIk5vdmVtYmVyIDIwMjUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KZWRpdG9yX29wdGlvbnM6DQogIG1hcmtkb3duOg0KICAgIHdyYXA6IDcyDQotLS0NCg0KIyBFY29ub21ldHJpY3MgaW4gUg0KDQojIyDDmnZvZCBhIMO6ZGFqZQ0KDQpSb3pob2RsYSBzb20gc2EgbW9kZWxvdmHFpSBpbmZsw6FjaXUgdiBVU0EgYWtvIGZ1bmtjaXUgdHJvY2ggdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaDoNCg0KLSBHRFBfR3Jvd3RoIOKAlCBob3Nwb2TDoXJza3kgcmFzdA0KDQotIFVuZW1wbG95bWVudCDigJQgbWllcmEgbmV6YW1lc3RuYW5vc3RpDQoNCi0gSW50ZXJlc3RfUmF0ZSDigJQgw7pyb2tvdsOhIHNhZHpiYQ0KDQpIeXBvdMOpenk6DQoNCi0gSDE6IFZ5xaHFocOtIGhvc3BvZMOhcnNreSByYXN0IHpuacW+dWplIGluZmzDoWNpdS4NCg0KLSBIMjogVnnFocWhaWEgbmV6YW1lc3RuYW5vc8WlIHZlZGllIGsgbmnFvsWhaWVtdSBpbmZsYcSNbsOpbXUgdGxha3UuDQoNCi0gSDM6IFZ5xaHFoWlhIMO6cm9rb3bDoSBzYWR6YmEgem5pxb51amUgaW5mbMOhY2l1Lg0KDQojIyMgUHLDrXByYXZhIGRhdGFiw6F6eQ0KDQpgYGB7cn0NCiMgTmHEjcOtdGFuaWUga25pxb5uw61jDQpsaWJyYXJ5KHpvbykNCmxpYnJhcnkodHNlcmllcykNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShzYW5kd2ljaCkNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCnJtKGxpc3QgPSBscygpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBOYcSNw610YW5pZSDDumRham92DQpkYXRhIDwtIHJlYWQuY3N2KCJlY29ub21pY19pbmRpY2F0b3JzX2RhdGFzZXRfMjAxMF8yMDIzLmNzdiIsDQogICAgICAgICAgICAgICAgIGRlYyA9ICIuIiwgc2VwID0gIiwiLCBoZWFkZXIgPSBUUlVFKQ0KDQojIETDoXR1bQ0KZGF0YSREYXRlIDwtIGFzLkRhdGUoZGF0YSREYXRlKQ0KDQojIFbDvWJlciBVU0EgYSB1xb5pdG/EjW7DvWNoIHByZW1lbm7DvWNoDQpkYXRhVVNBIDwtIGRhdGEgJT4lDQogIGZpbHRlcihDb3VudHJ5ID09ICJVU0EiKSAlPiUNCiAgc2VsZWN0KERhdGUsDQogICAgICAgICBJbmZsYXRpb24uUmF0ZS4uLi4sDQogICAgICAgICBHRFAuR3Jvd3RoLlJhdGUuLi4uLA0KICAgICAgICAgVW5lbXBsb3ltZW50LlJhdGUuLi4uLA0KICAgICAgICAgSW50ZXJlc3QuUmF0ZS4uLi4pICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCiMgUHJlbWVub3ZhbmllDQpjb2xuYW1lcyhkYXRhVVNBKSA8LSBjKCJEYXRlIiwiSW5mbGF0aW9uIiwiR0RQX0dyb3d0aCIsIlVuZW1wbG95bWVudCIsIkludGVyZXN0X1JhdGUiKQ0KYGBgDQoNCiMjIyBMaW5lw6FybmEgcmVncmVzaWENCg0KYGBge3J9DQptb2RlbCA8LSBsbShJbmZsYXRpb24gfiBHRFBfR3Jvd3RoICsgVW5lbXBsb3ltZW50ICsgSW50ZXJlc3RfUmF0ZSwNCiAgICAgICAgICAgIGRhdGEgPSBkYXRhVVNBKQ0KDQpzdW1tYXJ5KG1vZGVsKQ0KYGBgDQpPZGhhZG51dMO9IGxpbmXDoXJueSByZWdyZXNuw70gbW9kZWwgdnlrYXp1amUgbsOtemt1IGNlbGtvdsO6IHZ5c3ZldMS+dWrDumN1IHNpbHUsIG8gxI1vbSBzdmVkxI3DrSBrb2VmaWNpZW50IGRldGVybWluw6FjaWUgKFItc3F1YXJlZCkgMC4wOTksIMSNbyB6bmFtZW7DoSwgxb5lIHByZW1lbm7DqSBzcG9sdSB2eXN2ZXTEvnVqw7ogbGVuIDksOSAlIHZhcmlhYmlsaXR5IGluZmzDoWNpZS4gQ2Vsa292w70gbW9kZWwgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChwLWhvZG5vdGEgRi3FoXRhdGlzdGlreSA9IDAsMTM0KS4NCg0KUG9zw7pkZW5pZSBoeXBvdMOpejoNCg0KLSBIMTogWsOhcG9ybsO9IGtvZWZpY2llbnQgKC0wLDA1NSkgamUgdiBzw7psYWRlIHMgaHlwb3TDqXpvdSwgbm8gamUgxaF0YXRpc3RpY2t5IG5ldsO9em5hbW7DvSAocD0wLDU5NykuIEh5cG90w6l6YSBzYSBuZXBvdHZyZHp1amUuDQoNCi0gSDI6IFrDoXBvcm7DvSBrb2VmaWNpZW50ICgtMCwyNTUpIGplIHYgc8O6bGFkZSBzIFBoaWxsaXBzb3ZlaiBrcml2a291IGEgamUgc2xhYm8gdsO9em5hbW7DvSBuYSBobGFkaW5lIDEwJSAocD0wLDA3NykuIEh5cG90w6l6YSBqZSBvYm1lZHplbmUgcG9kcG9yZW7DoS4NCg0KLSBIMzogS2xhZG7DvSBrb2VmaWNpZW50ICgwLDA5NikgamUgdiBwcmlhbW9tIHByb3Rpa2xhZGUgcyBoeXBvdMOpem91IGEgamUgxaF0YXRpc3RpY2t5IG5ldsO9em5hbW7DvSAocD0wLDQzNykuIEh5cG90w6l6YSBzYSBuZXBvdHZyZHp1amUuDQoNCiMjIyBBdXRva29yZWzDoWNpYSByZXrDrWR1w60NCg0KR3JhZiB6bsOhem9yxYh1amUgcG9yb3ZuYW5pZSBlbXBpcmlja8O9Y2ggKHNrdXRvxI1uw71jaCkgaG9kbsO0dCBpbmZsw6FjaWUgdiBVU0EgcyBmaXRvdmFuw71taSBob2Rub3RhbWkuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGFVU0EsIGFlcyh4ID0gRGF0ZSwgeSA9IEluZmxhdGlvbikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gZml0dGVkKSwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJJbmZsYXRpb24gVVNBOiBFbXBpcmljYWwgdnMgRml0dGVkIHZhbHVlcyIsDQogICAgICAgeCA9ICJEYXRlIiwgeSA9ICJJbmZsYXRpb24gKCUpIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KLSBFbXBpcmlja8OpIGhvZG5vdHkgLT4gZG9zYWh1asO6IHJvenNhaCAwLDAgJSBhxb4gOSw3ICUg4oCTIHByZWphdnVqw7ogdnlzb2vDuiB2b2xhdGlsaXR1Lg0KDQotIEZpdG92YW7DqSBob2Rub3R5IC0+IHByZXZhxb5uZSBzYSBwb2h5YnVqw7ogb2tvbG8gcHJpZW1lcnUgfjUsMCAlLCDEjW8gbmF6bmHEjXVqZSBzaWxuw7ogdGVuZGVuY2l1IGsgcHJpZW1lcnUuDQoNCi0gS8S+w7rEjW92w6kgWmx5aGFuaWUgLT4gbW9kZWwgcG9kY2XFiHVqZSBpbmZsw6FjaXUgcG8gcm9rdSAyMDIwOyBza3V0b8SNbsOpIGhvZG5vdHkgc8O6IG5hZCA5LDAgJSwgemF0aWHEviDEjW8gbW9kZWwgcHJlZGlrdWplIGxlbiA1LDAgJSDigJMgNiw1ICUuDQoNCsSMacW+ZSBtb2RlbCBqZSBuZWVmZWt0w612bnkgYSBtw6EgbsOtemt1IHByZXNub3PFpSBwcmkgemFjaHl0w6F2YW7DrSBleHRyw6ltbnljaCBpbmZsYcSNbsO9Y2ggxaFva292Lg0KDQojIyMgQUNGIGdyYWYNCg0KR3JhZiB6b2JyYXp1amUga29yZWzDoWNpdSBtZWR6aSByZXrDrWR1YW1pIChjaHliYW1pIG1vZGVsdSkgdiByw7R6bnljaCDEjWFzb3bDvWNoIG9uZXNrb3JlbmlhY2ggKExhZykuIA0KDQpJZGUgbyBrxL7DusSNb3bDvSB0ZXN0LCBrdG9yw70gdXLEjXVqZSwgxI1pIG1vZGVsIHphY2h5dGlsIGNlbMO6IMSNYXNvdsO6IHrDoXZpc2xvc8WlIGTDoXQuDQoNCmBgYHtyfQ0KcmVzIDwtIHJlc2lkdWFscyhtb2RlbCkNCg0KYWNmKHJlcywgbGFnLm1heCA9IDEyLCBtYWluID0gIkFDRiBvZiByZXNpZHVhbHMiKQ0KYGBgDQotIEVtcGlyaWNrw6kgaG9kbm90eSAtPiBwcmkgb25lc2tvcmVuaWFjaCAkTGFnIFxnZSAxJCBqZSB6amF2bsOpLCDFvmUgZXhpc3R1amUgdsO9cmF6bsOhIG5lZ2F0w612bmEga29yZWzDoWNpYSBwcmkgJExhZyA9IDEkIChwcmlibGnFvm5lICTigJMwLDQkKS4NCg0KLSBLxL7DusSNb3bDqSBabHloYW5pZSAtPiBwcmV0b8W+ZSBzdMS6cGVjIHByaSAkTGFnID0gMSQgcHJlc2FodWplIGRvbG7DuiBzaWduaWZpa2HEjW7DuiBocmFuaWN1LCByZXrDrWR1w6EgbmllIHPDuiBuZXrDoXZpc2zDqS4gDQoNClRvIHpuYW1lbsOhLCDFvmUgY2h5YmEgbW9kZWx1IHYgamVkbm9tIG9iZG9iw60gc2lsbmUgb3ZwbHl2xYh1amUgY2h5YnUgdiBuYXNsZWR1asO6Y29tIG9iZG9iw60uDQoNCi0gxI5hbMWhaWUgb25lc2tvcmVuaWEgLT4gdsWhZXRreSBvc3RhdG7DqSBvbmVza29yZW5pYSAoJExhZyA9IDIsIDMsIDQsIC4uLiQpIHNhIG5hY2jDoWR6YWrDuiB2byB2bsO6dHJpIHNpZ25pZmlrYcSNbsO9Y2ggbGltaXRvdi4NCg0KSmUgenJlam3DqSwgxb5lIGtvZWZpY2llbnQgYXV0b2tvcmVsw6FjaWUgcHJlIHBvc3VuICgkTGFnJCAkaz0xJCkgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70sIGtlxI/FvmUgamVobyBob2Rub3RhIChwcmlibGnFvm5lICQtMCw0JCkgcHJla3JhxI11amUgZG9sbsO6IGhyYW5pY3Uga29uZmlkZW7EjW7DqWhvIGludGVydmFsdSAoaW50ZXJ2YWx1IHNwb8S+YWhsaXZvc3RpKSwga3RvcsOhIGplIHByaWJsacW+bmUgJC0wLDMkLiBPc3RhdG7DqSBrb2VmaWNpZW50eSBzw7ogbmV2w716bmFtbsOpLg0KDQojIyMgRHVyYmlu4oCTV2F0c29uIHRlc3QNCg0KYGBge3J9DQpkd3Rlc3QobW9kZWwpDQpgYGANCi0gxaB0YXRpc3Rpa2EgJFx0ZXh0e0RXfSA9IDIuODUyMSQgamUgdsO9cmF6bmUgdnnFocWhaWEgYWtvIGhvZG5vdGEgMi4NCg0KVG8gaW5kaWt1amUgcHLDrXRvbW5vc8WlIMWhdGF0aXN0aWNreSB2w716bmFtbmVqIG5lZ2F0w612bmVqIGF1dG9rb3JlbMOhY2llIHBydsOpaG8gcsOhZHUgdiByZXrDrWR1w6FjaCBtb2RlbHUuDQoNCiMjIyA2LiBCcmV1c2No4oCTR29kZnJleSB0ZXN0DQoNCmBgYHtyfQ0KYmd0ZXN0KG1vZGVsLCBvcmRlciA9IDEpDQpgYGANClppc3RlbsOhIGhvZG5vdGEgcC12YWx1ZSAoJDAuMDAwNDQ2NyQpIGplIGV4dHLDqW1uZSBuw616a2EsIHQuIGouIGplIHbDvXJhem5lIG5pxb7FoWlhIGFrbyDFoXRhbmRhcmRuw6EgaGxhZGluYSB2w716bmFtbm9zdGkgJFxhbHBoYSA9IDAsMDUkIChhbGVibyAkXGFscGhhID0gMCwwMSQpLg0KDQpaYW1pZXRhbWUgbnVsb3bDuiBoeXBvdMOpenUgbyBhYnNlbmNpaSBzw6lyaW92ZWoga29yZWzDoWNpZS4gRXhpc3R1amUgxaF0YXRpc3RpY2t5IHZ5c29rbyB2w716bmFtbsOhIGF1dG9rb3JlbMOhY2lhIHBydsOpaG8gcsOhZHUgdiByZXrDrWR1w6FjaC4NCg0KIyMjIEtveWNrb3ZhIHRyYW5zZm9ybcOhY2lhDQoNCmBgYHtyfQ0KZGF0YVVTQSA8LSBkYXRhVVNBICU+JQ0KICBtdXRhdGUoSW5mbGF0aW9uX2xhZzEgPSBsYWcoSW5mbGF0aW9uKSkNCg0KbW9kZWxfa295Y2sgPC0gbG0oSW5mbGF0aW9uIH4gR0RQX0dyb3d0aCArIFVuZW1wbG95bWVudCArIEludGVyZXN0X1JhdGUgKw0KICAgICAgICAgICAgICAgICAgICBJbmZsYXRpb25fbGFnMSwNCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhVVNBKQ0KDQpzdW1tYXJ5KG1vZGVsX2tveWNrKQ0KDQpkd3Rlc3QobW9kZWxfa295Y2spDQpgYGANCi0gSG9kbm90YSAkcD0wLDAwNzcyMiQgKHogRi10ZXN0dSkgcG90dnJkenVqZSwgxb5lIGplIG1vZGVsIGFrbyBjZWxvayDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSBuYSDDunJvdm5pICRcYWxwaGE9MCwwMSQuDQoNCi0gTW9kZWwgdnlzdmV0xL51amUgcHJpYmxpxb5uZSAkMTcsNDJcJSQgdmFyaWFiaWxpdHkgaW5mbMOhY2llIChBZGp1c3RlZCAkUl4yJCkuIFTDoXRvIGhvZG5vdGEgamUgcmVsYXTDrXZuZSBuw616a2EuDQoNCi0gxaB0YXRpc3RpY2t5IHbDvXpuYW1uw6kgc8O6IHByZW1lbm7DqSBOZXphbWVzdG5hbm9zxaUgKCRcdGV4dHtVbmVtcGxveW1lbnR9JCwgJHA9MCwwMTgkKSBhIE9uZXNrb3JlbsOhIGluZmzDoWNpYSAoJFx0ZXh0e0luZmxhdGlvbl9sYWcxfSQsICRwPTAsMDAzJCkuIFJhc3QgSERQIGEgw5pyb2tvdsOhIHNhZHpiYSBuaWUgc8O6IHbDvXpuYW1uw6kuDQoNCi0gSG9kbm90YSAkXHRleHR7RFd9ID0gMiwyODA1JCBqZSBibMOtemthIGhvZG5vdGUgMi4gVG8gc2lnbmFsaXp1amUsIMW+ZSB6YWhybnV0aWUgb25lc2tvcmVuZWogcHJlbWVubmVqIHbDvXJhem5lIHpsZXDFoWlsbyDFoXBlY2lmaWvDoWNpdSBtb2RlbHUgYSB6bsOtxb5pbG8gYXV0b2tvcmVsw6FjaXUgcmV6w61kdcOtICh2IHBvcm92bmFuw60gcyBwcmVkY2jDoWR6YWrDumNpbSBtb2RlbG9tKS4NCg0KTW9kZWwgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gYSDDunNwZcWhbmUga29yaWdvdmFsIHByb2Jsw6ltIGF1dG9rb3JlbMOhY2llLCBhdsWhYWsgamVobyBjZWxrb3bDoSBwcmVkaWt0w612bmEgc2Nob3Bub3PFpSBqZSBvYm1lZHplbsOhICgkUl4yIFxhcHByb3ggMTdcJSQpLg0KDQojIyMgTmV3ZXnigJNXZXN0IHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnkNCg0KYGBge3J9DQpjb2VmdGVzdChtb2RlbCwgdmNvdiA9IE5ld2V5V2VzdChtb2RlbCkpDQpgYGANCkludGVyY2VwdCAoUHJpZXNlxI1uw61rKToNCg0KLSBLb2VmaWNpZW50IGplIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSAoJHAgPCAwLjAwMSQpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIGluZmzDoWNpYSBtw6EgbmVqYWvDuiB6w6FrbGFkbsO6IMO6cm92ZcWILCBhaiBrZcSPIHPDuiB2xaFldGt5IHZ5c3ZldMS+dWrDumNlIHByZW1lbm7DqSBudWxvdsOpLg0KDQpVbmVtcGxveW1lbnQgKE5lemFtZXN0bmFub3PFpSk6DQoNCi0gS29lZmljaWVudCAkLTAuMjU0NTg3JCBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSAoJHAgPSAwLjAyOTMyJCwgdC4gai4gJHAgPCAwLjA1JCkuVG8gbmF6bmHEjXVqZSwgxb5lIG5lZ2F0w612bnkgdnrFpWFoIG1lZHppIG5lemFtZXN0bmFub3PFpW91IGEgaW5mbMOhY2lvdSAocG9kb2Juw70gUGhpbGxpcHNvdmVqIGtyaXZrZSkgem9zdMOhdmEgdsO9em5hbW7DvSBhaiBwbyBrb3Jla2NpaSBuYSBhdXRva29yZWzDoWNpdSBhIGhldGVyb3NrZWRhc3RpY2l0dS4NCg0KTmV2w716bmFtbsOpIHByZW1lbm7DqToNCg0KLSBHRFBfR3Jvd3RoICgkcCA9IDAuNTEyMjkkKSBhIEludGVyZXN0X1JhdGUgKCRwID0gMC4zNzEwMSQpIHpvc3TDoXZhasO6IMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw6kuIEljaCB2cGx5diBuYSBpbmZsw6FjaXUgbmllIGplIG1vxb5uw6kgxaF0YXRpc3RpY2t5IG9kbMOtxaFpxaUgb2QgbnVseSwgYWoga2XEjyBzw7ogcG91xb5pdMOpIHJvYnVzdG7DqSBjaHlieS4NCg0KDQojIyBaw6F2ZXINCg0KQW5hbMO9emEgcG90dnJkaWxhLCDFvmUgcMO0dm9kbsO9IG1vZGVsIGluZmzDoWNpZSBib2wgbmVhZGVrdsOhdG55IHogZMO0dm9kdSBuw616a2VqIHZ5c3ZldMS+dWrDumNlaiBzaWx5ICgkUl4yIFxhcHByb3ggMTBcJSQpIGEgc2lsbmVqIG5lZ2F0w612bmVqIGF1dG9rb3JlbMOhY2llIHYgcmV6w61kdcOhY2ggKCRcdGV4dHtEV309Miw4NSQpLiBaYXZlZGVuaWUgb25lc2tvcmVuZWogaW5mbMOhY2llICgkXHRleHR7SW5mbGF0aW9uX2xhZzF9JCkgcHJvYmzDqW0gYXV0b2tvcmVsw6FjaWUgw7pzcGXFoW5lIGVsaW1pbm92YWxvICgkXHRleHR7RFd9PTIsMjgkKSwgxI3DrW0gc2EgbW9kZWwgc3RhbCDFoXRhdGlzdGlja3kgdsO9em5hbW7DvW0uIA0KDQpNb2RlbCB2eXN2ZXTEvnVqZSBpYmEgJDE3LDQyXCUkIHZhcmlhYmlsaXR5IGluZmzDoWNpZSBhIGplZGlub3Ugcm9idXN0bmUgdsO9em5hbW5vdSBwcmVtZW5ub3UgamUgTmV6YW1lc3RuYW5vc8WlIChwb3R2cmRlbmllIFBoaWxsaXBzb3ZlaiBrcml2a3kpLCB6YXRpYcS+IMSNbyAkXHRleHR7R0RQX0dyb3d0aH0kIGEgJFx0ZXh0e0ludGVyZXN0X1JhdGV9JCBzw7ogbmV2w716bmFtbsOpLiBNb2RlbCBqZSB2YWxpZG7DvSwgYWxlIG3DoSBvYm1lZHplbsO6IHByZWRpa3TDrXZudSBzY2hvcG5vc8WlIGEgcG90dnJkenVqZSBsZW4gbmVnYXTDrXZueSB2esWlYWggcyBuZXphbWVzdG5hbm9zxaVvdS4NCg0KDQoNCg0KDQoNCg0KDQo=