PHẦN 1: TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1.1 Thông tin về bộ dữ liệu

Cấu trúc của bộ dữ liệu

ccp <- read.csv("D:/BAI TAP/PTDLDT/Customer-Churn-Prediction.csv", header = TRUE)
str(ccp)
## 'data.frame':    7043 obs. of  12 variables:
##  $ customerID      : chr  "7590-VHVEG" "5575-GNVDE" "3668-QPYBK" "7795-CFOCW" ...
##  $ gender          : chr  "Female" "Male" "Male" "Male" ...
##  $ Dependents      : chr  "No" "No" "No" "No" ...
##  $ tenure          : int  1 34 2 45 2 8 22 10 28 62 ...
##  $ PhoneService    : chr  "No" "Yes" "Yes" "No" ...
##  $ InternetService : chr  "DSL" "DSL" "DSL" "DSL" ...
##  $ Contract        : chr  "Month-to-month" "One year" "Month-to-month" "One year" ...
##  $ PaperlessBilling: chr  "Yes" "No" "Yes" "No" ...
##  $ PaymentMethod   : chr  "Electronic check" "Mailed check" "Mailed check" "Bank transfer (automatic)" ...
##  $ MonthlyCharges  : num  29.9 57 53.9 42.3 70.7 ...
##  $ TotalCharges    : num  29.9 1889.5 108.2 1840.8 151.7 ...
##  $ Churn           : chr  "No" "No" "Yes" "No" ...

Customer-Churn-Prediction.csv là bộ dữ liệu khảo sát quyết định dừng sử dụng dịch vụ của khách hàng. Bộ dữ liệu này bao gồm 12 biến và 7043 quan sát.

  • customerID: Mã khách hàng
  • gender: Giới tính (bao gồm Male và Female)
  • Dependents: Độc lập kinh tế (No và Yes)
  • tenure: Số tháng đã gắn bó với dịch vụ
  • PhoneService: Dịch vụ điện thoại (No và Yes)
  • InternetService: Loại dịch vụ internet (DSL, Fiber optic và No)
  • Contract: Hạn hợp đồng (Ngắn hạn: Month-to-month; Dài hạn: One year, Two year)
  • PaperlessBilling: Hóa đơn điện tử (No và Yes)
  • PaymentMethod: Phương thức thanh toán (Tự động: Bank transfer, Credit card; Thủ công: Electronic check, Mailed check)
  • MonthlyCharges: Số tiền trả hàng tháng
  • TotalCharges: Tổng số tiền đã trả
  • Churn: Dừng sử dụng dịch vụ (No và Yes)

Kiểm tra dữ liệu bị thiếu

sum(is.na(ccp))
## [1] 11
ccp <- na.omit(ccp)

Kết quả cho thấy bộ dữ liệu này không có giá trị nào bị thiếu và đã sẵn sàng để thực hiện các thao tác tính toán và ước lượng.

1.2 Chuyển về factor

library(tidyr)
library(dplyr)
## 
## 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
# Chuyển hạn hợp đồng thành dài hạn và ngắn hạn
ccp$Contract <- ifelse(ccp$Contract == "Month-to-month", "Shortterm", "Longterm")

# Chuyển phương thức thanh toán thành tự động và thủ công
ccp$PaymentMethod <- ifelse(ccp$PaymentMethod %in% c("Mailed check","Electronic check"), "Manual", "Automatic")

# Chuyển tất cả các biến về "factor"
ccp <- ccp %>% mutate(across(c(gender,Dependents,PhoneService,InternetService,Contract,PaperlessBilling,PaymentMethod,Churn), as.factor))

Trong hàm glm, việc chuyển các biến về factor là một công cụ đơn giản mà hiệu quả do việc các biến thuộc phân loại này sẽ được glm tự động mã hóa thành biến giả mà không cần phải tác thêm bất cứ bước nào, điều này khiến việc phân tích dữ liệu trở nên đỡ rắc rối hơn. Ngoài ra, việc đưa các biến về factor còn giúp hạn chế lỗi trong quá trình ước lượng các mô hình hồi quy.

ccp$Churn <- relevel(ccp$Churn, ref = "Yes")
levels(ccp$Churn)
## [1] "Yes" "No"

Khi đặt mức ưu tiên của biến phụ thuộc Churn thành Yes, khi đó glm sẽ mặc định rằng ChurnYes là biến phụ thuộc, nghĩa là tỷ lệ các khách hàng quyết định ngưng sử dụng dịch vụ.

# Đặt mức ưu tiên cho ContractShortterm
ccp$Contract <- relevel(ccp$Contract, ref = "Shortterm")
levels(ccp$Contract)
## [1] "Shortterm" "Longterm"

Tương tự, khi đặt mức ưu tiên là Shortterm, khi đó biến phụ thuộc là ContractShortterm, tỷ lệ khách hàng chọn loại dịch vụ ngắn hạn.

PHẦN 2: HỒI QUY LOGISTIC

2.1 Biến phụ thuộc Churn

2.1.1 Mô hình

logit1 <- glm(Churn ~  Dependents + tenure + PhoneService + InternetService + Contract + PaperlessBilling + PaymentMethod + MonthlyCharges + TotalCharges, data = ccp, family = binomial(link = "logit"))
summary(logit1)
## 
## Call:
## glm(formula = Churn ~ Dependents + tenure + PhoneService + InternetService + 
##     Contract + PaperlessBilling + PaymentMethod + MonthlyCharges + 
##     TotalCharges, family = binomial(link = "logit"), data = ccp)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 3.364e-01  2.070e-01   1.625 0.104261    
## DependentsYes               2.332e-01  7.940e-02   2.937 0.003317 ** 
## tenure                      5.560e-02  5.916e-03   9.399  < 2e-16 ***
## PhoneServiceYes             7.514e-01  1.438e-01   5.227 1.72e-07 ***
## InternetServiceFiber optic -9.724e-01  1.317e-01  -7.382 1.56e-13 ***
## InternetServiceNo           5.244e-01  1.857e-01   2.823 0.004758 ** 
## ContractLongterm            1.013e+00  1.010e-01  10.030  < 2e-16 ***
## PaperlessBillingYes        -4.354e-01  7.304e-02  -5.961 2.50e-09 ***
## PaymentMethodManual        -3.073e-01  7.174e-02  -4.284 1.84e-05 ***
## MonthlyCharges             -5.533e-03  3.975e-03  -1.392 0.163891    
## TotalCharges               -2.538e-04  6.717e-05  -3.778 0.000158 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 8143.4  on 7031  degrees of freedom
## Residual deviance: 5969.6  on 7021  degrees of freedom
## AIC: 5991.6
## 
## Number of Fisher Scoring iterations: 6

Bên trên là kết quả hồi quy logistic của biến phụ thuộc ChurnYes. Trong đó ta có thể thấy được:

  • DependentsYes với hệ số hồi quy là 0.2332 và có ý nghĩa thống kê ở mức ý nghĩa rất cao là 1% cho thấy khách hàng không độc lập tài chính (DependentsYes) có log-odds (log của tỷ lệ giữa khách hàng chọn ngưng sử dụng dịch vụ và khách hàng chọn tiếp tục sử dụng dịch vụ) ngừng dịch vụ cao hơn 0.2332 so với khách hàng độc lập tài chính (DependentsNo)

  • tenure với hệ số hồi quy là 0.05566 và có ý nghĩa thống kê ở mức cao 0% cho thấy với mỗi tháng gắn bó thêm, log-odds ngừng dịch vụ tăng 0.0556.

  • PhoneServiceYes với hệ số hồi quy là 0.7514 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng có đăng ký dịch vụ điện thoại có log-odds ngừng dịch vụ cao hơn 0.7514 so với khách hàng không đăng ký dịch vụ điện thoại.

  • InternetServiceFiber optic với hệ số hồi quy là -0.9724 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng sử dụng Fiber optic có log-odds ngừng dịch vụ thấp hơn 0.9724 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • InternetServiceNo với hệ số hồi quy là 0.5244 và có ý nghĩa thống kê ở mức ý nghĩa 1% cho thấy rằng khách hàng không có dịch vụ internet có log-odds ngừng dịch vụ cao hơn 0.5244 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • ContractShortterm với hệ số hồi quy là -1.013 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng với hợp đồng ngắn hạn có log-odds ngừng dịch vụ thấp hơn 1.013 so với khách hàng có hợp đồng dài hạn là ContractLongterm.

  • PaperlessBillingYes với hệ số hồi quy là -0.4354 và có ý nghĩa thống kê ở mức 0% cho thấy khách hàng không sử dụng hóa đơn điện tử có log-odds ngừng dịch vụ thấp hơn 0.4354 so với khách hàng sử dụng hóa đơn điện tử.

  • PaymentMethodManual với hệ số hồi quy là -0.3073 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy được khách hàng sử dụng phương thức thanh toán thủ công (Electronic check, Mailed check) có log-odds ngừng dịch vụ thấp hơn 0.3073 so với khách hàng sử dụng phương thức thanh toán tự động. (PaymentMethodAutomatic).

  • MonthlyCharges với hệ số hồi quy là -0.005533 cho thấy với mỗi đơn vị tăng của phí hàng tháng, log-odds ngừng dịch vụ giảm 0.05533. Tuy nhiên giá trị này không có ý nghĩa thống kê đến biến ChurnYes. Điều này cho thấy không có bằng chứng đủ mạnh để kết luận nó có tác động riêng lẻ đáng kể đến ChurnYes khi các biến khác đã được đưa vào mô hình.

  • TotalCharges -0.0002538 và có ý nghĩa thống kê ở mức 0% cho thấy với mỗi đơn vị tăng của tổng phí, log-odds ngừng dịch vụ giảm 0.0002538.

  • Hệ số chặn (Intercept) với giá trị là 1.349 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy log-odds của ChurnYes là 1.349 khi tất cả các biến giải thích khác bằng 0 hoặc ở mức tham chiếu của chúng.

5.1.2 Dự báo xác suất

# Giả sử đây là thông tin của một khách hàng bất kỳ
newcustomer1 <- data.frame(
  gender = "Female", 
  Dependents = "No", 
  tenure = 2, 
  PhoneService = "Yes", 
  InternetService = "Fiber optic", 
  Contract = "Shortterm", 
  PaperlessBilling = "No", 
  PaymentMethod = "Manual", 
  MonthlyCharges = 22.3, 
  TotalCharges = 22.3)
# Tính xác suất khách hàng đó ngưng sử dụng dịch vụ
predict(logit1, newdata = newcustomer1, type = "response")
##         1 
## 0.4477365

Giả sử rằng một khách hàng có thông tin như sau:

  • Giới tính: Nữ
  • Độc lập tài chính: Không
  • Số tháng gắn bó: 2
  • Dịch vụ điện thoại: Có
  • Dịch vụ Internet: Fiber optic
  • Hợp đồng: ngắn hạn
  • Hóa đơn điện tử: Không
  • Phương thức thanh toán: Thủ công
  • Số tiền trả hàng tháng: 22.3
  • Tổng số tiền đã trả: 22.3

Vậy khi đó, ta có thể dự đoán được xác suất dừng sử dụng dịch vụ của khách hàng đó theo hồi quy logistic là khoảng 44.77365%.

2.2 Biến phụ thuộc Contract

2.2.1 Mô hình

logit2 <- glm(Contract ~ Dependents + tenure + PhoneService + InternetService + Churn + PaperlessBilling + PaymentMethod + MonthlyCharges + TotalCharges, data = ccp, family = binomial(link = "logit"))
summary(logit2)
## 
## Call:
## glm(formula = Contract ~ Dependents + tenure + PhoneService + 
##     InternetService + Churn + PaperlessBilling + PaymentMethod + 
##     MonthlyCharges + TotalCharges, family = binomial(link = "logit"), 
##     data = ccp)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                -6.472e+00  3.176e-01 -20.378  < 2e-16 ***
## DependentsYes               5.567e-01  8.082e-02   6.888 5.66e-12 ***
## tenure                      8.416e-02  5.225e-03  16.108  < 2e-16 ***
## PhoneServiceYes            -1.205e+00  1.714e-01  -7.031 2.04e-12 ***
## InternetServiceFiber optic -3.336e+00  1.740e-01 -19.174  < 2e-16 ***
## InternetServiceNo           4.107e+00  2.295e-01  17.898  < 2e-16 ***
## ChurnNo                     1.140e+00  1.069e-01  10.666  < 2e-16 ***
## PaperlessBillingYes        -6.469e-01  8.257e-02  -7.834 4.72e-15 ***
## PaymentMethodManual        -4.212e-01  7.658e-02  -5.500 3.80e-08 ***
## MonthlyCharges              7.453e-02  5.468e-03  13.628  < 2e-16 ***
## TotalCharges               -1.383e-04  7.104e-05  -1.947   0.0516 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 9675.0  on 7031  degrees of freedom
## Residual deviance: 4609.5  on 7021  degrees of freedom
## AIC: 4631.5
## 
## Number of Fisher Scoring iterations: 6

Bên trên là kết quả hồi quy logistic của biến phụ thuộc ContractShortterm (Tỷ lệ khách hàng có chọn hợp đồng ngắn hạn). Trong đó ta có thể thấy được:

  • DependentsYes với hệ số hồi quy là 0.5567 và có ý nghĩa thống kê ở mức ý nghĩa rất cao là 0% cho thấy khách hàng không độc lập tài chính (DependentsYes) có log-odds (log của tỷ lệ khách hàng chọn hợp đồng ngắn hạn và tỷ lệ khách hàng chọn hợp đồng dài hạn) sử dụng loại hợp đồng ngắn hạn cao hơn 0.2332 so với khách hàng độc lập tài chính (DependentsNo)

  • tenure với hệ số hồi quy là 0.08416 và có ý nghĩa thống kê ở mức cao 0% cho thấy với mỗi tháng gắn bó thêm, log-odds sử dụng loại hợp đồng ngắn hạn tăng 0.08416 lần.

  • PhoneServiceYes với hệ số hồi quy là -3.336 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng có đăng ký dịch vụ điện thoại có log-odds sử dụng loại hợp đồng ngắn hạn thấp hơn 3.336 lần so với khách hàng không đăng ký dịch vụ điện thoại.

  • InternetServiceFiber optic với hệ số hồi quy là -0.9724 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng sử dụng Fiber optic có log-odds sử dụng loại hợp đồng ngắn hạn thấp hơn 0.9724 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • InternetServiceNo với hệ số hồi quy là 4.107 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy rằng khách hàng không có dịch vụ internet có log-odds sử dụng loại hợp đồng ngắn hạn cao hơn 4.107 lần so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • ChurnNo với hệ số hồi quy là 1.14 và có ý nghĩa thống kê với mức ý nghĩa 0% cho thấy rằng khách hàng quyết định tiếp tục sử dụng dịch vụ có log-odds sử dụng loại hợp đồng ngắn hạn cao hơn 1.14 lần so với khách hàng chọn dừng sử dụng dịch vụ (ChurnYes).

  • PaperlessBillingYes với hệ số hồi quy là -0.6469 và có ý nghĩa thống kê ở mức 0% cho thấy khách hàng không sử dụng hóa đơn điện tử có log-odds sử dụng loại hợp đồng ngắn hạn thấp hơn 0.6469 lần so với khách hàng sử dụng hóa đơn điện tử.

  • PaymentMethodManual với hệ số hồi quy là -0.4212 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy được khách hàng sử dụng phương thức thanh toán thủ công (Electronic check, Mailed check) có log-odds sử dụng loại hợp đồng ngắn hạn thấp hơn 0.4212 so với khách hàng sử dụng phương thức thanh toán tự động. (PaymentMethodAutomatic).

  • MonthlyCharges với hệ số hồi quy là 0.007453 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy với mỗi đơn vị tăng của phí hàng tháng, log-odds sử dụng loại hợp đồng ngắn hạn tăng 0.007453 lần.

  • TotalCharges -0.0001383 và có ý nghĩa thống kê ở mức 10% cho thấy với mỗi đơn vị tăng của tổng phí, log-odds sử dụng loại hợp đồng ngắn hạn giảm 0.0001383 lần.

  • Hệ số chặn (Intercept) với giá trị là -6.472 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy log-odds của tỷ lệ các khách hàng chọn hợp đồng ngắn hạn là 1.349 khi tất cả các biến giải thích khác bằng 0 hoặc ở mức tham chiếu của chúng.

2.2.2 Dự báo xác suất

# Giả sử đây là thông tin của một khách hàng bất kỳ
newcustomer2 <- data.frame(
  gender = "Female", 
  Dependents = "No", 
  tenure = 2, 
  PhoneService = "Yes", 
  InternetService = "DSL", 
  Churn = "No", 
  PaperlessBilling = "No", 
  PaymentMethod = "Manual", 
  MonthlyCharges = 22.3, 
  TotalCharges = 22.3)
# Tính xác suất khách hàng đó ngưng sử dụng dịch vụ
predict(logit2, newdata = newcustomer2, type = "response")
##          1 
## 0.00587512

Giả sử rằng một khách hàng có thông tin như sau:

  • Giới tính: Nữ
  • Độc lập tài chính: Không
  • Số tháng gắn bó: 2
  • Dịch vụ điện thoại: Có
  • Dịch vụ Internet: DSL
  • Quyết định dừng sử dụng dịch vụ: Không
  • Hóa đơn điện tử: Không
  • Phương thức thanh toán: Thủ công
  • Số tiền trả hàng tháng: 22.3
  • Tổng số tiền đã trả: 22.3

Vậy khi đó, ta có thể dự đoán được xác suất chọn loại hợp đồng ngắn hạn của khách hàng đó theo hồi quy logistic là khoảng 5.88%.

PHẦN 3: HỒI QUY PROBIT

3.1 Biến phụ thuộc Churn

3.1.1 Mô hình

probit1 <- glm(Churn ~ Dependents + tenure + PhoneService + InternetService + Contract + PaperlessBilling + PaymentMethod + MonthlyCharges + TotalCharges, data = ccp, family = binomial(link = "probit"))
summary(probit1)
## 
## Call:
## glm(formula = Churn ~ Dependents + tenure + PhoneService + InternetService + 
##     Contract + PaperlessBilling + PaymentMethod + MonthlyCharges + 
##     TotalCharges, family = binomial(link = "probit"), data = ccp)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 3.285e-01  1.211e-01   2.713  0.00667 ** 
## DependentsYes               1.383e-01  4.501e-02   3.072  0.00213 ** 
## tenure                      2.499e-02  3.040e-03   8.221  < 2e-16 ***
## PhoneServiceYes             4.197e-01  8.266e-02   5.078 3.82e-07 ***
## InternetServiceFiber optic -5.620e-01  7.567e-02  -7.427 1.11e-13 ***
## InternetServiceNo           2.647e-01  1.060e-01   2.497  0.01251 *  
## ContractLongterm            5.459e-01  5.494e-02   9.937  < 2e-16 ***
## PaperlessBillingYes        -2.455e-01  4.198e-02  -5.849 4.95e-09 ***
## PaymentMethodManual        -1.761e-01  4.126e-02  -4.267 1.98e-05 ***
## MonthlyCharges             -4.819e-03  2.324e-03  -2.074  0.03812 *  
## TotalCharges               -6.325e-05  3.527e-05  -1.793  0.07290 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 8143.4  on 7031  degrees of freedom
## Residual deviance: 5989.7  on 7021  degrees of freedom
## AIC: 6011.7
## 
## Number of Fisher Scoring iterations: 6

Bên trên là kết quả hồi quy probit của biến phụ thuộc ChurnYes (Khả năng khách hàng ngưng sử dụng dịch vụ). Trong đó ta có thể thấy được:

  • DependentsYes với hệ số hồi quy là 0.1383 và có ý nghĩa thống kê ở mức ý nghĩa ở mức 1% cho thấy khách hàng không độc lập tài chính (DependentsYes) có khả năng ngừng dịch vụ cao hơn 0.1383 lần so với khách hàng độc lập tài chính (DependentsNo)

  • tenure với hệ số hồi quy là 0.2499 và có ý nghĩa thống kê ở mức cao 0% cho thấy với mỗi tháng gắn bó thêm, khả năng ngừng dịch vụ tăng 0.0556.

  • PhoneServiceYes với hệ số hồi quy là 0.4197 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng có đăng ký dịch vụ điện thoại có khả năng ngừng dịch vụ cao hơn 0.4197 lần so với khách hàng không đăng ký dịch vụ điện thoại.

  • InternetServiceFiber optic với hệ số hồi quy là -0.562 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng sử dụng Fiber optic có khả năng ngừng dịch vụ thấp hơn 0.9724 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • InternetServiceNo với hệ số hồi quy là 0.2647 và có ý nghĩa thống kê ở mức ý nghĩa 5% cho thấy rằng khách hàng không có dịch vụ internet có khả năng ngừng dịch vụ cao hơn 0.2647 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • ContractShortterm với hệ số hồi quy là -0.5459 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng với hợp đồng ngắn hạn có khả năng ngừng dịch vụ thấp hơn 0.5459 lần so với khách hàng có hợp đồng dài hạn là ContractLongterm.

  • PaperlessBillingYes với hệ số hồi quy là -0.2455 và có ý nghĩa thống kê ở mức 0% cho thấy khách hàng không sử dụng hóa đơn điện tử có khả năng ngừng dịch vụ thấp hơn 0.2455 lần so với khách hàng sử dụng hóa đơn điện tử.

  • PaymentMethodManual với hệ số hồi quy là -0.1761 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy được khách hàng sử dụng phương thức thanh toán thủ công (Electronic check, Mailed check) có khả năng ngừng dịch vụ thấp hơn 0.1761 so với khách hàng sử dụng phương thức thanh toán tự động. (PaymentMethodAutomatic).

  • MonthlyCharges với hệ số hồi quy là -0.004819 và có ý nghĩa thống kê ở mức ý nghĩa 5% cho thấy với mỗi đơn vị tăng của phí hàng tháng, khả năng ngừng dịch vụ giảm 0.004819.

  • TotalCharges -0.00006325 và có ý nghĩa thống kê ở mức 10% cho thấy với mỗi đơn vị tăng của tổng phí, khả năng ngừng dịch vụ giảm0.00006325 lần.

  • Hệ số chặn (Intercept) với giá trị là 0.8744 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khả năng một khách hàng dừng dịch vụ (ChurnYes) cao hơn 0.8744 lần so với chọn không tiếp tục dịch vụ khi tất cả các biến giải thích khác bằng 0 hoặc ở mức tham chiếu của chúng.

3.1.2 Dự báo xác suất

# Giả sử đây là thông tin của một khách hàng bất kỳ
newcustomer <- data.frame(
  gender = "Female", 
  Dependents = "No", 
  tenure = 2, 
  PhoneService = "Yes", 
  InternetService = "Fiber optic", 
  Contract = "Shortterm", 
  PaperlessBilling = "No", 
  PaymentMethod = "Manual", 
  MonthlyCharges = 22.3, 
  TotalCharges = 22.3)
# Tính xác suất khách hàng đó ngưng sử dụng dịch vụ
predict(probit1, newdata = newcustomer, type = "response")
##         1 
## 0.4805878

Giả sử rằng một khách hàng có thông tin như sau:

  • Giới tính: Nữ
  • Độc lập tài chính: Không
  • Số tháng gắn bó: 2
  • Dịch vụ điện thoại: Có
  • Dịch vụ Internet: Fiber optic
  • Hợp đồng: ngắn hạn
  • Hóa đơn điện tử: Không
  • Phương thức thanh toán: Thủ công
  • Số tiền trả hàng tháng: 22.3
  • Tổng số tiền đã trả: 22.3

Vậy khi đó, ta có thể dự đoán được xác suất dừng sử dụng dịch vụ của khách hàng đó theo hồi quy probit là khoảng 48.05878%

3.2 Biến phụ thuộc Contract

3.2.1 Mô hình

probit2 <- glm(Contract ~  Dependents + tenure + PhoneService + InternetService + Churn + PaperlessBilling + PaymentMethod + MonthlyCharges + TotalCharges, data = ccp, family = binomial(link = "probit"))
summary(probit2)
## 
## Call:
## glm(formula = Contract ~ Dependents + tenure + PhoneService + 
##     InternetService + Churn + PaperlessBilling + PaymentMethod + 
##     MonthlyCharges + TotalCharges, family = binomial(link = "probit"), 
##     data = ccp)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                -3.633e+00  1.713e-01 -21.213  < 2e-16 ***
## DependentsYes               3.191e-01  4.574e-02   6.977 3.02e-12 ***
## tenure                      4.785e-02  2.737e-03  17.484  < 2e-16 ***
## PhoneServiceYes            -6.838e-01  9.602e-02  -7.121 1.07e-12 ***
## InternetServiceFiber optic -1.852e+00  9.524e-02 -19.446  < 2e-16 ***
## InternetServiceNo           2.298e+00  1.256e-01  18.295  < 2e-16 ***
## ChurnNo                     6.404e-01  5.932e-02  10.795  < 2e-16 ***
## PaperlessBillingYes        -3.611e-01  4.641e-02  -7.780 7.27e-15 ***
## PaymentMethodManual        -2.413e-01  4.354e-02  -5.541 3.00e-08 ***
## MonthlyCharges              4.138e-02  3.009e-03  13.753  < 2e-16 ***
## TotalCharges               -7.445e-05  3.734e-05  -1.994   0.0462 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 9675.0  on 7031  degrees of freedom
## Residual deviance: 4591.2  on 7021  degrees of freedom
## AIC: 4613.2
## 
## Number of Fisher Scoring iterations: 6

Bên trên là kết quả hồi quy probit của biến phụ thuộc ChurnYes (Khả năng khách hàng ngưng sử dụng dịch vụ). Trong đó ta có thể thấy được:

  • DependentsYes với hệ số hồi quy là -0.3191 và có ý nghĩa thống kê ở mức ý nghĩa ở mức 0% cho thấy khách hàng không độc lập tài chính (DependentsYes) có khả năng chọn hợp đồng ngắn hạn thấp hơn 0.3191 lần so với khách hàng độc lập tài chính (DependentsNo)

  • tenure với hệ số hồi quy là -0.04785 và có ý nghĩa thống kê ở mức cao 0% cho thấy với mỗi tháng gắn bó thêm, khả năng chọn hợp đồng ngắn hạn giảm 0.004785 lần.

  • PhoneServiceYes với hệ số hồi quy là 0.6838 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng có đăng ký dịch vụ điện thoại có khả năng chọn hợp đồng ngắn hạn cao hơn 0.6838 lần so với khách hàng không đăng ký dịch vụ điện thoại.

  • InternetServiceFiber optic với hệ số hồi quy là 1.852 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng sử dụng Fiber optic có khả năng chọn hợp đồng ngắn hạn cao hơn 1.852 lần so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • InternetServiceNo với hệ số hồi quy là -2.298 và có ý nghĩa thống kê ở mức ý nghĩa 5% cho thấy rằng khách hàng không có dịch vụ internet có khả năng chọn sử dùng hợp đồng ngắn hạn thấp hơn 2.298 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • ChurnNo với hệ số hồi quy là -0.6404 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy rằng khách hàng chọn tiếp tục sử dụng dịch vụ có khả năng chọn loại hợp đồng ngắn hạn thấp hơn 0.6404 lần so với khách chọn dừng dịch vụ.

  • PaperlessBillingYes với hệ số hồi quy là 0.3611 và có ý nghĩa thống kê ở mức 0% cho thấy khách hàng không sử dụng hóa đơn điện tử có khả năng chọn loại hợp đồng ngắn hạn cao hơn 0.3611 lần so với khách hàng sử dụng hóa đơn điện tử.

  • PaymentMethodManual với hệ số hồi quy là 0.2413 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy được khách hàng sử dụng phương thức thanh toán thủ công (Electronic check, Mailed check) có khả năng chọn sử dụng hợp đồng ngắn hạn cao hơn 0.2413 lần so với khách hàng sử dụng phương thức thanh toán tự động (PaymentMethodAutomatic).

  • MonthlyCharges với hệ số hồi quy là -0.04138 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy với mỗi đơn vị tăng của phí hàng tháng, khả năng chọn sử dụng hợp đồng ngắn hạn giảm 0.04138 lần.

  • TotalCharges với hệ số hồi quy là 0.00007445 và có ý nghĩa thống kê ở mức 5% cho thấy với mỗi đơn vị tăng của tổng phí, khả năng chọn hợp đồng ngắn hạn tăng 0.00007445 lần.

  • Hệ số chặn (Intercept) với giá trị là 3.633 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khả năng một khách hàng chọn sử dụng hợp đồng ngắn hạn (ContractShortterm) cao hơn một khách hàng chọn sử dụng hợp đồng dài hạn là 3.633 lần khi tất cả các biến giải thích khác bằng 0 hoặc ở mức tham chiếu của chúng.

3.2.2 Dự báo xác suất

# Giả sử đây là thông tin của một khách hàng bất kỳ
newcustomer2 <- data.frame(
  gender = "Female", 
  Dependents = "No", 
  tenure = 2, 
  PhoneService = "Yes", 
  InternetService = "DSL", 
  Churn = "No", 
  PaperlessBilling = "No", 
  PaymentMethod = "Manual", 
  MonthlyCharges = 22.3, 
  TotalCharges = 22.3)
# Tính xác suất khách hàng đó ngưng sử dụng dịch vụ
predict(probit2, newdata = newcustomer2, type = "response")
##           1 
## 0.001860661

Giả sử rằng một khách hàng có thông tin như sau:

  • Giới tính: Nữ
  • Độc lập tài chính: Không
  • Số tháng gắn bó: 2
  • Dịch vụ điện thoại: Có
  • Dịch vụ Internet: DSL
  • Quyết định dừng sử dụng dịch vụ: Không
  • Hóa đơn điện tử: Không
  • Phương thức thanh toán: Thủ công
  • Số tiền trả hàng tháng: 22.3
  • Tổng số tiền đã trả: 22.3

Vậy khi đó, ta có thể dự đoán được xác suất chọn loại hợp đồng ngắn hạn của khách hàng đó theo hồi quy probit là khoảng 1.86%.

LS0tDQp0aXRsZTogIlBURExEVF9USDciDQphdXRob3I6ICJOZ3V54buFbiBUcuG6p24gS2jDoW5oIFNhbiINCmRhdGU6ICIyMDI1LTA3LTExIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCmJvZHkgew0KICBmb250LXNpemU6IDE4cHg7DQp9DQoNCmgxIHsgZm9udC1zaXplOiAyLjJlbTsgfQ0KaDIgeyBmb250LXNpemU6IDEuOGVtOyB9DQpoMyB7IGZvbnQtc2l6ZTogMS41ZW07IH0NCg0KcCB7DQogIGZvbnQtc2l6ZTogMS4xZW07DQogIGxpbmUtaGVpZ2h0OiAxLjY7IA0KfQ0KDQpjb2RlIHsNCiAgZm9udC1zaXplOiAxNnB4Ow0KfQ0KYGBgDQoNCiMgKipQSOG6pk4gMTogVMOMTSBISeG7glUgVsOAIENIVeG6qE4gQuG7iiBE4buuIExJ4buGVSoqDQoNCiMjICoqMS4xIFRow7RuZyB0aW4gduG7gSBi4buZIGThu68gbGnhu4d1KioNCg0KKioqQ+G6pXUgdHLDumMgY+G7p2EgYuG7mSBk4buvIGxp4buHdSoqKg0KDQpgYGB7cn0NCmNjcCA8LSByZWFkLmNzdigiRDovQkFJIFRBUC9QVERMRFQvQ3VzdG9tZXItQ2h1cm4tUHJlZGljdGlvbi5jc3YiLCBoZWFkZXIgPSBUUlVFKQ0Kc3RyKGNjcCkNCmBgYA0KDQpgQ3VzdG9tZXItQ2h1cm4tUHJlZGljdGlvbi5jc3ZgIGzDoCBi4buZIGThu68gbGnhu4d1IGto4bqjbyBzw6F0IHF1eeG6v3QgxJHhu4tuaCBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2Ega2jDoWNoIGjDoG5nLiBC4buZIGThu68gbGnhu4d1IG7DoHkgYmFvIGfhu5NtIDEyIGJp4bq/biB2w6AgNzA0MyBxdWFuIHPDoXQuDQoNCi0gYGN1c3RvbWVySURgOiBNw6Mga2jDoWNoIGjDoG5nDQotIGBnZW5kZXJgOiBHaeG7m2kgdMOtbmggKGJhbyBn4buTbSBNYWxlIHbDoCBGZW1hbGUpDQotIGBEZXBlbmRlbnRzYDogxJDhu5ljIGzhuq1wIGtpbmggdOG6vyAoTm8gdsOgIFllcykNCi0gYHRlbnVyZWA6IFPhu5EgdGjDoW5nIMSRw6MgZ+G6r24gYsOzIHbhu5tpIGThu4tjaCB24bulDQotIGBQaG9uZVNlcnZpY2VgOiBE4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkgKE5vIHbDoCBZZXMpDQotIGBJbnRlcm5ldFNlcnZpY2VgOiBMb+G6oWkgZOG7i2NoIHbhu6UgaW50ZXJuZXQgKERTTCwgRmliZXIgb3B0aWMgdsOgIE5vKQ0KLSBgQ29udHJhY3RgOiBI4bqhbiBo4bujcCDEkeG7k25nIChOZ+G6r24gaOG6oW46IE1vbnRoLXRvLW1vbnRoOyBEw6BpIGjhuqFuOiBPbmUgeWVhciwgVHdvIHllYXIpDQotIGBQYXBlcmxlc3NCaWxsaW5nYDogSMOzYSDEkcahbiDEkWnhu4duIHThu60gKE5vIHbDoCBZZXMpDQotIGBQYXltZW50TWV0aG9kYDogUGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIChU4buxIMSR4buZbmc6IEJhbmsgdHJhbnNmZXIsIENyZWRpdCBjYXJkOyBUaOG7pyBjw7RuZzogRWxlY3Ryb25pYyBjaGVjaywgTWFpbGVkIGNoZWNrKQ0KLSBgTW9udGhseUNoYXJnZXNgOiBT4buRIHRp4buBbiB0cuG6oyBow6BuZyB0aMOhbmcNCi0gYFRvdGFsQ2hhcmdlc2A6IFThu5VuZyBz4buRIHRp4buBbiDEkcOjIHRy4bqjDQotIGBDaHVybmA6IEThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSAoTm8gdsOgIFllcykNCg0KKioqS2nhu4NtIHRyYSBk4buvIGxp4buHdSBi4buLIHRoaeG6v3UqKioNCg0KYGBge3J9DQpzdW0oaXMubmEoY2NwKSkNCmNjcCA8LSBuYS5vbWl0KGNjcCkNCmBgYA0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBnacOhIHRy4buLIG7DoG8gYuG7iyB0aGnhur91IHbDoCDEkcOjIHPhurVuIHPDoG5nIMSR4buDIHRo4buxYyBoaeG7h24gY8OhYyB0aGFvIHTDoWMgdMOtbmggdG/DoW4gdsOgIMaw4bubYyBsxrDhu6NuZy4NCg0KIyMgKioxLjIgQ2h1eeG7g24gduG7gSBmYWN0b3IqKg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENodXnhu4NuIGjhuqFuIGjhu6NwIMSR4buTbmcgdGjDoG5oIGTDoGkgaOG6oW4gdsOgIG5n4bqvbiBo4bqhbg0KY2NwJENvbnRyYWN0IDwtIGlmZWxzZShjY3AkQ29udHJhY3QgPT0gIk1vbnRoLXRvLW1vbnRoIiwgIlNob3J0dGVybSIsICJMb25ndGVybSIpDQoNCiMgQ2h1eeG7g24gcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHRow6BuaCB04buxIMSR4buZbmcgdsOgIHRo4bunIGPDtG5nDQpjY3AkUGF5bWVudE1ldGhvZCA8LSBpZmVsc2UoY2NwJFBheW1lbnRNZXRob2QgJWluJSBjKCJNYWlsZWQgY2hlY2siLCJFbGVjdHJvbmljIGNoZWNrIiksICJNYW51YWwiLCAiQXV0b21hdGljIikNCg0KIyBDaHV54buDbiB04bqldCBj4bqjIGPDoWMgYmnhur9uIHbhu4EgImZhY3RvciINCmNjcCA8LSBjY3AgJT4lIG11dGF0ZShhY3Jvc3MoYyhnZW5kZXIsRGVwZW5kZW50cyxQaG9uZVNlcnZpY2UsSW50ZXJuZXRTZXJ2aWNlLENvbnRyYWN0LFBhcGVybGVzc0JpbGxpbmcsUGF5bWVudE1ldGhvZCxDaHVybiksIGFzLmZhY3RvcikpDQpgYGANCg0KVHJvbmcgaMOgbSBgZ2xtYCwgdmnhu4djIGNodXnhu4NuIGPDoWMgYmnhur9uIHbhu4EgZmFjdG9yIGzDoCBt4buZdCBjw7RuZyBj4bulIMSRxqFuIGdp4bqjbiBtw6AgaGnhu4d1IHF14bqjIGRvIHZp4buHYyBjw6FjIGJp4bq/biB0aHXhu5ljIHBow6JuIGxv4bqhaSBuw6B5IHPhur0gxJHGsOG7o2MgYGdsbWAgdOG7sSDEkeG7mW5nIG3DoyBow7NhIHRow6BuaCBiaeG6v24gZ2nhuqMgbcOgIGtow7RuZyBj4bqnbiBwaOG6o2kgdMOhYyB0aMOqbSBi4bqldCBj4bupIGLGsOG7m2MgbsOgbywgxJFp4buBdSBuw6B5IGtoaeG6v24gdmnhu4djIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHRy4bufIG7Dqm4gxJHhu6EgcuG6r2MgcuG7kWkgaMahbi4gTmdvw6BpIHJhLCB2aeG7h2MgxJHGsGEgY8OhYyBiaeG6v24gduG7gSBmYWN0b3IgY8OybiBnacO6cCBo4bqhbiBjaOG6vyBs4buXaSB0cm9uZyBxdcOhIHRyw6xuaCDGsOG7m2MgbMaw4bujbmcgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5Lg0KDQpgYGB7cn0NCmNjcCRDaHVybiA8LSByZWxldmVsKGNjcCRDaHVybiwgcmVmID0gIlllcyIpDQpsZXZlbHMoY2NwJENodXJuKQ0KYGBgDQoNCktoaSDEkeG6t3QgbeG7qWMgxrB1IHRpw6puIGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljIGBDaHVybmAgdGjDoG5oIFllcywga2hpIMSRw7MgYGdsbWAgc+G6vSBt4bq3YyDEkeG7i25oIHLhurFuZyBDaHVyblllcyBsw6AgYmnhur9uIHBo4bulIHRodeG7mWMsIG5naMSpYSBsw6AgdOG7tyBs4buHIGPDoWMga2jDoWNoIGjDoG5nIHF1eeG6v3QgxJHhu4tuaCBuZ8awbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UuDQoNCmBgYHtyfQ0KIyDEkOG6t3QgbeG7qWMgxrB1IHRpw6puIGNobyBDb250cmFjdFNob3J0dGVybQ0KY2NwJENvbnRyYWN0IDwtIHJlbGV2ZWwoY2NwJENvbnRyYWN0LCByZWYgPSAiU2hvcnR0ZXJtIikNCmxldmVscyhjY3AkQ29udHJhY3QpDQpgYGANCg0KVMawxqFuZyB04buxLCBraGkgxJHhurd0IG3hu6ljIMawdSB0acOqbiBsw6AgU2hvcnR0ZXJtLCBraGkgxJHDsyBiaeG6v24gcGjhu6UgdGh14buZYyBsw6AgQ29udHJhY3RTaG9ydHRlcm0sIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgY2jhu41uIGxv4bqhaSBk4buLY2ggduG7pSBuZ+G6r24gaOG6oW4uDQoNCiMgKipQSOG6pk4gMjogSOG7kkkgUVVZIExPR0lTVElDKioNCg0KIyMgKioyLjEgQmnhur9uIHBo4bulIHRodeG7mWMgYENodXJuYCoqDQoNCiMjIyAqKioyLjEuMSBNw7QgaMOsbmgqKioNCg0KYGBge3J9DQpsb2dpdDEgPC0gZ2xtKENodXJuIH4gIERlcGVuZGVudHMgKyB0ZW51cmUgKyBQaG9uZVNlcnZpY2UgKyBJbnRlcm5ldFNlcnZpY2UgKyBDb250cmFjdCArIFBhcGVybGVzc0JpbGxpbmcgKyBQYXltZW50TWV0aG9kICsgTW9udGhseUNoYXJnZXMgKyBUb3RhbENoYXJnZXMsIGRhdGEgPSBjY3AsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCnN1bW1hcnkobG9naXQxKQ0KYGBgDQoNCkLDqm4gdHLDqm4gbMOgIGvhur90IHF14bqjIGjhu5NpIHF1eSBsb2dpc3RpYyBj4bunYSBiaeG6v24gcGjhu6UgdGh14buZYyBDaHVyblllcy4gVHJvbmcgxJHDsyB0YSBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjOg0KDQotIGBEZXBlbmRlbnRzWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjIzMzIgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSBy4bqldCBjYW8gbMOgIDElIGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIGtow7RuZyDEkeG7mWMgbOG6rXAgdMOgaSBjaMOtbmggKCoqRGVwZW5kZW50c1llcyoqKSBjw7MgbG9nLW9kZHMgKGxvZyBj4bunYSB04bu3IGzhu4cgZ2nhu69hIGtow6FjaCBow6BuZyBjaOG7jW4gbmfGsG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIHbDoCBraMOhY2ggaMOgbmcgY2jhu41uIHRp4bq/cCB04bulYyBz4butIGThu6VuZyBk4buLY2ggduG7pSkgbmfhu6tuZyBk4buLY2ggduG7pSBjYW8gaMahbiAwLjIzMzIgc28gduG7m2kga2jDoWNoIGjDoG5nIMSR4buZYyBs4bqtcCB0w6BpIGNow61uaCAoKipEZXBlbmRlbnRzTm8qKikNCg0KLSBgdGVudXJlYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjA1NTY2IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyBjYW8gMCUgY2hvIHRo4bqleSB24bubaSBt4buXaSB0aMOhbmcgZ+G6r24gYsOzIHRow6ptLCBsb2ctb2RkcyBuZ+G7q25nIGThu4tjaCB24bulIHTEg25nIDAuMDU1Ni4NCg0KLSBgUGhvbmVTZXJ2aWNlWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjc1MTQgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBjw7MgxJHEg25nIGvDvSBk4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkgY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgY2FvIGjGoW4gMC43NTE0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBraMO0bmcgxJHEg25nIGvDvSBk4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkuDQoNCi0gYEludGVybmV0U2VydmljZUZpYmVyIG9wdGljYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC45NzI0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgRmliZXIgb3B0aWMgY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gMC45NzI0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBEU0wgKCoqSW50ZXJuZXRTZXJ2aWNlRFNMKiopLg0KDQotIGBJbnRlcm5ldFNlcnZpY2VOb2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgMC41MjQ0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMSUgY2hvIHRo4bqleSBy4bqxbmcga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgZOG7i2NoIHbhu6UgaW50ZXJuZXQgY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgY2FvIGjGoW4gMC41MjQ0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBEU0wgKCoqSW50ZXJuZXRTZXJ2aWNlRFNMKiopLg0KDQotIGBDb250cmFjdFNob3J0dGVybWAgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTEuMDEzIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcgduG7m2kgaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gMS4wMTMgc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyBo4bujcCDEkeG7k25nIGTDoGkgaOG6oW4gbMOgICoqQ29udHJhY3RMb25ndGVybSoqLg0KDQotIGBQYXBlcmxlc3NCaWxsaW5nWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC40MzU0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBraMO0bmcgc+G7rSBk4bulbmcgaMOzYSDEkcahbiDEkWnhu4duIHThu60gY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gMC40MzU0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBow7NhIMSRxqFuIMSRaeG7h24gdOG7rS4NCg0KLSBgUGF5bWVudE1ldGhvZE1hbnVhbGAgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTAuMzA3MyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkgxJHGsOG7o2Mga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB0aOG7pyBjw7RuZyAoKipFbGVjdHJvbmljIGNoZWNrKiosICoqTWFpbGVkIGNoZWNrKiopIGPDsyBsb2ctb2RkcyBuZ+G7q25nIGThu4tjaCB24bulIHRo4bqlcCBoxqFuIDAuMzA3MyBzbyB24bubaSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHThu7EgxJHhu5luZy4gKCoqUGF5bWVudE1ldGhvZEF1dG9tYXRpYyoqKS4NCg0KLSBgTW9udGhseUNoYXJnZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjAwNTUzMyBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIMSRxqFuIHbhu4sgdMSDbmcgY+G7p2EgcGjDrSBow6BuZyB0aMOhbmcsIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgZ2nhuqNtIDAuMDU1MzMuIFR1eSBuaGnDqm4gZ2nDoSB0cuG7iyBuw6B5IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIMSR4bq/biBiaeG6v24gKipDaHVyblllcyoqLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBraMO0bmcgY8OzIGLhurFuZyBjaOG7qW5nIMSR4bunIG3huqFuaCDEkeG7gyBr4bq/dCBsdeG6rW4gbsOzIGPDsyB0w6FjIMSR4buZbmcgcmnDqm5nIGzhursgxJHDoW5nIGvhu4MgxJHhur9uICoqQ2h1cm5ZZXMqKiBraGkgY8OhYyBiaeG6v24ga2jDoWMgxJHDoyDEkcaw4bujYyDEkcawYSB2w6BvIG3DtCBow6xuaC4NCg0KLSBgVG90YWxDaGFyZ2VzYCAtMC4wMDAyNTM4IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyAwJSBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIMSRxqFuIHbhu4sgdMSDbmcgY+G7p2EgdOG7lW5nIHBow60sIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgZ2nhuqNtIDAuMDAwMjUzOC4NCg0KLSBI4buHIHPhu5EgY2jhurduIChJbnRlcmNlcHQpIHbhu5tpIGdpw6EgdHLhu4sgbMOgIDEuMzQ5IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBsb2ctb2RkcyBj4bunYSBDaHVyblllcyBsw6AgMS4zNDkga2hpIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBraMOhYyBi4bqxbmcgMCBob+G6t2Mg4bufIG3hu6ljIHRoYW0gY2hp4bq/dSBj4bunYSBjaMO6bmcuDQoNCiMjIyAqKio1LjEuMiBE4buxIGLDoW8geMOhYyBzdeG6pXQqKioNCg0KYGBge3J9DQojIEdp4bqjIHPhu60gxJHDonkgbMOgIHRow7RuZyB0aW4gY+G7p2EgbeG7mXQga2jDoWNoIGjDoG5nIGLhuqV0IGvhu7MNCm5ld2N1c3RvbWVyMSA8LSBkYXRhLmZyYW1lKA0KICBnZW5kZXIgPSAiRmVtYWxlIiwgDQogIERlcGVuZGVudHMgPSAiTm8iLCANCiAgdGVudXJlID0gMiwgDQogIFBob25lU2VydmljZSA9ICJZZXMiLCANCiAgSW50ZXJuZXRTZXJ2aWNlID0gIkZpYmVyIG9wdGljIiwgDQogIENvbnRyYWN0ID0gIlNob3J0dGVybSIsIA0KICBQYXBlcmxlc3NCaWxsaW5nID0gIk5vIiwgDQogIFBheW1lbnRNZXRob2QgPSAiTWFudWFsIiwgDQogIE1vbnRobHlDaGFyZ2VzID0gMjIuMywgDQogIFRvdGFsQ2hhcmdlcyA9IDIyLjMpDQojIFTDrW5oIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyDEkcOzIG5nxrBuZyBz4butIGThu6VuZyBk4buLY2ggduG7pQ0KcHJlZGljdChsb2dpdDEsIG5ld2RhdGEgPSBuZXdjdXN0b21lcjEsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQpHaeG6oyBz4butIHLhurFuZyBt4buZdCBraMOhY2ggaMOgbmcgY8OzIHRow7RuZyB0aW4gbmjGsCBzYXU6DQoNCi0gR2nhu5tpIHTDrW5oOiBO4buvDQotIMSQ4buZYyBs4bqtcCB0w6BpIGNow61uaDogS2jDtG5nDQotIFPhu5EgdGjDoW5nIGfhuq9uIGLDszogMg0KLSBE4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWk6IEPDsw0KLSBE4buLY2ggduG7pSBJbnRlcm5ldDogRmliZXIgb3B0aWMNCi0gSOG7o3AgxJHhu5NuZzogbmfhuq9uIGjhuqFuDQotIEjDs2EgxJHGoW4gxJFp4buHbiB04butOiBLaMO0bmcNCi0gUGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuOiBUaOG7pyBjw7RuZw0KLSBT4buRIHRp4buBbiB0cuG6oyBow6BuZyB0aMOhbmc6IDIyLjMNCi0gVOG7lW5nIHPhu5EgdGnhu4FuIMSRw6MgdHLhuqM6IDIyLjMNCg0KVuG6rXkga2hpIMSRw7MsIHRhIGPDsyB0aOG7gyBk4buxIMSRb8OhbiDEkcaw4bujYyB4w6FjIHN14bqldCBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2Ega2jDoWNoIGjDoG5nIMSRw7MgdGhlbyBo4buTaSBxdXkgbG9naXN0aWMgbMOgIGtob+G6o25nIDQ0Ljc3MzY1JS4NCg0KIyMgKioyLjIgQmnhur9uIHBo4bulIHRodeG7mWMgYENvbnRyYWN0YCoqDQoNCiMjIyAqKioyLjIuMSBNw7QgaMOsbmgqKioNCg0KYGBge3J9DQpsb2dpdDIgPC0gZ2xtKENvbnRyYWN0IH4gRGVwZW5kZW50cyArIHRlbnVyZSArIFBob25lU2VydmljZSArIEludGVybmV0U2VydmljZSArIENodXJuICsgUGFwZXJsZXNzQmlsbGluZyArIFBheW1lbnRNZXRob2QgKyBNb250aGx5Q2hhcmdlcyArIFRvdGFsQ2hhcmdlcywgZGF0YSA9IGNjcCwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0Kc3VtbWFyeShsb2dpdDIpDQpgYGANCg0KQsOqbiB0csOqbiBsw6Aga+G6v3QgcXXhuqMgaOG7k2kgcXV5IGxvZ2lzdGljIGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljIENvbnRyYWN0U2hvcnR0ZXJtIChU4bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyBjaOG7jW4gaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4pLiBUcm9uZyDEkcOzIHRhIGPDsyB0aOG7gyB0aOG6pXkgxJHGsOG7o2M6DQoNCi0gYERlcGVuZGVudHNZZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIDAuNTU2NyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIHLhuqV0IGNhbyBsw6AgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcga2jDtG5nIMSR4buZYyBs4bqtcCB0w6BpIGNow61uaCAoKipEZXBlbmRlbnRzWWVzKiopIGPDsyBsb2ctb2RkcyAobG9nIGPhu6dhIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgY2jhu41uIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuIHbDoCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGNo4buNbiBo4bujcCDEkeG7k25nIGTDoGkgaOG6oW4pIHPhu60gZOG7pW5nIGxv4bqhaSBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiBjYW8gaMahbiAwLjIzMzIgc28gduG7m2kga2jDoWNoIGjDoG5nIMSR4buZYyBs4bqtcCB0w6BpIGNow61uaCAoKipEZXBlbmRlbnRzTm8qKikNCg0KLSBgdGVudXJlYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjA4NDE2IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyBjYW8gMCUgY2hvIHRo4bqleSB24bubaSBt4buXaSB0aMOhbmcgZ+G6r24gYsOzIHRow6ptLCBsb2ctb2RkcyBz4butIGThu6VuZyBsb+G6oWkgaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gdMSDbmcgMC4wODQxNiBs4bqnbi4NCg0KLSBgUGhvbmVTZXJ2aWNlWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMy4zMzYgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBjw7MgxJHEg25nIGvDvSBk4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkgY8OzIGxvZy1vZGRzIHPhu60gZOG7pW5nIGxv4bqhaSBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiB0aOG6pXAgaMahbiAzLjMzNiBs4bqnbiBzbyB24bubaSBraMOhY2ggaMOgbmcga2jDtG5nIMSRxINuZyBrw70gZOG7i2NoIHbhu6UgxJFp4buHbiB0aG/huqFpLg0KDQotIGBJbnRlcm5ldFNlcnZpY2VGaWJlciBvcHRpY2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTAuOTcyNCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIEZpYmVyIG9wdGljIGPDsyBsb2ctb2RkcyBz4butIGThu6VuZyBsb+G6oWkgaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gdGjhuqVwIGjGoW4gMC45NzI0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBEU0wgKCoqSW50ZXJuZXRTZXJ2aWNlRFNMKiopLg0KDQotIGBJbnRlcm5ldFNlcnZpY2VOb2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgNC4xMDcgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IHLhurFuZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBk4buLY2ggduG7pSBpbnRlcm5ldCBjw7MgbG9nLW9kZHMgc+G7rSBk4bulbmcgbG/huqFpIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuIGNhbyBoxqFuIDQuMTA3IGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBEU0wgKCoqSW50ZXJuZXRTZXJ2aWNlRFNMKiopLg0KDQotIGBDaHVybk5vYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAxLjE0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbhu5tpIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IHLhurFuZyBraMOhY2ggaMOgbmcgcXV54bq/dCDEkeG7i25oIHRp4bq/cCB04bulYyBz4butIGThu6VuZyBk4buLY2ggduG7pSBjw7MgbG9nLW9kZHMgc+G7rSBk4bulbmcgbG/huqFpIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuIGNhbyBoxqFuIDEuMTQgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIGNo4buNbiBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgICgqKkNodXJuWWVzKiopLg0KDQotIGBQYXBlcmxlc3NCaWxsaW5nWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC42NDY5IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBraMO0bmcgc+G7rSBk4bulbmcgaMOzYSDEkcahbiDEkWnhu4duIHThu60gY8OzIGxvZy1vZGRzIHPhu60gZOG7pW5nIGxv4bqhaSBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiB0aOG6pXAgaMahbiAwLjY0NjkgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIGjDs2EgxJHGoW4gxJFp4buHbiB04butLg0KDQotIGBQYXltZW50TWV0aG9kTWFudWFsYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC40MjEyIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSDEkcaw4bujYyBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHRo4bunIGPDtG5nICgqKkVsZWN0cm9uaWMgY2hlY2sqKiwgKipNYWlsZWQgY2hlY2sqKikgY8OzIGxvZy1vZGRzIHPhu60gZOG7pW5nIGxv4bqhaSBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiB0aOG6pXAgaMahbiAwLjQyMTIgc28gduG7m2kga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB04buxIMSR4buZbmcuICgqKlBheW1lbnRNZXRob2RBdXRvbWF0aWMqKikuDQoNCi0gYE1vbnRobHlDaGFyZ2VzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjAwNzQ1MyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkgduG7m2kgbeG7l2kgxJHGoW4gduG7iyB0xINuZyBj4bunYSBwaMOtIGjDoG5nIHRow6FuZywgbG9nLW9kZHMgc+G7rSBk4bulbmcgbG/huqFpIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuIHTEg25nIDAuMDA3NDUzIGzhuqduLg0KDQotIGBUb3RhbENoYXJnZXNgIC0wLjAwMDEzODMgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIDEwJSBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIMSRxqFuIHbhu4sgdMSDbmcgY+G7p2EgdOG7lW5nIHBow60sIGxvZy1vZGRzIHPhu60gZOG7pW5nIGxv4bqhaSBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiBnaeG6o20gMC4wMDAxMzgzIGzhuqduLg0KDQotIEjhu4cgc+G7kSBjaOG6t24gKEludGVyY2VwdCkgduG7m2kgZ2nDoSB0cuG7iyBsw6AgLTYuNDcyIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBsb2ctb2RkcyBj4bunYSB04bu3IGzhu4cgY8OhYyBraMOhY2ggaMOgbmcgY2jhu41uIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuIGzDoCAxLjM0OSBraGkgdOG6pXQgY+G6oyBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIGtow6FjIGLhurFuZyAwIGhv4bq3YyDhu58gbeG7qWMgdGhhbSBjaGnhur91IGPhu6dhIGNow7puZy4NCg0KIyMjICoqKjIuMi4yIEThu7EgYsOhbyB4w6FjIHN14bqldCoqKiANCg0KYGBge3J9DQojIEdp4bqjIHPhu60gxJHDonkgbMOgIHRow7RuZyB0aW4gY+G7p2EgbeG7mXQga2jDoWNoIGjDoG5nIGLhuqV0IGvhu7MNCm5ld2N1c3RvbWVyMiA8LSBkYXRhLmZyYW1lKA0KICBnZW5kZXIgPSAiRmVtYWxlIiwgDQogIERlcGVuZGVudHMgPSAiTm8iLCANCiAgdGVudXJlID0gMiwgDQogIFBob25lU2VydmljZSA9ICJZZXMiLCANCiAgSW50ZXJuZXRTZXJ2aWNlID0gIkRTTCIsIA0KICBDaHVybiA9ICJObyIsIA0KICBQYXBlcmxlc3NCaWxsaW5nID0gIk5vIiwgDQogIFBheW1lbnRNZXRob2QgPSAiTWFudWFsIiwgDQogIE1vbnRobHlDaGFyZ2VzID0gMjIuMywgDQogIFRvdGFsQ2hhcmdlcyA9IDIyLjMpDQojIFTDrW5oIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyDEkcOzIG5nxrBuZyBz4butIGThu6VuZyBk4buLY2ggduG7pQ0KcHJlZGljdChsb2dpdDIsIG5ld2RhdGEgPSBuZXdjdXN0b21lcjIsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQoNCkdp4bqjIHPhu60gcuG6sW5nIG3hu5l0IGtow6FjaCBow6BuZyBjw7MgdGjDtG5nIHRpbiBuaMawIHNhdToNCg0KLSBHaeG7m2kgdMOtbmg6IE7hu68NCi0gxJDhu5ljIGzhuq1wIHTDoGkgY2jDrW5oOiBLaMO0bmcNCi0gU+G7kSB0aMOhbmcgZ+G6r24gYsOzOiAyDQotIEThu4tjaCB24bulIMSRaeG7h24gdGhv4bqhaTogQ8OzDQotIEThu4tjaCB24bulIEludGVybmV0OiBEU0wNCi0gUXV54bq/dCDEkeG7i25oIGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pTogS2jDtG5nDQotIEjDs2EgxJHGoW4gxJFp4buHbiB04butOiBLaMO0bmcNCi0gUGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuOiBUaOG7pyBjw7RuZw0KLSBT4buRIHRp4buBbiB0cuG6oyBow6BuZyB0aMOhbmc6IDIyLjMNCi0gVOG7lW5nIHPhu5EgdGnhu4FuIMSRw6MgdHLhuqM6IDIyLjMNCg0KVuG6rXkga2hpIMSRw7MsIHRhIGPDsyB0aOG7gyBk4buxIMSRb8OhbiDEkcaw4bujYyB4w6FjIHN14bqldCBjaOG7jW4gbG/huqFpIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuICBj4bunYSBraMOhY2ggaMOgbmcgxJHDsyB0aGVvIGjhu5NpIHF1eSBsb2dpc3RpYyBsw6Aga2hv4bqjbmcgNS44OCUuDQoNCiMgKipQSOG6pk4gMzogSOG7kkkgUVVZIFBST0JJVCoqDQoNCiMjICoqMy4xIEJp4bq/biBwaOG7pSB0aHXhu5ljIGBDaHVybmAqKg0KDQojIyMgKioqMy4xLjEgTcO0IGjDrG5oKioqDQoNCmBgYHtyfQ0KcHJvYml0MSA8LSBnbG0oQ2h1cm4gfiBEZXBlbmRlbnRzICsgdGVudXJlICsgUGhvbmVTZXJ2aWNlICsgSW50ZXJuZXRTZXJ2aWNlICsgQ29udHJhY3QgKyBQYXBlcmxlc3NCaWxsaW5nICsgUGF5bWVudE1ldGhvZCArIE1vbnRobHlDaGFyZ2VzICsgVG90YWxDaGFyZ2VzLCBkYXRhID0gY2NwLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpKQ0Kc3VtbWFyeShwcm9iaXQxKQ0KYGBgDQoNCkLDqm4gdHLDqm4gbMOgIGvhur90IHF14bqjIGjhu5NpIHF1eSBwcm9iaXQgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgQ2h1cm5ZZXMgKEto4bqjIG7Eg25nIGtow6FjaCBow6BuZyBuZ8awbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UpLiBUcm9uZyDEkcOzIHRhIGPDsyB0aOG7gyB0aOG6pXkgxJHGsOG7o2M6DQoNCi0gYERlcGVuZGVudHNZZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIDAuMTM4MyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIOG7nyBt4bupYyAxJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBraMO0bmcgxJHhu5ljIGzhuq1wIHTDoGkgY2jDrW5oICgqKkRlcGVuZGVudHNZZXMqKikgY8OzIGto4bqjIG7Eg25nIG5n4burbmcgZOG7i2NoIHbhu6UgY2FvIGjGoW4gMC4xMzgzIGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyDEkeG7mWMgbOG6rXAgdMOgaSBjaMOtbmggKCoqRGVwZW5kZW50c05vKiopDQoNCi0gYHRlbnVyZWAgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgMC4yNDk5IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyBjYW8gMCUgY2hvIHRo4bqleSB24bubaSBt4buXaSB0aMOhbmcgZ+G6r24gYsOzIHRow6ptLCBraOG6oyBuxINuZyBuZ+G7q25nIGThu4tjaCB24bulIHTEg25nIDAuMDU1Ni4NCg0KLSBgUGhvbmVTZXJ2aWNlWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjQxOTcgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBjw7MgxJHEg25nIGvDvSBk4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkgY8OzIGto4bqjIG7Eg25nIG5n4burbmcgZOG7i2NoIHbhu6UgY2FvIGjGoW4gMC40MTk3IGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyBraMO0bmcgxJHEg25nIGvDvSBk4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkuDQoNCi0gYEludGVybmV0U2VydmljZUZpYmVyIG9wdGljYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC41NjIgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBz4butIGThu6VuZyBGaWJlciBvcHRpYyBjw7Mga2jhuqMgbsSDbmcgbmfhu6tuZyBk4buLY2ggduG7pSB0aOG6pXAgaMahbiAwLjk3MjQgc28gduG7m2kga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIERTTCAoKipJbnRlcm5ldFNlcnZpY2VEU0wqKikuDQoNCi0gYEludGVybmV0U2VydmljZU5vYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjI2NDcgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSA1JSBjaG8gdGjhuqV5IHLhurFuZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBk4buLY2ggduG7pSBpbnRlcm5ldCBjw7Mga2jhuqMgbsSDbmcgbmfhu6tuZyBk4buLY2ggduG7pSBjYW8gaMahbiAwLjI2NDcgc28gduG7m2kga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIERTTCAoKipJbnRlcm5ldFNlcnZpY2VEU0wqKikuDQoNCi0gYENvbnRyYWN0U2hvcnR0ZXJtYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC41NDU5IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcgduG7m2kgaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gY8OzIGto4bqjIG7Eg25nIG5n4burbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gMC41NDU5IGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7MgaOG7o3AgxJHhu5NuZyBkw6BpIGjhuqFuIGzDoCAqKkNvbnRyYWN0TG9uZ3Rlcm0qKi4NCg0KLSBgUGFwZXJsZXNzQmlsbGluZ1llc2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTAuMjQ1NSB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcga2jDtG5nIHPhu60gZOG7pW5nIGjDs2EgxJHGoW4gxJFp4buHbiB04butIGPDsyBraOG6oyBuxINuZyAgbmfhu6tuZyBk4buLY2ggduG7pSB0aOG6pXAgaMahbiAwLjI0NTUgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIGjDs2EgxJHGoW4gxJFp4buHbiB04butLg0KDQotIGBQYXltZW50TWV0aG9kTWFudWFsYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC4xNzYxIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSDEkcaw4bujYyBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHRo4bunIGPDtG5nICgqKkVsZWN0cm9uaWMgY2hlY2sqKiwgKipNYWlsZWQgY2hlY2sqKikgY8OzIGto4bqjIG7Eg25nIG5n4burbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gMC4xNzYxIHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gdOG7sSDEkeG7mW5nLiAoKipQYXltZW50TWV0aG9kQXV0b21hdGljKiopLg0KDQotIGBNb250aGx5Q2hhcmdlc2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTAuMDA0ODE5IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUgY2hvIHRo4bqleSB24bubaSBt4buXaSDEkcahbiB24buLIHTEg25nIGPhu6dhIHBow60gaMOgbmcgdGjDoW5nLCBraOG6oyBuxINuZyBuZ+G7q25nIGThu4tjaCB24bulIGdp4bqjbSAwLjAwNDgxOS4gDQoNCi0gYFRvdGFsQ2hhcmdlc2AgLTAuMDAwMDYzMjUgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIDEwJSBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIMSRxqFuIHbhu4sgdMSDbmcgY+G7p2EgdOG7lW5nIHBow60sIGto4bqjIG7Eg25nIG5n4burbmcgZOG7i2NoIHbhu6UgZ2nhuqNtMC4wMDAwNjMyNSBs4bqnbi4NCg0KLSBI4buHIHPhu5EgY2jhurduIChJbnRlcmNlcHQpIHbhu5tpIGdpw6EgdHLhu4sgbMOgIDAuODc0NCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkga2jhuqMgbsSDbmcgbeG7mXQga2jDoWNoIGjDoG5nIGThu6tuZyBk4buLY2ggduG7pSAoKipDaHVyblllcyoqKSBjYW8gaMahbiAwLjg3NDQgbOG6p24gc28gduG7m2kgY2jhu41uIGtow7RuZyB0aeG6v3AgdOG7pWMgZOG7i2NoIHbhu6Uga2hpIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBraMOhYyBi4bqxbmcgMCBob+G6t2Mg4bufIG3hu6ljIHRoYW0gY2hp4bq/dSBj4bunYSBjaMO6bmcuDQoNCiMjIyAqKiozLjEuMiBE4buxIGLDoW8geMOhYyBzdeG6pXQqKioNCg0KYGBge3J9DQojIEdp4bqjIHPhu60gxJHDonkgbMOgIHRow7RuZyB0aW4gY+G7p2EgbeG7mXQga2jDoWNoIGjDoG5nIGLhuqV0IGvhu7MNCm5ld2N1c3RvbWVyIDwtIGRhdGEuZnJhbWUoDQogIGdlbmRlciA9ICJGZW1hbGUiLCANCiAgRGVwZW5kZW50cyA9ICJObyIsIA0KICB0ZW51cmUgPSAyLCANCiAgUGhvbmVTZXJ2aWNlID0gIlllcyIsIA0KICBJbnRlcm5ldFNlcnZpY2UgPSAiRmliZXIgb3B0aWMiLCANCiAgQ29udHJhY3QgPSAiU2hvcnR0ZXJtIiwgDQogIFBhcGVybGVzc0JpbGxpbmcgPSAiTm8iLCANCiAgUGF5bWVudE1ldGhvZCA9ICJNYW51YWwiLCANCiAgTW9udGhseUNoYXJnZXMgPSAyMi4zLCANCiAgVG90YWxDaGFyZ2VzID0gMjIuMykNCiMgVMOtbmggeMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIMSRw7MgbmfGsG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulDQpwcmVkaWN0KHByb2JpdDEsIG5ld2RhdGEgPSBuZXdjdXN0b21lciwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCkdp4bqjIHPhu60gcuG6sW5nIG3hu5l0IGtow6FjaCBow6BuZyBjw7MgdGjDtG5nIHRpbiBuaMawIHNhdToNCg0KLSBHaeG7m2kgdMOtbmg6IE7hu68NCi0gxJDhu5ljIGzhuq1wIHTDoGkgY2jDrW5oOiBLaMO0bmcNCi0gU+G7kSB0aMOhbmcgZ+G6r24gYsOzOiAyDQotIEThu4tjaCB24bulIMSRaeG7h24gdGhv4bqhaTogQ8OzDQotIEThu4tjaCB24bulIEludGVybmV0OiBGaWJlciBvcHRpYw0KLSBI4bujcCDEkeG7k25nOiBuZ+G6r24gaOG6oW4NCi0gSMOzYSDEkcahbiDEkWnhu4duIHThu606IEtow7RuZw0KLSBQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW46IFRo4bunIGPDtG5nDQotIFPhu5EgdGnhu4FuIHRy4bqjIGjDoG5nIHRow6FuZzogMjIuMw0KLSBU4buVbmcgc+G7kSB0aeG7gW4gxJHDoyB0cuG6ozogMjIuMw0KDQpW4bqteSBraGkgxJHDsywgdGEgY8OzIHRo4buDIGThu7EgxJFvw6FuIMSRxrDhu6NjIHjDoWMgc3XhuqV0IGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBj4bunYSBraMOhY2ggaMOgbmcgxJHDsyB0aGVvIGjhu5NpIHF1eSBwcm9iaXQgbMOgIGtob+G6o25nIDQ4LjA1ODc4JQ0KDQojIyAqKjMuMiBCaeG6v24gcGjhu6UgdGh14buZYyBgQ29udHJhY3RgKioNCg0KIyMjICoqKjMuMi4xIE3DtCBow6xuaCoqKg0KDQpgYGB7cn0NCnByb2JpdDIgPC0gZ2xtKENvbnRyYWN0IH4gIERlcGVuZGVudHMgKyB0ZW51cmUgKyBQaG9uZVNlcnZpY2UgKyBJbnRlcm5ldFNlcnZpY2UgKyBDaHVybiArIFBhcGVybGVzc0JpbGxpbmcgKyBQYXltZW50TWV0aG9kICsgTW9udGhseUNoYXJnZXMgKyBUb3RhbENoYXJnZXMsIGRhdGEgPSBjY3AsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQpzdW1tYXJ5KHByb2JpdDIpDQpgYGANCkLDqm4gdHLDqm4gbMOgIGvhur90IHF14bqjIGjhu5NpIHF1eSBwcm9iaXQgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgQ2h1cm5ZZXMgKEto4bqjIG7Eg25nIGtow6FjaCBow6BuZyBuZ8awbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UpLiBUcm9uZyDEkcOzIHRhIGPDsyB0aOG7gyB0aOG6pXkgxJHGsOG7o2M6DQoNCi0gYERlcGVuZGVudHNZZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjMxOTEgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSDhu58gbeG7qWMgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcga2jDtG5nIMSR4buZYyBs4bqtcCB0w6BpIGNow61uaCAoKipEZXBlbmRlbnRzWWVzKiopIGPDsyBraOG6oyBuxINuZyBjaOG7jW4gaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gdGjhuqVwIGjGoW4gMC4zMTkxIGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyDEkeG7mWMgbOG6rXAgdMOgaSBjaMOtbmggKCoqRGVwZW5kZW50c05vKiopDQoNCi0gYHRlbnVyZWAgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTAuMDQ3ODUgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIGNhbyAwJSBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIHRow6FuZyBn4bqvbiBiw7MgdGjDqm0sIGto4bqjIG7Eg25nIGNo4buNbiBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiBnaeG6o20gMC4wMDQ3ODUgbOG6p24uDQoNCi0gYFBob25lU2VydmljZVllc2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgMC42ODM4IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcgY8OzIMSRxINuZyBrw70gZOG7i2NoIHbhu6UgxJFp4buHbiB0aG/huqFpIGPDsyBraOG6oyBuxINuZyBjaOG7jW4gaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gY2FvIGjGoW4gMC42ODM4IGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyBraMO0bmcgxJHEg25nIGvDvSBk4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkuDQoNCi0gYEludGVybmV0U2VydmljZUZpYmVyIG9wdGljYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAxLjg1MiB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIEZpYmVyIG9wdGljIGPDsyBraOG6oyBuxINuZyBjaOG7jW4gaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gY2FvIGjGoW4gMS44NTIgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIERTTCAoKipJbnRlcm5ldFNlcnZpY2VEU0wqKikuDQoNCi0gYEludGVybmV0U2VydmljZU5vYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMi4yOTggdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSA1JSBjaG8gdGjhuqV5IHLhurFuZyBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBk4buLY2ggduG7pSBpbnRlcm5ldCBjw7Mga2jhuqMgbsSDbmcgY2jhu41uIHPhu60gZMO5bmcgaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gdGjhuqVwIGjGoW4gMi4yOTggc28gduG7m2kga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIERTTCAoKipJbnRlcm5ldFNlcnZpY2VEU0wqKikuDQoNCi0gYENodXJuTm9gIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjY0MDQgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IHLhurFuZyBraMOhY2ggaMOgbmcgY2jhu41uIHRp4bq/cCB04bulYyBz4butIGThu6VuZyBk4buLY2ggduG7pSBjw7Mga2jhuqMgbsSDbmcgY2jhu41uIGxv4bqhaSBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiB0aOG6pXAgaMahbiAwLjY0MDQgbOG6p24gc28gduG7m2kga2jDoWNoIGNo4buNbiBk4burbmcgZOG7i2NoIHbhu6UuDQoNCi0gYFBhcGVybGVzc0JpbGxpbmdZZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIDAuMzYxMSB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcga2jDtG5nIHPhu60gZOG7pW5nIGjDs2EgxJHGoW4gxJFp4buHbiB04butIGPDsyBraOG6oyBuxINuZyBjaOG7jW4gbG/huqFpIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuIGNhbyBoxqFuIDAuMzYxMSBs4bqnbiBzbyB24bubaSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgaMOzYSDEkcahbiDEkWnhu4duIHThu60uDQoNCi0gYFBheW1lbnRNZXRob2RNYW51YWxgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIDAuMjQxMyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkgxJHGsOG7o2Mga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB0aOG7pyBjw7RuZyAoKipFbGVjdHJvbmljIGNoZWNrKiosICoqTWFpbGVkIGNoZWNrKiopIGPDsyBraOG6oyBuxINuZyBjaOG7jW4gc+G7rSBk4bulbmcgaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gY2FvIGjGoW4gMC4yNDEzIGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gdOG7sSDEkeG7mW5nICgqKlBheW1lbnRNZXRob2RBdXRvbWF0aWMqKikuDQoNCi0gYE1vbnRobHlDaGFyZ2VzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC4wNDEzOCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkgduG7m2kgbeG7l2kgxJHGoW4gduG7iyB0xINuZyBj4bunYSBwaMOtIGjDoG5nIHRow6FuZywga2jhuqMgbsSDbmcgY2jhu41uIHPhu60gZOG7pW5nIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuIGdp4bqjbSAwLjA0MTM4IGzhuqduLiANCg0KLSBgVG90YWxDaGFyZ2VzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjAwMDA3NDQ1IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyA1JSBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIMSRxqFuIHbhu4sgdMSDbmcgY+G7p2EgdOG7lW5nIHBow60sIGto4bqjIG7Eg25nIGNo4buNbiBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiB0xINuZyAwLjAwMDA3NDQ1IGzhuqduLg0KDQotIEjhu4cgc+G7kSBjaOG6t24gKEludGVyY2VwdCkgduG7m2kgZ2nDoSB0cuG7iyBsw6AgMy42MzMgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IGto4bqjIG7Eg25nIG3hu5l0IGtow6FjaCBow6BuZyBjaOG7jW4gc+G7rSBk4bulbmcgaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gKENvbnRyYWN0U2hvcnR0ZXJtKSBjYW8gaMahbiBt4buZdCBraMOhY2ggaMOgbmcgY2jhu41uIHPhu60gZOG7pW5nIGjhu6NwIMSR4buTbmcgZMOgaSBo4bqhbiBsw6AgMy42MzMgbOG6p24ga2hpIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBraMOhYyBi4bqxbmcgMCBob+G6t2Mg4bufIG3hu6ljIHRoYW0gY2hp4bq/dSBj4bunYSBjaMO6bmcuDQoNCiMjIyAqKiozLjIuMiBE4buxIGLDoW8geMOhYyBzdeG6pXQqKiogIA0KDQpgYGB7cn0NCiMgR2nhuqMgc+G7rSDEkcOieSBsw6AgdGjDtG5nIHRpbiBj4bunYSBt4buZdCBraMOhY2ggaMOgbmcgYuG6pXQga+G7sw0KbmV3Y3VzdG9tZXIyIDwtIGRhdGEuZnJhbWUoDQogIGdlbmRlciA9ICJGZW1hbGUiLCANCiAgRGVwZW5kZW50cyA9ICJObyIsIA0KICB0ZW51cmUgPSAyLCANCiAgUGhvbmVTZXJ2aWNlID0gIlllcyIsIA0KICBJbnRlcm5ldFNlcnZpY2UgPSAiRFNMIiwgDQogIENodXJuID0gIk5vIiwgDQogIFBhcGVybGVzc0JpbGxpbmcgPSAiTm8iLCANCiAgUGF5bWVudE1ldGhvZCA9ICJNYW51YWwiLCANCiAgTW9udGhseUNoYXJnZXMgPSAyMi4zLCANCiAgVG90YWxDaGFyZ2VzID0gMjIuMykNCiMgVMOtbmggeMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIMSRw7MgbmfGsG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulDQpwcmVkaWN0KHByb2JpdDIsIG5ld2RhdGEgPSBuZXdjdXN0b21lcjIsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQoNCkdp4bqjIHPhu60gcuG6sW5nIG3hu5l0IGtow6FjaCBow6BuZyBjw7MgdGjDtG5nIHRpbiBuaMawIHNhdToNCg0KLSBHaeG7m2kgdMOtbmg6IE7hu68NCi0gxJDhu5ljIGzhuq1wIHTDoGkgY2jDrW5oOiBLaMO0bmcNCi0gU+G7kSB0aMOhbmcgZ+G6r24gYsOzOiAyDQotIEThu4tjaCB24bulIMSRaeG7h24gdGhv4bqhaTogQ8OzDQotIEThu4tjaCB24bulIEludGVybmV0OiBEU0wNCi0gUXV54bq/dCDEkeG7i25oIGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pTogS2jDtG5nDQotIEjDs2EgxJHGoW4gxJFp4buHbiB04butOiBLaMO0bmcNCi0gUGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuOiBUaOG7pyBjw7RuZw0KLSBT4buRIHRp4buBbiB0cuG6oyBow6BuZyB0aMOhbmc6IDIyLjMNCi0gVOG7lW5nIHPhu5EgdGnhu4FuIMSRw6MgdHLhuqM6IDIyLjMNCg0KVuG6rXkga2hpIMSRw7MsIHRhIGPDsyB0aOG7gyBk4buxIMSRb8OhbiDEkcaw4bujYyB4w6FjIHN14bqldCBjaOG7jW4gbG/huqFpIGjhu6NwIMSR4buTbmcgbmfhuq9uIGjhuqFuIGPhu6dhIGtow6FjaCBow6BuZyDEkcOzIHRoZW8gaOG7k2kgcXV5IHByb2JpdCBsw6Aga2hv4bqjbmcgMS44NiUuDQoNCg0KDQoNCg==