knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE
)

Import údajov

Na začiatok si importujeme údaje. Vybrala som si dáta o cene akcií spoločnosti Apple a ETF’s, ktoré opisujú vývoj trhu zlata (GLD), energetického sektora (XLE) a (SPY), ktoré kopíruje trh S&P 500. Dáta sú za obdobie 1.1.2024-1.1.2025. Údaje sú stiahnuté priamo z internetu, z databázy YahooFinance. Tieto hodnoty predstavujú vývoj cien, na ktorom budeme následne analyzovať výnosy, riziko a vzájomné vzťahy medzi aktívami.

# install.packages("quantmod")

library(quantmod)

tickers <- c("AAPL", "GLD", "XLE", "SPY")   # Apple, Gold ETF, Energy ETF, S&P500 ETF
getSymbols(tickers, from = "2024-01-01", to = "2025-01-01")
[1] "AAPL" "GLD"  "XLE"  "SPY" 
# Zlúčenie Close cien

data <- merge(Cl(AAPL), Cl(GLD), Cl(XLE), Cl(SPY))
colnames(data) <- tickers

head(data)
             AAPL    GLD   XLE    SPY
2024-01-02 185.64 190.72 84.74 472.65
2024-01-03 184.25 189.13 86.12 468.79
2024-01-04 181.91 189.32 84.61 467.28
2024-01-05 181.18 189.35 84.68 467.92
2024-01-08 185.56 187.87 83.70 474.60
2024-01-09 185.14 187.93 82.36 473.88
colnames(data)
[1] "AAPL" "GLD"  "XLE"  "SPY" 

Na tejto tabuľke môžeme vidieť vývoj prvých piatich obchodných dní pre vybrané aktíva, o ktorých dáta sme si uložili do jedného datasetu.

Grafy

Vizualizácia vývoja

Vytvoríme si graf, ktorý nám popisuje vývoj cien jednotlivých akcií za posledný rok. Pomocou tohto grafu si vieme graficky porovnať ich cenu.

library(ggplot2)
library(dplyr)
library(tidyr)

# transformácia dát pre ggplot

data_df <- data.frame(Date = index(data), coredata(data)) %>%
pivot_longer(-Date, names_to = "Ticker", values_to = "Price")

ggplot(data_df, aes(x = Date, y = Price, color = Ticker)) +
geom_line(size = 1) +
theme_minimal() +
labs(title = "Vývoj cien akcií a ETF (2024–2025)",
x = "Dátum",
y = "Cena (USD)",
color = "Ticker")

Vidíme, že SPY (modrá línia) má najvyššiu a najstabilnejšiu cenu, zatiaľ čo XLE (fialová) zostáva na najnižšej úrovni. AAPL a GLD vykazujú podobný rastový trend, hoci so zreteľnými krátkodobými výkyvmi.

Boxplot denných výnosov

Z vývoja cien vypočítame logaritmické denné výnosy, ktoré lepšie vystihujú percentuálne zmeny. Na tieto výnosy vytvoríme boxplot, ktorý ukáže ich rozloženie, rozsah a prítomnosť extrémov (outliers).

returns <- diff(log(data))
returns_df <- data.frame(Date = index(returns), coredata(returns)) %>%
pivot_longer(-Date, names_to = "Ticker", values_to = "Return")

ggplot(returns_df, aes(x = Ticker, y = Return, fill = Ticker)) +
geom_boxplot() +
theme_minimal() +
labs(title = "Rozdelenie denných výnosov", x = "Ticker", y = "Log výnos")

Boxplot znázorňuje rozdelenie denných logaritmických výnosov jednotlivých aktív. Vidíme, že AAPL vykazuje najväčšiu variabilitu výnosov (teda vyššie riziko), zatiaľ čo SPY má najstabilnejšie rozdelenie s menším počtom extrémnych hodnôt.
## Základné štatistiky Vytvoríme si tabuľku, ktorá zobrazuje základné štatistiky denných logaritmických výnosov štyroch aktív.

library(dplyr)
library(knitr)

# Summarise basic statistics by ticker

stats <- returns_df %>%
group_by(Ticker) %>%
summarise(
n      = n(),
mean   = mean(Return, na.rm = TRUE),
sd     = sd(Return, na.rm = TRUE),
min    = min(Return, na.rm = TRUE),
q25    = quantile(Return, 0.25, na.rm = TRUE),
median = median(Return, na.rm = TRUE),
q75    = quantile(Return, 0.75, na.rm = TRUE),
max    = max(Return, na.rm = TRUE),
.groups = "drop"
)

kable(stats, digits = 5, caption = "Základné štatistiky denných výnosov")
Základné štatistiky denných výnosov
Ticker n mean sd min q25 median q75 max
AAPL 252 0.00119 0.01406 -0.04937 -0.00674 0.00160 0.00929 0.07013
GLD 252 0.00095 0.00949 -0.03634 -0.00426 0.00160 0.00734 0.02214
SPY 252 0.00086 0.00794 -0.03026 -0.00300 0.00109 0.00576 0.02456
XLE 252 0.00004 0.01119 -0.03276 -0.00637 0.00154 0.00679 0.03691
NA

Premenná n znamená počet pozorovaní, teda počet obchodných dní, za ktoré boli výnosy vypočítané. Všetky aktíva majú rovnaký počet – 251 dní, čo zodpovedá približne jednému obchodnému roku. Stĺpec mean predstavuje priemerný denný výnos. Najvyšší priemerný výnos dosiahla AAPL (0.00119), teda približne 0,12 % denne, nasleduje GLD (0.00095) a SPY (0.00086). Najnižší priemerný výnos má XLE (0.00004), teda len 0,004 % denne, čo znamená, že jeho cena v priemere takmer nerástla. Premenná sd udáva smerodajnú odchýlku výnosov, teda ich volatilitu. Najvyššiu kolísavosť má AAPL (0.01406), čo znamená, že jej denné výnosy sa pohybovali približne ±1,4 % okolo priemeru. Naopak, SPY (0.00794) a GLD (0.00949) majú nižšiu volatilitu, teda stabilnejší vývoj cien. Hodnota min vyjadruje najväčší jednodenný pokles ceny. Najvýraznejší zaznamenala AAPL (-0.04937), teda pokles o približne –4,9 %, zatiaľ čo najmenší pokles mala SPY (-0.03026). Kvartil q25 (25. percentil) ukazuje, že v 25 % dní boli výnosy nižšie ako napríklad –0.00674 pri AAPL, čo zodpovedá poklesu o –0,67 %. Hodnota median predstavuje stredný výnos – polovica dní mala vyšší a polovica nižší výnos. Všetky aktíva majú medián blízky nule (okolo 0.001–0.0016), čo naznačuje vyvážený počet rastových a poklesových dní. Kvartil q75 (75. percentil) vyjadruje hranicu, pod ktorou sa nachádza 75 % výnosov – napríklad 0.00929 pre AAPL, teda približne 0,93 % denný rast. Nakoniec, max vyjadruje najvyšší denný výnos. Najväčší jednodenný rast zaznamenala AAPL (0.07013), teda približne +7 % za deň, čo potvrdzuje jej vysokú volatilitu. Najnižší maximálny rast mala GLD (0.02214), čo zodpovedá približne +2,2 % za deň a svedčí o stabilnejšom vývoji zlata.

Testovanie hypotéz

t-test: Porovnanie priemerného výnosu AAPL a SPY.

Pomocou t-testu si porovnáme priemerné výnosy akcie apple a SPY.

t.test.result <- suppressWarnings(t.test(returns$AAPL, returns$GLD))
print(t.test.result)

    Welch Two Sample t-test

data:  returns$AAPL and returns$GLD
t = 0.22567, df = 438.59, p-value = 0.8216
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.001863178  0.002346539
sample estimates:
   mean of x    mean of y 
0.0011925506 0.0009508701 

Výsledok t-testu porovnáva priemerné denné výnosy akcie AAPL a indexového fondu SPY. Testovacia štatistika má hodnotu t = 0.32913 a p-hodnota = 0.7422, čo je výrazne viac než 0.05. To znamená, že nie je štatisticky významný rozdiel medzi priemernými výnosmi týchto dvoch aktív. Priemerný denný výnos AAPL je 0.00119 (≈ 0,12 %) a SPY 0.00086 (≈ 0,086 %), pričom 95 % konfidenčný interval pre rozdiel medzi nimi obsahuje nulu (–0.00167 ; 0.00234). Záverom možno povedať, že výnosy Apple sa štatisticky nelíšia od výnosov celkového trhu reprezentovaného indexom S&P 500.

ANOVA: Porovnanie výnosov medzi všetkými aktívami

Pomocou anovy porovnáme výnosy všetkých aktív.

anova.result <- aov(Return ~ Ticker, data = returns_df)
summary(anova.result)
              Df  Sum Sq   Mean Sq F value Pr(>F)
Ticker         3 0.00019 0.0000625   0.525  0.665
Residuals   1000 0.11908 0.0001191               
4 observations deleted due to missingness

Testovacia štatistika má hodnotu F = 0.525 a p-hodnota = 0.665. Keďže p-hodnota je výrazne vyššia ako 0.05, nezamietame nulovú hypotézu, že všetky aktíva majú rovnaký priemerný výnos. Inými slovami, medzi priemernými dennými výnosmi týchto štyroch trhov nie je štatisticky významný rozdiel – ich výkonnosť bola v sledovanom období veľmi podobná.

Lineárna regresia: Predikcia výnosu AAPL.

Cieľom regresie je zistiť, či možno vysvetliť denné výnosy akcie AAPL pomocou výnosov trhu GLD, XLE a SPY (S&P 500).

model <- lm(AAPL ~ GLD + XLE + SPY, data = returns)
summary(model)

Call:
lm(formula = AAPL ~ GLD + XLE + SPY, data = returns)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.044288 -0.006673 -0.000362  0.005717  0.066928 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.0003073  0.0007477   0.411   0.6814    
GLD          0.0028525  0.0818840   0.035   0.9722    
XLE         -0.1950403  0.0705065  -2.766   0.0061 ** 
SPY          1.0396059  0.1007431  10.319   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01173 on 247 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.3122,    Adjusted R-squared:  0.3038 
F-statistic: 37.37 on 3 and 247 DF,  p-value: < 2.2e-16
library(broom)
library(stringr)

coef.tbl <- tidy(model, conf.int = TRUE) %>%
mutate(
term = recode(term,
"(Intercept)" = "Intercept",
"GLD" = "GLD (Zlato)",
"XLE" = "XLE (Energetika)",
"SPY" = "SPY (S&P500 Index)"
),
stars = case_when(
p.value < 0.001 ~ "***",
p.value < 0.01  ~ "**",
p.value < 0.05  ~ "*",
p.value < 0.1   ~ "·",
TRUE            ~ ""
)
) %>%
transmute(
Premenná = term,
Odhad = estimate,
`Štandardná chyba` = std.error,
`t-hodnota` = statistic,
`p-hodnota` = p.value,
`95% CI` = str_c("[", round(conf.low, 5), ", ", round(conf.high, 5), "]"),
Sig = stars
)

coef.tbl %>%
kable(digits = 5, caption = "Regresný model: Výnos AAPL ~ GLD + XLE + SPY") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(1, bold = TRUE) %>%
row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
footnote(general = "Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.", threeparttable = TRUE)
Regresný model: Výnos AAPL ~ GLD + XLE + SPY
Premenná Odhad Štandardná chyba t-hodnota p-hodnota 95% CI Sig
Intercept 0.00031 0.00075 0.41100 0.68143 [-0.00117, 0.00178]
GLD (Zlato) 0.00285 0.08188 0.03484 0.97224 [-0.15843, 0.16413]
XLE (Energetika) -0.19504 0.07051 -2.76627 0.00610 [-0.33391, -0.05617] **
SPY (S&P500 Index) 1.03961 0.10074 10.31938 0.00000 [0.84118, 1.23803] ***
Note:
Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.
NA
NA

Konštanta (Intercept) je veľmi malá a štatisticky nevýznamná (p = 0.68), čo znamená, že pri nulových výnosoch ostatných aktív by očakávaný výnos AAPL prakticky nebol odlišný od nuly. Premenná GLD (Zlato) má takisto nevýznamný vplyv (p = 0.97), takže zmeny cien zlata nemajú merateľný efekt na výnos Apple. Naopak, XLE (Energetika) má negatívny a štatisticky významný koeficient (β = –0.19504, p = 0.006), čo naznačuje, že ak výnos energetického sektora rastie, výnos Apple má tendenciu k miernemu poklesu. Najsilnejší a vysoko významný vplyv má SPY (S&P 500 Index) s koeficientom β = 1.03961 a veľmi nízkou p-hodnotou (p < 0.001). To znamená, že výnos Apple je úzko spätý s vývojom celkového trhu — keď index S&P 500 stúpne o 1 %, výnos Apple sa v priemere zvýši približne o 1,04 %. Celkovo teda model ukazuje, že výnos Apple najviac kopíruje trhový index SPY, zatiaľ čo zlato nemá žiadny vplyv a energetický sektor má mierny negatívny vzťah.

fit.tbl <- glance(model) %>%
transmute(
`R-squared` = r.squared,
`Adj. R-squared` = adj.r.squared,
`F-statistic` = statistic,
`F p-value` = p.value,
`AIC` = AIC,
`BIC` = BIC,
`Num. obs.` = nobs
)

fit.tbl %>%
kable(digits = 3, caption = "Model Fit Statistics") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("condensed"))
Model Fit Statistics
R-squared Adj. R-squared F-statistic F p-value AIC BIC Num. obs.
0.312 0.304 37.369 0 -1513.21 -1495.582 251
NA

Hodnota R-squared = 0.312 znamená, že približne 31,2 % variability denných výnosov Apple (AAPL) je vysvetlených zmenami vo výnosoch ETF fondov GLD, XLE a SPY. Adjusted R-squared = 0.304 upravuje túto hodnotu o počet premenných a pozorovaní, pričom potvrdzuje, že model má stále solídnu vysvetľovaciu schopnosť. F-statistic = 37.369 s p-hodnotou = 0 ukazuje, že model ako celok je štatisticky významný – teda aspoň jedna z vysvetľujúcich premenných významne ovplyvňuje výnos Apple. Ukazovatele AIC (-1513.21) a BIC (-1495.582) sú informačné kritériá používané pri porovnávaní modelov – nižšie hodnoty naznačujú lepšie prispôsobenie. Celkovo možno povedať, že model s 251 pozorovaniami poskytuje stredne silné, ale štatisticky významné vysvetlenie výnosov Apple.

Vizualizácia výnosov

library(PerformanceAnalytics)
chart.TimeSeries(returns, legend.loc = "bottomleft", main = "Denné logaritmické výnosy")

chart.Boxplot(returns, main = "Rozdelenie výnosov podľa aktíva")

chart.Correlation(returns, histogram = TRUE, pch = 19)

Čiarový graf

Čiarový graf zobrazuje denné logaritmické výnosy štyroch aktív – AAPL, GLD, XLE a SPY – v období od januára do decembra 2024. Vidieť, že všetky série oscilujú okolo nuly, čo znamená, že väčšina denných zmien bola malá, s približne rovnakým počtom rastových a klesajúcich dní. Najvýraznejšie výkyvy má AAPL (čierna línia), čo potvrdzuje jeho vyššiu volatilitu, zatiaľ čo SPY (modrá línia) vykazuje najstabilnejší priebeh. Zlato (GLD, červená línia) a energetický sektor (XLE, zelená línia) sa pohybujú podobne, ale s občasnými prudšími výkyvmi, ktoré odrážajú reakcie na špecifické trhové udalosti.

Boxplot

Boxplot zobrazuje rozdelenie denných výnosov jednotlivých aktív – AAPL, GLD, SPY a XLE – počas sledovaného obdobia. Všetky výnosy sú sústredené okolo nuly, čo znamená, že väčšina denných zmien bola malá. Najväčší rozptyl (teda volatilitu) má AAPL, čo naznačuje vyššie riziko aj potenciál zisku. SPY má naopak najmenšie rozpätie výnosov, čo zodpovedá jeho charakteru diverzifikovaného trhového indexu. Aktíva GLD (zlato) a XLE (energetika) majú miernu volatilitu a niekoľko extrémnych hodnôt (outlierov), ktoré predstavujú neobvyklé denné pohyby spôsobené trhovými udalosťami.

Korelačná matica s rozdelením

Graf zobrazuje korelačnú maticu denných výnosov štyroch aktív – AAPL, GLD, XLE a SPY – spolu s ich rozdelením a vzájomnými závislosťami. Na diagonále sú histogramy, ktoré ukazujú rozdelenie výnosov jednotlivých aktív – všetky majú približne normálne rozdelenie s vrcholom v blízkosti nuly. Pod diagonálou sú bodové grafy (scatterploty) zobrazujúce vzťah medzi dvojicami aktív. Nad diagonálou sú uvedené korelačné koeficienty, pričom hviezdičky označujú štatistickú významnosť. Najsilnejšiu koreláciu má dvojica AAPL – SPY (0.54), čo potvrdzuje, že výnosy Apple sa najviac pohybujú v súlade s celkovým trhom. Ostatné vzťahy sú slabšie: XLE – SPY (0.31) a GLD – SPY (0.27), čo naznačuje, že zlato a energetický sektor sa síce čiastočne hýbu s trhom, ale menej konzistentne. Korelácie medzi GLD a ostatnými aktívami sú veľmi nízke, čo zodpovedá jeho úlohe defenzívneho aktíva.

Heatmap

Tento graf predstavuje heatmapu korelačnej matice denných výnosov aktív AAPL, GLD, XLE a SPY. Farba jednotlivých polí vyjadruje silu a smer korelácie – červené odtiene znamenajú kladnú koreláciu (spoločný pohyb cien), zatiaľ čo modré by predstavovali zápornú (opačný pohyb).

# Korelačná matica a heatmapa

library(ggplot2)
library(reshape2)

# výpočet korelačnej matice

corr_matrix <- cor(returns, use = "complete.obs")

# premena na dlhý formát pre ggplot

corr_melt <- melt(corr_matrix)

# heatmap vizualizácia

ggplot(data = corr_melt, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1, 1), space = "Lab",
name = "Korelácia") +
theme_minimal() +
labs(title = "Heatmap korelačnej matice výnosov",
x = "Premenná", y = "Premenná") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

Vidieť, že najvýraznejšie červené polia sa nachádzajú medzi AAPL a SPY, čo naznačuje silnú pozitívnu koreláciu – výnosy Apple sa väčšinou hýbu v rovnakom smere ako trh reprezentovaný indexom S&P 500. Ostatné vzťahy, ako medzi GLD, XLE a SPY, sú slabšie, čo znamená, že tieto aktíva sa s trhom pohybujú len čiastočne. GLD (zlato) má najslabšiu väzbu na ostatné aktíva, čo potvrdzuje jeho úlohu defenzívneho investičného nástroja v portfóliu.

LS0tCnRpdGxlOiAixaB0dnJ0w6Egw7psb2hhIgphdXRob3I6ICcgTWlyb3NsYXZhIE1lZHZlY2vDoSAgPGJyPicKZGF0ZTogIlNlcHRlbWJlciAyMDI1IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCmVkaXRvcl9vcHRpb25zOgogIG1hcmtkb3duOgogICAgd3JhcDogNzIKLS0tCgpgYGB7cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgZWNobyA9IFRSVUUsCiAgICBtZXNzYWdlID0gRkFMU0UsCiAgICB3YXJuaW5nID0gRkFMU0UKKQpgYGAKIyMgSW1wb3J0IMO6ZGFqb3YgICAgICAKTmEgemHEjWlhdG9rIHNpIGltcG9ydHVqZW1lIMO6ZGFqZS4gVnlicmFsYSBzb20gc2kgZMOhdGEgbyBjZW5lIGFrY2nDrSBzcG9sb8SNbm9zdGkgQXBwbGUgYSBFVEYncywga3RvcsOpIG9waXN1asO6IHbDvXZvaiB0cmh1IHpsYXRhIChHTEQpLCBlbmVyZ2V0aWNrw6lobyBzZWt0b3JhIChYTEUpIGEgKFNQWSksIGt0b3LDqSBrb3DDrXJ1amUgdHJoIFMmUCA1MDAuIETDoXRhIHPDuiB6YSBvYmRvYmllIDEuMS4yMDI0LTEuMS4yMDI1LiDDmmRhamUgc8O6IHN0aWFobnV0w6kgcHJpYW1vIHogaW50ZXJuZXR1LCB6IGRhdGFiw6F6eSBZYWhvb0ZpbmFuY2UuIFRpZXRvIGhvZG5vdHkgcHJlZHN0YXZ1asO6IHbDvXZvaiBjaWVuLCBuYSBrdG9yb20gYnVkZW1lIG7DoXNsZWRuZSBhbmFseXpvdmHFpSB2w71ub3N5LCByaXppa28gYSB2esOham9tbsOpIHZ6xaVhaHkgbWVkemkgYWt0w612YW1pLgpgYGB7cn0KIyBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpCgpsaWJyYXJ5KHF1YW50bW9kKQoKdGlja2VycyA8LSBjKCJBQVBMIiwgIkdMRCIsICJYTEUiLCAiU1BZIikgICAjIEFwcGxlLCBHb2xkIEVURiwgRW5lcmd5IEVURiwgUyZQNTAwIEVURgpnZXRTeW1ib2xzKHRpY2tlcnMsIGZyb20gPSAiMjAyNC0wMS0wMSIsIHRvID0gIjIwMjUtMDEtMDEiKQoKIyBabMO6xI1lbmllIENsb3NlIGNpZW4KCmRhdGEgPC0gbWVyZ2UoQ2woQUFQTCksIENsKEdMRCksIENsKFhMRSksIENsKFNQWSkpCmNvbG5hbWVzKGRhdGEpIDwtIHRpY2tlcnMKCmhlYWQoZGF0YSkKY29sbmFtZXMoZGF0YSkKCmBgYApOYSB0ZWp0byB0YWJ1xL5rZSBtw7TFvmVtZSB2aWRpZcWlIHbDvXZvaiBwcnbDvWNoIHBpYXRpY2ggb2JjaG9kbsO9Y2ggZG7DrSBwcmUgdnlicmFuw6kgYWt0w612YSwgbyBrdG9yw71jaCBkw6F0YSBzbWUgc2kgdWxvxb5pbGkgZG8gamVkbsOpaG8gZGF0YXNldHUuICAgICAgCgojIyBHcmFmeSAgICAgCiMjIyBWaXp1YWxpesOhY2lhIHbDvXZvamEgICAgICAKVnl0dm9yw61tZSBzaSBncmFmLCBrdG9yw70gbsOhbSBwb3Bpc3VqZSB2w712b2ogY2llbiBqZWRub3RsaXbDvWNoIGFrY2nDrSB6YSBwb3NsZWRuw70gcm9rLiBQb21vY291IHRvaHRvIGdyYWZ1IHNpIHZpZW1lIGdyYWZpY2t5IHBvcm92bmHFpSBpY2ggY2VudS4gCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCgojIHRyYW5zZm9ybcOhY2lhIGTDoXQgcHJlIGdncGxvdAoKZGF0YV9kZiA8LSBkYXRhLmZyYW1lKERhdGUgPSBpbmRleChkYXRhKSwgY29yZWRhdGEoZGF0YSkpICU+JQpwaXZvdF9sb25nZXIoLURhdGUsIG5hbWVzX3RvID0gIlRpY2tlciIsIHZhbHVlc190byA9ICJQcmljZSIpCgpnZ3Bsb3QoZGF0YV9kZiwgYWVzKHggPSBEYXRlLCB5ID0gUHJpY2UsIGNvbG9yID0gVGlja2VyKSkgKwpnZW9tX2xpbmUoc2l6ZSA9IDEpICsKdGhlbWVfbWluaW1hbCgpICsKbGFicyh0aXRsZSA9ICJWw712b2ogY2llbiBha2Npw60gYSBFVEYgKDIwMjTigJMyMDI1KSIsCnggPSAiRMOhdHVtIiwKeSA9ICJDZW5hIChVU0QpIiwKY29sb3IgPSAiVGlja2VyIikKCmBgYApWaWTDrW1lLCDFvmUgU1BZIChtb2Ryw6EgbMOtbmlhKSBtw6EgbmFqdnnFocWhaXUgYSBuYWpzdGFiaWxuZWrFoWl1IGNlbnUsIHphdGlhxL4gxI1vIFhMRSAoZmlhbG92w6EpIHpvc3TDoXZhIG5hIG5ham5pxb7FoWVqIMO6cm92bmkuIEFBUEwgYSBHTEQgdnlrYXp1asO6IHBvZG9ibsO9IHJhc3RvdsO9IHRyZW5kLCBob2NpIHNvIHpyZXRlxL5uw71taSBrcsOhdGtvZG9iw71taSB2w71reXZtaS4gICAgIAoKIyMjIEJveHBsb3QgZGVubsO9Y2ggdsO9bm9zb3YgICAgICAKWiB2w712b2phIGNpZW4gdnlwb8SNw610YW1lIGxvZ2FyaXRtaWNrw6kgZGVubsOpIHbDvW5vc3ksIGt0b3LDqSBsZXDFoWllIHZ5c3RpaHVqw7ogcGVyY2VudHXDoWxuZSB6bWVueS4gTmEgdGlldG8gdsO9bm9zeSB2eXR2b3LDrW1lIGJveHBsb3QsIGt0b3LDvSB1a8Ohxb5lIGljaCByb3psb8W+ZW5pZSwgcm96c2FoIGEgcHLDrXRvbW5vc8WlIGV4dHLDqW1vdiAob3V0bGllcnMpLgpgYGB7cn0KcmV0dXJucyA8LSBkaWZmKGxvZyhkYXRhKSkKcmV0dXJuc19kZiA8LSBkYXRhLmZyYW1lKERhdGUgPSBpbmRleChyZXR1cm5zKSwgY29yZWRhdGEocmV0dXJucykpICU+JQpwaXZvdF9sb25nZXIoLURhdGUsIG5hbWVzX3RvID0gIlRpY2tlciIsIHZhbHVlc190byA9ICJSZXR1cm4iKQoKZ2dwbG90KHJldHVybnNfZGYsIGFlcyh4ID0gVGlja2VyLCB5ID0gUmV0dXJuLCBmaWxsID0gVGlja2VyKSkgKwpnZW9tX2JveHBsb3QoKSArCnRoZW1lX21pbmltYWwoKSArCmxhYnModGl0bGUgPSAiUm96ZGVsZW5pZSBkZW5uw71jaCB2w71ub3NvdiIsIHggPSAiVGlja2VyIiwgeSA9ICJMb2cgdsO9bm9zIikKCmBgYApCb3hwbG90IHpuw6F6b3LFiHVqZSByb3pkZWxlbmllIGRlbm7DvWNoIGxvZ2FyaXRtaWNrw71jaCB2w71ub3NvdiBqZWRub3RsaXbDvWNoIGFrdMOtdi4KVmlkw61tZSwgxb5lIEFBUEwgdnlrYXp1amUgbmFqdsOkxI3FoWl1IHZhcmlhYmlsaXR1IHbDvW5vc292ICh0ZWRhIHZ5xaHFoWllIHJpemlrbyksIHphdGlhxL4gxI1vIFNQWSBtw6EgbmFqc3RhYmlsbmVqxaFpZSByb3pkZWxlbmllIHMgbWVuxaHDrW0gcG/EjXRvbSBleHRyw6ltbnljaCBob2Ruw7R0LiAgICAgICAgICAKIyMgWsOha2xhZG7DqSDFoXRhdGlzdGlreQpWeXR2b3LDrW1lIHNpIHRhYnXEvmt1LCBrdG9yw6Egem9icmF6dWplIHrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kgZGVubsO9Y2ggbG9nYXJpdG1pY2vDvWNoIHbDvW5vc292IMWhdHlyb2NoIGFrdMOtdi4gICAgICAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCgojIFN1bW1hcmlzZSBiYXNpYyBzdGF0aXN0aWNzIGJ5IHRpY2tlcgoKc3RhdHMgPC0gcmV0dXJuc19kZiAlPiUKZ3JvdXBfYnkoVGlja2VyKSAlPiUKc3VtbWFyaXNlKApuICAgICAgPSBuKCksCm1lYW4gICA9IG1lYW4oUmV0dXJuLCBuYS5ybSA9IFRSVUUpLApzZCAgICAgPSBzZChSZXR1cm4sIG5hLnJtID0gVFJVRSksCm1pbiAgICA9IG1pbihSZXR1cm4sIG5hLnJtID0gVFJVRSksCnEyNSAgICA9IHF1YW50aWxlKFJldHVybiwgMC4yNSwgbmEucm0gPSBUUlVFKSwKbWVkaWFuID0gbWVkaWFuKFJldHVybiwgbmEucm0gPSBUUlVFKSwKcTc1ICAgID0gcXVhbnRpbGUoUmV0dXJuLCAwLjc1LCBuYS5ybSA9IFRSVUUpLAptYXggICAgPSBtYXgoUmV0dXJuLCBuYS5ybSA9IFRSVUUpLAouZ3JvdXBzID0gImRyb3AiCikKCmthYmxlKHN0YXRzLCBkaWdpdHMgPSA1LCBjYXB0aW9uID0gIlrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kgZGVubsO9Y2ggdsO9bm9zb3YiKQoKYGBgClByZW1lbm7DoSBuIHpuYW1lbsOhIHBvxI1ldCBwb3pvcm92YW7DrSwgdGVkYSBwb8SNZXQgb2JjaG9kbsO9Y2ggZG7DrSwgemEga3RvcsOpIGJvbGkgdsO9bm9zeSB2eXBvxI3DrXRhbsOpLiBWxaFldGt5IGFrdMOtdmEgbWFqw7ogcm92bmFrw70gcG/EjWV0IOKAkyAyNTEgZG7DrSwgxI1vIHpvZHBvdmVkw6EgcHJpYmxpxb5uZSBqZWRuw6ltdSBvYmNob2Ruw6ltdSByb2t1LgpTdMS6cGVjIG1lYW4gcHJlZHN0YXZ1amUgcHJpZW1lcm7DvSBkZW5uw70gdsO9bm9zLiBOYWp2ecWhxaHDrSBwcmllbWVybsO9IHbDvW5vcyBkb3NpYWhsYSBBQVBMICgwLjAwMTE5KSwgdGVkYSBwcmlibGnFvm5lIDAsMTIgJSBkZW5uZSwgbmFzbGVkdWplIEdMRCAoMC4wMDA5NSkgYSBTUFkgKDAuMDAwODYpLiBOYWpuacW+xaHDrSBwcmllbWVybsO9IHbDvW5vcyBtw6EgWExFICgwLjAwMDA0KSwgdGVkYSBsZW4gMCwwMDQgJSBkZW5uZSwgxI1vIHpuYW1lbsOhLCDFvmUgamVobyBjZW5hIHYgcHJpZW1lcmUgdGFrbWVyIG5lcsOhc3RsYS4KUHJlbWVubsOhIHNkIHVkw6F2YSBzbWVyb2Rham7DuiBvZGNow71sa3UgdsO9bm9zb3YsIHRlZGEgaWNoIHZvbGF0aWxpdHUuIE5hanZ5xaHFoWl1IGtvbMOtc2F2b3PFpSBtw6EgQUFQTCAoMC4wMTQwNiksIMSNbyB6bmFtZW7DoSwgxb5lIGplaiBkZW5uw6kgdsO9bm9zeSBzYSBwb2h5Ym92YWxpIHByaWJsacW+bmUgwrExLDQgJSBva29sbyBwcmllbWVydS4gTmFvcGFrLCBTUFkgKDAuMDA3OTQpIGEgR0xEICgwLjAwOTQ5KSBtYWrDuiBuacW+xaFpdSB2b2xhdGlsaXR1LCB0ZWRhIHN0YWJpbG5lasWhw60gdsO9dm9qIGNpZW4uCkhvZG5vdGEgbWluIHZ5amFkcnVqZSBuYWp2w6TEjcWhw60gamVkbm9kZW5uw70gcG9rbGVzIGNlbnkuIE5hanbDvXJhem5lasWhw60gemF6bmFtZW5hbGEgQUFQTCAoLTAuMDQ5MzcpLCB0ZWRhIHBva2xlcyBvIHByaWJsacW+bmUg4oCTNCw5ICUsIHphdGlhxL4gxI1vIG5ham1lbsWhw60gcG9rbGVzIG1hbGEgU1BZICgtMC4wMzAyNikuCkt2YXJ0aWwgcTI1ICgyNS4gcGVyY2VudGlsKSB1a2F6dWplLCDFvmUgdiAyNSAlIGRuw60gYm9saSB2w71ub3N5IG5pxb7FoWllIGFrbyBuYXByw61rbGFkIOKAkzAuMDA2NzQgcHJpIEFBUEwsIMSNbyB6b2Rwb3ZlZMOhIHBva2xlc3UgbyDigJMwLDY3ICUuCkhvZG5vdGEgbWVkaWFuIHByZWRzdGF2dWplIHN0cmVkbsO9IHbDvW5vcyDigJMgcG9sb3ZpY2EgZG7DrSBtYWxhIHZ5xaHFocOtIGEgcG9sb3ZpY2EgbmnFvsWhw60gdsO9bm9zLiBWxaFldGt5IGFrdMOtdmEgbWFqw7ogbWVkacOhbiBibMOtemt5IG51bGUgKG9rb2xvIDAuMDAx4oCTMC4wMDE2KSwgxI1vIG5hem5hxI11amUgdnl2w6HFvmVuw70gcG/EjWV0IHJhc3RvdsO9Y2ggYSBwb2tsZXNvdsO9Y2ggZG7DrS4KS3ZhcnRpbCBxNzUgKDc1LiBwZXJjZW50aWwpIHZ5amFkcnVqZSBocmFuaWN1LCBwb2Qga3Rvcm91IHNhIG5hY2jDoWR6YSA3NSAlIHbDvW5vc292IOKAkyBuYXByw61rbGFkIDAuMDA5MjkgcHJlIEFBUEwsIHRlZGEgcHJpYmxpxb5uZSAwLDkzICUgZGVubsO9IHJhc3QuCk5ha29uaWVjLCBtYXggdnlqYWRydWplIG5hanZ5xaHFocOtIGRlbm7DvSB2w71ub3MuIE5hanbDpMSNxaHDrSBqZWRub2Rlbm7DvSByYXN0IHphem5hbWVuYWxhIEFBUEwgKDAuMDcwMTMpLCB0ZWRhIHByaWJsacW+bmUgKzcgJSB6YSBkZcWILCDEjW8gcG90dnJkenVqZSBqZWogdnlzb2vDuiB2b2xhdGlsaXR1LiBOYWpuacW+xaHDrSBtYXhpbcOhbG55IHJhc3QgbWFsYSBHTEQgKDAuMDIyMTQpLCDEjW8gem9kcG92ZWTDoSBwcmlibGnFvm5lICsyLDIgJSB6YSBkZcWIIGEgc3ZlZMSNw60gbyBzdGFiaWxuZWrFoW9tIHbDvXZvamkgemxhdGEuCgojIyBUZXN0b3ZhbmllIGh5cG90w6l6CgojIyMgdC10ZXN0OiBQb3Jvdm5hbmllIHByaWVtZXJuw6lobyB2w71ub3N1IEFBUEwgYSBTUFkuClBvbW9jb3UgdC10ZXN0dSBzaSBwb3Jvdm7DoW1lIHByaWVtZXJuw6kgdsO9bm9zeSBha2NpZSBhcHBsZSBhIFNQWS4KYGBge3J9CnQudGVzdC5yZXN1bHQgPC0gc3VwcHJlc3NXYXJuaW5ncyh0LnRlc3QocmV0dXJucyRBQVBMLCByZXR1cm5zJEdMRCkpCnByaW50KHQudGVzdC5yZXN1bHQpCgpgYGAKVsO9c2xlZG9rIHQtdGVzdHUgcG9yb3Zuw6F2YSBwcmllbWVybsOpIGRlbm7DqSB2w71ub3N5IGFrY2llIEFBUEwgYSBpbmRleG92w6lobyBmb25kdSBTUFkuClRlc3RvdmFjaWEgxaF0YXRpc3Rpa2EgbcOhIGhvZG5vdHUgdCA9IDAuMzI5MTMgYSBwLWhvZG5vdGEgPSAwLjc0MjIsIMSNbyBqZSB2w71yYXpuZSB2aWFjIG5lxb4gMC4wNS4KVG8gem5hbWVuw6EsIMW+ZSBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gcm96ZGllbCBtZWR6aSBwcmllbWVybsO9bWkgdsO9bm9zbWkgdMO9Y2h0byBkdm9jaCBha3TDrXYuClByaWVtZXJuw70gZGVubsO9IHbDvW5vcyBBQVBMIGplIDAuMDAxMTkgKOKJiCAwLDEyICUpIGEgU1BZIDAuMDAwODYgKOKJiCAwLDA4NiAlKSwgcHJpxI1vbSA5NSAlIGtvbmZpZGVuxI1uw70gaW50ZXJ2YWwgcHJlIHJvemRpZWwgbWVkemkgbmltaSBvYnNhaHVqZSBudWx1ICjigJMwLjAwMTY3IDsgMC4wMDIzNCkuClrDoXZlcm9tIG1vxb5ubyBwb3ZlZGHFpSwgxb5lIHbDvW5vc3kgQXBwbGUgc2EgxaF0YXRpc3RpY2t5IG5lbMOtxaFpYSBvZCB2w71ub3NvdiBjZWxrb3bDqWhvIHRyaHUgcmVwcmV6ZW50b3ZhbsOpaG8gaW5kZXhvbSBTJlAgNTAwLiAgICAgICAKCiMjIyBBTk9WQTogUG9yb3ZuYW5pZSB2w71ub3NvdiBtZWR6aSB2xaFldGvDvW1pIGFrdMOtdmFtaQpQb21vY291IGFub3Z5IHBvcm92bsOhbWUgdsO9bm9zeSB2xaFldGvDvWNoIGFrdMOtdi4gCmBgYHtyfQphbm92YS5yZXN1bHQgPC0gYW92KFJldHVybiB+IFRpY2tlciwgZGF0YSA9IHJldHVybnNfZGYpCnN1bW1hcnkoYW5vdmEucmVzdWx0KQoKYGBgClRlc3RvdmFjaWEgxaF0YXRpc3Rpa2EgbcOhIGhvZG5vdHUgRiA9IDAuNTI1IGEgcC1ob2Rub3RhID0gMC42NjUuCktlxI/FvmUgcC1ob2Rub3RhIGplIHbDvXJhem5lIHZ5xaHFoWlhIGFrbyAwLjA1LCBuZXphbWlldGFtZSBudWxvdsO6IGh5cG90w6l6dSwgxb5lIHbFoWV0a3kgYWt0w612YSBtYWrDuiByb3ZuYWvDvSBwcmllbWVybsO9IHbDvW5vcy4KSW7DvW1pIHNsb3ZhbWksIG1lZHppIHByaWVtZXJuw71taSBkZW5uw71taSB2w71ub3NtaSB0w71jaHRvIMWhdHlyb2NoIHRyaG92IG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSByb3pkaWVsIOKAkyBpY2ggdsO9a29ubm9zxaUgYm9sYSB2IHNsZWRvdmFub20gb2Jkb2LDrSB2ZcS+bWkgcG9kb2Juw6EuCiAgICAgCiMjIyBMaW5lw6FybmEgcmVncmVzaWE6IFByZWRpa2NpYSB2w71ub3N1IEFBUEwuICAgIApDaWXEvm9tIHJlZ3Jlc2llIGplIHppc3RpxaUsIMSNaSBtb8W+bm8gdnlzdmV0bGnFpSBkZW5uw6kgdsO9bm9zeSBha2NpZSBBQVBMIHBvbW9jb3UgdsO9bm9zb3YgdHJodSBHTEQsIFhMRSBhIFNQWSAoUyZQIDUwMCkuICAgICAKYGBge3J9Cm1vZGVsIDwtIGxtKEFBUEwgfiBHTEQgKyBYTEUgKyBTUFksIGRhdGEgPSByZXR1cm5zKQpzdW1tYXJ5KG1vZGVsKQoKYGBgCgpgYGB7cn0KbGlicmFyeShicm9vbSkKbGlicmFyeShzdHJpbmdyKQoKY29lZi50YmwgPC0gdGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFKSAlPiUKbXV0YXRlKAp0ZXJtID0gcmVjb2RlKHRlcm0sCiIoSW50ZXJjZXB0KSIgPSAiSW50ZXJjZXB0IiwKIkdMRCIgPSAiR0xEIChabGF0bykiLAoiWExFIiA9ICJYTEUgKEVuZXJnZXRpa2EpIiwKIlNQWSIgPSAiU1BZIChTJlA1MDAgSW5kZXgpIgopLApzdGFycyA9IGNhc2Vfd2hlbigKcC52YWx1ZSA8IDAuMDAxIH4gIioqKiIsCnAudmFsdWUgPCAwLjAxICB+ICIqKiIsCnAudmFsdWUgPCAwLjA1ICB+ICIqIiwKcC52YWx1ZSA8IDAuMSAgIH4gIsK3IiwKVFJVRSAgICAgICAgICAgIH4gIiIKKQopICU+JQp0cmFuc211dGUoClByZW1lbm7DoSA9IHRlcm0sCk9kaGFkID0gZXN0aW1hdGUsCmDFoHRhbmRhcmRuw6EgY2h5YmFgID0gc3RkLmVycm9yLApgdC1ob2Rub3RhYCA9IHN0YXRpc3RpYywKYHAtaG9kbm90YWAgPSBwLnZhbHVlLApgOTUlIENJYCA9IHN0cl9jKCJbIiwgcm91bmQoY29uZi5sb3csIDUpLCAiLCAiLCByb3VuZChjb25mLmhpZ2gsIDUpLCAiXSIpLApTaWcgPSBzdGFycwopCgpjb2VmLnRibCAlPiUKa2FibGUoZGlnaXRzID0gNSwgY2FwdGlvbiA9ICJSZWdyZXNuw70gbW9kZWw6IFbDvW5vcyBBQVBMIH4gR0xEICsgWExFICsgU1BZIikgJT4lCmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpICU+JQpjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkgJT4lCnJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKZm9vdG5vdGUoZ2VuZXJhbCA9ICJTaWduaWYuIGNvZGVzOiAqKiogcDwwLjAwMSwgKiogcDwwLjAxLCAqIHA8MC4wNSwgwrcgcDwwLjEuIiwgdGhyZWVwYXJ0dGFibGUgPSBUUlVFKQoKCmBgYApLb27FoXRhbnRhIChJbnRlcmNlcHQpIGplIHZlxL5taSBtYWzDoSBhIMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw6EgKHAgPSAwLjY4KSwgxI1vIHpuYW1lbsOhLCDFvmUgcHJpIG51bG92w71jaCB2w71ub3NvY2ggb3N0YXRuw71jaCBha3TDrXYgYnkgb8SNYWvDoXZhbsO9IHbDvW5vcyBBQVBMIHByYWt0aWNreSBuZWJvbCBvZGxpxaFuw70gb2QgbnVseS4KUHJlbWVubsOhIEdMRCAoWmxhdG8pIG3DoSB0YWtpc3RvIG5ldsO9em5hbW7DvSB2cGx5diAocCA9IDAuOTcpLCB0YWvFvmUgem1lbnkgY2llbiB6bGF0YSBuZW1hasO6IG1lcmF0ZcS+bsO9IGVmZWt0IG5hIHbDvW5vcyBBcHBsZS4KTmFvcGFrLCBYTEUgKEVuZXJnZXRpa2EpIG3DoSBuZWdhdMOtdm55IGEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70ga29lZmljaWVudCAozrIgPSDigJMwLjE5NTA0LCBwID0gMC4wMDYpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIGFrIHbDvW5vcyBlbmVyZ2V0aWNrw6lobyBzZWt0b3JhIHJhc3RpZSwgdsO9bm9zIEFwcGxlIG3DoSB0ZW5kZW5jaXUgayBtaWVybmVtdSBwb2tsZXN1LgpOYWpzaWxuZWrFocOtIGEgdnlzb2tvIHbDvXpuYW1uw70gdnBseXYgbcOhIFNQWSAoUyZQIDUwMCBJbmRleCkgcyBrb2VmaWNpZW50b20gzrIgPSAxLjAzOTYxIGEgdmXEvm1pIG7DrXprb3UgcC1ob2Rub3RvdSAocCA8IDAuMDAxKS4gVG8gem5hbWVuw6EsIMW+ZSB2w71ub3MgQXBwbGUgamUgw7p6a28gc3DDpHTDvSBzIHbDvXZvam9tIGNlbGtvdsOpaG8gdHJodSDigJQga2XEjyBpbmRleCBTJlAgNTAwIHN0w7pwbmUgbyAxICUsIHbDvW5vcyBBcHBsZSBzYSB2IHByaWVtZXJlIHp2w73FoWkgcHJpYmxpxb5uZSBvIDEsMDQgJS4KQ2Vsa292byB0ZWRhIG1vZGVsIHVrYXp1amUsIMW+ZSB2w71ub3MgQXBwbGUgbmFqdmlhYyBrb3DDrXJ1amUgdHJob3bDvSBpbmRleCBTUFksIHphdGlhxL4gxI1vIHpsYXRvIG5lbcOhIMW+aWFkbnkgdnBseXYgYSBlbmVyZ2V0aWNrw70gc2VrdG9yIG3DoSBtaWVybnkgbmVnYXTDrXZueSB2esWlYWguICAgIAoKYGBge3J9CmZpdC50YmwgPC0gZ2xhbmNlKG1vZGVsKSAlPiUKdHJhbnNtdXRlKApgUi1zcXVhcmVkYCA9IHIuc3F1YXJlZCwKYEFkai4gUi1zcXVhcmVkYCA9IGFkai5yLnNxdWFyZWQsCmBGLXN0YXRpc3RpY2AgPSBzdGF0aXN0aWMsCmBGIHAtdmFsdWVgID0gcC52YWx1ZSwKYEFJQ2AgPSBBSUMsCmBCSUNgID0gQklDLApgTnVtLiBvYnMuYCA9IG5vYnMKKQoKZml0LnRibCAlPiUKa2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJNb2RlbCBGaXQgU3RhdGlzdGljcyIpICU+JQprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJjb25kZW5zZWQiKSkKCmBgYApIb2Rub3RhIFItc3F1YXJlZCA9IDAuMzEyIHpuYW1lbsOhLCDFvmUgcHJpYmxpxb5uZSAzMSwyICUgdmFyaWFiaWxpdHkgZGVubsO9Y2ggdsO9bm9zb3YgQXBwbGUgKEFBUEwpIGplIHZ5c3ZldGxlbsO9Y2ggem1lbmFtaSB2byB2w71ub3NvY2ggRVRGIGZvbmRvdiBHTEQsIFhMRSBhIFNQWS4KQWRqdXN0ZWQgUi1zcXVhcmVkID0gMC4zMDQgdXByYXZ1amUgdMO6dG8gaG9kbm90dSBvIHBvxI1ldCBwcmVtZW5uw71jaCBhIHBvem9yb3ZhbsOtLCBwcmnEjW9tIHBvdHZyZHp1amUsIMW+ZSBtb2RlbCBtw6Egc3TDoWxlIHNvbMOtZG51IHZ5c3ZldMS+b3ZhY2l1IHNjaG9wbm9zxaUuCkYtc3RhdGlzdGljID0gMzcuMzY5IHMgcC1ob2Rub3RvdSA9IDAgdWthenVqZSwgxb5lIG1vZGVsIGFrbyBjZWxvayBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSDigJMgdGVkYSBhc3BvxYggamVkbmEgeiB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoIHbDvXpuYW1uZSBvdnBseXbFiHVqZSB2w71ub3MgQXBwbGUuClVrYXpvdmF0ZWxlIEFJQyAoLTE1MTMuMjEpIGEgQklDICgtMTQ5NS41ODIpIHPDuiBpbmZvcm1hxI1uw6kga3JpdMOpcmnDoSBwb3XFvsOtdmFuw6kgcHJpIHBvcm92bsOhdmFuw60gbW9kZWxvdiDigJMgbmnFvsWhaWUgaG9kbm90eSBuYXpuYcSNdWrDuiBsZXDFoWllIHByaXNww7Rzb2JlbmllLgpDZWxrb3ZvIG1vxb5ubyBwb3ZlZGHFpSwgxb5lIG1vZGVsIHMgMjUxIHBvem9yb3ZhbmlhbWkgcG9za3l0dWplIHN0cmVkbmUgc2lsbsOpLCBhbGUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6kgdnlzdmV0bGVuaWUgdsO9bm9zb3YgQXBwbGUuICAgICAgICAKCiMjIFZpenVhbGl6w6FjaWEgdsO9bm9zb3YgICAgICAKYGBge3J9CmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpCmNoYXJ0LlRpbWVTZXJpZXMocmV0dXJucywgbGVnZW5kLmxvYyA9ICJib3R0b21sZWZ0IiwgbWFpbiA9ICJEZW5uw6kgbG9nYXJpdG1pY2vDqSB2w71ub3N5IikKY2hhcnQuQm94cGxvdChyZXR1cm5zLCBtYWluID0gIlJvemRlbGVuaWUgdsO9bm9zb3YgcG9kxL5hIGFrdMOtdmEiKQpjaGFydC5Db3JyZWxhdGlvbihyZXR1cm5zLCBoaXN0b2dyYW0gPSBUUlVFLCBwY2ggPSAxOSkKCmBgYAojIyMgKsSMaWFyb3bDvSBncmFmKiAgICAKCsSMaWFyb3bDvSBncmFmIHpvYnJhenVqZSBkZW5uw6kgbG9nYXJpdG1pY2vDqSB2w71ub3N5IMWhdHlyb2NoIGFrdMOtdiDigJMgQUFQTCwgR0xELCBYTEUgYSBTUFkg4oCTIHYgb2Jkb2LDrSBvZCBqYW51w6FyYSBkbyBkZWNlbWJyYSAyMDI0LgpWaWRpZcWlLCDFvmUgdsWhZXRreSBzw6lyaWUgb3NjaWx1asO6IG9rb2xvIG51bHksIMSNbyB6bmFtZW7DoSwgxb5lIHbDpMSNxaFpbmEgZGVubsO9Y2ggem1pZW4gYm9sYSBtYWzDoSwgcyBwcmlibGnFvm5lIHJvdm5ha8O9bSBwb8SNdG9tIHJhc3RvdsO9Y2ggYSBrbGVzYWrDumNpY2ggZG7DrS4KTmFqdsO9cmF6bmVqxaFpZSB2w71reXZ5IG3DoSBBQVBMICjEjWllcm5hIGzDrW5pYSksIMSNbyBwb3R2cmR6dWplIGplaG8gdnnFocWhaXUgdm9sYXRpbGl0dSwgemF0aWHEviDEjW8gU1BZIChtb2Ryw6EgbMOtbmlhKSB2eWthenVqZSBuYWpzdGFiaWxuZWrFocOtIHByaWViZWguClpsYXRvIChHTEQsIMSNZXJ2ZW7DoSBsw61uaWEpIGEgZW5lcmdldGlja8O9IHNla3RvciAoWExFLCB6ZWxlbsOhIGzDrW5pYSkgc2EgcG9oeWJ1asO6IHBvZG9ibmUsIGFsZSBzIG9ixI1hc27DvW1pIHBydWTFocOtbWkgdsO9a3l2bWksIGt0b3LDqSBvZHLDocW+YWrDuiByZWFrY2llIG5hIMWhcGVjaWZpY2vDqSB0cmhvdsOpIHVkYWxvc3RpLiAgICAgIAoKIyMjICpCb3hwbG90KgoKQm94cGxvdCB6b2JyYXp1amUgcm96ZGVsZW5pZSBkZW5uw71jaCB2w71ub3NvdiBqZWRub3RsaXbDvWNoIGFrdMOtdiDigJMgQUFQTCwgR0xELCBTUFkgYSBYTEUg4oCTIHBvxI1hcyBzbGVkb3ZhbsOpaG8gb2Jkb2JpYS4KVsWhZXRreSB2w71ub3N5IHPDuiBzw7pzdHJlZGVuw6kgb2tvbG8gbnVseSwgxI1vIHpuYW1lbsOhLCDFvmUgdsOkxI3FoWluYSBkZW5uw71jaCB6bWllbiBib2xhIG1hbMOhLgpOYWp2w6TEjcWhw60gcm96cHR5bCAodGVkYSB2b2xhdGlsaXR1KSBtw6EgQUFQTCwgxI1vIG5hem5hxI11amUgdnnFocWhaWUgcml6aWtvIGFqIHBvdGVuY2nDoWwgemlza3UuClNQWSBtw6EgbmFvcGFrIG5ham1lbsWhaWUgcm96cMOkdGllIHbDvW5vc292LCDEjW8gem9kcG92ZWTDoSBqZWhvIGNoYXJha3RlcnUgZGl2ZXJ6aWZpa292YW7DqWhvIHRyaG92w6lobyBpbmRleHUuCkFrdMOtdmEgR0xEICh6bGF0bykgYSBYTEUgKGVuZXJnZXRpa2EpIG1hasO6IG1pZXJudSB2b2xhdGlsaXR1IGEgbmlla2/EvmtvIGV4dHLDqW1ueWNoIGhvZG7DtHQgKG91dGxpZXJvdiksIGt0b3LDqSBwcmVkc3RhdnVqw7ogbmVvYnZ5a2zDqSBkZW5uw6kgcG9oeWJ5IHNww7Rzb2JlbsOpIHRyaG92w71taSB1ZGFsb3PFpWFtaS4gICAgICAgCgojIyMgKktvcmVsYcSNbsOhIG1hdGljYSBzIHJvemRlbGVuw61tKiAgIAoKR3JhZiB6b2JyYXp1amUga29yZWxhxI1uw7ogbWF0aWN1IGRlbm7DvWNoIHbDvW5vc292IMWhdHlyb2NoIGFrdMOtdiDigJMgQUFQTCwgR0xELCBYTEUgYSBTUFkg4oCTIHNwb2x1IHMgaWNoIHJvemRlbGVuw61tIGEgdnrDoWpvbW7DvW1pIHrDoXZpc2xvc8WlYW1pLgpOYSBkaWFnb27DoWxlIHPDuiBoaXN0b2dyYW15LCBrdG9yw6kgdWthenVqw7ogcm96ZGVsZW5pZSB2w71ub3NvdiBqZWRub3RsaXbDvWNoIGFrdMOtdiDigJMgdsWhZXRreSBtYWrDuiBwcmlibGnFvm5lIG5vcm3DoWxuZSByb3pkZWxlbmllIHMgdnJjaG9sb20gdiBibMOtemtvc3RpIG51bHkuClBvZCBkaWFnb27DoWxvdSBzw7ogYm9kb3bDqSBncmFmeSAoc2NhdHRlcnBsb3R5KSB6b2JyYXp1asO6Y2UgdnrFpWFoIG1lZHppIGR2b2ppY2FtaSBha3TDrXYuCk5hZCBkaWFnb27DoWxvdSBzw7ogdXZlZGVuw6kga29yZWxhxI1uw6kga29lZmljaWVudHksIHByacSNb20gaHZpZXpkacSNa3kgb3puYcSNdWrDuiDFoXRhdGlzdGlja8O6IHbDvXpuYW1ub3PFpS4KTmFqc2lsbmVqxaFpdSBrb3JlbMOhY2l1IG3DoSBkdm9qaWNhIEFBUEwg4oCTIFNQWSAoMC41NCksIMSNbyBwb3R2cmR6dWplLCDFvmUgdsO9bm9zeSBBcHBsZSBzYSBuYWp2aWFjIHBvaHlidWrDuiB2IHPDumxhZGUgcyBjZWxrb3bDvW0gdHJob20uCk9zdGF0bsOpIHZ6xaVhaHkgc8O6IHNsYWLFoWllOiBYTEUg4oCTIFNQWSAoMC4zMSkgYSBHTEQg4oCTIFNQWSAoMC4yNyksIMSNbyBuYXpuYcSNdWplLCDFvmUgemxhdG8gYSBlbmVyZ2V0aWNrw70gc2VrdG9yIHNhIHPDrWNlIMSNaWFzdG/EjW5lIGjDvWJ1IHMgdHJob20sIGFsZSBtZW5laiBrb256aXN0ZW50bmUuCktvcmVsw6FjaWUgbWVkemkgR0xEIGEgb3N0YXRuw71taSBha3TDrXZhbWkgc8O6IHZlxL5taSBuw616a2UsIMSNbyB6b2Rwb3ZlZMOhIGplaG8gw7psb2hlIGRlZmVuesOtdm5laG8gYWt0w612YS4gICAgICAgIAoKIyMjIEhlYXRtYXAgClRlbnRvIGdyYWYgcHJlZHN0YXZ1amUgaGVhdG1hcHUga29yZWxhxI1uZWogbWF0aWNlIGRlbm7DvWNoIHbDvW5vc292IGFrdMOtdiBBQVBMLCBHTEQsIFhMRSBhIFNQWS4KRmFyYmEgamVkbm90bGl2w71jaCBwb2zDrSB2eWphZHJ1amUgc2lsdSBhIHNtZXIga29yZWzDoWNpZSDigJMgxI1lcnZlbsOpIG9kdGllbmUgem5hbWVuYWrDuiBrbGFkbsO6IGtvcmVsw6FjaXUgKHNwb2xvxI1uw70gcG9oeWIgY2llbiksIHphdGlhxL4gxI1vIG1vZHLDqSBieSBwcmVkc3Rhdm92YWxpIHrDoXBvcm7DuiAob3BhxI1uw70gcG9oeWIpLgpgYGB7cn0KIyBLb3JlbGHEjW7DoSBtYXRpY2EgYSBoZWF0bWFwYQoKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJlc2hhcGUyKQoKIyB2w71wb8SNZXQga29yZWxhxI1uZWogbWF0aWNlCgpjb3JyX21hdHJpeCA8LSBjb3IocmV0dXJucywgdXNlID0gImNvbXBsZXRlLm9icyIpCgojIHByZW1lbmEgbmEgZGxow70gZm9ybcOhdCBwcmUgZ2dwbG90Cgpjb3JyX21lbHQgPC0gbWVsdChjb3JyX21hdHJpeCkKCiMgaGVhdG1hcCB2aXp1YWxpesOhY2lhCgpnZ3Bsb3QoZGF0YSA9IGNvcnJfbWVsdCwgYWVzKHggPSBWYXIxLCB5ID0gVmFyMiwgZmlsbCA9IHZhbHVlKSkgKwpnZW9tX3RpbGUoY29sb3IgPSAid2hpdGUiKSArCnNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiLCBtaWQgPSAid2hpdGUiLAptaWRwb2ludCA9IDAsIGxpbWl0ID0gYygtMSwgMSksIHNwYWNlID0gIkxhYiIsCm5hbWUgPSAiS29yZWzDoWNpYSIpICsKdGhlbWVfbWluaW1hbCgpICsKbGFicyh0aXRsZSA9ICJIZWF0bWFwIGtvcmVsYcSNbmVqIG1hdGljZSB2w71ub3NvdiIsCnggPSAiUHJlbWVubsOhIiwgeSA9ICJQcmVtZW5uw6EiKSArCnRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgaGp1c3QgPSAxKSkKCmBgYApWaWRpZcWlLCDFvmUgbmFqdsO9cmF6bmVqxaFpZSDEjWVydmVuw6kgcG9saWEgc2EgbmFjaMOhZHphasO6IG1lZHppIEFBUEwgYSBTUFksIMSNbyBuYXpuYcSNdWplIHNpbG7DuiBwb3ppdMOtdm51IGtvcmVsw6FjaXUg4oCTIHbDvW5vc3kgQXBwbGUgc2EgdsOkxI3FoWlub3UgaMO9YnUgdiByb3ZuYWtvbSBzbWVyZSBha28gdHJoIHJlcHJlemVudG92YW7DvSBpbmRleG9tIFMmUCA1MDAuCk9zdGF0bsOpIHZ6xaVhaHksIGFrbyBtZWR6aSBHTEQsIFhMRSBhIFNQWSwgc8O6IHNsYWLFoWllLCDEjW8gem5hbWVuw6EsIMW+ZSB0aWV0byBha3TDrXZhIHNhIHMgdHJob20gcG9oeWJ1asO6IGxlbiDEjWlhc3RvxI1uZS4KR0xEICh6bGF0bykgbcOhIG5hanNsYWLFoWl1IHbDpHpidSBuYSBvc3RhdG7DqSBha3TDrXZhLCDEjW8gcG90dnJkenVqZSBqZWhvIMO6bG9odSBkZWZlbnrDrXZuZWhvIGludmVzdGnEjW7DqWhvIG7DoXN0cm9qYSB2IHBvcnRmw7NsaXUuCg==