1.ƯỚC LƯỢNG MÔ HÌNH COPULA

1.1. GÁN DỮ LIỆU

library(xlsx) 
## Warning: package 'xlsx' was built under R version 4.3.3
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
#Nhập dữ liệu
data <- read.xlsx('C:/Users/admin/OneDrive - UFM/Documents/thnn1/THNN1/vniset.xlsx', sheetIndex = 1, header = T)
# Tính lợi suất logarit hàng ngày của cổ phiếu VNI và NYA
tsVNI <- diff(log(data$VNI), lag = 1)
tsSETI <- diff(log(data$SETI), lag = 1)
# Tạo một data frame mới chứa lợi suất logarit hàng ngày của cả hai cổ phiếu
rt <- data.frame(tsVNI = tsVNI, tsSETI = tsSETI)
summary(data)
##       Date                 VNI              SETI     
##  Min.   :2018-01-03   Min.   : 659.2   Min.   :1024  
##  1st Qu.:2019-07-03   1st Qu.: 962.9   1st Qu.:1528  
##  Median :2020-12-24   Median :1048.2   Median :1609  
##  Mean   :2020-12-30   Mean   :1089.7   Mean   :1573  
##  3rd Qu.:2022-07-04   3rd Qu.:1198.4   3rd Qu.:1654  
##  Max.   :2023-12-28   Max.   :1528.6   Max.   :1837

1.2. MA TRẬN HỆ SỐ

res <- cor(rt)
round <- round(res, 3)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.92 loaded
corrplot(res, type = "upper", order = "hclust", 
         tl.col = "black", tl.srt = 45)

chart.Correlation(rt, histogram=TRUE, pch=19)
## Warning in par(usr): argument 1 does not name a graphical parameter

library(ggplot2)
library(dplyr)
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.3.3
df <- dplyr::select_if(rt, is.numeric)
r <- cor(df, use="complete.obs")
ggcorrplot(r)

Biến động của chuỗi tỷ suất lợi nhuận

plot.ts(rt$tsVNI)

Biến động của chuỗi tỷ suất lợi nhuận SETI

plot.ts(rt$tsSETI)

library(tidyr)
pivot_longer(rt, cols = everything(), names_to = "TSLN", values_to = "Value") %>% ggplot(aes(x = TSLN, y = Value)) +
  geom_boxplot(fill = "cyan", color = "black") +
  theme_minimal() +
  labs(title = "Hình 7: Biểu đồ hộp của TSLN VNI và SETI",
       x = "Chỉ số",
       y = "Tỷ suất sinh lợi")

2. KIỂM ĐỊNH DỮ LIỆU

2.1. KIỂM ĐỊNH TÍNH DỪNG

library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
#Kiểm định tính dừng của chuỗi VNI
adf_vni <- adf.test(rt$tsVNI)
## Warning in adf.test(rt$tsVNI): p-value smaller than printed p-value
print(adf_vni)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  rt$tsVNI
## Dickey-Fuller = -11.512, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary
#Kiểm định tính dừng của chuổi SETI
adf_seti <- adf.test(rt$tsSETI)
## Warning in adf.test(rt$tsSETI): p-value smaller than printed p-value
print(adf_seti)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  rt$tsSETI
## Dickey-Fuller = -8.9716, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary

2.2. KIỂM ĐỊNH PHÂN PHỐI CHUẨN

# kiểm định phân phối chuẩn của VNI
library(tseries)
jq_vni <- jarque.bera.test(rt$tsVNI)
print(jq_vni)
## 
##  Jarque Bera Test
## 
## data:  rt$tsVNI
## X-squared = 941.92, df = 2, p-value < 2.2e-16
# kiểm định phân phối chuẩn của SETI
jq_seti <- jarque.bera.test(rt$tsSETI)
print(jq_seti)
## 
##  Jarque Bera Test
## 
## data:  rt$tsSETI
## X-squared = 36162, df = 2, p-value < 2.2e-16

3. MÔ HÌNH ARIMA

library(FinTS)
## Warning: package 'FinTS' was built under R version 4.3.3
# Ước lượng và trích xuất phần dư từ mô hình ARMA tối ưu
library(rugarch)
## Warning: package 'rugarch' was built under R version 4.3.3
## Loading required package: parallel
## 
## Attaching package: 'rugarch'
## The following object is masked from 'package:stats':
## 
##     sigma
arima_VNI <- autoarfima(rt$tsVNI,ar.max = 2, ma.max = 2, criterion = 'AIC', method = "full")

arima_seti <- autoarfima(rt$tsSETI,ar.max = 2, ma.max = 2, criterion = 'AIC', method = "full")

re_VNI <- arima_VNI$fit@fit$residuals
re_seti <- arima_seti$fit@fit$residuals
#Kiểm định tương quan chuỗi bậc 2 cho phần dư
lj_vni <- Box.test(re_VNI,type = 'Ljung-Box', lag = 2)
lj_seti <- Box.test(re_seti,type = 'Ljung-Box', lag = 2)

#Kiểm định tương quan chuỗi bậc 2 cho phần dư bình phương
lj_vni2 <- Box.test(re_VNI^2,type = 'Ljung-Box', lag = 2)
lj_seti2 <- Box.test(re_seti^2,type = 'Ljung-Box', lag = 2)

#Kiểm định hiệu ứng ARCH
ar_vni <- ArchTest(re_VNI, lags = 2)
ar_seti <- ArchTest(re_seti, lags = 2)

#Trình bày kết quả
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(dplyr)
test_result <- data.frame(Test = c("ADF","J-B","Q(2)","Q(2)^2", "ARCH(2)"),P_value_VNI = c(adf_vni$p.value, jq_vni$p.value, lj_vni$p.value, lj_vni2$p.value, ar_vni$p.value), P_value_STI = c(adf_seti$p.value, jq_seti$p.value, lj_seti$p.value, lj_seti2$p.value, ar_seti$p.value)) 
kable(test_result, caption = "Bảng 3: Kết quả các kiểm định", label = 'Ghi chú: Q (2) and Q2 (2) lần lượt là kiểm định Ljung-Box Q2 cho tương quan chuỗi bậc 2 của phần dư và bình phương phần dư của lợi suất', format = 'pandoc') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F)
## Warning in kable_styling(., bootstrap_options = c("striped", "hover",
## "condensed"), : Please specify format in kable. kableExtra can customize either
## HTML or LaTeX outputs. See https://haozhu233.github.io/kableExtra/ for details.
Bảng 3: Kết quả các kiểm định
Test P_value_VNI P_value_STI
ADF 0.0100000 0.0100000
J-B 0.0000000 0.0000000
Q(2) 0.9996102 0.9168313
Q(2)^2 0.0000000 0.0000000
ARCH(2) 0.0000000 0.0000000
chart.Correlation(rt, histogram=TRUE, pch=19)
## Warning in par(usr): argument 1 does not name a graphical parameter

rt %>% ggplot(aes(tsVNI, tsSETI)) +
              geom_point(col = '#BB0000',shape = TRUE) + 
              geom_smooth(method = 'lm',se = T, col = '#CCFFFF') + #thêm đường hồi quy với phương pháp hồi quy tuyến tính  
              labs(title = 'Hình 11: Biểu đồ Scatter TSLN của SETI và VNI', x = 'VNI', y = 'SETI')
## `geom_smooth()` using formula = 'y ~ x'

4. MÔ HÌNH GARCH

4.1. SETI

# GJR-GARCH(11)SETI
seti.garch11n.spec <- ugarchspec(variance.model = list(model="gjrGARCH",garchOrder=c(1,1)),mean.model = list(armaOrder=c(1,0),include.mean=TRUE),distribution.model = "norm")
seti.garch11n.fit <- ugarchfit(spec = seti.garch11n.spec,  tsSETI)
seti.garch11t.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "std")
 seti.garch11t.fit <- ugarchfit(spec =seti.garch11t.spec, tsSETI)
seti.garch11st.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "sstd")
 seti.garch11st.fit <- ugarchfit(spec = seti.garch11st.spec, tsSETI)
seti.garch11g.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "ged")
seti.garch11g.fit <- ugarchfit(spec = seti.garch11g.spec, tsSETI)
seti.garch11sg.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "sged")
seti.garch11sg.fit <- ugarchfit(spec = seti.garch11sg.spec, tsSETI)

#  GJR-GARCH(12)SETI
seti.garch12n.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "norm")
seti.garch12n.fit <- ugarchfit(spec = seti.garch12n.spec, tsSETI)
seti.garch12t.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "std")
seti.garch12t.fit <- ugarchfit(spec = seti.garch12t.spec, tsSETI)
seti.garch12st.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "sstd")
seti.garch12st.fit <- ugarchfit(spec = seti.garch12st.spec, tsSETI)
seti.garch12g.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "ged")
seti.garch12g.fit <- ugarchfit(spec = seti.garch12g.spec, tsSETI)
seti.garch12sg.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "sged")
seti.garch12sg.fit <- ugarchfit(spec = seti.garch12sg.spec, tsSETI)
# GJR-GARCH(21)SETI
seti.garch21n.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "norm")
seti.garch21n.fit <- ugarchfit(spec = seti.garch21n.spec, tsSETI)
seti.garch21t.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "std")
seti.garch21t.fit <- ugarchfit(spec = seti.garch21t.spec, tsSETI)
seti.garch21st.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "sstd")
seti.garch21st.fit <- ugarchfit(spec = seti.garch21st.spec, tsSETI)
seti.garch21g.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "ged")
seti.garch21g.fit <- ugarchfit(spec = seti.garch21g.spec, tsSETI)
seti.garch21sg.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "sged")
seti.garch21sg.fit <- ugarchfit(spec = seti.garch21sg.spec, tsSETI)
# GJR-GARCH(22)SETI
seti.garch22n.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "norm")
seti.garch22n.fit <- ugarchfit(spec = seti.garch22n.spec, tsSETI)
seti.garch22t.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "std")
seti.garch22t.fit <- ugarchfit(spec = seti.garch22t.spec, tsSETI)
seti.garch22st.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "sstd")
seti.garch22st.fit <- ugarchfit(spec = seti.garch22st.spec, tsSETI)
seti.garch22g.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "ged")
seti.garch22g.fit <- ugarchfit(spec = seti.garch22g.spec, tsSETI)
seti.garch22sg.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)),mean.model = list(armaOrder = c(1, 0), include.mean = TRUE), distribution.model = "sged")
seti.garch22sg.fit <- ugarchfit(spec = seti.garch22sg.spec, tsSETI)

4.2. VNi

# GJR-GARCH(11)VNI
vn.garch11n.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "norm")
vn.garch11n.fit <- ugarchfit(spec = vn.garch11n.spec, tsVNI)
vn.garch11t.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "std")
vn.garch11t.fit <- ugarchfit(spec = vn.garch11t.spec, tsVNI)
vn.garch11st.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)),mean.model = list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "sstd")
vn.garch11st.fit <- ugarchfit(spec = vn.garch11st.spec, tsVNI)
vn.garch11g.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "ged")
vn.garch11g.fit <- ugarchfit(spec = vn.garch11g.spec, tsVNI)
vn.garch11sg.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)),mean.model = list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "sged")
vn.garch11sg.fit <- ugarchfit(spec = vn.garch11sg.spec, tsVNI)
# GJR-GARCH(12)VNI
vn.garch12n.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "norm")
vn.garch12n.fit <- ugarchfit(spec = vn.garch12n.spec, tsVNI)
vn.garch12t.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "std")
vn.garch12t.fit <- ugarchfit(spec = vn.garch12t.spec, tsVNI)
vn.garch12st.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)),mean.model = list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "sstd")
vn.garch12st.fit <- ugarchfit(spec = vn.garch12st.spec, tsVNI)
vn.garch12g.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "ged")
vn.garch12g.fit <- ugarchfit(spec = vn.garch12g.spec, tsVNI)
vn.garch12sg.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 2)),mean.model = list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "sged")
vn.garch12sg.fit <- ugarchfit(spec = vn.garch12sg.spec, tsVNI)
# GJR-GARCH(21)VNI
vn.garch21n.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "norm")
vn.garch21n.fit <- ugarchfit(spec = vn.garch21n.spec, tsVNI)
vn.garch21t.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "std")
vn.garch21t.fit <- ugarchfit(spec = vn.garch21t.spec, tsVNI)
vn.garch21st.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)),mean.model = list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "sstd")
vn.garch21st.fit <- ugarchfit(spec = vn.garch21st.spec, tsVNI)

vn.garch21g.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "ged")
vn.garch21g.fit <- ugarchfit(spec = vn.garch21g.spec, tsVNI)
vn.garch21sg.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 1)),mean.model = list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "sged")
vn.garch21sg.fit <- ugarchfit(spec = vn.garch21sg.spec, tsVNI)
# GJR-GARCH(22)VNI
vn.garch22n.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "norm")
vn.garch22n.fit <- ugarchfit(spec = vn.garch22n.spec, tsVNI)
vn.garch22t.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "std")
vn.garch22t.fit <- ugarchfit(spec = vn.garch22t.spec, tsVNI)
vn.garch22st.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)),mean.model = list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "sstd")
vn.garch22st.fit <- ugarchfit(spec = vn.garch22st.spec, tsVNI)
vn.garch22g.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)), mean.model= list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "ged")
vn.garch22g.fit <- ugarchfit(spec = vn.garch22g.spec, tsVNI)
vn.garch22sg.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(2, 2)),mean.model = list(armaOrder = c(2, 2), include.mean = TRUE), distribution.model = "sged")
vn.garch22sg.fit <- ugarchfit(spec = vn.garch22sg.spec, tsVNI)

5. LỰA CHỌN MÔ HÌNH BIÊN PHÙ HỢP

5.1. LỰA CHỌN MÔ HÌNH BIÊN PHÙ HỢP NHẤT CHO CHUỖI VNI

vn.model.list <- list(garch11n = vn.garch11n.fit, garch11t = vn.garch11t.fit, garch11st = vn.garch11st.fit,garch11g = vn.garch11g.fit, garch11sg = vn.garch11sg.fit, garch12n = vn.garch12n.fit, garch12t = vn.garch12t.fit, garch12st = vn.garch12st.fit, garch12g =vn.garch12g.fit, garch12sg = vn.garch12sg.fit, garch21n = vn.garch21n.fit, garch21t = vn.garch21t.fit, garch21st = vn.garch21st.fit, garch21g =vn.garch21g.fit, garch21sg = vn.garch21sg.fit, garch22n = vn.garch22n.fit, garch22t = vn.garch22t.fit, garch22st = vn.garch22st.fit, garch22g =vn.garch22g.fit, garch22sg = vn.garch22sg.fit)
vn.info.mat <- sapply(vn.model.list, infocriteria)
rownames(vn.info.mat)<-rownames(infocriteria(vn.garch11n.fit))
vn.info.mat
##               garch11n  garch11t garch11st  garch11g garch11sg  garch12n
## Akaike       -6.031198 -6.169380 -6.188726 -6.162834 -6.180806 -6.026379
## Bayes        -5.997582 -6.132029 -6.147640 -6.125483 -6.139720 -5.989028
## Shibata      -6.031279 -6.169481 -6.188847 -6.162934 -6.180927 -6.026479
## Hannan-Quinn -6.018634 -6.155420 -6.173370 -6.148874 -6.165450 -6.012419
##               garch12t garch12st  garch12g garch12sg  garch21n  garch21t
## Akaike       -6.168730 -6.188242 -6.162125 -6.182412 -6.030428 -6.170462
## Bayes        -6.127644 -6.143421 -6.121039 -6.137591 -5.989342 -6.125641
## Shibata      -6.168852 -6.188387 -6.162246 -6.182556 -6.030550 -6.170607
## Hannan-Quinn -6.153374 -6.171490 -6.146769 -6.165660 -6.015072 -6.153710
##              garch21st  garch21g garch21sg  garch22n  garch22t garch22st
## Akaike       -6.191820 -6.170359 -6.179975 -6.029005 -6.169039 -6.190396
## Bayes        -6.143263 -6.125538 -6.131418 -5.984184 -6.120483 -6.138105
## Shibata      -6.191989 -6.170503 -6.180144 -6.029149 -6.169208 -6.190592
## Hannan-Quinn -6.173671 -6.153607 -6.161826 -6.012253 -6.150891 -6.170852
##               garch22g garch22sg
## Akaike       -6.162231 -6.178551
## Bayes        -6.113675 -6.126260
## Shibata      -6.162400 -6.178747
## Hannan-Quinn -6.144083 -6.159007
vn.inds <- which(vn.info.mat == min(vn.info.mat), arr.ind=TRUE)
model.vn <- colnames(vn.info.mat)[vn.inds[,2]]
model.vn
## [1] "garch21st"

5.2. LỰA CHỌN MÔ HÌNH BIÊN PHÙ HỢP NHẤT CHO CHUỖI SETI

seti.model.list <- list(garch11n = seti.garch11n.fit, garch11t = seti.garch11t.fit,garch11st=seti.garch11st.fit, garch11g = seti.garch11g.fit, garch11sg = seti.garch11sg.fit,garch12n = seti.garch12n.fit, garch12t = seti.garch12t.fit, garch12st = seti.garch12st.fit,garch12g = seti.garch12g.fit, garch12sg = seti.garch12sg.fit,garch21n = seti.garch21n.fit, garch21t = seti.garch21t.fit, garch21st = seti.garch21st.fit,garch21g = seti.garch21g.fit, garch21sg = seti.garch21sg.fit, garch22n = seti.garch22n.fit, garch22t =seti.garch22t.fit, garch22st = seti.garch22st.fit, garch22g = seti.garch22g.fit, garch22sg = seti.garch22sg.fit)
seti.info.mat <- sapply(seti.model.list, infocriteria)

rownames(seti.info.mat) <- rownames(infocriteria(seti.garch11n.fit))
seti.info.mat
##               garch11n  garch11t garch11st  garch11g garch11sg  garch12n
## Akaike       -6.754805 -6.817557 -6.825277 -6.807757 -6.819077 -6.752890
## Bayes        -6.732395 -6.791411 -6.795397 -6.781611 -6.789197 -6.726744
## Shibata      -6.754842 -6.817606 -6.825342 -6.807806 -6.819142 -6.752939
## Hannan-Quinn -6.746429 -6.807785 -6.814109 -6.797985 -6.807909 -6.743118
##               garch12t garch12st  garch12g garch12sg  garch21n  garch21t
## Akaike       -6.815717 -6.823440 -6.805946 -6.817285 -6.753050 -6.815654
## Bayes        -6.785836 -6.789824 -6.776065 -6.783669 -6.723169 -6.782038
## Shibata      -6.815781 -6.823521 -6.806011 -6.817366 -6.753115 -6.815735
## Hannan-Quinn -6.804549 -6.810876 -6.794778 -6.804721 -6.741882 -6.803090
##              garch21st  garch21g garch21sg  garch22n  garch22t garch22st
## Akaike       -6.823044 -6.805745 -6.816632 -6.751627 -6.814339 -6.821684
## Bayes        -6.785693 -6.772129 -6.779282 -6.718012 -6.776988 -6.780598
## Shibata      -6.823144 -6.805826 -6.816733 -6.751709 -6.814439 -6.821806
## Hannan-Quinn -6.809083 -6.793181 -6.802672 -6.739063 -6.800379 -6.806328
##               garch22g garch22sg
## Akaike       -6.804368 -6.815222
## Bayes        -6.767017 -6.774136
## Shibata      -6.804468 -6.815343
## Hannan-Quinn -6.790408 -6.799865
seti.inds <- which(seti.info.mat == min(seti.info.mat), arr.ind = TRUE)
model.seti <- colnames(seti.info.mat)[seti.inds[, 2]]
model.seti
## [1] "garch11st"

6. THAM SỐ ƯỚC LƯỢNG MÔ HÌNH BIÊN PHÙ HỢP NHẤT:

vn.garch21st.fit
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(2,1)
## Mean Model   : ARFIMA(2,0,2)
## Distribution : sstd 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error    t value Pr(>|t|)
## mu      0.000306    0.000276   1.110100 0.266956
## ar1    -0.965442    0.039883 -24.206619 0.000000
## ar2    -0.884502    0.080041 -11.050586 0.000000
## ma1     0.998065    0.031621  31.563440 0.000000
## ma2     0.916532    0.064962  14.108768 0.000000
## omega   0.000006    0.000001   5.070666 0.000000
## alpha1  0.000000    0.034772   0.000006 0.999995
## alpha2  0.043830    0.038462   1.139555 0.254472
## beta1   0.870317    0.016139  53.927637 0.000000
## gamma1  0.367808    0.101054   3.639718 0.000273
## gamma2 -0.253131    0.092194  -2.745621 0.006040
## skew    0.825169    0.031515  26.183465 0.000000
## shape   4.064768    0.414307   9.811014 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error    t value Pr(>|t|)
## mu      0.000306    0.000310   0.986309 0.323982
## ar1    -0.965442    0.029769 -32.430823 0.000000
## ar2    -0.884502    0.122135  -7.242022 0.000000
## ma1     0.998065    0.022092  45.178360 0.000000
## ma2     0.916532    0.098481   9.306641 0.000000
## omega   0.000006    0.000002   3.381772 0.000720
## alpha1  0.000000    0.031700   0.000007 0.999994
## alpha2  0.043830    0.038150   1.148872 0.250609
## beta1   0.870317    0.013005  66.919206 0.000000
## gamma1  0.367808    0.085493   4.302218 0.000017
## gamma2 -0.253131    0.087239  -2.901583 0.003713
## skew    0.825169    0.033205  24.850473 0.000000
## shape   4.064768    0.395831  10.268954 0.000000
## 
## LogLikelihood : 4362.753 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.1918
## Bayes        -6.1433
## Shibata      -6.1920
## Hannan-Quinn -6.1737
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                          statistic   p-value
## Lag[1]                       3.240 0.0718632
## Lag[2*(p+q)+(p+q)-1][11]     8.209 0.0004455
## Lag[4*(p+q)+(p+q)-1][19]    12.091 0.1839062
## d.o.f=4
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                          statistic p-value
## Lag[1]                       2.075  0.1498
## Lag[2*(p+q)+(p+q)-1][8]      2.968  0.6914
## Lag[4*(p+q)+(p+q)-1][14]     5.126  0.7537
## d.o.f=3
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[4]   0.06077 0.500 2.000  0.8053
## ARCH Lag[6]   0.11087 1.461 1.711  0.9864
## ARCH Lag[8]   0.62063 2.368 1.583  0.9712
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  6.5797
## Individual Statistics:              
## mu     0.26388
## ar1    0.06189
## ar2    0.19050
## ma1    0.08022
## ma2    0.16516
## omega  0.67789
## alpha1 0.06682
## alpha2 0.05680
## beta1  0.07981
## gamma1 0.07785
## gamma2 0.07532
## skew   0.13648
## shape  0.08689
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          2.89 3.15 3.69
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value    prob sig
## Sign Bias            1.324 0.18584    
## Negative Sign Bias   1.720 0.08557   *
## Positive Sign Bias   1.110 0.26705    
## Joint Effect         6.508 0.08935   *
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     39.28     0.004057
## 2    30     55.18     0.002362
## 3    40     58.43     0.023464
## 4    50     69.06     0.030978
## 
## 
## Elapsed time : 1.711117
seti.garch11st.fit
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(1,0,0)
## Distribution : sstd 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.000366    0.000217 -1.68456 0.092074
## ar1     0.024742    0.027082  0.91359 0.360934
## omega   0.000003    0.000004  0.74441 0.456631
## alpha1  0.021362    0.022226  0.96111 0.336496
## beta1   0.882705    0.023965 36.83272 0.000000
## gamma1  0.119083    0.029759  4.00153 0.000063
## skew    0.875611    0.033034 26.50642 0.000000
## shape   5.903650    0.932408  6.33162 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.000366    0.000495 -0.73940 0.459664
## ar1     0.024742    0.048525  0.50989 0.610132
## omega   0.000003    0.000027  0.10686 0.914899
## alpha1  0.021362    0.129252  0.16527 0.868729
## beta1   0.882705    0.128528  6.86783 0.000000
## gamma1  0.119083    0.093003  1.28042 0.200398
## skew    0.875611    0.056889 15.39164 0.000000
## shape   5.903650    1.702178  3.46829 0.000524
## 
## LogLikelihood : 4802.757 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.8253
## Bayes        -6.7954
## Shibata      -6.8253
## Hannan-Quinn -6.8141
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      1.309  0.2526
## Lag[2*(p+q)+(p+q)-1][2]     1.374  0.5097
## Lag[4*(p+q)+(p+q)-1][5]     2.790  0.4860
## d.o.f=1
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.1137  0.7359
## Lag[2*(p+q)+(p+q)-1][5]    3.9049  0.2662
## Lag[4*(p+q)+(p+q)-1][9]    5.3572  0.3789
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]     4.737 0.500 2.000 0.02952
## ARCH Lag[5]     5.697 1.440 1.667 0.07074
## ARCH Lag[7]     5.887 2.315 1.543 0.14900
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  7.5132
## Individual Statistics:              
## mu     0.09630
## ar1    0.04243
## omega  0.85619
## alpha1 0.27775
## beta1  0.14873
## gamma1 0.06361
## skew   0.06598
## shape  0.04847
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.89 2.11 2.59
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value   prob sig
## Sign Bias           1.3769 0.1687    
## Negative Sign Bias  0.9885 0.3231    
## Positive Sign Bias  0.3875 0.6985    
## Joint Effect        2.1717 0.5376    
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     11.24       0.9154
## 2    30     25.41       0.6567
## 3    40     39.19       0.4616
## 4    50     48.13       0.5083
## 
## 
## Elapsed time : 0.4570529

7. KIỂM ĐỊNH SỰ PHÙ HỢP CỦA MÔ HÌNH BIÊN

seti.res <- residuals(seti.garch11st.fit)/sigma(seti.garch11st.fit)
fitdist(distribution = "sstd", seti.res, control = list())
## $pars
##         mu      sigma       skew      shape 
## 0.01189854 0.99227744 0.88124855 6.00644104 
## 
## $convergence
## [1] 0
## 
## $values
## [1] 2068.117 1932.468 1932.468
## 
## $lagrange
## [1] 0
## 
## $hessian
##             [,1]       [,2]        [,3]      [,4]
## [1,] 1761.381361  323.99940 -481.508214  5.008668
## [2,]  323.999399 2011.57727  130.597322 38.268395
## [3,] -481.508214  130.59732 1195.814434  3.645681
## [4,]    5.008668   38.26839    3.645681  1.953110
## 
## $ineqx0
## NULL
## 
## $nfuneval
## [1] 114
## 
## $outer.iter
## [1] 2
## 
## $elapsed
## Time difference of 0.07715392 secs
## 
## $vscale
## [1] 1 1 1 1 1
u <- pdist(distribution = "sstd", q = seti.res, mu = -0.03294783 , sigma = 1.00098561 , skew =  0.88663219 , shape = 6.27208051 )
## Trích xuất chuỗi phần dư v của chuỗi lợi suất VN
vn.res <- residuals(vn.garch21st.fit)/sigma(vn.garch21st.fit)
fitdist(distribution = "sstd", vn.res, control = list())
## $pars
##           mu        sigma         skew        shape 
## -0.005743176  1.006734640  0.822052716  4.022462887 
## 
## $convergence
## [1] 0
## 
## $values
## [1] 2041.359 1861.450 1861.450
## 
## $lagrange
## [1] 0
## 
## $hessian
##           [,1]      [,2]       [,3]      [,4]
## [1,] 2124.8203  538.3958 -697.97625  30.42440
## [2,]  538.3958 1708.6974  205.35459 129.16418
## [3,] -697.9762  205.3546 1323.90914  27.78374
## [4,]   30.4244  129.1642   27.78374  14.58298
## 
## $ineqx0
## NULL
## 
## $nfuneval
## [1] 111
## 
## $outer.iter
## [1] 2
## 
## $elapsed
## Time difference of 0.07035494 secs
## 
## $vscale
## [1] 1 1 1 1 1
v <- pdist("sstd",vn.res, mu = 0.01683462, sigma = 0.99427949, skew = 0.83629797, shape =  3.99205291)

8. CÁC KIỂM ĐỊNH SỰ PHÙ HỢP CỦA MÔ HÌNH BIÊN

# Kiem dinh Anderson-Darling
library(nortest)
ad.test(v)
## 
##  Anderson-Darling normality test
## 
## data:  v
## A = 14.959, p-value < 2.2e-16
ad.test(v)
## 
##  Anderson-Darling normality test
## 
## data:  v
## A = 14.959, p-value < 2.2e-16

9. KIỂM ĐỊNH CRAMER-VON MISES

# Null hypothesis: uniform distribution
cvm.test(u)
## Warning in cvm.test(u): p-value is smaller than 7.37e-10, cannot be computed
## more accurately
## 
##  Cramer-von Mises normality test
## 
## data:  u
## W = 1.9606, p-value = 7.37e-10
cvm.test(v)
## Warning in cvm.test(v): p-value is smaller than 7.37e-10, cannot be computed
## more accurately
## 
##  Cramer-von Mises normality test
## 
## data:  v
## W = 1.9153, p-value = 7.37e-10

10. KIỂM ĐỊNH KS-TEST

#Null hypothesis: uniform distribution
ks.test(u, v)
## 
##  Asymptotic two-sample Kolmogorov-Smirnov test
## 
## data:  u and v
## D = 0.059786, p-value = 0.01318
## alternative hypothesis: two-sided
ks.test(v, "punif")
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  v
## D = 0.033662, p-value = 0.08282
## alternative hypothesis: two-sided

11. ƯỚC LƯỢNG THAM SỐ MÔ HÌNH COPULA

library(VineCopula)
## Warning: package 'VineCopula' was built under R version 4.3.3
BiCopSelect(u, v, familyset= NA, selectioncrit="AIC",indeptest = FALSE, level = 0.05) 
## Bivariate copula: Survival Gumbel (par = 1.17, tau = 0.15)
Stu <- BiCopEst(u, v, family = 2, method = "mle", se = T, max.df = 10)

summary(Stu)
## Family
## ------ 
## No:    2
## Name:  t
## 
## Parameter(s)
## ------------
## par:  0.23  (SE = 0.03)
## par2: 10  (SE = NA)
## Dependence measures
## -------------------
## Kendall's tau:    0.15 (empirical = 0.14, p value < 0.01)
## Upper TD:         0.02 
## Lower TD:         0.02 
## 
## Fit statistics
## --------------
## logLik:  44.02 
## AIC:    -84.03 
## BIC:    -73.53

12. TÍNH TOÁN THAM SỐ ĐỂ TẠO BIỂU ĐỒ COPULA SURVIVAL JOE

library(copula)
## Warning: package 'copula' was built under R version 4.3.3
## 
## Attaching package: 'copula'
## The following object is masked from 'package:VineCopula':
## 
##     pobs
# Thiết lập Joe copula với tham số par = 1.07
theta <- 1.07
joe_cop <- joeCopula(param = theta)
# Kiểm tra Kendall's tau của Joe copula
tau <- tau(joe_cop)
print(tau)
## [1] 0.03879337
tnt <- cbind(u, v)
fit <- fitCopula(joeCopula(), data = tnt, method = "ml")  
## Warning in fitCopula.ml(copula, u = data, method = method, start = start, :
## possible convergence problem: optim() gave code=52
# Maximum Likelihood Estimation (MLE)
theta <- coef(fit)
print(theta)
##    alpha 
## 1.121689
joe_cop <- joeCopula(param = theta)
tau <- tau(joe_cop)
print(tau)
##      alpha 
## 0.06532958
par.joeh<-BiCopTau2Par(6, .04, check.taus = TRUE)
par.joel<-BiCopTau2Par(36, -.04, check.taus = TRUE)
obj.joeh <- BiCop(family = 6, par = par.joeh)
obj.joel <- BiCop(family = 36, par = par.joel)
sim.joeh<-BiCopSim(1409,obj.joeh)
sim.joel<-BiCopSim(1409,obj.joel)
plot(sim.joeh, xlab=expression("u"[1]),ylab=expression("u"[2]),xlim=c(0,1),ylim=c(0,1))

13. ĐỒ THỊ PHÂN TÁN

# Vẽ đồ thị phân tán
plot(u, main = "Đồ thị phân tán của biến VNI")

plot(v, main = "Đồ thị phân tán của biến SETI")

14. ĐỒ THỊ MẬT ĐỘ

# Tính toán hàm mật độ và vẽ đồ thị
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
kde2d_plot <- kde2d(tnt[,1], tnt[,2], n = 50)
persp(kde2d_plot, phi = 50, theta = coef(fit), main = "Đồ thị mật độ của copula JOE")

15. BẢN ĐỒ NHIỆT KERNEL

# Vẽ bản đồ nhiệt của hàm mật độ kernel
image(kde2d_plot, main = "Bản đồ nhiệt của hàm mật độ kernel")
# Vẽ các đường đồng mức của hàm mật độ kernel
contour(kde2d_plot, add = TRUE)

17. ƯỚC LƯỢNG SO SÁNH VỚI CÁC MÔ HÌNH COPULA KHÁC

# Ước lượng và so sánh với một số mô hình copula khác
fit_clayton <- fitCopula(claytonCopula(), data = tnt, method = "ml")
fit_gumbel <- fitCopula(gumbelCopula(), data = tnt, method = "ml")
# In các tham số ước lượng
print(coef(fit_clayton))
##     alpha 
## 0.3341853
print(coef(fit_gumbel))
##    alpha 
## 1.132574
# Load necessary libraries
library(copula)
library(MASS)

# Define the parameter for the Joe copula
theta <- 1.07  # Tham số của bạn

# Create the Joe copula object
joe_copula <- joeCopula(param = theta)

# Generate a sample from the Joe copula
set.seed(123)
n <- 1409
sample <- rCopula(n, joe_copula)

# Perform Kernel Density Estimation
kde2d_plot <- kde2d(tnt[,1], tnt[,2], n = 50)

# Plot the density
persp(kde2d_plot, phi = 50, theta = 50, col = "lightblue",
      xlab = "U", ylab = "V", zlab = "Density", 
      main = "Density Plot of Joe Copula")

# Load necessary libraries
library(copula)
library(MASS)
library(scatterplot3d)

# Define the parameter for the Joe copula
theta <- 1.07

# Create the Joe copula object
joe_copula <- joeCopula(param = theta)


# Perform Kernel Density Estimation
kde2d_result <- kde2d(tnt[,1], tnt[,2], n = 50)

# Convert kde2d result to a format suitable for scatterplot3d
x <- kde2d_result$x
y <- kde2d_result$y
z <- kde2d_result$z

# Create a grid of points for scatterplot3d
grid <- expand.grid(x = x, y = y)

# Flatten z for scatterplot3d
z_flat <- as.vector(z)

# Plot the density using scatterplot3d
scatterplot3d(grid$x, grid$y, z_flat, type = "h", angle = 30, 
              main = "Density Plot of Joe Copula",
              xlab = "Rainfall Depth", 
              ylab = "Shot Duration", 
              zlab = "Bivariate Distribution",
              pch = 20, color = "turquoise")

# Load necessary libraries
library(copula)
library(MASS)

# Define the parameter for the Joe copula
theta <- 1.07

# Create the Joe copula object
joe_copula <- joeCopula(param = theta)

# Perform Kernel Density Estimation
kde2d_result <- kde2d(tnt[,1], tnt[,2], n = 1409)

# Extract the results
x <- kde2d_result$x
y <- kde2d_result$y
z <- kde2d_result$z

# Plot the PDF using persp
persp(x, y, z, phi = 30, theta = 1.07, col = "red", 
      xlab = "Discharge", ylab = "Duration", zlab = "Density", 
      main = "PDF of Joe Copula")

# Plot the contour plot
contour(x, y, z, xlab = "Discharge", ylab = "Duration", 
        main = "Contour Plot of Joe Copula")

# Load the required libraries
library(copula)
library(ggplot2)
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.3.3
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
# Define the Joe copula
joe_copula <- joeCopula(param = 1.07)

# Create histograms of marginal distributions
p_hist_X1 <- ggplot(tnt, aes(x = tsVNI)) +
  geom_histogram(bins = 30, fill = "skyblue", color = "black") +
  ggtitle("Phân Phối Marginal của X1") +
  xlab("X1") +
  ylab("Số lượng") +
  theme_minimal()

p_hist_X2 <- ggplot(tnt, aes(x = tsSETI)) +
  geom_histogram(bins = 30, fill = "salmon", color = "black") +
  ggtitle("Phân Phối Marginal của X2") +
  xlab("X2") +
  ylab("Số lượng") +
  theme_minimal()

# Arrange histograms side by side
grid.arrange(p_hist_X1, p_hist_X2, ncol = 2)

library(copula)
library(VineCopula)
a <- BiCopSelect(u,v, familyset = c(1:10), selectioncrit = "AIC", indeptest = FALSE, level = 0.05)
sur.joe <- joeCopula(param= 1.07)
fit <- fitCopula(sur.joe, data= as.matrix(cbind(u,v)),method="ml")
## Warning in fitCopula.ml(copula, u = data, method = method, start = start, :
## possible convergence problem: optim() gave code=52
coef(fit)
##    alpha 
## 1.121689
a$par
## [1] 1.170376
a$par2
## [1] 0
persp(joeCopula(param = a$par), dCopula, col= "pink", border= "black")

LS0tDQp0aXRsZTogIlRJ4buCVSBMVeG6rE4gTcOUIEjDjE5IIE5H4bqqVSBOSEnDik4iDQphdXRob3I6ICJRdeG7s25oIEdpYW8iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIDEuxq/hu5pDIEzGr+G7ok5HIE3DlCBIw4xOSCBDT1BVTEEgDQoNCiMjIDEuMS4gR8OBTiBE4buuIExJ4buGVQ0KDQpgYGB7cn0NCmxpYnJhcnkoeGxzeCkgDQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KI05o4bqtcCBk4buvIGxp4buHdQ0KZGF0YSA8LSByZWFkLnhsc3goJ0M6L1VzZXJzL2FkbWluL09uZURyaXZlIC0gVUZNL0RvY3VtZW50cy90aG5uMS9USE5OMS92bmlzZXQueGxzeCcsIHNoZWV0SW5kZXggPSAxLCBoZWFkZXIgPSBUKQ0KIyBUw61uaCBs4bujaSBzdeG6pXQgbG9nYXJpdCBow6BuZyBuZ8OgeSBj4bunYSBj4buVIHBoaeG6v3UgVk5JIHbDoCBOWUENCnRzVk5JIDwtIGRpZmYobG9nKGRhdGEkVk5JKSwgbGFnID0gMSkNCnRzU0VUSSA8LSBkaWZmKGxvZyhkYXRhJFNFVEkpLCBsYWcgPSAxKQ0KIyBU4bqhbyBt4buZdCBkYXRhIGZyYW1lIG3hu5tpIGNo4bupYSBs4bujaSBzdeG6pXQgbG9nYXJpdCBow6BuZyBuZ8OgeSBj4bunYSBj4bqjIGhhaSBj4buVIHBoaeG6v3UNCnJ0IDwtIGRhdGEuZnJhbWUodHNWTkkgPSB0c1ZOSSwgdHNTRVRJID0gdHNTRVRJKQ0Kc3VtbWFyeShkYXRhKQ0KYGBgDQoNCiMjIDEuMi4gTUEgVFLhuqxOIEjhu4YgU+G7kCANCg0KYGBge3J9DQpyZXMgPC0gY29yKHJ0KQ0Kcm91bmQgPC0gcm91bmQocmVzLCAzKQ0KbGlicmFyeShjb3JycGxvdCkNCmNvcnJwbG90KHJlcywgdHlwZSA9ICJ1cHBlciIsIG9yZGVyID0gImhjbHVzdCIsIA0KICAgICAgICAgdGwuY29sID0gImJsYWNrIiwgdGwuc3J0ID0gNDUpDQpgYGANCmBgYHtyfQ0KY2hhcnQuQ29ycmVsYXRpb24ocnQsIGhpc3RvZ3JhbT1UUlVFLCBwY2g9MTkpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdnY29ycnBsb3QpDQpkZiA8LSBkcGx5cjo6c2VsZWN0X2lmKHJ0LCBpcy5udW1lcmljKQ0KciA8LSBjb3IoZGYsIHVzZT0iY29tcGxldGUub2JzIikNCmdnY29ycnBsb3QocikNCmBgYA0KDQoNCioqQmnhur9uIMSR4buZbmcgY+G7p2EgY2h14buXaSB04bu3IHN14bqldCBs4bujaSBuaHXhuq1uKioNCmBgYHtyfQ0KcGxvdC50cyhydCR0c1ZOSSkNCmBgYA0KDQoqKkJp4bq/biDEkeG7mW5nIGPhu6dhIGNodeG7l2kgdOG7tyBzdeG6pXQgbOG7o2kgbmh14bqtbiBTRVRJKioNCmBgYHtyfQ0KcGxvdC50cyhydCR0c1NFVEkpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXIpDQpwaXZvdF9sb25nZXIocnQsIGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlRTTE4iLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAlPiUgZ2dwbG90KGFlcyh4ID0gVFNMTiwgeSA9IFZhbHVlKSkgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICJjeWFuIiwgY29sb3IgPSAiYmxhY2siKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiSMOsbmggNzogQmnhu4N1IMSR4buTIGjhu5lwIGPhu6dhIFRTTE4gVk5JIHbDoCBTRVRJIiwNCiAgICAgICB4ID0gIkNo4buJIHPhu5EiLA0KICAgICAgIHkgPSAiVOG7tyBzdeG6pXQgc2luaCBs4bujaSIpDQpgYGANCg0KIyAyLiBLSeG7gk0gxJDhu4pOSCBE4buuIExJ4buGVQ0KDQojIyAyLjEuIEtJ4buCTSDEkOG7ik5IIFTDjU5IIEThu6pORw0KDQpgYGB7cn0NCmxpYnJhcnkodHNlcmllcykNCiNLaeG7g20gxJHhu4tuaCB0w61uaCBk4burbmcgY+G7p2EgY2h14buXaSBWTkkNCmFkZl92bmkgPC0gYWRmLnRlc3QocnQkdHNWTkkpDQpwcmludChhZGZfdm5pKQ0KYGBgDQpgYGB7cn0NCiNLaeG7g20gxJHhu4tuaCB0w61uaCBk4burbmcgY+G7p2EgY2h14buVaSBTRVRJDQphZGZfc2V0aSA8LSBhZGYudGVzdChydCR0c1NFVEkpDQpwcmludChhZGZfc2V0aSkNCmBgYA0KDQojIyAyLjIuIEtJ4buCTSDEkOG7ik5IIFBIw4JOIFBI4buQSSBDSFXhuqhOIA0KDQpgYGB7Un0NCiMga2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4gY+G7p2EgVk5JDQpsaWJyYXJ5KHRzZXJpZXMpDQpqcV92bmkgPC0gamFycXVlLmJlcmEudGVzdChydCR0c1ZOSSkNCnByaW50KGpxX3ZuaSkNCmBgYA0KDQpgYGB7cn0NCiMga2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4gY+G7p2EgU0VUSQ0KanFfc2V0aSA8LSBqYXJxdWUuYmVyYS50ZXN0KHJ0JHRzU0VUSSkNCnByaW50KGpxX3NldGkpDQpgYGANCg0KIyAzLiBNw5QgSMOMTkggQVJJTUEgICAgDQoNCmBgYHtyfQ0KbGlicmFyeShGaW5UUykNCiMgxq/hu5tjIGzGsOG7o25nIHbDoCB0csOtY2ggeHXhuqV0IHBo4bqnbiBkxrAgdOG7qyBtw7QgaMOsbmggQVJNQSB04buRaSDGsHUNCmxpYnJhcnkocnVnYXJjaCkNCmFyaW1hX1ZOSSA8LSBhdXRvYXJmaW1hKHJ0JHRzVk5JLGFyLm1heCA9IDIsIG1hLm1heCA9IDIsIGNyaXRlcmlvbiA9ICdBSUMnLCBtZXRob2QgPSAiZnVsbCIpDQoNCmFyaW1hX3NldGkgPC0gYXV0b2FyZmltYShydCR0c1NFVEksYXIubWF4ID0gMiwgbWEubWF4ID0gMiwgY3JpdGVyaW9uID0gJ0FJQycsIG1ldGhvZCA9ICJmdWxsIikNCg0KcmVfVk5JIDwtIGFyaW1hX1ZOSSRmaXRAZml0JHJlc2lkdWFscw0KcmVfc2V0aSA8LSBhcmltYV9zZXRpJGZpdEBmaXQkcmVzaWR1YWxzDQojS2nhu4NtIMSR4buLbmggdMawxqFuZyBxdWFuIGNodeG7l2kgYuG6rWMgMiBjaG8gcGjhuqduIGTGsA0KbGpfdm5pIDwtIEJveC50ZXN0KHJlX1ZOSSx0eXBlID0gJ0xqdW5nLUJveCcsIGxhZyA9IDIpDQpsal9zZXRpIDwtIEJveC50ZXN0KHJlX3NldGksdHlwZSA9ICdManVuZy1Cb3gnLCBsYWcgPSAyKQ0KDQojS2nhu4NtIMSR4buLbmggdMawxqFuZyBxdWFuIGNodeG7l2kgYuG6rWMgMiBjaG8gcGjhuqduIGTGsCBiw6xuaCBwaMawxqFuZw0KbGpfdm5pMiA8LSBCb3gudGVzdChyZV9WTkleMix0eXBlID0gJ0xqdW5nLUJveCcsIGxhZyA9IDIpDQpsal9zZXRpMiA8LSBCb3gudGVzdChyZV9zZXRpXjIsdHlwZSA9ICdManVuZy1Cb3gnLCBsYWcgPSAyKQ0KDQojS2nhu4NtIMSR4buLbmggaGnhu4d1IOG7qW5nIEFSQ0gNCmFyX3ZuaSA8LSBBcmNoVGVzdChyZV9WTkksIGxhZ3MgPSAyKQ0KYXJfc2V0aSA8LSBBcmNoVGVzdChyZV9zZXRpLCBsYWdzID0gMikNCg0KI1Ryw6xuaCBiw6B5IGvhur90IHF14bqjDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShkcGx5cikNCnRlc3RfcmVzdWx0IDwtIGRhdGEuZnJhbWUoVGVzdCA9IGMoIkFERiIsIkotQiIsIlEoMikiLCJRKDIpXjIiLCAiQVJDSCgyKSIpLFBfdmFsdWVfVk5JID0gYyhhZGZfdm5pJHAudmFsdWUsIGpxX3ZuaSRwLnZhbHVlLCBsal92bmkkcC52YWx1ZSwgbGpfdm5pMiRwLnZhbHVlLCBhcl92bmkkcC52YWx1ZSksIFBfdmFsdWVfU1RJID0gYyhhZGZfc2V0aSRwLnZhbHVlLCBqcV9zZXRpJHAudmFsdWUsIGxqX3NldGkkcC52YWx1ZSwgbGpfc2V0aTIkcC52YWx1ZSwgYXJfc2V0aSRwLnZhbHVlKSkgDQprYWJsZSh0ZXN0X3Jlc3VsdCwgY2FwdGlvbiA9ICJC4bqjbmcgMzogS+G6v3QgcXXhuqMgY8OhYyBraeG7g20gxJHhu4tuaCIsIGxhYmVsID0gJ0doaSBjaMO6OiBRICgyKSBhbmQgUTIgKDIpIGzhuqduIGzGsOG7o3QgbMOgIGtp4buDbSDEkeG7i25oIExqdW5nLUJveCBRMiBjaG8gdMawxqFuZyBxdWFuIGNodeG7l2kgYuG6rWMgMiBj4bunYSBwaOG6p24gZMawIHbDoCBiw6xuaCBwaMawxqFuZyBwaOG6p24gZMawIGPhu6dhIGzhu6NpIHN14bqldCcsIGZvcm1hdCA9ICdwYW5kb2MnKSAlPiUga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQoNCg0KYGBge3J9DQpjaGFydC5Db3JyZWxhdGlvbihydCwgaGlzdG9ncmFtPVRSVUUsIHBjaD0xOSkNCmBgYA0KDQpgYGB7cn0NCnJ0ICU+JSBnZ3Bsb3QoYWVzKHRzVk5JLCB0c1NFVEkpKSArDQogICAgICAgICAgICAgIGdlb21fcG9pbnQoY29sID0gJyNCQjAwMDAnLHNoYXBlID0gVFJVRSkgKyANCiAgICAgICAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJyxzZSA9IFQsIGNvbCA9ICcjQ0NGRkZGJykgKyAjdGjDqm0gxJHGsOG7nW5nIGjhu5NpIHF1eSB24bubaSBwaMawxqFuZyBwaMOhcCBo4buTaSBxdXkgdHV54bq/biB0w61uaCAgDQogICAgICAgICAgICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTE6IEJp4buDdSDEkeG7kyBTY2F0dGVyIFRTTE4gY+G7p2EgU0VUSSB2w6AgVk5JJywgeCA9ICdWTkknLCB5ID0gJ1NFVEknKQ0KYGBgDQoNCiMgNC4gTcOUIEjDjE5IIEdBUkNIIA0KDQojIyA0LjEuIFNFVEkNCg0KYGBge3J9DQojIEdKUi1HQVJDSCgxMSlTRVRJDQpzZXRpLmdhcmNoMTFuLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWw9ImdqckdBUkNIIixnYXJjaE9yZGVyPWMoMSwxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyPWMoMSwwKSxpbmNsdWRlLm1lYW49VFJVRSksZGlzdHJpYnV0aW9uLm1vZGVsID0gIm5vcm0iKQ0Kc2V0aS5nYXJjaDExbi5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSBzZXRpLmdhcmNoMTFuLnNwZWMsICB0c1NFVEkpDQpzZXRpLmdhcmNoMTF0LnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzdGQiKQ0KIHNldGkuZ2FyY2gxMXQuZml0IDwtIHVnYXJjaGZpdChzcGVjID1zZXRpLmdhcmNoMTF0LnNwZWMsIHRzU0VUSSkNCnNldGkuZ2FyY2gxMXN0LnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzc3RkIikNCiBzZXRpLmdhcmNoMTFzdC5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSBzZXRpLmdhcmNoMTFzdC5zcGVjLCB0c1NFVEkpDQpzZXRpLmdhcmNoMTFnLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJnZWQiKQ0Kc2V0aS5nYXJjaDExZy5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSBzZXRpLmdhcmNoMTFnLnNwZWMsIHRzU0VUSSkNCnNldGkuZ2FyY2gxMXNnLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzZ2VkIikNCnNldGkuZ2FyY2gxMXNnLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHNldGkuZ2FyY2gxMXNnLnNwZWMsIHRzU0VUSSkNCg0KIyAgR0pSLUdBUkNIKDEyKVNFVEkNCnNldGkuZ2FyY2gxMm4uc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDIpKSxtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDEsIDApLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gIm5vcm0iKQ0Kc2V0aS5nYXJjaDEybi5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSBzZXRpLmdhcmNoMTJuLnNwZWMsIHRzU0VUSSkNCnNldGkuZ2FyY2gxMnQuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDIpKSxtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDEsIDApLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gInN0ZCIpDQpzZXRpLmdhcmNoMTJ0LmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHNldGkuZ2FyY2gxMnQuc3BlYywgdHNTRVRJKQ0Kc2V0aS5nYXJjaDEyc3Quc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDIpKSxtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDEsIDApLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gInNzdGQiKQ0Kc2V0aS5nYXJjaDEyc3QuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gc2V0aS5nYXJjaDEyc3Quc3BlYywgdHNTRVRJKQ0Kc2V0aS5nYXJjaDEyZy5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwgMikpLG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwgMCksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAiZ2VkIikNCnNldGkuZ2FyY2gxMmcuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gc2V0aS5nYXJjaDEyZy5zcGVjLCB0c1NFVEkpDQpzZXRpLmdhcmNoMTJzZy5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwgMikpLG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwgMCksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic2dlZCIpDQpzZXRpLmdhcmNoMTJzZy5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSBzZXRpLmdhcmNoMTJzZy5zcGVjLCB0c1NFVEkpDQojIEdKUi1HQVJDSCgyMSlTRVRJDQpzZXRpLmdhcmNoMjFuLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygyLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJub3JtIikNCnNldGkuZ2FyY2gyMW4uZml0IDwtIHVnYXJjaGZpdChzcGVjID0gc2V0aS5nYXJjaDIxbi5zcGVjLCB0c1NFVEkpDQpzZXRpLmdhcmNoMjF0LnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygyLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzdGQiKQ0Kc2V0aS5nYXJjaDIxdC5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSBzZXRpLmdhcmNoMjF0LnNwZWMsIHRzU0VUSSkNCnNldGkuZ2FyY2gyMXN0LnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygyLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzc3RkIikNCnNldGkuZ2FyY2gyMXN0LmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHNldGkuZ2FyY2gyMXN0LnNwZWMsIHRzU0VUSSkNCnNldGkuZ2FyY2gyMWcuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDIsIDEpKSxtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDEsIDApLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gImdlZCIpDQpzZXRpLmdhcmNoMjFnLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHNldGkuZ2FyY2gyMWcuc3BlYywgdHNTRVRJKQ0Kc2V0aS5nYXJjaDIxc2cuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDIsIDEpKSxtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDEsIDApLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gInNnZWQiKQ0Kc2V0aS5nYXJjaDIxc2cuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gc2V0aS5nYXJjaDIxc2cuc3BlYywgdHNTRVRJKQ0KIyBHSlItR0FSQ0goMjIpU0VUSQ0Kc2V0aS5nYXJjaDIybi5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMiwgMikpLG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwgMCksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAibm9ybSIpDQpzZXRpLmdhcmNoMjJuLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHNldGkuZ2FyY2gyMm4uc3BlYywgdHNTRVRJKQ0Kc2V0aS5nYXJjaDIydC5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMiwgMikpLG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwgMCksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic3RkIikNCnNldGkuZ2FyY2gyMnQuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gc2V0aS5nYXJjaDIydC5zcGVjLCB0c1NFVEkpDQpzZXRpLmdhcmNoMjJzdC5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMiwgMikpLG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwgMCksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic3N0ZCIpDQpzZXRpLmdhcmNoMjJzdC5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSBzZXRpLmdhcmNoMjJzdC5zcGVjLCB0c1NFVEkpDQpzZXRpLmdhcmNoMjJnLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygyLCAyKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJnZWQiKQ0Kc2V0aS5nYXJjaDIyZy5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSBzZXRpLmdhcmNoMjJnLnNwZWMsIHRzU0VUSSkNCnNldGkuZ2FyY2gyMnNnLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygyLCAyKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAwKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzZ2VkIikNCnNldGkuZ2FyY2gyMnNnLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHNldGkuZ2FyY2gyMnNnLnNwZWMsIHRzU0VUSSkNCmBgYA0KDQojIyA0LjIuIFZOaQ0KDQpgYGB7cn0NCiMgR0pSLUdBUkNIKDExKVZOSQ0Kdm4uZ2FyY2gxMW4uc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDEpKSwgbWVhbi5tb2RlbD0gbGlzdChhcm1hT3JkZXIgPSBjKDIsIDIpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gIm5vcm0iKQ0Kdm4uZ2FyY2gxMW4uZml0IDwtIHVnYXJjaGZpdChzcGVjID0gdm4uZ2FyY2gxMW4uc3BlYywgdHNWTkkpDQp2bi5nYXJjaDExdC5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwgMSkpLCBtZWFuLm1vZGVsPSBsaXN0KGFybWFPcmRlciA9IGMoMiwgMiksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic3RkIikNCnZuLmdhcmNoMTF0LmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHZuLmdhcmNoMTF0LnNwZWMsIHRzVk5JKQ0Kdm4uZ2FyY2gxMXN0LnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygyLCAyKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzc3RkIikNCnZuLmdhcmNoMTFzdC5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSB2bi5nYXJjaDExc3Quc3BlYywgdHNWTkkpDQp2bi5nYXJjaDExZy5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwgMSkpLCBtZWFuLm1vZGVsPSBsaXN0KGFybWFPcmRlciA9IGMoMiwgMiksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAiZ2VkIikNCnZuLmdhcmNoMTFnLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHZuLmdhcmNoMTFnLnNwZWMsIHRzVk5JKQ0Kdm4uZ2FyY2gxMXNnLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygyLCAyKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzZ2VkIikNCnZuLmdhcmNoMTFzZy5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSB2bi5nYXJjaDExc2cuc3BlYywgdHNWTkkpDQpgYGANCmBgYHtyfQ0KIyBHSlItR0FSQ0goMTIpVk5JDQp2bi5nYXJjaDEybi5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwgMikpLCBtZWFuLm1vZGVsPSBsaXN0KGFybWFPcmRlciA9IGMoMiwgMiksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAibm9ybSIpDQp2bi5nYXJjaDEybi5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSB2bi5nYXJjaDEybi5zcGVjLCB0c1ZOSSkNCnZuLmdhcmNoMTJ0LnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAyKSksIG1lYW4ubW9kZWw9IGxpc3QoYXJtYU9yZGVyID0gYygyLCAyKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzdGQiKQ0Kdm4uZ2FyY2gxMnQuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gdm4uZ2FyY2gxMnQuc3BlYywgdHNWTkkpDQp2bi5nYXJjaDEyc3Quc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDIpKSxtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDIsIDIpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gInNzdGQiKQ0Kdm4uZ2FyY2gxMnN0LmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHZuLmdhcmNoMTJzdC5zcGVjLCB0c1ZOSSkNCnZuLmdhcmNoMTJnLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAyKSksIG1lYW4ubW9kZWw9IGxpc3QoYXJtYU9yZGVyID0gYygyLCAyKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJnZWQiKQ0Kdm4uZ2FyY2gxMmcuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gdm4uZ2FyY2gxMmcuc3BlYywgdHNWTkkpDQp2bi5nYXJjaDEyc2cuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDIpKSxtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDIsIDIpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gInNnZWQiKQ0Kdm4uZ2FyY2gxMnNnLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHZuLmdhcmNoMTJzZy5zcGVjLCB0c1ZOSSkNCmBgYA0KYGBge3J9DQojIEdKUi1HQVJDSCgyMSlWTkkNCnZuLmdhcmNoMjFuLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygyLCAxKSksIG1lYW4ubW9kZWw9IGxpc3QoYXJtYU9yZGVyID0gYygyLCAyKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJub3JtIikNCnZuLmdhcmNoMjFuLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHZuLmdhcmNoMjFuLnNwZWMsIHRzVk5JKQ0Kdm4uZ2FyY2gyMXQuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDIsIDEpKSwgbWVhbi5tb2RlbD0gbGlzdChhcm1hT3JkZXIgPSBjKDIsIDIpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gInN0ZCIpDQp2bi5nYXJjaDIxdC5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSB2bi5nYXJjaDIxdC5zcGVjLCB0c1ZOSSkNCnZuLmdhcmNoMjFzdC5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMiwgMSkpLG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMiwgMiksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic3N0ZCIpDQp2bi5nYXJjaDIxc3QuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gdm4uZ2FyY2gyMXN0LnNwZWMsIHRzVk5JKQ0KDQp2bi5nYXJjaDIxZy5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMiwgMSkpLCBtZWFuLm1vZGVsPSBsaXN0KGFybWFPcmRlciA9IGMoMiwgMiksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAiZ2VkIikNCnZuLmdhcmNoMjFnLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHZuLmdhcmNoMjFnLnNwZWMsIHRzVk5JKQ0Kdm4uZ2FyY2gyMXNnLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygyLCAxKSksbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygyLCAyKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzZ2VkIikNCnZuLmdhcmNoMjFzZy5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSB2bi5nYXJjaDIxc2cuc3BlYywgdHNWTkkpDQoNCmBgYA0KYGBge3J9DQojIEdKUi1HQVJDSCgyMilWTkkNCnZuLmdhcmNoMjJuLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygyLCAyKSksIG1lYW4ubW9kZWw9IGxpc3QoYXJtYU9yZGVyID0gYygyLCAyKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJub3JtIikNCnZuLmdhcmNoMjJuLmZpdCA8LSB1Z2FyY2hmaXQoc3BlYyA9IHZuLmdhcmNoMjJuLnNwZWMsIHRzVk5JKQ0Kdm4uZ2FyY2gyMnQuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDIsIDIpKSwgbWVhbi5tb2RlbD0gbGlzdChhcm1hT3JkZXIgPSBjKDIsIDIpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gInN0ZCIpDQp2bi5nYXJjaDIydC5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSB2bi5nYXJjaDIydC5zcGVjLCB0c1ZOSSkNCnZuLmdhcmNoMjJzdC5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMiwgMikpLG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMiwgMiksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic3N0ZCIpDQp2bi5nYXJjaDIyc3QuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gdm4uZ2FyY2gyMnN0LnNwZWMsIHRzVk5JKQ0Kdm4uZ2FyY2gyMmcuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDIsIDIpKSwgbWVhbi5tb2RlbD0gbGlzdChhcm1hT3JkZXIgPSBjKDIsIDIpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gImdlZCIpDQp2bi5nYXJjaDIyZy5maXQgPC0gdWdhcmNoZml0KHNwZWMgPSB2bi5nYXJjaDIyZy5zcGVjLCB0c1ZOSSkNCnZuLmdhcmNoMjJzZy5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMiwgMikpLG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMiwgMiksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic2dlZCIpDQp2bi5nYXJjaDIyc2cuZml0IDwtIHVnYXJjaGZpdChzcGVjID0gdm4uZ2FyY2gyMnNnLnNwZWMsIHRzVk5JKQ0KYGBgDQoNCiMgNS4gTOG7sEEgQ0jhu4xOIE3DlCBIw4xOSCBCScOKTiBQSMOZIEjhu6JQDQoNCiMjIDUuMS4gTOG7sEEgQ0jhu4xOIE3DlCBIw4xOSCBCScOKTiBQSMOZIEjhu6JQIE5I4bqkVCBDSE8gQ0hV4buWSSBWTkkNCg0KYGBge3J9DQp2bi5tb2RlbC5saXN0IDwtIGxpc3QoZ2FyY2gxMW4gPSB2bi5nYXJjaDExbi5maXQsIGdhcmNoMTF0ID0gdm4uZ2FyY2gxMXQuZml0LCBnYXJjaDExc3QgPSB2bi5nYXJjaDExc3QuZml0LGdhcmNoMTFnID0gdm4uZ2FyY2gxMWcuZml0LCBnYXJjaDExc2cgPSB2bi5nYXJjaDExc2cuZml0LCBnYXJjaDEybiA9IHZuLmdhcmNoMTJuLmZpdCwgZ2FyY2gxMnQgPSB2bi5nYXJjaDEydC5maXQsIGdhcmNoMTJzdCA9IHZuLmdhcmNoMTJzdC5maXQsIGdhcmNoMTJnID12bi5nYXJjaDEyZy5maXQsIGdhcmNoMTJzZyA9IHZuLmdhcmNoMTJzZy5maXQsIGdhcmNoMjFuID0gdm4uZ2FyY2gyMW4uZml0LCBnYXJjaDIxdCA9IHZuLmdhcmNoMjF0LmZpdCwgZ2FyY2gyMXN0ID0gdm4uZ2FyY2gyMXN0LmZpdCwgZ2FyY2gyMWcgPXZuLmdhcmNoMjFnLmZpdCwgZ2FyY2gyMXNnID0gdm4uZ2FyY2gyMXNnLmZpdCwgZ2FyY2gyMm4gPSB2bi5nYXJjaDIybi5maXQsIGdhcmNoMjJ0ID0gdm4uZ2FyY2gyMnQuZml0LCBnYXJjaDIyc3QgPSB2bi5nYXJjaDIyc3QuZml0LCBnYXJjaDIyZyA9dm4uZ2FyY2gyMmcuZml0LCBnYXJjaDIyc2cgPSB2bi5nYXJjaDIyc2cuZml0KQ0Kdm4uaW5mby5tYXQgPC0gc2FwcGx5KHZuLm1vZGVsLmxpc3QsIGluZm9jcml0ZXJpYSkNCnJvd25hbWVzKHZuLmluZm8ubWF0KTwtcm93bmFtZXMoaW5mb2NyaXRlcmlhKHZuLmdhcmNoMTFuLmZpdCkpDQp2bi5pbmZvLm1hdA0KYGBgDQpgYGB7cn0NCnZuLmluZHMgPC0gd2hpY2godm4uaW5mby5tYXQgPT0gbWluKHZuLmluZm8ubWF0KSwgYXJyLmluZD1UUlVFKQ0KbW9kZWwudm4gPC0gY29sbmFtZXModm4uaW5mby5tYXQpW3ZuLmluZHNbLDJdXQ0KbW9kZWwudm4NCmBgYA0KIyMgNS4yLiBM4buwQSBDSOG7jE4gTcOUIEjDjE5IIEJJw4pOIFBIw5kgSOG7olAgTkjhuqRUIENITyBDSFXhu5ZJIFNFVEkNCg0KYGBge3J9DQpzZXRpLm1vZGVsLmxpc3QgPC0gbGlzdChnYXJjaDExbiA9IHNldGkuZ2FyY2gxMW4uZml0LCBnYXJjaDExdCA9IHNldGkuZ2FyY2gxMXQuZml0LGdhcmNoMTFzdD1zZXRpLmdhcmNoMTFzdC5maXQsIGdhcmNoMTFnID0gc2V0aS5nYXJjaDExZy5maXQsIGdhcmNoMTFzZyA9IHNldGkuZ2FyY2gxMXNnLmZpdCxnYXJjaDEybiA9IHNldGkuZ2FyY2gxMm4uZml0LCBnYXJjaDEydCA9IHNldGkuZ2FyY2gxMnQuZml0LCBnYXJjaDEyc3QgPSBzZXRpLmdhcmNoMTJzdC5maXQsZ2FyY2gxMmcgPSBzZXRpLmdhcmNoMTJnLmZpdCwgZ2FyY2gxMnNnID0gc2V0aS5nYXJjaDEyc2cuZml0LGdhcmNoMjFuID0gc2V0aS5nYXJjaDIxbi5maXQsIGdhcmNoMjF0ID0gc2V0aS5nYXJjaDIxdC5maXQsIGdhcmNoMjFzdCA9IHNldGkuZ2FyY2gyMXN0LmZpdCxnYXJjaDIxZyA9IHNldGkuZ2FyY2gyMWcuZml0LCBnYXJjaDIxc2cgPSBzZXRpLmdhcmNoMjFzZy5maXQsIGdhcmNoMjJuID0gc2V0aS5nYXJjaDIybi5maXQsIGdhcmNoMjJ0ID1zZXRpLmdhcmNoMjJ0LmZpdCwgZ2FyY2gyMnN0ID0gc2V0aS5nYXJjaDIyc3QuZml0LCBnYXJjaDIyZyA9IHNldGkuZ2FyY2gyMmcuZml0LCBnYXJjaDIyc2cgPSBzZXRpLmdhcmNoMjJzZy5maXQpDQpzZXRpLmluZm8ubWF0IDwtIHNhcHBseShzZXRpLm1vZGVsLmxpc3QsIGluZm9jcml0ZXJpYSkNCg0Kcm93bmFtZXMoc2V0aS5pbmZvLm1hdCkgPC0gcm93bmFtZXMoaW5mb2NyaXRlcmlhKHNldGkuZ2FyY2gxMW4uZml0KSkNCnNldGkuaW5mby5tYXQNCmBgYA0KYGBge3J9DQpzZXRpLmluZHMgPC0gd2hpY2goc2V0aS5pbmZvLm1hdCA9PSBtaW4oc2V0aS5pbmZvLm1hdCksIGFyci5pbmQgPSBUUlVFKQ0KbW9kZWwuc2V0aSA8LSBjb2xuYW1lcyhzZXRpLmluZm8ubWF0KVtzZXRpLmluZHNbLCAyXV0NCm1vZGVsLnNldGkNCmBgYA0KDQojIDYuIFRIQU0gU+G7kCDGr+G7mkMgTMav4buiTkcgTcOUIEjDjE5IIEJJw4pOIFBIw5kgSOG7olAgTkjhuqRUOg0KDQpgYGB7cn0NCnZuLmdhcmNoMjFzdC5maXQNCmBgYA0KYGBge3J9DQpzZXRpLmdhcmNoMTFzdC5maXQNCmBgYA0KDQojIDcuIEtJ4buCTSDEkOG7ik5IIFPhu7AgUEjDmSBI4buiUCBD4bumQSBNw5QgSMOMTkggQknDik4NCg0KYGBge3J9DQpzZXRpLnJlcyA8LSByZXNpZHVhbHMoc2V0aS5nYXJjaDExc3QuZml0KS9zaWdtYShzZXRpLmdhcmNoMTFzdC5maXQpDQpmaXRkaXN0KGRpc3RyaWJ1dGlvbiA9ICJzc3RkIiwgc2V0aS5yZXMsIGNvbnRyb2wgPSBsaXN0KCkpDQpgYGANCmBgYHtyfQ0KdSA8LSBwZGlzdChkaXN0cmlidXRpb24gPSAic3N0ZCIsIHEgPSBzZXRpLnJlcywgbXUgPSAtMC4wMzI5NDc4MyAsIHNpZ21hID0gMS4wMDA5ODU2MSAsIHNrZXcgPSAgMC44ODY2MzIxOSAsIHNoYXBlID0gNi4yNzIwODA1MSApDQojIyBUcsOtY2ggeHXhuqV0IGNodeG7l2kgcGjhuqduIGTGsCB2IGPhu6dhIGNodeG7l2kgbOG7o2kgc3XhuqV0IFZODQp2bi5yZXMgPC0gcmVzaWR1YWxzKHZuLmdhcmNoMjFzdC5maXQpL3NpZ21hKHZuLmdhcmNoMjFzdC5maXQpDQpmaXRkaXN0KGRpc3RyaWJ1dGlvbiA9ICJzc3RkIiwgdm4ucmVzLCBjb250cm9sID0gbGlzdCgpKQ0KYGBgDQpgYGB7cn0NCnYgPC0gcGRpc3QoInNzdGQiLHZuLnJlcywgbXUgPSAwLjAxNjgzNDYyLCBzaWdtYSA9IDAuOTk0Mjc5NDksIHNrZXcgPSAwLjgzNjI5Nzk3LCBzaGFwZSA9ICAzLjk5MjA1MjkxKQ0KYGBgDQoNCiMgOC4gQ8OBQyBLSeG7gk0gxJDhu4pOSCBT4buwIFBIw5kgSOG7olAgQ+G7pkEgTcOUIEjDjE5IIEJJw4pOIA0KDQpgYGB7cn0NCiMgS2llbSBkaW5oIEFuZGVyc29uLURhcmxpbmcNCmxpYnJhcnkobm9ydGVzdCkNCmFkLnRlc3QodikNCmBgYA0KYGBge3J9DQphZC50ZXN0KHYpDQpgYGANCg0KIyA5LiBLSeG7gk0gxJDhu4pOSCBDUkFNRVItVk9OIE1JU0VTIA0KDQpgYGB7cn0NCiMgTnVsbCBoeXBvdGhlc2lzOiB1bmlmb3JtIGRpc3RyaWJ1dGlvbg0KY3ZtLnRlc3QodSkNCmBgYA0KYGBge3J9DQpjdm0udGVzdCh2KQ0KYGBgDQojIDEwLiBLSeG7gk0gxJDhu4pOSCBLUy1URVNUDQoNCmBgYHtyfQ0KI051bGwgaHlwb3RoZXNpczogdW5pZm9ybSBkaXN0cmlidXRpb24NCmtzLnRlc3QodSwgdikNCmBgYA0KYGBge3J9DQprcy50ZXN0KHYsICJwdW5pZiIpDQpgYGANCg0KIyAxMS4gxq/hu5pDIEzGr+G7ok5HIFRIQU0gU+G7kCBNw5QgSMOMTkggQ09QVUxBDQoNCmBgYHtyfQ0KbGlicmFyeShWaW5lQ29wdWxhKQ0KQmlDb3BTZWxlY3QodSwgdiwgZmFtaWx5c2V0PSBOQSwgc2VsZWN0aW9uY3JpdD0iQUlDIixpbmRlcHRlc3QgPSBGQUxTRSwgbGV2ZWwgPSAwLjA1KSANClN0dSA8LSBCaUNvcEVzdCh1LCB2LCBmYW1pbHkgPSAyLCBtZXRob2QgPSAibWxlIiwgc2UgPSBULCBtYXguZGYgPSAxMCkNCg0Kc3VtbWFyeShTdHUpDQpgYGANCg0KIyAxMi4gVMONTkggVE/DgU4gVEhBTSBT4buQIMSQ4buCIFThuqBPIEJJ4buCVSDEkOG7kiBDT1BVTEEgU1VSVklWQUwgSk9FDQoNCmBgYHtSfQ0KbGlicmFyeShjb3B1bGEpDQojIFRoaeG6v3QgbOG6rXAgSm9lIGNvcHVsYSB24bubaSB0aGFtIHPhu5EgcGFyID0gMS4wNw0KdGhldGEgPC0gMS4wNw0Kam9lX2NvcCA8LSBqb2VDb3B1bGEocGFyYW0gPSB0aGV0YSkNCiMgS2nhu4NtIHRyYSBLZW5kYWxsJ3MgdGF1IGPhu6dhIEpvZSBjb3B1bGENCnRhdSA8LSB0YXUoam9lX2NvcCkNCnByaW50KHRhdSkNCmBgYA0KYGBge3J9DQp0bnQgPC0gY2JpbmQodSwgdikNCmZpdCA8LSBmaXRDb3B1bGEoam9lQ29wdWxhKCksIGRhdGEgPSB0bnQsIG1ldGhvZCA9ICJtbCIpICANCiMgTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRpb24gKE1MRSkNCnRoZXRhIDwtIGNvZWYoZml0KQ0KcHJpbnQodGhldGEpDQpgYGANCmBgYHtyfQ0Kam9lX2NvcCA8LSBqb2VDb3B1bGEocGFyYW0gPSB0aGV0YSkNCnRhdSA8LSB0YXUoam9lX2NvcCkNCnByaW50KHRhdSkNCmBgYA0KYGBge3J9DQpwYXIuam9laDwtQmlDb3BUYXUyUGFyKDYsIC4wNCwgY2hlY2sudGF1cyA9IFRSVUUpDQpwYXIuam9lbDwtQmlDb3BUYXUyUGFyKDM2LCAtLjA0LCBjaGVjay50YXVzID0gVFJVRSkNCm9iai5qb2VoIDwtIEJpQ29wKGZhbWlseSA9IDYsIHBhciA9IHBhci5qb2VoKQ0Kb2JqLmpvZWwgPC0gQmlDb3AoZmFtaWx5ID0gMzYsIHBhciA9IHBhci5qb2VsKQ0Kc2ltLmpvZWg8LUJpQ29wU2ltKDE0MDksb2JqLmpvZWgpDQpzaW0uam9lbDwtQmlDb3BTaW0oMTQwOSxvYmouam9lbCkNCnBsb3Qoc2ltLmpvZWgsIHhsYWI9ZXhwcmVzc2lvbigidSJbMV0pLHlsYWI9ZXhwcmVzc2lvbigidSJbMl0pLHhsaW09YygwLDEpLHlsaW09YygwLDEpKQ0KYGBgDQoNCiMgMTMuIMSQ4buSIFRI4buKIFBIw4JOIFTDgU4gDQoNCmBgYHtyfQ0KIyBW4bq9IMSR4buTIHRo4buLIHBow6JuIHTDoW4NCnBsb3QodSwgbWFpbiA9ICLEkOG7kyB0aOG7iyBwaMOibiB0w6FuIGPhu6dhIGJp4bq/biBWTkkiKQ0KcGxvdCh2LCBtYWluID0gIsSQ4buTIHRo4buLIHBow6JuIHTDoW4gY+G7p2EgYmnhur9uIFNFVEkiKQ0KYGBgDQoNCiMgMTQuIMSQ4buSIFRI4buKICBN4bqsVCDEkOG7mCANCmBgYHtyfQ0KIyBUw61uaCB0b8OhbiBow6BtIG3huq10IMSR4buZIHbDoCB24bq9IMSR4buTIHRo4buLDQpsaWJyYXJ5KE1BU1MpDQprZGUyZF9wbG90IDwtIGtkZTJkKHRudFssMV0sIHRudFssMl0sIG4gPSA1MCkNCnBlcnNwKGtkZTJkX3Bsb3QsIHBoaSA9IDUwLCB0aGV0YSA9IGNvZWYoZml0KSwgbWFpbiA9ICLEkOG7kyB0aOG7iyBt4bqtdCDEkeG7mSBj4bunYSBjb3B1bGEgSk9FIikNCmBgYA0KDQojIDE1LiBC4bqiTiDEkOG7kiBOSEnhu4ZUIEtFUk5FTA0KDQpgYGB7Un0NCiMgVuG6vSBi4bqjbiDEkeG7kyBuaGnhu4d0IGPhu6dhIGjDoG0gbeG6rXQgxJHhu5kga2VybmVsDQppbWFnZShrZGUyZF9wbG90LCBtYWluID0gIkLhuqNuIMSR4buTIG5oaeG7h3QgY+G7p2EgaMOgbSBt4bqtdCDEkeG7mSBrZXJuZWwiKQ0KIyBW4bq9IGPDoWMgxJHGsOG7nW5nIMSR4buTbmcgbeG7qWMgY+G7p2EgaMOgbSBt4bqtdCDEkeG7mSBrZXJuZWwNCmNvbnRvdXIoa2RlMmRfcGxvdCwgYWRkID0gVFJVRSkNCmBgYA0KDQojIDE3LiDGr+G7mkMgTMav4buiTkcgU08gU8OBTkggVuG7mkkgQ8OBQyBNw5QgSMOMTkggQ09QVUxBIEtIw4FDIA0KDQpgYGB7Un0NCiMgxq/hu5tjIGzGsOG7o25nIHbDoCBzbyBzw6FuaCB24bubaSBt4buZdCBz4buRIG3DtCBow6xuaCBjb3B1bGEga2jDoWMNCmZpdF9jbGF5dG9uIDwtIGZpdENvcHVsYShjbGF5dG9uQ29wdWxhKCksIGRhdGEgPSB0bnQsIG1ldGhvZCA9ICJtbCIpDQpmaXRfZ3VtYmVsIDwtIGZpdENvcHVsYShndW1iZWxDb3B1bGEoKSwgZGF0YSA9IHRudCwgbWV0aG9kID0gIm1sIikNCiMgSW4gY8OhYyB0aGFtIHPhu5EgxrDhu5tjIGzGsOG7o25nDQpwcmludChjb2VmKGZpdF9jbGF5dG9uKSkNCmBgYA0KYGBge1J9DQpwcmludChjb2VmKGZpdF9ndW1iZWwpKQ0KYGBgDQoNCmBgYHtSfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoY29wdWxhKQ0KbGlicmFyeShNQVNTKQ0KDQojIERlZmluZSB0aGUgcGFyYW1ldGVyIGZvciB0aGUgSm9lIGNvcHVsYQ0KdGhldGEgPC0gMS4wNyAgIyBUaGFtIHPhu5EgY+G7p2EgYuG6oW4NCg0KIyBDcmVhdGUgdGhlIEpvZSBjb3B1bGEgb2JqZWN0DQpqb2VfY29wdWxhIDwtIGpvZUNvcHVsYShwYXJhbSA9IHRoZXRhKQ0KDQojIEdlbmVyYXRlIGEgc2FtcGxlIGZyb20gdGhlIEpvZSBjb3B1bGENCnNldC5zZWVkKDEyMykNCm4gPC0gMTQwOQ0Kc2FtcGxlIDwtIHJDb3B1bGEobiwgam9lX2NvcHVsYSkNCg0KIyBQZXJmb3JtIEtlcm5lbCBEZW5zaXR5IEVzdGltYXRpb24NCmtkZTJkX3Bsb3QgPC0ga2RlMmQodG50WywxXSwgdG50WywyXSwgbiA9IDUwKQ0KDQojIFBsb3QgdGhlIGRlbnNpdHkNCnBlcnNwKGtkZTJkX3Bsb3QsIHBoaSA9IDUwLCB0aGV0YSA9IDUwLCBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgIHhsYWIgPSAiVSIsIHlsYWIgPSAiViIsIHpsYWIgPSAiRGVuc2l0eSIsIA0KICAgICAgbWFpbiA9ICJEZW5zaXR5IFBsb3Qgb2YgSm9lIENvcHVsYSIpDQpgYGANCmBgYHtSfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoY29wdWxhKQ0KbGlicmFyeShNQVNTKQ0KbGlicmFyeShzY2F0dGVycGxvdDNkKQ0KDQojIERlZmluZSB0aGUgcGFyYW1ldGVyIGZvciB0aGUgSm9lIGNvcHVsYQ0KdGhldGEgPC0gMS4wNw0KDQojIENyZWF0ZSB0aGUgSm9lIGNvcHVsYSBvYmplY3QNCmpvZV9jb3B1bGEgPC0gam9lQ29wdWxhKHBhcmFtID0gdGhldGEpDQoNCg0KIyBQZXJmb3JtIEtlcm5lbCBEZW5zaXR5IEVzdGltYXRpb24NCmtkZTJkX3Jlc3VsdCA8LSBrZGUyZCh0bnRbLDFdLCB0bnRbLDJdLCBuID0gNTApDQoNCiMgQ29udmVydCBrZGUyZCByZXN1bHQgdG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIHNjYXR0ZXJwbG90M2QNCnggPC0ga2RlMmRfcmVzdWx0JHgNCnkgPC0ga2RlMmRfcmVzdWx0JHkNCnogPC0ga2RlMmRfcmVzdWx0JHoNCg0KIyBDcmVhdGUgYSBncmlkIG9mIHBvaW50cyBmb3Igc2NhdHRlcnBsb3QzZA0KZ3JpZCA8LSBleHBhbmQuZ3JpZCh4ID0geCwgeSA9IHkpDQoNCiMgRmxhdHRlbiB6IGZvciBzY2F0dGVycGxvdDNkDQp6X2ZsYXQgPC0gYXMudmVjdG9yKHopDQoNCiMgUGxvdCB0aGUgZGVuc2l0eSB1c2luZyBzY2F0dGVycGxvdDNkDQpzY2F0dGVycGxvdDNkKGdyaWQkeCwgZ3JpZCR5LCB6X2ZsYXQsIHR5cGUgPSAiaCIsIGFuZ2xlID0gMzAsIA0KICAgICAgICAgICAgICBtYWluID0gIkRlbnNpdHkgUGxvdCBvZiBKb2UgQ29wdWxhIiwNCiAgICAgICAgICAgICAgeGxhYiA9ICJSYWluZmFsbCBEZXB0aCIsIA0KICAgICAgICAgICAgICB5bGFiID0gIlNob3QgRHVyYXRpb24iLCANCiAgICAgICAgICAgICAgemxhYiA9ICJCaXZhcmlhdGUgRGlzdHJpYnV0aW9uIiwNCiAgICAgICAgICAgICAgcGNoID0gMjAsIGNvbG9yID0gInR1cnF1b2lzZSIpDQpgYGANCmBgYHtyfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoY29wdWxhKQ0KbGlicmFyeShNQVNTKQ0KDQojIERlZmluZSB0aGUgcGFyYW1ldGVyIGZvciB0aGUgSm9lIGNvcHVsYQ0KdGhldGEgPC0gMS4wNw0KDQojIENyZWF0ZSB0aGUgSm9lIGNvcHVsYSBvYmplY3QNCmpvZV9jb3B1bGEgPC0gam9lQ29wdWxhKHBhcmFtID0gdGhldGEpDQoNCiMgUGVyZm9ybSBLZXJuZWwgRGVuc2l0eSBFc3RpbWF0aW9uDQprZGUyZF9yZXN1bHQgPC0ga2RlMmQodG50WywxXSwgdG50WywyXSwgbiA9IDE0MDkpDQoNCiMgRXh0cmFjdCB0aGUgcmVzdWx0cw0KeCA8LSBrZGUyZF9yZXN1bHQkeA0KeSA8LSBrZGUyZF9yZXN1bHQkeQ0KeiA8LSBrZGUyZF9yZXN1bHQkeg0KDQojIFBsb3QgdGhlIFBERiB1c2luZyBwZXJzcA0KcGVyc3AoeCwgeSwgeiwgcGhpID0gMzAsIHRoZXRhID0gMS4wNywgY29sID0gInJlZCIsIA0KICAgICAgeGxhYiA9ICJEaXNjaGFyZ2UiLCB5bGFiID0gIkR1cmF0aW9uIiwgemxhYiA9ICJEZW5zaXR5IiwgDQogICAgICBtYWluID0gIlBERiBvZiBKb2UgQ29wdWxhIikNCmBgYA0KDQpgYGB7cn0NCiMgUGxvdCB0aGUgY29udG91ciBwbG90DQpjb250b3VyKHgsIHksIHosIHhsYWIgPSAiRGlzY2hhcmdlIiwgeWxhYiA9ICJEdXJhdGlvbiIsIA0KICAgICAgICBtYWluID0gIkNvbnRvdXIgUGxvdCBvZiBKb2UgQ29wdWxhIikNCmBgYA0KYGBge3J9DQojIExvYWQgdGhlIHJlcXVpcmVkIGxpYnJhcmllcw0KbGlicmFyeShjb3B1bGEpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCg0KIyBEZWZpbmUgdGhlIEpvZSBjb3B1bGENCmpvZV9jb3B1bGEgPC0gam9lQ29wdWxhKHBhcmFtID0gMS4wNykNCg0KIyBDcmVhdGUgaGlzdG9ncmFtcyBvZiBtYXJnaW5hbCBkaXN0cmlidXRpb25zDQpwX2hpc3RfWDEgPC0gZ2dwbG90KHRudCwgYWVzKHggPSB0c1ZOSSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwLCBmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2d0aXRsZSgiUGjDom4gUGjhu5FpIE1hcmdpbmFsIGPhu6dhIFgxIikgKw0KICB4bGFiKCJYMSIpICsNCiAgeWxhYigiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCnBfaGlzdF9YMiA8LSBnZ3Bsb3QodG50LCBhZXMoeCA9IHRzU0VUSSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwLCBmaWxsID0gInNhbG1vbiIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZ3RpdGxlKCJQaMOibiBQaOG7kWkgTWFyZ2luYWwgY+G7p2EgWDIiKSArDQogIHhsYWIoIlgyIikgKw0KICB5bGFiKCJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBBcnJhbmdlIGhpc3RvZ3JhbXMgc2lkZSBieSBzaWRlDQpncmlkLmFycmFuZ2UocF9oaXN0X1gxLCBwX2hpc3RfWDIsIG5jb2wgPSAyKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoY29wdWxhKQ0KbGlicmFyeShWaW5lQ29wdWxhKQ0KYSA8LSBCaUNvcFNlbGVjdCh1LHYsIGZhbWlseXNldCA9IGMoMToxMCksIHNlbGVjdGlvbmNyaXQgPSAiQUlDIiwgaW5kZXB0ZXN0ID0gRkFMU0UsIGxldmVsID0gMC4wNSkNCnN1ci5qb2UgPC0gam9lQ29wdWxhKHBhcmFtPSAxLjA3KQ0KZml0IDwtIGZpdENvcHVsYShzdXIuam9lLCBkYXRhPSBhcy5tYXRyaXgoY2JpbmQodSx2KSksbWV0aG9kPSJtbCIpDQpjb2VmKGZpdCkNCmBgYA0KYGBge3J9DQphJHBhcg0KYGBgDQpgYGB7cn0NCmEkcGFyMg0KYGBgDQpgYGB7cn0NCnBlcnNwKGpvZUNvcHVsYShwYXJhbSA9IGEkcGFyKSwgZENvcHVsYSwgY29sPSAicGluayIsIGJvcmRlcj0gImJsYWNrIikNCmBgYA==