## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'psych' was built under R version 4.3.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## Warning: package 'DescTools' was built under R version 4.3.3
## 
## Attaching package: 'DescTools'
## The following objects are masked from 'package:psych':
## 
##     AUC, ICC, SD
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.0
## ✔ readr     2.1.5     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%()    masks ggplot2::%+%()
## ✖ psych::alpha()  masks ggplot2::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## 
## Attaching package: 'scales'
## 
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
## 
## 
## The following objects are masked from 'package:psych':
## 
##     alpha, rescale
## Warning: package 'AER' was built under R version 4.3.3
## Loading required package: car
## Warning: package 'car' was built under R version 4.3.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.3.3
## 
## Attaching package: 'car'
## 
## The following object is masked from 'package:purrr':
## 
##     some
## 
## The following object is masked from 'package:DescTools':
## 
##     Recode
## 
## The following object is masked from 'package:psych':
## 
##     logit
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## Loading required package: lmtest
## Warning: package 'lmtest' 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
## 
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 4.3.3
## Loading required package: survival
## 
## Attaching package: 'survival'
## 
## The following object is masked from 'package:epitools':
## 
##     ratetable
## Warning: package 'datarium' was built under R version 4.3.3
## Warning: package 'Ecdat' was built under R version 4.3.3
## Loading required package: Ecfun
## Warning: package 'Ecfun' was built under R version 4.3.3
## 
## Attaching package: 'Ecfun'
## 
## The following object is masked from 'package:DescTools':
## 
##     BoxCox
## 
## The following object is masked from 'package:base':
## 
##     sign
## 
## 
## Attaching package: 'Ecdat'
## 
## The following object is masked from 'package:carData':
## 
##     Mroz
## 
## The following object is masked from 'package:datasets':
## 
##     Orange
## Warning: package 'ISLR' was built under R version 4.3.3

1 Bộ dữ liệu Credit

Bộ dữ liệu Credit chứa thông tin về khách hàng vay tín dụng từ một ngân hàng, với mục tiêu chính là dự đoán khả năng vỡ nợ của khách hàng dựa trên các đặc điểm nhân khẩu học và tài chính của họ. Đây là một bộ dữ liệu lý tưởng để nghiên cứu về rủi ro tín dụng, hành vi vay mượn của người tiêu dùng, và phân tích tài chính cá nhân.

Bộ dữ liệu này có tổng cộng 400 quan sát và 11 biến.

Các biến định tính (Qualitative/Categorical Variables) nổi bật:

  • Gender: Giới tính của khách hàng (Male/Female).

  • Student: Tình trạng sinh viên (Yes/No). Sinh viên thường có hành vi chi tiêu và thu nhập khác biệt.

  • Married: Tình trạng hôn nhân (Yes/No). Tình trạng hôn nhân có thể ảnh hưởng đến khả năng tài chính và quyết định vay mượn.

  • Ethnicity: Dân tộc của khách hàng (Caucasian/Asian/African American). Biến này có thể được sử dụng để kiểm tra sự khác biệt trong việc cấp tín dụng giữa các nhóm dân tộc, hoặc liệu có sự phân biệt đối xử hay không.

Các biến định lượng (Quantitative/Numerical Variables) nổi bật:

  • Income: Thu nhập hàng năm của khách hàng (tính bằng ngàn đô la). Đây là một yếu tố quan trọng ảnh hưởng đến khả năng trả nợ.

  • Limit: Hạn mức tín dụng của khách hàng (tính bằng đô la).

  • Rating: Điểm tín dụng của khách hàng (thường là một thước đo của uy tín tài chính).

  • Cards: Số lượng thẻ tín dụng mà khách hàng đang sở hữu.

  • Age: Tuổi của khách hàng.

  • Education: Số năm học vấn của khách hàng.

  • Balance: Số dư nợ tín dụng trung bình hàng tháng của khách hàng (tính bằng đô la). Đây thường là biến phụ thuộc chính khi dự đoán khả năng vỡ nợ hoặc rủi ro tín dụng.

d <- Credit
datatable(d)
  • Cấu trúc bộ dữ liệu
str(d)
## 'data.frame':    400 obs. of  12 variables:
##  $ ID       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Income   : num  14.9 106 104.6 148.9 55.9 ...
##  $ Limit    : int  3606 6645 7075 9504 4897 8047 3388 7114 3300 6819 ...
##  $ Rating   : int  283 483 514 681 357 569 259 512 266 491 ...
##  $ Cards    : int  2 3 4 3 2 4 2 2 5 3 ...
##  $ Age      : int  34 82 71 36 68 77 37 87 66 41 ...
##  $ Education: int  11 15 11 11 16 10 12 9 13 19 ...
##  $ Gender   : Factor w/ 2 levels " Male","Female": 1 2 1 2 1 1 2 1 2 2 ...
##  $ Student  : Factor w/ 2 levels "No","Yes": 1 2 1 1 1 1 1 1 1 2 ...
##  $ Married  : Factor w/ 2 levels "No","Yes": 2 2 1 1 2 1 1 1 1 2 ...
##  $ Ethnicity: Factor w/ 3 levels "African American",..: 3 2 2 2 3 3 1 2 3 1 ...
##  $ Balance  : int  333 903 580 964 331 1151 203 872 279 1350 ...

Bộ dữ liệu Credit được sử dụng trong nghiên cứu này chứa thông tin của 400 khách hàng vay tín dụng, với tổng cộng 12 biến. Cấu trúc của bộ dữ liệu (str(d)) cho thấy sự kết hợp của cả biến định lượng và định tính. Các biến định lượng bao gồm ID, Income, Limit, Rating, Cards, Age, Education, và Balance (đều là kiểu số nguyên hoặc số thực), cung cấp thông tin về tài chính và nhân khẩu học. Trong khi đó, các biến định tính bao gồm Gender, Student, Married, và Ethnicity (đều được định dạng là yếu tố với các cấp độ tương ứng), đại diện cho các đặc điểm phân loại của khách hàng. Sự đa dạng trong cấu trúc biến này tạo nền tảng vững chắc cho việc phân tích toàn diện các yếu tố ảnh hưởng đến rủi ro tín dụng và hành vi tài chính.

  • Lọc các biến định lượng của bộ dữ liệu Credit
d1 <- subset(d,select=-c(Income, Limit, Rating, Cards, Age, Education, Balance))
datatable(d1)
  • Kiểm tra dữ liệu bị thiếu
a <-is.na(d1)
datatable(a)
sum(is.na(d1))
## [1] 0
which(is.na(d1))
## integer(0)

Để đảm bảo chất lượng dữ liệu, quá trình kiểm tra dữ liệu bị thiếu (missing data) đã được tiến hành trên bộ dữ liệu Credit. Bằng cách sử dụng các hàm kiểm tra trong R như is.na() và sum(is.na()), kết quả cho thấy toàn bộ bộ dữ liệu không chứa bất kỳ giá trị NA nào. Cụ thể, tổng số giá trị thiếu được xác định là 0, đồng thời không có chỉ số nào được trả về cho các vị trí có dữ liệu thiếu. Điều này khẳng định bộ dữ liệu Credit là hoàn chỉnh và không yêu cầu bất kỳ bước xử lý dữ liệu thiếu nào, giúp quá trình phân tích tiếp theo được thực hiện trên nền tảng dữ liệu đáng tin cậy.

2 Phân tích mô tả các biến định tính

2.1 Biến Gender

Thống kê mô tả biến Gender thông qua bảng tần số, tần suất và đồ thị.

Bảng tần số:

table(d1$Gender)
## 
##   Male Female 
##    193    207

Bảng tần suất:

a2 <- table(d1$Gender)/sum(nrow(d1))
a2
## 
##   Male Female 
## 0.4825 0.5175

Vậy trong bộ dữ liệu này có 48.25% nam và 51.75% nữ.

Đồ thị biểu diễn tỷ lệ phần trăm giới tính khách hàng vay tín dụng từ một ngân hàng:

pie(a2,
    labels = paste(names(a2), round(a2, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ Gender") 

  • Nhận xét về biến Gender trong bộ dữ liệu Credit:

    • Phân tích biến Gender (Giới tính) trong bộ dữ liệu khách hàng vay tín dụng của ngân hàng cho thấy sự phân bổ tương đối đồng đều giữa nam và nữ. Cụ thể, trong tổng số 400 khách hàng, có 193 khách hàng nam và 207 khách hàng nữ.

    • Khi tính toán tần suất tương đối, tỷ lệ khách hàng nam chiếm khoảng 48.25%, trong khi khách hàng nữ chiếm 51.75%. Mặc dù có một sự chênh lệch nhỏ, với số lượng nữ giới nhiều hơn một chút, sự phân phối này vẫn cho thấy ngân hàng đang phục vụ một tập khách hàng khá cân bằng về giới tính.

    • Điều này có ý nghĩa quan trọng trong việc đảm bảo tính đại diện của dữ liệu khi phân tích hành vi vay tín dụng và rủi ro tín dụng. Đồng thời, nó cũng gợi mở khả năng không có sự thiên lệch đáng kể về giới tính trong tập khách hàng hiện tại của ngân hàng, giúp các mô hình dự đoán tín dụng không bị ảnh hưởng quá nhiều bởi yếu tố giới tính.

2.2 Biến Married

Thống kê mô tả biến Married thông qua bảng tần số, tần suất và đồ thị.

Bảng tần số:

table(d1$Married)
## 
##  No Yes 
## 155 245

Bảng tần suất:

a4 <- table(d1$Married)/sum(nrow(d1))
a4
## 
##     No    Yes 
## 0.3875 0.6125

Vậy trong bộ dữ liệu này có 38.75% chưa kết hơn và 61.25% đã kết hôn. Đồ thị biểu diễn tỷ lệ phần trăm tình trạng hôn nhân của khách hàng vay tín dụng từ một ngân hàng:

pie(a4,
    labels = paste(names(a4), round(a4, 2), "%"),
    main = "Biểu đồ tròn: Tỷ lệ Married") 

  • Nhận xét về biến Married trong bộ dữ liệu Credit:

    Dựa trên kết quả phân tích biến “Married” (Tình trạng hôn nhân) từ bộ dữ liệu Credit, chúng ta thấy rằng trong số những khách hàng vay tín dụng, nhóm đã kết hôn chiếm tỷ lệ lớn hơn (61.25%) so với nhóm chưa kết hôn (38.75%), được thể hiện rõ ràng qua bảng tần số, tần suất và biểu đồ tròn. Điều này có thể gợi ý rằng các tổ chức tín dụng có thể có xu hướng ưu tiên hoặc đánh giá cao hơn đối với các cá nhân đã kết hôn khi xét duyệt khoản vay, có thể do giả định về sự ổn định tài chính và trách nhiệm cao hơn.

3 Phân thích sự tác động của các yếu tố đến tình trạng hôn nhân

3.1 Biến Married và biến Student

Bảng tần số chéo

f <- table(d1$Student, d1$Married)
addmargins(f)
##      
##        No Yes Sum
##   No  135 225 360
##   Yes  20  20  40
##   Sum 155 245 400

Bảng tần suất chéo theo tỷ lệ hàng

f1 <- prop.table(f,margin=1)
f1
##      
##          No   Yes
##   No  0.375 0.625
##   Yes 0.500 0.500

Trực quan hóa

f2 <- as.data.frame(f1)
colnames(f2) <- c("Student", "Married", "Proportion")

ggplot(f2,aes(x=Married, y=Proportion, fill=Student)) + geom_bar(stat = "identity", position="dodge") + labs(title=" Tỷ lệ sinh viên theo tình trạng hôn nhân ", x="Tình trạng hôn nhân", y = "Tỷ lệ", fill="Tình trạng sinh viên") + theme_minimal() + scale_y_continuous(labels = scales::percent) + scale_x_discrete(labels=c("No"="Chưa kết hôn", "Yes"="Đã kết hôn")) + scale_fill_manual(values=c("Yes"="pink", "No"="blue")) + geom_text(aes(label=Proportion), position=position_dodge(width=0.9),vjust=0.5)

Đánh giá mối quan hệ giữa hai biến

Xem xét giữa hai biến có mối quan hệ có ý nghĩa thống kê hay độc lập với nhau bằng cách sử dụng kiểm định Chi-bình phương.
Đặt giả thuyết:

\[ \begin{cases} H_0: \text{Biến Married và biến Student không có mối quan hệ.} \\ H_1: \text{Biến Married và biến Student có mối quan hệ.} \end{cases} \]

 chisq.test(f)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  f
## X-squared = 1.8726, df = 1, p-value = 0.1712

Relative risk
TH1: Chưa kết hôn làm biến tham chiếu.

riskratio(f)
## $data
##        
##          No Yes Total
##   No    135 225   360
##   Yes    20  20    40
##   Total 155 245   400
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   No       1.0        NA       NA
##   Yes      0.8 0.5808839 1.101769
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.1314841    0.1277251  0.1236886
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

TH2: Đã kết hôn làm tham chiếu

riskratio(f,rev="b")
## $data
##        
##         Yes  No Total
##   Yes    20  20    40
##   No    225 135   360
##   Total 245 155   400
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   Yes     1.00        NA       NA
##   No      0.75 0.5352316 1.050947
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   Yes         NA           NA         NA
##   No   0.1314841    0.1277251  0.1236886
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Odd ratio

oddsratio(f)
## $data
##        
##          No Yes Total
##   No    135 225   360
##   Yes    20  20    40
##   Total 155 245   400
## 
## $measure
##      odds ratio with 95% C.I.
##        estimate     lower    upper
##   No  1.0000000        NA       NA
##   Yes 0.6008255 0.3092448 1.166806
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.1314841    0.1277251  0.1236886
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

3.2 Biến Married và Gender

Bảng tần số chéo

l <- table(d1$Married, d1$Gender)
addmargins(l)
##      
##        Male Female Sum
##   No     76     79 155
##   Yes   117    128 245
##   Sum   193    207 400

Bảng tần suất chéo theo tỷ lệ hàng

l1 <- prop.table(l,margin=1)
l1
##      
##            Male    Female
##   No  0.4903226 0.5096774
##   Yes 0.4775510 0.5224490

Trực quan hóa

l2 <- as.data.frame(l1)
colnames(l2) <- c("Married", "Gender", "Proportion")

ggplot(l2,aes(x=Married, y=Proportion, fill=Gender)) + geom_bar(stat = "identity", position="dodge") + labs(title=" Tỷ lệ giới tính theo tình trạng hôn nhân ", x="Tình trạng hôn nhân", y = "Tỷ lệ", fill="Tình trạng giới tính") + theme_minimal() + scale_y_continuous(labels = scales::percent) + scale_x_discrete(labels=c("No"="Chưa kết hôn", "Yes"="Đã kết hôn")) + scale_fill_manual(values=c("orange", "seagreen")) + geom_text(aes(label = round(Proportion, 2)), position=position_dodge(width=0.9),vjust=0.5)

Đánh giá mối quan hệ giữa hai biến

Xem xét giữa hai biến có mối quan hệ có ý nghĩa thống kê hay độc lập với nhau bằng cách sử dụng kiểm định Chi-bình phương.
Đặt giả thuyết:

\[ \begin{cases} H_0: \text{Biến Married và biến Gender độc lập.} \\ H_1: \text{Biến Married và biến Gender không độc lập.} \end{cases} \]

 chisq.test(l)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  l
## X-squared = 0.021415, df = 1, p-value = 0.8837

Relative risk
TH1: Chưa kết hôn làm biến tham chiếu.

riskratio(l)
## $data
##        
##          Male Female Total
##   No       76     79   155
##   Yes     117    128   245
##   Total   193    207   400
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   No  1.000000        NA       NA
##   Yes 1.025058 0.8431306 1.246241
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.8041984    0.8375793  0.8033343
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

TH2: Đã kết hôn làm tham chiếu

riskratio(l,rev="b")
## $data
##        
##         Female  Male Total
##   Yes      128   117   245
##   No        79    76   155
##   Total    207   193   400
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate    lower   upper
##   Yes 1.000000       NA      NA
##   No  1.026744 0.834629 1.26308
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   Yes         NA           NA         NA
##   No   0.8041984    0.8375793  0.8033343
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Odd ratio

oddsratio(l)
## $data
##        
##          Male Female Total
##   No       76     79   155
##   Yes     117    128   245
##   Total   193    207   400
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate     lower    upper
##   No  1.000000        NA       NA
##   Yes 1.052341 0.7027552 1.575668
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes  0.8041984    0.8375793  0.8033343
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

3.3 Biến Married và Ethnicity

Bảng tần số chéo

g <- table(d1$Married, d1$Ethnicity)
addmargins(g)
##      
##       African American Asian Caucasian Sum
##   No                47    32        76 155
##   Yes               52    70       123 245
##   Sum               99   102       199 400

Bảng tần suất chéo theo tỷ lệ hàng

g1 <- prop.table(g,margin=1)
g1
##      
##       African American     Asian Caucasian
##   No         0.3032258 0.2064516 0.4903226
##   Yes        0.2122449 0.2857143 0.5020408

Trực quan hóa

g2 <- as.data.frame(g1)
colnames(g2) <- c("Married", "Ethnicity", "Proportion")

ggplot(g2,aes(x=Married, y=Proportion, fill=Ethnicity)) + geom_bar(stat = "identity", position="dodge") + labs(title=" Tỷ lệ dân tộc theo tình trạng hôn nhân ", x="Tình trạng hôn nhân", y = "Tỷ lệ", fill="Tình trạng dân tộc") + theme_minimal() + scale_y_continuous(labels = scales::percent) + scale_x_discrete(labels=c("No"="Chưa kết hôn", "Yes"="Đã kết hôn")) + scale_fill_manual(values=c("lightgreen", "salmon", "coral")) + geom_text(aes(label = round(Proportion, 2)), position=position_dodge(width=0.9),vjust=0.5)

Đánh giá mối quan hệ giữa hai biến

Xem xét giữa hai biến có mối quan hệ có ý nghĩa thống kê hay độc lập với nhau bằng cách sử dụng kiểm định Chi-bình phương.
Đặt giả thuyết:

\[ \begin{cases} H_0: \text{Biến Married và biến Ethnicity độc lập.} \\ H_1: \text{Biến Married và biến Ethnicity không độc lập.} \end{cases} \]

 chisq.test(g)
## 
##  Pearson's Chi-squared test
## 
## data:  g
## X-squared = 5.5404, df = 2, p-value = 0.06265

Relative risk
TH1: Chưa kết hôn làm biến tham chiếu.

riskratio(g)
## $data
##        
##         African American Asian Caucasian Total
##   No                  47    32        76   155
##   Yes                 52    70       123   245
##   Total               99   102       199   400
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate    lower    upper
##   No  1.000000       NA       NA
##   Yes 1.416496 1.041096 1.927259
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes 0.02049846   0.06146181 0.06265036
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

TH2: Đã kết hôn làm tham chiếu

riskratio(g,rev="b")
## $data
##        
##         Caucasian Asian African American Total
##   Yes         123    70               52   245
##   No           76    32               47   155
##   Total       199   102               99   400
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate     lower   upper
##   Yes 1.0000000        NA      NA
##   No  0.8169312 0.5782109 1.15421
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   Yes         NA           NA         NA
##   No   0.2462415   0.06146181 0.06265036
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Odd ratio

oddsratio(g)
## $data
##        
##         African American Asian Caucasian Total
##   No                  47    32        76   155
##   Yes                 52    70       123   245
##   Total               99   102       199   400
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate    lower    upper
##   No  1.000000       NA       NA
##   Yes 1.967785 1.109418 3.527167
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   No          NA           NA         NA
##   Yes 0.02049846   0.06146181 0.06265036
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

4 Phân thích sự tác động của các yếu tố đến tình trạng giới tính

4.1 Biến Gender và biến Student

Bảng tần số chéo

s <- table(d1$Gender, d1$Student)
addmargins(s)
##         
##           No Yes Sum
##    Male  177  16 193
##   Female 183  24 207
##   Sum    360  40 400

Bảng tần suất chéo theo tỷ lệ hàng

s1 <- prop.table(s,margin=1)
s1
##         
##                  No        Yes
##    Male  0.91709845 0.08290155
##   Female 0.88405797 0.11594203

Trực quan hóa

s2 <- as.data.frame(s1)
colnames(s2) <- c("Gender", "Student", "Proportion")

ggplot(s2,aes(x=Gender, y=Proportion, fill=Student)) + geom_bar(stat = "identity", position="dodge") + labs(title=" Tỷ lệ sinh viên theo tình trạng giới tính ", x="Tình trạng giới tính", y = "Tỷ lệ", fill="Tình trạng sinh viên") + theme_minimal() + scale_y_continuous(labels = scales::percent) + scale_x_discrete(labels=c("Male"="Giới tính nam", "Female"="Giới tính nữ")) + scale_fill_manual(values=c("coral","blue")) + geom_text(aes(label=round(Proportion,2)), position=position_dodge(width=0.9),vjust=0.5)

Đánh giá mối quan hệ giữa hai biến

Xem xét giữa hai biến có mối quan hệ có ý nghĩa thống kê hay độc lập với nhau bằng cách sử dụng kiểm định Chi-bình phương.
Đặt giả thuyết:

\[ \begin{cases} H_0: \text{Biến Gender và biến Student không có mối quan hệ.} \\ H_1: \text{Biến Gender và biến Student có mối quan hệ.} \end{cases} \]

 chisq.test(s)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  s
## X-squared = 0.87218, df = 1, p-value = 0.3504

Relative risk
TH1: Giới tính nam làm biến tham chiếu.

riskratio(s)
## $data
##         
##           No Yes Total
##    Male  177  16   193
##   Female 183  24   207
##   Total  360  40   400
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##    Male  1.000000        NA       NA
##   Female 1.398551 0.7664618 2.551913
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##    Male          NA           NA         NA
##   Female  0.2774055    0.3182176  0.2710384
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

TH2: Giới tính nữ làm tham chiếu

riskratio(s,rev="b")
## $data
##         
##          Yes  No Total
##   Female  24 183   207
##    Male   16 177   193
##   Total   40 360   400
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##   Female 1.000000        NA       NA
##    Male  1.037374 0.9720291 1.107111
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##    Male   0.2774055    0.3182176  0.2710384
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Odd ratio

oddsratio(s)
## $data
##         
##           No Yes Total
##    Male  177  16   193
##   Female 183  24   207
##   Total  360  40   400
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate     lower    upper
##    Male  1.000000        NA       NA
##   Female 1.445059 0.7454362 2.872414
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##    Male          NA           NA         NA
##   Female  0.2774055    0.3182176  0.2710384
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

4.2 Biến Gender và Married

Bảng tần số chéo

e <- table(d1$Gender, d1$Married)
addmargins(e)
##         
##           No Yes Sum
##    Male   76 117 193
##   Female  79 128 207
##   Sum    155 245 400

Bảng tần suất chéo theo tỷ lệ hàng

e1 <- prop.table(e,margin=1)
e1
##         
##                 No       Yes
##    Male  0.3937824 0.6062176
##   Female 0.3816425 0.6183575

Trực quan hóa

e2 <- as.data.frame(e1)
colnames(e2) <- c("Gender", "Married", "Proportion")

ggplot(e2,aes(x=Gender, y=Proportion, fill=Married)) + geom_bar(stat = "identity", position="dodge") + labs(title=" Tỷ lệ hôn nhân theo tình trạng giới tính ", x="Tình trạng giới tính", y = "Tỷ lệ", fill="Tình trạng hôn nhân") + theme_minimal() + scale_y_continuous(labels = scales::percent) +  scale_fill_manual(values=c("pink", "coral")) + geom_text(aes(label = round(Proportion, 2)), position=position_dodge(width=0.9),vjust=0.5)

Đánh giá mối quan hệ giữa hai biến

Xem xét giữa hai biến có mối quan hệ có ý nghĩa thống kê hay độc lập với nhau bằng cách sử dụng kiểm định Chi-bình phương.
Đặt giả thuyết:

\[ \begin{cases} H_0: \text{Biến Married và biến Gender độc lập.} \\ H_1: \text{Biến Married và biến Gender không độc lập.} \end{cases} \]

 chisq.test(e)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  e
## X-squared = 0.021415, df = 1, p-value = 0.8837

Relative risk
TH1: Giới tính nam làm biến tham chiếu.

riskratio(e)
## $data
##         
##           No Yes Total
##    Male   76 117   193
##   Female  79 128   207
##   Total  155 245   400
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##    Male  1.000000        NA       NA
##   Female 1.020026 0.8725618 1.192411
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##    Male          NA           NA         NA
##   Female  0.8041984    0.8375793  0.8033343
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

TH2: Giới tính nữ làm tham chiếu

riskratio(e,rev="b")
## $data
##         
##          Yes  No Total
##   Female 128  79   207
##    Male  117  76   193
##   Total  245 155   400
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower  upper
##   Female  1.00000        NA     NA
##    Male   1.03181 0.8064772 1.3201
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##    Male   0.8041984    0.8375793  0.8033343
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Odd ratio

oddsratio(e)
## $data
##         
##           No Yes Total
##    Male   76 117   193
##   Female  79 128   207
##   Total  155 245   400
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate     lower    upper
##    Male  1.000000        NA       NA
##   Female 1.052341 0.7027552 1.575668
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##    Male          NA           NA         NA
##   Female  0.8041984    0.8375793  0.8033343
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

4.3 Biến Gender và Ethnicity

Bảng tần số chéo

k <- table(d1$Gender, d1$Ethnicity)
addmargins(k)
##         
##          African American Asian Caucasian Sum
##    Male                49    47        97 193
##   Female               50    55       102 207
##   Sum                  99   102       199 400

Bảng tần suất chéo theo tỷ lệ hàng

k1 <- prop.table(k,margin=1)
k1
##         
##          African American     Asian Caucasian
##    Male         0.2538860 0.2435233 0.5025907
##   Female        0.2415459 0.2657005 0.4927536

Trực quan hóa

k2 <- as.data.frame(k1)
colnames(k2) <- c("Gender", "Ethnicity", "Proportion")

ggplot(k2,aes(x=Gender, y=Proportion, fill=Ethnicity)) + geom_bar(stat = "identity", position="dodge") + labs(title=" Tỷ lệ dân tộc theo tình trạng giới tính ", x="Tình trạng giới tính", y = "Tỷ lệ", fill="Tình trạng dân tộc") + theme_minimal() + scale_y_continuous(labels = scales::percent)  + scale_fill_manual(values=c("pink", "salmon", "coral")) + geom_text(aes(label = round(Proportion, 2)), position=position_dodge(width=0.9),vjust=0.5)

Đánh giá mối quan hệ giữa hai biến

Xem xét giữa hai biến có mối quan hệ có ý nghĩa thống kê hay độc lập với nhau bằng cách sử dụng kiểm định Chi-bình phương.
Đặt giả thuyết:

\[ \begin{cases} H_0: \text{Biến Gender và biến Ethnicity độc lập.} \\ H_1: \text{Biến Gender và biến Ethnicity không độc lập.} \end{cases} \]

 chisq.test(k)
## 
##  Pearson's Chi-squared test
## 
## data:  k
## X-squared = 0.27352, df = 2, p-value = 0.8722

Relative risk
TH1: Giới tính nam làm biến tham chiếu.

riskratio(k)
## $data
##         
##          African American Asian Caucasian Total
##    Male                49    47        97   193
##   Female               50    55       102   207
##   Total                99   102       199   400
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##    Male  1.000000        NA       NA
##   Female 1.069909 0.8136325 1.406907
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##    Male          NA           NA         NA
##   Female  0.6313153    0.8823079  0.8721816
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

TH2: Giới tính nữ làm tham chiếu

riskratio(k,rev="b")
## $data
##         
##          Caucasian Asian African American Total
##   Female       102    55               50   207
##    Male         97    47               49   193
##   Total        199   102               99   400
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##    Male  0.9316919 0.6786396 1.279103
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##    Male   0.6640575    0.8823079  0.8721816
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Odd ratio

oddsratio(k)
## $data
##         
##          African American Asian Caucasian Total
##    Male                49    47        97   193
##   Female               50    55       102   207
##   Total                99   102       199   400
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate     lower    upper
##    Male  1.000000        NA       NA
##   Female 1.145781 0.6570981 2.001313
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##    Male          NA           NA         NA
##   Female  0.6313153    0.8823079  0.8721816
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSB0deG6p24gNSINCmF1dGhvcjogInBubWluaGNoYXUiDQpkYXRlOiAiMjAyNS0wNi0xNSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtOiAiZGVmYXVsdCINCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZS5jc3MiPg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KERUKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3RhdHMpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShlcGl0b29scykNCmxpYnJhcnkoQUVSKQ0KbGlicmFyeShkYXRhcml1bSkNCmxpYnJhcnkoRWNkYXQpDQpsaWJyYXJ5KElTTFIpDQpgYGANCg0KDQojICoqQuG7mSBk4buvIGxp4buHdSBDcmVkaXQqKiAgIA0KDQpC4buZIGThu68gbGnhu4d1IENyZWRpdCBjaOG7qWEgdGjDtG5nIHRpbiB24buBIGtow6FjaCBow6BuZyB2YXkgdMOtbiBk4bulbmcgdOG7qyBt4buZdCBuZ8OibiBow6BuZywgduG7m2kgbeG7pWMgdGnDqnUgY2jDrW5oIGzDoCBk4buxIMSRb8OhbiBraOG6oyBuxINuZyB24buhIG7hu6MgY+G7p2Ega2jDoWNoIGjDoG5nIGThu7FhIHRyw6puIGPDoWMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIHbDoCB0w6BpIGNow61uaCBj4bunYSBo4buNLiDEkMOieSBsw6AgbeG7mXQgYuG7mSBk4buvIGxp4buHdSBsw70gdMaw4bufbmcgxJHhu4MgbmdoacOqbiBj4bupdSB24buBIHLhu6dpIHJvIHTDrW4gZOG7pW5nLCBow6BuaCB2aSB2YXkgbcaw4bujbiBj4bunYSBuZ8aw4budaSB0acOqdSBkw7luZywgdsOgIHBow6JuIHTDrWNoIHTDoGkgY2jDrW5oIGPDoSBuaMOibi4gICANCg0KQuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyB04buVbmcgY+G7mW5nIDQwMCBxdWFuIHPDoXQgdsOgIDExIGJp4bq/bi4gICANCg0KICpDw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIChRdWFsaXRhdGl2ZS9DYXRlZ29yaWNhbCBWYXJpYWJsZXMpIG7hu5VpIGLhuq10OioNCg0KKiBgR2VuZGVyYDogR2nhu5tpIHTDrW5oIGPhu6dhIGtow6FjaCBow6BuZyAoTWFsZS9GZW1hbGUpLiAgIA0KDQoqIGBTdHVkZW50YDogVMOsbmggdHLhuqFuZyBzaW5oIHZpw6puIChZZXMvTm8pLiBTaW5oIHZpw6puIHRoxrDhu51uZyBjw7MgaMOgbmggdmkgY2hpIHRpw6p1IHbDoCB0aHUgbmjhuq1wIGtow6FjIGJp4buHdC4gICANCg0KKiBgTWFycmllZGA6IFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoWWVzL05vKS4gVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgdMOgaSBjaMOtbmggdsOgIHF1eeG6v3QgxJHhu4tuaCB2YXkgbcaw4bujbi4gICANCg0KKiBgRXRobmljaXR5YDogRMOibiB04buZYyBj4bunYSBraMOhY2ggaMOgbmcgKENhdWNhc2lhbi9Bc2lhbi9BZnJpY2FuIEFtZXJpY2FuKS4gQmnhur9uIG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGtp4buDbSB0cmEgc+G7sSBraMOhYyBiaeG7h3QgdHJvbmcgdmnhu4djIGPhuqVwIHTDrW4gZOG7pW5nIGdp4buvYSBjw6FjIG5ow7NtIGTDom4gdOG7mWMsIGhv4bq3YyBsaeG7h3UgY8OzIHPhu7EgcGjDom4gYmnhu4d0IMSR4buRaSB44butIGhheSBraMO0bmcuICAgDQoNCiAqQ8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAoUXVhbnRpdGF0aXZlL051bWVyaWNhbCBWYXJpYWJsZXMpIG7hu5VpIGLhuq10OioNCg0KKiBgSW5jb21lYDogVGh1IG5o4bqtcCBow6BuZyBuxINtIGPhu6dhIGtow6FjaCBow6BuZyAodMOtbmggYuG6sW5nIG5nw6BuIMSRw7QgbGEpLiDEkMOieSBsw6AgbeG7mXQgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIHRy4bqjIG7hu6MuICAgDQoNCiogYExpbWl0YDogSOG6oW4gbeG7qWMgdMOtbiBk4bulbmcgY+G7p2Ega2jDoWNoIGjDoG5nICh0w61uaCBi4bqxbmcgxJHDtCBsYSkuICAgDQoNCiogYFJhdGluZ2A6IMSQaeG7g20gdMOtbiBk4bulbmcgY+G7p2Ega2jDoWNoIGjDoG5nICh0aMaw4budbmcgbMOgIG3hu5l0IHRoxrDhu5tjIMSRbyBj4bunYSB1eSB0w61uIHTDoGkgY2jDrW5oKS4gICANCg0KKiBgQ2FyZHNgOiBT4buRIGzGsOG7o25nIHRo4bq7IHTDrW4gZOG7pW5nIG3DoCBraMOhY2ggaMOgbmcgxJFhbmcgc+G7nyBo4buvdS4gICAgDQoNCiogYEFnZWA6IFR14buVaSBj4bunYSBraMOhY2ggaMOgbmcuICAgDQoNCiogYEVkdWNhdGlvbmA6IFPhu5EgbsSDbSBo4buNYyB24bqlbiBj4bunYSBraMOhY2ggaMOgbmcuICAgDQoNCiogYEJhbGFuY2VgOiBT4buRIGTGsCBu4bujIHTDrW4gZOG7pW5nIHRydW5nIGLDrG5oIGjDoG5nIHRow6FuZyBj4bunYSBraMOhY2ggaMOgbmcgKHTDrW5oIGLhurFuZyDEkcO0IGxhKS4gxJDDonkgdGjGsOG7nW5nIGzDoCBiaeG6v24gcGjhu6UgdGh14buZYyBjaMOtbmgga2hpIGThu7EgxJFvw6FuIGto4bqjIG7Eg25nIHbhu6EgbuG7oyBob+G6t2MgcuG7p2kgcm8gdMOtbiBk4bulbmcuICAgDQoNCg0KYGBge3IsZWNobz1UUlVFfQ0KDQpkIDwtIENyZWRpdA0KZGF0YXRhYmxlKGQpDQpgYGANCg0KKiAqKkPhuqV1IHRyw7pjIGLhu5kgZOG7ryBsaeG7h3UqKiAgIA0KYGBge3IsZWNobz1UUlVFfQ0Kc3RyKGQpDQpgYGANCiAgDQogIELhu5kgZOG7ryBsaeG7h3UgQ3JlZGl0IMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIG5naGnDqm4gY+G7qXUgbsOgeSBjaOG7qWEgdGjDtG5nIHRpbiBj4bunYSA0MDAga2jDoWNoIGjDoG5nIHZheSB0w61uIGThu6VuZywgduG7m2kgdOG7lW5nIGPhu5luZyAxMiBiaeG6v24uIEPhuqV1IHRyw7pjIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UgKHN0cihkKSkgY2hvIHRo4bqleSBz4buxIGvhur90IGjhu6NwIGPhu6dhIGPhuqMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgdsOgIMSR4buLbmggdMOtbmguIEPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgYmFvIGfhu5NtIElELCBJbmNvbWUsIExpbWl0LCBSYXRpbmcsIENhcmRzLCBBZ2UsIEVkdWNhdGlvbiwgdsOgIEJhbGFuY2UgKMSR4buBdSBsw6Aga2nhu4N1IHPhu5Egbmd1ecOqbiBob+G6t2Mgc+G7kSB0aOG7sWMpLCBjdW5nIGPhuqVwIHRow7RuZyB0aW4gduG7gSB0w6BpIGNow61uaCB2w6AgbmjDom4ga2jhuql1IGjhu41jLiBUcm9uZyBraGkgxJHDsywgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBiYW8gZ+G7k20gR2VuZGVyLCBTdHVkZW50LCBNYXJyaWVkLCB2w6AgRXRobmljaXR5ICjEkeG7gXUgxJHGsOG7o2MgxJHhu4tuaCBk4bqhbmcgbMOgIHnhur91IHThu5EgduG7m2kgY8OhYyBj4bqlcCDEkeG7mSB0xrDGoW5nIOG7qW5nKSwgxJHhuqFpIGRp4buHbiBjaG8gY8OhYyDEkeG6t2MgxJFp4buDbSBwaMOibiBsb+G6oWkgY+G7p2Ega2jDoWNoIGjDoG5nLiBT4buxIMSRYSBk4bqhbmcgdHJvbmcgY+G6pXUgdHLDumMgYmnhur9uIG7DoHkgdOG6oW8gbuG7gW4gdOG6o25nIHbhu69uZyBjaOG6r2MgY2hvIHZp4buHYyBwaMOibiB0w61jaCB0b8OgbiBkaeG7h24gY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBy4bunaSBybyB0w61uIGThu6VuZyB2w6AgaMOgbmggdmkgdMOgaSBjaMOtbmguICAgDQoNCiogKipM4buNYyBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UgQ3JlZGl0KiogICANCg0KYGBge3IsZWNobz1UUlVFfQ0KZDEgPC0gc3Vic2V0KGQsc2VsZWN0PS1jKEluY29tZSwgTGltaXQsIFJhdGluZywgQ2FyZHMsIEFnZSwgRWR1Y2F0aW9uLCBCYWxhbmNlKSkNCmRhdGF0YWJsZShkMSkNCg0KYGBgDQoNCiogKipLaeG7g20gdHJhIGThu68gbGnhu4d1IGLhu4sgdGhp4bq/dSoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCmEgPC1pcy5uYShkMSkNCmRhdGF0YWJsZShhKQ0Kc3VtKGlzLm5hKGQxKSkNCndoaWNoKGlzLm5hKGQxKSkNCmBgYA0KDQogIMSQ4buDIMSR4bqjbSBi4bqjbyBjaOG6pXQgbMaw4bujbmcgZOG7ryBsaeG7h3UsIHF1w6EgdHLDrG5oIGtp4buDbSB0cmEgZOG7ryBsaeG7h3UgYuG7iyB0aGnhur91IChtaXNzaW5nIGRhdGEpIMSRw6MgxJHGsOG7o2MgdGnhur9uIGjDoG5oIHRyw6puIGLhu5kgZOG7ryBsaeG7h3UgQ3JlZGl0LiBC4bqxbmcgY8OhY2ggc+G7rSBk4bulbmcgY8OhYyBow6BtIGtp4buDbSB0cmEgdHJvbmcgUiBuaMawIGlzLm5hKCkgdsOgIHN1bShpcy5uYSgpKSwga+G6v3QgcXXhuqMgY2hvIHRo4bqleSB0b8OgbiBi4buZIGLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIGNo4bupYSBi4bqldCBr4buzIGdpw6EgdHLhu4sgTkEgbsOgby4gQ+G7pSB0aOG7gywgdOG7lW5nIHPhu5EgZ2nDoSB0cuG7iyB0aGnhur91IMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBsw6AgMCwgxJHhu5NuZyB0aOG7nWkga2jDtG5nIGPDsyBjaOG7iSBz4buRIG7DoG8gxJHGsOG7o2MgdHLhuqMgduG7gSBjaG8gY8OhYyB24buLIHRyw60gY8OzIGThu68gbGnhu4d1IHRoaeG6v3UuIMSQaeG7gXUgbsOgeSBraOG6s25nIMSR4buLbmggYuG7mSBk4buvIGxp4buHdSBDcmVkaXQgbMOgIGhvw6BuIGNo4buJbmggdsOgIGtow7RuZyB5w6p1IGPhuqd1IGLhuqV0IGvhu7MgYsaw4bubYyB44butIGzDvSBk4buvIGxp4buHdSB0aGnhur91IG7DoG8sIGdpw7pwIHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoIHRp4bq/cCB0aGVvIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gdHLDqm4gbuG7gW4gdOG6o25nIGThu68gbGnhu4d1IMSRw6FuZyB0aW4gY+G6rXkuICAgDQogIA0KIyAqKlBow6JuIHTDrWNoIG3DtCB04bqjIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgqKiAgIA0KDQojIyAqKkJp4bq/biBHZW5kZXIqKg0KDQogIFRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBHZW5kZXIgdGjDtG5nIHF1YSBi4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCDEkeG7kyB0aOG7iy4gICANCiAgDQoqQuG6o25nIHThuqduIHPhu5E6KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQp0YWJsZShkMSRHZW5kZXIpDQpgYGANCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQ6KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQphMiA8LSB0YWJsZShkMSRHZW5kZXIpL3N1bShucm93KGQxKSkNCmEyDQpgYGANCg0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkMSRHZW5kZXIpWzFdL3N1bShucm93KGQxKSkqMTAwYFwlIG5hbSB2w6AgIGByIHRhYmxlKGQxJEdlbmRlcikgWzJdL3N1bShucm93KGQxKSkqMTAwYFwlIG7hu68uICAgIA0KDQoqxJDhu5MgdGjhu4sgYmnhu4N1IGRp4buFbiB04bu3IGzhu4cgcGjhuqduIHRyxINtIGdp4bubaSB0w61uaCBraMOhY2ggaMOgbmcgdmF5IHTDrW4gZOG7pW5nIHThu6sgbeG7mXQgbmfDom4gaMOgbmc6KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQpwaWUoYTIsDQogICAgbGFiZWxzID0gcGFzdGUobmFtZXMoYTIpLCByb3VuZChhMiwgMiksICIlIiksDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdHLDsm46IFThu7cgbOG7hyBHZW5kZXIiKSANCmBgYA0KDQoqIE5o4bqtbiB4w6l0IHbhu4EgYmnhur9uIEdlbmRlciB0cm9uZyBi4buZIGThu68gbGnhu4d1IENyZWRpdDogICANCg0KICAqIFBow6JuIHTDrWNoIGJp4bq/biBHZW5kZXIgKEdp4bubaSB0w61uaCkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBraMOhY2ggaMOgbmcgdmF5IHTDrW4gZOG7pW5nIGPhu6dhIG5nw6JuIGjDoG5nIGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buVIHTGsMahbmcgxJHhu5FpIMSR4buTbmcgxJHhu4F1IGdp4buvYSBuYW0gdsOgIG7hu68uIEPhu6UgdGjhu4MsIHRyb25nIHThu5VuZyBz4buRIDQwMCBraMOhY2ggaMOgbmcsIGPDsyAxOTMga2jDoWNoIGjDoG5nIG5hbSB2w6AgMjA3IGtow6FjaCBow6BuZyBu4buvLiAgIA0KICANCiAgKiBLaGkgdMOtbmggdG/DoW4gdOG6p24gc3XhuqV0IHTGsMahbmcgxJHhu5FpLCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIG5hbSBjaGnhur9tIGtob+G6o25nIDQ4LjI1JSwgdHJvbmcga2hpIGtow6FjaCBow6BuZyBu4buvIGNoaeG6v20gNTEuNzUlLiBN4bq3YyBkw7kgY8OzIG3hu5l0IHPhu7EgY2jDqm5oIGzhu4djaCBuaOG7jywgduG7m2kgc+G7kSBsxrDhu6NuZyBu4buvIGdp4bubaSBuaGnhu4F1IGjGoW4gbeG7mXQgY2jDunQsIHPhu7EgcGjDom4gcGjhu5FpIG7DoHkgduG6q24gY2hvIHRo4bqleSBuZ8OibiBow6BuZyDEkWFuZyBwaOG7pWMgduG7pSBt4buZdCB04bqtcCBraMOhY2ggaMOgbmcga2jDoSBjw6JuIGLhurFuZyB24buBIGdp4bubaSB0w61uaC4gICANCiAgDQogICogxJBp4buBdSBuw6B5IGPDsyDDvSBuZ2jEqWEgcXVhbiB0cuG7jW5nIHRyb25nIHZp4buHYyDEkeG6o20gYuG6o28gdMOtbmggxJHhuqFpIGRp4buHbiBj4bunYSBk4buvIGxp4buHdSBraGkgcGjDom4gdMOtY2ggaMOgbmggdmkgdmF5IHTDrW4gZOG7pW5nIHbDoCBy4bunaSBybyB0w61uIGThu6VuZy4gxJDhu5NuZyB0aOG7nWksIG7DsyBjxaluZyBn4bujaSBt4bufIGto4bqjIG7Eg25nIGtow7RuZyBjw7Mgc+G7sSB0aGnDqm4gbOG7h2NoIMSRw6FuZyBr4buDIHbhu4EgZ2nhu5tpIHTDrW5oIHRyb25nIHThuq1wIGtow6FjaCBow6BuZyBoaeG7h24gdOG6oWkgY+G7p2EgbmfDom4gaMOgbmcsIGdpw7pwIGPDoWMgbcO0IGjDrG5oIGThu7EgxJFvw6FuIHTDrW4gZOG7pW5nIGtow7RuZyBi4buLIOG6o25oIGjGsOG7n25nIHF1w6Egbmhp4buBdSBi4bufaSB54bq/dSB04buRIGdp4bubaSB0w61uaC4gICANCiAgDQoNCiMjICoqQmnhur9uIE1hcnJpZWQqKiAgIA0KDQpUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gTWFycmllZCB0aMO0bmcgcXVhIGLhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIMSR4buTIHRo4buLLiAgIA0KICANCipC4bqjbmcgdOG6p24gc+G7kToqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnRhYmxlKGQxJE1hcnJpZWQpDQpgYGANCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQ6KiAgIA0KDQpgYGB7cixlY2hvPVRSVUV9DQphNCA8LSB0YWJsZShkMSRNYXJyaWVkKS9zdW0obnJvdyhkMSkpDQphNA0KYGBgDQoNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZDEkTWFycmllZClbMV0vc3VtKG5yb3coZDEpKSoxMDBgXCUgY2jGsGEga+G6v3QgaMahbiB2w6AgIGByIHRhYmxlKGQxJE1hcnJpZWQpIFsyXS9zdW0obnJvdyhkMSkpKjEwMGBcJSDEkcOjIGvhur90IGjDtG4uIA0KKsSQ4buTIHRo4buLIGJp4buDdSBkaeG7hW4gdOG7tyBs4buHIHBo4bqnbiB0csSDbSAgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPhu6dhIGtow6FjaCBow6BuZyB2YXkgdMOtbiBk4bulbmcgdOG7qyBt4buZdCBuZ8OibiBow6BuZzoqICAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCnBpZShhNCwNCiAgICBsYWJlbHMgPSBwYXN0ZShuYW1lcyhhNCksIHJvdW5kKGE0LCAyKSwgIiUiKSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIE1hcnJpZWQiKSANCmBgYA0KDQoqIE5o4bqtbiB4w6l0IHbhu4EgYmnhur9uIE1hcnJpZWQgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBDcmVkaXQ6ICAgDQoNCiAgROG7sWEgdHLDqm4ga+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggYmnhur9uICJNYXJyaWVkIiAoVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKSB04burIGLhu5kgZOG7ryBsaeG7h3UgQ3JlZGl0LCBjaMO6bmcgdGEgdGjhuqV5IHLhurFuZyB0cm9uZyBz4buRIG5o4buvbmcga2jDoWNoIGjDoG5nIHZheSB0w61uIGThu6VuZywgbmjDs20gxJHDoyBr4bq/dCBow7RuIGNoaeG6v20gdOG7tyBs4buHIGzhu5tuIGjGoW4gKDYxLjI1JSkgc28gduG7m2kgbmjDs20gY2jGsGEga+G6v3QgaMO0biAoMzguNzUlKSwgxJHGsOG7o2MgdGjhu4MgaGnhu4duIHLDtSByw6BuZyBxdWEgYuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTIHRyw7JuLiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIGfhu6NpIMO9IHLhurFuZyBjw6FjIHThu5UgY2jhu6ljIHTDrW4gZOG7pW5nIGPDsyB0aOG7gyBjw7MgeHUgaMaw4bubbmcgxrB1IHRpw6puIGhv4bq3YyDEkcOhbmggZ2nDoSBjYW8gaMahbiDEkeG7kWkgduG7m2kgY8OhYyBjw6EgbmjDom4gxJHDoyBr4bq/dCBow7RuIGtoaSB4w6l0IGR1eeG7h3Qga2hv4bqjbiB2YXksIGPDsyB0aOG7gyBkbyBnaeG6oyDEkeG7i25oIHbhu4Egc+G7sSDhu5VuIMSR4buLbmggdMOgaSBjaMOtbmggdsOgIHRyw6FjaCBuaGnhu4dtIGNhbyBoxqFuLiAgICAgDQoNCiAgDQojICoqUGjDom4gdGjDrWNoIHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSDEkeG6v24gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKiogICANCg0KIyMgKipCaeG6v24gTWFycmllZCB2w6AgYmnhur9uIFN0dWRlbnQqKiAgDQoNCiAgICpC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyogICANCiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KZiA8LSB0YWJsZShkMSRTdHVkZW50LCBkMSRNYXJyaWVkKQ0KYWRkbWFyZ2lucyhmKQ0KYGBgDQoNCiAgICpC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKiAgIA0KICAgDQpgYGB7cixlY2hvPVRSVUV9DQpmMSA8LSBwcm9wLnRhYmxlKGYsbWFyZ2luPTEpDQpmMQ0KYGBgDQogICAqVHLhu7FjIHF1YW4gaMOzYSogICANCiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KZjIgPC0gYXMuZGF0YS5mcmFtZShmMSkNCmNvbG5hbWVzKGYyKSA8LSBjKCJTdHVkZW50IiwgIk1hcnJpZWQiLCAiUHJvcG9ydGlvbiIpDQoNCmdncGxvdChmMixhZXMoeD1NYXJyaWVkLCB5PVByb3BvcnRpb24sIGZpbGw9U3R1ZGVudCkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgbGFicyh0aXRsZT0iIFThu7cgbOG7hyBzaW5oIHZpw6puIHRoZW8gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuICIsIHg9IlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiIsIHkgPSAiVOG7tyBs4buHIiwgZmlsbD0iVMOsbmggdHLhuqFuZyBzaW5oIHZpw6puIikgKyB0aGVtZV9taW5pbWFsKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIj0iQ2jGsGEga+G6v3QgaMO0biIsICJZZXMiPSLEkMOjIGvhur90IGjDtG4iKSkgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiWWVzIj0icGluayIsICJObyI9ImJsdWUiKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPVByb3BvcnRpb24pLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLHZqdXN0PTAuNSkNCmBgYA0KDQogICoqxJDDoW5oIGdpw6EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBoYWkgYmnhur9uKiogICANCiAgDQogIFhlbSB4w6l0IGdp4buvYSBoYWkgYmnhur9uIGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZy4gIA0KICAgIMSQ4bq3dCBnaeG6oyB0aHV54bq/dDogICANCiAgDQogICAkJA0KXGJlZ2lue2Nhc2VzfSANCkhfMDogXHRleHR7Qmnhur9uIE1hcnJpZWQgdsOgIGJp4bq/biBTdHVkZW50IGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHLn0gXFwNCkhfMTogXHRleHR7Qmnhur9uIE1hcnJpZWQgdsOgIGJp4bq/biBTdHVkZW50IGPDsyBt4buRaSBxdWFuIGjhu4cufQ0KXGVuZHtjYXNlc30NCiAgJCQNCiAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiBjaGlzcS50ZXN0KGYpDQpgYGANCg0KICAqKlJlbGF0aXZlIHJpc2sqKiAgIA0KICAqVEgxOiBDaMawYSBr4bq/dCBow7RuIGzDoG0gYmnhur9uIHRoYW0gY2hp4bq/dS4qICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0Kcmlza3JhdGlvKGYpDQpgYGANCg0KICAqVEgyOiDEkMOjIGvhur90IGjDtG4gbMOgbSB0aGFtIGNoaeG6v3UqICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0Kcmlza3JhdGlvKGYscmV2PSJiIikNCmBgYA0KDQogICAqKk9kZCByYXRpbyoqICAgDQogICANCmBgYHtyLGVjaG89VFJVRX0NCm9kZHNyYXRpbyhmKQ0KYGBgDQoNCg0KIyMgKipCaeG6v24gTWFycmllZCB2w6AgR2VuZGVyKiogIA0KDQogICAqQuG6o25nIHThuqduIHPhu5EgY2jDqW8qICAgDQogICANCmBgYHtyLGVjaG89VFJVRX0NCmwgPC0gdGFibGUoZDEkTWFycmllZCwgZDEkR2VuZGVyKQ0KYWRkbWFyZ2lucyhsKQ0KYGBgDQoNCiAgICpC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKiAgIA0KICAgDQpgYGB7cixlY2hvPVRSVUV9DQpsMSA8LSBwcm9wLnRhYmxlKGwsbWFyZ2luPTEpDQpsMQ0KYGBgDQogICAqVHLhu7FjIHF1YW4gaMOzYSogIA0KICAgDQpgYGB7cixlY2hvPVRSVUV9DQpsMiA8LSBhcy5kYXRhLmZyYW1lKGwxKQ0KY29sbmFtZXMobDIpIDwtIGMoIk1hcnJpZWQiLCAiR2VuZGVyIiwgIlByb3BvcnRpb24iKQ0KDQpnZ3Bsb3QobDIsYWVzKHg9TWFycmllZCwgeT1Qcm9wb3J0aW9uLCBmaWxsPUdlbmRlcikpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgbGFicyh0aXRsZT0iIFThu7cgbOG7hyBnaeG7m2kgdMOtbmggdGhlbyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gIiwgeD0iVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIiwgeSA9ICJU4bu3IGzhu4ciLCBmaWxsPSJUw6xuaCB0cuG6oW5nIGdp4bubaSB0w61uaCIpICsgdGhlbWVfbWluaW1hbCgpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyI9IkNoxrBhIGvhur90IGjDtG4iLCAiWWVzIj0ixJDDoyBr4bq/dCBow7RuIikpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIm9yYW5nZSIsICJzZWFncmVlbiIpKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChQcm9wb3J0aW9uLCAyKSksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksdmp1c3Q9MC41KQ0KDQpgYGANCg0KICoqxJDDoW5oIGdpw6EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBoYWkgYmnhur9uKiogICANCiAgDQogIFhlbSB4w6l0IGdp4buvYSBoYWkgYmnhur9uIGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZy4gIA0KICAgIMSQ4bq3dCBnaeG6oyB0aHV54bq/dDogICANCiAgDQogICAkJA0KXGJlZ2lue2Nhc2VzfSANCkhfMDogXHRleHR7Qmnhur9uIE1hcnJpZWQgdsOgIGJp4bq/biBHZW5kZXIgxJHhu5ljIGzhuq1wLn0gXFwNCkhfMTogXHRleHR7Qmnhur9uIE1hcnJpZWQgdsOgIGJp4bq/biBHZW5kZXIga2jDtG5nIMSR4buZYyBs4bqtcC59DQpcZW5ke2Nhc2VzfQ0KICAkJA0KICANCg0KYGBge3IsZWNobz1UUlVFfQ0KIGNoaXNxLnRlc3QobCkNCmBgYA0KDQogICoqUmVsYXRpdmUgcmlzayoqICAgDQogICpUSDE6IENoxrBhIGvhur90IGjDtG4gbMOgbSBiaeG6v24gdGhhbSBjaGnhur91LiogICANCiAgDQpgYGB7cixlY2hvPVRSVUV9DQpyaXNrcmF0aW8obCkNCmBgYA0KDQogICpUSDI6IMSQw6Mga+G6v3QgaMO0biBsw6BtIHRoYW0gY2hp4bq/dSogICANCiAgDQpgYGB7cixlY2hvPVRSVUV9DQpyaXNrcmF0aW8obCxyZXY9ImIiKQ0KYGBgDQoNCiAgICoqT2RkIHJhdGlvKiogICANCiAgIA0KYGBge3IsZWNobz1UUlVFfQ0Kb2Rkc3JhdGlvKGwpDQpgYGANCg0KIyMgKipCaeG6v24gTWFycmllZCB2w6AgRXRobmljaXR5KiogIA0KDQogICAqQuG6o25nIHThuqduIHPhu5EgY2jDqW8qICAgDQogICANCmBgYHtyLGVjaG89VFJVRX0NCmcgPC0gdGFibGUoZDEkTWFycmllZCwgZDEkRXRobmljaXR5KQ0KYWRkbWFyZ2lucyhnKQ0KYGBgDQoNCiAgICpC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKiAgIA0KICAgDQpgYGB7cixlY2hvPVRSVUV9DQpnMSA8LSBwcm9wLnRhYmxlKGcsbWFyZ2luPTEpDQpnMQ0KYGBgDQogICAqVHLhu7FjIHF1YW4gaMOzYSogIA0KICAgDQpgYGB7cixlY2hvPVRSVUV9DQpnMiA8LSBhcy5kYXRhLmZyYW1lKGcxKQ0KY29sbmFtZXMoZzIpIDwtIGMoIk1hcnJpZWQiLCAiRXRobmljaXR5IiwgIlByb3BvcnRpb24iKQ0KDQpnZ3Bsb3QoZzIsYWVzKHg9TWFycmllZCwgeT1Qcm9wb3J0aW9uLCBmaWxsPUV0aG5pY2l0eSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgbGFicyh0aXRsZT0iIFThu7cgbOG7hyBkw6JuIHThu5ljIHRoZW8gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuICIsIHg9IlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiIsIHkgPSAiVOG7tyBs4buHIiwgZmlsbD0iVMOsbmggdHLhuqFuZyBkw6JuIHThu5ljIikgKyB0aGVtZV9taW5pbWFsKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIj0iQ2jGsGEga+G6v3QgaMO0biIsICJZZXMiPSLEkMOjIGvhur90IGjDtG4iKSkgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygibGlnaHRncmVlbiIsICJzYWxtb24iLCAiY29yYWwiKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoUHJvcG9ydGlvbiwgMikpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLHZqdXN0PTAuNSkNCg0KYGBgDQoNCiAqKsSQw6FuaCBnacOhIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/bioqICAgDQogIA0KICBYZW0geMOpdCBnaeG7r2EgaGFpIGJp4bq/biBjw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogaGF5IMSR4buZYyBs4bqtcCB24bubaSBuaGF1IGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcuICANCiAgICDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQogIA0KICAgJCQNClxiZWdpbntjYXNlc30gDQpIXzA6IFx0ZXh0e0Jp4bq/biBNYXJyaWVkIHbDoCBiaeG6v24gRXRobmljaXR5IMSR4buZYyBs4bqtcC59IFxcDQpIXzE6IFx0ZXh0e0Jp4bq/biBNYXJyaWVkIHbDoCBiaeG6v24gRXRobmljaXR5IGtow7RuZyDEkeG7mWMgbOG6rXAufQ0KXGVuZHtjYXNlc30NCiAgJCQNCiAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiBjaGlzcS50ZXN0KGcpDQpgYGANCg0KICAqKlJlbGF0aXZlIHJpc2sqKiAgIA0KICAqVEgxOiBDaMawYSBr4bq/dCBow7RuIGzDoG0gYmnhur9uIHRoYW0gY2hp4bq/dS4qICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0Kcmlza3JhdGlvKGcpDQpgYGANCg0KICAqVEgyOiDEkMOjIGvhur90IGjDtG4gbMOgbSB0aGFtIGNoaeG6v3UqICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0Kcmlza3JhdGlvKGcscmV2PSJiIikNCmBgYA0KDQogICAqKk9kZCByYXRpbyoqICAgDQogICANCmBgYHtyLGVjaG89VFJVRX0NCm9kZHNyYXRpbyhnKQ0KYGBgDQoNCioqKiAgIA0KDQoNCiMgKipQaMOibiB0aMOtY2ggc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIMSR4bq/biB0w6xuaCB0cuG6oW5nIGdp4bubaSB0w61uaCoqICAgDQoNCiMjICoqQmnhur9uIEdlbmRlciB2w6AgYmnhur9uIFN0dWRlbnQqKiAgDQoNCiAgICpC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyogICANCiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KcyA8LSB0YWJsZShkMSRHZW5kZXIsIGQxJFN0dWRlbnQpDQphZGRtYXJnaW5zKHMpDQpgYGANCg0KICAgKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdGhlbyB04bu3IGzhu4cgaMOgbmcqICAgDQogICANCmBgYHtyLGVjaG89VFJVRX0NCnMxIDwtIHByb3AudGFibGUocyxtYXJnaW49MSkNCnMxDQpgYGANCiAgICpUcuG7sWMgcXVhbiBow7NhKiAgIA0KICAgDQpgYGB7cixlY2hvPVRSVUV9DQpzMiA8LSBhcy5kYXRhLmZyYW1lKHMxKQ0KY29sbmFtZXMoczIpIDwtIGMoIkdlbmRlciIsICJTdHVkZW50IiwgIlByb3BvcnRpb24iKQ0KDQpnZ3Bsb3QoczIsYWVzKHg9R2VuZGVyLCB5PVByb3BvcnRpb24sIGZpbGw9U3R1ZGVudCkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgbGFicyh0aXRsZT0iIFThu7cgbOG7hyBzaW5oIHZpw6puIHRoZW8gdMOsbmggdHLhuqFuZyBnaeG7m2kgdMOtbmggIiwgeD0iVMOsbmggdHLhuqFuZyBnaeG7m2kgdMOtbmgiLCB5ID0gIlThu7cgbOG7hyIsIGZpbGw9IlTDrG5oIHRy4bqhbmcgc2luaCB2acOqbiIpICsgdGhlbWVfbWluaW1hbCgpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJNYWxlIj0iR2nhu5tpIHTDrW5oIG5hbSIsICJGZW1hbGUiPSJHaeG7m2kgdMOtbmggbuG7ryIpKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJjb3JhbCIsImJsdWUiKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKFByb3BvcnRpb24sMikpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLHZqdXN0PTAuNSkNCmBgYA0KDQogICoqxJDDoW5oIGdpw6EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBoYWkgYmnhur9uKiogICANCiAgDQogIFhlbSB4w6l0IGdp4buvYSBoYWkgYmnhur9uIGPDsyBt4buRaSBxdWFuIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZy4gIA0KICAgIMSQ4bq3dCBnaeG6oyB0aHV54bq/dDogICANCiAgDQogICAkJA0KXGJlZ2lue2Nhc2VzfSANCkhfMDogXHRleHR7Qmnhur9uIEdlbmRlciB2w6AgYmnhur9uIFN0dWRlbnQga2jDtG5nIGPDsyBt4buRaSBxdWFuIGjhu4cufSBcXA0KSF8xOiBcdGV4dHtCaeG6v24gR2VuZGVyIHbDoCBiaeG6v24gU3R1ZGVudCBjw7MgbeG7kWkgcXVhbiBo4buHLn0NClxlbmR7Y2FzZXN9DQogICQkDQogIA0KDQpgYGB7cixlY2hvPVRSVUV9DQogY2hpc3EudGVzdChzKQ0KYGBgDQoNCiAgKipSZWxhdGl2ZSByaXNrKiogICANCiAgKlRIMTogR2nhu5tpIHTDrW5oIG5hbSBsw6BtIGJp4bq/biB0aGFtIGNoaeG6v3UuKiAgIA0KICANCmBgYHtyLGVjaG89VFJVRX0NCnJpc2tyYXRpbyhzKQ0KYGBgDQoNCiAgKlRIMjogR2nhu5tpIHTDrW5oIG7hu68gbMOgbSB0aGFtIGNoaeG6v3UqICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0Kcmlza3JhdGlvKHMscmV2PSJiIikNCmBgYA0KDQogICAqKk9kZCByYXRpbyoqICAgDQogICANCmBgYHtyLGVjaG89VFJVRX0NCm9kZHNyYXRpbyhzKQ0KYGBgDQoNCg0KIyMgKipCaeG6v24gR2VuZGVyIHbDoCBNYXJyaWVkKiogIA0KDQogICAqQuG6o25nIHThuqduIHPhu5EgY2jDqW8qICAgDQogICANCmBgYHtyLGVjaG89VFJVRX0NCmUgPC0gdGFibGUoZDEkR2VuZGVyLCBkMSRNYXJyaWVkKQ0KYWRkbWFyZ2lucyhlKQ0KYGBgDQoNCiAgICpC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKiAgIA0KICAgDQpgYGB7cixlY2hvPVRSVUV9DQplMSA8LSBwcm9wLnRhYmxlKGUsbWFyZ2luPTEpDQplMQ0KYGBgDQogICAqVHLhu7FjIHF1YW4gaMOzYSogIA0KICAgDQpgYGB7cixlY2hvPVRSVUV9DQplMiA8LSBhcy5kYXRhLmZyYW1lKGUxKQ0KY29sbmFtZXMoZTIpIDwtIGMoIkdlbmRlciIsICJNYXJyaWVkIiwgIlByb3BvcnRpb24iKQ0KDQpnZ3Bsb3QoZTIsYWVzKHg9R2VuZGVyLCB5PVByb3BvcnRpb24sIGZpbGw9TWFycmllZCkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgbGFicyh0aXRsZT0iIFThu7cgbOG7hyBow7RuIG5ow6JuIHRoZW8gdMOsbmggdHLhuqFuZyBnaeG7m2kgdMOtbmggIiwgeD0iVMOsbmggdHLhuqFuZyBnaeG7m2kgdMOtbmgiLCB5ID0gIlThu7cgbOG7hyIsIGZpbGw9IlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiIpICsgdGhlbWVfbWluaW1hbCgpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInBpbmsiLCAiY29yYWwiKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoUHJvcG9ydGlvbiwgMikpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLHZqdXN0PTAuNSkNCg0KYGBgDQoNCiAqKsSQw6FuaCBnacOhIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/bioqICAgDQogIA0KICBYZW0geMOpdCBnaeG7r2EgaGFpIGJp4bq/biBjw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogaGF5IMSR4buZYyBs4bqtcCB24bubaSBuaGF1IGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcuICANCiAgICDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQogIA0KICAgJCQNClxiZWdpbntjYXNlc30gDQpIXzA6IFx0ZXh0e0Jp4bq/biBNYXJyaWVkIHbDoCBiaeG6v24gR2VuZGVyIMSR4buZYyBs4bqtcC59IFxcDQpIXzE6IFx0ZXh0e0Jp4bq/biBNYXJyaWVkIHbDoCBiaeG6v24gR2VuZGVyIGtow7RuZyDEkeG7mWMgbOG6rXAufQ0KXGVuZHtjYXNlc30NCiAgJCQNCiAgDQoNCmBgYHtyLGVjaG89VFJVRX0NCiBjaGlzcS50ZXN0KGUpDQpgYGANCg0KICAqKlJlbGF0aXZlIHJpc2sqKiAgIA0KICAqVEgxOiBHaeG7m2kgdMOtbmggbmFtIGzDoG0gYmnhur9uIHRoYW0gY2hp4bq/dS4qICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0Kcmlza3JhdGlvKGUpDQpgYGANCg0KICAqVEgyOiBHaeG7m2kgdMOtbmggbuG7ryBsw6BtIHRoYW0gY2hp4bq/dSogICANCiAgDQpgYGB7cixlY2hvPVRSVUV9DQpyaXNrcmF0aW8oZSxyZXY9ImIiKQ0KYGBgDQoNCiAgICoqT2RkIHJhdGlvKiogICANCiAgIA0KYGBge3IsZWNobz1UUlVFfQ0Kb2Rkc3JhdGlvKGUpDQpgYGANCg0KIyMgKipCaeG6v24gR2VuZGVyIHbDoCBFdGhuaWNpdHkqKiAgDQoNCiAgICpC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyogICANCiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KayA8LSB0YWJsZShkMSRHZW5kZXIsIGQxJEV0aG5pY2l0eSkNCmFkZG1hcmdpbnMoaykNCmBgYA0KDQogICAqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyogICANCiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KazEgPC0gcHJvcC50YWJsZShrLG1hcmdpbj0xKQ0KazENCmBgYA0KICAgKlRy4buxYyBxdWFuIGjDs2EqICANCiAgIA0KYGBge3IsZWNobz1UUlVFfQ0KazIgPC0gYXMuZGF0YS5mcmFtZShrMSkNCmNvbG5hbWVzKGsyKSA8LSBjKCJHZW5kZXIiLCAiRXRobmljaXR5IiwgIlByb3BvcnRpb24iKQ0KDQpnZ3Bsb3QoazIsYWVzKHg9R2VuZGVyLCB5PVByb3BvcnRpb24sIGZpbGw9RXRobmljaXR5KSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyBsYWJzKHRpdGxlPSIgVOG7tyBs4buHIGTDom4gdOG7mWMgdGhlbyB0w6xuaCB0cuG6oW5nIGdp4bubaSB0w61uaCAiLCB4PSJUw6xuaCB0cuG6oW5nIGdp4bubaSB0w61uaCIsIHkgPSAiVOG7tyBs4buHIiwgZmlsbD0iVMOsbmggdHLhuqFuZyBkw6JuIHThu5ljIikgKyB0aGVtZV9taW5pbWFsKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygicGluayIsICJzYWxtb24iLCAiY29yYWwiKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoUHJvcG9ydGlvbiwgMikpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLHZqdXN0PTAuNSkNCg0KYGBgDQoNCiAqKsSQw6FuaCBnacOhIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/bioqICAgDQogIA0KICBYZW0geMOpdCBnaeG7r2EgaGFpIGJp4bq/biBjw7MgbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogaGF5IMSR4buZYyBs4bqtcCB24bubaSBuaGF1IGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcuICANCiAgICDEkOG6t3QgZ2nhuqMgdGh1eeG6v3Q6ICAgDQogIA0KICAgJCQNClxiZWdpbntjYXNlc30gDQpIXzA6IFx0ZXh0e0Jp4bq/biBHZW5kZXIgdsOgIGJp4bq/biBFdGhuaWNpdHkgxJHhu5ljIGzhuq1wLn0gXFwNCkhfMTogXHRleHR7Qmnhur9uIEdlbmRlciB2w6AgYmnhur9uIEV0aG5pY2l0eSBraMO0bmcgxJHhu5ljIGzhuq1wLn0NClxlbmR7Y2FzZXN9DQogICQkDQogIA0KDQpgYGB7cixlY2hvPVRSVUV9DQogY2hpc3EudGVzdChrKQ0KYGBgDQoNCiAgKipSZWxhdGl2ZSByaXNrKiogICANCiAgKlRIMTogR2nhu5tpIHTDrW5oIG5hbSBsw6BtIGJp4bq/biB0aGFtIGNoaeG6v3UuKiAgIA0KICANCmBgYHtyLGVjaG89VFJVRX0NCnJpc2tyYXRpbyhrKQ0KYGBgDQoNCiAgKlRIMjogR2nhu5tpIHTDrW5oIG7hu68gbMOgbSB0aGFtIGNoaeG6v3UqICAgDQogIA0KYGBge3IsZWNobz1UUlVFfQ0Kcmlza3JhdGlvKGsscmV2PSJiIikNCmBgYA0KDQogICAqKk9kZCByYXRpbyoqICAgDQogICANCmBgYHtyLGVjaG89VFJVRX0NCm9kZHNyYXRpbyhrKQ0KYGBgDQoNCioqKiAgIA0KDQo=