require(tidyverse)
## Loading required package: tidyverse
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(readxl)
library(dplyr)
setwd("C:/Users/YEN NHI/Documents/MPNN")
dt <- read_excel("data.xlsx",1)
data <- dt[,2:8]
btc = data$BTC
eth = data$ETH
xrp = data$XRP
bnb = data$BNB
thr = data$THR
usc = data$USC
dj = data$Dowjones

1 Bài tập về nhà tuần 6

Chạy mô hình với các phân phối khác nhau của các biến đầu vào

1.1 Mô hình

mh1 <- lm(data$Dowjones ~ data$BTC + data$ETH + data$BNB)
summary(mh1)
## 
## Call:
## lm(formula = data$Dowjones ~ data$BTC + data$ETH + data$BNB)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3224.8  -647.5    23.5   742.1  2119.2 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2.928e+04  2.051e+02 142.768  < 2e-16 ***
## data$BTC    7.386e-02  8.834e-03   8.361 6.19e-16 ***
## data$ETH    1.348e-01  1.783e-02   7.559 1.95e-13 ***
## data$BNB    3.709e+00  1.182e+00   3.139   0.0018 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1015 on 501 degrees of freedom
## Multiple R-squared:  0.6075, Adjusted R-squared:  0.6052 
## F-statistic: 258.5 on 3 and 501 DF,  p-value: < 2.2e-16

\[ DJ = 2,928e+04 + 7,386e-02 +1,348e-01 +3,709e+00BNB \]

1.2 Mô phỏng dữ liệu

set.seed(123)

simulate_stock_price <- function(S0, r, sigma, N, dt) {
  # Mô phỏng z theo phân phối chuẩn
  Z <- rnorm(N, mean = 0, sd = 1)
  
  # Tạo ra vecto rỗng chứa các giá trị của giá cổ phiếu
  prices <- numeric(N)
  prices[1] <- S0
  
 
  for (i in 1:(N-1)) {
    drift <- (r - 0.5 * sigma^2) * dt
    diffusion <- sigma * sqrt(dt) * Z[i]
    prices[i+1] <- prices[i] * exp(drift + diffusion)
  }
  
  return(prices)
}

# Parameters
S0 <- data$BTC [1] # Giá cổ phiếu ban đầu
r <- 0.05  # Lãi suất phi rủi ro
sigma <- sd(diff(log(data$BTC)))  # Độ biến động 
N <- 501  # Mô phỏng trong 501 ngày
dt <- 1/N  

set.seed(123) 
BTC <- simulate_stock_price(S0, r, sigma, N, dt)
plot(BTC, type = 'l', col = 'blue', main = "Giá Bitcoin", ylab = "USD", xlab = "Ngày")

set.seed(123)

simulate_stock_price <- function(S0, r, sigma, N, dt) {
  # Mô phỏng z theo phân phối chuẩn
  Z <- rnorm(N, mean = 0, sd = 1)
  
  # Tạo ra vecto rỗng chứa các giá trị của giá cổ phiếu
  prices <- numeric(N)
  prices[1] <- S0
  
 
  for (i in 1:(N-1)) {
    drift <- (r - 0.5 * sigma^2) * dt
    diffusion <- sigma * sqrt(dt) * Z[i]
    prices[i+1] <- prices[i] * exp(drift + diffusion)
  }
  
  return(prices)
}

# Parameters
S0 <- eth[1] # Giá cổ phiếu ban đầu
r <- 0.05  # Lãi suất phi rủi ro
sigma <- sd(diff(log(eth)))  # Độ biến động 
N <- 501  # Mô phỏng trong 501 ngày
dt <- 1/N  

set.seed(123) 
ETH <- simulate_stock_price(S0, r, sigma, N, dt)
plot(ETH, type = 'l', col = 'blue', main = "Giá ETH", ylab = "USD", xlab = "Ngày")

set.seed(123)

simulate_stock_price <- function(S0, r, sigma, N, dt) {
  # Mô phỏng z theo phân phối chuẩn
  Z <- rnorm(N, mean = 0, sd = 1)
  
  # Tạo ra vecto rỗng chứa các giá trị của giá cổ phiếu
  prices <- numeric(N)
  prices[1] <- S0
  
 
  for (i in 1:(N-1)) {
    drift <- (r - 0.5 * sigma^2) * dt
    diffusion <- sigma * sqrt(dt) * Z[i]
    prices[i+1] <- prices[i] * exp(drift + diffusion)
  }
  
  return(prices)
}

# Parameters
S0 <- xrp[1] # Giá cổ phiếu ban đầu
r <- 0.05  # Lãi suất phi rủi ro
sigma <- sd(diff(log(xrp)))  # Độ biến động 
N <- 501  # Mô phỏng trong 501 ngày
dt <- 1/N  

set.seed(123) 
XRP <- simulate_stock_price(S0, r, sigma, N, dt)
plot(XRP, type = 'l', col = 'blue', main = "Giá XRP", ylab = "USD", xlab = "Ngày")

set.seed(123)

simulate_stock_price <- function(S0, r, sigma, N, dt) {
  # Mô phỏng z theo phân phối chuẩn
  Z <- rnorm(N, mean = 0, sd = 1)
  
  # Tạo ra vecto rỗng chứa các giá trị của giá cổ phiếu
  prices <- numeric(N)
  prices[1] <- S0
  
 
  for (i in 1:(N-1)) {
    drift <- (r - 0.5 * sigma^2) * dt
    diffusion <- sigma * sqrt(dt) * Z[i]
    prices[i+1] <- prices[i] * exp(drift + diffusion)
  }
  
  return(prices)
}

# Parameters
S0 <- bnb[1] # Giá cổ phiếu ban đầu
r <- 0.05  # Lãi suất phi rủi ro
sigma <- sd(diff(log(bnb)))  # Độ biến động 
N <- 501  # Mô phỏng trong 501 ngày
dt <- 1/N  

set.seed(123) 
BNB <- simulate_stock_price(S0, r, sigma, N, dt)
plot(BNB, type = 'l', col = 'blue', main = "Giá BNB", ylab = "USD", xlab = "Ngày")

set.seed(123)

simulate_stock_price <- function(S0, r, sigma, N, dt) {
  # Mô phỏng z theo phân phối chuẩn
  Z <- rnorm(N, mean = 0, sd = 1)
  
  # Tạo ra vecto rỗng chứa các giá trị của giá cổ phiếu
  prices <- numeric(N)
  prices[1] <- S0
  
 
  for (i in 1:(N-1)) {
    drift <- (r - 0.5 * sigma^2) * dt
    diffusion <- sigma * sqrt(dt) * Z[i]
    prices[i+1] <- prices[i] * exp(drift + diffusion)
  }
  
  return(prices)
}

# Parameters
S0 <- thr[1] # Giá cổ phiếu ban đầu
r <- 0.05  # Lãi suất phi rủi ro
sigma <- sd(diff(log(thr)))  # Độ biến động 
N <- 501  # Mô phỏng trong 501 ngày
dt <- 1/N  

set.seed(123) 
THR <- simulate_stock_price(S0, r, sigma, N, dt)
hist(THR)

set.seed(123)

simulate_stock_price <- function(S0, r, sigma, N, dt) {
  # Mô phỏng z theo phân phối chuẩn
  Z <- rnorm(N, mean = 0, sd = 1)
  
  # Tạo ra vecto rỗng chứa các giá trị của giá cổ phiếu
  prices <- numeric(N)
  prices[1] <- S0
  
 
  for (i in 1:(N-1)) {
    drift <- (r - 0.5 * sigma^2) * dt
    diffusion <- sigma * sqrt(dt) * Z[i]
    prices[i+1] <- prices[i] * exp(drift + diffusion)
  }
  
  return(prices)
}

# Parameters
S0 <- usc[1] # Giá cổ phiếu ban đầu
r <- 0.05  # Lãi suất phi rủi ro
sigma <- sd(diff(log(usc)))  # Độ biến động 
N <- 501  # Mô phỏng trong 501 ngày
dt <- 1/N  

set.seed(123) 
USC <- simulate_stock_price(S0, r, sigma, N, dt)
plot(USC, type = 'l', col = 'blue', main = "Giá USC", ylab = "USD", xlab = "Ngày")

1.3 Chạy mô hình theo dữ liệu đã mô phỏng

dj <- 2.928e+04 + 7.386e-02*BTC + 1.348e-01*ETH + 3.709e+00*XRP
hist(dj)

dj1 = (dj - lag(dj))
phientanggia <- dj1[dj1 > 0]
phiengiamgia <- dj1[dj1 < 0]
length(phientanggia)
## [1] 263
length(phientanggia)/length(dj)
## [1] 0.5249501
length(phiengiamgia)
## [1] 239
length(phiengiamgia)/length(dj)
## [1] 0.4770459
dj2 <- cut(dj, breaks = c(min(dj), mean(dj), max(dj)), labels = c('thấp','cao'))
table(dj2)/sum(table(dj2))
## dj2
##  thấp   cao 
## 0.574 0.426

Ta có thể thấy, chỉ số Dow jones được mô phỏng dựa trên mô phỏng giá 6 loại tiền ảo có tỷ lệ chỉ số thấp chiếm cao hơn tỷ lệ chỉ số Dowjones sẽ cao, nhưng không chênh lệch nhiều. Trong 502 phiên giao dịch được mô phỏng của chỉ số Dowjones, ta thấy có 263 phiên tăng giá và 239 phiên giá giảm. Số phiên tăng giá có xác suất xảy ra là 0,5249501 và số phiên giảm giá có xác suất xảy ra là 0,4770459.

2 Bài tập về nhà tuần 5

Xây dựng mô hình cho đối tượng cần mô phỏng và giải thích mô hình

2.1 Mô hình nghiên cứu

\[ DJ = \beta_0 + \beta_1BTC + \beta_2ETH + \beta_3XRP + \beta_4BNB + \beta_5THR + \beta_6USC \]

mh <- lm(data$Dowjones ~ data$BTC + data$ETH + data$XRP + data$BNB + data$THR+ data$USC)
summary(mh)
## 
## Call:
## lm(formula = data$Dowjones ~ data$BTC + data$ETH + data$XRP + 
##     data$BNB + data$THR + data$USC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3295.4  -625.2     7.1   723.0  2010.6 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.039e+05  9.475e+04   1.096  0.27354    
## data$BTC     5.789e-02  1.250e-02   4.633 4.61e-06 ***
## data$ETH     1.401e-01  1.851e-02   7.573 1.78e-13 ***
## data$XRP     8.675e+02  4.738e+02   1.831  0.06773 .  
## data$BNB     3.739e+00  1.188e+00   3.148  0.00174 ** 
## data$THR    -6.983e+04  8.719e+04  -0.801  0.42358    
## data$USC    -4.780e+03  2.379e+04  -0.201  0.84088    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1014 on 498 degrees of freedom
## Multiple R-squared:  0.6108, Adjusted R-squared:  0.6061 
## F-statistic: 130.3 on 6 and 498 DF,  p-value: < 2.2e-16

2.2 Dữ liệu nghiên cứu

Mô phỏng giá trị của 6 loại tiền ảo gồm: Bitcoin, ETH, XRP, USDC, Tether, BNB trong giai đoạn nửa tháng đầu năm 2023 gồm 501 quan sát.

data
## # A tibble: 505 × 7
##    Dowjones    BTC   ETH   XRP   BNB   THR   USC
##       <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1   34575. 36673. 2634. 1.01   362.  1.00 0.961
##  2   34600. 37590  2706. 1.02   401.  1.00 0.985
##  3   34577. 39209  2853. 1.04   428.  1.00 0.995
##  4   34756. 36854  2686. 0.969  391.  1.00 0.995
##  5   34630. 33596  2593. 0.863  358.  1.00 0.996
##  6   34600. 33415  2511. 0.874  353.  1.00 0.997
##  7   34447. 37347  2606. 0.920  375.  1.00 0.997
##  8   34466. 36649. 2470. 0.868  351.  1.00 0.997
##  9   34480. 37338  2351. 0.847  345.  1    0.997
## 10   34394. 40500  2581. 0.890  370.  1.00 0.998
## # ℹ 495 more rows

3 Bài tập về nhà tuần 4

Xác định phân phối cho các biến (ngẫu nhiên) đầu vào

3.1 Xác định phân phối cho biến BTC

3.1.1 Thống kê mô tả BTC

summary(btc)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   15766   21600   29832   33140   42743   67526
sd(btc)
## [1] 12886.61

Theo kết quả trên ta thấy, giá tiền Bitcoin có giá trị trung bình là 33140 USD, trung vị là 29832 USD. Biến BTC dao động từ giá trị nhỏ nhất là 15766 USD đến giá trị lớn nhất là 67526 USD, với độ lệch chuẩn là 12886,61 USD.

3.1.2 Kiểm định phân phối biến BTC

hist(btc)

3.1.2.1 Kiểm định phân phối chuẩn cho BTC

shapiro.test(btc)
## 
##  Shapiro-Wilk normality test
## 
## data:  btc
## W = 0.92988, p-value = 1.239e-14

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến BTC tuân theo phân phối chuẩn, tức là biến BTC không tuân theo phân phối chuẩn.

3.1.2.2 Kiểm định phân phối mũ cho BTC

ks.test(btc, y=pexp)
## Warning in ks.test.default(btc, y = pexp): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  btc
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến BTC tuân theo phân phối mũ, tức là biến BTC không tuân theo phân phối mũ.

3.1.2.3 Kiểm định phân phối đều cho BTC

ks.test(btc, y = 'punif')
## Warning in ks.test.default(btc, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  btc
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến BTC tuân theo phân phối đều, tức là biến BTC không tuân theo phân phối đều.

3.1.2.4 Kiểm định phân phối loga chuẩn cho BTC

ks.test(btc, y = 'plnorm')
## Warning in ks.test.default(btc, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  btc
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến BTC tuân theo phân phối loga chuẩn, tức là biến BTC không tuân theo phân phối loga chuẩn.

3.2 Xác định phân phối cho biến ETH

3.2.1 Thống kê mô tả ETH

summary(eth)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1039    2124    3238    4356    6699   10545
sd(eth)
## [1] 2741.111

Theo kết quả trên ta thấy, giá tiền Ether có giá trị trung bình là 4356 USD, trung vị là 3238 USD. Biến ETH dao động từ giá trị nhỏ nhất là 1039 USD đến giá trị lớn nhất là 10545 USD, với độ lệch chuẩn là 12741,111 USD.

3.2.2 Kiểm định phân phối biến ETH

hist(eth)

3.2.2.1 Kiểm định phân phối chuẩn cho ETH

shapiro.test(eth)
## 
##  Shapiro-Wilk normality test
## 
## data:  eth
## W = 0.86834, p-value < 2.2e-16

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến ETH tuân theo phân phối chuẩn, tức là biến ETH không tuân theo phân phối chuẩn.

3.2.2.2 Kiểm định phân phối mũ cho ETH

ks.test(eth, y=pexp)
## Warning in ks.test.default(eth, y = pexp): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  eth
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến ETH tuân theo phân phối mũ, tức là biến ETH không tuân theo phân phối mũ.

3.2.2.3 Kiểm định phân phối đều cho ETH

ks.test(eth, y = 'punif')
## Warning in ks.test.default(eth, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  eth
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến ETH tuân theo phân phối đều, tức là biến ETH không tuân theo phân phối đều.

3.2.2.4 Kiểm định phân phối loga chuẩn cho ETH

ks.test(eth, y = 'plnorm')
## Warning in ks.test.default(eth, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  eth
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến ETH tuân theo phân phối loga chuẩn, tức là biến ETH không tuân theo phân phối loga chuẩn.

3.3 Xác định phân phối cho XRP

3.3.1 Thống kê mô tả biến XRP

summary(xrp)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3117  0.3883  0.5065  0.6222  0.8165  1.2898
sd(xrp)
## [1] 0.2686129

Theo kết quả trên ta thấy, giá tiền XRP có giá trị trung bình là 0,6222 USD, trung vị là 0,5065 USD. Biến XRP dao động từ giá trị nhỏ nhất là 0,3117 USD đến giá trị lớn nhất là 1,2898 USD, với độ lệch chuẩn là 0,2686129 USD.

3.3.2 Kiểm định phân phối biến XRP

hist(xrp)

3.3.2.1 Kiểm định phân phối chuẩn biến XRP

shapiro.test(xrp)
## 
##  Shapiro-Wilk normality test
## 
## data:  xrp
## W = 0.88201, p-value < 2.2e-16

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến XRP tuân theo phân phối chuẩn, tức là biến XRP không tuân theo phân phối chuẩn.

3.3.2.2 Kiểm định phân phối mũ cho XRP

ks.test(xrp, y=pexp)
## Warning in ks.test.default(xrp, y = pexp): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  xrp
## D = 0.28176, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến XRP tuân theo phân phối mũ, tức là biến XRP không tuân theo phân phối mũ.

3.3.2.3 Kiểm định phân phối đều cho XRP

ks.test(xrp, y = 'punif')
## Warning in ks.test.default(xrp, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  xrp
## D = 0.31166, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến XRP tuân theo phân phối đều, tức là biến XRP không tuân theo phân phối đều.

3.3.2.4 Kiểm định phân phối loga chuẩn cho XRP

ks.test(xrp, y = 'plnorm')
## Warning in ks.test.default(xrp, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  xrp
## D = 0.40869, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến XRP tuân theo phân phối loga chuẩn, tức là biến XRP không tuân theo phân phối loga chuẩn.

3.4 Xác định phân phối biến BNB

3.4.1 Thống kê mô tả biến BNB

summary(bnb)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   210.1   290.2   320.8   354.9   406.6   653.8
sd(bnb)
## [1] 94.08784

Theo kết quả trên ta thấy, giá tiền XRP có giá trị trung bình là 354,9 USD, trung vị là 320,8 USD. Biến XRP dao động từ giá trị nhỏ nhất là 210,1 USD đến giá trị lớn nhất là 653,8 USD, với độ lệch chuẩn là 94,08784 USD.

3.4.2 Kiểm định phân phối biến BNB

hist(bnb)

3.4.2.1 Kiểm định phân phối chuẩn biến BNB

shapiro.test(bnb)
## 
##  Shapiro-Wilk normality test
## 
## data:  bnb
## W = 0.89986, p-value < 2.2e-16

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến BNB tuân theo phân phối chuẩn, tức là biến BNB không tuân theo phân phối chuẩn.

3.4.2.2 Kiểm định phân phối mũ cho BNB

ks.test(bnb, y=pexp)
## Warning in ks.test.default(bnb, y = pexp): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  bnb
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến BNB tuân theo phân phối mũ, tức là biến BNB không tuân theo phân phối mũ.

3.4.2.3 Kiểm định phân phối đều cho BNB

ks.test(bnb, y = 'punif')
## Warning in ks.test.default(bnb, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  bnb
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến BNB tuân theo phân phối đều, tức là biến BNB không tuân theo phân phối đều.

3.4.2.4 Kiểm định phân phối loga chuẩn cho BNB

ks.test(bnb, y = 'plnorm')
## Warning in ks.test.default(bnb, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  bnb
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến BNB tuân theo phân phối loga chuẩn, tức là biến BNB không tuân theo phân phối loga chuẩn.

3.5 Xác định phân phối biến THR

3.5.1 Thống kê mô tả biến THR

summary(thr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9968  1.0000  1.0002  1.0001  1.0003  1.0041
sd(thr)
## [1] 0.000579306

Theo kết quả trên ta thấy, giá tiền THR có giá trị trung bình là 1,0001 USD, trung vị là 1,0002 USD. Biến THR dao động từ giá trị nhỏ nhất là 0,9968 USD đến giá trị lớn nhất là 1,0041 USD, với độ lệch chuẩn là 0,000579306 USD.

3.5.2 Kiểm định phân phối biến THR

hist(thr)

3.5.2.1 Kiểm định phân phối chuẩn biến THR

shapiro.test(thr)
## 
##  Shapiro-Wilk normality test
## 
## data:  thr
## W = 0.81098, p-value < 2.2e-16

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến THR tuân theo phân phối chuẩn, tức là biến THR không tuân theo phân phối chuẩn.

3.5.2.2 Kiểm định phân phối mũ cho THR

ks.test(thr, y=pexp)
## Warning in ks.test.default(thr, y = pexp): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  thr
## D = 0.63094, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến THR tuân theo phân phối mũ, tức là biến THR không tuân theo phân phối mũ.

3.5.2.3 Kiểm định phân phối đều cho THR

ks.test(thr, y = 'punif')
## Warning in ks.test.default(thr, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  thr
## D = 0.9968, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến THR tuân theo phân phối đều, tức là biến THR không tuân theo phân phối đều.

3.5.2.4 Kiểm định phân phối loga chuẩn cho THR

ks.test(thr, y = 'plnorm')
## Warning in ks.test.default(thr, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  thr
## D = 0.49872, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến THR tuân theo phân phối loga chuẩn, tức là biến THR không tuân theo phân phối loga chuẩn.

3.6 Xác định phân phối cho biến USC

3.6.1 Thống kê mô tả USC

summary(usc)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9608  0.9995  0.9998  0.9995  0.9999  1.0032
sd(usc)
## [1] 0.001995529

Theo kết quả trên ta thấy, giá tiền USDC có giá trị trung bình là 0,9995 USD, trung vị là 0,9998 USD. Biến USC dao động từ giá trị nhỏ nhất là 0,9608 USD đến giá trị lớn nhất là 1,0032 USD, với độ lệch chuẩn là 0,001995529 USD.

3.6.2 Kiểm định phân phối biến USC

hist(usc)

3.6.2.1 Kiểm định phân phối chuẩn cho USC

shapiro.test(usc)
## 
##  Shapiro-Wilk normality test
## 
## data:  usc
## W = 0.1972, p-value < 2.2e-16

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến USC tuân theo phân phối chuẩn, tức là biến USC không tuân theo phân phối chuẩn.

3.6.2.2 Kiểm định phân phối mũ cho USC

ks.test(usc, y=pexp)
## Warning in ks.test.default(usc, y = pexp): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  usc
## D = 0.62624, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến USC tuân theo phân phối mũ, tức là biến USC không tuân theo phân phối mũ.

3.6.2.3 Kiểm định phân phối đều cho USC

ks.test(usc, y = 'punif')
## Warning in ks.test.default(usc, y = "punif"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  usc
## D = 0.99084, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến USC tuân theo phân phối đều, tức là biến USC không tuân theo phân phối đều.

3.6.2.4 Kiểm định phân phối loga chuẩn cho USC

ks.test(usc, y = 'plnorm')
## Warning in ks.test.default(usc, y = "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  usc
## D = 0.49873, p-value < 2.2e-16
## alternative hypothesis: two-sided

Kết quả kiểm định cho thấy P_value < 0.05 nên ta bác bỏ \(H_0\) rằng biến USC tuân theo phân phối loga chuẩn, tức là biến USC không tuân theo phân phối loga chuẩn.

4 Bài tập về nhà tuần 2-3

Chọn và giải thích về đối tượng (vấn đề) cần mô phỏng

4.1 Đề tài

Mô phỏng chỉ số chứng khoán Dowjones.

4.2 Chọn và giải thích đối tượng

4.2.1 Biến đầu ra

Biến đầu ra là DJ (Dowjones): Chỉ số trung bình công nghiệp Dow Jones hay Chỉ số bình quân công nghiệp Dow Jones (tiếng Anh: Dow Jones Industrial Average, viết tắt DJIA, còn gọi Dow 30, Dow Jones công nghiệp, hoặc Dow Jones; NYSE: DJI Lưu trữ 2008-10-26 tại Wayback Machine) là một trong vài chỉ số thị trường chứng khoán được tạo ra bởi Charles Dow, chủ báo The Wall Street Journal và đồng sáng lập viên của công ty Dow Jones & Company vào thế kỷ 19. Dow tập hợp chỉ số này để đánh giá khu vực công nghiệp của thị trường chứng khoán tại Hoa Kỳ. Nó là chỉ số Mỹ lâu đời thứ hai, chỉ sau Chỉ số Trung bình Vận tải Dow Jones, cũng do Dow tạo ra.

4.2.2 Biến đầu vào

Chọn 6 biến đầu vào là 6 loại tiền ảo đang được giao dịch trên thị trường hiện nay Tiền ảo hay tiền mã hóa là một loại tiền kỹ thuật số không được kiểm soát và phát hành bởi Nhà nước, mà thường được kiểm soát và phát hành bởi các nhà phát triển của nó và được sử dụng và chấp nhận giữa các thành viên của một cộng đồng ảo cụ thể.[1] Vào năm 2014, Cơ quan ngân hàng châu Âu định nghĩa tiền ảo là “một đại diện kỹ thuật số về giá trị không được phát hành bởi ngân hàng trung ương hoặc cơ quan công quyền, cũng không nhất thiết phải gắn với tiền tệ fiat, nhưng được chấp nhận bởi các thể nhân hoặc pháp nhân như một phương tiện thanh toán và có thể được chuyển nhượng, lưu trữ hoặc giao dịch điện tử”. Ngược lại, một loại tiền kỹ thuật số do ngân hàng trung ương phát hành được định nghĩa là ” tiền tệ kỹ thuật số của ngân hàng trung ương “.

  1. BTC (Bitcoin) (đơn vị: USD)
  2. ETH (Ether) (đơn vị: USD)
  3. XRP (đơn vị: USD)
  4. THR (Tether) (đơn vị: USD)
  5. BNB (Binance Coin) (đơn vị: USD)
  6. USDC (USD Coin) (đơn vị: USD)

4.3 Mô hình nghiên cứu

\[ DJ = \beta_0 + \beta_1BTC + \beta_2ETH + \beta_3XRP + \beta_4BNB + \beta_5THR + \beta_6USC \]

LS0tDQp0aXRsZTogIkJUVk4iDQphdXRob3I6ICJOZ3V54buFbiBUaOG7iyBZ4bq/biBOaGkiDQpkYXRlOiAiMjAyMy0wNi0wNSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCmBgYHtyfQ0KcmVxdWlyZSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpzZXR3ZCgiQzovVXNlcnMvWUVOIE5ISS9Eb2N1bWVudHMvTVBOTiIpDQpkdCA8LSByZWFkX2V4Y2VsKCJkYXRhLnhsc3giLDEpDQpkYXRhIDwtIGR0WywyOjhdDQpidGMgPSBkYXRhJEJUQw0KZXRoID0gZGF0YSRFVEgNCnhycCA9IGRhdGEkWFJQDQpibmIgPSBkYXRhJEJOQg0KdGhyID0gZGF0YSRUSFINCnVzYyA9IGRhdGEkVVNDDQpkaiA9IGRhdGEkRG93am9uZXMNCmBgYA0KDQojIELDoGkgdOG6rXAgduG7gSBuaMOgIHR14bqnbiA2DQoNCkNo4bqheSBtw7QgaMOsbmggduG7m2kgY8OhYyBwaMOibiBwaOG7kWkga2jDoWMgbmhhdSBj4bunYSBjw6FjIGJp4bq/biDEkeG6p3UgdsOgbw0KDQojIyBNw7QgaMOsbmgNCg0KYGBge3J9DQptaDEgPC0gbG0oZGF0YSREb3dqb25lcyB+IGRhdGEkQlRDICsgZGF0YSRFVEggKyBkYXRhJEJOQikNCnN1bW1hcnkobWgxKQ0KYGBgDQoNCiQkIERKID0gMiw5MjhlKzA0ICsgNywzODZlLTAyICsxLDM0OGUtMDEgKzMsNzA5ZSswMEJOQiAkJA0KDQojIyBNw7QgcGjhu49uZyBk4buvIGxp4buHdQ0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCg0Kc2ltdWxhdGVfc3RvY2tfcHJpY2UgPC0gZnVuY3Rpb24oUzAsIHIsIHNpZ21hLCBOLCBkdCkgew0KICAjIE3DtCBwaOG7j25nIHogdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbg0KICBaIDwtIHJub3JtKE4sIG1lYW4gPSAwLCBzZCA9IDEpDQogIA0KICAjIFThuqFvIHJhIHZlY3RvIHLhu5duZyBjaOG7qWEgY8OhYyBnacOhIHRy4buLIGPhu6dhIGdpw6EgY+G7lSBwaGnhur91DQogIHByaWNlcyA8LSBudW1lcmljKE4pDQogIHByaWNlc1sxXSA8LSBTMA0KICANCiANCiAgZm9yIChpIGluIDE6KE4tMSkpIHsNCiAgICBkcmlmdCA8LSAociAtIDAuNSAqIHNpZ21hXjIpICogZHQNCiAgICBkaWZmdXNpb24gPC0gc2lnbWEgKiBzcXJ0KGR0KSAqIFpbaV0NCiAgICBwcmljZXNbaSsxXSA8LSBwcmljZXNbaV0gKiBleHAoZHJpZnQgKyBkaWZmdXNpb24pDQogIH0NCiAgDQogIHJldHVybihwcmljZXMpDQp9DQoNCiMgUGFyYW1ldGVycw0KUzAgPC0gZGF0YSRCVEMgWzFdICMgR2nDoSBj4buVIHBoaeG6v3UgYmFuIMSR4bqndQ0KciA8LSAwLjA1ICAjIEzDo2kgc3XhuqV0IHBoaSBy4bunaSBybw0Kc2lnbWEgPC0gc2QoZGlmZihsb2coZGF0YSRCVEMpKSkgICMgxJDhu5kgYmnhur9uIMSR4buZbmcgDQpOIDwtIDUwMSAgIyBNw7QgcGjhu49uZyB0cm9uZyA1MDEgbmfDoHkNCmR0IDwtIDEvTiAgDQoNCnNldC5zZWVkKDEyMykgDQpCVEMgPC0gc2ltdWxhdGVfc3RvY2tfcHJpY2UoUzAsIHIsIHNpZ21hLCBOLCBkdCkNCnBsb3QoQlRDLCB0eXBlID0gJ2wnLCBjb2wgPSAnYmx1ZScsIG1haW4gPSAiR2nDoSBCaXRjb2luIiwgeWxhYiA9ICJVU0QiLCB4bGFiID0gIk5nw6B5IikNCmBgYA0KDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KDQpzaW11bGF0ZV9zdG9ja19wcmljZSA8LSBmdW5jdGlvbihTMCwgciwgc2lnbWEsIE4sIGR0KSB7DQogICMgTcO0IHBo4buPbmcgeiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluDQogIFogPC0gcm5vcm0oTiwgbWVhbiA9IDAsIHNkID0gMSkNCiAgDQogICMgVOG6oW8gcmEgdmVjdG8gcuG7l25nIGNo4bupYSBjw6FjIGdpw6EgdHLhu4sgY+G7p2EgZ2nDoSBj4buVIHBoaeG6v3UNCiAgcHJpY2VzIDwtIG51bWVyaWMoTikNCiAgcHJpY2VzWzFdIDwtIFMwDQogIA0KIA0KICBmb3IgKGkgaW4gMTooTi0xKSkgew0KICAgIGRyaWZ0IDwtIChyIC0gMC41ICogc2lnbWFeMikgKiBkdA0KICAgIGRpZmZ1c2lvbiA8LSBzaWdtYSAqIHNxcnQoZHQpICogWltpXQ0KICAgIHByaWNlc1tpKzFdIDwtIHByaWNlc1tpXSAqIGV4cChkcmlmdCArIGRpZmZ1c2lvbikNCiAgfQ0KICANCiAgcmV0dXJuKHByaWNlcykNCn0NCg0KIyBQYXJhbWV0ZXJzDQpTMCA8LSBldGhbMV0gIyBHacOhIGPhu5UgcGhp4bq/dSBiYW4gxJHhuqd1DQpyIDwtIDAuMDUgICMgTMOjaSBzdeG6pXQgcGhpIHLhu6dpIHJvDQpzaWdtYSA8LSBzZChkaWZmKGxvZyhldGgpKSkgICMgxJDhu5kgYmnhur9uIMSR4buZbmcgDQpOIDwtIDUwMSAgIyBNw7QgcGjhu49uZyB0cm9uZyA1MDEgbmfDoHkNCmR0IDwtIDEvTiAgDQoNCnNldC5zZWVkKDEyMykgDQpFVEggPC0gc2ltdWxhdGVfc3RvY2tfcHJpY2UoUzAsIHIsIHNpZ21hLCBOLCBkdCkNCnBsb3QoRVRILCB0eXBlID0gJ2wnLCBjb2wgPSAnYmx1ZScsIG1haW4gPSAiR2nDoSBFVEgiLCB5bGFiID0gIlVTRCIsIHhsYWIgPSAiTmfDoHkiKQ0KYGBgDQoNCg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQoNCnNpbXVsYXRlX3N0b2NrX3ByaWNlIDwtIGZ1bmN0aW9uKFMwLCByLCBzaWdtYSwgTiwgZHQpIHsNCiAgIyBNw7QgcGjhu49uZyB6IHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4NCiAgWiA8LSBybm9ybShOLCBtZWFuID0gMCwgc2QgPSAxKQ0KICANCiAgIyBU4bqhbyByYSB2ZWN0byBy4buXbmcgY2jhu6lhIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBnacOhIGPhu5UgcGhp4bq/dQ0KICBwcmljZXMgPC0gbnVtZXJpYyhOKQ0KICBwcmljZXNbMV0gPC0gUzANCiAgDQogDQogIGZvciAoaSBpbiAxOihOLTEpKSB7DQogICAgZHJpZnQgPC0gKHIgLSAwLjUgKiBzaWdtYV4yKSAqIGR0DQogICAgZGlmZnVzaW9uIDwtIHNpZ21hICogc3FydChkdCkgKiBaW2ldDQogICAgcHJpY2VzW2krMV0gPC0gcHJpY2VzW2ldICogZXhwKGRyaWZ0ICsgZGlmZnVzaW9uKQ0KICB9DQogIA0KICByZXR1cm4ocHJpY2VzKQ0KfQ0KDQojIFBhcmFtZXRlcnMNClMwIDwtIHhycFsxXSAjIEdpw6EgY+G7lSBwaGnhur91IGJhbiDEkeG6p3UNCnIgPC0gMC4wNSAgIyBMw6NpIHN14bqldCBwaGkgcuG7p2kgcm8NCnNpZ21hIDwtIHNkKGRpZmYobG9nKHhycCkpKSAgIyDEkOG7mSBiaeG6v24gxJHhu5luZyANCk4gPC0gNTAxICAjIE3DtCBwaOG7j25nIHRyb25nIDUwMSBuZ8OgeQ0KZHQgPC0gMS9OICANCg0Kc2V0LnNlZWQoMTIzKSANClhSUCA8LSBzaW11bGF0ZV9zdG9ja19wcmljZShTMCwgciwgc2lnbWEsIE4sIGR0KQ0KcGxvdChYUlAsIHR5cGUgPSAnbCcsIGNvbCA9ICdibHVlJywgbWFpbiA9ICJHacOhIFhSUCIsIHlsYWIgPSAiVVNEIiwgeGxhYiA9ICJOZ8OgeSIpDQpgYGANCg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQoNCnNpbXVsYXRlX3N0b2NrX3ByaWNlIDwtIGZ1bmN0aW9uKFMwLCByLCBzaWdtYSwgTiwgZHQpIHsNCiAgIyBNw7QgcGjhu49uZyB6IHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4NCiAgWiA8LSBybm9ybShOLCBtZWFuID0gMCwgc2QgPSAxKQ0KICANCiAgIyBU4bqhbyByYSB2ZWN0byBy4buXbmcgY2jhu6lhIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBnacOhIGPhu5UgcGhp4bq/dQ0KICBwcmljZXMgPC0gbnVtZXJpYyhOKQ0KICBwcmljZXNbMV0gPC0gUzANCiAgDQogDQogIGZvciAoaSBpbiAxOihOLTEpKSB7DQogICAgZHJpZnQgPC0gKHIgLSAwLjUgKiBzaWdtYV4yKSAqIGR0DQogICAgZGlmZnVzaW9uIDwtIHNpZ21hICogc3FydChkdCkgKiBaW2ldDQogICAgcHJpY2VzW2krMV0gPC0gcHJpY2VzW2ldICogZXhwKGRyaWZ0ICsgZGlmZnVzaW9uKQ0KICB9DQogIA0KICByZXR1cm4ocHJpY2VzKQ0KfQ0KDQojIFBhcmFtZXRlcnMNClMwIDwtIGJuYlsxXSAjIEdpw6EgY+G7lSBwaGnhur91IGJhbiDEkeG6p3UNCnIgPC0gMC4wNSAgIyBMw6NpIHN14bqldCBwaGkgcuG7p2kgcm8NCnNpZ21hIDwtIHNkKGRpZmYobG9nKGJuYikpKSAgIyDEkOG7mSBiaeG6v24gxJHhu5luZyANCk4gPC0gNTAxICAjIE3DtCBwaOG7j25nIHRyb25nIDUwMSBuZ8OgeQ0KZHQgPC0gMS9OICANCg0Kc2V0LnNlZWQoMTIzKSANCkJOQiA8LSBzaW11bGF0ZV9zdG9ja19wcmljZShTMCwgciwgc2lnbWEsIE4sIGR0KQ0KcGxvdChCTkIsIHR5cGUgPSAnbCcsIGNvbCA9ICdibHVlJywgbWFpbiA9ICJHacOhIEJOQiIsIHlsYWIgPSAiVVNEIiwgeGxhYiA9ICJOZ8OgeSIpDQpgYGANCg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQoNCnNpbXVsYXRlX3N0b2NrX3ByaWNlIDwtIGZ1bmN0aW9uKFMwLCByLCBzaWdtYSwgTiwgZHQpIHsNCiAgIyBNw7QgcGjhu49uZyB6IHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4NCiAgWiA8LSBybm9ybShOLCBtZWFuID0gMCwgc2QgPSAxKQ0KICANCiAgIyBU4bqhbyByYSB2ZWN0byBy4buXbmcgY2jhu6lhIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBnacOhIGPhu5UgcGhp4bq/dQ0KICBwcmljZXMgPC0gbnVtZXJpYyhOKQ0KICBwcmljZXNbMV0gPC0gUzANCiAgDQogDQogIGZvciAoaSBpbiAxOihOLTEpKSB7DQogICAgZHJpZnQgPC0gKHIgLSAwLjUgKiBzaWdtYV4yKSAqIGR0DQogICAgZGlmZnVzaW9uIDwtIHNpZ21hICogc3FydChkdCkgKiBaW2ldDQogICAgcHJpY2VzW2krMV0gPC0gcHJpY2VzW2ldICogZXhwKGRyaWZ0ICsgZGlmZnVzaW9uKQ0KICB9DQogIA0KICByZXR1cm4ocHJpY2VzKQ0KfQ0KDQojIFBhcmFtZXRlcnMNClMwIDwtIHRoclsxXSAjIEdpw6EgY+G7lSBwaGnhur91IGJhbiDEkeG6p3UNCnIgPC0gMC4wNSAgIyBMw6NpIHN14bqldCBwaGkgcuG7p2kgcm8NCnNpZ21hIDwtIHNkKGRpZmYobG9nKHRocikpKSAgIyDEkOG7mSBiaeG6v24gxJHhu5luZyANCk4gPC0gNTAxICAjIE3DtCBwaOG7j25nIHRyb25nIDUwMSBuZ8OgeQ0KZHQgPC0gMS9OICANCg0Kc2V0LnNlZWQoMTIzKSANClRIUiA8LSBzaW11bGF0ZV9zdG9ja19wcmljZShTMCwgciwgc2lnbWEsIE4sIGR0KQ0KaGlzdChUSFIpDQpgYGANCg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQoNCnNpbXVsYXRlX3N0b2NrX3ByaWNlIDwtIGZ1bmN0aW9uKFMwLCByLCBzaWdtYSwgTiwgZHQpIHsNCiAgIyBNw7QgcGjhu49uZyB6IHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4NCiAgWiA8LSBybm9ybShOLCBtZWFuID0gMCwgc2QgPSAxKQ0KICANCiAgIyBU4bqhbyByYSB2ZWN0byBy4buXbmcgY2jhu6lhIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBnacOhIGPhu5UgcGhp4bq/dQ0KICBwcmljZXMgPC0gbnVtZXJpYyhOKQ0KICBwcmljZXNbMV0gPC0gUzANCiAgDQogDQogIGZvciAoaSBpbiAxOihOLTEpKSB7DQogICAgZHJpZnQgPC0gKHIgLSAwLjUgKiBzaWdtYV4yKSAqIGR0DQogICAgZGlmZnVzaW9uIDwtIHNpZ21hICogc3FydChkdCkgKiBaW2ldDQogICAgcHJpY2VzW2krMV0gPC0gcHJpY2VzW2ldICogZXhwKGRyaWZ0ICsgZGlmZnVzaW9uKQ0KICB9DQogIA0KICByZXR1cm4ocHJpY2VzKQ0KfQ0KDQojIFBhcmFtZXRlcnMNClMwIDwtIHVzY1sxXSAjIEdpw6EgY+G7lSBwaGnhur91IGJhbiDEkeG6p3UNCnIgPC0gMC4wNSAgIyBMw6NpIHN14bqldCBwaGkgcuG7p2kgcm8NCnNpZ21hIDwtIHNkKGRpZmYobG9nKHVzYykpKSAgIyDEkOG7mSBiaeG6v24gxJHhu5luZyANCk4gPC0gNTAxICAjIE3DtCBwaOG7j25nIHRyb25nIDUwMSBuZ8OgeQ0KZHQgPC0gMS9OICANCg0Kc2V0LnNlZWQoMTIzKSANClVTQyA8LSBzaW11bGF0ZV9zdG9ja19wcmljZShTMCwgciwgc2lnbWEsIE4sIGR0KQ0KcGxvdChVU0MsIHR5cGUgPSAnbCcsIGNvbCA9ICdibHVlJywgbWFpbiA9ICJHacOhIFVTQyIsIHlsYWIgPSAiVVNEIiwgeGxhYiA9ICJOZ8OgeSIpDQpgYGANCg0KIyMgQ2jhuqF5IG3DtCBow6xuaCB0aGVvIGThu68gbGnhu4d1IMSRw6MgbcO0IHBo4buPbmcNCg0KYGBge3J9DQpkaiA8LSAyLjkyOGUrMDQgKyA3LjM4NmUtMDIqQlRDICsgMS4zNDhlLTAxKkVUSCArIDMuNzA5ZSswMCpYUlANCmhpc3QoZGopDQpgYGANCg0KYGBge3J9DQpkajEgPSAoZGogLSBsYWcoZGopKQ0KcGhpZW50YW5nZ2lhIDwtIGRqMVtkajEgPiAwXQ0KcGhpZW5naWFtZ2lhIDwtIGRqMVtkajEgPCAwXQ0KbGVuZ3RoKHBoaWVudGFuZ2dpYSkNCmxlbmd0aChwaGllbnRhbmdnaWEpL2xlbmd0aChkaikNCmxlbmd0aChwaGllbmdpYW1naWEpDQpsZW5ndGgocGhpZW5naWFtZ2lhKS9sZW5ndGgoZGopDQpkajIgPC0gY3V0KGRqLCBicmVha3MgPSBjKG1pbihkaiksIG1lYW4oZGopLCBtYXgoZGopKSwgbGFiZWxzID0gYygndGjhuqVwJywnY2FvJykpDQp0YWJsZShkajIpL3N1bSh0YWJsZShkajIpKQ0KYGBgDQpUYSBjw7MgdGjhu4MgdGjhuqV5LCBjaOG7iSBz4buRIERvdyBqb25lcyDEkcaw4bujYyBtw7QgcGjhu49uZyBk4buxYSB0csOqbiBtw7QgcGjhu49uZyBnacOhIDYgbG/huqFpIHRp4buBbiDhuqNvIGPDsyB04bu3IGzhu4cgY2jhu4kgc+G7kSB0aOG6pXAgY2hp4bq/bSBjYW8gaMahbiB04bu3IGzhu4cgY2jhu4kgc+G7kSBEb3dqb25lcyBz4bq9IGNhbywgbmjGsG5nIGtow7RuZyBjaMOqbmggbOG7h2NoIG5oaeG7gXUuIFRyb25nIDUwMiBwaGnDqm4gZ2lhbyBk4buLY2ggxJHGsOG7o2MgbcO0IHBo4buPbmcgY+G7p2EgY2jhu4kgc+G7kSBEb3dqb25lcywgdGEgdGjhuqV5IGPDsyAyNjMgcGhpw6puIHTEg25nIGdpw6EgdsOgIDIzOSBwaGnDqm4gZ2nDoSBnaeG6o20uIFPhu5EgcGhpw6puIHTEg25nIGdpw6EgY8OzIHjDoWMgc3XhuqV0IHjhuqN5IHJhIGzDoCAwLDUyNDk1MDEgdsOgIHPhu5EgcGhpw6puIGdp4bqjbSBnacOhIGPDsyB4w6FjIHN14bqldCB44bqjeSByYSBsw6AgMCw0NzcwNDU5Lg0KDQojIELDoGkgdOG6rXAgduG7gSBuaMOgIHR14bqnbiA1DQoNCljDonkgZOG7sW5nIG3DtCBow6xuaCBjaG8gxJHhu5FpIHTGsOG7o25nIGPhuqduIG3DtCBwaOG7j25nIHbDoCBnaeG6o2kgdGjDrWNoIG3DtCBow6xuaA0KDQojIyBNw7QgaMOsbmggbmdoacOqbiBj4bupdQ0KDQokJCBESiA9IFxiZXRhXzAgKyBcYmV0YV8xQlRDICsgXGJldGFfMkVUSCArIFxiZXRhXzNYUlAgKyBcYmV0YV80Qk5CICsgXGJldGFfNVRIUiArIFxiZXRhXzZVU0MgJCQNCg0KYGBge3J9DQptaCA8LSBsbShkYXRhJERvd2pvbmVzIH4gZGF0YSRCVEMgKyBkYXRhJEVUSCArIGRhdGEkWFJQICsgZGF0YSRCTkIgKyBkYXRhJFRIUisgZGF0YSRVU0MpDQpzdW1tYXJ5KG1oKQ0KYGBgDQoNCiMjIEThu68gbGnhu4d1IG5naGnDqm4gY+G7qXUNCg0KTcO0IHBo4buPbmcgZ2nDoSB0cuG7iyBj4bunYSA2IGxv4bqhaSB0aeG7gW4g4bqjbyBn4buTbTogQml0Y29pbiwgRVRILCBYUlAsIFVTREMsIFRldGhlciwgQk5CIHRyb25nIGdpYWkgxJFv4bqhbiBu4butYSB0aMOhbmcgxJHhuqd1IG7Eg20gMjAyMyBn4buTbSA1MDEgcXVhbiBzw6F0Lg0KDQpgYGB7cn0NCmRhdGENCmBgYA0KDQojIELDoGkgdOG6rXAgduG7gSBuaMOgIHR14bqnbiA0DQoNCljDoWMgxJHhu4tuaCBwaMOibiBwaOG7kWkgY2hvIGPDoWMgYmnhur9uIChuZ+G6q3Ugbmhpw6puKSDEkeG6p3UgdsOgbw0KDQojIyBYw6FjIMSR4buLbmggcGjDom4gcGjhu5FpIGNobyBiaeG6v24gQlRDDQoNCiMjIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBCVEMNCg0KYGBge3J9DQpzdW1tYXJ5KGJ0YykNCnNkKGJ0YykNCmBgYA0KVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXksIGdpw6EgdGnhu4FuIEJpdGNvaW4gY8OzIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggbMOgIDMzMTQwIFVTRCwgdHJ1bmcgduG7iyBsw6AgMjk4MzIgVVNELiBCaeG6v24gQlRDIGRhbyDEkeG7mW5nIHThu6sgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgbMOgIDE1NzY2IFVTRCDEkeG6v24gZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQgbMOgIDY3NTI2IFVTRCwgduG7m2kgxJHhu5kgbOG7h2NoIGNodeG6qW4gbMOgIDEyODg2LDYxIFVTRC4NCg0KIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBiaeG6v24gQlRDDQoNCmBgYHtyfQ0KaGlzdChidGMpDQpgYGANCg0KIyMjIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbiBjaG8gQlRDDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KGJ0YykNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIEJUQyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLCB04bupYyBsw6AgYmnhur9uIEJUQyBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbi4NCg0KIyMjIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbcWpIGNobyBCVEMNCg0KYGBge3J9DQprcy50ZXN0KGJ0YywgeT1wZXhwKQ0KYGBgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgUF92YWx1ZSA8IDAuMDUgbsOqbiB0YSBiw6FjIGLhu48gJEhfMCQgcuG6sW5nIGJp4bq/biBCVEMgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpLCB04bupYyBsw6AgYmnhur9uIEJUQyBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpLg0KDQojIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSDEkeG7gXUgY2hvIEJUQw0KDQpgYGB7cn0NCmtzLnRlc3QoYnRjLCB5ID0gJ3B1bmlmJykNCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IFBfdmFsdWUgPCAwLjA1IG7Dqm4gdGEgYsOhYyBi4buPICRIXzAkIHLhurFuZyBiaeG6v24gQlRDIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdSwgdOG7qWMgbMOgIGJp4bq/biBCVEMga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdS4NCg0KIyMjIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluIGNobyBCVEMNCg0KYGBge3J9DQprcy50ZXN0KGJ0YywgeSA9ICdwbG5vcm0nKQ0KYGBgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgUF92YWx1ZSA8IDAuMDUgbsOqbiB0YSBiw6FjIGLhu48gJEhfMCQgcuG6sW5nIGJp4bq/biBCVEMgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluLCB04bupYyBsw6AgYmnhur9uIEJUQyBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluLg0KDQojIyBYw6FjIMSR4buLbmggcGjDom4gcGjhu5FpIGNobyBiaeG6v24gRVRIDQoNCiMjIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBFVEgNCg0KYGBge3J9DQpzdW1tYXJ5KGV0aCkNCnNkKGV0aCkNCmBgYA0KVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXksIGdpw6EgdGnhu4FuIEV0aGVyIGPDsyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDoCA0MzU2IFVTRCwgdHJ1bmcgduG7iyBsw6AgMzIzOCBVU0QuIEJp4bq/biBFVEggZGFvIMSR4buZbmcgdOG7qyBnacOhIHRy4buLIG5o4buPIG5o4bqldCBsw6AgMTAzOSBVU0QgxJHhur9uIGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0IGzDoCAxMDU0NSBVU0QsIHbhu5tpIMSR4buZIGzhu4djaCBjaHXhuqluIGzDoCAxMjc0MSwxMTEgVVNELg0KDQojIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGJp4bq/biBFVEgNCg0KYGBge3J9DQpoaXN0KGV0aCkNCmBgYA0KDQojIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluIGNobyBFVEgNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoZXRoKQ0KYGBgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IFBfdmFsdWUgPCAwLjA1IG7Dqm4gdGEgYsOhYyBi4buPICRIXzAkIHLhurFuZyBiaeG6v24gRVRIIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4sIHThu6ljIGzDoCBiaeG6v24gRVRIIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLg0KDQojIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakgY2hvIEVUSA0KDQpgYGB7cn0NCmtzLnRlc3QoZXRoLCB5PXBleHApDQpgYGANCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgUF92YWx1ZSA8IDAuMDUgbsOqbiB0YSBiw6FjIGLhu48gJEhfMCQgcuG6sW5nIGJp4bq/biBFVEggdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpLCB04bupYyBsw6AgYmnhur9uIEVUSCBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpLg0KDQojIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSDEkeG7gXUgY2hvIEVUSA0KDQpgYGB7cn0NCmtzLnRlc3QoZXRoLCB5ID0gJ3B1bmlmJykNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIEVUSCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUsIHThu6ljIGzDoCBiaeG6v24gRVRIIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUuDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbiBjaG8gRVRIDQoNCmBgYHtyfQ0Ka3MudGVzdChldGgsIHkgPSAncGxub3JtJykNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIEVUSCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4sIHThu6ljIGzDoCBiaeG6v24gRVRIIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4uDQoNCiMjIFjDoWMgxJHhu4tuaCBwaMOibiBwaOG7kWkgY2hvIFhSUA0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIFhSUA0KDQpgYGB7cn0NCnN1bW1hcnkoeHJwKQ0Kc2QoeHJwKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5LCBnacOhIHRp4buBbiBYUlAgY8OzIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggbMOgIDAsNjIyMiBVU0QsIHRydW5nIHbhu4sgbMOgIDAsNTA2NSBVU0QuIEJp4bq/biBYUlAgZGFvIMSR4buZbmcgdOG7qyBnacOhIHRy4buLIG5o4buPIG5o4bqldCBsw6AgMCwzMTE3IFVTRCDEkeG6v24gZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQgbMOgIDEsMjg5OCBVU0QsIHbhu5tpIMSR4buZIGzhu4djaCBjaHXhuqluIGzDoCAwLDI2ODYxMjkgVVNELg0KDQojIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGJp4bq/biBYUlANCg0KYGBge3J9DQpoaXN0KHhycCkNCmBgYA0KDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4gYmnhur9uIFhSUA0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdCh4cnApDQpgYGANCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgUF92YWx1ZSA8IDAuMDUgbsOqbiB0YSBiw6FjIGLhu48gJEhfMCQgcuG6sW5nIGJp4bq/biBYUlAgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiwgdOG7qWMgbMOgIGJp4bq/biBYUlAga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4uDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIG3FqSBjaG8gWFJQDQoNCmBgYHtyfQ0Ka3MudGVzdCh4cnAsIHk9cGV4cCkNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIFhSUCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxaksIHThu6ljIGzDoCBiaeG6v24gWFJQIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakuDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIMSR4buBdSBjaG8gWFJQDQoNCmBgYHtyfQ0Ka3MudGVzdCh4cnAsIHkgPSAncHVuaWYnKQ0KYGBgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IFBfdmFsdWUgPCAwLjA1IG7Dqm4gdGEgYsOhYyBi4buPICRIXzAkIHLhurFuZyBiaeG6v24gWFJQIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdSwgdOG7qWMgbMOgIGJp4bq/biBYUlAga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdS4NCg0KIyMjIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluIGNobyBYUlANCg0KYGBge3J9DQprcy50ZXN0KHhycCwgeSA9ICdwbG5vcm0nKQ0KYGBgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IFBfdmFsdWUgPCAwLjA1IG7Dqm4gdGEgYsOhYyBi4buPICRIXzAkIHLhurFuZyBiaeG6v24gWFJQIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbiwgdOG7qWMgbMOgIGJp4bq/biBYUlAga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbi4NCg0KIyMgWMOhYyDEkeG7i25oIHBow6JuIHBo4buRaSBiaeG6v24gQk5CDQoNCiMjIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gQk5CDQoNCmBgYHtyfQ0Kc3VtbWFyeShibmIpDQpzZChibmIpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXksIGdpw6EgdGnhu4FuIFhSUCBjw7MgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBsw6AgMzU0LDkgVVNELCB0cnVuZyB24buLIGzDoCAzMjAsOCBVU0QuIEJp4bq/biBYUlAgZGFvIMSR4buZbmcgdOG7qyBnacOhIHRy4buLIG5o4buPIG5o4bqldCBsw6AgMjEwLDEgVVNEIMSR4bq/biBnacOhIHRy4buLIGzhu5tuIG5o4bqldCBsw6AgNjUzLDggVVNELCB24bubaSDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgOTQsMDg3ODQgVVNELg0KDQojIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGJp4bq/biBCTkINCg0KYGBge3J9DQpoaXN0KGJuYikNCmBgYA0KDQojIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluIGJp4bq/biBCTkINCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoYm5iKQ0KYGBgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IFBfdmFsdWUgPCAwLjA1IG7Dqm4gdGEgYsOhYyBi4buPICRIXzAkIHLhurFuZyBiaeG6v24gQk5CIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4sIHThu6ljIGzDoCBiaeG6v24gQk5CIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLg0KDQojIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBtxakgY2hvIEJOQg0KDQpgYGB7cn0NCmtzLnRlc3QoYm5iLCB5PXBleHApDQpgYGANCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgUF92YWx1ZSA8IDAuMDUgbsOqbiB0YSBiw6FjIGLhu48gJEhfMCQgcuG6sW5nIGJp4bq/biBCTkIgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpLCB04bupYyBsw6AgYmnhur9uIEJOQiBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgbcWpLg0KDQojIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSDEkeG7gXUgY2hvIEJOQg0KDQpgYGB7cn0NCmtzLnRlc3QoYm5iLCB5ID0gJ3B1bmlmJykNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIEJOQiB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUsIHThu6ljIGzDoCBiaeG6v24gQk5CIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSDEkeG7gXUuDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbiBjaG8gQk5CDQoNCmBgYHtyfQ0Ka3MudGVzdChibmIsIHkgPSAncGxub3JtJykNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIEJOQiB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4sIHThu6ljIGzDoCBiaeG6v24gQk5CIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4uDQoNCiMjIFjDoWMgxJHhu4tuaCBwaMOibiBwaOG7kWkgYmnhur9uIFRIUg0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIFRIUg0KDQpgYGB7cn0NCnN1bW1hcnkodGhyKQ0Kc2QodGhyKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5LCBnacOhIHRp4buBbiBUSFIgY8OzIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggbMOgIDEsMDAwMSBVU0QsIHRydW5nIHbhu4sgbMOgIDEsMDAwMiBVU0QuIEJp4bq/biBUSFIgZGFvIMSR4buZbmcgdOG7qyBnacOhIHRy4buLIG5o4buPIG5o4bqldCBsw6AgMCw5OTY4IFVTRCDEkeG6v24gZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQgbMOgIDEsMDA0MSBVU0QsIHbhu5tpIMSR4buZIGzhu4djaCBjaHXhuqluIGzDoCAwLDAwMDU3OTMwNiBVU0QuDQoNCiMjIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgYmnhur9uIFRIUg0KDQpgYGB7cn0NCmhpc3QodGhyKQ0KYGBgDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4gYmnhur9uIFRIUg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdCh0aHIpDQpgYGANCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgUF92YWx1ZSA8IDAuMDUgbsOqbiB0YSBiw6FjIGLhu48gJEhfMCQgcuG6sW5nIGJp4bq/biBUSFIgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiwgdOG7qWMgbMOgIGJp4bq/biBUSFIga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4uDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIG3FqSBjaG8gVEhSDQoNCmBgYHtyfQ0Ka3MudGVzdCh0aHIsIHk9cGV4cCkNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIFRIUiB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxaksIHThu6ljIGzDoCBiaeG6v24gVEhSIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakuDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIMSR4buBdSBjaG8gVEhSDQoNCmBgYHtyfQ0Ka3MudGVzdCh0aHIsIHkgPSAncHVuaWYnKQ0KYGBgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IFBfdmFsdWUgPCAwLjA1IG7Dqm4gdGEgYsOhYyBi4buPICRIXzAkIHLhurFuZyBiaeG6v24gVEhSIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdSwgdOG7qWMgbMOgIGJp4bq/biBUSFIga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIMSR4buBdS4NCg0KIyMjIyBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgbG9nYSBjaHXhuqluIGNobyBUSFINCg0KYGBge3J9DQprcy50ZXN0KHRociwgeSA9ICdwbG5vcm0nKQ0KYGBgDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IFBfdmFsdWUgPCAwLjA1IG7Dqm4gdGEgYsOhYyBi4buPICRIXzAkIHLhurFuZyBiaeG6v24gVEhSIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbiwgdOG7qWMgbMOgIGJp4bq/biBUSFIga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGxvZ2EgY2h14bqpbi4NCg0KIyMgWMOhYyDEkeG7i25oIHBow6JuIHBo4buRaSBjaG8gYmnhur9uIFVTQw0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgVVNDDQoNCmBgYHtyfQ0Kc3VtbWFyeSh1c2MpDQpzZCh1c2MpDQpgYGANClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5LCBnacOhIHRp4buBbiBVU0RDIGPDsyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDoCAwLDk5OTUgVVNELCB0cnVuZyB24buLIGzDoCAwLDk5OTggVVNELiBCaeG6v24gVVNDIGRhbyDEkeG7mW5nIHThu6sgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgbMOgIDAsOTYwOCBVU0QgxJHhur9uIGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0IGzDoCAxLDAwMzIgVVNELCB24bubaSDEkeG7mSBs4buHY2ggY2h14bqpbiBsw6AgMCwwMDE5OTU1MjkgVVNELg0KDQojIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGJp4bq/biBVU0MNCg0KYGBge3J9DQpoaXN0KHVzYykNCmBgYA0KDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4gY2hvIFVTQw0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdCh1c2MpDQpgYGANCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgUF92YWx1ZSA8IDAuMDUgbsOqbiB0YSBiw6FjIGLhu48gJEhfMCQgcuG6sW5nIGJp4bq/biBVU0MgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiwgdOG7qWMgbMOgIGJp4bq/biBVU0Mga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4uDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIG3FqSBjaG8gVVNDDQoNCmBgYHtyfQ0Ka3MudGVzdCh1c2MsIHk9cGV4cCkNCmBgYA0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIFVTQyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxaksIHThu6ljIGzDoCBiaeG6v24gVVNDIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBtxakuDQoNCiMjIyMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIMSR4buBdSBjaG8gVVNDDQoNCmBgYHtyfQ0Ka3MudGVzdCh1c2MsIHkgPSAncHVuaWYnKQ0KYGBgDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgUF92YWx1ZSA8IDAuMDUgbsOqbiB0YSBiw6FjIGLhu48gJEhfMCQgcuG6sW5nIGJp4bq/biBVU0MgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1LCB04bupYyBsw6AgYmnhur9uIFVTQyBraMO0bmcgdHXDom4gdGhlbyBwaMOibiBwaOG7kWkgxJHhu4F1Lg0KDQojIyMjIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4gY2hvIFVTQw0KDQpgYGB7cn0NCmtzLnRlc3QodXNjLCB5ID0gJ3Bsbm9ybScpDQpgYGANCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBQX3ZhbHVlIDwgMC4wNSBuw6puIHRhIGLDoWMgYuG7jyAkSF8wJCBy4bqxbmcgYmnhur9uIFVTQyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4sIHThu6ljIGzDoCBiaeG6v24gVVNDIGtow7RuZyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBsb2dhIGNodeG6qW4uDQoNCiMgQsOgaSB04bqtcCB24buBIG5ow6AgdHXhuqduIDItMw0KDQpDaOG7jW4gdsOgIGdp4bqjaSB0aMOtY2ggduG7gSDEkeG7kWkgdMaw4bujbmcgKHbhuqVuIMSR4buBKSBj4bqnbiBtw7QgcGjhu49uZw0KDQojIyDEkOG7gSB0w6BpDQoNCk3DtCBwaOG7j25nIGNo4buJIHPhu5EgY2jhu6luZyBraG/DoW4gRG93am9uZXMuDQoNCiMjIENo4buNbiB2w6AgZ2nhuqNpIHRow61jaCDEkeG7kWkgdMaw4bujbmcNCg0KIyMjIEJp4bq/biDEkeG6p3UgcmENCg0KQmnhur9uIMSR4bqndSByYSBsw6AgREogKERvd2pvbmVzKTogQ2jhu4kgc+G7kSB0cnVuZyBiw6xuaCBjw7RuZyBuZ2hp4buHcCBEb3cgSm9uZXMgaGF5IENo4buJIHPhu5EgYsOsbmggcXXDom4gY8O0bmcgbmdoaeG7h3AgRG93IEpvbmVzICh0aeG6v25nIEFuaDogRG93IEpvbmVzIEluZHVzdHJpYWwgQXZlcmFnZSwgdmnhur90IHThuq90IERKSUEsIGPDsm4gZ+G7jWkgRG93IDMwLCBEb3cgSm9uZXMgY8O0bmcgbmdoaeG7h3AsIGhv4bq3YyBEb3cgSm9uZXM7IE5ZU0U6IERKSSBMxrB1IHRy4buvIDIwMDgtMTAtMjYgdOG6oWkgV2F5YmFjayBNYWNoaW5lKSBsw6AgbeG7mXQgdHJvbmcgdsOgaSBjaOG7iSBz4buRIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiDEkcaw4bujYyB04bqhbyByYSBi4bufaSBDaGFybGVzIERvdywgY2jhu6cgYsOhbyBUaGUgV2FsbCBTdHJlZXQgSm91cm5hbCB2w6AgxJHhu5NuZyBzw6FuZyBs4bqtcCB2acOqbiBj4bunYSBjw7RuZyB0eSBEb3cgSm9uZXMgJiBDb21wYW55IHbDoG8gdGjhur8ga+G7tyAxOS4gRG93IHThuq1wIGjhu6NwIGNo4buJIHPhu5EgbsOgeSDEkeG7gyDEkcOhbmggZ2nDoSBraHUgduG7sWMgY8O0bmcgbmdoaeG7h3AgY+G7p2EgdGjhu4sgdHLGsOG7nW5nIGNo4bupbmcga2hvw6FuIHThuqFpIEhvYSBL4buzLiBOw7MgbMOgIGNo4buJIHPhu5EgTeG7uSBsw6J1IMSR4budaSB0aOG7qSBoYWksIGNo4buJIHNhdSBDaOG7iSBz4buRIFRydW5nIGLDrG5oIFbhuq1uIHThuqNpIERvdyBKb25lcywgY8WpbmcgZG8gRG93IHThuqFvIHJhLg0KDQojIyMgQmnhur9uIMSR4bqndSB2w6BvDQoNCkNo4buNbiA2IGJp4bq/biDEkeG6p3UgdsOgbyBsw6AgNiBsb+G6oWkgdGnhu4FuIOG6o28gxJFhbmcgxJHGsOG7o2MgZ2lhbyBk4buLY2ggdHLDqm4gdGjhu4sgdHLGsOG7nW5nIGhp4buHbiBuYXkNClRp4buBbiDhuqNvIGhheSB0aeG7gW4gbcOjIGjDs2EgbMOgIG3hu5l0IGxv4bqhaSB0aeG7gW4ga+G7uSB0aHXhuq10IHPhu5Ega2jDtG5nIMSRxrDhu6NjIGtp4buDbSBzb8OhdCB2w6AgcGjDoXQgaMOgbmggYuG7n2kgTmjDoCBuxrDhu5tjLCBtw6AgdGjGsOG7nW5nIMSRxrDhu6NjIGtp4buDbSBzb8OhdCB2w6AgcGjDoXQgaMOgbmggYuG7n2kgY8OhYyBuaMOgIHBow6F0IHRyaeG7g24gY+G7p2EgbsOzIHbDoCDEkcaw4bujYyBz4butIGThu6VuZyB2w6AgY2jhuqVwIG5o4bqtbiBnaeG7r2EgY8OhYyB0aMOgbmggdmnDqm4gY+G7p2EgbeG7mXQgY+G7mW5nIMSR4buTbmcg4bqjbyBj4bulIHRo4buDLlsxXSBWw6BvIG7Eg20gMjAxNCwgQ8ahIHF1YW4gbmfDom4gaMOgbmcgY2jDonUgw4J1IMSR4buLbmggbmdoxKlhIHRp4buBbiDhuqNvIGzDoCAibeG7mXQgxJHhuqFpIGRp4buHbiBr4bu5IHRodeG6rXQgc+G7kSB24buBIGdpw6EgdHLhu4sga2jDtG5nIMSRxrDhu6NjIHBow6F0IGjDoG5oIGLhu59pIG5nw6JuIGjDoG5nIHRydW5nIMawxqFuZyBob+G6t2MgY8ahIHF1YW4gY8O0bmcgcXV54buBbiwgY8Wpbmcga2jDtG5nIG5o4bqldCB0aGnhur90IHBo4bqjaSBn4bqvbiB24bubaSB0aeG7gW4gdOG7hyBmaWF0LCBuaMawbmcgxJHGsOG7o2MgY2jhuqVwIG5o4bqtbiBi4bufaSBjw6FjIHRo4buDIG5ow6JuIGhv4bq3YyBwaMOhcCBuaMOibiBuaMawIG3hu5l0IHBoxrDGoW5nIHRp4buHbiB0aGFuaCB0b8OhbiB2w6AgY8OzIHRo4buDIMSRxrDhu6NjIGNodXnhu4NuIG5oxrDhu6NuZywgbMawdSB0cuG7ryBob+G6t2MgZ2lhbyBk4buLY2ggxJFp4buHbiB04butIOKAnS4gTmfGsOG7o2MgbOG6oWksIG3hu5l0IGxv4bqhaSB0aeG7gW4ga+G7uSB0aHXhuq10IHPhu5EgZG8gbmfDom4gaMOgbmcgdHJ1bmcgxrDGoW5nIHBow6F0IGjDoG5oIMSRxrDhu6NjIMSR4buLbmggbmdoxKlhIGzDoCAiIHRp4buBbiB04buHIGvhu7kgdGh14bqtdCBz4buRIGPhu6dhIG5nw6JuIGjDoG5nIHRydW5nIMawxqFuZyAiLg0KDQoxLiBCVEMgKEJpdGNvaW4pICjEkcahbiB24buLOiBVU0QpDQoyLiBFVEggKEV0aGVyKSAoxJHGoW4gduG7izogVVNEKQ0KMy4gWFJQICjEkcahbiB24buLOiBVU0QpDQo0LiBUSFIgKFRldGhlcikgKMSRxqFuIHbhu4s6IFVTRCkNCjUuIEJOQiAoQmluYW5jZSBDb2luKSAoxJHGoW4gduG7izogVVNEKQ0KNi4gVVNEQyAoVVNEIENvaW4pICjEkcahbiB24buLOiBVU0QpDQoNCiMjIE3DtCBow6xuaCBuZ2hpw6puIGPhu6l1DQoNCiQkIERKID0gXGJldGFfMCArIFxiZXRhXzFCVEMgKyBcYmV0YV8yRVRIICsgXGJldGFfM1hSUCArIFxiZXRhXzRCTkIgKyBcYmV0YV81VEhSICsgXGJldGFfNlVTQyAkJA0K