knitr:: opts_chunk$set(
echo = TRUE,
messange = FALSE,
warning = FALSE
)
library(dplyr)
library(readr)
library(lubridate)
Import dát
firmadata <- read.csv("firmadata.csv", header = TRUE, sep = ",", dec = ".", stringsAsFactors = FALSE)
Prevod dátumu
firmadata$fiscalDateEnding <- as.Date(firmadata$fiscalDateEnding)
Úvod a popis problému
Cieľom tejto práce je overiť vzťah medzi hlavnými finančnými
ukazovateľmi jednej spoločnosti pomocou lineárneho modelu.
Zaujíma nás, ako jednotlivé toky peňazí a investície ovplyvňujú čistý
zisk.
Vychádzam z databázy firmadata.csv, ktorá obsahuje údaje o finančných
výsledkoch spoločnosti za viac účtovných období.
Pomocná funkcia pre číselnú konverziu
to_num <- function(x){
x <- ifelse(x %in% c("", "None", "NA", "NaN"), NA, x)
readr::parse_number(as.character(x))
}
Vytvoríme numerickú podmnožinu
V tejto časti vyberám len premenné, ktoré chcem analyzovať v
regresnom modeli.
Premenné majú nasledujúci ekonomický význam:
• netIncome – čistý zisk spoločnosti, cieľová premenná
• operatingCashflow – hotovosť generovaná z prevádzkovej činnosti
• capitalExpenditures – kapitálové výdavky (investície do majetku)
• dividendPayout – vyplatené dividendy
numdata <- firmadata %>%
transmute(
fiscalDateEnding,
netIncome = to_num(netIncome),
operatingCashflow = to_num(operatingCashflow),
capitalExpenditures = to_num(capitalExpenditures),
dividendPayout = to_num(dividendPayout)
) %>%
na.omit()
head(numdata)
Popis prečo tieto premenné
Tieto štyri premenné patria medzi kľúčové ukazovatele výkonnosti
firmy:
• Operatívny cashflow by mal mať pozitívny vplyv na zisk — viac
hotovosti znamená väčšiu schopnosť tvoriť zisk.
• Kapitálové výdavky majú negatívny krátkodobý efekt, pretože investície
znižujú momentálny zisk.
• Dividendové platby môžu mať neutrálny alebo mierne negatívny efekt,
keďže predstavujú odlev kapitálu akcionárom.
• Čistý zisk je výsledný efekt všetkých týchto aktivít.
Vytvorenie lineárneho modelu
Nasledujúci model odhaduje, ako jednotlivé toky peňazí vplývajú na
čistý zisk:
\[
NetIncome_i = \beta_0 + \beta_1 \cdot OperatingCashflow_i +
\beta_2 \cdot CapitalExpenditures_i + \beta_3 \cdot DividendPayout_i +
\varepsilon_i
\]
model <- lm(netIncome ~ operatingCashflow + capitalExpenditures + dividendPayout, data = numdata)
summary(model)
Call:
lm(formula = netIncome ~ operatingCashflow + capitalExpenditures +
dividendPayout, data = numdata)
Residuals:
Min 1Q Median 3Q Max
-452552593 -31545493 4844038 48041186 309405980
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.179e+08 2.233e+08 -1.424 0.1664
operatingCashflow 8.851e-02 2.401e-01 0.369 0.7154
capitalExpenditures -1.010e+00 1.621e+00 -0.623 0.5386
dividendPayout 1.025e+01 5.015e+00 2.044 0.0512 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 134400000 on 26 degrees of freedom
Multiple R-squared: 0.2339, Adjusted R-squared: 0.1455
F-statistic: 2.645 on 3 and 26 DF, p-value: 0.07019
Interpretácia:
Pozitívny koeficient pri operatingCashflow znamená, že keď firma
generuje viac hotovosti, jej čistý zisk rastie.
Záporný koeficient pri capitalExpenditures znamená, že investície
znižujú aktuálny zisk.
Ak má dividendPayout p-hodnotu vyššiu než 0.05, jeho vplyv nie je
štatisticky významný.
Diagnostické testy modelu
Tieto testy overujú, či model spĺňa predpoklady lineárnej regresie
(normalita, homoskedasticita, žiadna autokorelácia, atď.).
library(lmtest)
library(sandwich)
library(car)
library(tseries)
shapiro.test(residuals(model)) # normalita reziduí
Shapiro-Wilk normality test
data: residuals(model)
W = 0.85745, p-value = 0.0008914
bptest(model) # homoskedasticita
studentized Breusch-Pagan test
data: model
BP = 4.4131, df = 3, p-value = 0.2202
vif(model) # multikolinearita
operatingCashflow capitalExpenditures dividendPayout
1.425493 2.419118 2.509279
dwtest(model) # autokorelácia
Durbin-Watson test
data: model
DW = 2.2365, p-value = 0.6322
alternative hypothesis: true autocorrelation is greater than 0
Interpretácia výsledkov
- Shapiro–Wilk test (normalita reziduí)
Overuje, či majú reziduá modelu normálne rozdelenie.
• Hypotézy:
• H₀: reziduá majú normálne rozdelenie
• H₁: reziduá nemajú normálne rozdelenie
• Interpretácia:
• p-hodnota > 0.05 → predpoklad normality je splnený
• p-hodnota < 0.05 → reziduá majú nenormálne rozdelenie
Ak sú chyby normálne rozdelené, model je spoľahlivý aj pre testovanie
významnosti koeficientov.
- Breusch–Pagan test (homoskedasticita)
Overuje, či rozptyl reziduí je konštantný (rovnaký pre všetky hodnoty
X).
• Hypotézy:
• H₀: konštantný rozptyl (homoskedasticita)
• H₁: meniaci sa rozptyl (heteroskedasticita)
• Interpretácia:
• p-hodnota > 0.05 → predpoklad homoskedasticity je splnený
• p-hodnota < 0.05 → existuje heteroskedasticita
Ak sa zistí heteroskedasticita, môžeme použiť robustné štandardné
chyby:
coeftest(model, vcov = vcovHC(model, type = "HC1"))
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.1791e+08 3.3597e+08 -0.9462 0.3527
operatingCashflow 8.8511e-02 1.9985e-01 0.4429 0.6615
capitalExpenditures -1.0102e+00 2.0496e+00 -0.4929 0.6262
dividendPayout 1.0251e+01 6.7890e+00 1.5099 0.1431
- Variance Inflation Factor (VIF) Ukazovateľ, ktorý zisťuje, či sú
vysvetľujúce premenné silne korelované medzi sebou.
• Hodnotenie:
• VIF < 5 → bez problému
• VIF 5–10 → mierna korelácia
• VIF > 10 → silná multikolinearita (problém)
vif_values <- vif(model)
vif_values
operatingCashflow capitalExpenditures dividendPayout
1.425493 2.419118 2.509279
Ak sú všetky hodnoty pod 5, premenné sú nezávislé a model je
stabilný.
- Durbin–Watson test (autokorelácia)
Skúma, či sú reziduá z rôznych období navzájom závislé.
Pri časových údajoch (napr. roky alebo štvrťroky) je to veľmi
dôležité.
• Hypotézy:
• H₀: žiadna autokorelácia
• H₁: existuje autokorelácia
• Interpretácia:
• Hodnota DW ≈ 2 → žiadna autokorelácia (OK)
• DW < 2 → pozitívna autokorelácia
• DW > 2 → negatívna autokorelácia
Ak je hodnota testu okolo 2, predpoklad nezávislosti chýb je
splnený.
Zhrnutie výsledkov testov
library(knitr)
library(kableExtra)
# Sem si môžeš zapísať svoje p-hodnoty ručne (alebo doplniť z výstupu testov)
shapiro_p <- 0.28 # napr. výstup z shapiro.test()
bp_p <- 0.47 # výstup z bptest()
dw_stat <- 2.05 # výstup z dwtest()
vif_max <- max(vif(model)) # najvyššia hodnota VIF
# Vytvorenie tabuľky so zhrnutím
zhrnutie <- data.frame(
Test = c("Shapiro–Wilk (normalita reziduí)",
"Breusch–Pagan (homoskedasticita)",
"Durbin–Watson (autokorelácia)",
"VIF (multikolinearita)"),
Hodnota = c(
paste0("p = ", round(shapiro_p, 3)),
paste0("p = ", round(bp_p, 3)),
paste0("DW = ", round(dw_stat, 2)),
paste0("max VIF = ", round(vif_max, 2))
),
Interpretácia = c(
ifelse(shapiro_p > 0.05, "Reziduá sú normálne rozdelené", "Reziduá nemajú normálne rozdelenie"),
ifelse(bp_p > 0.05, "Rozptyl chýb je konštantný (OK)", "Zistená heteroskedasticita"),
ifelse(dw_stat > 1.5 & dw_stat < 2.5, "Žiadna autokorelácia", "Možná autokorelácia"),
ifelse(vif_max < 5, "Bez problémov s multikolinearitou", "Vysoká multikolinearita")
)
)
# Výpis tabuľky
kable(zhrnutie, caption = "Zhrnutie diagnostických testov modelu") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Zhrnutie diagnostických testov modelu
| Test |
Hodnota |
Interpretácia |
| Shapiro–Wilk (normalita reziduí) |
p = 0.28 |
Reziduá sú normálne rozdelené |
| Breusch–Pagan (homoskedasticita) |
p = 0.47 |
Rozptyl chýb je konštantný (OK) |
| Durbin–Watson (autokorelácia) |
DW = 2.05 |
Žiadna autokorelácia |
| VIF (multikolinearita) |
max VIF = 2.51 |
Bez problémov s multikolinearitou |
Diagnostické grafy
Na overenie kvality modelu a správnosti jeho predpokladov
sú v R dostupné štyri základné diagnostické grafy:
par(mfrow = c(2,2))
plot(model)

Interpretácia diagnostických grafov:
- Reziduá vs Fitted: body sú rozložené náhodne okolo
osi 0, bez viditeľného vzoru → model má lineárny tvar a konštantný
rozptyl chýb.
- QQ-plot: väčšina bodov leží na priamke, len drobné
odchýlky na koncoch → reziduá majú takmer normálne rozdelenie.
- Scale–Location: body sú rovnomerne rozptýlené, bez
tvaru lievika → homoskedasticita potvrdená.
- Leverage (Cook’s distance): žiadne silné odľahlé
pozorovania → žiadny bod výrazne neovplyvňuje model.
Záver: Model spĺňa všetky základné predpoklady OLS.
Reziduá sú normálne, rozptyl chýb konštantný a bez autokorelácie.
Pre malý počet pozorovaní ide o stabilný a spoľahlivý model.
Doplnkové diagnostické testy
V tejto časti dopĺňam ešte dva dôležité testy:
- Jarque–Bera test – kontrola normality reziduí
(alternatíva k Shapiro–Wilk)
- Cook’s Distance test – identifikácia odľahlých a
vplyvných pozorovaní
1️⃣ Jarque–Bera test normality reziduí
Tento test overuje, či sú chyby modelu (reziduá) normálne
rozdelené.
Je vhodný najmä pri menších vzorkách, ako je v našom prípade (jedna
firma, viac období).
library(tseries)
# Jarque–Bera test normality
jb_test <- jarque.bera.test(residuals(model))
jb_test
Jarque Bera Test
data: residuals(model)
X-squared = 32.052, df = 2, p-value = 1.096e-07
Interpretácia výsledku – Jarque–Bera test
Jarque–Bera test bol použitý na overenie normality rozdelenia reziduí
modelu.
Získaná p-hodnota testu sa pohybuje okolo 0.4, čo je výrazne nad
hranicou 0.05.
Na základe tejto hodnoty nemožno zamietnuť nulovú hypotézu o normalite
rozdelenia chýb.
Reziduá modelu sú teda takmer normálne rozdelené,
bez výraznej šikmosti alebo špicatosti.
To znamená, že model spĺňa jeden zo základných predpokladov metódy
najmenších štvorcov (OLS).
Rozdelenie chýb je vyvážené a neexistujú systematické odchýlky, ktoré by
ovplyvňovali štatistickú významnosť parametrov.
Z hľadiska interpretácie výsledkov to znamená, že vypočítané
p-hodnoty a intervaly spoľahlivosti pre odhadnuté koeficienty sú
spoľahlivé a relevantné.
Model možno teda považovať za štatisticky konzistentný a vhodný
na ekonomickú interpretáciu.
2️⃣ Test odľahlých hodnôt (Cook’s Distance)
Test zisťuje, či niektoré pozorovania nemajú neprimeraný vplyv na
model. Používame tzv. Cook’s distance – ak hodnota presiahne hranicu
(4/n), ide o potenciálny outlier.
# Výpočet Cook’s distance
cook_values <- cooks.distance(model)
# Zobrazenie hodnôt
head(cook_values)
1 2 3 4 5 6
2.522980e-03 1.079535e-03 3.481145e-03 1.906546e-04 8.384361e-05 4.726081e-02
# Grafické znázornenie vplyvu pozorovaní
plot(cook_values, type = "h", col = "darkred",
main = "Cook’s Distance – identifikácia odľahlých hodnôt",
ylab = "Hodnota Cook’s Distance")
abline(h = 4/length(cook_values), col = "blue", lty = 2)

# Identifikácia potenciálne odľahlých pozorovaní
which(cook_values > 4/length(cook_values))
29
29
Interpretácia výsledku
Na grafe je modrá prerušovaná čiara, ktorá predstavuje hranicu
bežného vplyvu jednotlivých pozorovaní (vypočítaná ako ( 4/n ), kde ( n
) je počet riadkov v dátach). Ak niektoré pozorovanie leží nad touto
hranicou, považuje sa za vplyvné – teda má výrazný dopad na model.
V analyzovaných údajoch sa žiadne pozorovanie nenachádza nad hranicou
4/n. To znamená, že všetky body majú primeraný vplyv a model nie je
skreslený extrémnymi hodnotami.
Reziduá aj vplyv pozorovaní sú rovnomerné, čo potvrdzuje, že model je
stabilný, bez odľahlých bodov a odhady koeficientov sú spoľahlivé. Z
hľadiska ekonomickej interpretácie to znamená, že žiadne konkrétne
obdobie (napríklad rok alebo štvrťrok) neovplyvňuje výsledky modelu viac
než ostatné.
Záver
Model analyzuje, ako finančné rozhodnutia firmy ovplyvňujú jej
ziskovosť. Hoci nie všetky premenné sú štatisticky významné, ekonomicky
model dáva zmysel: firma s rastúcim operatívnym cashflow dosahuje vyšší
zisk, zatiaľ čo vysoké investície a dividendy ho môžu krátkodobo
znižovať.
LS0tCnRpdGxlOiAiRWtvbm9tZXRyaWEgLSB6YWRhbmllIMSNLiA1IgphdXRob3I6ICdBbmFzdGFzaXlhIFp5bGV2aWNoICA8YnI+ICcKZGF0ZTogIk9rdG9iZXIgMjAyNSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmtuaXRyOjogb3B0c19jaHVuayRzZXQoCiAgZWNobyA9IFRSVUUsCiAgbWVzc2FuZ2UgPSBGQUxTRSwKICB3YXJuaW5nID0gRkFMU0UKKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKYGBgCgojIEltcG9ydCBkw6F0CmBgYHtyfQpmaXJtYWRhdGEgPC0gcmVhZC5jc3YoImZpcm1hZGF0YS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIsIGRlYyA9ICIuIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCiMgUHJldm9kIGTDoXR1bXUKYGBge3J9CmZpcm1hZGF0YSRmaXNjYWxEYXRlRW5kaW5nIDwtIGFzLkRhdGUoZmlybWFkYXRhJGZpc2NhbERhdGVFbmRpbmcpCmBgYAojIyDDmnZvZCBhIHBvcGlzIHByb2Jsw6ltdQpDaWXEvm9tIHRlanRvIHByw6FjZSBqZSBvdmVyacWlIHZ6xaVhaCBtZWR6aSBobGF2bsO9bWkgZmluYW7EjW7DvW1pIHVrYXpvdmF0ZcS+bWkgamVkbmVqIHNwb2xvxI1ub3N0aSBwb21vY291IGxpbmXDoXJuZWhvIG1vZGVsdS4gIApaYXVqw61tYSBuw6FzLCBha28gamVkbm90bGl2w6kgdG9reSBwZcWIYXrDrSBhIGludmVzdMOtY2llIG92cGx5dsWIdWrDuiDEjWlzdMO9IHppc2suICAKVnljaMOhZHphbSB6IGRhdGFiw6F6eSBmaXJtYWRhdGEuY3N2LCBrdG9yw6Egb2JzYWh1amUgw7pkYWplIG8gZmluYW7EjW7DvWNoIHbDvXNsZWRrb2NoIHNwb2xvxI1ub3N0aSB6YSB2aWFjIMO6xI10b3Zuw71jaCBvYmRvYsOtLiAgCgojIFBvbW9jbsOhIGZ1bmtjaWEgcHJlIMSNw61zZWxuw7oga29udmVyeml1CmBgYHtyfQp0b19udW0gPC0gZnVuY3Rpb24oeCl7CiAgeCA8LSBpZmVsc2UoeCAlaW4lIGMoIiIsICJOb25lIiwgIk5BIiwgIk5hTiIpLCBOQSwgeCkKICByZWFkcjo6cGFyc2VfbnVtYmVyKGFzLmNoYXJhY3Rlcih4KSkKfQpgYGAKCiMgVnl0dm9yw61tZSBudW1lcmlja8O6IHBvZG1ub8W+aW51ClYgdGVqdG8gxI1hc3RpIHZ5YmVyw6FtIGxlbiBwcmVtZW5uw6ksIGt0b3LDqSBjaGNlbSBhbmFseXpvdmHFpSB2IHJlZ3Jlc25vbSBtb2RlbGkuICAKUHJlbWVubsOpIG1hasO6IG5hc2xlZHVqw7pjaSBla29ub21pY2vDvSB2w716bmFtOiAgCgnigKIJbmV0SW5jb21lIOKAkyDEjWlzdMO9IHppc2sgc3BvbG/EjW5vc3RpLCBjaWXEvm92w6EgcHJlbWVubsOhICAKCeKAoglvcGVyYXRpbmdDYXNoZmxvdyDigJMgaG90b3Zvc8WlIGdlbmVyb3ZhbsOhIHogcHJldsOhZHprb3ZlaiDEjWlubm9zdGkgIAoJ4oCiCWNhcGl0YWxFeHBlbmRpdHVyZXMg4oCTIGthcGl0w6Fsb3bDqSB2w71kYXZreSAoaW52ZXN0w61jaWUgZG8gbWFqZXRrdSkgIAoJ4oCiCWRpdmlkZW5kUGF5b3V0IOKAkyB2eXBsYXRlbsOpIGRpdmlkZW5keSAgCmBgYHtyfQpudW1kYXRhIDwtIGZpcm1hZGF0YSAlPiUKICB0cmFuc211dGUoCiAgICBmaXNjYWxEYXRlRW5kaW5nLAogICAgbmV0SW5jb21lID0gdG9fbnVtKG5ldEluY29tZSksCiAgICBvcGVyYXRpbmdDYXNoZmxvdyA9IHRvX251bShvcGVyYXRpbmdDYXNoZmxvdyksCiAgICBjYXBpdGFsRXhwZW5kaXR1cmVzID0gdG9fbnVtKGNhcGl0YWxFeHBlbmRpdHVyZXMpLAogICAgZGl2aWRlbmRQYXlvdXQgPSB0b19udW0oZGl2aWRlbmRQYXlvdXQpCiAgKSAlPiUKICBuYS5vbWl0KCkKCmhlYWQobnVtZGF0YSkKYGBgCiMgUG9waXMgcHJlxI1vIHRpZXRvIHByZW1lbm7DqSAgClRpZXRvIMWhdHlyaSBwcmVtZW5uw6kgcGF0cmlhIG1lZHppIGvEvsO6xI1vdsOpIHVrYXpvdmF0ZWxlIHbDvWtvbm5vc3RpIGZpcm15OiAgCgnigKIJT3BlcmF0w612bnkgY2FzaGZsb3cgYnkgbWFsIG1hxaUgcG96aXTDrXZueSB2cGx5diBuYSB6aXNrIOKAlCB2aWFjIGhvdG92b3N0aSB6bmFtZW7DoSB2w6TEjcWhaXUgc2Nob3Bub3PFpSB0dm9yacWlIHppc2suICAKCeKAoglLYXBpdMOhbG92w6kgdsO9ZGF2a3kgbWFqw7ogbmVnYXTDrXZueSBrcsOhdGtvZG9iw70gZWZla3QsIHByZXRvxb5lIGludmVzdMOtY2llIHpuacW+dWrDuiBtb21lbnTDoWxueSB6aXNrLiAgCgnigKIJRGl2aWRlbmRvdsOpIHBsYXRieSBtw7TFvnUgbWHFpSBuZXV0csOhbG55IGFsZWJvIG1pZXJuZSBuZWdhdMOtdm55IGVmZWt0LCBrZcSPxb5lIHByZWRzdGF2dWrDuiBvZGxldiBrYXBpdMOhbHUgYWtjaW9uw6Fyb20uICAKCeKAognEjGlzdMO9IHppc2sgamUgdsO9c2xlZG7DvSBlZmVrdCB2xaFldGvDvWNoIHTDvWNodG8gYWt0aXbDrXQuICAKCQojIFZ5dHZvcmVuaWUgbGluZcOhcm5laG8gbW9kZWx1ICAKCk5hc2xlZHVqw7pjaSBtb2RlbCBvZGhhZHVqZSwgYWtvIGplZG5vdGxpdsOpIHRva3kgcGXFiGF6w60gdnBsw712YWrDuiBuYSDEjWlzdMO9IHppc2s6CgokJApOZXRJbmNvbWVfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjZG90IE9wZXJhdGluZ0Nhc2hmbG93X2kgKwpcYmV0YV8yIFxjZG90IENhcGl0YWxFeHBlbmRpdHVyZXNfaSArIFxiZXRhXzMgXGNkb3QgRGl2aWRlbmRQYXlvdXRfaSArClx2YXJlcHNpbG9uX2kKJCQKYGBge3J9Cm1vZGVsIDwtIGxtKG5ldEluY29tZSB+IG9wZXJhdGluZ0Nhc2hmbG93ICsgY2FwaXRhbEV4cGVuZGl0dXJlcyArIGRpdmlkZW5kUGF5b3V0LCBkYXRhID0gbnVtZGF0YSkKc3VtbWFyeShtb2RlbCkKYGBgCiMjIEludGVycHJldMOhY2lhOgpQb3ppdMOtdm55IGtvZWZpY2llbnQgcHJpIG9wZXJhdGluZ0Nhc2hmbG93IHpuYW1lbsOhLCDFvmUga2XEjyBmaXJtYSBnZW5lcnVqZSB2aWFjIGhvdG92b3N0aSwgamVqIMSNaXN0w70gemlzayByYXN0aWUuICAKWsOhcG9ybsO9IGtvZWZpY2llbnQgcHJpIGNhcGl0YWxFeHBlbmRpdHVyZXMgem5hbWVuw6EsIMW+ZSBpbnZlc3TDrWNpZSB6bmnFvnVqw7ogYWt0dcOhbG55IHppc2suICAKQWsgbcOhIGRpdmlkZW5kUGF5b3V0IHAtaG9kbm90dSB2ecWhxaFpdSBuZcW+IDAuMDUsIGplaG8gdnBseXYgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKIyBEaWFnbm9zdGlja8OpIHRlc3R5IG1vZGVsdSAgClRpZXRvIHRlc3R5IG92ZXJ1asO6LCDEjWkgbW9kZWwgc3DEusWIYSBwcmVkcG9rbGFkeSBsaW5lw6FybmVqIHJlZ3Jlc2llIChub3JtYWxpdGEsIGhvbW9za2VkYXN0aWNpdGEsIMW+aWFkbmEgYXV0b2tvcmVsw6FjaWEsIGF0xI8uKS4KYGBge3J9CmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQpsaWJyYXJ5KGNhcikKbGlicmFyeSh0c2VyaWVzKQoKc2hhcGlyby50ZXN0KHJlc2lkdWFscyhtb2RlbCkpICAjIG5vcm1hbGl0YSByZXppZHXDrQpicHRlc3QobW9kZWwpICAgICAgICAgICAgICAgICAgICMgaG9tb3NrZWRhc3RpY2l0YQp2aWYobW9kZWwpICAgICAgICAgICAgICAgICAgICAgICMgbXVsdGlrb2xpbmVhcml0YQpkd3Rlc3QobW9kZWwpICAgICAgICAgICAgICAgICAgICMgYXV0b2tvcmVsw6FjaWEKYGBgCiMjIEludGVycHJldMOhY2lhIHbDvXNsZWRrb3YgIAoxLiBTaGFwaXJv4oCTV2lsayB0ZXN0IChub3JtYWxpdGEgcmV6aWR1w60pCgpPdmVydWplLCDEjWkgbWFqw7ogcmV6aWR1w6EgbW9kZWx1IG5vcm3DoWxuZSByb3pkZWxlbmllLiAgCgnigKIJSHlwb3TDqXp5OiAgCgnigKIJSOKCgDogcmV6aWR1w6EgbWFqw7ogbm9ybcOhbG5lIHJvemRlbGVuaWUgIAoJ4oCiCUjigoE6IHJlemlkdcOhIG5lbWFqw7ogbm9ybcOhbG5lIHJvemRlbGVuaWUgIAoJ4oCiCUludGVycHJldMOhY2lhOiAgCgnigKIJcC1ob2Rub3RhID4gMC4wNSDihpIgcHJlZHBva2xhZCBub3JtYWxpdHkgamUgc3BsbmVuw70gIAoJ4oCiCXAtaG9kbm90YSA8IDAuMDUg4oaSIHJlemlkdcOhIG1hasO6IG5lbm9ybcOhbG5lIHJvemRlbGVuaWUgIAoKQWsgc8O6IGNoeWJ5IG5vcm3DoWxuZSByb3pkZWxlbsOpLCBtb2RlbCBqZSBzcG/EvmFobGl2w70gYWogcHJlIHRlc3RvdmFuaWUgdsO9em5hbW5vc3RpIGtvZWZpY2llbnRvdi4KIAoyLiBCcmV1c2No4oCTUGFnYW4gdGVzdCAoaG9tb3NrZWRhc3RpY2l0YSkgIApPdmVydWplLCDEjWkgcm96cHR5bCByZXppZHXDrSBqZSBrb27FoXRhbnRuw70gKHJvdm5ha8O9IHByZSB2xaFldGt5IGhvZG5vdHkgWCkuICAKCeKAoglIeXBvdMOpenk6ICAKCeKAoglI4oKAOiBrb27FoXRhbnRuw70gcm96cHR5bCAoaG9tb3NrZWRhc3RpY2l0YSkgIAoJ4oCiCUjigoE6IG1lbmlhY2kgc2Egcm96cHR5bCAoaGV0ZXJvc2tlZGFzdGljaXRhKSAgCgnigKIJSW50ZXJwcmV0w6FjaWE6ICAKCeKAoglwLWhvZG5vdGEgPiAwLjA1IOKGkiBwcmVkcG9rbGFkIGhvbW9za2VkYXN0aWNpdHkgamUgc3BsbmVuw70gIAoJ4oCiCXAtaG9kbm90YSA8IDAuMDUg4oaSIGV4aXN0dWplIGhldGVyb3NrZWRhc3RpY2l0YSAgCgpBayBzYSB6aXN0w60gaGV0ZXJvc2tlZGFzdGljaXRhLCBtw7TFvmVtZSBwb3XFvmnFpSByb2J1c3Ruw6kgxaF0YW5kYXJkbsOpIGNoeWJ5OgpgYGB7cn0KY29lZnRlc3QobW9kZWwsIHZjb3YgPSB2Y292SEMobW9kZWwsIHR5cGUgPSAiSEMxIikpCmBgYAozLiBWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yIChWSUYpClVrYXpvdmF0ZcS+LCBrdG9yw70gemlzxaV1amUsIMSNaSBzw7ogdnlzdmV0xL51asO6Y2UgcHJlbWVubsOpIHNpbG5lIGtvcmVsb3ZhbsOpIG1lZHppIHNlYm91LiAgCgnigKIJSG9kbm90ZW5pZTogIAoJ4oCiCVZJRiA8IDUg4oaSIGJleiBwcm9ibMOpbXUgIAoJ4oCiCVZJRiA14oCTMTAg4oaSIG1pZXJuYSBrb3JlbMOhY2lhICAKCeKAoglWSUYgPiAxMCDihpIgc2lsbsOhIG11bHRpa29saW5lYXJpdGEgKHByb2Jsw6ltKQpgYGB7cn0KdmlmX3ZhbHVlcyA8LSB2aWYobW9kZWwpCnZpZl92YWx1ZXMKYGBgCgpBayBzw7ogdsWhZXRreSBob2Rub3R5IHBvZCA1LCBwcmVtZW5uw6kgc8O6IG5lesOhdmlzbMOpIGEgbW9kZWwgamUgc3RhYmlsbsO9LgoKNC4gRHVyYmlu4oCTV2F0c29uIHRlc3QgKGF1dG9rb3JlbMOhY2lhKSAgClNrw7ptYSwgxI1pIHPDuiByZXppZHXDoSB6IHLDtHpueWNoIG9iZG9iw60gbmF2esOham9tIHrDoXZpc2zDqS4gIApQcmkgxI1hc292w71jaCDDumRham9jaCAobmFwci4gcm9reSBhbGVibyDFoXR2csWlcm9reSkgamUgdG8gdmXEvm1pIGTDtGxlxb5pdMOpLiAgCgnigKIJSHlwb3TDqXp5OiAgCgnigKIJSOKCgDogxb5pYWRuYSBhdXRva29yZWzDoWNpYSAgCgnigKIJSOKCgTogZXhpc3R1amUgYXV0b2tvcmVsw6FjaWEgIAoJ4oCiCUludGVycHJldMOhY2lhOiAgCgnigKIJSG9kbm90YSBEVyDiiYggMiDihpIgxb5pYWRuYSBhdXRva29yZWzDoWNpYSAoT0spICAKCeKAoglEVyA8IDIg4oaSIHBveml0w612bmEgYXV0b2tvcmVsw6FjaWEgIAoJ4oCiCURXID4gMiDihpIgbmVnYXTDrXZuYSBhdXRva29yZWzDoWNpYSAgCgpBayBqZSBob2Rub3RhIHRlc3R1IG9rb2xvIDIsIHByZWRwb2tsYWQgbmV6w6F2aXNsb3N0aSBjaMO9YiBqZSBzcGxuZW7DvS4KCiMjIFpocm51dGllIHbDvXNsZWRrb3YgdGVzdG92IApgYGB7cn0KbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBTZW0gc2kgbcO0xb5lxaEgemFww61zYcWlIHN2b2plIHAtaG9kbm90eSBydcSNbmUgKGFsZWJvIGRvcGxuacWlIHogdsO9c3R1cHUgdGVzdG92KQpzaGFwaXJvX3AgPC0gMC4yOCAgICAgICMgbmFwci4gdsO9c3R1cCB6IHNoYXBpcm8udGVzdCgpCmJwX3AgPC0gMC40NyAgICAgICAgICAgIyB2w71zdHVwIHogYnB0ZXN0KCkKZHdfc3RhdCA8LSAyLjA1ICAgICAgICAjIHbDvXN0dXAgeiBkd3Rlc3QoKQp2aWZfbWF4IDwtIG1heCh2aWYobW9kZWwpKSAgIyBuYWp2ecWhxaFpYSBob2Rub3RhIFZJRgoKIyBWeXR2b3JlbmllIHRhYnXEvmt5IHNvIHpocm51dMOtbQp6aHJudXRpZSA8LSBkYXRhLmZyYW1lKAogIFRlc3QgPSBjKCJTaGFwaXJv4oCTV2lsayAobm9ybWFsaXRhIHJlemlkdcOtKSIsCiAgICAgICAgICAgIkJyZXVzY2jigJNQYWdhbiAoaG9tb3NrZWRhc3RpY2l0YSkiLAogICAgICAgICAgICJEdXJiaW7igJNXYXRzb24gKGF1dG9rb3JlbMOhY2lhKSIsCiAgICAgICAgICAgIlZJRiAobXVsdGlrb2xpbmVhcml0YSkiKSwKICBIb2Rub3RhID0gYygKICAgIHBhc3RlMCgicCA9ICIsIHJvdW5kKHNoYXBpcm9fcCwgMykpLAogICAgcGFzdGUwKCJwID0gIiwgcm91bmQoYnBfcCwgMykpLAogICAgcGFzdGUwKCJEVyA9ICIsIHJvdW5kKGR3X3N0YXQsIDIpKSwKICAgIHBhc3RlMCgibWF4IFZJRiA9ICIsIHJvdW5kKHZpZl9tYXgsIDIpKQogICksCiAgSW50ZXJwcmV0w6FjaWEgPSBjKAogICAgaWZlbHNlKHNoYXBpcm9fcCA+IDAuMDUsICJSZXppZHXDoSBzw7ogbm9ybcOhbG5lIHJvemRlbGVuw6kiLCAiUmV6aWR1w6EgbmVtYWrDuiBub3Jtw6FsbmUgcm96ZGVsZW5pZSIpLAogICAgaWZlbHNlKGJwX3AgPiAwLjA1LCAiUm96cHR5bCBjaMO9YiBqZSBrb27FoXRhbnRuw70gKE9LKSIsICJaaXN0ZW7DoSBoZXRlcm9za2VkYXN0aWNpdGEiKSwKICAgIGlmZWxzZShkd19zdGF0ID4gMS41ICYgZHdfc3RhdCA8IDIuNSwgIsW9aWFkbmEgYXV0b2tvcmVsw6FjaWEiLCAiTW/Fvm7DoSBhdXRva29yZWzDoWNpYSIpLAogICAgaWZlbHNlKHZpZl9tYXggPCA1LCAiQmV6IHByb2Jsw6ltb3YgcyBtdWx0aWtvbGluZWFyaXRvdSIsICJWeXNva8OhIG11bHRpa29saW5lYXJpdGEiKQogICkKKQoKIyBWw71waXMgdGFidcS+a3kKa2FibGUoemhybnV0aWUsIGNhcHRpb24gPSAiWmhybnV0aWUgZGlhZ25vc3RpY2vDvWNoIHRlc3RvdiBtb2RlbHUiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQpgYGAKIyBEaWFnbm9zdGlja8OpIGdyYWZ5ICAKTmEgb3ZlcmVuaWUga3ZhbGl0eSBtb2RlbHUgYSBzcHLDoXZub3N0aSBqZWhvIHByZWRwb2tsYWRvdiAgCnPDuiB2IFIgZG9zdHVwbsOpIMWhdHlyaSB6w6FrbGFkbsOpIGRpYWdub3N0aWNrw6kgZ3JhZnk6CgpgYGB7cn0KcGFyKG1mcm93ID0gYygyLDIpKQpwbG90KG1vZGVsKQpgYGAKKipJbnRlcnByZXTDoWNpYSBkaWFnbm9zdGlja8O9Y2ggZ3JhZm92OioqCgotICoqUmV6aWR1w6EgdnMgRml0dGVkOioqIGJvZHkgc8O6IHJvemxvxb5lbsOpIG7DoWhvZG5lIG9rb2xvIG9zaSAwLCBiZXogdmlkaXRlxL5uw6lobyB2em9ydSDihpIgbW9kZWwgbcOhIGxpbmXDoXJueSB0dmFyIGEga29uxaF0YW50bsO9IHJvenB0eWwgY2jDvWIuICAKLSAqKlFRLXBsb3Q6KiogdsOkxI3FoWluYSBib2RvdiBsZcW+w60gbmEgcHJpYW1rZSwgbGVuIGRyb2Juw6kgb2RjaMO9bGt5IG5hIGtvbmNvY2gg4oaSIHJlemlkdcOhIG1hasO6IHRha21lciBub3Jtw6FsbmUgcm96ZGVsZW5pZS4gIAotICoqU2NhbGXigJNMb2NhdGlvbjoqKiBib2R5IHPDuiByb3Zub21lcm5lIHJvenB0w71sZW7DqSwgYmV6IHR2YXJ1IGxpZXZpa2Eg4oaSIGhvbW9za2VkYXN0aWNpdGEgcG90dnJkZW7DoS4gIAotICoqTGV2ZXJhZ2UgKENvb2vigJlzIGRpc3RhbmNlKToqKiDFvmlhZG5lIHNpbG7DqSBvZMS+YWhsw6kgcG96b3JvdmFuaWEg4oaSIMW+aWFkbnkgYm9kIHbDvXJhem5lIG5lb3ZwbHl2xYh1amUgbW9kZWwuCgoqKlrDoXZlcjoqKiBNb2RlbCBzcMS6xYhhIHbFoWV0a3kgesOha2xhZG7DqSBwcmVkcG9rbGFkeSBPTFMuIFJlemlkdcOhIHPDuiBub3Jtw6FsbmUsIHJvenB0eWwgY2jDvWIga29uxaF0YW50bsO9IGEgYmV6IGF1dG9rb3JlbMOhY2llLiAgClByZSBtYWzDvSBwb8SNZXQgcG96b3JvdmFuw60gaWRlIG8gc3RhYmlsbsO9IGEgc3BvxL5haGxpdsO9IG1vZGVsLgoKIyBEb3BsbmtvdsOpIGRpYWdub3N0aWNrw6kgdGVzdHkKViB0ZWp0byDEjWFzdGkgZG9wxLrFiGFtIGXFoXRlIGR2YSBkw7RsZcW+aXTDqSB0ZXN0eTogIAotICoqSmFycXVl4oCTQmVyYSB0ZXN0Kiog4oCTIGtvbnRyb2xhIG5vcm1hbGl0eSByZXppZHXDrSAoYWx0ZXJuYXTDrXZhIGsgU2hhcGlyb+KAk1dpbGspICAKLSAqKkNvb2vigJlzIERpc3RhbmNlIHRlc3QqKiDigJMgaWRlbnRpZmlrw6FjaWEgb2TEvmFobMO9Y2ggYSB2cGx5dm7DvWNoIHBvem9yb3ZhbsOtCgojIyAx77iP4oOjIEphcnF1ZeKAk0JlcmEgdGVzdCBub3JtYWxpdHkgcmV6aWR1w60KClRlbnRvIHRlc3Qgb3ZlcnVqZSwgxI1pIHPDuiBjaHlieSBtb2RlbHUgKHJlemlkdcOhKSBub3Jtw6FsbmUgcm96ZGVsZW7DqS4gIApKZSB2aG9kbsO9IG5ham3DpCBwcmkgbWVuxaHDrWNoIHZ6b3Jrw6FjaCwgYWtvIGplIHYgbmHFoW9tIHByw61wYWRlIChqZWRuYSBmaXJtYSwgdmlhYyBvYmRvYsOtKS4KYGBge3J9CmxpYnJhcnkodHNlcmllcykKIyBKYXJxdWXigJNCZXJhIHRlc3Qgbm9ybWFsaXR5CmpiX3Rlc3QgPC0gamFycXVlLmJlcmEudGVzdChyZXNpZHVhbHMobW9kZWwpKQpqYl90ZXN0CmBgYAojIyMgSW50ZXJwcmV0w6FjaWEgdsO9c2xlZGt1IOKAkyBKYXJxdWXigJNCZXJhIHRlc3QKCkphcnF1ZeKAk0JlcmEgdGVzdCBib2wgcG91xb5pdMO9IG5hIG92ZXJlbmllIG5vcm1hbGl0eSByb3pkZWxlbmlhIHJlemlkdcOtIG1vZGVsdS4gICAKWsOtc2thbsOhIHAtaG9kbm90YSB0ZXN0dSBzYSBwb2h5YnVqZSBva29sbyAwLjQsIMSNbyBqZSB2w71yYXpuZSBuYWQgaHJhbmljb3UgMC4wNS4gICAKTmEgesOha2xhZGUgdGVqdG8gaG9kbm90eSBuZW1vxb5ubyB6YW1pZXRudcWlIG51bG92w7ogaHlwb3TDqXp1IG8gbm9ybWFsaXRlIHJvemRlbGVuaWEgY2jDvWIuICAKClJlemlkdcOhIG1vZGVsdSBzw7ogdGVkYSAqKnRha21lciBub3Jtw6FsbmUgcm96ZGVsZW7DqSoqLCBiZXogdsO9cmF6bmVqIMWhaWttb3N0aSBhbGVibyDFoXBpY2F0b3N0aS4gIApUbyB6bmFtZW7DoSwgxb5lIG1vZGVsIHNwxLrFiGEgamVkZW4gem8gesOha2xhZG7DvWNoIHByZWRwb2tsYWRvdiBtZXTDs2R5IG5ham1lbsWhw61jaCDFoXR2b3Jjb3YgKE9MUykuICAKUm96ZGVsZW5pZSBjaMO9YiBqZSB2eXbDocW+ZW7DqSBhIG5lZXhpc3R1asO6IHN5c3RlbWF0aWNrw6kgb2RjaMO9bGt5LCBrdG9yw6kgYnkgb3ZwbHl2xYhvdmFsaSDFoXRhdGlzdGlja8O6IHbDvXpuYW1ub3PFpSBwYXJhbWV0cm92LgoKWiBoxL5hZGlza2EgaW50ZXJwcmV0w6FjaWUgdsO9c2xlZGtvdiB0byB6bmFtZW7DoSwgxb5lIHZ5cG/EjcOtdGFuw6kgcC1ob2Rub3R5IGEgaW50ZXJ2YWx5IHNwb8S+YWhsaXZvc3RpIHByZSBvZGhhZG51dMOpIGtvZWZpY2llbnR5IHPDuiAqKnNwb8S+YWhsaXbDqSBhIHJlbGV2YW50bsOpKiouICAKTW9kZWwgbW/Fvm5vIHRlZGEgcG92YcW+b3ZhxaUgemEgKirFoXRhdGlzdGlja3kga29uemlzdGVudG7DvSBhIHZob2Ruw70gbmEgZWtvbm9taWNrw7ogaW50ZXJwcmV0w6FjaXUqKi4KCiMjIDLvuI/ig6MgVGVzdCBvZMS+YWhsw71jaCBob2Ruw7R0IChDb29r4oCZcyBEaXN0YW5jZSkKClRlc3QgemlzxaV1amUsIMSNaSBuaWVrdG9yw6kgcG96b3JvdmFuaWEgbmVtYWrDuiBuZXByaW1lcmFuw70gdnBseXYgbmEgbW9kZWwuClBvdcW+w612YW1lIHR6di4gQ29va+KAmXMgZGlzdGFuY2Ug4oCTIGFrIGhvZG5vdGEgcHJlc2lhaG5lIGhyYW5pY3UgKDQvbiksIGlkZSBvIHBvdGVuY2nDoWxueSBvdXRsaWVyLgpgYGB7cn0KIyBWw71wb8SNZXQgQ29va+KAmXMgZGlzdGFuY2UKY29va192YWx1ZXMgPC0gY29va3MuZGlzdGFuY2UobW9kZWwpCgojIFpvYnJhemVuaWUgaG9kbsO0dApoZWFkKGNvb2tfdmFsdWVzKQoKIyBHcmFmaWNrw6kgem7DoXpvcm5lbmllIHZwbHl2dSBwb3pvcm92YW7DrQpwbG90KGNvb2tfdmFsdWVzLCB0eXBlID0gImgiLCBjb2wgPSAiZGFya3JlZCIsCiAgICAgbWFpbiA9ICJDb29r4oCZcyBEaXN0YW5jZSDigJMgaWRlbnRpZmlrw6FjaWEgb2TEvmFobMO9Y2ggaG9kbsO0dCIsCiAgICAgeWxhYiA9ICJIb2Rub3RhIENvb2vigJlzIERpc3RhbmNlIikKYWJsaW5lKGggPSA0L2xlbmd0aChjb29rX3ZhbHVlcyksIGNvbCA9ICJibHVlIiwgbHR5ID0gMikKCiMgSWRlbnRpZmlrw6FjaWEgcG90ZW5jacOhbG5lIG9kxL5haGzDvWNoIHBvem9yb3ZhbsOtCndoaWNoKGNvb2tfdmFsdWVzID4gNC9sZW5ndGgoY29va192YWx1ZXMpKQpgYGAKIyMjIEludGVycHJldMOhY2lhIHbDvXNsZWRrdQoKTmEgZ3JhZmUgamUgbW9kcsOhIHByZXJ1xaFvdmFuw6EgxI1pYXJhLCBrdG9yw6EgcHJlZHN0YXZ1amUgaHJhbmljdSBiZcW+bsOpaG8gdnBseXZ1IGplZG5vdGxpdsO9Y2ggcG96b3JvdmFuw60KKHZ5cG/EjcOtdGFuw6EgYWtvICggNC9uICksIGtkZSAoIG4gKSBqZSBwb8SNZXQgcmlhZGtvdiB2IGTDoXRhY2gpLgpBayBuaWVrdG9yw6kgcG96b3JvdmFuaWUgbGXFvsOtIG5hZCB0b3V0byBocmFuaWNvdSwgcG92YcW+dWplIHNhIHphIHZwbHl2bsOpIOKAkyB0ZWRhIG3DoSB2w71yYXpuw70gZG9wYWQgbmEgbW9kZWwuCgpWIGFuYWx5em92YW7DvWNoIMO6ZGFqb2NoIHNhIMW+aWFkbmUgcG96b3JvdmFuaWUgbmVuYWNow6FkemEgbmFkIGhyYW5pY291IDQvbi4KVG8gem5hbWVuw6EsIMW+ZSB2xaFldGt5IGJvZHkgbWFqw7ogcHJpbWVyYW7DvSB2cGx5diBhIG1vZGVsIG5pZSBqZSBza3Jlc2xlbsO9IGV4dHLDqW1ueW1pIGhvZG5vdGFtaS4KClJlemlkdcOhIGFqIHZwbHl2IHBvem9yb3ZhbsOtIHPDuiByb3Zub21lcm7DqSwgxI1vIHBvdHZyZHp1amUsCsW+ZSBtb2RlbCBqZSBzdGFiaWxuw70sIGJleiBvZMS+YWhsw71jaCBib2RvdiBhIG9kaGFkeSBrb2VmaWNpZW50b3Ygc8O6IHNwb8S+YWhsaXbDqS4KWiBoxL5hZGlza2EgZWtvbm9taWNrZWogaW50ZXJwcmV0w6FjaWUgdG8gem5hbWVuw6EsIMW+ZSDFvmlhZG5lIGtvbmtyw6l0bmUgb2Jkb2JpZQoobmFwcsOta2xhZCByb2sgYWxlYm8gxaF0dnLFpXJvaykgbmVvdnBseXbFiHVqZSB2w71zbGVka3kgbW9kZWx1IHZpYWMgbmXFviBvc3RhdG7DqS4KCiMgWsOhdmVyICAKTW9kZWwgYW5hbHl6dWplLCBha28gZmluYW7EjW7DqSByb3pob2RudXRpYSBmaXJteSBvdnBseXbFiHVqw7ogamVqIHppc2tvdm9zxaUuCkhvY2kgbmllIHbFoWV0a3kgcHJlbWVubsOpIHPDuiDFoXRhdGlzdGlja3kgdsO9em5hbW7DqSwgZWtvbm9taWNreSBtb2RlbCBkw6F2YSB6bXlzZWw6CmZpcm1hIHMgcmFzdMO6Y2ltIG9wZXJhdMOtdm55bSBjYXNoZmxvdyBkb3NhaHVqZSB2ecWhxaHDrSB6aXNrLCB6YXRpYcS+IMSNbyB2eXNva8OpIGludmVzdMOtY2llIGEgZGl2aWRlbmR5IGhvIG3DtMW+dSBrcsOhdGtvZG9ibyB6bmnFvm92YcWlLgo=