Phần 1. TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1. Đọc file dữ liệu

d <- read.csv("C:/Users/PC/OneDrive/Máy tính/NV6.csv", header = T)

Bộ dữ liệu bao gồm hồ sơ học tập của học sinh từ hai môn học trung học: Toán học (student-mat.csv) và Ngôn ngữ Bồ Đào Nha (student-por.csv), được thu thập từ hai trường học tại Bồ Đào Nha. Mỗi bộ gồm 32 thuộc tính, phản ánh thông tin về nhân khẩu học, bối cảnh gia đình, hỗ trợ học tập, hoạt động cá nhân và thành tích học tập (G1, G2, G3). Có 382 học sinh học cả hai môn, có thể xác định bằng cách khớp các đặc điểm cá nhân trong hai bộ dữ liệu.

Các nhóm thuộc tính chính:

Nhân khẩu học: trường học, giới tính, tuổi, địa chỉ cư trú, quy mô gia đình, tình trạng sống chung của cha mẹ.

Bối cảnh cha mẹ: trình độ học vấn, nghề nghiệp.

Hỗ trợ học tập: hỗ trợ giáo dục, lớp học phụ đạo, hỗ trợ từ gia đình.

Hoạt động cá nhân: tham gia ngoại khóa, sử dụng Internet, quan hệ yêu đương.

Thói quen và xã hội: thời gian học, thời gian đi lại, quan hệ gia đình, thời gian rảnh, mức độ tiêu thụ rượu.

Thành tích học tập: điểm số 3 kỳ (G1, G2, G3), số lần nghỉ học, số lần trượt lớp trước.

Ứng dụng tiềm năng:

Dự đoán điểm cuối (G3) dựa trên các yếu tố cá nhân và xã hội.

Phân tích ảnh hưởng của trình độ học vấn và nghề nghiệp phụ huynh đến thành tích học sinh.

Khám phá mối liên hệ giữa thói quen học tập, tiêu thụ rượu và kết quả học tập.

Đánh giá hiệu quả của các chương trình hỗ trợ giáo dục và hoạt động ngoại khóa.

2. Cấu trúc bộ dữ liệu

Bộ dữ liệu Thực hành chứa tổng cộng 395 bản ghi với 33 biến đặc trưng.

str(d)
## 'data.frame':    395 obs. of  33 variables:
##  $ school    : chr  "GP" "GP" "GP" "GP" ...
##  $ sex       : chr  "F" "F" "F" "F" ...
##  $ age       : int  18 17 15 15 16 16 16 17 15 15 ...
##  $ address   : chr  "U" "U" "U" "U" ...
##  $ famsize   : chr  "GT3" "GT3" "LE3" "GT3" ...
##  $ Pstatus   : chr  "A" "T" "T" "T" ...
##  $ Medu      : int  4 1 1 4 3 4 2 4 3 3 ...
##  $ Fedu      : int  4 1 1 2 3 3 2 4 2 4 ...
##  $ Mjob      : chr  "at_home" "at_home" "at_home" "health" ...
##  $ Fjob      : chr  "teacher" "other" "other" "services" ...
##  $ reason    : chr  "course" "course" "other" "home" ...
##  $ guardian  : chr  "mother" "father" "mother" "mother" ...
##  $ traveltime: int  2 1 1 1 1 1 1 2 1 1 ...
##  $ studytime : int  2 2 2 3 2 2 2 2 2 2 ...
##  $ failures  : int  0 0 3 0 0 0 0 0 0 0 ...
##  $ schoolsup : chr  "yes" "no" "yes" "no" ...
##  $ famsup    : chr  "no" "yes" "no" "yes" ...
##  $ paid      : chr  "no" "no" "yes" "yes" ...
##  $ activities: chr  "no" "no" "no" "yes" ...
##  $ nursery   : chr  "yes" "no" "yes" "yes" ...
##  $ higher    : chr  "yes" "yes" "yes" "yes" ...
##  $ internet  : chr  "no" "yes" "yes" "yes" ...
##  $ romantic  : chr  "no" "no" "no" "yes" ...
##  $ famrel    : int  4 5 4 3 4 5 4 4 4 5 ...
##  $ freetime  : int  3 3 3 2 3 4 4 1 2 5 ...
##  $ goout     : int  4 3 2 2 2 2 4 4 2 1 ...
##  $ Dalc      : int  1 1 2 1 1 1 1 1 1 1 ...
##  $ Walc      : int  1 1 3 1 2 2 1 1 1 1 ...
##  $ health    : int  3 3 3 5 5 5 3 1 1 5 ...
##  $ absences  : int  6 4 10 2 4 10 0 6 0 0 ...
##  $ G1        : int  5 5 7 15 6 15 12 6 16 14 ...
##  $ G2        : int  6 5 8 14 10 15 12 5 18 15 ...
##  $ G3        : int  6 6 10 15 10 15 11 6 19 15 ...

Các biến trong bộ dữ liệu bao gồm:

  • school: mã trường học mà học sinh đang theo học, dạng chuỗi ký tự (“GP” hoặc “MS”).

  • sex: giới tính học sinh, dạng ký tự (“F” cho nữ, “M” cho nam).

  • age: tuổi của học sinh, kiểu số nguyên.

  • address: loại địa chỉ cư trú (“U” cho khu đô thị, “R” cho nông thôn), dạng ký tự.

  • famsize: quy mô gia đình (“LE3” nếu ≤ 3 người, “GT3” nếu > 3 người), dạng ký tự.

  • Pstatus: tình trạng sống chung của cha mẹ (“T”: sống cùng nhau, “A”: sống riêng), kiểu ký tự.

  • Medu: trình độ học vấn của mẹ, kiểu số nguyên (từ 0: không học đến 4: đại học).

  • Fedu: trình độ học vấn của cha, kiểu số nguyên (tương tự Medu).

  • Mjob: nghề nghiệp của mẹ, dạng ký tự (“teacher”, “health”, “services”, “at_home”, “other”).

  • Fjob: nghề nghiệp của cha, dạng ký tự (như Mjob).

  • reason: lý do chọn trường, kiểu ký tự (“home”, “reputation”, “course”, “other”).

  • guardian: người giám hộ chính của học sinh (“mother”, “father”, “other”), dạng ký tự.

  • traveltime: thời gian đi đến trường (1: <15 phút, 2: 15–30 phút, 3: 30 phút–1 giờ, 4: >1 giờ), kiểu số nguyên.

  • studytime: thời gian học mỗi tuần (1: <2h, 2: 2–5h, 3: 5–10h, 4: >10h), kiểu số nguyên.

  • failures: số lần học lại lớp trước đó, kiểu số nguyên.

  • schoolsup: có nhận hỗ trợ học tập tại trường không (“yes” hoặc “no”), dạng ký tự.

  • famsup: có được gia đình hỗ trợ học tập không (“yes” hoặc “no”), dạng ký tự.

  • paid: có học thêm có trả phí không (“yes” hoặc “no”), kiểu ký tự.

  • activities: có tham gia hoạt động ngoại khóa không (“yes” hoặc “no”), kiểu ký tự.

  • nursery: có từng học mẫu giáo không (“yes” hoặc “no”), kiểu ký tự.

  • higher: mong muốn học lên cao đẳng/đại học (“yes” hoặc “no”), kiểu ký tự.

  • internet: có Internet ở nhà không (“yes” hoặc “no”), kiểu ký tự.

  • romantic: đang trong mối quan hệ yêu đương hay không (“yes” hoặc “no”), kiểu ký tự.

  • famrel: mức độ quan hệ trong gia đình (1: rất xấu – 5: rất tốt), kiểu số nguyên.

  • freetime: thời gian rảnh rỗi sau giờ học (1: rất ít – 5: rất nhiều), kiểu số nguyên.

  • goout: mức độ đi chơi với bạn bè (1: rất ít – 5: rất thường xuyên), kiểu số nguyên.

  • Dalc: mức độ tiêu thụ rượu trong ngày thường (1: rất thấp – 5: rất cao), kiểu số nguyên.

  • Walc: mức độ tiêu thụ rượu cuối tuần (1: rất thấp – 5: rất cao), kiểu số nguyên.

  • health: tình trạng sức khỏe hiện tại (1: rất kém – 5: rất tốt), kiểu số nguyên.

  • absences: số ngày nghỉ học, kiểu số nguyên.

  • G1: điểm kiểm tra kỳ 1, kiểu số nguyên.

  • G2: điểm kiểm tra kỳ 2, kiểu số nguyên.

  • G3: điểm cuối khóa học, kiểu số nguyên.

3. Chọn các biến định tính

dldt <- c("school", "sex", "address", "famsize", "Pstatus", "Mjob", "Fjob", 
                          "reason", "guardian", "schoolsup", "famsup", "paid", 
                          "activities", "nursery", "higher", "internet", "romantic")
dt <- d[ , dldt]
any(is.na(dt))
## [1] FALSE

4. Kiểm tra kiểu dữ liệu và đổi về factor

# Kiểm tra kiểu dữ liệu của từng biến trong dldt
sapply(dt, class) 
##      school         sex     address     famsize     Pstatus        Mjob 
## "character" "character" "character" "character" "character" "character" 
##        Fjob      reason    guardian   schoolsup      famsup        paid 
## "character" "character" "character" "character" "character" "character" 
##  activities     nursery      higher    internet    romantic 
## "character" "character" "character" "character" "character"
dt <- data.frame(lapply(dt, as.factor))

Phần 2. PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH

2.1. SEX và PAID

2.1.1. Bảng tần số và tần suất

Bảng tần số

# Lập bảng tần số chéo giữa SEX và PAID
SP <- table(dt$sex, dt$paid)
# Thêm tổng hàng và tổng cột
SP1 <- addmargins(SP)
SP1
##      
##        no yes Sum
##   F   100 108 208
##   M   114  73 187
##   Sum 214 181 395

Bảng tần suất

# Lập bảng tần suất theo hàng (sv có việc làm)
SP_prop <- prop.table(SP, margin = 1)
# Hiển thị bảng tần suất
SP_prop
##    
##            no       yes
##   F 0.4807692 0.5192308
##   M 0.6096257 0.3903743

Biểu đồ

# Chuyển bảng sang dạng data frame
SP_df <- as.data.frame(SP)

# Đổi tên cột cho rõ ràng
colnames(SP_df) <- c("SEX", "HIGHER", "Count")

library("ggplot2")


ggplot(SP_df, aes(x = `HIGHER`, y = Count, fill = `SEX`)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = Count), 
            position = position_dodge(width = 0.9), 
            vjust = -0.3, size = 3.5) +
  labs(
    title = "Biểu đồ 1. ",
    x = "Paid",
    y = "Giới tính",
    fill = "Làm thêm"
  ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Pastel1")

2.1.2 Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀: Việc học thêm và giới tính là hai biến độc lập.

  • H₁: Việc học thêm và giới tính có liên quan với nhau.

# Thực hiện kiểm định Chi bình phương
chiSP_score <- chisq.test(SP)
print(chiSP_score)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  SP
## X-squared = 6.0772, df = 1, p-value = 0.01369

2.1.3 Hiệu tỷ lệ (Risk Difference - RD)

# Lập bảng tần số chéo giữa 
SP_score <- table(dt$sex, dt$paid)

# Thêm tổng hàng và tổng cột
sp1 <- addmargins(SP_score)
sp1
##      
##        no yes Sum
##   F   100 108 208
##   M   114  73 187
##   Sum 214 181 395
# Số sinh viên có việc làm có điểm số cao hoặc thấp

counts <- c(SP_score["F", "yes"], SP_score["F", "no"])

# Tổng số sinh viên trong từng nhóm điểm 
totals <- c(sum(SP_score[, "yes"]), sum(SP_score[, "no"]))

# Kiểm định tỉ lệ một phía: p1 < p2
test_recovery_less <- prop.test(counts, totals, alternative = "less", correct = FALSE)
test_recovery_less
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts out of totals
## X-squared = 6.586, df = 1, p-value = 0.9949
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.0000000  0.2115194
## sample estimates:
##    prop 1    prop 2 
## 0.5966851 0.4672897

Kết quả kiểm định:

  • Giá trị thống kê Chi bình phương: X² = 6.586

  • Bậc tự do (df) = 1

  • p-value = 0.9949

Với p-value = 0.9949 lớn hơn mức ý nghĩa phổ biến α = 0.05, không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là, trong dữ liệu hiện tại, không có sự khác biệt có ý nghĩa thống kê giới tính muốn học thêm hay không.

2.1.4. Relative Risk - RR:

library(epitools)
riskratio(SP_score, method= "wald")
## $data
##        
##          no yes Total
##   F     100 108   208
##   M     114  73   187
##   Total 214 181   395
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate     lower     upper
##   F 1.000000        NA        NA
##   M 0.751832 0.6022941 0.9384974
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M 0.01055016    0.0115295 0.01027837
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ học sinh nữ trong nhóm đi học thêm bằng (78/187)/(108/208) thấp hơn khoảng 25% so với tỷ lệ hs nam

Điều này có nghĩa là:

Tỷ lệ học thêm của học sinh nam thấp hơn khoảng 25% so với học sinh nữ. Nói cách khác, học sinh nữ có khả năng học thêm cao hơn đáng kể so với nam.

Kết quả kiểm định thống kê:

Risk Ratio = 0.752, khoảng tin cậy 95%: [0.602; 0.938]

P-value = 0.0103, Chi-square < 0.05

2.1.5. Odds Ratio - OR:

OR_result1 <- oddsratio(SP_score)
print(OR_result1)
## $data
##        
##          no yes Total
##   F     100 108   208
##   M     114  73   187
##   Total 214 181   395
## 
## $measure
##    odds ratio with 95% C.I.
##      estimate     lower     upper
##   F 1.0000000        NA        NA
##   M 0.5940053 0.3967869 0.8857578
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M 0.01055016    0.0115295 0.01027837
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ nhóm học sinh nam đi học thêm xấp xỉ khoảng 59.4% so với tỷ lệ của nhóm học sinh nữ, theo ước lượng odds ratio là 0.594

PHẦN 4. PHƯƠNG PHÁP ƯỚC LƯỢNG MAXIMUM LIKEHOOD

dldt <- read.csv(file.choose(), fileEncoding = "UTF-8-BOM")
is.data.frame(dldt)  # Phải là TRUE
## [1] TRUE
# Chuyển sex về dạng factor: F = 0, M = 1
dldt$sex <- factor(dldt$sex, levels = c("F", "M"))

# Chuyển higher về dạng factor: no = 0, yes = 1
dldt$higher <- factor(dldt$paid, levels = c("no", "yes"))

ml_model <- glm(sex ~ paid, data = dldt, family = binomial(link = "logit"))
summary(ml_model)
## 
## Call:
## glm(formula = sex ~ paid, family = binomial(link = "logit"), 
##     data = dldt)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)  
## (Intercept)   0.1310     0.1370   0.956   0.3389  
## paidyes      -0.5227     0.2043  -2.559   0.0105 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 546.47  on 394  degrees of freedom
## Residual deviance: 539.86  on 393  degrees of freedom
## AIC: 543.86
## 
## Number of Fisher Scoring iterations: 4

Học sinh có học thêm có khả năng là nữ cao hơn đáng kể so với học sinh không học thêm. Odds để là nam ở nhóm học thêm thấp hơn 40.7% so với nhóm không học thêm, và sự khác biệt này có ý nghĩa thống kê (p = 0.0105).

library(ggplot2)

dldt$predicted_prob <- predict(ml_model, type = "response")

ggplot(dldt, aes(x = paid, y = predicted_prob)) +
  stat_summary(fun = mean, geom = "bar", fill = "skyblue") +
  labs(y = "Xác suất là nam", x = "Paid (có học thêm)") +
  theme_minimal()

Phần 5. PHÂN TÍCH ĐA BIẾN: HỒI QUY LOGISTIC VÀ PROBIT

5.1 Hồi quy Logistic đa biến

dldt$sex_bin <- ifelse(dldt$sex == "M", 1, 0)

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
logit_model <- glm(sex_bin ~ higher + studytime +  Walc,
                   data = dldt,
                   family = binomial(link = "logit"))

summary(logit_model)
## 
## Call:
## glm(formula = sex_bin ~ higher + studytime + Walc, family = binomial(link = "logit"), 
##     data = dldt)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  0.53676    0.38813   1.383   0.1667    
## higheryes   -0.48579    0.22366  -2.172   0.0299 *  
## studytime   -0.65598    0.14602  -4.492 7.04e-06 ***
## Walc         0.39127    0.09019   4.338 1.44e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 546.47  on 394  degrees of freedom
## Residual deviance: 484.77  on 391  degrees of freedom
## AIC: 492.77
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy logistic được ước lượng như sau:

\[ \log\left(\frac{\hat{\pi}}{1 - \hat{\pi}}\right) = 0.5368 - 0.4858 \cdot \text{higher} - 0.6560 \cdot \text{studytime} + 0.3913 \cdot \text{Walc} \]

Trong đó:

  • \(\hat{\pi}\): xác suất để một học sinh là nam
  • higher: biến nhị phân (1 = có định hướng học đại học)
  • studytime: thời gian học mỗi tuần
  • Walc: mức độ uống rượu vào cuối tuần

(Intercept) = 0.5368, không có ý nghĩa thống kê (p = 0.1667), biểu thị log-odds để là nam khi học sinh không có định hướng học đại học, học ít và không uống rượu.

higher (yes): Hệ số = -0.4858, p = 0.0299

→ Học sinh có định hướng học đại học có khả năng là nữ cao hơn, và mối quan hệ này có ý nghĩa thống kê ở mức 5%.

studytime: Hệ số = -0.6560, p = 7.04e-06

→ Mỗi mức tăng trong thời gian học làm giảm xác suất là nam, cho thấy nữ sinh có xu hướng học nhiều hơn nam sinh. Hệ số có ý nghĩa thống kê rất cao.

Walc (mức độ uống rượu cuối tuần): Hệ số = 0.3913, p = 1.44e-05

→ Mỗi mức tăng trong mức độ uống rượu làm tăng xác suất là nam, cho thấy nam sinh có xu hướng uống rượu vào cuối tuần nhiều hơn. Hệ số có ý nghĩa thống kê rất cao.

Đánh giá độ phù hợp của mô hình

Giảm deviance từ 546.47 xuống 480.56 cho thấy mô hình có giá trị giải thích nhất định.

Giá trị AIC = 494.56 cũng chấp nhận được khi so với các mô hình tương đương.

5.2 Hồi quy Probit đa biến

probit_model <- glm(sex_bin ~ higher + studytime +  Walc,
                    data = dldt,
                    family = binomial(link = "probit"))

summary(probit_model)
## 
## Call:
## glm(formula = sex_bin ~ higher + studytime + Walc, family = binomial(link = "probit"), 
##     data = dldt)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  0.30842    0.23692   1.302   0.1930    
## higheryes   -0.30573    0.13554  -2.256   0.0241 *  
## studytime   -0.38665    0.08638  -4.476 7.59e-06 ***
## Walc         0.23884    0.05421   4.406 1.05e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 546.47  on 394  degrees of freedom
## Residual deviance: 485.20  on 391  degrees of freedom
## AIC: 493.2
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy Probit được ước lượng như sau:

\[ \Phi^{-1}(\hat{\pi}) = 0.3084 - 0.3057 \cdot \text{higher} - 0.3867 \cdot \text{studytime} + 0.2388 \cdot \text{Walc} \]

Trong đó:

  • \(\Phi^{-1}(\hat{\pi})\): là hàm nghịch đảo của phân phối chuẩn tích lũy (inverse CDF – chuẩn hóa), đại diện cho xác suất để học sinh là nam.

  • higher: Có định hướng học đại học (yes = 1)

  • studytime: Thời gian học mỗi tuần (tính theo mức)

  • Walc: Mức độ uống rượu vào cuối tuần (càng cao càng uống nhiều)

  • Giới tính học sinh có mối liên hệ thống kê đáng kể với một số yếu tố học tập và hành vi cá nhân:

Mô hình hồi quy Probit:

Học sinh có định hướng học đại học có xác suất là nam thấp hơn (hệ số = -0.3057, p = 0.0241)

Thời gian học nhiều hơn làm giảm xác suất là nam (hệ số = -0.3867, p < 0.001)

Mức độ uống rượu vào cuối tuần cao hơn làm tăng xác suất là nam (hệ số = 0.2388, p < 0.001)

5.3 Hồi quy Multiple

5.3.1. Khái niệm

Hồi quy logistic đa thức là một mở rộng của hồi quy logistic nhị phân, được sử dụng khi biến phụ thuộc là biến phân loại với từ 3 mức trở lênkhông có thứ tự rõ ràng.

Giả sử biến phụ thuộc \(Y \in \{1, 2, ..., K\}\), và \(X = (X_1, X_2, ..., X_p)\) là tập hợp các biến độc lập. Khi chọn nhóm \(Y = 1\) làm nhóm tham chiếu, mô hình hồi quy được viết như sau:

\[ \log\left(\frac{P(Y = k \mid X)}{P(Y = 1 \mid X)}\right) = \beta_{0k} + \beta_{1k} X_1 + \beta_{2k} X_2 + \dots + \beta_{pk} X_p \quad \text{với } k = 2, ..., K \]

5.3.2. Ước lượng

Các tham số \(\beta\) được ước lượng bằng phương pháp Maximum Likelihood Estimation (MLE).

Hàm mất mát là:

\[ \ell(\beta) = \sum_{i=1}^{n} \sum_{k=1}^{K} y_{ik} \log(P(Y_i = k \mid X_i)) \]

Mỗi hệ số \(\beta_{jk}\) đại diện cho sự thay đổi log-odds giữa nhóm \(Y = k\) và nhóm tham chiếu \(Y = 1\), khi biến \(X_j\) tăng 1 đơn vị, giữ các biến khác không đổi.

Ví dụ: - Nếu \(\beta_{jk} > 0\): khi \(X_j\) tăng, khả năng \(Y = k\) xảy ra cao hơn so với \(Y = 1\) - Nếu \(\beta_{jk} < 0\): khả năng xảy ra \(Y = k\) thấp hơn so với \(Y = 1\)

5.3.3. Tính xác suất cho từng nhóm

\[ P(Y = k \mid X) = \frac{\exp(\eta_k)}{1 + \sum_{l=2}^{K} \exp(\eta_l)} \quad \text{với } \eta_k = \beta_{0k} + \sum_{j=1}^{p} \beta_{jk} X_j \]

\[ P(Y = 1 \mid X) = \frac{1}{1 + \sum_{l=2}^{K} \exp(\eta_l)} \]

5.3.4. Ưu và nhược điểm

Ứng dụng

  • Dự đoán loại khách hàng (thường, VIP, vãng lai)
  • Dự đoán lựa chọn phương tiện (xe máy, xe bus, ô tô)
  • Phân loại giới tính hoặc nhóm dân cư khi có nhiều hơn 2 lựa chọn
Ưu điểm Nhược điểm
Phù hợp với biến phụ thuộc nhiều mức Khó diễn giải trực quan nếu nhiều nhóm
Không yêu cầu thứ tự trong các nhóm Có thể quá khớp nếu quá nhiều biến
Mở rộng hợp lý từ logistic nhị phân Không mô hình hóa thứ tự giữa các mức

5.3.5. So sánh với hồi quy logistic nhị phân

Tiêu chí Logistic nhị phân Logistic đa thức
Số mức của biến phụ thuộc 2 ≥ 3
Số phương trình hồi quy 1 \(K - 1\)
Hàm liên kết logit log odds so với nhóm tham chiếu
Diễn giải đơn giản phức tạp hơn, nhiều log-odds
LS0tDQp0aXRsZTogIk5oaeG7h20gVuG7pSINCmF1dGhvcjogIk5n4buNYyBUcsOibSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogJzQnDQogIHBkZl9kb2N1bWVudDoNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxzdHlsZT4NCmJvZHkgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIHNhbnMtc2VyaWY7DQogIGZvbnQtc2l6ZTogMTZweDsNCiAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgbGluZS1oZWlnaHQ6IDEuNTsNCn0NCmgyIHsNCiAgY29sb3I6IG9yYW5nZTsNCn0NCmgzIHsNCiAgY29sb3I6IHJlZDsNCn0NCjwvc3R5bGU+DQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCg0KIyAqKlBo4bqnbiAxLiBUw4xNIEhJ4buCVSBWw4AgQ0hV4bqoTiBC4buKIEThu64gTEnhu4ZVKioNCg0KIyMgKioxLiDEkOG7jWMgZmlsZSBk4buvIGxp4buHdSoqDQoNCmBgYHtyLCBlY2hvPVRSVUV9DQpkIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9QQy9PbmVEcml2ZS9Nw6F5IHTDrW5oL05WNi5jc3YiLCBoZWFkZXIgPSBUKQ0KDQpgYGANCg0KQuG7mSBk4buvIGxp4buHdSBiYW8gZ+G7k20gaOG7kyBzxqEgaOG7jWMgdOG6rXAgY+G7p2EgaOG7jWMgc2luaCB04burIGhhaSBtw7RuIGjhu41jIHRydW5nIGjhu41jOiAqKipUb8OhbiBo4buNYyAoc3R1ZGVudC1tYXQuY3N2KSoqKiB2w6AgTmfDtG4gbmfhu68gQuG7kyDEkMOgbyBOaGEgKHN0dWRlbnQtcG9yLmNzdiksIMSRxrDhu6NjIHRodSB0aOG6rXAgdOG7qyBoYWkgdHLGsOG7nW5nIGjhu41jIHThuqFpIELhu5MgxJDDoG8gTmhhLiBN4buXaSBi4buZIGfhu5NtIDMyIHRodeG7mWMgdMOtbmgsIHBo4bqjbiDDoW5oIHRow7RuZyB0aW4gduG7gSBuaMOibiBraOG6qXUgaOG7jWMsIGLhu5FpIGPhuqNuaCBnaWEgxJHDrG5oLCBo4buXIHRy4bujIGjhu41jIHThuq1wLCBob+G6oXQgxJHhu5luZyBjw6EgbmjDom4gdsOgIHRow6BuaCB0w61jaCBo4buNYyB04bqtcCAoRzEsIEcyLCBHMykuIEPDsyAzODIgaOG7jWMgc2luaCBo4buNYyBj4bqjIGhhaSBtw7RuLCBjw7MgdGjhu4MgeMOhYyDEkeG7i25oIGLhurFuZyBjw6FjaCBraOG7m3AgY8OhYyDEkeG6t2MgxJFp4buDbSBjw6EgbmjDom4gdHJvbmcgaGFpIGLhu5kgZOG7ryBsaeG7h3UuDQoNCioqKkPDoWMgbmjDs20gdGh14buZYyB0w61uaCBjaMOtbmg6KioqDQoNCk5ow6JuIGto4bqpdSBo4buNYzogdHLGsOG7nW5nIGjhu41jLCBnaeG7m2kgdMOtbmgsIHR14buVaSwgxJHhu4thIGNo4buJIGPGsCB0csO6LCBxdXkgbcO0IGdpYSDEkcOsbmgsIHTDrG5oIHRy4bqhbmcgc+G7kW5nIGNodW5nIGPhu6dhIGNoYSBt4bq5Lg0KDQpC4buRaSBj4bqjbmggY2hhIG3hurk6IHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiwgbmdo4buBIG5naGnhu4dwLg0KDQpI4buXIHRy4bujIGjhu41jIHThuq1wOiBo4buXIHRy4bujIGdpw6FvIGThu6VjLCBs4bubcCBo4buNYyBwaOG7pSDEkeG6oW8sIGjhu5cgdHLhu6MgdOG7qyBnaWEgxJHDrG5oLg0KDQpIb+G6oXQgxJHhu5luZyBjw6EgbmjDom46IHRoYW0gZ2lhIG5nb+G6oWkga2jDs2EsIHPhu60gZOG7pW5nIEludGVybmV0LCBxdWFuIGjhu4cgecOqdSDEkcawxqFuZy4NCg0KVGjDs2kgcXVlbiB2w6AgeMOjIGjhu5lpOiB0aOG7nWkgZ2lhbiBo4buNYywgdGjhu51pIGdpYW4gxJFpIGzhuqFpLCBxdWFuIGjhu4cgZ2lhIMSRw6xuaCwgdGjhu51pIGdpYW4gcuG6o25oLCBt4bupYyDEkeG7mSB0acOqdSB0aOG7pSByxrDhu6N1Lg0KDQpUaMOgbmggdMOtY2ggaOG7jWMgdOG6rXA6IMSRaeG7g20gc+G7kSAzIGvhu7MgKEcxLCBHMiwgRzMpLCBz4buRIGzhuqduIG5naOG7iSBo4buNYywgc+G7kSBs4bqnbiB0csaw4bujdCBs4bubcCB0csaw4bubYy4NCg0KKioq4buobmcgZOG7pW5nIHRp4buBbSBuxINuZzoqKioNCg0KROG7sSDEkW/DoW4gxJFp4buDbSBjdeG7kWkgKEczKSBk4buxYSB0csOqbiBjw6FjIHnhur91IHThu5EgY8OhIG5ow6JuIHbDoCB4w6MgaOG7mWkuDQoNClBow6JuIHTDrWNoIOG6o25oIGjGsOG7n25nIGPhu6dhIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiB2w6Agbmdo4buBIG5naGnhu4dwIHBo4bulIGh1eW5oIMSR4bq/biB0aMOgbmggdMOtY2ggaOG7jWMgc2luaC4NCg0KS2jDoW0gcGjDoSBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0aMOzaSBxdWVuIGjhu41jIHThuq1wLCB0acOqdSB0aOG7pSByxrDhu6N1IHbDoCBr4bq/dCBxdeG6oyBo4buNYyB04bqtcC4NCg0KxJDDoW5oIGdpw6EgaGnhu4d1IHF14bqjIGPhu6dhIGPDoWMgY2jGsMahbmcgdHLDrG5oIGjhu5cgdHLhu6MgZ2nDoW8gZOG7pWMgdsOgIGhv4bqhdCDEkeG7mW5nIG5nb+G6oWkga2jDs2EuDQoNCg0KIyMgKioyLiBD4bqldSB0csO6YyBi4buZIGThu68gbGnhu4d1KioNCg0KQuG7mSBk4buvIGxp4buHdSAqKlRo4buxYyBow6BuaCoqIGNo4bupYSB04buVbmcgY+G7mW5nICoqMzk1IGLhuqNuIGdoaSoqIHbhu5tpICoqMzMgYmnhur9uKiogxJHhurdjIHRyxrBuZy4NCg0KYGBge3J9DQpzdHIoZCkNCmBgYA0KDQpDw6FjIGJp4bq/biB0cm9uZyBi4buZIGThu68gbGnhu4d1IGJhbyBn4buTbToNCg0KLSAqKipzY2hvb2wqKio6IG3DoyB0csaw4budbmcgaOG7jWMgbcOgIGjhu41jIHNpbmggxJFhbmcgdGhlbyBo4buNYywgZOG6oW5nIGNodeG7l2kga8O9IHThu7EgKCJHUCIgaG/hurdjICJNUyIpLg0KDQotICoqKnNleCoqKjogZ2nhu5tpIHTDrW5oIGjhu41jIHNpbmgsIGThuqFuZyBrw70gdOG7sSAoIkYiIGNobyBu4buvLCAiTSIgY2hvIG5hbSkuDQoNCi0gKioqYWdlKioqOiB0deG7lWkgY+G7p2EgaOG7jWMgc2luaCwga2nhu4N1IHPhu5Egbmd1ecOqbi4NCg0KLSAqKiphZGRyZXNzKioqOiBsb+G6oWkgxJHhu4thIGNo4buJIGPGsCB0csO6ICgiVSIgY2hvIGtodSDEkcO0IHRo4buLLCAiUiIgY2hvIG7DtG5nIHRow7RuKSwgZOG6oW5nIGvDvSB04buxLg0KDQotICoqKmZhbXNpemUqKio6IHF1eSBtw7QgZ2lhIMSRw6xuaCAoIkxFMyIgbuG6v3Ug4omkIDMgbmfGsOG7nWksICJHVDMiIG7hur91ID4gMyBuZ8aw4budaSksIGThuqFuZyBrw70gdOG7sS4NCg0KLSAqKipQc3RhdHVzKioqOiB0w6xuaCB0cuG6oW5nIHPhu5FuZyBjaHVuZyBj4bunYSBjaGEgbeG6uSAoIlQiOiBz4buRbmcgY8O5bmcgbmhhdSwgIkEiOiBz4buRbmcgcmnDqm5nKSwga2nhu4N1IGvDvSB04buxLg0KDQotICoqKk1lZHUqKio6IHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBt4bq5LCBraeG7g3Ugc+G7kSBuZ3V5w6puICh04burIDA6IGtow7RuZyBo4buNYyDEkeG6v24gNDogxJHhuqFpIGjhu41jKS4NCg0KLSAqKipGZWR1KioqOiB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2EgY2hhLCBraeG7g3Ugc+G7kSBuZ3V5w6puICh0xrDGoW5nIHThu7EgTWVkdSkuDQoNCi0gKioqTWpvYioqKjogbmdo4buBIG5naGnhu4dwIGPhu6dhIG3hurksIGThuqFuZyBrw70gdOG7sSAoInRlYWNoZXIiLCAiaGVhbHRoIiwgInNlcnZpY2VzIiwgImF0X2hvbWUiLCAib3RoZXIiKS4NCg0KLSAqKipGam9iKioqOiBuZ2jhu4EgbmdoaeG7h3AgY+G7p2EgY2hhLCBk4bqhbmcga8O9IHThu7EgKG5oxrAgTWpvYikuDQoNCi0gKioqcmVhc29uKioqOiBsw70gZG8gY2jhu41uIHRyxrDhu51uZywga2nhu4N1IGvDvSB04buxICgiaG9tZSIsICJyZXB1dGF0aW9uIiwgImNvdXJzZSIsICJvdGhlciIpLg0KDQotICoqKmd1YXJkaWFuKioqOiBuZ8aw4budaSBnacOhbSBo4buZIGNow61uaCBj4bunYSBo4buNYyBzaW5oICgibW90aGVyIiwgImZhdGhlciIsICJvdGhlciIpLCBk4bqhbmcga8O9IHThu7EuDQoNCi0gKioqdHJhdmVsdGltZSoqKjogdGjhu51pIGdpYW4gxJFpIMSR4bq/biB0csaw4budbmcgKDE6IDwxNSBwaMO6dCwgMjogMTXigJMzMCBwaMO6dCwgMzogMzAgcGjDunTigJMxIGdp4budLCA0OiA+MSBnaeG7nSksIGtp4buDdSBz4buRIG5ndXnDqm4uDQoNCi0gKioqc3R1ZHl0aW1lKioqOiB0aOG7nWkgZ2lhbiBo4buNYyBt4buXaSB0deG6p24gKDE6IDwyaCwgMjogMuKAkzVoLCAzOiA14oCTMTBoLCA0OiA+MTBoKSwga2nhu4N1IHPhu5Egbmd1ecOqbi4NCg0KLSAqKipmYWlsdXJlcyoqKjogc+G7kSBs4bqnbiBo4buNYyBs4bqhaSBs4bubcCB0csaw4bubYyDEkcOzLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKnNjaG9vbHN1cCoqKjogY8OzIG5o4bqtbiBo4buXIHRy4bujIGjhu41jIHThuq1wIHThuqFpIHRyxrDhu51uZyBraMO0bmcgKCJ5ZXMiIGhv4bq3YyAibm8iKSwgZOG6oW5nIGvDvSB04buxLg0KDQotICoqKmZhbXN1cCoqKjogY8OzIMSRxrDhu6NjIGdpYSDEkcOsbmggaOG7lyB0cuG7oyBo4buNYyB04bqtcCBraMO0bmcgKCJ5ZXMiIGhv4bq3YyAibm8iKSwgZOG6oW5nIGvDvSB04buxLg0KDQotICoqKnBhaWQqKio6IGPDsyBo4buNYyB0aMOqbSBjw7MgdHLhuqMgcGjDrSBraMO0bmcgKCJ5ZXMiIGhv4bq3YyAibm8iKSwga2nhu4N1IGvDvSB04buxLg0KDQotICoqKmFjdGl2aXRpZXMqKio6IGPDsyB0aGFtIGdpYSBob+G6oXQgxJHhu5luZyBuZ2/huqFpIGtow7NhIGtow7RuZyAoInllcyIgaG/hurdjICJubyIpLCBraeG7g3Uga8O9IHThu7EuDQoNCi0gKioqbnVyc2VyeSoqKjogY8OzIHThu6tuZyBo4buNYyBt4bqrdSBnacOhbyBraMO0bmcgKCJ5ZXMiIGhv4bq3YyAibm8iKSwga2nhu4N1IGvDvSB04buxLg0KDQotICoqKmhpZ2hlcioqKjogbW9uZyBtdeG7kW4gaOG7jWMgbMOqbiBjYW8gxJHhurNuZy/EkeG6oWkgaOG7jWMgKCJ5ZXMiIGhv4bq3YyAibm8iKSwga2nhu4N1IGvDvSB04buxLg0KDQotICoqKmludGVybmV0KioqOiBjw7MgSW50ZXJuZXQg4bufIG5ow6Aga2jDtG5nICgieWVzIiBob+G6t2MgIm5vIiksIGtp4buDdSBrw70gdOG7sS4NCg0KLSAqKipyb21hbnRpYyoqKjogxJFhbmcgdHJvbmcgbeG7kWkgcXVhbiBo4buHIHnDqnUgxJHGsMahbmcgaGF5IGtow7RuZyAoInllcyIgaG/hurdjICJubyIpLCBraeG7g3Uga8O9IHThu7EuDQoNCi0gKioqZmFtcmVsKioqOiBt4bupYyDEkeG7mSBxdWFuIGjhu4cgdHJvbmcgZ2lhIMSRw6xuaCAoMTogcuG6pXQgeOG6pXUg4oCTIDU6IHLhuqV0IHThu5F0KSwga2nhu4N1IHPhu5Egbmd1ecOqbi4NCg0KLSAqKipmcmVldGltZSoqKjogdGjhu51pIGdpYW4gcuG6o25oIHLhu5dpIHNhdSBnaeG7nSBo4buNYyAoMTogcuG6pXQgw610IOKAkyA1OiBy4bqldCBuaGnhu4F1KSwga2nhu4N1IHPhu5Egbmd1ecOqbi4NCg0KLSAqKipnb291dCoqKjogbeG7qWMgxJHhu5kgxJFpIGNoxqFpIHbhu5tpIGLhuqFuIGLDqCAoMTogcuG6pXQgw610IOKAkyA1OiBy4bqldCB0aMaw4budbmcgeHV5w6puKSwga2nhu4N1IHPhu5Egbmd1ecOqbi4NCg0KLSAqKipEYWxjKioqOiBt4bupYyDEkeG7mSB0acOqdSB0aOG7pSByxrDhu6N1IHRyb25nIG5nw6B5IHRoxrDhu51uZyAoMTogcuG6pXQgdGjhuqVwIOKAkyA1OiBy4bqldCBjYW8pLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKldhbGMqKio6IG3hu6ljIMSR4buZIHRpw6p1IHRo4bulIHLGsOG7o3UgY3Xhu5FpIHR14bqnbiAoMTogcuG6pXQgdGjhuqVwIOKAkyA1OiBy4bqldCBjYW8pLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKmhlYWx0aCoqKjogdMOsbmggdHLhuqFuZyBz4bupYyBraOG7j2UgaGnhu4duIHThuqFpICgxOiBy4bqldCBrw6ltIOKAkyA1OiBy4bqldCB04buRdCksIGtp4buDdSBz4buRIG5ndXnDqm4uDQoNCi0gKioqYWJzZW5jZXMqKio6IHPhu5EgbmfDoHkgbmdo4buJIGjhu41jLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKkcxKioqOiDEkWnhu4NtIGtp4buDbSB0cmEga+G7syAxLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKkcyKioqOiDEkWnhu4NtIGtp4buDbSB0cmEga+G7syAyLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKkczKioqOiDEkWnhu4NtIGN14buRaSBraMOzYSBo4buNYywga2nhu4N1IHPhu5Egbmd1ecOqbi4NCg0KIyMgKiozLiBDaOG7jW4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQoNCmBgYHtyfQ0KZGxkdCA8LSBjKCJzY2hvb2wiLCAic2V4IiwgImFkZHJlc3MiLCAiZmFtc2l6ZSIsICJQc3RhdHVzIiwgIk1qb2IiLCAiRmpvYiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhc29uIiwgImd1YXJkaWFuIiwgInNjaG9vbHN1cCIsICJmYW1zdXAiLCAicGFpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aXZpdGllcyIsICJudXJzZXJ5IiwgImhpZ2hlciIsICJpbnRlcm5ldCIsICJyb21hbnRpYyIpDQpkdCA8LSBkWyAsIGRsZHRdDQphbnkoaXMubmEoZHQpKQ0KYGBgDQoNCg0KIyMgKio0LiBLaeG7g20gdHJhIGtp4buDdSBk4buvIGxp4buHdSB2w6AgxJHhu5VpIHbhu4EgZmFjdG9yKioNCg0KYGBge3J9DQojIEtp4buDbSB0cmEga2nhu4N1IGThu68gbGnhu4d1IGPhu6dhIHThu6tuZyBiaeG6v24gdHJvbmcgZGxkdA0Kc2FwcGx5KGR0LCBjbGFzcykgDQpgYGANCg0KDQpgYGB7ciwgZWNobz1UUlVFfQ0KZHQgPC0gZGF0YS5mcmFtZShsYXBwbHkoZHQsIGFzLmZhY3RvcikpDQpgYGANCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCg0KIyAqKlBo4bqnbiAyLiBQSMOCTiBUw41DSCBN4buQSSBRVUFOIEjhu4YgR0nhu65BIEhBSSBCSeG6vk4gxJDhu4pOSCBUw41OSCoqDQoNCiMjICoqMi4xLiBTRVggdsOgIFBBSUQqKg0KDQojIyMgKioyLjEuMS4gQuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCAqKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCg0KYGBge3J9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNow6lvIGdp4buvYSBTRVggdsOgIFBBSUQNClNQIDwtIHRhYmxlKGR0JHNleCwgZHQkcGFpZCkNCiMgVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCB04buVbmcgY+G7mXQNClNQMSA8LSBhZGRtYXJnaW5zKFNQKQ0KU1AxDQpgYGANCg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHN14bqldCB0aGVvIGjDoG5nIChzdiBjw7Mgdmnhu4djIGzDoG0pDQpTUF9wcm9wIDwtIHByb3AudGFibGUoU1AsIG1hcmdpbiA9IDEpDQojIEhp4buDbiB0aOG7iyBi4bqjbmcgdOG6p24gc3XhuqV0DQpTUF9wcm9wDQpgYGANCg0KDQoqKkJp4buDdSDEkeG7kyoqDQpgYGB7cn0NCiMgQ2h1eeG7g24gYuG6o25nIHNhbmcgZOG6oW5nIGRhdGEgZnJhbWUNClNQX2RmIDwtIGFzLmRhdGEuZnJhbWUoU1ApDQoNCiMgxJDhu5VpIHTDqm4gY+G7mXQgY2hvIHLDtSByw6BuZw0KY29sbmFtZXMoU1BfZGYpIDwtIGMoIlNFWCIsICJISUdIRVIiLCAiQ291bnQiKQ0KDQpsaWJyYXJ5KCJnZ3Bsb3QyIikNCg0KDQpnZ3Bsb3QoU1BfZGYsIGFlcyh4ID0gYEhJR0hFUmAsIHkgPSBDb3VudCwgZmlsbCA9IGBTRVhgKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjMsIHNpemUgPSAzLjUpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgMS4gIiwNCiAgICB4ID0gIlBhaWQiLA0KICAgIHkgPSAiR2nhu5tpIHTDrW5oIiwNCiAgICBmaWxsID0gIkzDoG0gdGjDqm0iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhc3RlbDEiKQ0KYGBgDQoNCg0KDQoNCiMjIyAqKjIuMS4yIEtp4buDbSDEkeG7i25oIFRo4buRbmcga8OqKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICoqSOKCgCoqOiBWaeG7h2MgaOG7jWMgdGjDqm0gdsOgIGdp4bubaSB0w61uaCBsw6AgaGFpIGJp4bq/biDEkeG7mWMgbOG6rXAuDQoNCi0gKipI4oKBKio6IFZp4buHYyBo4buNYyB0aMOqbSB2w6AgZ2nhu5tpIHTDrW5oIGPDsyBsacOqbiBxdWFuIHbhu5tpIG5oYXUuDQoNCg0KYGBge3J9DQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nDQpjaGlTUF9zY29yZSA8LSBjaGlzcS50ZXN0KFNQKQ0KcHJpbnQoY2hpU1Bfc2NvcmUpDQpgYGANCg0KIyMjICoqMi4xLjMgIEhp4buHdSB04bu3IGzhu4cgKFJpc2sgRGlmZmVyZW5jZSAtIFJEKSoqDQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBnaeG7r2EgDQpTUF9zY29yZSA8LSB0YWJsZShkdCRzZXgsIGR0JHBhaWQpDQoNCiMgVGjDqm0gdOG7lW5nIGjDoG5nIHbDoCB04buVbmcgY+G7mXQNCnNwMSA8LSBhZGRtYXJnaW5zKFNQX3Njb3JlKQ0Kc3AxDQpgYGANCg0KDQoNCmBgYHtyfQ0KIyBT4buRIHNpbmggdmnDqm4gY8OzIHZp4buHYyBsw6BtIGPDsyDEkWnhu4NtIHPhu5EgY2FvIGhv4bq3YyB0aOG6pXANCg0KY291bnRzIDwtIGMoU1Bfc2NvcmVbIkYiLCAieWVzIl0sIFNQX3Njb3JlWyJGIiwgIm5vIl0pDQoNCiMgVOG7lW5nIHPhu5Egc2luaCB2acOqbiB0cm9uZyB04burbmcgbmjDs20gxJFp4buDbSANCnRvdGFscyA8LSBjKHN1bShTUF9zY29yZVssICJ5ZXMiXSksIHN1bShTUF9zY29yZVssICJubyJdKSkNCg0KIyBLaeG7g20gxJHhu4tuaCB04buJIGzhu4cgbeG7mXQgcGjDrWE6IHAxIDwgcDINCnRlc3RfcmVjb3ZlcnlfbGVzcyA8LSBwcm9wLnRlc3QoY291bnRzLCB0b3RhbHMsIGFsdGVybmF0aXZlID0gImxlc3MiLCBjb3JyZWN0ID0gRkFMU0UpDQp0ZXN0X3JlY292ZXJ5X2xlc3MNCmBgYA0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaSBiw6xuaCBwaMawxqFuZzogWMKyID0gNi41ODYNCg0KLSBC4bqtYyB04buxIGRvIChkZikgPSAxDQoNCi0gcC12YWx1ZSA9ICAwLjk5NDkNCg0KVuG7m2kgcC12YWx1ZSA9ICAwLjk5NDkgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgcGjhu5UgYmnhur9uIM6xID0gMC4wNSwga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AsIHRyb25nIGThu68gbGnhu4d1IGhp4buHbiB04bqhaSwga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4bubaSB0w61uaCBtdeG7kW4gaOG7jWMgdGjDqm0gaGF5IGtow7RuZy4NCg0KDQojIyMgKioyLjEuNC4gUmVsYXRpdmUgUmlzayAtIFJSOioqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJpc2tyYXRpbyhTUF9zY29yZSwgbWV0aG9kPSAid2FsZCIpDQpgYGANCg0KVOG7tyBs4buHIGjhu41jIHNpbmggbuG7ryB0cm9uZyBuaMOzbSDEkWkgaOG7jWMgdGjDqm0gYuG6sW5nICg3OC8xODcpLygxMDgvMjA4KSB0aOG6pXAgaMahbiBraG/huqNuZyAyNSUgc28gduG7m2kgdOG7tyBs4buHIGhzIG5hbSANCg0KKioqxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgOioqKg0KDQpU4bu3IGzhu4cgaOG7jWMgdGjDqm0gY+G7p2EgaOG7jWMgc2luaCBuYW0gdGjhuqVwIGjGoW4ga2hv4bqjbmcgMjUlIHNvIHbhu5tpIGjhu41jIHNpbmggbuG7ry4gTsOzaSBjw6FjaCBraMOhYywgaOG7jWMgc2luaCBu4buvIGPDsyBraOG6oyBuxINuZyBo4buNYyB0aMOqbSBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuYW0uDQoNCioqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqOioqKg0KDQpSaXNrIFJhdGlvID0gMC43NTIsIGtob+G6o25nIHRpbiBj4bqteSA5NSU6IFswLjYwMjsgMC45MzhdDQoNClAtdmFsdWUgPSAwLjAxMDMsIENoaS1zcXVhcmUgPCAwLjA1DQoNCg0KIyMgKioyLjEuNS4gT2RkcyBSYXRpbyAtIE9SOioqDQoNCmBgYHtyfQ0KT1JfcmVzdWx0MSA8LSBvZGRzcmF0aW8oU1Bfc2NvcmUpDQpwcmludChPUl9yZXN1bHQxKQ0KYGBgDQoNClThu7cgbOG7hyBuaMOzbSBo4buNYyBzaW5oIG5hbSDEkWkgaOG7jWMgdGjDqm0geOG6pXAgeOG7iSBraG/huqNuZyA1OS40JSBzbyB24bubaSB04bu3IGzhu4cgY+G7p2EgbmjDs20gaOG7jWMgc2luaCBu4buvLCB0aGVvIMaw4bubYyBsxrDhu6NuZyBvZGRzIHJhdGlvIGzDoCAwLjU5NA0KDQoNCiMgKipQSOG6pk4gNC4gUEjGr8agTkcgUEjDgVAgxq/hu5pDIEzGr+G7ok5HIE1BWElNVU0gTElLRUhPT0QqKg0KDQpgYGB7cn0NCmRsZHQgPC0gcmVhZC5jc3YoZmlsZS5jaG9vc2UoKSwgZmlsZUVuY29kaW5nID0gIlVURi04LUJPTSIpDQpgYGANCg0KDQpgYGB7cn0NCmlzLmRhdGEuZnJhbWUoZGxkdCkgICMgUGjhuqNpIGzDoCBUUlVFDQoNCmBgYA0KDQoNCmBgYHtyfQ0KIyBDaHV54buDbiBzZXggduG7gSBk4bqhbmcgZmFjdG9yOiBGID0gMCwgTSA9IDENCmRsZHQkc2V4IDwtIGZhY3RvcihkbGR0JHNleCwgbGV2ZWxzID0gYygiRiIsICJNIikpDQoNCiMgQ2h1eeG7g24gaGlnaGVyIHbhu4EgZOG6oW5nIGZhY3Rvcjogbm8gPSAwLCB5ZXMgPSAxDQpkbGR0JGhpZ2hlciA8LSBmYWN0b3IoZGxkdCRwYWlkLCBsZXZlbHMgPSBjKCJubyIsICJ5ZXMiKSkNCg0KbWxfbW9kZWwgPC0gZ2xtKHNleCB+IHBhaWQsIGRhdGEgPSBkbGR0LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpDQpzdW1tYXJ5KG1sX21vZGVsKQ0KDQpgYGANCg0KSOG7jWMgc2luaCBjw7MgaOG7jWMgdGjDqm0gY8OzIGto4bqjIG7Eg25nIGzDoCBu4buvIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGjhu41jIHNpbmgga2jDtG5nIGjhu41jIHRow6ptLiBPZGRzIMSR4buDIGzDoCBuYW0g4bufIG5ow7NtIGjhu41jIHRow6ptIHRo4bqlcCBoxqFuIDQwLjclIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBo4buNYyB0aMOqbSwgdsOgIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiAocCA9IDAuMDEwNSkuDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KZGxkdCRwcmVkaWN0ZWRfcHJvYiA8LSBwcmVkaWN0KG1sX21vZGVsLCB0eXBlID0gInJlc3BvbnNlIikNCg0KZ2dwbG90KGRsZHQsIGFlcyh4ID0gcGFpZCwgeSA9IHByZWRpY3RlZF9wcm9iKSkgKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJiYXIiLCBmaWxsID0gInNreWJsdWUiKSArDQogIGxhYnMoeSA9ICJYw6FjIHN14bqldCBsw6AgbmFtIiwgeCA9ICJQYWlkIChjw7MgaOG7jWMgdGjDqm0pIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCg0KIyAqKlBo4bqnbiA1LiBQSMOCTiBUw41DSCDEkEEgQknhur5OOiBI4buSSSBRVVkgTE9HSVNUSUMgVsOAIFBST0JJVCoqDQoNCg0KIyMgKioqNS4xIEjhu5NpIHF1eSBMb2dpc3RpYyDEkWEgYmnhur9uKioqDQoNCmBgYHtyfQ0KZGxkdCRzZXhfYmluIDwtIGlmZWxzZShkbGR0JHNleCA9PSAiTSIsIDEsIDApDQoNCmxpYnJhcnkoZHBseXIpDQoNCmxvZ2l0X21vZGVsIDwtIGdsbShzZXhfYmluIH4gaGlnaGVyICsgc3R1ZHl0aW1lICsgIFdhbGMsDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IGRsZHQsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0KDQpzdW1tYXJ5KGxvZ2l0X21vZGVsKQ0KDQpgYGANCg0KUGjGsMahbmcgdHLDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgbmjGsCBzYXU6DQoNClxbDQpcbG9nXGxlZnQoXGZyYWN7XGhhdHtccGl9fXsxIC0gXGhhdHtccGl9fVxyaWdodCkgPSAwLjUzNjggLSAwLjQ4NTggXGNkb3QgXHRleHR7aGlnaGVyfSAtIDAuNjU2MCBcY2RvdCBcdGV4dHtzdHVkeXRpbWV9ICsgMC4zOTEzIFxjZG90IFx0ZXh0e1dhbGN9DQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIFwoXGhhdHtccGl9XCk6IHjDoWMgc3XhuqV0IMSR4buDIG3hu5l0IGjhu41jIHNpbmggbMOgICoqbmFtKiogIA0KLSBgaGlnaGVyYDogYmnhur9uIG5o4buLIHBow6JuICgxID0gY8OzIMSR4buLbmggaMaw4bubbmcgaOG7jWMgxJHhuqFpIGjhu41jKSAgDQotIGBzdHVkeXRpbWVgOiB0aOG7nWkgZ2lhbiBo4buNYyBt4buXaSB0deG6p24gIA0KLSBgV2FsY2A6IG3hu6ljIMSR4buZIHXhu5FuZyByxrDhu6N1IHbDoG8gY3Xhu5FpIHR14bqnbg0KIA0KKEludGVyY2VwdCkgPSAwLjUzNjgsIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIChwID0gMC4xNjY3KSwgYmnhu4N1IHRo4buLIGxvZy1vZGRzIMSR4buDIGzDoCBuYW0ga2hpIGjhu41jIHNpbmgga2jDtG5nIGPDsyDEkeG7i25oIGjGsOG7m25nIGjhu41jIMSR4bqhaSBo4buNYywgaOG7jWMgw610IHbDoCBraMO0bmcgdeG7kW5nIHLGsOG7o3UuDQoNCmhpZ2hlciAoeWVzKTogSOG7hyBz4buRID0gLTAuNDg1OCwgcCA9IDAuMDI5OQ0KDQrihpIgSOG7jWMgc2luaCBjw7MgxJHhu4tuaCBoxrDhu5tuZyBo4buNYyDEkeG6oWkgaOG7jWMgY8OzIGto4bqjIG7Eg25nIGzDoCBu4buvIGNhbyBoxqFuLCB2w6AgbeG7kWkgcXVhbiBo4buHIG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgNSUuDQoNCnN0dWR5dGltZTogSOG7hyBz4buRID0gLTAuNjU2MCwgcCA9IDcuMDRlLTA2DQoNCuKGkiBN4buXaSBt4bupYyB0xINuZyB0cm9uZyB0aOG7nWkgZ2lhbiBo4buNYyBsw6BtIGdp4bqjbSB4w6FjIHN14bqldCBsw6AgbmFtLCBjaG8gdGjhuqV5IG7hu68gc2luaCBjw7MgeHUgaMaw4bubbmcgaOG7jWMgbmhp4buBdSBoxqFuIG5hbSBzaW5oLiBI4buHIHPhu5EgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8uDQoNCldhbGMgKG3hu6ljIMSR4buZIHXhu5FuZyByxrDhu6N1IGN14buRaSB0deG6p24pOiBI4buHIHPhu5EgPSAwLjM5MTMsIHAgPSAxLjQ0ZS0wNQ0KDQrihpIgTeG7l2kgbeG7qWMgdMSDbmcgdHJvbmcgbeG7qWMgxJHhu5kgdeG7kW5nIHLGsOG7o3UgbMOgbSB0xINuZyB4w6FjIHN14bqldCBsw6AgbmFtLCBjaG8gdGjhuqV5IG5hbSBzaW5oIGPDsyB4dSBoxrDhu5tuZyB14buRbmcgcsaw4bujdSB2w6BvIGN14buRaSB0deG6p24gbmhp4buBdSBoxqFuLiBI4buHIHPhu5EgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8uDQoNCg0KKioqxJDDoW5oIGdpw6EgxJHhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmgqKioNCg0KDQpHaeG6o20gZGV2aWFuY2UgdOG7qyA1NDYuNDcgeHXhu5FuZyA0ODAuNTYgY2hvIHRo4bqleSBtw7QgaMOsbmggY8OzIGdpw6EgdHLhu4sgZ2nhuqNpIHRow61jaCBuaOG6pXQgxJHhu4tuaC4NCg0KR2nDoSB0cuG7iyBBSUMgPSA0OTQuNTYgY8WpbmcgY2jhuqVwIG5o4bqtbiDEkcaw4bujYyBraGkgc28gduG7m2kgY8OhYyBtw7QgaMOsbmggdMawxqFuZyDEkcawxqFuZy4NCg0KDQoNCiMjICoqKjUuMiBI4buTaSBxdXkgUHJvYml0IMSRYSBiaeG6v24qKioNCg0KYGBge3J9DQpwcm9iaXRfbW9kZWwgPC0gZ2xtKHNleF9iaW4gfiBoaWdoZXIgKyBzdHVkeXRpbWUgKyAgV2FsYywNCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRsZHQsDQogICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQoNCnN1bW1hcnkocHJvYml0X21vZGVsKQ0KYGBgDQoNClBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgUHJvYml0IMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBuaMawIHNhdToNCg0KXFsNClxQaGleey0xfShcaGF0e1xwaX0pID0gMC4zMDg0IC0gMC4zMDU3IFxjZG90IFx0ZXh0e2hpZ2hlcn0gLSAwLjM4NjcgXGNkb3QgXHRleHR7c3R1ZHl0aW1lfSArIDAuMjM4OCBcY2RvdCBcdGV4dHtXYWxjfQ0KXF0NCg0KVHJvbmcgxJHDszoNCg0KLSBcKFxQaGleey0xfShcaGF0e1xwaX0pXCk6IGzDoCAqKmjDoG0gbmdo4buLY2ggxJHhuqNvIGPhu6dhIHBow6JuIHBo4buRaSBjaHXhuqluIHTDrWNoIGzFqXkqKiAoaW52ZXJzZSBDREYg4oCTIGNodeG6qW4gaMOzYSksIMSR4bqhaSBkaeG7h24gY2hvICoqeMOhYyBzdeG6pXQgxJHhu4MgaOG7jWMgc2luaCBsw6AgbmFtKiouDQoNCi0gYGhpZ2hlcmA6IEPDsyDEkeG7i25oIGjGsOG7m25nIGjhu41jIMSR4bqhaSBo4buNYyAoeWVzID0gMSkNCg0KLSBgc3R1ZHl0aW1lYDogVGjhu51pIGdpYW4gaOG7jWMgbeG7l2kgdHXhuqduICh0w61uaCB0aGVvIG3hu6ljKQ0KDQotIGBXYWxjYDogTeG7qWMgxJHhu5kgdeG7kW5nIHLGsOG7o3UgdsOgbyBjdeG7kWkgdHXhuqduIChjw6BuZyBjYW8gY8OgbmcgdeG7kW5nIG5oaeG7gXUpDQoNCi0gR2nhu5tpIHTDrW5oIGjhu41jIHNpbmggY8OzIG3hu5FpIGxpw6puIGjhu4cgdGjhu5FuZyBrw6ogxJHDoW5nIGvhu4MgduG7m2kgbeG7mXQgc+G7kSB54bq/dSB04buRIGjhu41jIHThuq1wIHbDoCBow6BuaCB2aSBjw6EgbmjDom46DQoNCg0KKioqTcO0IGjDrG5oIGjhu5NpIHF1eSBQcm9iaXQ6KioqDQoNCkjhu41jIHNpbmggY8OzIMSR4buLbmggaMaw4bubbmcgaOG7jWMgxJHhuqFpIGjhu41jIGPDsyB4w6FjIHN14bqldCBsw6AgbmFtIHRo4bqlcCBoxqFuICho4buHIHPhu5EgPSAtMC4zMDU3LCBwID0gMC4wMjQxKQ0KDQpUaOG7nWkgZ2lhbiBo4buNYyBuaGnhu4F1IGjGoW4gbMOgbSBnaeG6o20geMOhYyBzdeG6pXQgbMOgIG5hbSAoaOG7hyBz4buRID0gLTAuMzg2NywgcCA8IDAuMDAxKQ0KDQpN4bupYyDEkeG7mSB14buRbmcgcsaw4bujdSB2w6BvIGN14buRaSB0deG6p24gY2FvIGjGoW4gbMOgbSB0xINuZyB4w6FjIHN14bqldCBsw6AgbmFtICho4buHIHPhu5EgPSAwLjIzODgsIHAgPCAwLjAwMSkNCg0KIyMgKioqNS4zIEjhu5NpIHF1eSBNdWx0aXBsZSoqKg0KDQojIyMgKioqNS4zLjEuIEtow6FpIG5p4buHbSoqKg0KDQpI4buTaSBxdXkgbG9naXN0aWMgxJFhIHRo4bupYyBsw6AgbeG7mXQgbeG7nyBy4buZbmcgY+G7p2EgaOG7k2kgcXV5IGxvZ2lzdGljIG5o4buLIHBow6JuLCDEkcaw4bujYyBz4butIGThu6VuZyBraGkgYmnhur9uIHBo4bulIHRodeG7mWMgbMOgIGJp4bq/biBwaMOibiBsb+G6oWkgKip24bubaSB04burIDMgbeG7qWMgdHLhu58gbMOqbioqIHbDoCAqKmtow7RuZyBjw7MgdGjhu6kgdOG7sSByw7UgcsOgbmcqKi4NCg0KDQpHaeG6oyBz4butIGJp4bq/biBwaOG7pSB0aHXhu5ljIFwoIFkgXGluIFx7MSwgMiwgLi4uLCBLXH0gXCksIHbDoCBcKCBYID0gKFhfMSwgWF8yLCAuLi4sIFhfcCkgXCkgbMOgIHThuq1wIGjhu6NwIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcC4gS2hpIGNo4buNbiBuaMOzbSBcKCBZID0gMSBcKSBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSwgbcO0IGjDrG5oIGjhu5NpIHF1eSDEkcaw4bujYyB2aeG6v3QgbmjGsCBzYXU6DQoNClxbDQpcbG9nXGxlZnQoXGZyYWN7UChZID0gayBcbWlkIFgpfXtQKFkgPSAxIFxtaWQgWCl9XHJpZ2h0KSA9IFxiZXRhX3swa30gKyBcYmV0YV97MWt9IFhfMSArIFxiZXRhX3sya30gWF8yICsgXGRvdHMgKyBcYmV0YV97cGt9IFhfcCBccXVhZCBcdGV4dHt24bubaSB9IGsgPSAyLCAuLi4sIEsNClxdDQoNCiMjIyAqKio1LjMuMi4gxq/hu5tjIGzGsOG7o25nKioqDQoNCkPDoWMgdGhhbSBz4buRIFwoIFxiZXRhIFwpIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBi4bqxbmcgcGjGsMahbmcgcGjDoXAgKipNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAoTUxFKSoqLg0KDQpIw6BtIG3huqV0IG3DoXQgbMOgOg0KDQpcWw0KXGVsbChcYmV0YSkgPSBcc3VtX3tpPTF9XntufSBcc3VtX3trPTF9XntLfSB5X3tpa30gXGxvZyhQKFlfaSA9IGsgXG1pZCBYX2kpKQ0KXF0NCg0KDQpN4buXaSBo4buHIHPhu5EgXCggXGJldGFfe2prfSBcKSDEkeG6oWkgZGnhu4duIGNobyBz4buxIHRoYXkgxJHhu5VpICoqbG9nLW9kZHMqKiBnaeG7r2EgbmjDs20gXCggWSA9IGsgXCkgdsOgIG5ow7NtIHRoYW0gY2hp4bq/dSBcKCBZID0gMSBcKSwga2hpIGJp4bq/biBcKCBYX2ogXCkgdMSDbmcgMSDEkcahbiB24buLLCBnaeG7ryBjw6FjIGJp4bq/biBraMOhYyBraMO0bmcgxJHhu5VpLg0KDQpWw60gZOG7pToNCi0gTuG6v3UgXCggXGJldGFfe2prfSA+IDAgXCk6IGtoaSBcKCBYX2ogXCkgdMSDbmcsIGto4bqjIG7Eg25nIFwoIFkgPSBrIFwpIHjhuqN5IHJhIGNhbyBoxqFuIHNvIHbhu5tpIFwoIFkgPSAxIFwpDQotIE7hur91IFwoIFxiZXRhX3tqa30gPCAwIFwpOiBraOG6oyBuxINuZyB44bqjeSByYSBcKCBZID0gayBcKSB0aOG6pXAgaMahbiBzbyB24bubaSBcKCBZID0gMSBcKQ0KDQoNCg0KIyMjICoqKjUuMy4zLiBUw61uaCB4w6FjIHN14bqldCBjaG8gdOG7q25nIG5ow7NtKioqDQoNClxbDQpQKFkgPSBrIFxtaWQgWCkgPSBcZnJhY3tcZXhwKFxldGFfayl9ezEgKyBcc3VtX3tsPTJ9XntLfSBcZXhwKFxldGFfbCl9IFxxdWFkIFx0ZXh0e3bhu5tpIH0gXGV0YV9rID0gXGJldGFfezBrfSArIFxzdW1fe2o9MX1ee3B9IFxiZXRhX3tqa30gWF9qDQpcXQ0KDQpcWw0KUChZID0gMSBcbWlkIFgpID0gXGZyYWN7MX17MSArIFxzdW1fe2w9Mn1ee0t9IFxleHAoXGV0YV9sKX0NClxdDQotLQ0KDQojIyMgKioqNS4zLjQuIMavdSB2w6AgbmjGsOG7o2MgxJFp4buDbSoqKg0KDQoNCioqKuG7qG5nIGThu6VuZyoqKg0KDQotIEThu7EgxJFvw6FuIGxv4bqhaSBraMOhY2ggaMOgbmcgKHRoxrDhu51uZywgVklQLCB2w6NuZyBsYWkpDQotIEThu7EgxJFvw6FuIGzhu7FhIGNo4buNbiBwaMawxqFuZyB0aeG7h24gKHhlIG3DoXksIHhlIGJ1cywgw7QgdMO0KQ0KLSBQaMOibiBsb+G6oWkgZ2nhu5tpIHTDrW5oIGhv4bq3YyBuaMOzbSBkw6JuIGPGsCBraGkgY8OzIG5oaeG7gXUgaMahbiAyIGzhu7FhIGNo4buNbg0KDQoNCnwgxq91IMSRaeG7g20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTmjGsOG7o2MgxJFp4buDbSAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBQaMO5IGjhu6NwIHbhu5tpIGJp4bq/biBwaOG7pSB0aHXhu5ljIG5oaeG7gXUgbeG7qWMgICAgICAgICB8IEtow7MgZGnhu4VuIGdp4bqjaSB0cuG7sWMgcXVhbiBu4bq/dSBuaGnhu4F1IG5ow7NtIHwNCnwgS2jDtG5nIHnDqnUgY+G6p3UgdGjhu6kgdOG7sSB0cm9uZyBjw6FjIG5ow7NtICAgICAgICAgfCBDw7MgdGjhu4MgcXXDoSBraOG7m3AgbuG6v3UgcXXDoSBuaGnhu4F1IGJp4bq/biAgIHwNCnwgTeG7nyBy4buZbmcgaOG7o3AgbMO9IHThu6sgbG9naXN0aWMgbmjhu4sgcGjDom4gICAgICAgICAgfCBLaMO0bmcgbcO0IGjDrG5oIGjDs2EgdGjhu6kgdOG7sSBnaeG7r2EgY8OhYyBt4bupYyB8DQoNCg0KDQojIyMgKioqNS4zLjUuIFNvIHPDoW5oIHbhu5tpIGjhu5NpIHF1eSBsb2dpc3RpYyBuaOG7iyBwaMOibioqKg0KDQoNCnwgVGnDqnUgY2jDrSAgICAgICAgICAgICAgIHwgTG9naXN0aWMgbmjhu4sgcGjDom4gICAgICAgICAgIHwgTG9naXN0aWMgxJFhIHRo4bupYyAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IFPhu5EgbeG7qWMgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgfCAyICAgICAgICAgICAgICAgICAgICAgICAgICB8IOKJpSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgU+G7kSBwaMawxqFuZyB0csOsbmggaOG7k2kgcXV5ICB8IDEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXCggSyAtIDEgXCkgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgSMOgbSBsacOqbiBr4bq/dCAgICAgICAgICAgICB8IGxvZ2l0ICAgICAgICAgICAgICAgICAgICAgIHwgbG9nIG9kZHMgc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91ICB8DQp8IERp4buFbiBnaeG6o2kgICAgICAgICAgICAgICB8IMSRxqFuIGdp4bqjbiAgICAgICAgICAgICAgICAgICB8IHBo4bupYyB04bqhcCBoxqFuLCBuaGnhu4F1IGxvZy1vZGRzICAgICB8DQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K