Nhiệm vụ 5

library(tidyverse)
library(DT)
library(scales)
library(psych)
library(knitr)
library(kableExtra)
library(DescTools)
library(epitools)
library(AER)
library(dplyr)

Phần 1:Tìm hiểu và chuẩn bị dữ liệu

1.1 Giới thiệu bộ dữ liệu

Bộ dữ liệu CPS1985 (Current Population Survey 1985) là một tập dữ liệu điều tra cá nhân được trích xuất từ Khảo sát Dân số Hiện hành tại Hoa Kỳ. Dữ liệu này cung cấp thông tin về mức lương theo giờ cùng các đặc điểm nhân khẩu học và nghề nghiệp của 534 cá nhân đang làm việc, bao gồm giới tính, chủng tộc, trình độ học vấn, kinh nghiệm, tuổi, tình trạng hôn nhân, nghề nghiệp và khu vực làm việc.

data("CPS1985")
k<-CPS1985
datatable(k,options = list(scrollX = TRUE)) #bật cuộn ngang
names(k)
##  [1] "wage"       "education"  "experience" "age"        "ethnicity" 
##  [6] "region"     "gender"     "occupation" "sector"     "union"     
## [11] "married"

Bộ dữ liệu với các biến định tính

Ta thực hiện tạo 1 dataframe mới chỉ chứa các biến định tính, ta gán data mới này vào object với tên k_cat.

cat<- c("ethnicity", "region","gender", "occupation", "sector","union", "married")
k_cat<-k[, cat]
# Thay đổi giá trị của biến `card`và owner
k_cat$married <- dplyr::recode(k_cat$married, "yes" = "M" , "no" = "S")
datatable(k_cat,options = list(scrollX = TRUE))

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

Để có cái nhìn tổng quan về cấu trúc của bộ dữ liệu, bao gồm số lượng quan sát, số lượng biến, kiểu dữ liệu của từng biến và một số giá trị điển hình, ta sử dụng hàm str() như sau:

str(k) #Cấu trúc trong dữ liệu
## 'data.frame':    534 obs. of  11 variables:
##  $ wage      : num  5.1 4.95 6.67 4 7.5 ...
##  $ education : num  8 9 12 12 12 13 10 12 16 12 ...
##  $ experience: num  21 42 1 4 17 9 27 9 11 9 ...
##  $ age       : num  35 57 19 22 35 28 43 27 33 27 ...
##  $ ethnicity : Factor w/ 3 levels "cauc","hispanic",..: 2 1 1 1 1 1 1 1 1 1 ...
##  $ region    : Factor w/ 2 levels "south","other": 2 2 2 2 2 2 1 2 2 2 ...
##  $ gender    : Factor w/ 2 levels "male","female": 2 2 1 1 1 1 1 1 1 1 ...
##  $ occupation: Factor w/ 6 levels "worker","technical",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ sector    : Factor w/ 3 levels "manufacturing",..: 1 1 1 3 3 3 3 3 1 3 ...
##  $ union     : Factor w/ 2 levels "no","yes": 1 1 1 1 1 2 1 1 1 1 ...
##  $ married   : Factor w/ 2 levels "no","yes": 2 2 1 1 2 1 1 1 2 1 ...

Qua kết quả của hàm str(), ta thấy bộ dữ liệu trong nghiên cứu là CPS1985 (Current Population Survey 1985), bao gồm thông tin của 534 người đang tham gia thị trường lao động tại Hoa Kỳ. Dữ liệu được thu thập nhằm mục đích khảo sát các yếu tố nhân khẩu học và kinh tế – xã hội ảnh hưởng đến thu nhập của người lao động. Tập dữ liệu chứa tổng cộng 11 biến, bao gồm cả biến định lượng và biến định tính, cụ thể như sau:

Các biến định lượng:

  • wage: Mức lương theo giờ của cá nhân (tính bằng đô la Mỹ), là biến mục tiêu quan trọng trong nghiên cứu về thu nhập.

  • education: Tổng số năm học chính quy của cá nhân, phản ánh trình độ học vấn.

  • experience: Số năm kinh nghiệm làm việc.

  • age: Tuổi hiện tại của cá nhân.

Các biến định tính:

  • ethnicity: Chủng tộc, được phân thành ba nhóm chính (ví dụ: “cauc”, “hispanic”, “other”).

  • region: Khu vực sinh sống, gồm hai mức: miền Nam (south) và các khu vực khác (other).

  • gender: Giới tính của cá nhân, bao gồm nam và nữ.

  • occupation: Nhóm ngành nghề chính, được chia thành sáu loại khác nhau.

  • sector: Khu vực kinh tế nơi cá nhân làm việc, với ba mức như khu vực sản xuất, khu vực công, và khu vực khác.

  • union: Tình trạng tham gia công đoàn, có hai mức là “có” và “không”.

  • married: Tình trạng hôn nhân, gồm hai mức là độc thân (S) và đã kết hôn (M).

1.3 Hiển thị một vài dòng đầu và cuối của dữ liệu

Nhằm có được cái nhòn tổng quan về bộ dữ liệu ta sử dụng hàm head() và taid() để xem một số dòng đầu và dòng cuối của bộ dữ liệu Current Population Survey 1985:

head(k) #hiển thị vài dòng đầu
##       wage education experience age ethnicity region gender occupation
## 1     5.10         8         21  35  hispanic  other female     worker
## 1100  4.95         9         42  57      cauc  other female     worker
## 2     6.67        12          1  19      cauc  other   male     worker
## 3     4.00        12          4  22      cauc  other   male     worker
## 4     7.50        12         17  35      cauc  other   male     worker
## 5    13.07        13          9  28      cauc  other   male     worker
##             sector union married
## 1    manufacturing    no     yes
## 1100 manufacturing    no     yes
## 2    manufacturing    no      no
## 3            other    no      no
## 4            other    no     yes
## 5            other   yes      no
tail(k) #hiển thị vào dòng cuối 
##      wage education experience age ethnicity region gender occupation
## 528 11.79        16          6  28      cauc  other female  technical
## 529 11.36        18          5  29      cauc  other   male  technical
## 530  6.10        12         33  51     other  other female  technical
## 531 23.25        17         25  48     other  other female  technical
## 532 19.88        12         13  31      cauc  south   male  technical
## 533 15.38        16         33  55      cauc  other   male  technical
##            sector union married
## 528         other   yes      no
## 529         other    no      no
## 530         other    no     yes
## 531         other   yes     yes
## 532         other   yes     yes
## 533 manufacturing    no     yes

1.4 Kiểm tra giá trị thiếu

Nhằm đảm bảo chất lượng dữ liệu và tránh sai lệch trong quá trình phân tích, ta cần kiểm tra xem bộ dữ liệu có chứa giá trị thiếu (NA) hay không. Điều này giúp xác định liệu có cần xử lý hoặc làm sạch dữ liệu trước khi tiếp tục phân tích:

if (any(is.na(k))) {
  cat("Có giá trị thiếu trong dữ liệu.\n")
} else {
  cat("Không có giá trị thiếu trong dữ liệu.\n")
}
## Không có giá trị thiếu trong dữ liệu.

Với đoạn code trên nếu trong bộ dữ liệu có bất kì dữ liệu nào thiếu thì kết quả sẽ nhận được là có giá trị thiếu trong dữ liệu và ngược lại.

Với bộ dữ liệu được gán cho k nhận được kết quả là Không có giá trị thiếu trong dữ liệu. Điều này cho thấy dữ liệu không có ô trống hay giá trị bị thiếu trong toàn bộ bộ dữ liệu. Đây là điều kiện để tiến hành các phân tích tiếp theo mà không cần thực hiện bước xử lý giá trị thiếu.

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

2.1 Biến ethnicity

Ta thực hiện thống kê tần số và tần suất cho biến ethnicity được kết quả như sau:

Thống kê tần suất

ethnicity_1<-table(k_cat$ethnicity)
ethnicity_1
## 
##     cauc hispanic    other 
##      440       27       67
ethnicity_2<-table(k_cat$ethnicity)/sum(nrow(k_cat))*100 #tần suất
ethnicity_2
## 
##     cauc hispanic    other 
## 82.39700  5.05618 12.54682

Trực quan hóa dữ liệu

c <- as.data.frame(table(k_cat$ethnicity)) #chuyển kết quả thành bảng dữ liệu (data.frame) với 2 cột
colnames(c) <- c("ethnicity", "Count")
ggplot(c, aes(x = ethnicity, y = Count, fill = ethnicity)) +
  geom_bar(stat = "identity") +
  labs(title = "Biểu đồ biểu thị chủng tộc", x = "Chủng tộc", y = "Số lượng") +
  theme_minimal() +  
  theme(text = element_text(family = "sans"))

pie(ethnicity_2,
labels = paste(names(ethnicity_2), round(ethnicity_2, 2), "%"),
main = "Tỷ lệ chủng tộc")

Nhận xét

Biểu đồ cho thấy nhóm chủng tộc Caucasian (người da tắng) chiếm ưu thế rõ rệt với 440 người 82.4% chiếm tỷ lệ cao nhất trong 3 nhóm. Nhóm other đứng thứ hai với 67 người, trong khi Hispanic (Mỹ latinh) chỉ có 27 người. Sự chênh lệch này cho thấy mẫu khảo sát có xu hướng nghiêng nhiều về một nhóm chủng tộc nhất định, có thể ảnh hưởng đến kết quả nghiên cứu nếu mục tiêu là phản ánh sự đa dạng chủng tộc.

2.2 Biến region

Ta thực hiện thống kê tần số và tần suất cho biến region được kết quả như sau

Thống kê tần suất

region_1<-table(k_cat$region)
region_1
## 
## south other 
##   156   378
region_2<-table(k_cat$region)/sum(nrow(k_cat))*100 #tần suất
region_2
## 
##    south    other 
## 29.21348 70.78652

Trực quan hóa dữ liệu

region_1 <- k_cat |>
  group_by(region) |>
  summarise(freq = n()) |>
  mutate(per = freq / sum(freq),
         label = paste0(freq, " (", round(per * 100, 1), "%)"))

ggplot(region_1 , aes(x = "", y = per, fill = region)) +
  geom_col(width = 1, color = "white") +
  coord_polar("y") +
  geom_text(aes(label = paste0(round(per*100, 2), "%")),
            position = position_stack(vjust = 0.5),
            size = 2.5) +
  scale_fill_brewer(palette = "Pastel1") +  # Bạn có thể chọn Set1, Set2...
  labs(title = "Tỷ lệ người sinh sống ở các khu vực", fill = "Khu vực") +
  theme_void()

Nhận xét

Kết quả biểu đồ cho thấy đa số người dân sinh sống tại các khu vực ngoài miền Nam chiếm khoảng 70.79%, trong khi chỉ có 29.21% cư trú tại khu vực miền Nam. Điều này cho thấy sự phân bố dân cư trong mẫu có phần nghiêng về các vùng ngoài miền Nam.

2.3 Biến gender

Ta thực hiện thống kê tần số và tần suất cho biến region được kết quả như sau

Thống kê tần suất

gender_1<-table(k_cat$gender)
gender_1
## 
##   male female 
##    289    245
gender_2<-table(k_cat$gender)/sum(nrow(k_cat))*100 #tần suất
gender_2
## 
##     male   female 
## 54.11985 45.88015

Trực quan hóa dữ liệu

cols <- c("lightblue","lightpink")
# Nhãn phần trăm
gender_2bd<- paste0( round(gender_2, 2), "%")
# Vẽ pie 
pie(
  gender_2 ,
  labels = NA,
  main   = "Tần suất biến giới tính",
  col    = cols,
  border = "white")

# Thêm legend
legend(
  x      ="topright",
  legend = paste(names(gender_2 ),gender_2bd),
  fill   = cols,
  )

Nhận xét

Dựa vào kết quả khảo sát trên cho thấy trong số những người khảo sát có 289 người là nam giới chiếm 54.12% và 245 người là nữ giới chiếm 45.88%. Qua kết quả đó ta thấy giới tính của những khảo sát không có sự chênh lệch quá nhiều.

2.4 Biến occupation

Ta thực hiện thống kê tần số và tần suất cho biến occupation được kết quả như sau

Thống kê tần suất

occupation_1<-table(k_cat$occupation)
occupation_1
## 
##     worker  technical   services     office      sales management 
##        156        105         83         97         38         55
occupation_2<-table(k_cat$occupation)/sum(nrow(k_cat))*100 #tần suất
occupation_2
## 
##     worker  technical   services     office      sales management 
##  29.213483  19.662921  15.543071  18.164794   7.116105  10.299625

Trực quan hóa dữ liệu

c3 <- as.data.frame(occupation_1)
colnames(c3) <- c("occupation", "Count")

ggplot(c3, aes(x = occupation, y = Count, fill = occupation)) +
  geom_col(fill = "lightblue", color = "black") +
  labs(x = "Ngành nghề", y = "Tần số", title = "Các ngành nghề khảo sát") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét

Kết quả cho thấy nhóm công nhân (worker) chiếm tỷ lệ lớn nhất trong mẫu khảo sát chiếm khoảng 28,33%, theo sau là nhóm kỹ thuật (technical) và văn phòng (office) với lần lượt 19,06% và 17,61%. Trong khi đó, nhóm bán hàng (sales) có số lượng thấp nhất, chỉ chiếm 6,90%. Sự phân bố này cho thấy rằng mẫu khảo sát có xu hướng nghiêng về các ngành lao động chân tay và kỹ thuật.

2.5 Biến sector

Ta thực hiện thống kê tần số và tần suất cho biến sector được kết quả như sau

Thống kê tần suất

sector_1<-table(k_cat$sector)
sector_1
## 
## manufacturing  construction         other 
##            99            24           411
sector_2<-table(k_cat$sector)/sum(nrow(k_cat))*100 #tần suất
sector_2
## 
## manufacturing  construction         other 
##     18.539326      4.494382     76.966292

Trực quan hóa dữ liệu

cols <- c("lightblue","lightpink", "lightgreen")
# Nhãn phần trăm
sector_2bd<- paste0( round(sector_2, 2), "%")
# Vẽ pie chart ẩn nhãn
pie(
  sector_2,
  labels = NA,
  main   = "Tần suất biến giới tính",
  col    = cols,
  border = "white")

# Thêm legend bên ngoài
legend(
  x      ="topright",
  legend = paste(names(sector_2),sector_2bd),
  fill   = cols,
  )

Nhận xét

Kết quả cho thấy phần lớn người tham gia khảo sát làm việc trong khu vực khác (chiếm khoảng 76,97%), trong khi chỉ có 18,54% thuộc khu vực sản xuất và 4,49% làm việc trong ngành xây dựng. Điều này cho thấy mẫu khảo sát tập trung chủ yếu vào các đối tượng không làm việc trong lĩnh vực công nghiệp hay xây dựng.

2.6 Biến union

Ta thực hiện thống kê tần số và tần suất cho biến union được kết quả như sau

Thống kê tần suất

union_1<-table(k_cat$union)
union_1
## 
##  no yes 
## 438  96
union_2<-table(k_cat$union)/sum(nrow(k_cat))*100 #tần suất
union_2
## 
##       no      yes 
## 82.02247 17.97753

Trực quan hóa dữ liệu

cols <- c("lightblue","lightpink")
# Nhãn phần trăm
union_2bd<- paste0( round(union_2, 2), "%")
# Vẽ pie chart ẩn nhãn
pie(
  union_2 ,
  labels = NA,
  main   = "Tần suất tham gia hoặc không gia công đoàn",
  col    = cols,
  border = "white")

# Thêm legend bên ngoài
legend(
  x      ="topright",
  legend = paste(names(union_2),union_2bd),
  fill   = cols,
  )

Nhận xét

Dựa vào kết quả trên ta nhận thấy số người tham gia công đoàn chỉ chiểm 17.98% trong khi đó số người không tham gia công đoàn chiếm tỷ lệ lớn với 82.02%. Qua kết quả trên ta thấy có sự chênh lệch quá lớn giữa 2 trang thái.

2.7 Biến married

Ta thực hiện thống kê tần số và tần suất cho biến married được kết quả như sau

Thống kê tần suất

married_1<-table(k_cat$married)
married_1
## 
##   S   M 
## 184 350
married_2<-table(k_cat$married)/sum(nrow(k_cat))*100 #tần suất
married_2
## 
##        S        M 
## 34.45693 65.54307

Trực quan hóa dữ liệu

cols <- c("lightblue","lightpink")
# Nhãn phần trăm
married_2bd<- paste0( round(married_2, 2), "%")
# Vẽ pie chart ẩn nhãn
pie(
  married_2,
  labels = NA,
  main   = "Tỷ lệ tình trạng kết hôn của người dân",
  col    = cols,
  border = "white")

# Thêm legend bên ngoài
legend(
  x      ="topright",
  legend = paste(names(married_2),married_2bd),
  fill   = cols,
  )

Nhận xét

Kết quả phân tích cho thấy phần lớn người dân trong mẫu khảo sát đã kết hôn, chiếm khoảng 65,54%, trong khi tỷ lệ người độc thân là 34,46%. Điều này phản ánh rằng đa số người được khảo sát đang sống trong các mối quan hệ hôn nhân chính thức.

Phần 3: Phân tích sự tác động của các biến lên việc tham gia công đoàn (union)

3.1 Biến union và gender

3.1.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

b1<- table(k_cat$union,k_cat$gender)
addmargins(b1) 
##      
##       male female Sum
##   no   221    217 438
##   yes   68     28  96
##   Sum  289    245 534

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

prop.table(b1, margin = 1)
##      
##            male    female
##   no  0.5045662 0.4954338
##   yes 0.7083333 0.2916667

Trực quan hóa

# Chuyển sang data frame
b1_df <- as.data.frame(b1)
colnames(b1_df) <- c("union", "gender", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(b1_df, aes(x = union, y = Frequency, fill = gender)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa union và gender",
    x = "union",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét: Tỷ lệ tham gia công đoàn (union = “yes”) thấp hơn rõ rệt so với không tham gia (union = “no”) ở cả nam và nữ. Cụ thể, tổng số người không tham gia công đoàn là 438 người, chiếm khoảng 82% tổng thể (438/534), trong khi chỉ có 96 người tham gia tương đương khoảng 18%. Trong nhóm tham gia công đoàn, nam giới chiếm tỷ lệ vượt trội với 68 người (70.8%), còn nữ giới chỉ chiếm 28 người (29.2%), cho thấy nam giới có xu hướng tham gia công đoàn cao hơn đáng kể so với nữ giới. Ngược lại, trong nhóm không tham gia công đoàn, tỷ lệ nam và nữ gần như bằng nhau, lần lượt là 50.5% và 49.5%, điều này cho thấy không có sự khác biệt đáng kể về giới tính trong nhóm không tham gia công đoàn.

3.1.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là union và gender hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(b1)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  b1
## X-squared = 12.359, df = 1, p-value = 0.0004388

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến union và biến gender không có mối quan hệ.} \\\\ H_1: & \text{Biến union và biến gender có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.0004388 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa biến union và biến gender tồn tại mối quan hệ.

3.1.3 Relative risk

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

TH1: Không tham gia công đoàn là biến tham chiếu

rr1<- riskratio(b1)
rr1
## $data
##        
##         male female Total
##   no     221    217   438
##   yes     68     28    96
##   Total  289    245   534
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate     lower     upper
##   no  1.0000000        NA        NA
##   yes 0.5887097 0.4250407 0.8154021
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   no            NA           NA           NA
##   yes 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và giới tính (gender) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, không tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi việc tham gia công đoàn có RR = 0.5887 tức là tỷ lệ tham gia công đoàn ở nữ chỉ bằng khoảng 58.87% so tỷ lệ không tham gia công đoàn. Khoảng tin cậy 95% của RR nằm trong khoảng từ 0.4250 đến 0.8154, không bao gồm 1, cho thấy sự khác biệt này có ý nghĩa thống kê. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.001), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa nam và nữ.

TH2: Tham gia công đoàn là biến tham chiếu

rr1r<- riskratio(b1, rev="r")
rr1r
## $data
##        
##         male female Total
##   yes     68     28    96
##   no     221    217   438
##   Total  289    245   534
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate    lower    upper
##   yes  1.00000       NA       NA
##   no   1.69863 1.226389 2.352716
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   yes           NA           NA           NA
##   no  0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quá Relatiev Risk (RR) giữ tình trạng tham gia công đoàn (union) và giới tính (gender) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, tham gia công đoàn được chọn làm biến tham chiếu với RR=1, trong khi việc không tham gia công đoàncos RR = 1.69863 tức là tỷ lệ không tham gia công đòa ở nữ cao hơn 69,86% tỷ lệ tham gia công đoàn ở nữ. Khoảng tin cậy 95% của RR nằm trong khoảng từ 1.226 đến 2.353. Các kiểm định đi kèm như mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p < 0.005, củng cố bằng chứng rằng tỷ lệ không tham gia công đoàn ở nữ giới cao hơn rõ rệt.

3.1.4 Odd ratio

or1 <- oddsratio(b1)
or1
## $data
##        
##         male female Total
##   no     221    217   438
##   yes     68     28    96
##   Total  289    245   534
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate     lower     upper
##   no   1.00000        NA        NA
##   yes  0.42126 0.2572726 0.6737883
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   no            NA           NA           NA
##   yes 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Kết quả phân tích cho thấy khả năng tham gia công đoàn ở nữ thấp hơn đáng kể so với nam giới. Tỷ số chênh (Odds Ratio – OR) được ước lượng là 0.4213, nghĩa là xác suất tham gia công đoàn ở nữ giới chỉ bằng khoảng 42.1% so với xác suất không tham gia công đoàn ở nữ, hay nói cách khác nữ giới ít có khả năng tham gia công đoàn hơn. Khoảng tin cậy 95% của OR nằm trong khoảng [0.2573; 0.6738],các kiểm định đi kèm như mid-p exact, Fisher’s exact và Chi-square đều cho p-value < 0.001, chứng minh rằng sự khác biệt này là có ý nghĩa thống kê.

3.2 Biến union và occupation

3.2.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

b2<- table(k_cat$union,k_cat$occupation)
addmargins(b2) 
##      
##       worker technical services office sales management Sum
##   no     112        82       66     89    37         52 438
##   yes     44        23       17      8     1          3  96
##   Sum    156       105       83     97    38         55 534

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

prop.table(b2, margin = 1)
##      
##           worker  technical   services     office      sales management
##   no  0.25570776 0.18721461 0.15068493 0.20319635 0.08447489 0.11872146
##   yes 0.45833333 0.23958333 0.17708333 0.08333333 0.01041667 0.03125000

Trực quan hóa

# Chuyển sang data frame
b2_df <- as.data.frame(b2)
colnames(b2_df) <- c("union", "occupation", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(b2_df, aes(x = union, y = Frequency, fill = occupation)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa union và occupation",
    x = "union",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét: Biểu đồ thể hiện tần suất giữa việc tham gia công đoàn (union) và các nhóm nghề nghiệp (occupation) cho thấy sự khác biệt rõ rệt giữa các nhóm. Nhìn chung, tỷ lệ tham gia công đoàn cao nhất thuộc về nhóm lao động phổ thông (worker) với khoảng 28,2%, tiếp theo là technical (21,9%) và services (20,5%). Ngược lại, các nhóm như office, management và sales có tỷ lệ tham gia rất thấp, lần lượt khoảng 8,2%, 5,5% và chỉ 2,6%. Điều này phản ánh xu hướng những người làm các công việc tay chân hoặc kỹ thuật thường đối mặt với điều kiện lao động khó khăn hơn nên có nhu cầu tham gia công đoàn để bảo vệ quyền lợi.

3.2.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là union và occupation hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(b2)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test
## 
## data:  b2
## X-squared = 30.664, df = 5, p-value = 1.091e-05

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến union và biến occupation không có mối quan hệ.} \\\\ H_1: & \text{Biến union và biến occupation có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 1.091e-05 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa biến union và biến occupation tồn tại mối quan hệ.

3.2.3 Relative risk

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

prop.table(b2, margin = 1)
##      
##           worker  technical   services     office      sales management
##   no  0.25570776 0.18721461 0.15068493 0.20319635 0.08447489 0.11872146
##   yes 0.45833333 0.23958333 0.17708333 0.08333333 0.01041667 0.03125000

Kết hợp dữ liệu nhóm ngành nghề thành hai nhóm chính: nhóm công nhân (worker) và nhóm other bao gồm technical, services, office và management.

b2_new <- cbind(   # kết hợp hai cột này thành một bảng dữ liệu mới gọi là k4_new.
  worker = b2[, "worker"],  #lấy dữ liệu cột "cauc" từ bảng k4
  other = b2[, "technical"] + b2[, "services"]+b2[, "office"] +b2[, "sales"] + b2[, "management"]# cộng dữ liệu hai cột "hispanic" và "other" từ bảng k4.
)
b2_new
##     worker other
## no     112   326
## yes     44    52

TH1: Không tham gia công đoàn là biến tham chiếu

rr2<- riskratio(b2_new)
rr2
## $data
##       worker other Total
## no       112   326   438
## yes       44    52    96
## Total    156   378   534
## 
## $measure
##                         NA
## risk ratio with 95% C.I.  estimate     lower    upper
##                      no  1.0000000        NA       NA
##                      yes 0.7277607 0.6006131 0.881825
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##       no            NA           NA           NA
##       yes 0.0001361793  0.000170972 7.687681e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và nhóm ngành nghề chính (worker) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, không tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi việc tham gia công đoàn có RR = 0.7277 tức là tỷ lệ tham gia công đoàn ở các ngành nghề khác chỉ bằng khoảng 72.77% so tỷ lệ không tham gia công đoàn. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.001), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

TH2: Tham gia không công đoàn là biến tham chiếu

rr2r<- riskratio(b2_new, rev="c")
rr2r
## $data
##       other worker Total
## no      326    112   438
## yes      52     44    96
## Total   378    156   534
## 
## $measure
##                         NA
## risk ratio with 95% C.I. estimate    lower    upper
##                      no  1.000000       NA       NA
##                      yes 1.792411 1.368495 2.347642
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##       no            NA           NA           NA
##       yes 0.0001361793  0.000170972 7.687681e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và nhóm ngành nghề chính (worker) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, không tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi tham gia công đoàn có RR = 1.7924 tức là tỷ lệ tham gia công đoàn ở các ngành nghề công nhân cao hơn 79.24% so tỷ lệ không tham gia công đoàn ở ngành công nhân. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.05), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

3.2.4 Odd ratio

or2 <- oddsratio(b2_new)
or2
## $data
##       worker other Total
## no       112   326   438
## yes       44    52    96
## Total    156   378   534
## 
## $measure
##                         NA
## odds ratio with 95% C.I.  estimate     lower     upper
##                      no  1.0000000        NA        NA
##                      yes 0.4067117 0.2576189 0.6432423
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##       no            NA           NA           NA
##       yes 0.0001361793  0.000170972 7.687681e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Kết quả phân tích cho thấy khả năng tham gia công đoàn ở các ngành nghề khác thấp hơn đáng kể so với ngành công nhân. Tỷ số chênh (Odds Ratio – OR) được ước lượng là 0.4067, nghĩa là xác suất tham gia công đoàn ở các ngành nghề khác bằng khoảng 40.67% so với tỷ lệ không tham gia công đoàn ở ngành khác. Khoảng tin cậy 95% của OR nằm trong khoảng [0.2576; 0.6432],các kiểm định đi kèm như mid-p exact, Fisher’s exact và Chi-square đều cho p-value < 0.001, chứng minh rằng sự khác biệt này là có ý nghĩa thống kê.

3.3 Biến union và married

3.3.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

b3<- table(k_cat$union,k_cat$married)
addmargins(b3) 
##      
##         S   M Sum
##   no  160 278 438
##   yes  24  72  96
##   Sum 184 350 534

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

prop.table(b3, margin = 1)
##      
##               S         M
##   no  0.3652968 0.6347032
##   yes 0.2500000 0.7500000

Trực quan hóa

# Chuyển sang data frame
b3_df <- as.data.frame(b3)
colnames(b3_df) <- c("union", "married", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(b3_df, aes(x = union, y = Frequency, fill = married)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa union và married",
    x = "union",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét: Biểu đồ thể hiện tần suất giữa việc tham gia công đoàn (union) và tình trạng hôn nhân (married) cho thấy sự khác biệt rõ rệt giữa hai nhóm: độc thân (S) và đã kết hôn (M). Trong nhóm không tham gia công đoàn (union = no) phần lớn là người đã kết hôn (278 người, chiếm khoảng 63,5%) và còn lại là người độc thân (160 người, chiếm khoảng 36,5%). Trong khi đó, trong nhóm có tham gia công đoàn (union = yes), tỷ lệ người đã kết hôn càng chiếm ưu thế rõ rệt hơn (72 người, chiếm 75%), còn người độc thân chỉ có 24 người (25%). Qua đó cho thấy người đã kết hôn có xu hướng tham gia công đoàn cao hơn người độc thân phản ánh rằng người đã lập gia đình thường có xu hướng quan tâm nhiều hơn đến sự ổn định và quyền lợi trong công việc, nên họ chủ động hơn trong việc tham gia các tổ chức đại diện như công đoàn.

3.3.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là union và married hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(b3)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  b3
## X-squared = 4.1384, df = 1, p-value = 0.04192

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến union và biến married không có mối quan hệ.} \\\\ H_1: & \text{Biến union và biến married có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.04192 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa biến union và biến married tồn tại mối quan hệ.

3.3.3 Relative risk

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

prop.table(b3, margin = 1)
##      
##               S         M
##   no  0.3652968 0.6347032
##   yes 0.2500000 0.7500000

TH1: Không tham gia công đoàn là biến tham chiếu

rr3<- riskratio(b3)
rr3
## $data
##        
##           S   M Total
##   no    160 278   438
##   yes    24  72    96
##   Total 184 350   534
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate    lower    upper
##   no  1.000000       NA       NA
##   yes 1.181655 1.031816 1.353253
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   no          NA           NA         NA
##   yes 0.02981075   0.03303146 0.03132896
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và tình trạng hôn nhân (married) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, không tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi tham gia công đoàn có RR = 1.1816 tức là tỷ lệ tham gia công đoàn ở người đã kết hôn cao hơn 18.16% so tỷ lệ không tham gia công đoàn ở ngườiđã kết hôn. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.05), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

TH2: Tham gia công đoàn là biến tham chiếu

rrr3r<- riskratio(b3, rev="c")
rrr3r
## $data
##        
##           M   S Total
##   no    278 160   438
##   yes    72  24    96
##   Total 350 184   534
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate     lower    upper
##   no  1.000000        NA       NA
##   yes 0.684375 0.4737577 0.988626
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   no          NA           NA         NA
##   yes 0.02981075   0.03303146 0.03132896
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa tình trạng tham gia công đoàn (union) và tình trạng hôn nhân (married) cho thấy sự khác biệt rõ rệt giữa việc tham gia và không tham gia công đoàn. Cụ thể, tham gia công đoàn được chọn làm nhóm tham chiếu với RR = 1.00, trong khi không tham gia công đoàn có RR = 0.6843 tức là tỷ lệ tham gia công đoàn ở người chưa kết hôn bằng khoảng 68,43% so tỷ lệ không tham gia công đoàn ở người chưa kết hôn. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.05), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

3.3.4 Odd ratio

or2 <- oddsratio(b3)
or2
## $data
##        
##           S   M Total
##   no    160 278   438
##   yes    24  72    96
##   Total 184 350   534
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate    lower    upper
##   no  1.000000       NA       NA
##   yes 1.718401 1.053111 2.890456
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact chi.square
##   no          NA           NA         NA
##   yes 0.02981075   0.03303146 0.03132896
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Kết quả phân tích cho thấy khả năng tham gia công đoàn ở người đã kết hôn cao hơn đáng kể so với khả năng tham gia công đoàn ở người chưa kết hôn. Tỷ số chênh (Odds Ratio – OR) được ước lượng là 1.7184, nghĩa là xác suất tham gia công đoàn ở người đã kết hôn cao hơn 71.84% so với xác suất không tham gia công đoàn ở người đã kết hôn. Khoảng tin cậy 95% của OR nằm trong khoảng [1.0531;2.8904],các kiểm định đi kèm như mid-p exact, Fisher’s exact và Chi-square đều cho p-value < 0.05, chứng minh rằng sự khác biệt này là có ý nghĩa thống kê.

Phần 4; Phân tích sự tác động của các biến lên biến giới tính (gender)

4.1 Biến gender và biến sector

4.1.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

e1<- table(k_cat$gender, k_cat$sector)
addmargins(e1) 
##         
##          manufacturing construction other Sum
##   male              60           22   207 289
##   female            39            2   204 245
##   Sum               99           24   411 534

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

prop.table(e1, margin = 1)
##         
##          manufacturing construction       other
##   male     0.207612457  0.076124567 0.716262976
##   female   0.159183673  0.008163265 0.832653061

Trực quan hóa

# Chuyển sang data frame
e1_df <- as.data.frame(e1)
colnames(e1_df) <- c("gender", "sector", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(e1_df, aes(x = gender, y = Frequency, fill =sector )) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần suất giữa sector và gender",
    x = "gender",
    y = "Tần suất"
  ) +
  theme_minimal()

Nhận xét: Biểu đồ thể hiện mối quan hệ giữa ngành nghề (sector) và giới tính (gender) cho thấy sự phân bố không đồng đều giữa nam và nữ trong các lĩnh vực. Ngành xây dựng có tỷ lệ nam giới chiếm ưu thế tuyệt đối với 91,7%, trong khi nữ giới chỉ chiếm 8,3%. Ngành sản xuất cũng có sự chênh lệch, khi nam giới chiếm 60,6% và nữ giới là 39,4%. Ngược lại, nhóm ngành “other” lại có sự phân bố giới tính khá cân bằng, với khoảng 50,4% nam và 49,6% nữ. Điều này phản ánh thực trạng định kiến giới trong lựa chọn nghề nghiệp, khi các ngành đòi hỏi lao động thể chất như xây dựng vẫn chủ yếu là nam giới, còn các ngành khác có xu hướng mở rộng hơn cho cả nam và nữ.

4.1.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là sector và gender hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(e1)
# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test
## 
## data:  e1
## X-squared = 17.637, df = 2, p-value = 0.0001479

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến gender và biến sector không có mối quan hệ.} \\\\ H_1: & \text{Biến gender và biến sector có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.0001479 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa Biến sector và biến gender tồn tại mối quan hệ.

4.1.3 Relative risk

e1_new <- cbind(   
  construction= e1[, "construction"],  
  other = e1[, "manufacturing"] + e1[, "other"] 
)
e1_new
##        construction other
## male             22   267
## female            2   243

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

rrs1<- riskratio(e1_new, rev="c")
rrs1
## $data
##        other construction Total
## male     267           22   289
## female   243            2   245
## Total    510           24   534
## 
## $measure
##                         NA
## risk ratio with 95% C.I.  estimate      lower     upper
##                   male   1.0000000         NA        NA
##                   female 0.1072356 0.02547102 0.4514731
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##    male             NA           NA           NA
##    female 7.027025e-05  8.38247e-05 0.0001585815
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa khu vực kinh tế (sector) và giới tính (gender) cho thấy sự khác biệt rõ rệt giữa các khu vực kinh tế. Cụ thể, giới tính nam được chọn làm nhóm tham chiếu với RR = 1.00, trong khi giưới tính nữ có RR = 0.1072 tức là tỷ lệ nữ ở các ngành xây dựng chỉ bằng khoảng 10.72% so tỷ lệ nam ở các ngành xây dựng. Các kiểm định đi kèm như kiểm định mid-p exact, Fisher’s exact và Chi-square đều cho giá trị p rất nhỏ (p < 0.05), củng cố thêm bằng chứng rằng sự khác biệt về tỷ lệ tham gia công đoàn giữa ngành công nhân và các ngành nghề khác.

4.1.4 Odd ratio

or1s<-oddsratio(e1_new)
or1s
## $data
##        construction other Total
## male             22   267   289
## female            2   243   245
## Total            24   510   534
## 
## $measure
##                         NA
## odds ratio with 95% C.I. estimate    lower   upper
##                   male   1.000000       NA      NA
##                   female 9.337391 2.697792 63.5094
## 
## $p.value
##          NA
## two-sided   midp.exact fisher.exact   chi.square
##    male             NA           NA           NA
##    female 7.027025e-05  8.38247e-05 0.0001585815
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Dựa trên kết quả phân tích Odds Ratio (OR) giữa biến sector và gender. Giới tính nam được chọn làm nhóm tham chiếu (OR = 1.00), nên các Odds Ratio của giưới tính nữ sẽ so sánh. Với giới tính nữ, Odds Ratio = 9.337391 và giá trị p đều nhỏ hơn 0.01 cho tất cả các phương pháp kiểm định. Cụ thể, xác suất nữ giới làm việc trong ngành khác cao hơn 9 lần so với nam trong nhóm ngành khác

4.2 Biến gender và biến union

Để hiểu rõ hơn mối quan hệ giữa nhóm giới tính (gender) và nhóm tình trạng tham gia công đoàn (union), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của nhóm tình trạng tham gia công đoàn theo từng giới tính, giúp quan sát dễ dàng sự khác biệt và xu hướng tiêu dùng giữa các nhóm.

4.2.1 Bảng tần suất chéo và trực quan hóa

Bảng tần suất chéo

e2 <- table(k_cat$gender,k_cat$union)
addmargins(e2) 
##         
##           no yes Sum
##   male   221  68 289
##   female 217  28 245
##   Sum    438  96 534

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

prop.table(e2, margin = 1)
##         
##                 no       yes
##   male   0.7647059 0.2352941
##   female 0.8857143 0.1142857

Trực quan hóa

# Chuyển sang data frame
e2_df <- as.data.frame(e2)
colnames(e2_df) <- c("gender", "union", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(e2_df, aes(x = gender, y = Frequency, fill = union)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Biểu đồ tần số giữa gender và union",
    x = "gender",
    y = "Tần số"
  ) +
  theme_minimal()

Nhận xét

Dựa vào biểu đồ trên ta thấy tỷ lệ nam giới tham gia công đoàn cao hơn nữ giới. Cụ thể, trong tổng số 289 nam thì có 68 người tham gia công đoàn chiếm khoảng 23,5%, trong khi ở nữ giới chỉ có 28 trên tổng số 245 người tham gia chiếm khoảng 11,4%. Điều này cho thấy nam giới có xu hướng gắn kết với công đoàn nhiều hơn so với nữ giới, phản ánh sự khác biệt về mức độ tham gia tổ chức lao động giữa hai giới. Tuy nhiên tổng thể thì nam và nữ điều không có xu hướng tham gia công đoàn bởi tỷ lệ nam và nư không tham gia chiếm tỷ lệ rất lớn.

4.2.2 Kiểm định thống kê (Kiểm định Chi-bình phương)

Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là gender và union hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).

# Kiểm định
chisq_result <- chisq.test(e2)

# In kết quả
chisq_result
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  e2
## X-squared = 12.359, df = 1, p-value = 0.0004388

Giả thuyết:

\[ \left\{ \begin{array}{ll} H_0: & \text{Biến gender và biến union không có mối quan hệ.} \\\\ H_1: & \text{Biến gender và biến union có mối quan hệ.} \ \end{array} \right. \]

Nhận xét: Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.0004388 < 0.05, bác bỏ giả thuyết \(H_0\). Vậy giữa biến gender và biến union tồn tại mối quan hệ.

4.2.3 Relative Risk

TH1: Nam làm biến tham chiếu

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

rr2<- riskratio(e2)
rr2
## $data
##         
##           no yes Total
##   male   221  68   289
##   female 217  28   245
##   Total  438  96   534
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower     upper
##   male   1.0000000        NA        NA
##   female 0.4857143 0.3236845 0.7288529
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   male             NA           NA           NA
##   female 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa giới tính (gender) và tình trạng tham gia công đoàn (union) cho thấy sự khác biệt rõ rệt giữa nam và nữ. Cụ thể, nam giới được chọn làm nhóm tham chiếu với RR = 1.00, trong khi nữ giới có RR = 0.486 tức là khả năng nữ tham gia công đoàn chi bằng khoảng 48.6% so với nam tham gia công đoàn. Khoảng tin cậy 95% cho RR của nữ nằm trong khoảng từ 0.324 đến 0.729, cho thấy kết quả này có độ tin cậy cao. Hơn nữa, các kiểm định thống kê (midp.exact, fisher.exact, chi.square) đều cho giá trị p rất nhỏ (< 0.05), chứng tỏ sự khác biệt này có ý nghĩa thống kê.

TH2: Nam làm biến tham chiếu

rr3<- riskratio(e2, rev ="c")
rr3
## $data
##         
##          yes  no Total
##   male    68 221   289
##   female  28 217   245
##   Total   96 438   534
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate    lower    upper
##   male   1.000000       NA       NA
##   female 1.158242 1.071133 1.252435
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   male             NA           NA           NA
##   female 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả phân tích Relative Risk (RR) giữa giới tính (gender) và tình trạng tham gia công đoàn (union) cho thấy sự khác biệt rõ rệt giữa nam và nữ. Cụ thể, nam giới được chọn làm nhóm tham chiếu với RR = 1.00, trong khi nữ giới có RR = 1.158 tức là khả năng nữ không tham gia công đoàn cao hơn 15.8% so với nam không tham gia công đoàn. Khoảng tin cậy 95% cho RR của nữ nằm trong khoảng từ 1.0711 đến 1.252, cho thấy kết quả này có độ tin cậy cao. Hơn nữa, các kiểm định thống kê (midp.exact, fisher.exact, chi.square) đều cho giá trị p rất nhỏ (< 0.05), chứng tỏ sự khác biệt này có ý nghĩa thống kê.

4.2.4 Odds ratio

orgu <- oddsratio(e2)
orgu
## $data
##         
##           no yes Total
##   male   221  68   289
##   female 217  28   245
##   Total  438  96   534
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate     lower     upper
##   male    1.00000        NA        NA
##   female  0.42126 0.2572726 0.6737883
## 
## $p.value
##         two-sided
##            midp.exact fisher.exact   chi.square
##   male             NA           NA           NA
##   female 0.0002542858 0.0002800058 0.0002849038
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Dựa trên kết quả phân tích Odds Ratio (OR) giữa biến sector và gunion. Giới tính nam được chọn làm nhóm tham chiếu (OR = 1.00), nên các Odds Ratio của giơi tính nữ sẽ so sánh. Với giới tính nữ, Odds Ratio = 0.42126 và giá trị p đều nhỏ hơn 0.01 cho tất cả các phương pháp kiểm định. Cụ thể, xác suất nữ giới tham gia công đoàn chỉ bằng 42.126% so với nam tham gia công đoàn.

Phần 5: Mô hình Logit

5.1 Mô hình Logit cho dữ liệu nhị phân

5.1.1 Việc tham gia công đoàn ảnh hưởng như thế nào đối với giới tính

Trong phần này, tác giả tiến hành xây dựng mô hình hồi quy logistic nhị phân (logit model) nhằm đánh giá mối quan hệ giữa việc tham gia công đoàn và giới tính của người lao động. Cụ thể, biến phụ thuộc là gender, được mã hóa dưới dạng nhị phân với hai giá trị: male (0) và female (1). Biến độc lập là union, thể hiện tình trạng tham gia công đoàn với hai giá trị yes và no.

Mô hình được ước lượng bằng phương pháp bình phương cực đại (Maximum Likelihood Estimation) với hàm liên kết logit, thể hiện xác suất một cá nhân là nữ giới dưới ảnh hưởng của việc có tham gia công đoàn hay không.

Mô hình Logit

\[ \log\left( \frac{P(\text{gender} = \text{"female"})}{1 - P(\text{gender} = \text{"female"})} \right) = \beta_0 + \beta_1 \cdot \text{union} \]

k_cat$gender <- factor(k_cat$gender, levels = c('male','female'))
#k_cat$gender: cột gender trong bộ dữ liệu k_cat
#factor(...): hàm chuyển dữ liệu thành kiểu nhân tố (factor).
#levels = c('male', 'female'): xác định rõ thứ tự của hai nhóm, trong đó: 0 là male, 1 là female
reglogit <- glm(gender ~union, data = k_cat, family = binomial(link = 'logit'))
#glm(...): hàm dùng để xây mô hình hồi quy tổng quát
#gender ~ union: biến phụ thuộc là gender, được giải thích bởi biến union
#family = binomial(link = 'logit'): chỉ định đây là mô hình hồi quy logistic nhị phân, phù hợp với biến phụ thuộc là nhị phân.
summary(reglogit)
## 
## Call:
## glm(formula = gender ~ union, family = binomial(link = "logit"), 
##     data = k_cat)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.01827    0.09557  -0.191 0.848428    
## unionyes    -0.86904    0.24404  -3.561 0.000369 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 736.65  on 533  degrees of freedom
## Residual deviance: 723.06  on 532  degrees of freedom
## AIC: 727.06
## 
## Number of Fisher Scoring iterations: 4

Kết quả mô hình hồi quy logistic cho thấy có mối liên hệ có ý nghĩa thống kê giữa giới tính và tình trạng tham gia công đoàn. Cụ thể, hệ số của biến unionyes là -0.86904 với giá trị p rất nhỏ (p = 0.000369), cho thấy sự khác biệt này là có ý nghĩa. Khi một người tham gia công đoàn, log odds để người đó là nữ giảm xuống 0.869 so với người không tham gia. Chuyển sang dạng odds ratio, ta có OR = exp(-0.86904) ≈ 0.419, nghĩa là khả năng là nữ trong nhóm tham gia công đoàn chỉ bằng khoảng 41.9% so với nhóm không tham gia. Mô hình hồi quy có dạng như sau:

\[ \log\left( \frac{P(\text{gender} = \text{"female"})}{1 - P(\text{gender} = \text{"female"})} \right) = -0.01827 -0.86904 \cdot \text{union} \]

Xét về mức độ phù hợp của mô hình, sai số log-likelihood của mô hình giảm từ 736.7 (Null Deviance) xuống 723.1 (Residual Deviance) sau khi đưa biến union vào. Mặc dù mức độ cải thiện không lớn, điều này cho thấy union vẫn có đóng góp nhất định trong việc giải thích biến phụ thuộc gender. Giá trị AIC là 727.1, có thể dùng làm cơ sở để so sánh với các mô hình mở rộng trong các phân tích tiếp theo.

Tóm lại, kết quả từ mô hình logit cho thấy có mối quan hệ tiêu cực giữa việc tham gia công đoàn và khả năng một cá nhân là nữ giới.

5.1.2 Việc kết hôn ảnh hưởng như thế nào đến việc tham gia công đoàn

Trong phần này, tác giả tiếp tục sử dụng mô hình hồi quy logistic nhị phân nhằm tìm hiểu xem việc kết hôn có ảnh hưởng như thế nào đến khả năng tham gia công đoàn của người lao động. Biến phụ thuộc trong mô hình là union, phản ánh tình trạng tham gia công đoàn (yes hoặc no), còn biến độc lập là married, thể hiện tình trạng hôn nhân.

Đầu tiên, biến union được chuyển thành biến nhân tố nhị phân với hai mức: no là giá trị tham chiếu (mặc định là 0) và yes là mức cần dự đoán (1). Điều này cho phép mô hình tập trung ước lượng xác suất một cá nhân có tham gia công đoàn dựa trên tình trạng hôn nhân.

Mô hình ước lượng: \[ \log \left( \frac{P(\text{union} = \text{"yes"})}{1 - P(\text{union} = \text{"yes"})} \right) = \beta_0 + \beta_1 \cdot \text{married} \]

k_cat$union <- factor(k_cat$union, levels = c('no','yes'))
reglogit2 <- glm(union~married, data = k_cat, family = binomial(link = 'logit'))
summary(reglogit2)
## 
## Call:
## glm(formula = union ~ married, family = binomial(link = "logit"), 
##     data = k_cat)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -1.8971     0.2189  -8.667   <2e-16 ***
## marriedM      0.5462     0.2557   2.136   0.0327 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 503.08  on 533  degrees of freedom
## Residual deviance: 498.25  on 532  degrees of freedom
## AIC: 502.25
## 
## Number of Fisher Scoring iterations: 4

\[ \text{Odds Ratio} = e^{0.5462} \approx 1.73 \] Kết quả ước lượng:

\[ \log\left( \frac{P(\text{union} = \text{"yes"})}{1 - P(\text{union} = \text{"yes"})} \right) = -1.8971 + 0.5462 \cdot \text{married} \]

Kết quả mô hình hồi quy logistic nhị phân cho thấy tình trạng hôn nhân có ảnh hưởng đến khả năng tham gia công đoàn của người lao động. Biến phụ thuộc là union đã được mã hóa dưới dạng nhị phân với mức tham chiếu là “no” (không tham gia), nhằm ước lượng xác suất một cá nhân có tham gia công đoàn (union = yes) dựa trên biến giải thích married (tình trạng hôn nhân). Hệ số hồi quy của marriedM (đã kết hôn) là 0.5462 với giá trị p = 0.0327 (< 0.05), cho thấy sự khác biệt là có ý nghĩa thống kê. Hệ số dương này cho thấy người đã kết hôn có khả năng tham gia công đoàn cao hơn so với người chưa kết hôn. Khi chuyển sang dạng odds ratio, ta có OR = exp(0.5462) ≈ 1.73, tức là người đã kết hôn có khả năng tham gia công đoàn cao hơn khoảng 1.73 lần so với người chưa kết hôn.

5.2 Mô hình Logit đa biến

Để đánh giá đồng thời ảnh hưởng của nhiều yếu tố đến xác suất một cá nhân là nữ, tác giả đã xây dựng mô hình hồi quy logistic nhị phân với biến phụ thuộc là gender (giới tính) và các biến độc lập bao gồm: union (tình trạng tham gia công đoàn), sector (ngành nghề), region (vùng miền), occupation (loại hình công việc), và married (tình trạng hôn nhân). Việc sử dụng mô hình hồi quy đa biến cho phép kiểm soát ảnh hưởng của từng biến khi xét đến các yếu tố còn lại, từ đó giúp hiểu rõ

reglogit_multi <- glm(factor(gender) ~ union+sector+region,
                      data = k_cat,
                      family = binomial(link = "logit"))
summary(reglogit_multi)
## 
## Call:
## glm(formula = factor(gender) ~ union + sector + region, family = binomial(link = "logit"), 
##     data = k_cat)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         -0.3754     0.2605  -1.441 0.149468    
## unionyes            -0.8226     0.2492  -3.301 0.000962 ***
## sectorconstruction  -1.8817     0.7710  -2.441 0.014657 *  
## sectorother          0.3971     0.2315   1.716 0.086245 .  
## regionother          0.1337     0.1984   0.674 0.500499    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 736.65  on 533  degrees of freedom
## Residual deviance: 704.58  on 529  degrees of freedom
## AIC: 714.58
## 
## Number of Fisher Scoring iterations: 4

\[ \log \left( \frac{P(\text{gender} = \text{"female"})}{1 - P(\text{gender} = \text{"female"})} \right) = -0.3754+ -0.8226 \cdot \text{unionyes} -1.8817 \cdot \text{sectorconstruction } \]

Dựa trên kết quả hồi quy từ mô hình Logit đa biến, ta nhận thấy rằng xác suất một cá nhân là nữ giới (giả định biến gender = 1 biểu thị giới tính nữ) chịu ảnh hưởng đáng kể từ ba nhóm biến: tình trạng tham gia công đoàn (union), ngành nghề (sector) và khu vực sinh sống (region). Cụ thể, hệ số chặn (Intercept) có giá trị âm (-0.3754), biểu thị logit (log-odds) của xác suất là nữ trong nhóm đối tượng tham chiếu, tức là những người không tham gia công đoàn, làm việc trong ngành dịch vụ (nhóm tham chiếu), và sống tại khu vực tham chiếu (có thể là thành thị hoặc miền Bắc, tùy cách mã hóa dữ liệu gốc).

Đáng chú ý, biến unionyes có hệ số âm khá lớn (-0.8226), cho thấy rằng những người tham gia công đoàn có xác suất là nữ thấp hơn đáng kể so với những người không tham gia công đoàn. Điều này có thể phản ánh xu hướng giới tính trong tổ chức công đoàn, nơi nam giới có thể chiếm ưu thế hơn do đặc thù ngành nghề hoặc vai trò đại diện.

Ngoài ra, ngành nghề cũng cho thấy ảnh hưởng mạnh mẽ đến xác suất là nữ. Cụ thể, người lao động trong ngành xây dựng (sectorconstruction) có hệ số âm rất lớn (-1.8817), chứng tỏ khả năng là nữ trong nhóm này giảm đáng kể so với nhóm làm việc trong ngành dịch vụ. Điều này phù hợp với thực tế khách quan, khi ngành xây dựng thường có tỷ lệ lao động nam chiếm đa số. Ngược lại, biến sectorother có hệ số dương nhẹ (0.3971), cho thấy người làm việc trong các ngành nghề còn lại có xu hướng là nữ cao hơn so với ngành dịch vụ, tuy nhiên mức độ ảnh hưởng không lớn và cần kiểm tra thêm ý nghĩa thống kê thông qua giá trị p-value.

Phần 6: Mô hình Probit

6.1 Mô hình Probit cho dữ liệu nhị phân

6.1.1 Tác động của việc tham gia công đoàn đến xác suất là nữ

Trong mô hình này, biến phụ thuộc gender là nhị phân, với “male” = 0 và “female” = 1, được giải thích bởi biến union – thể hiện việc cá nhân có tham gia công đoàn hay không. Mô hình được ước lượng bằng hồi quy Probit, với hàm liên kết là phân phối chuẩn tích lũy (cumulative normal distribution, ký hiệu là Φ(⋅))

Mô hình Probit như sau:

\[ P(\text{gender} = \text{"female"}) = \Phi(\beta_0 + \beta_1 \cdot \text{union}) \]

k_cat$gender <- factor(k_cat$gender, levels = c('male','female'))
regprobit <- glm(gender ~ union, data = k_cat, family = binomial(link = 'probit'))
regprobit
## 
## Call:  glm(formula = gender ~ union, family = binomial(link = "probit"), 
##     data = k_cat)
## 
## Coefficients:
## (Intercept)     unionyes  
##    -0.01145     -0.53708  
## 
## Degrees of Freedom: 533 Total (i.e. Null);  532 Residual
## Null Deviance:       736.7 
## Residual Deviance: 723.1     AIC: 727.1
  • Intercept = -0.01145:

Khi một người không tham gia công đoàn, xác suất họ là nữ được xác định bởi:

\[ \Phi(-0.01145) \approx 0.495 \]

Tức khoảng 49.5%.

  • unionyes = -0.53708:
    Khi một người tham gia công đoàn, biến union chuyển sang giá trị 1, nên biểu thức xác suất trở thành:

    \[ P(\text{female} \mid \text{union} = 1) = \Phi(-0.01145 - 0.53708) = \Phi(-0.5485) \approx 0.292 \]

    → Xác suất là nữ giảm còn khoảng 29.2% khi tham gia công đoàn.

Như vậy, kết quả từ mô hình Probit cho thấy phụ nữ có xu hướng ít tham gia công đoàn hơn nam giới, tương tự như kết quả thu được từ mô hình Logit trước đó. Sự khác biệt trong xác suất này phản ánh mối liên hệ tiêu cực giữa giới nữ và việc tham gia công đoàn trong bộ dữ liệu.

6.1.2 Tác động của tình trạng hôn nhân đến việc tham gia công đoàn

Trong phần này, ta sử dụng mô hình Probit nhị phân để phân tích mối quan hệ giữa tình trạng hôn nhân (married) và khả năng tham gia công đoàn (union). Biến phụ thuộc union được mã hóa là nhị phân với “no” = 0, “yes” = 1.

Mô hình Probit như sau:

\[ P(\text{union} = \text{"yes"}) = \Phi(\beta_0 + \beta_1 \cdot \text{married}) \]

k_cat$union <- factor(k_cat$union, levels = c('no','yes'))
regprobit2 <- glm(union ~ married, data = k_cat, family = binomial(link = 'probit'))
regprobit2
## 
## Call:  glm(formula = union ~ married, family = binomial(link = "probit"), 
##     data = k_cat)
## 
## Coefficients:
## (Intercept)     marriedM  
##      -1.124        0.303  
## 
## Degrees of Freedom: 533 Total (i.e. Null);  532 Residual
## Null Deviance:       503.1 
## Residual Deviance: 498.3     AIC: 502.3

Kết quả hồi quy từ mô hình Probit cho thấy hệ số chặn Intercept là -1.124, và hệ số của biến marriedM là 0.303. Đây là các hệ số trong phương trình xác suất có dạng:

\[ P(\text{union} = \text{"yes"}) = \Phi(\beta_0 + \beta_1 \cdot \text{married}) \]

trong đó \(\Phi\) là hàm phân phối tích lũy chuẩn hóa (CDF), dùng để chuyển tổ hợp tuyến tính thành xác suất.

Cụ thể, khi một người chưa kết hôn, giá trị tổ hợp tuyến tính là:

\[ \beta_0 = -1.124 \Rightarrow \Phi(-1.124) \approx 0.130 \]

Nghĩa là chỉ khoảng 13% những người chưa kết hôn tham gia công đoàn.

Ngược lại, đối với người đã kết hôn, ta có:

\[ \beta_0 + \beta_1 = -1.124 + 0.303 = -0.821 \Rightarrow \Phi(-0.821) \approx 0.206 \]

Kết quả này hàm ý rằng tình trạng hôn nhân có liên quan tích cực đến việc tham gia công đoàn. Có thể lý giải rằng những người đã kết hôn thường có xu hướng ổn định hơn về công việc, hoặc có nhu cầu bảo vệ quyền lợi lao động cao hơn, nên có động lực tham gia các tổ chức đại diện như công đoàn.

Về mặt thống kê, mô hình có mức độ phù hợp tương đối, với giá trị Null Deviance giảm từ 503.1 xuống Residual Deviance còn 498.3, và chỉ số AIC = 502.3. Mặc dù mô hình chỉ sử dụng một biến giải thích, nhưng kết quả vẫn cho thấy tình trạng hôn nhân là một yếu tố có ảnh hưởng đáng kể đến hành vi tham gia công đoàn.

6.2 Mô hình Probit đa biến

k_cat$gender <- factor(k_cat$gender, levels = c('male','female'))
regprobit3 <- glm(gender ~union+sector+region , data = k_cat, family = binomial(link = 'probit'))
summary(regprobit3)
## 
## Call:
## glm(formula = gender ~ union + sector + region, family = binomial(link = "probit"), 
##     data = k_cat)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -0.23403    0.16113  -1.452 0.146365    
## unionyes           -0.51237    0.15126  -3.387 0.000706 ***
## sectorconstruction -1.07738    0.39819  -2.706 0.006817 ** 
## sectorother         0.24727    0.14332   1.725 0.084468 .  
## regionother         0.08432    0.12302   0.685 0.493098    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 736.65  on 533  degrees of freedom
## Residual deviance: 704.39  on 529  degrees of freedom
## AIC: 714.39
## 
## Number of Fisher Scoring iterations: 4

Biến unionyes có hệ số âm và ý nghĩa thống kê mạnh (p < 0.001), cho thấy người lao động có tham gia công đoàn có xác suất là nữ thấp hơn đáng kể so với người không tham gia. Mặc dù mô hình Probit không cho phép diễn giải trực tiếp như odds ratio trong Logit, nhưng dấu âm rõ rệt và mức ý nghĩa thấp khẳng định ảnh hưởng tiêu cực của việc tham gia công đoàn đến khả năng là nữ.

Tương tự, làm việc trong ngành xây dựng (sectorconstruction) cũng có ảnh hưởng tiêu cực đến xác suất là nữ, với hệ số âm lớn (-1.07738) và ý nghĩa thống kê cao (p = 0.0068). Điều này phản ánh thực trạng ngành xây dựng chủ yếu do nam giới đảm nhận. Trong khi đó, biến sectorother (các ngành khác ngoài xây dựng và sản xuất) có hệ số dương, phản ánh xu hướng tích cực đối với nữ giới, tuy chỉ gần đạt ý nghĩa thống kê (p = 0.0845).

Biến regionother (khu vực sinh sống khác vùng chính) có hệ số dương rất nhỏ và p-value cao (p = 0.493), cho thấy không có sự khác biệt đáng kể về giới tính giữa các khu vực địa lý.

Phần 7: Các tiêu chi đánh giá mô hình

7.1 Chỉ số AIC

AIC(reglogit_multi)
## [1] 714.5758
AIC(regprobit3)
## [1] 714.3853

Mô hình probit có AIC nhỏ nhất (714.3853), cho thấy đây là mô hình phù hợp nhất trong ba mô hình được so sánh, theo tiêu chí AIC.

7.2 Hệ số Brier Score

BrierScore(reglogit_multi)
## [1] 0.2351281
BrierScore(regprobit3 )
## [1] 0.2351049

Kết quả đánh giá bằng chỉ số Brier Score cho thấy mô hình hồi quy logit có giá trị Brier là 0.2351281, trong khi mô hình probit có giá trị Brier thấp hơn một chút, là 0.2351049. Brier Score đo lường sai số trung bình bình phương giữa xác suất dự đoán và giá trị thực tế, với giá trị càng nhỏ thể hiện dự báo xác suất càng chính xác. Mặc dù sự chênh lệch giữa hai mô hình là rất nhỏ (0.0000232), nhưng kết quả này cho thấy mô hình probit có hiệu năng tốt hơn một cách nhẹ về mặt dự báo xác suất.

7.3 Ma trận nhầm lẫn

  • Ma trận nhầm lẫn của mô hình logit
actual1 <- ifelse(k_cat$gender == "female", 1, 0)
pred1 <- ifelse(predict(reglogit_multi, type = "response") >= 0.5, 1, 0)
conf_mat1 <- table(Predicted = pred1, Actual = actual1)
print(conf_mat1)
##          Actual
## Predicted   0   1
##         0 126  64
##         1 163 181
library(caret)
confusionMatrix(as.factor(pred1), as.factor(actual1), positive = "1")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 126  64
##          1 163 181
##                                           
##                Accuracy : 0.5749          
##                  95% CI : (0.5317, 0.6173)
##     No Information Rate : 0.5412          
##     P-Value [Acc > NIR] : 0.06405         
##                                           
##                   Kappa : 0.1695          
##                                           
##  Mcnemar's Test P-Value : 7.796e-11       
##                                           
##             Sensitivity : 0.7388          
##             Specificity : 0.4360          
##          Pos Pred Value : 0.5262          
##          Neg Pred Value : 0.6632          
##              Prevalence : 0.4588          
##          Detection Rate : 0.3390          
##    Detection Prevalence : 0.6442          
##       Balanced Accuracy : 0.5874          
##                                           
##        'Positive' Class : 1               
## 
  • Ma trận nhầm lẫn cưa mô hình probit
actual2 <- ifelse(k_cat$gender == "female", 1, 0)
pred2 <- ifelse(predict(regprobit3, type = "response") >= 0.5, 1, 0)
conf_mat2 <- table(Predicted = pred2, Actual = actual2)
print(conf_mat2)
##          Actual
## Predicted   0   1
##         0 126  64
##         1 163 181
confusionMatrix(as.factor(pred2), as.factor(actual2), positive = "1")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0 126  64
##          1 163 181
##                                           
##                Accuracy : 0.5749          
##                  95% CI : (0.5317, 0.6173)
##     No Information Rate : 0.5412          
##     P-Value [Acc > NIR] : 0.06405         
##                                           
##                   Kappa : 0.1695          
##                                           
##  Mcnemar's Test P-Value : 7.796e-11       
##                                           
##             Sensitivity : 0.7388          
##             Specificity : 0.4360          
##          Pos Pred Value : 0.5262          
##          Neg Pred Value : 0.6632          
##              Prevalence : 0.4588          
##          Detection Rate : 0.3390          
##    Detection Prevalence : 0.6442          
##       Balanced Accuracy : 0.5874          
##                                           
##        'Positive' Class : 1               
## 

Từ kết quả ma trận nhầm lẫn của hai mô hình hồi quy logit và probit, chúng tôi nhận thấy rằng cả hai mô hình đều cho kết quả dự đoán gần như tương đồng. Cụ thể, mô hình dự đoán đúng 181 trường hợp là nữ (True Positive) và 126 trường hợp là nam (True Negative), tuy nhiên vẫn còn 163 trường hợp là nam nhưng bị dự đoán nhầm là nữ (False Positive), và 64 trường hợp là nữ bị dự đoán nhầm là nam (False Negative). Tỷ lệ dự đoán đúng tổng thể (Accuracy) đạt 57,5%, cao hơn mức đoán mò (No Information Rate = 54,1%) nhưng chưa đạt ý nghĩa thống kê rõ ràng (p = 0,064). Mô hình có độ nhạy (Sensitivity) tương đối cao, đạt 73,9%, cho thấy khả năng nhận diện đúng nữ giới khá tốt. Tuy nhiên, độ đặc hiệu (Specificity) chỉ đạt 43,6%, phản ánh khả năng phân biệt đúng nam giới còn hạn chế. Giá trị Kappa chỉ ở mức 0,17, cho thấy mức độ đồng thuận giữa mô hình và thực tế còn thấp, trong khi kiểm định McNemar cho thấy có sự sai lệch đáng kể giữa hai nhóm dự đoán sai. Từ đó có thể kết luận rằng, mặc dù mô hình có khả năng nhận diện nhóm nữ tốt, hiệu quả phân loại tổng thể vẫn còn hạn chế và cần được cải thiện thêm, chẳng hạn bằng cách đưa thêm các biến giải thích khác hoặc điều chỉnh ngưỡng phân loại phù hợp hơn.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSBUdeG6p24gNiINCmF1dGhvcjogIlF14buzbmggSMawxqFuZyINCmRhdGU6ICIxNC0wNy0yMDI1Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlICANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpgYGANCg0KDQpgYGB7Y3NzLGVjaG8gPSBGQUxTRX0NCmgxIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMzJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQNCiAgfQ0KDQpoMiB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDI4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KIA0KfQ0KDQpoMyB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXN0eWxlOiBpdGFsaWM7DQp9DQoNCmg0IHtmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LXN0eWxlOiBpdGFsaWN9DQoNCmJvZHkgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICANCn0NCnA6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpIHsNCiAgdGV4dC1pbmRlbnQ6IDJlbTt9DQpwIHsNCiAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgfQ0KLnRvY2lmeS1oZWFkZXIgew0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KYGBgDQoNCiMgKipOaGnhu4dtIHbhu6UgNSoqDQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KbGlicmFyeShBRVIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCg0KIyMgKipQaOG6p24gMTpUw6xtIGhp4buDdSB2w6AgY2h14bqpbiBi4buLIGThu68gbGnhu4d1KioNCg0KIyMjICoqMS4xIEdp4bubaSB0aGnhu4d1IGLhu5kgZOG7ryBsaeG7h3UqKg0KDQpC4buZIGThu68gbGnhu4d1IENQUzE5ODUgKEN1cnJlbnQgUG9wdWxhdGlvbiBTdXJ2ZXkgMTk4NSkgbMOgIG3hu5l0IHThuq1wIGThu68gbGnhu4d1IMSRaeG7gXUgdHJhIGPDoSBuaMOibiDEkcaw4bujYyB0csOtY2ggeHXhuqV0IHThu6sgS2jhuqNvIHPDoXQgRMOibiBz4buRIEhp4buHbiBow6BuaCB04bqhaSBIb2EgS+G7sy4gROG7ryBsaeG7h3UgbsOgeSBjdW5nIGPhuqVwIHRow7RuZyB0aW4gduG7gSBt4bupYyBsxrDGoW5nIHRoZW8gZ2nhu50gY8O5bmcgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMOibiBraOG6qXUgaOG7jWMgdsOgIG5naOG7gSBuZ2hp4buHcCBj4bunYSA1MzQgY8OhIG5ow6JuIMSRYW5nIGzDoG0gdmnhu4djLCBiYW8gZ+G7k20gZ2nhu5tpIHTDrW5oLCBjaOG7p25nIHThu5ljLCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4sIGtpbmggbmdoaeG7h20sIHR14buVaSwgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCBuZ2jhu4EgbmdoaeG7h3AgdsOgIGtodSB24buxYyBsw6BtIHZp4buHYy4gDQoNCmBgYHtyfQ0KZGF0YSgiQ1BTMTk4NSIpDQprPC1DUFMxOTg1DQpkYXRhdGFibGUoayxvcHRpb25zID0gbGlzdChzY3JvbGxYID0gVFJVRSkpICNi4bqtdCBjdeG7mW4gbmdhbmcNCmBgYA0KDQpgYGB7cn0NCm5hbWVzKGspDQpgYGANCg0KKipC4buZIGThu68gbGnhu4d1IHbhu5tpIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgqKg0KIA0KVGEgdGjhu7FjIGhp4buHbiB04bqhbyAxIGRhdGFmcmFtZSBt4bubaSBjaOG7iSBjaOG7qWEgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCwgdGEgZ8OhbiBkYXRhIG3hu5tpIG7DoHkgdsOgbyBvYmplY3QgduG7m2kgdMOqbiBrX2NhdC4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjYXQ8LSBjKCJldGhuaWNpdHkiLCAicmVnaW9uIiwiZ2VuZGVyIiwgIm9jY3VwYXRpb24iLCAic2VjdG9yIiwidW5pb24iLCAibWFycmllZCIpDQprX2NhdDwta1ssIGNhdF0NCiMgVGhheSDEkeG7lWkgZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gYGNhcmRgdsOgIG93bmVyDQprX2NhdCRtYXJyaWVkIDwtIGRwbHlyOjpyZWNvZGUoa19jYXQkbWFycmllZCwgInllcyIgPSAiTSIgLCAibm8iID0gIlMiKQ0KZGF0YXRhYmxlKGtfY2F0LG9wdGlvbnMgPSBsaXN0KHNjcm9sbFggPSBUUlVFKSkNCmBgYA0KDQojIyMgKioxLjIgQ+G6pXUgdHLDumMgY+G7p2EgZOG7ryBsaeG7h3UqKiANCg0KxJDhu4MgY8OzIGPDoWkgbmjDrG4gdOG7lW5nIHF1YW4gduG7gSBj4bqldSB0csO6YyBj4bunYSBi4buZIGThu68gbGnhu4d1LCBiYW8gZ+G7k20gc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQsIHPhu5EgbMaw4bujbmcgYmnhur9uLCBraeG7g3UgZOG7ryBsaeG7h3UgY+G7p2EgdOG7q25nIGJp4bq/biB2w6AgbeG7mXQgc+G7kSBnacOhIHRy4buLIMSRaeG7g24gaMOsbmgsIHRhIHPhu60gZOG7pW5nIGjDoG0gc3RyKCkgbmjGsCBzYXU6DQoNCmBgYHtyfQ0Kc3RyKGspICND4bqldSB0csO6YyB0cm9uZyBk4buvIGxp4buHdQ0KYGBgDQoNClF1YSBr4bq/dCBxdeG6oyBj4bunYSBow6BtIHN0cigpLCB0YSB0aOG6pXkgYuG7mSBk4buvIGxp4buHdSB0cm9uZyBuZ2hpw6puIGPhu6l1IGzDoCBDUFMxOTg1IChDdXJyZW50IFBvcHVsYXRpb24gU3VydmV5IDE5ODUpLCBiYW8gZ+G7k20gdGjDtG5nIHRpbiBj4bunYSA1MzQgbmfGsOG7nWkgxJFhbmcgdGhhbSBnaWEgdGjhu4sgdHLGsOG7nW5nIGxhbyDEkeG7mW5nIHThuqFpIEhvYSBL4buzLiBE4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIG5o4bqxbSBt4bulYyDEkcOtY2gga2jhuqNvIHPDoXQgY8OhYyB54bq/dSB04buRIG5ow6JuIGto4bqpdSBo4buNYyB2w6Aga2luaCB04bq/IOKAkyB4w6MgaOG7mWkg4bqjbmggaMaw4bufbmcgxJHhur9uIHRodSBuaOG6rXAgY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcuIFThuq1wIGThu68gbGnhu4d1IGNo4bupYSB04buVbmcgY+G7mW5nIDExIGJp4bq/biwgYmFvIGfhu5NtIGPhuqMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgdsOgIGJp4bq/biDEkeG7i25oIHTDrW5oLCBj4bulIHRo4buDIG5oxrAgc2F1Og0KDQoqKkPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmc6KioNCg0KLSB3YWdlOiBN4bupYyBsxrDGoW5nIHRoZW8gZ2nhu50gY+G7p2EgY8OhIG5ow6JuICh0w61uaCBi4bqxbmcgxJHDtCBsYSBN4bu5KSwgbMOgIGJp4bq/biBt4bulYyB0acOqdSBxdWFuIHRy4buNbmcgdHJvbmcgbmdoacOqbiBj4bupdSB24buBIHRodSBuaOG6rXAuDQoNCi0gZWR1Y2F0aW9uOiBU4buVbmcgc+G7kSBuxINtIGjhu41jIGNow61uaCBxdXkgY+G7p2EgY8OhIG5ow6JuLCBwaOG6o24gw6FuaCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4uDQoNCi0gZXhwZXJpZW5jZTogU+G7kSBuxINtIGtpbmggbmdoaeG7h20gbMOgbSB2aeG7h2MuDQoNCi0gYWdlOiBUdeG7lWkgaGnhu4duIHThuqFpIGPhu6dhIGPDoSBuaMOibi4NCg0KKipDw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oOioqDQoNCi0gZXRobmljaXR5OiBDaOG7p25nIHThu5ljLCDEkcaw4bujYyBwaMOibiB0aMOgbmggYmEgbmjDs20gY2jDrW5oICh2w60gZOG7pTogImNhdWMiLCAiaGlzcGFuaWMiLCAib3RoZXIiKS4NCg0KLSByZWdpb246IEtodSB24buxYyBzaW5oIHPhu5FuZywgZ+G7k20gaGFpIG3hu6ljOiBtaeG7gW4gTmFtIChzb3V0aCkgdsOgIGPDoWMga2h1IHbhu7FjIGtow6FjIChvdGhlcikuDQoNCi0gZ2VuZGVyOiBHaeG7m2kgdMOtbmggY+G7p2EgY8OhIG5ow6JuLCBiYW8gZ+G7k20gbmFtIHbDoCBu4buvLg0KDQotIG9jY3VwYXRpb246IE5ow7NtIG5nw6BuaCBuZ2jhu4EgY2jDrW5oLCDEkcaw4bujYyBjaGlhIHRow6BuaCBzw6F1IGxv4bqhaSBraMOhYyBuaGF1Lg0KDQotIHNlY3RvcjogS2h1IHbhu7FjIGtpbmggdOG6vyBuxqFpIGPDoSBuaMOibiBsw6BtIHZp4buHYywgduG7m2kgYmEgbeG7qWMgbmjGsCBraHUgduG7sWMgc+G6o24geHXhuqV0LCBraHUgduG7sWMgY8O0bmcsIHbDoCBraHUgduG7sWMga2jDoWMuDQoNCi0gdW5pb246IFTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLCBjw7MgaGFpIG3hu6ljIGzDoCDigJxjw7PigJ0gdsOgIOKAnGtow7RuZ+KAnS4NCg0KLSBtYXJyaWVkOiBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4sIGfhu5NtIGhhaSBt4bupYyBsw6AgxJHhu5ljIHRow6JuIChTKSB2w6AgxJHDoyBr4bq/dCBow7RuIChNKS4NCg0KIyMjICoqMS4zIEhp4buDbiB0aOG7iyBt4buZdCB2w6BpIGTDsm5nIMSR4bqndSB2w6AgY3Xhu5FpIGPhu6dhIGThu68gbGnhu4d1KioNCg0KTmjhurFtIGPDsyDEkcaw4bujYyBjw6FpIG5ow7JuIHThu5VuZyBxdWFuIHbhu4EgYuG7mSBk4buvIGxp4buHdSB0YSBz4butIGThu6VuZyBow6BtIGhlYWQoKSB2w6AgdGFpZCgpIMSR4buDIHhlbSBt4buZdCBz4buRIGTDsm5nIMSR4bqndSB2w6AgZMOybmcgY3Xhu5FpIGPhu6dhIGLhu5kgZOG7ryBsaeG7h3UgQ3VycmVudCBQb3B1bGF0aW9uIFN1cnZleSAxOTg1OiANCg0KYGBge3J9DQpoZWFkKGspICNoaeG7g24gdGjhu4sgdsOgaSBkw7JuZyDEkeG6p3UNCmBgYA0KYGBge3J9DQp0YWlsKGspICNoaeG7g24gdGjhu4sgdsOgbyBkw7JuZyBjdeG7kWkgDQpgYGANCg0KIyMjICoqMS40IEtp4buDbSB0cmEgZ2nDoSB0cuG7iyB0aGnhur91KioNCiANCk5o4bqxbSDEkeG6o20gYuG6o28gY2jhuqV0IGzGsOG7o25nIGThu68gbGnhu4d1IHbDoCB0csOhbmggc2FpIGzhu4djaCB0cm9uZyBxdcOhIHRyw6xuaCBwaMOibiB0w61jaCwgdGEgY+G6p24ga2nhu4NtIHRyYSB4ZW0gYuG7mSBk4buvIGxp4buHdSBjw7MgY2jhu6lhIGdpw6EgdHLhu4sgdGhp4bq/dSAoTkEpIGhheSBraMO0bmcuIMSQaeG7gXUgbsOgeSBnacO6cCB4w6FjIMSR4buLbmggbGnhu4d1IGPDsyBj4bqnbiB44butIGzDvSBob+G6t2MgbMOgbSBz4bqhY2ggZOG7ryBsaeG7h3UgdHLGsOG7m2Mga2hpIHRp4bq/cCB04bulYyBwaMOibiB0w61jaDoNCg0KYGBge3J9DQppZiAoYW55KGlzLm5hKGspKSkgew0KICBjYXQoIkPDsyBnacOhIHRy4buLIHRoaeG6v3UgdHJvbmcgZOG7ryBsaeG7h3UuXG4iKQ0KfSBlbHNlIHsNCiAgY2F0KCJLaMO0bmcgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dSB0cm9uZyBk4buvIGxp4buHdS5cbiIpDQp9DQpgYGANCg0KVuG7m2kgxJFv4bqhbiBjb2RlIHRyw6puIG7hur91IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgY8OzIGLhuqV0IGvDrCBk4buvIGxp4buHdSBuw6BvIHRoaeG6v3UgdGjDrCBr4bq/dCBxdeG6oyBz4bq9IG5o4bqtbiDEkcaw4bujYyBsw6AgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dSB0cm9uZyBk4buvIGxp4buHdSB2w6AgbmfGsOG7o2MgbOG6oWkuIA0KDQpW4bubaSBi4buZIGThu68gbGnhu4d1IMSRxrDhu6NjIGfDoW4gY2hvICoqayoqIG5o4bqtbiDEkcaw4bujYyBr4bq/dCBxdeG6oyBsw6AgS2jDtG5nIGPDsyBnacOhIHRy4buLIHRoaeG6v3UgdHJvbmcgZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1ICBraMO0bmcgY8OzIMO0IHRy4buRbmcgaGF5IGdpw6EgdHLhu4sgYuG7iyB0aGnhur91IHRyb25nIHRvw6BuIGLhu5kgYuG7mSBk4buvIGxp4buHdS4gxJDDonkgbMOgIMSRaeG7gXUga2nhu4duIMSR4buDIHRp4bq/biBow6BuaCBjw6FjIHBow6JuIHTDrWNoIHRp4bq/cCB0aGVvIG3DoCBraMO0bmcgY+G6p24gdGjhu7FjIGhp4buHbiBixrDhu5tjIHjhu60gbMO9IGdpw6EgdHLhu4sgdGhp4bq/dS4NCg0KDQojIyAqKlBo4bqnbiAyOiBQaMOibiB0w61jaCBtw7QgdOG6oyBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oKioNCg0KIyMjICoqMi4xIEJp4bq/biBldGhuaWNpdHkqKg0KDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIGV0aG5pY2l0eSDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQoNCmBgYHtyfQ0KZXRobmljaXR5XzE8LXRhYmxlKGtfY2F0JGV0aG5pY2l0eSkNCmV0aG5pY2l0eV8xDQpgYGANCg0KYGBge3J9DQpldGhuaWNpdHlfMjwtdGFibGUoa19jYXQkZXRobmljaXR5KS9zdW0obnJvdyhrX2NhdCkpKjEwMCAjdOG6p24gc3XhuqV0DQpldGhuaWNpdHlfMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KYyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGtfY2F0JGV0aG5pY2l0eSkpICNjaHV54buDbiBr4bq/dCBxdeG6oyB0aMOgbmggYuG6o25nIGThu68gbGnhu4d1IChkYXRhLmZyYW1lKSB24bubaSAyIGPhu5l0DQpjb2xuYW1lcyhjKSA8LSBjKCJldGhuaWNpdHkiLCAiQ291bnQiKQ0KZ2dwbG90KGMsIGFlcyh4ID0gZXRobmljaXR5LCB5ID0gQ291bnQsIGZpbGwgPSBldGhuaWNpdHkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBjaOG7p25nIHThu5ljIiwgeCA9ICJDaOG7p25nIHThu5ljIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKyAgDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNhbnMiKSkNCmBgYA0KDQpgYGB7cn0NCnBpZShldGhuaWNpdHlfMiwNCmxhYmVscyA9IHBhc3RlKG5hbWVzKGV0aG5pY2l0eV8yKSwgcm91bmQoZXRobmljaXR5XzIsIDIpLCAiJSIpLA0KbWFpbiA9ICJU4bu3IGzhu4cgY2jhu6duZyB04buZYyIpDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBuaMOzbSBjaOG7p25nIHThu5ljIENhdWNhc2lhbiAobmfGsOG7nWkgZGEgdOG6r25nKSBjaGnhur9tIMawdSB0aOG6vyByw7UgcuG7h3QgduG7m2kgNDQwIG5nxrDhu51pIDgyLjQlIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgdHJvbmcgMyBuaMOzbS4gTmjDs20gb3RoZXIgxJHhu6luZyB0aOG7qSBoYWkgduG7m2kgNjcgbmfGsOG7nWksIHRyb25nIGtoaSBIaXNwYW5pYyAoTeG7uSBsYXRpbmgpIGNo4buJIGPDsyAyNyBuZ8aw4budaS4gU+G7sSBjaMOqbmggbOG7h2NoIG7DoHkgY2hvIHRo4bqleSBt4bqrdSBraOG6o28gc8OhdCBjw7MgeHUgaMaw4bubbmcgbmdoacOqbmcgbmhp4buBdSB24buBIG3hu5l0IG5ow7NtIGNo4bunbmcgdOG7mWMgbmjhuqV0IMSR4buLbmgsIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga+G6v3QgcXXhuqMgbmdoacOqbiBj4bupdSBu4bq/dSBt4bulYyB0acOqdSBsw6AgcGjhuqNuIMOhbmggc+G7sSDEkWEgZOG6oW5nIGNo4bunbmcgdOG7mWMuDQoNCiMjIyAqKjIuMiBCaeG6v24gcmVnaW9uKioNCg0KVGEgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biByZWdpb24gxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXUNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQoNCmBgYHtyfQ0KcmVnaW9uXzE8LXRhYmxlKGtfY2F0JHJlZ2lvbikNCnJlZ2lvbl8xDQpgYGANCg0KYGBge3J9DQpyZWdpb25fMjwtdGFibGUoa19jYXQkcmVnaW9uKS9zdW0obnJvdyhrX2NhdCkpKjEwMCAjdOG6p24gc3XhuqV0DQpyZWdpb25fMg0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1Kg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KcmVnaW9uXzEgPC0ga19jYXQgfD4NCiAgZ3JvdXBfYnkocmVnaW9uKSB8Pg0KICBzdW1tYXJpc2UoZnJlcSA9IG4oKSkgfD4NCiAgbXV0YXRlKHBlciA9IGZyZXEgLyBzdW0oZnJlcSksDQogICAgICAgICBsYWJlbCA9IHBhc3RlMChmcmVxLCAiICgiLCByb3VuZChwZXIgKiAxMDAsIDEpLCAiJSkiKSkNCg0KZ2dwbG90KHJlZ2lvbl8xICwgYWVzKHggPSAiIiwgeSA9IHBlciwgZmlsbCA9IHJlZ2lvbikpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIoInkiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQocGVyKjEwMCwgMiksICIlIikpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksDQogICAgICAgICAgICBzaXplID0gMi41KSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpICsgICMgQuG6oW4gY8OzIHRo4buDIGNo4buNbiBTZXQxLCBTZXQyLi4uDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIG5nxrDhu51pIHNpbmggc+G7kW5nIOG7nyBjw6FjIGtodSB24buxYyIsIGZpbGwgPSAiS2h1IHbhu7FjIikgKw0KICB0aGVtZV92b2lkKCkNCg0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KS+G6v3QgcXXhuqMgYmnhu4N1IMSR4buTIGNobyB0aOG6pXkgxJFhIHPhu5EgbmfGsOG7nWkgZMOibiBzaW5oIHPhu5FuZyB04bqhaSBjw6FjIGtodSB24buxYyBuZ2/DoGkgbWnhu4FuIE5hbSBjaGnhur9tIGtob+G6o25nIDcwLjc5JSwgdHJvbmcga2hpIGNo4buJIGPDsyAyOS4yMSUgY8awIHRyw7ogdOG6oWkga2h1IHbhu7FjIG1p4buBbiBOYW0uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBkw6JuIGPGsCB0cm9uZyBt4bqrdSBjw7MgcGjhuqduIG5naGnDqm5nIHbhu4EgY8OhYyB2w7luZyBuZ2/DoGkgbWnhu4FuIE5hbS4NCg0KIyMjICoqMi4zIEJp4bq/biBnZW5kZXIqKg0KDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIHJlZ2lvbiDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdQ0KDQoqVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0KiANCg0KYGBge3J9DQpnZW5kZXJfMTwtdGFibGUoa19jYXQkZ2VuZGVyKQ0KZ2VuZGVyXzENCmBgYA0KDQpgYGB7cn0NCmdlbmRlcl8yPC10YWJsZShrX2NhdCRnZW5kZXIpL3N1bShucm93KGtfY2F0KSkqMTAwICN04bqnbiBzdeG6pXQNCmdlbmRlcl8yDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpjb2xzIDwtIGMoImxpZ2h0Ymx1ZSIsImxpZ2h0cGluayIpDQojIE5ow6NuIHBo4bqnbiB0csSDbQ0KZ2VuZGVyXzJiZDwtIHBhc3RlMCggcm91bmQoZ2VuZGVyXzIsIDIpLCAiJSIpDQojIFbhur0gcGllIA0KcGllKA0KICBnZW5kZXJfMiAsDQogIGxhYmVscyA9IE5BLA0KICBtYWluICAgPSAiVOG6p24gc3XhuqV0IGJp4bq/biBnaeG7m2kgdMOtbmgiLA0KICBjb2wgICAgPSBjb2xzLA0KICBib3JkZXIgPSAid2hpdGUiKQ0KDQojIFRow6ptIGxlZ2VuZA0KbGVnZW5kKA0KICB4ICAgICAgPSJ0b3ByaWdodCIsDQogIGxlZ2VuZCA9IHBhc3RlKG5hbWVzKGdlbmRlcl8yICksZ2VuZGVyXzJiZCksDQogIGZpbGwgICA9IGNvbHMsDQogICkNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkThu7FhIHbDoG8ga+G6v3QgcXXhuqMga2jhuqNvIHPDoXQgdHLDqm4gY2hvIHRo4bqleSB0cm9uZyBz4buRIG5o4buvbmcgbmfGsOG7nWkga2jhuqNvIHPDoXQgY8OzIDI4OSBuZ8aw4budaSBsw6AgbmFtIGdp4bubaSBjaGnhur9tIDU0LjEyJSB2w6AgMjQ1IG5nxrDhu51pIGzDoCBu4buvIGdp4bubaSBjaGnhur9tIDQ1Ljg4JS4gUXVhIGvhur90IHF14bqjIMSRw7MgdGEgdGjhuqV5IGdp4bubaSB0w61uaCBj4bunYSBuaOG7r25nIGto4bqjbyBzw6F0IGtow7RuZyBjw7Mgc+G7sSBjaMOqbmggbOG7h2NoIHF1w6Egbmhp4buBdS4NCg0KIyMjICoqMi40IEJp4bq/biBvY2N1cGF0aW9uKioNCg0KVGEgdGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBvY2N1cGF0aW9uIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1DQoNCipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQqIA0KDQpgYGB7cn0NCm9jY3VwYXRpb25fMTwtdGFibGUoa19jYXQkb2NjdXBhdGlvbikNCm9jY3VwYXRpb25fMQ0KYGBgDQoNCmBgYHtyfQ0Kb2NjdXBhdGlvbl8yPC10YWJsZShrX2NhdCRvY2N1cGF0aW9uKS9zdW0obnJvdyhrX2NhdCkpKjEwMCAjdOG6p24gc3XhuqV0DQpvY2N1cGF0aW9uXzINCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSoNCg0KYGBge3J9DQpjMyA8LSBhcy5kYXRhLmZyYW1lKG9jY3VwYXRpb25fMSkNCmNvbG5hbWVzKGMzKSA8LSBjKCJvY2N1cGF0aW9uIiwgIkNvdW50IikNCg0KZ2dwbG90KGMzLCBhZXMoeCA9IG9jY3VwYXRpb24sIHkgPSBDb3VudCwgZmlsbCA9IG9jY3VwYXRpb24pKSArDQogIGdlb21fY29sKGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeCA9ICJOZ8Ogbmggbmdo4buBIiwgeSA9ICJU4bqnbiBz4buRIiwgdGl0bGUgPSAiQ8OhYyBuZ8Ogbmggbmdo4buBIGto4bqjbyBzw6F0IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBuaMOzbSBjw7RuZyBuaMOibiAod29ya2VyKSBjaGnhur9tIHThu7cgbOG7hyBs4bubbiBuaOG6pXQgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgY2hp4bq/bSBraG/huqNuZyAyOCwzMyUsIHRoZW8gc2F1IGzDoCBuaMOzbSBr4bu5IHRodeG6rXQgKHRlY2huaWNhbCkgdsOgIHbEg24gcGjDsm5nIChvZmZpY2UpIHbhu5tpIGzhuqduIGzGsOG7o3QgMTksMDYlIHbDoCAxNyw2MSUuIFRyb25nIGtoaSDEkcOzLCBuaMOzbSBiw6FuIGjDoG5nIChzYWxlcykgY8OzIHPhu5EgbMaw4bujbmcgdGjhuqVwIG5o4bqldCwgY2jhu4kgY2hp4bq/bSA2LDkwJS4gU+G7sSBwaMOibiBi4buRIG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgbeG6q3Uga2jhuqNvIHPDoXQgY8OzIHh1IGjGsOG7m25nIG5naGnDqm5nIHbhu4EgY8OhYyBuZ8OgbmggbGFvIMSR4buZbmcgY2jDom4gdGF5IHbDoCBr4bu5IHRodeG6rXQuIA0KDQojIyMgKioyLjUgQmnhur9uIHNlY3RvcioqDQoNClRhIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gc2VjdG9yIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1DQoNCipUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQqIA0KDQpgYGB7cn0NCnNlY3Rvcl8xPC10YWJsZShrX2NhdCRzZWN0b3IpDQpzZWN0b3JfMQ0KYGBgDQpgYGB7cn0NCnNlY3Rvcl8yPC10YWJsZShrX2NhdCRzZWN0b3IpL3N1bShucm93KGtfY2F0KSkqMTAwICN04bqnbiBzdeG6pXQNCnNlY3Rvcl8yDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpjb2xzIDwtIGMoImxpZ2h0Ymx1ZSIsImxpZ2h0cGluayIsICJsaWdodGdyZWVuIikNCiMgTmjDo24gcGjhuqduIHRyxINtDQpzZWN0b3JfMmJkPC0gcGFzdGUwKCByb3VuZChzZWN0b3JfMiwgMiksICIlIikNCiMgVuG6vSBwaWUgY2hhcnQg4bqpbiBuaMOjbg0KcGllKA0KICBzZWN0b3JfMiwNCiAgbGFiZWxzID0gTkEsDQogIG1haW4gICA9ICJU4bqnbiBzdeG6pXQgYmnhur9uIGdp4bubaSB0w61uaCIsDQogIGNvbCAgICA9IGNvbHMsDQogIGJvcmRlciA9ICJ3aGl0ZSIpDQoNCiMgVGjDqm0gbGVnZW5kIGLDqm4gbmdvw6BpDQpsZWdlbmQoDQogIHggICAgICA9InRvcHJpZ2h0IiwNCiAgbGVnZW5kID0gcGFzdGUobmFtZXMoc2VjdG9yXzIpLHNlY3Rvcl8yYmQpLA0KICBmaWxsICAgPSBjb2xzLA0KICApDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBsw6BtIHZp4buHYyB0cm9uZyBraHUgduG7sWMga2jDoWMgKGNoaeG6v20ga2hv4bqjbmcgNzYsOTclKSwgdHJvbmcga2hpIGNo4buJIGPDsyAxOCw1NCUgdGh14buZYyBraHUgduG7sWMgc+G6o24geHXhuqV0IHbDoCA0LDQ5JSBsw6BtIHZp4buHYyB0cm9uZyBuZ8OgbmggeMOieSBk4buxbmcuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG3huqt1IGto4bqjbyBzw6F0IHThuq1wIHRydW5nIGNo4bunIHnhur91IHbDoG8gY8OhYyDEkeG7kWkgdMaw4bujbmcga2jDtG5nIGzDoG0gdmnhu4djIHRyb25nIGzEqW5oIHbhu7FjIGPDtG5nIG5naGnhu4dwIGhheSB4w6J5IGThu7FuZy4NCg0KIyMjICoqMi42IEJp4bq/biB1bmlvbioqDQoNClRhIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gdW5pb24gxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXUNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQoNCmBgYHtyfQ0KdW5pb25fMTwtdGFibGUoa19jYXQkdW5pb24pDQp1bmlvbl8xDQpgYGANCmBgYHtyfQ0KdW5pb25fMjwtdGFibGUoa19jYXQkdW5pb24pL3N1bShucm93KGtfY2F0KSkqMTAwICN04bqnbiBzdeG6pXQNCnVuaW9uXzINCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmNvbHMgPC0gYygibGlnaHRibHVlIiwibGlnaHRwaW5rIikNCiMgTmjDo24gcGjhuqduIHRyxINtDQp1bmlvbl8yYmQ8LSBwYXN0ZTAoIHJvdW5kKHVuaW9uXzIsIDIpLCAiJSIpDQojIFbhur0gcGllIGNoYXJ0IOG6qW4gbmjDo24NCnBpZSgNCiAgdW5pb25fMiAsDQogIGxhYmVscyA9IE5BLA0KICBtYWluICAgPSAiVOG6p24gc3XhuqV0IHRoYW0gZ2lhIGhv4bq3YyBraMO0bmcgZ2lhIGPDtG5nIMSRb8OgbiIsDQogIGNvbCAgICA9IGNvbHMsDQogIGJvcmRlciA9ICJ3aGl0ZSIpDQoNCiMgVGjDqm0gbGVnZW5kIGLDqm4gbmdvw6BpDQpsZWdlbmQoDQogIHggICAgICA9InRvcHJpZ2h0IiwNCiAgbGVnZW5kID0gcGFzdGUobmFtZXModW5pb25fMiksdW5pb25fMmJkKSwNCiAgZmlsbCAgID0gY29scywNCiAgKQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyB0csOqbiB0YSBuaOG6rW4gdGjhuqV5IHPhu5EgbmfGsOG7nWkgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNo4buJIGNoaeG7g20gMTcuOTglIHRyb25nIGtoaSDEkcOzIHPhu5EgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjaGnhur9tIHThu7cgbOG7hyBs4bubbiB24bubaSA4Mi4wMiUuIFF1YSBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXkgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBxdcOhIGzhu5tuIGdp4buvYSAyIHRyYW5nIHRow6FpLg0KDQojIyMgKioyLjcgQmnhur9uIG1hcnJpZWQqKg0KDQpUYSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCBjaG8gYmnhur9uIG1hcnJpZWQgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBzYXUNCg0KKlRo4buRbmcga8OqIHThuqduIHN14bqldCogDQoNCmBgYHtyfQ0KbWFycmllZF8xPC10YWJsZShrX2NhdCRtYXJyaWVkKQ0KbWFycmllZF8xDQpgYGANCmBgYHtyfQ0KbWFycmllZF8yPC10YWJsZShrX2NhdCRtYXJyaWVkKS9zdW0obnJvdyhrX2NhdCkpKjEwMCAjdOG6p24gc3XhuqV0DQptYXJyaWVkXzINCmBgYA0KDQoqVHLhu7FjIHF1YW4gaMOzYSBk4buvIGxp4buHdSoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmNvbHMgPC0gYygibGlnaHRibHVlIiwibGlnaHRwaW5rIikNCiMgTmjDo24gcGjhuqduIHRyxINtDQptYXJyaWVkXzJiZDwtIHBhc3RlMCggcm91bmQobWFycmllZF8yLCAyKSwgIiUiKQ0KIyBW4bq9IHBpZSBjaGFydCDhuqluIG5ow6NuDQpwaWUoDQogIG1hcnJpZWRfMiwNCiAgbGFiZWxzID0gTkEsDQogIG1haW4gICA9ICJU4bu3IGzhu4cgdMOsbmggdHLhuqFuZyBr4bq/dCBow7RuIGPhu6dhIG5nxrDhu51pIGTDom4iLA0KICBjb2wgICAgPSBjb2xzLA0KICBib3JkZXIgPSAid2hpdGUiKQ0KDQojIFRow6ptIGxlZ2VuZCBiw6puIG5nb8OgaQ0KbGVnZW5kKA0KICB4ICAgICAgPSJ0b3ByaWdodCIsDQogIGxlZ2VuZCA9IHBhc3RlKG5hbWVzKG1hcnJpZWRfMiksbWFycmllZF8yYmQpLA0KICBmaWxsICAgPSBjb2xzLA0KICApDQpgYGANCg0KKk5o4bqtbiB4w6l0Kg0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBuZ8aw4budaSBkw6JuIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IMSRw6Mga+G6v3QgaMO0biwgY2hp4bq/bSBraG/huqNuZyA2NSw1NCUsIHRyb25nIGtoaSB04bu3IGzhu4cgbmfGsOG7nWkgxJHhu5ljIHRow6JuIGzDoCAzNCw0NiUuIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBy4bqxbmcgxJFhIHPhu5EgbmfGsOG7nWkgxJHGsOG7o2Mga2jhuqNvIHPDoXQgxJFhbmcgc+G7kW5nIHRyb25nIGPDoWMgbeG7kWkgcXVhbiBo4buHIGjDtG4gbmjDom4gY2jDrW5oIHRo4bupYy4gDQoNCiMjICoqUGjhuqduIDM6IFBow6JuIHTDrWNoIHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgYmnhur9uIGzDqm4gdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pKioNCg0KIyMjICoqMy4xIEJp4bq/biB1bmlvbiB2w6AgZ2VuZGVyKioNCg0KIyMjIyAqKjMuMS4xIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoNCg0KYGBge3J9DQpiMTwtIHRhYmxlKGtfY2F0JHVuaW9uLGtfY2F0JGdlbmRlcikNCmFkZG1hcmdpbnMoYjEpIA0KYGBgDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKg0KDQpgYGB7cn0NCnByb3AudGFibGUoYjEsIG1hcmdpbiA9IDEpDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EqDQogDQpgYGB7cn0NCiMgQ2h1eeG7g24gc2FuZyBkYXRhIGZyYW1lDQpiMV9kZiA8LSBhcy5kYXRhLmZyYW1lKGIxKQ0KY29sbmFtZXMoYjFfZGYpIDwtIGMoInVuaW9uIiwgImdlbmRlciIsICJGcmVxdWVuY3kiKQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB04burIGLhuqNuZyB04bqnbiBzdeG6pXQNCmdncGxvdChiMV9kZiwgYWVzKHggPSB1bmlvbiwgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9IGdlbmRlcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgZ2nhu69hIHVuaW9uIHbDoCBnZW5kZXIiLA0KICAgIHggPSAidW5pb24iLA0KICAgIHkgPSAiVOG6p24gc3XhuqV0Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBU4bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbiA9ICJ5ZXMiKSB0aOG6pXAgaMahbiByw7UgcuG7h3Qgc28gduG7m2kga2jDtG5nIHRoYW0gZ2lhICh1bmlvbiA9ICJubyIpIOG7nyBj4bqjIG5hbSB2w6AgbuG7ry4gQ+G7pSB0aOG7gywgdOG7lW5nIHPhu5EgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6AgNDM4IG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIDgyJSB04buVbmcgdGjhu4MgKDQzOC81MzQpLCB0cm9uZyBraGkgY2jhu4kgY8OzIDk2IG5nxrDhu51pIHRoYW0gZ2lhIHTGsMahbmcgxJHGsMahbmcga2hv4bqjbmcgMTglLiBUcm9uZyBuaMOzbSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4sIG5hbSBnaeG7m2kgY2hp4bq/bSB04bu3IGzhu4cgdsaw4bujdCB0cuG7mWkgduG7m2kgNjggbmfGsOG7nWkgKDcwLjglKSwgY8OybiBu4buvIGdp4bubaSBjaOG7iSBjaGnhur9tIDI4IG5nxrDhu51pICgyOS4yJSksIGNobyB0aOG6pXkgbmFtIGdp4bubaSBjw7MgeHUgaMaw4bubbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG7hu68gZ2nhu5tpLiBOZ8aw4bujYyBs4bqhaSwgdHJvbmcgbmjDs20ga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgdOG7tyBs4buHIG5hbSB2w6AgbuG7ryBn4bqnbiBuaMawIGLhurFuZyBuaGF1LCBs4bqnbiBsxrDhu6N0IGzDoCA1MC41JSB2w6AgNDkuNSUsIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSBnaeG7m2kgdMOtbmggdHJvbmcgbmjDs20ga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4NCg0KDQojIyMjICoqMy4xLjIgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykqKg0KDQrEkOG7gyDEkcOhbmggZ2nDoSB4ZW0gY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgaGFpIGJp4bq/biBwaMOibiBsb+G6oWkgbMOgIHVuaW9uIHbDoCBnZW5kZXIgaGF5IGtow7RuZywgc+G6vSBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKENoaS1zcXVhcmUgdGVzdCkuIA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmgNCmNoaXNxX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGIxKQ0KIyBJbiBr4bq/dCBxdeG6ow0KY2hpc3FfcmVzdWx0DQpgYGANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e0Jp4bq/biB1bmlvbiB2w6AgYmnhur9uIGdlbmRlciBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hy59ICBcXFxcDQpIXzE6ICYgXHRleHR7Qmnhur9uIHVuaW9uIHbDoCBiaeG6v24gZ2VuZGVyIGPDsyBt4buRaSBxdWFuIGjhu4cufSBcDQpcZW5ke2FycmF5fQ0KXHJpZ2h0Lg0KJCQNCg0KKk5o4bqtbiB4w6l0KjogS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6IFbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1LCB2w6wgcC12YWx1ZSA9IDAuMDAwNDM4OCA8IDAuMDUsIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJC4gVuG6rXkgIGdp4buvYSBiaeG6v24gdW5pb24gdsOgIGJp4bq/biBnZW5kZXIgdOG7k24gdOG6oWkgbeG7kWkgcXVhbiBo4buHLg0KDQojIyMjICoqMy4xLjMgUmVsYXRpdmUgcmlzayoqDQoNCk5o4bqxbSBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uLCBjaMO6bmcgdGEgc+G7rSBk4bulbmcgY2jhu4kgc+G7kSBSZWxhdGl2ZSBSaXNrIChSUikgxJHhu4MgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHLhu6dpIHJvIGhv4bq3YyBraOG6oyBuxINuZyB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbi4NCg0KKlRIMTogS2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6AgYmnhur9uIHRoYW0gY2hp4bq/dSoNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpycjE8LSByaXNrcmF0aW8oYjEpDQpycjENCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrIChSUikgZ2nhu69hIHTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbikgdsOgIGdp4bubaSB0w61uaCAoZ2VuZGVyKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIHbDoCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBD4bulIHRo4buDLCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSB24bubaSBSUiA9IDEuMDAsIHRyb25nIGtoaSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPDsyBSUiA9IDAuNTg4NyB04bupYyBsw6AgdOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbuG7ryBjaOG7iSBi4bqxbmcga2hv4bqjbmcgNTguODclIHNvIHThu7cgbOG7hyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGPhu6dhIFJSIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMC40MjUwIMSR4bq/biAwLjgxNTQsIGtow7RuZyBiYW8gZ+G7k20gMSwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIEPDoWMga2nhu4NtIMSR4buLbmggxJFpIGvDqG0gbmjGsCBraeG7g20gxJHhu4tuaCBtaWQtcCBleGFjdCwgRmlzaGVy4oCZcyBleGFjdCB2w6AgQ2hpLXNxdWFyZSDEkeG7gXUgY2hvIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDAxKSwgY+G7p25nIGPhu5EgdGjDqm0gYuG6sW5nIGNo4bupbmcgcuG6sW5nIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBnaeG7r2EgbmFtIHbDoCBu4buvLg0KDQoqVEgyOiBUaGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGJp4bq/biB0aGFtIGNoaeG6v3UqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcnIxcjwtIHJpc2tyYXRpbyhiMSwgcmV2PSJyIikNCnJyMXINCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBL4bq/dCBxdcOhIFJlbGF0aWV2IFJpc2sgKFJSKSBnaeG7ryB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pIHbDoCBnaeG7m2kgdMOtbmggKGdlbmRlcikgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgZ2nhu69hIHZp4buHYyB0aGFtIGdpYSB2w6Aga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gQ+G7pSB0aOG7gywgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIGNo4buNbiBsw6BtIGJp4bq/biB0aGFtIGNoaeG6v3UgduG7m2kgUlI9MSwgdHJvbmcga2hpIHZp4buHYyBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuY29zIFJSID0gMS42OTg2MyB04bupYyBsw6AgdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkcOyYSDhu58gbuG7ryBjYW8gaMahbiA2OSw4NiUgdOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbuG7ry4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBj4bunYSBSUiBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDEuMjI2IMSR4bq/biAyLjM1My4gQ8OhYyBraeG7g20gxJHhu4tuaCDEkWkga8OobSBuaMawIG1pZC1wIGV4YWN0LCBGaXNoZXLigJlzIGV4YWN0IHbDoCBDaGktc3F1YXJlIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIDwgMC4wMDUsIGPhu6duZyBj4buRIGLhurFuZyBjaOG7qW5nIHLhurFuZyB04bu3IGzhu4cga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbuG7ryBnaeG7m2kgY2FvIGjGoW4gcsO1IHLhu4d0Lg0KDQojIyMjICoqMy4xLjQgT2RkIHJhdGlvKioNCg0KYGBge3J9DQpvcjEgPC0gb2Rkc3JhdGlvKGIxKQ0Kb3IxDQpgYGANCg0KKk5o4bqtbiB4w6l0KjogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY2hvIHRo4bqleSBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG7hu68gdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmFtIGdp4bubaS4gVOG7tyBz4buRIGNow6puaCAoT2RkcyBSYXRpbyDigJMgT1IpIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBsw6AgMC40MjEzLCBuZ2jEqWEgbMOgIHjDoWMgc3XhuqV0IHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbuG7ryBnaeG7m2kgY2jhu4kgYuG6sW5nIGtob+G6o25nIDQyLjElIHNvIHbhu5tpIHjDoWMgc3XhuqV0IGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG7hu68sIGhheSBuw7NpIGPDoWNoIGtow6FjIG7hu68gZ2nhu5tpIMOtdCBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGjGoW4uIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY+G7p2EgT1IgbuG6sW0gdHJvbmcga2hv4bqjbmcgWzAuMjU3MzsgMC42NzM4XSxjw6FjIGtp4buDbSDEkeG7i25oIMSRaSBrw6htIG5oxrAgbWlkLXAgZXhhY3QsIEZpc2hlcuKAmXMgZXhhY3QgdsOgIENoaS1zcXVhcmUgxJHhu4F1IGNobyBwLXZhbHVlIDwgMC4wMDEsIGNo4bupbmcgbWluaCBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gDQoNCiMjIyAqKjMuMiBCaeG6v24gdW5pb24gdsOgIG9jY3VwYXRpb24qKg0KDQojIyMjICoqMy4yLjEgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKg0KDQpgYGB7cn0NCmIyPC0gdGFibGUoa19jYXQkdW5pb24sa19jYXQkb2NjdXBhdGlvbikNCmFkZG1hcmdpbnMoYjIpIA0KYGBgDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKg0KDQpgYGB7cn0NCnByb3AudGFibGUoYjIsIG1hcmdpbiA9IDEpDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EqDQogDQpgYGB7cn0NCiMgQ2h1eeG7g24gc2FuZyBkYXRhIGZyYW1lDQpiMl9kZiA8LSBhcy5kYXRhLmZyYW1lKGIyKQ0KY29sbmFtZXMoYjJfZGYpIDwtIGMoInVuaW9uIiwgIm9jY3VwYXRpb24iLCAiRnJlcXVlbmN5IikNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdOG7qyBi4bqjbmcgdOG6p24gc3XhuqV0DQpnZ3Bsb3QoYjJfZGYsIGFlcyh4ID0gdW5pb24sIHkgPSBGcmVxdWVuY3ksIGZpbGwgPSBvY2N1cGF0aW9uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCBnaeG7r2EgdW5pb24gdsOgIG9jY3VwYXRpb24iLA0KICAgIHggPSAidW5pb24iLA0KICAgIHkgPSAiVOG6p24gc3XhuqV0Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThuqduIHN14bqldCBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pIHbDoCBjw6FjIG5ow7NtIG5naOG7gSBuZ2hp4buHcCAob2NjdXBhdGlvbikgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgZ2nhu69hIGPDoWMgbmjDs20uIE5ow6xuIGNodW5nLCB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBuaOG6pXQgdGh14buZYyB24buBIG5ow7NtIGxhbyDEkeG7mW5nIHBo4buVIHRow7RuZyAod29ya2VyKSB24bubaSBraG/huqNuZyAyOCwyJSwgdGnhur9wIHRoZW8gbMOgIHRlY2huaWNhbCAoMjEsOSUpIHbDoCBzZXJ2aWNlcyAoMjAsNSUpLiBOZ8aw4bujYyBs4bqhaSwgY8OhYyBuaMOzbSBuaMawIG9mZmljZSwgbWFuYWdlbWVudCB2w6Agc2FsZXMgY8OzIHThu7cgbOG7hyB0aGFtIGdpYSBy4bqldCB0aOG6pXAsIGzhuqduIGzGsOG7o3Qga2hv4bqjbmcgOCwyJSwgNSw1JSB2w6AgY2jhu4kgMiw2JS4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHh1IGjGsOG7m25nIG5o4buvbmcgbmfGsOG7nWkgbMOgbSBjw6FjIGPDtG5nIHZp4buHYyB0YXkgY2jDom4gaG/hurdjIGvhu7kgdGh14bqtdCB0aMaw4budbmcgxJHhu5FpIG3hurd0IHbhu5tpIMSRaeG7gXUga2nhu4duIGxhbyDEkeG7mW5nIGtow7Mga2jEg24gaMahbiBuw6puIGPDsyBuaHUgY+G6p3UgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSR4buDIGLhuqNvIHbhu4cgcXV54buBbiBs4bujaS4NCg0KIyMjIyAqKjMuMi4yIEtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcpKioNCg0KxJDhu4MgxJHDoW5oIGdpw6EgeGVtIGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGhhaSBiaeG6v24gcGjDom4gbG/huqFpIGzDoCB1bmlvbiB2w6Agb2NjdXBhdGlvbiBoYXkga2jDtG5nLCBz4bq9IHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAoQ2hpLXNxdWFyZSB0ZXN0KS4gDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaA0KY2hpc3FfcmVzdWx0IDwtIGNoaXNxLnRlc3QoYjIpDQojIEluIGvhur90IHF14bqjDQpjaGlzcV9yZXN1bHQNCmBgYA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bGx9DQpIXzA6ICYgXHRleHR7Qmnhur9uIHVuaW9uIHbDoCBiaeG6v24gb2NjdXBhdGlvbiBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hy59ICBcXFxcDQpIXzE6ICYgXHRleHR7Qmnhur9uIHVuaW9uIHbDoCBiaeG6v24gb2NjdXBhdGlvbiBjw7MgbeG7kWkgcXVhbiBo4buHLn0gXA0KXGVuZHthcnJheX0NClxyaWdodC4NCiQkDQoNCipOaOG6rW4geMOpdCo6IEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOiBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgdsOsIHAtdmFsdWUgPSAxLjA5MWUtMDUgPCAwLjA1LCBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuIFbhuq15ICBnaeG7r2EgYmnhur9uIHVuaW9uIHbDoCBiaeG6v24gb2NjdXBhdGlvbiB04buTbiB04bqhaSBt4buRaSBxdWFuIGjhu4cuDQogDQojIyMjICoqMy4yLjMgUmVsYXRpdmUgcmlzayoqDQoNCk5o4bqxbSBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uLCBjaMO6bmcgdGEgc+G7rSBk4bulbmcgY2jhu4kgc+G7kSBSZWxhdGl2ZSBSaXNrIChSUikgxJHhu4MgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHLhu6dpIHJvIGhv4bq3YyBraOG6oyBuxINuZyB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbi4NCg0KYGBge3J9DQpwcm9wLnRhYmxlKGIyLCBtYXJnaW4gPSAxKQ0KYGBgDQoNCkvhur90IGjhu6NwIGThu68gbGnhu4d1IG5ow7NtIG5nw6BuaCBuZ2jhu4EgdGjDoG5oIGhhaSBuaMOzbSBjaMOtbmg6IG5ow7NtIGPDtG5nIG5ow6JuICh3b3JrZXIpIHbDoCBuaMOzbSBvdGhlciBiYW8gZ+G7k20gdGVjaG5pY2FsLCBzZXJ2aWNlcywgb2ZmaWNlIHbDoCBtYW5hZ2VtZW50Lg0KDQpgYGB7cn0NCmIyX25ldyA8LSBjYmluZCggICAjIGvhur90IGjhu6NwIGhhaSBj4buZdCBuw6B5IHRow6BuaCBt4buZdCBi4bqjbmcgZOG7ryBsaeG7h3UgbeG7m2kgZ+G7jWkgbMOgIGs0X25ldy4NCiAgd29ya2VyID0gYjJbLCAid29ya2VyIl0sICAjbOG6pXkgZOG7ryBsaeG7h3UgY+G7mXQgImNhdWMiIHThu6sgYuG6o25nIGs0DQogIG90aGVyID0gYjJbLCAidGVjaG5pY2FsIl0gKyBiMlssICJzZXJ2aWNlcyJdK2IyWywgIm9mZmljZSJdICtiMlssICJzYWxlcyJdICsgYjJbLCAibWFuYWdlbWVudCJdIyBj4buZbmcgZOG7ryBsaeG7h3UgaGFpIGPhu5l0ICJoaXNwYW5pYyIgdsOgICJvdGhlciIgdOG7qyBi4bqjbmcgazQuDQopDQpiMl9uZXcNCmBgYA0KDQoqVEgxOiBLaMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGzDoCBiaeG6v24gdGhhbSBjaGnhur91Kg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCnJyMjwtIHJpc2tyYXRpbyhiMl9uZXcpDQpycjINCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiAgS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzayAoUlIpIGdp4buvYSB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pIHbDoCBuaMOzbSBuZ8Ogbmggbmdo4buBIGNow61uaCAod29ya2VyKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIHbDoCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiBD4bulIHRo4buDLCBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSB24bubaSBSUiA9IDEuMDAsIHRyb25nIGtoaSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPDsyBSUiA9IDAuNzI3NyB04bupYyBsw6AgdOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gY8OhYyBuZ8Ogbmggbmdo4buBIGtow6FjIGNo4buJIGLhurFuZyBraG/huqNuZyA3Mi43NyUgc28gdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEPDoWMga2nhu4NtIMSR4buLbmggxJFpIGvDqG0gbmjGsCBraeG7g20gxJHhu4tuaCBtaWQtcCBleGFjdCwgRmlzaGVy4oCZcyBleGFjdCB2w6AgQ2hpLXNxdWFyZSDEkeG7gXUgY2hvIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDAxKSwgY+G7p25nIGPhu5EgdGjDqm0gYuG6sW5nIGNo4bupbmcgcuG6sW5nIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBnaeG7r2EgbmfDoG5oIGPDtG5nIG5ow6JuIHbDoCBjw6FjIG5nw6BuaCBuZ2jhu4Ega2jDoWMuDQoNCg0KKlRIMjogVGhhbSBnaWEga2jDtG5nIGPDtG5nIMSRb8OgbiBsw6AgYmnhur9uIHRoYW0gY2hp4bq/dSoNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpycjJyPC0gcmlza3JhdGlvKGIyX25ldywgcmV2PSJjIikNCnJyMnINCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrIChSUikgZ2nhu69hIHTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbikgdsOgIG5ow7NtIG5nw6BuaCBuZ2jhu4EgY2jDrW5oICh3b3JrZXIpIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IGdp4buvYSB2aeG7h2MgdGhhbSBnaWEgdsOgIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEPhu6UgdGjhu4MsIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IHbhu5tpIFJSID0gMS4wMCwgdHJvbmcga2hpIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjw7MgUlIgPSAxLjc5MjQgdOG7qWMgbMOgIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIGPDoWMgbmfDoG5oIG5naOG7gSBjw7RuZyBuaMOibiBjYW8gaMahbiA3OS4yNCUgc28gdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nw6BuaCBjw7RuZyBuaMOibi4gQ8OhYyBraeG7g20gxJHhu4tuaCDEkWkga8OobSBuaMawIGtp4buDbSDEkeG7i25oIG1pZC1wIGV4YWN0LCBGaXNoZXLigJlzIGV4YWN0IHbDoCBDaGktc3F1YXJlIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIChwIDwgMC4wNSksIGPhu6duZyBj4buRIHRow6ptIGLhurFuZyBjaOG7qW5nIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gZ2nhu69hIG5nw6BuaCBjw7RuZyBuaMOibiB2w6AgY8OhYyBuZ8Ogbmggbmdo4buBIGtow6FjLg0KDQojIyMjICoqMy4yLjQgT2RkIHJhdGlvKioNCg0KYGBge3J9DQpvcjIgPC0gb2Rkc3JhdGlvKGIyX25ldykNCm9yMg0KYGBgDQoNCipOaOG6rW4geMOpdDoqIEvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBjw6FjIG5nw6BuaCBuZ2jhu4Ega2jDoWMgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmfDoG5oIGPDtG5nIG5ow6JuLiBU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIOKAkyBPUikgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGzDoCAwLjQwNjcsIG5naMSpYSBsw6AgeMOhYyBzdeG6pXQgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG7nyBjw6FjIG5nw6BuaCBuZ2jhu4Ega2jDoWMgYuG6sW5nIGtob+G6o25nIDQwLjY3JSBzbyB24bubaSB04bu3IGzhu4cga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbmfDoG5oIGtow6FjLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGPhu6dhIE9SIG7hurFtIHRyb25nIGtob+G6o25nIFswLjI1NzY7IDAuNjQzMl0sY8OhYyBraeG7g20gxJHhu4tuaCDEkWkga8OobSBuaMawIG1pZC1wIGV4YWN0LCBGaXNoZXLigJlzIGV4YWN0IHbDoCBDaGktc3F1YXJlIMSR4buBdSBjaG8gcC12YWx1ZSA8IDAuMDAxLCBjaOG7qW5nIG1pbmggcuG6sW5nIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIA0KDQojIyMgKiozLjMgQmnhur9uIHVuaW9uIHbDoCBtYXJyaWVkKioNCg0KIyMjIyAqKjMuMy4xIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoNCg0KYGBge3J9DQpiMzwtIHRhYmxlKGtfY2F0JHVuaW9uLGtfY2F0JG1hcnJpZWQpDQphZGRtYXJnaW5zKGIzKSANCmBgYA0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyoNCg0KYGBge3J9DQpwcm9wLnRhYmxlKGIzLCBtYXJnaW4gPSAxKQ0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhKg0KIA0KYGBge3J9DQojIENodXnhu4NuIHNhbmcgZGF0YSBmcmFtZQ0KYjNfZGYgPC0gYXMuZGF0YS5mcmFtZShiMykNCmNvbG5hbWVzKGIzX2RmKSA8LSBjKCJ1bmlvbiIsICJtYXJyaWVkIiwgIkZyZXF1ZW5jeSIpDQojIFbhur0gYmnhu4N1IMSR4buTIHThu6sgYuG6o25nIHThuqduIHN14bqldA0KZ2dwbG90KGIzX2RmLCBhZXMoeCA9IHVuaW9uLCB5ID0gRnJlcXVlbmN5LCBmaWxsID0gbWFycmllZCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgZ2nhu69hIHVuaW9uIHbDoCBtYXJyaWVkIiwNCiAgICB4ID0gInVuaW9uIiwNCiAgICB5ID0gIlThuqduIHN14bqldCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKk5o4bqtbiB4w6l0OiogQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04bqnbiBzdeG6pXQgZ2nhu69hIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uKSB2w6AgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChtYXJyaWVkKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2EgaGFpIG5ow7NtOiDEkeG7mWMgdGjDom4gKFMpIHbDoCDEkcOjIGvhur90IGjDtG4gKE0pLiBUcm9uZyBuaMOzbSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbiA9IG5vKSBwaOG6p24gbOG7m24gbMOgIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biAoMjc4IG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIDYzLDUlKSB2w6AgY8OybiBs4bqhaSBsw6AgbmfGsOG7nWkgxJHhu5ljIHRow6JuICgxNjAgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgMzYsNSUpLiBUcm9uZyBraGkgxJHDsywgdHJvbmcgbmjDs20gY8OzIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24gPSB5ZXMpLCB04bu3IGzhu4cgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDoG5nIGNoaeG6v20gxrB1IHRo4bq/IHLDtSBy4buHdCBoxqFuICg3MiBuZ8aw4budaSwgY2hp4bq/bSA3NSUpLCBjw7JuIG5nxrDhu51pIMSR4buZYyB0aMOibiBjaOG7iSBjw7MgMjQgbmfGsOG7nWkgKDI1JSkuIFF1YSDEkcOzIGNobyB0aOG6pXkgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gbmfGsOG7nWkgxJHhu5ljIHRow6JuIHBo4bqjbiDDoW5oIHLhurFuZyBuZ8aw4budaSDEkcOjIGzhuq1wIGdpYSDEkcOsbmggdGjGsOG7nW5nIGPDsyB4dSBoxrDhu5tuZyBxdWFuIHTDom0gbmhp4buBdSBoxqFuIMSR4bq/biBz4buxIOG7lW4gxJHhu4tuaCB2w6AgcXV54buBbiBs4bujaSB0cm9uZyBjw7RuZyB2aeG7h2MsIG7Dqm4gaOG7jSBjaOG7pyDEkeG7mW5nIGjGoW4gdHJvbmcgdmnhu4djIHRoYW0gZ2lhIGPDoWMgdOG7lSBjaOG7qWMgxJHhuqFpIGRp4buHbiBuaMawIGPDtG5nIMSRb8Ogbi4NCg0KIyMjIyAqKjMuMy4yIEtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcpKioNCg0KxJDhu4MgxJHDoW5oIGdpw6EgeGVtIGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGhhaSBiaeG6v24gcGjDom4gbG/huqFpIGzDoCB1bmlvbiB2w6AgbWFycmllZCBoYXkga2jDtG5nLCBz4bq9IHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAoQ2hpLXNxdWFyZSB0ZXN0KS4gDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaA0KY2hpc3FfcmVzdWx0IDwtIGNoaXNxLnRlc3QoYjMpDQojIEluIGvhur90IHF14bqjDQpjaGlzcV9yZXN1bHQNCmBgYA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJCQNClxsZWZ0XHsNClxiZWdpbnthcnJheX17bGx9DQpIXzA6ICYgXHRleHR7Qmnhur9uIHVuaW9uIHbDoCBiaeG6v24gbWFycmllZCBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hy59ICBcXFxcDQpIXzE6ICYgXHRleHR7Qmnhur9uIHVuaW9uIHbDoCBiaeG6v24gbWFycmllZCBjw7MgbeG7kWkgcXVhbiBo4buHLn0gXA0KXGVuZHthcnJheX0NClxyaWdodC4NCiQkDQoNCipOaOG6rW4geMOpdCo6IEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOiBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgdsOsIHAtdmFsdWUgPSAwLjA0MTkyIDwgMC4wNSwgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBW4bqteSAgZ2nhu69hIGJp4bq/biB1bmlvbiB2w6AgYmnhur9uIG1hcnJpZWQgdOG7k24gdOG6oWkgbeG7kWkgcXVhbiBo4buHLg0KIA0KIyMjIyAqKjMuMy4zIFJlbGF0aXZlIHJpc2sqKg0KDQpOaOG6sW0gcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biwgY2jDum5nIHRhIHPhu60gZOG7pW5nIGNo4buJIHPhu5EgUmVsYXRpdmUgUmlzayAoUlIpIMSR4buDIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBy4bunaSBybyBob+G6t2Mga2jhuqMgbsSDbmcgeOG6o3kgcmEgY+G7p2EgbeG7mXQgc+G7sSBraeG7h24uDQoNCmBgYHtyfQ0KcHJvcC50YWJsZShiMywgbWFyZ2luID0gMSkNCmBgYA0KDQoNCipUSDE6IEtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gbMOgIGJp4bq/biB0aGFtIGNoaeG6v3UqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcnIzPC0gcmlza3JhdGlvKGIzKQ0KcnIzDQpgYGANCg0KKk5o4bqtbiB4w6l0OiogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzayAoUlIpIGdp4buvYSB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pIHbDoCB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gKG1hcnJpZWQpIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IGdp4buvYSB2aeG7h2MgdGhhbSBnaWEgdsOgIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEPhu6UgdGjhu4MsIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IHbhu5tpIFJSID0gMS4wMCwgdHJvbmcga2hpIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjw7MgUlIgPSAxLjE4MTYgdOG7qWMgbMOgIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjYW8gaMahbiAxOC4xNiUgc28gdOG7tyBs4buHIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nxrDhu51pxJHDoyBr4bq/dCBow7RuLiBDw6FjIGtp4buDbSDEkeG7i25oIMSRaSBrw6htIG5oxrAga2nhu4NtIMSR4buLbmggbWlkLXAgZXhhY3QsIEZpc2hlcuKAmXMgZXhhY3QgdsOgIENoaS1zcXVhcmUgxJHhu4F1IGNobyBnacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKHAgPCAwLjA1KSwgY+G7p25nIGPhu5EgdGjDqm0gYuG6sW5nIGNo4bupbmcgcuG6sW5nIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBnaeG7r2EgbmfDoG5oIGPDtG5nIG5ow6JuIHbDoCBjw6FjIG5nw6BuaCBuZ2jhu4Ega2jDoWMuDQoNCipUSDI6IFRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBsw6AgYmnhur9uIHRoYW0gY2hp4bq/dSoNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpycnIzcjwtIHJpc2tyYXRpbyhiMywgcmV2PSJjIikNCnJycjNyDQpgYGANCg0KKk5o4bqtbiB4w6l0OiogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzayAoUlIpIGdp4buvYSB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pIHbDoCB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gKG1hcnJpZWQpIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IGdp4buvYSB2aeG7h2MgdGhhbSBnaWEgdsOgIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEPhu6UgdGjhu4MsIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgUlIgPSAxLjAwLCB0cm9uZyBraGkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjw7MgUlIgPSAwLjY4NDMgdOG7qWMgbMOgIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4gYuG6sW5nIGtob+G6o25nIDY4LDQzJSBzbyB04bu3IGzhu4cga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0bi4gQ8OhYyBraeG7g20gxJHhu4tuaCDEkWkga8OobSBuaMawIGtp4buDbSDEkeG7i25oIG1pZC1wIGV4YWN0LCBGaXNoZXLigJlzIGV4YWN0IHbDoCBDaGktc3F1YXJlIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIChwIDwgMC4wNSksIGPhu6duZyBj4buRIHRow6ptIGLhurFuZyBjaOG7qW5nIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gZ2nhu69hIG5nw6BuaCBjw7RuZyBuaMOibiB2w6AgY8OhYyBuZ8Ogbmggbmdo4buBIGtow6FjLg0KDQojIyMjICoqMy4zLjQgT2RkIHJhdGlvKioNCg0KYGBge3J9DQpvcjIgPC0gb2Rkc3JhdGlvKGIzKQ0Kb3IyDQpgYGANCg0KKk5o4bqtbiB4w6l0KjogS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY2hvIHRo4bqleSBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBraOG6oyBuxINuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4uIFThu7cgc+G7kSBjaMOqbmggKE9kZHMgUmF0aW8g4oCTIE9SKSDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgbMOgIDEuNzE4NCwgbmdoxKlhIGzDoCB4w6FjIHN14bqldCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4g4bufIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjYW8gaMahbiA3MS44NCUgc28gduG7m2kgeMOhYyBzdeG6pXQga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDhu58gbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGPhu6dhIE9SIG7hurFtIHRyb25nIGtob+G6o25nIFsxLjA1MzE7Mi44OTA0XSxjw6FjIGtp4buDbSDEkeG7i25oIMSRaSBrw6htIG5oxrAgbWlkLXAgZXhhY3QsIEZpc2hlcuKAmXMgZXhhY3QgdsOgIENoaS1zcXVhcmUgxJHhu4F1IGNobyBwLXZhbHVlIDwgMC4wNSwgY2jhu6luZyBtaW5oIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiANCg0KIyMgKipQaOG6p24gNDsgUGjDom4gdMOtY2ggc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyBiaeG6v24gbMOqbiBiaeG6v24gZ2nhu5tpIHTDrW5oIChnZW5kZXIpKioNCg0KIyMjICoqNC4xIEJp4bq/biBnZW5kZXIgdsOgIGJp4bq/biBzZWN0b3IqKg0KDQojIyMjICoqNC4xLjEgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKg0KDQpgYGB7cn0NCmUxPC0gdGFibGUoa19jYXQkZ2VuZGVyLCBrX2NhdCRzZWN0b3IpDQphZGRtYXJnaW5zKGUxKSANCmBgYA0KDQoqQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aGVvIHThu7cgbOG7hyBow6BuZyoNCg0KYGBge3J9DQpwcm9wLnRhYmxlKGUxLCBtYXJnaW4gPSAxKQ0KYGBgDQoNCipUcuG7sWMgcXVhbiBow7NhKg0KIA0KYGBge3J9DQojIENodXnhu4NuIHNhbmcgZGF0YSBmcmFtZQ0KZTFfZGYgPC0gYXMuZGF0YS5mcmFtZShlMSkNCmNvbG5hbWVzKGUxX2RmKSA8LSBjKCJnZW5kZXIiLCAic2VjdG9yIiwgIkZyZXF1ZW5jeSIpDQojIFbhur0gYmnhu4N1IMSR4buTIHThu6sgYuG6o25nIHThuqduIHN14bqldA0KZ2dwbG90KGUxX2RmLCBhZXMoeCA9IGdlbmRlciwgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9c2VjdG9yICkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgZ2nhu69hIHNlY3RvciB2w6AgZ2VuZGVyIiwNCiAgICB4ID0gImdlbmRlciIsDQogICAgeSA9ICJU4bqnbiBzdeG6pXQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqTmjhuq1uIHjDqXQqOiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbmfDoG5oIG5naOG7gSAoc2VjdG9yKSB2w6AgZ2nhu5tpIHTDrW5oIChnZW5kZXIpIGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIGtow7RuZyDEkeG7k25nIMSR4buBdSBnaeG7r2EgbmFtIHbDoCBu4buvIHRyb25nIGPDoWMgbMSpbmggduG7sWMuIE5nw6BuaCB4w6J5IGThu7FuZyBjw7MgdOG7tyBs4buHIG5hbSBnaeG7m2kgY2hp4bq/bSDGsHUgdGjhur8gdHV54buHdCDEkeG7kWkgduG7m2kgOTEsNyUsIHRyb25nIGtoaSBu4buvIGdp4bubaSBjaOG7iSBjaGnhur9tIDgsMyUuIE5nw6BuaCBz4bqjbiB4deG6pXQgY8WpbmcgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCwga2hpIG5hbSBnaeG7m2kgY2hp4bq/bSA2MCw2JSB2w6AgbuG7ryBnaeG7m2kgbMOgIDM5LDQlLiBOZ8aw4bujYyBs4bqhaSwgbmjDs20gbmfDoG5oICJvdGhlciIgbOG6oWkgY8OzIHPhu7EgcGjDom4gYuG7kSBnaeG7m2kgdMOtbmgga2jDoSBjw6JuIGLhurFuZywgduG7m2kga2hv4bqjbmcgNTAsNCUgbmFtIHbDoCA0OSw2JSBu4buvLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggdGjhu7FjIHRy4bqhbmcgxJHhu4tuaCBraeG6v24gZ2nhu5tpIHRyb25nIGzhu7FhIGNo4buNbiBuZ2jhu4EgbmdoaeG7h3AsIGtoaSBjw6FjIG5nw6BuaCDEkcOyaSBo4buPaSBsYW8gxJHhu5luZyB0aOG7gyBjaOG6pXQgbmjGsCB4w6J5IGThu7FuZyB24bqrbiBjaOG7pyB54bq/dSBsw6AgbmFtIGdp4bubaSwgY8OybiBjw6FjIG5nw6BuaCBraMOhYyBjw7MgeHUgaMaw4bubbmcgbeG7nyBy4buZbmcgaMahbiBjaG8gY+G6oyBuYW0gdsOgIG7hu68uDQoNCiMjIyMgKio0LjEuMiBLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKSoqDQoNCsSQ4buDIMSRw6FuaCBnacOhIHhlbSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaSBsw6Agc2VjdG9yIHbDoCBnZW5kZXIgaGF5IGtow7RuZywgc+G6vSBz4butIGThu6VuZyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKENoaS1zcXVhcmUgdGVzdCkuIA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmgNCmNoaXNxX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGUxKQ0KIyBJbiBr4bq/dCBxdeG6ow0KY2hpc3FfcmVzdWx0DQpgYGANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiQkDQpcbGVmdFx7DQpcYmVnaW57YXJyYXl9e2xsfQ0KSF8wOiAmIFx0ZXh0e0Jp4bq/biBnZW5kZXIgdsOgIGJp4bq/biBzZWN0b3Iga2jDtG5nIGPDsyBt4buRaSBxdWFuIGjhu4cufSAgXFxcXA0KSF8xOiAmIFx0ZXh0e0Jp4bq/biBnZW5kZXIgdsOgIGJp4bq/biBzZWN0b3IgY8OzIG3hu5FpIHF1YW4gaOG7hy59IFwNClxlbmR7YXJyYXl9DQpccmlnaHQuDQokJA0KDQoqTmjhuq1uIHjDqXQqOiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDogVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUsIHbDrCBwLXZhbHVlID0gMC4wMDAxNDc5IDwgMC4wNSwgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLiBW4bqteSBnaeG7r2EgQmnhur9uIHNlY3RvciB2w6AgYmnhur9uIGdlbmRlciB04buTbiB04bqhaSBt4buRaSBxdWFuIGjhu4cuDQogDQojIyMjICoqNC4xLjMgUmVsYXRpdmUgcmlzayoqDQoNCmBgYHtyfQ0KZTFfbmV3IDwtIGNiaW5kKCAgIA0KICBjb25zdHJ1Y3Rpb249IGUxWywgImNvbnN0cnVjdGlvbiJdLCAgDQogIG90aGVyID0gZTFbLCAibWFudWZhY3R1cmluZyJdICsgZTFbLCAib3RoZXIiXSANCikNCmUxX25ldw0KYGBgDQoNCk5o4bqxbSBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uLCBjaMO6bmcgdGEgc+G7rSBk4bulbmcgY2jhu4kgc+G7kSBSZWxhdGl2ZSBSaXNrIChSUikgxJHhu4MgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHLhu6dpIHJvIGhv4bq3YyBraOG6oyBuxINuZyB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbi4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpycnMxPC0gcmlza3JhdGlvKGUxX25ldywgcmV2PSJjIikNCnJyczENCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrIChSUikgZ2nhu69hIGtodSB24buxYyBraW5oIHThur8gKHNlY3RvcikgdsOgIGdp4bubaSB0w61uaCAoZ2VuZGVyKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2EgY8OhYyBraHUgduG7sWMga2luaCB04bq/LiBD4bulIHRo4buDLCBnaeG7m2kgdMOtbmggbmFtIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSB24bubaSBSUiA9IDEuMDAsIHRyb25nIGtoaSBnacaw4bubaSB0w61uaCBu4buvIGPDsyBSUiA9IDAuMTA3MiB04bupYyBsw6AgdOG7tyBs4buHIG7hu68g4bufIGPDoWMgbmfDoG5oIHjDonkgZOG7sW5nIGNo4buJIGLhurFuZyBraG/huqNuZyAxMC43MiUgc28gdOG7tyBs4buHIG5hbSDhu58gY8OhYyBuZ8OgbmggeMOieSBk4buxbmcuIEPDoWMga2nhu4NtIMSR4buLbmggxJFpIGvDqG0gbmjGsCBraeG7g20gxJHhu4tuaCBtaWQtcCBleGFjdCwgRmlzaGVy4oCZcyBleGFjdCB2w6AgQ2hpLXNxdWFyZSDEkeG7gXUgY2hvIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDUpLCBj4bunbmcgY+G7kSB0aMOqbSBi4bqxbmcgY2jhu6luZyBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGdp4buvYSBuZ8OgbmggY8O0bmcgbmjDom4gdsOgIGPDoWMgbmfDoG5oIG5naOG7gSBraMOhYy4NCg0KIyMjIyAqKjQuMS40IE9kZCByYXRpbyoqDQoNCmBgYHtyfQ0Kb3Ixczwtb2Rkc3JhdGlvKGUxX25ldykNCm9yMXMNCmBgYA0KKk5o4bqtbiB4w6l0Kg0KDQpE4buxYSB0csOqbiBr4bq/dCBxdeG6oyBwaMOibiB0w61jaCBPZGRzIFJhdGlvIChPUikgZ2nhu69hIGJp4bq/biBzZWN0b3IgdsOgIGdlbmRlci4gR2nhu5tpIHTDrW5oIG5hbSDEkcaw4bujYyBjaOG7jW4gbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgKE9SID0gMS4wMCksIG7Dqm4gY8OhYyBPZGRzIFJhdGlvIGPhu6dhIGdpxrDhu5tpIHTDrW5oIG7hu68gc+G6vSBzbyBzw6FuaC4gVuG7m2kgZ2nhu5tpIHTDrW5oIG7hu68sIE9kZHMgUmF0aW8gPSA5LjMzNzM5MSAgdsOgIGdpw6EgdHLhu4sgcCDEkeG7gXUgbmjhu48gaMahbiAwLjAxIGNobyB04bqldCBj4bqjIGPDoWMgcGjGsMahbmcgcGjDoXAga2nhu4NtIMSR4buLbmguIEPhu6UgdGjhu4MsIHjDoWMgc3XhuqV0IG7hu68gZ2nhu5tpIGzDoG0gdmnhu4djIHRyb25nIG5nw6BuaCBraMOhYyBjYW8gaMahbiA5IGzhuqduIHNvIHbhu5tpIG5hbSB0cm9uZyBuaMOzbSBuZ8Ogbmgga2jDoWMNCg0KIyMjICoqNC4yIEJp4bq/biBnZW5kZXIgdsOgIGJp4bq/biB1bmlvbioqDQoNCsSQ4buDIGhp4buDdSByw7UgaMahbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG5ow7NtIGdp4bubaSB0w61uaCAoZ2VuZGVyKSB2w6AgbmjDs20gdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uKSwgY2jDum5nIHRhIHPhur0geMOieSBk4buxbmcgYuG6o25nIHThuqduIHN14bqldCBjaMOpbyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB04burbmcga+G6v3QgaOG7o3AgZ2nhu69hIGhhaSBiaeG6v24gbsOgeS4gU2F1IMSRw7MsIGJp4buDdSDEkeG7kyBj4buZdCBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHRy4buxYyBxdWFuIGjDs2Egc+G7sSBwaMOibiBi4buRIGPhu6dhIG5ow7NtIHTDrG5oIHRy4bqhbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHRoZW8gdOG7q25nIGdp4bubaSB0w61uaCwgZ2nDunAgcXVhbiBzw6F0IGThu4UgZMOgbmcgc+G7sSBraMOhYyBiaeG7h3QgdsOgIHh1IGjGsOG7m25nIHRpw6p1IGTDuW5nIGdp4buvYSBjw6FjIG5ow7NtLg0KDQojIyMjICoqNC4yLjEgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKg0KDQpgYGB7cn0NCmUyIDwtIHRhYmxlKGtfY2F0JGdlbmRlcixrX2NhdCR1bmlvbikNCmFkZG1hcmdpbnMoZTIpIA0KYGBgDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHRoZW8gdOG7tyBs4buHIGjDoG5nKg0KDQpgYGB7cn0NCnByb3AudGFibGUoZTIsIG1hcmdpbiA9IDEpDQpgYGANCg0KKlRy4buxYyBxdWFuIGjDs2EqDQogDQpgYGB7cn0NCiMgQ2h1eeG7g24gc2FuZyBkYXRhIGZyYW1lDQplMl9kZiA8LSBhcy5kYXRhLmZyYW1lKGUyKQ0KY29sbmFtZXMoZTJfZGYpIDwtIGMoImdlbmRlciIsICJ1bmlvbiIsICJGcmVxdWVuY3kiKQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB04burIGLhuqNuZyB04bqnbiBzdeG6pXQNCmdncGxvdChlMl9kZiwgYWVzKHggPSBnZW5kZXIsIHkgPSBGcmVxdWVuY3ksIGZpbGwgPSB1bmlvbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBz4buRIGdp4buvYSBnZW5kZXIgdsOgIHVuaW9uIiwNCiAgICB4ID0gImdlbmRlciIsDQogICAgeSA9ICJU4bqnbiBz4buRIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQoqTmjhuq1uIHjDqXQqDQoNCkThu7FhIHbDoG8gYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSB04bu3IGzhu4cgbmFtIGdp4bubaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY2FvIGjGoW4gbuG7ryBnaeG7m2kuIEPhu6UgdGjhu4MsIHRyb25nIHThu5VuZyBz4buRIDI4OSBuYW0gdGjDrCBjw7MgNjggbmfGsOG7nWkgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNoaeG6v20ga2hv4bqjbmcgMjMsNSUsIHRyb25nIGtoaSDhu58gbuG7ryBnaeG7m2kgY2jhu4kgY8OzIDI4IHRyw6puIHThu5VuZyBz4buRIDI0NSBuZ8aw4budaSB0aGFtIGdpYSBjaGnhur9tIGtob+G6o25nIDExLDQlLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGPDsyB4dSBoxrDhu5tuZyBn4bqvbiBr4bq/dCB24bubaSBjw7RuZyDEkW/DoG4gbmhp4buBdSBoxqFuIHNvIHbhu5tpIG7hu68gZ2nhu5tpLCBwaOG6o24gw6FuaCBz4buxIGtow6FjIGJp4buHdCB24buBIG3hu6ljIMSR4buZIHRoYW0gZ2lhIHThu5UgY2jhu6ljIGxhbyDEkeG7mW5nIGdp4buvYSBoYWkgZ2nhu5tpLiBUdXkgbmhpw6puIHThu5VuZyB0aOG7gyB0aMOsIG5hbSB2w6AgbuG7ryDEkWnhu4F1IGtow7RuZyBjw7MgeHUgaMaw4bubbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGLhu59pIHThu7cgbOG7hyBuYW0gdsOgIG7GsCBraMO0bmcgdGhhbSBnaWEgY2hp4bq/bSB04bu3IGzhu4cgcuG6pXQgbOG7m24uDQoNCiMjIyMgKio0LjIuMiBLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiAoS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKSoqDQoNCsSQ4buDIMSRw6FuaCBnacOhIHhlbSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaSBsw6AgZ2VuZGVyIHbDoCB1bmlvbiBoYXkga2jDtG5nLCBz4bq9IHPhu60gZOG7pW5nIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAoQ2hpLXNxdWFyZSB0ZXN0KS4gDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaA0KY2hpc3FfcmVzdWx0IDwtIGNoaXNxLnRlc3QoZTIpDQoNCiMgSW4ga+G6v3QgcXXhuqMNCmNoaXNxX3Jlc3VsdA0KYGBgDQoNCkdp4bqjIHRodXnhur90Og0KDQokJA0KXGxlZnRcew0KXGJlZ2lue2FycmF5fXtsbH0NCkhfMDogJiBcdGV4dHtCaeG6v24gZ2VuZGVyIHbDoCBiaeG6v24gdW5pb24ga2jDtG5nIGPDsyBt4buRaSBxdWFuIGjhu4cufSAgXFxcXA0KSF8xOiAmIFx0ZXh0e0Jp4bq/biBnZW5kZXIgdsOgIGJp4bq/biB1bmlvbiBjw7MgbeG7kWkgcXVhbiBo4buHLn0gXA0KXGVuZHthcnJheX0NClxyaWdodC4NCiQkDQoNCipOaOG6rW4geMOpdCo6IEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOiBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgdsOsIHAtdmFsdWUgPSAwLjAwMDQzODggPCAwLjA1LCBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuIFbhuq15ICBnaeG7r2EgYmnhur9uIGdlbmRlciB2w6AgYmnhur9uIHVuaW9uIHThu5NuIHThuqFpIG3hu5FpIHF1YW4gaOG7hy4NCg0KIyMjIyAqKjQuMi4zIFJlbGF0aXZlIFJpc2sqKg0KDQoqKlRIMTogTmFtIGzDoG0gYmnhur9uIHRoYW0gY2hp4bq/dSoqDQoNCk5o4bqxbSBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uLCBjaMO6bmcgdGEgc+G7rSBk4bulbmcgY2jhu4kgc+G7kSBSZWxhdGl2ZSBSaXNrIChSUikgxJHhu4MgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHLhu6dpIHJvIGhv4bq3YyBraOG6oyBuxINuZyB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbi4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpycjI8LSByaXNrcmF0aW8oZTIpDQpycjINCmBgYA0KDQoqTmjhuq1uIHjDqXQ6KiBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrIChSUikgZ2nhu69hIGdp4bubaSB0w61uaCAoZ2VuZGVyKSB2w6AgdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHVuaW9uKSBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2EgbmFtIHbDoCBu4buvLiBD4bulIHRo4buDLCBuYW0gZ2nhu5tpIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dSB24bubaSBSUiA9IDEuMDAsIHRyb25nIGtoaSBu4buvIGdp4bubaSBjw7MgUlIgPSAwLjQ4NiB04bupYyBsw6Aga2jhuqMgbsSDbmcgIG7hu68gdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNoaSBi4bqxbmcga2hv4bqjbmcgNDguNiUgc28gduG7m2kgbmFtIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gUlIgY+G7p2EgbuG7ryBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDAuMzI0IMSR4bq/biAwLjcyOSwgY2hvIHRo4bqleSBr4bq/dCBxdeG6oyBuw6B5IGPDsyDEkeG7mSB0aW4gY+G6rXkgY2FvLiBIxqFuIG7hu69hLCBjw6FjIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChtaWRwLmV4YWN0LCBmaXNoZXIuZXhhY3QsIGNoaS5zcXVhcmUpIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPICg8IDAuMDUpLCBjaOG7qW5nIHThu48gc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoqKlRIMjogTmFtIGzDoG0gYmnhur9uIHRoYW0gY2hp4bq/dSoqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KcnIzPC0gcmlza3JhdGlvKGUyLCByZXYgPSJjIikNCnJyMw0KYGBgDQoNCipOaOG6rW4geMOpdDoqIEvhur90IHF14bqjIHBow6JuIHTDrWNoIFJlbGF0aXZlIFJpc2sgKFJSKSBnaeG7r2EgZ2nhu5tpIHTDrW5oIChnZW5kZXIpIHbDoCB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IGdp4buvYSBuYW0gdsOgIG7hu68uIEPhu6UgdGjhu4MsIG5hbSBnaeG7m2kgxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IHbhu5tpIFJSID0gMS4wMCwgdHJvbmcga2hpIG7hu68gZ2nhu5tpIGPDsyBSUiA9ICAxLjE1OCB04bupYyBsw6Aga2jhuqMgbsSDbmcgIG7hu68ga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjYW8gaMahbiAxNS44JSBzbyB24bubaSBuYW0gIGtow7RuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIFJSIGPhu6dhIG7hu68gbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAxLjA3MTEgxJHhur9uIDEuMjUyLCBjaG8gdGjhuqV5IGvhur90IHF14bqjIG7DoHkgY8OzIMSR4buZIHRpbiBj4bqteSBjYW8uIEjGoW4gbuG7r2EsIGPDoWMga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKG1pZHAuZXhhY3QsIGZpc2hlci5leGFjdCwgY2hpLnNxdWFyZSkgxJHhu4F1IGNobyBnacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKDwgMC4wNSksIGNo4bupbmcgdOG7jyBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCg0KIyMjIyAqKjQuMi40IE9kZHMgcmF0aW8qKg0KDQpgYGB7cn0NCm9yZ3UgPC0gb2Rkc3JhdGlvKGUyKQ0Kb3JndQ0KYGBgDQoNCipOaOG6rW4geMOpdCoNCg0KROG7sWEgdHLDqm4ga+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggT2RkcyBSYXRpbyAoT1IpIGdp4buvYSBiaeG6v24gc2VjdG9yIHbDoCBndW5pb24uIEdp4bubaSB0w61uaCBuYW0gxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IChPUiA9IDEuMDApLCBuw6puIGPDoWMgT2RkcyBSYXRpbyBj4bunYSBnacahaSB0w61uaCBu4buvIHPhur0gc28gc8OhbmguIFbhu5tpIGdp4bubaSB0w61uaCBu4buvLCBPZGRzIFJhdGlvID0gMC40MjEyNiB2w6AgZ2nDoSB0cuG7iyBwIMSR4buBdSBuaOG7jyBoxqFuIDAuMDEgY2hvIHThuqV0IGPhuqMgY8OhYyBwaMawxqFuZyBwaMOhcCBraeG7g20gxJHhu4tuaC4gQ+G7pSB0aOG7gywgeMOhYyBzdeG6pXQgbuG7ryBnaeG7m2kgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNo4buJIGLhurFuZyA0Mi4xMjYlICBzbyB24bubaSBuYW0gdGhhbSBnaWEgY8O0bmcgxJFvw6BuLg0KDQojIyAqKlBo4bqnbiA1OiBNw7QgaMOsbmggTG9naXQqKg0KDQojIyMgKio1LjEgTcO0IGjDrG5oIExvZ2l0IGNobyBk4buvIGxp4buHdSBuaOG7iyBwaMOibioqDQoNCiMjIyMgKio1LjEuMSBWaeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIOG6o25oIGjGsOG7n25nIG5oxrAgdGjhur8gbsOgbyDEkeG7kWkgduG7m2kgZ2nhu5tpIHTDrW5oKioNCg0KVHJvbmcgcGjhuqduIG7DoHksIHTDoWMgZ2nhuqMgdGnhur9uIGjDoG5oIHjDonkgZOG7sW5nIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgbmjhu4sgcGjDom4gKGxvZ2l0IG1vZGVsKSBuaOG6sW0gxJHDoW5oIGdpw6EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIHbDoCBnaeG7m2kgdMOtbmggY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcuIEPhu6UgdGjhu4MsIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBnZW5kZXIsIMSRxrDhu6NjIG3DoyBow7NhIGTGsOG7m2kgZOG6oW5nIG5o4buLIHBow6JuIHbhu5tpIGhhaSBnacOhIHRy4buLOiBtYWxlICgwKSB2w6AgZmVtYWxlICgxKS4gQmnhur9uIMSR4buZYyBs4bqtcCBsw6AgdW5pb24sIHRo4buDIGhp4buHbiB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiB24bubaSBoYWkgZ2nDoSB0cuG7iyB5ZXMgdsOgIG5vLg0KDQpNw7QgaMOsbmggxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGLhurFuZyBwaMawxqFuZyBwaMOhcCBiw6xuaCBwaMawxqFuZyBj4buxYyDEkeG6oWkgKE1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0aW9uKSB24bubaSBow6BtIGxpw6puIGvhur90IGxvZ2l0LCB0aOG7gyBoaeG7h24geMOhYyBzdeG6pXQgbeG7mXQgY8OhIG5ow6JuIGzDoCBu4buvIGdp4bubaSBkxrDhu5tpIOG6o25oIGjGsOG7n25nIGPhu6dhIHZp4buHYyBjw7MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGhheSBraMO0bmcuDQoNCk3DtCBow6xuaCBMb2dpdCANCg0KJCQNClxsb2dcbGVmdCggXGZyYWN7UChcdGV4dHtnZW5kZXJ9ID0gXHRleHR7ImZlbWFsZSJ9KX17MSAtIFAoXHRleHR7Z2VuZGVyfSA9IFx0ZXh0eyJmZW1hbGUifSl9IFxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcdGV4dHt1bmlvbn0NCiQkDQpgYGB7cn0NCmtfY2F0JGdlbmRlciA8LSBmYWN0b3Ioa19jYXQkZ2VuZGVyLCBsZXZlbHMgPSBjKCdtYWxlJywnZmVtYWxlJykpDQoja19jYXQkZ2VuZGVyOiBj4buZdCBnZW5kZXIgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBrX2NhdA0KI2ZhY3RvciguLi4pOiBow6BtIGNodXnhu4NuIGThu68gbGnhu4d1IHRow6BuaCBraeG7g3UgbmjDom4gdOG7kSAoZmFjdG9yKS4NCiNsZXZlbHMgPSBjKCdtYWxlJywgJ2ZlbWFsZScpOiB4w6FjIMSR4buLbmggcsO1IHRo4bupIHThu7EgY+G7p2EgaGFpIG5ow7NtLCB0cm9uZyDEkcOzOiAwIGzDoCBtYWxlLCAxIGzDoCBmZW1hbGUNCnJlZ2xvZ2l0IDwtIGdsbShnZW5kZXIgfnVuaW9uLCBkYXRhID0ga19jYXQsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSkNCiNnbG0oLi4uKTogaMOgbSBkw7luZyDEkeG7gyB4w6J5IG3DtCBow6xuaCBo4buTaSBxdXkgdOG7lW5nIHF1w6F0DQojZ2VuZGVyIH4gdW5pb246IGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBnZW5kZXIsIMSRxrDhu6NjIGdp4bqjaSB0aMOtY2ggYuG7n2kgYmnhur9uIHVuaW9uDQojZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpOiBjaOG7iSDEkeG7i25oIMSRw6J5IGzDoCBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIG5o4buLIHBow6JuLCBwaMO5IGjhu6NwIHbhu5tpIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBuaOG7iyBwaMOibi4NCnN1bW1hcnkocmVnbG9naXQpDQpgYGANCg0KS+G6v3QgcXXhuqMgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBjaG8gdGjhuqV5IGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uIEPhu6UgdGjhu4MsIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gdW5pb255ZXMgbMOgIC0wLjg2OTA0IHbhu5tpIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA9IDAuMDAwMzY5KSwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhLiBLaGkgbeG7mXQgbmfGsOG7nWkgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLCBsb2cgb2RkcyDEkeG7gyBuZ8aw4budaSDEkcOzIGzDoCBu4buvIGdp4bqjbSB4deG7kW5nIDAuODY5IHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyB0aGFtIGdpYS4gQ2h1eeG7g24gc2FuZyBk4bqhbmcgb2RkcyByYXRpbywgdGEgY8OzIE9SID0gZXhwKC0wLjg2OTA0KSDiiYggMC40MTksIG5naMSpYSBsw6Aga2jhuqMgbsSDbmcgbMOgIG7hu68gdHJvbmcgbmjDs20gdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNo4buJIGLhurFuZyBraG/huqNuZyA0MS45JSBzbyB24bubaSBuaMOzbSBraMO0bmcgdGhhbSBnaWEuIE3DtCBow6xuaCBo4buTaSBxdXkgY8OzIGThuqFuZyBuaMawIHNhdToNCg0KJCQNClxsb2dcbGVmdCggXGZyYWN7UChcdGV4dHtnZW5kZXJ9ID0gXHRleHR7ImZlbWFsZSJ9KX17MSAtIFAoXHRleHR7Z2VuZGVyfSA9IFx0ZXh0eyJmZW1hbGUifSl9IFxyaWdodCkgPSAtMC4wMTgyNyAtMC44NjkwNCBcY2RvdCBcdGV4dHt1bmlvbn0NCiQkDQoNCljDqXQgduG7gSBt4bupYyDEkeG7mSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCwgc2FpIHPhu5EgbG9nLWxpa2VsaWhvb2QgY+G7p2EgbcO0IGjDrG5oIGdp4bqjbSB04burIDczNi43IChOdWxsIERldmlhbmNlKSB4deG7kW5nIDcyMy4xIChSZXNpZHVhbCBEZXZpYW5jZSkgc2F1IGtoaSDEkcawYSBiaeG6v24gdW5pb24gdsOgby4gTeG6t2MgZMO5IG3hu6ljIMSR4buZIGPhuqNpIHRoaeG7h24ga2jDtG5nIGzhu5tuLCDEkWnhu4F1IG7DoHkgY2hvIHRo4bqleSB1bmlvbiB24bqrbiBjw7MgxJHDs25nIGfDs3AgbmjhuqV0IMSR4buLbmggdHJvbmcgdmnhu4djIGdp4bqjaSB0aMOtY2ggYmnhur9uIHBo4bulIHRodeG7mWMgZ2VuZGVyLiBHacOhIHRy4buLIEFJQyBsw6AgNzI3LjEsIGPDsyB0aOG7gyBkw7luZyBsw6BtIGPGoSBz4bufIMSR4buDIHNvIHPDoW5oIHbhu5tpIGPDoWMgbcO0IGjDrG5oIG3hu58gcuG7mW5nIHRyb25nIGPDoWMgcGjDom4gdMOtY2ggdGnhur9wIHRoZW8uDQoNClTDs20gbOG6oWksIGvhur90IHF14bqjIHThu6sgbcO0IGjDrG5oIGxvZ2l0IGNobyB0aOG6pXkgY8OzIG3hu5FpIHF1YW4gaOG7hyB0acOqdSBj4buxYyBnaeG7r2Egdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiB2w6Aga2jhuqMgbsSDbmcgbeG7mXQgY8OhIG5ow6JuIGzDoCBu4buvIGdp4bubaS4gDQoNCiMjIyMgKio1LjEuMiBWaeG7h2Mga+G6v3QgaMO0biDhuqNuaCBoxrDhu59uZyBuaMawIHRo4bq/IG7DoG8gxJHhur9uIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4qKg0KDQpUcm9uZyBwaOG6p24gbsOgeSwgdMOhYyBnaeG6oyB0aeG6v3AgdOG7pWMgc+G7rSBk4bulbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBuaOG7iyBwaMOibiBuaOG6sW0gdMOsbSBoaeG7g3UgeGVtIHZp4buHYyBr4bq/dCBow7RuIGPDsyDhuqNuaCBoxrDhu59uZyBuaMawIHRo4bq/IG7DoG8gxJHhur9uIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBj4bunYSBuZ8aw4budaSBsYW8gxJHhu5luZy4gQmnhur9uIHBo4bulIHRodeG7mWMgdHJvbmcgbcO0IGjDrG5oIGzDoCB1bmlvbiwgcGjhuqNuIMOhbmggdMOsbmggdHLhuqFuZyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gKHllcyBob+G6t2Mgbm8pLCBjw7JuIGJp4bq/biDEkeG7mWMgbOG6rXAgbMOgIG1hcnJpZWQsIHRo4buDIGhp4buHbiB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4uDQoNCsSQ4bqndSB0acOqbiwgYmnhur9uIHVuaW9uIMSRxrDhu6NjIGNodXnhu4NuIHRow6BuaCBiaeG6v24gbmjDom4gdOG7kSAgbmjhu4sgcGjDom4gduG7m2kgaGFpIG3hu6ljOiBubyBsw6AgZ2nDoSB0cuG7iyB0aGFtIGNoaeG6v3UgKG3hurdjIMSR4buLbmggbMOgIDApIHbDoCB5ZXMgbMOgIG3hu6ljIGPhuqduIGThu7EgxJFvw6FuICgxKS4gxJBp4buBdSBuw6B5IGNobyBwaMOpcCBtw7QgaMOsbmggdOG6rXAgdHJ1bmcgxrDhu5tjIGzGsOG7o25nIHjDoWMgc3XhuqV0IG3hu5l0IGPDoSBuaMOibiBjw7MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGThu7FhIHRyw6puIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi4NCg0KTcO0IGjDrG5oIMaw4bubYyBsxrDhu6NuZzoNCiQkDQpcbG9nIFxsZWZ0KCBcZnJhY3tQKFx0ZXh0e3VuaW9ufSA9IFx0ZXh0eyJ5ZXMifSl9ezEgLSBQKFx0ZXh0e3VuaW9ufSA9IFx0ZXh0eyJ5ZXMifSl9IFxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcdGV4dHttYXJyaWVkfQ0KJCQNCg0KYGBge3J9DQprX2NhdCR1bmlvbiA8LSBmYWN0b3Ioa19jYXQkdW5pb24sIGxldmVscyA9IGMoJ25vJywneWVzJykpDQpyZWdsb2dpdDIgPC0gZ2xtKHVuaW9ufm1hcnJpZWQsIGRhdGEgPSBrX2NhdCwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpKQ0Kc3VtbWFyeShyZWdsb2dpdDIpDQpgYGANCg0KDQokJA0KXHRleHR7T2RkcyBSYXRpb30gPSBlXnswLjU0NjJ9IFxhcHByb3ggMS43Mw0KJCQNCkvhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZzoNCg0KJCQNClxsb2dcbGVmdCggXGZyYWN7UChcdGV4dHt1bmlvbn0gPSBcdGV4dHsieWVzIn0pfXsxIC0gUChcdGV4dHt1bmlvbn0gPSBcdGV4dHsieWVzIn0pfSBccmlnaHQpID0gLTEuODk3MSAgKyAwLjU0NjIgXGNkb3QgXHRleHR7bWFycmllZH0NCiQkDQoNCkvhur90IHF14bqjIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgbmjhu4sgcGjDom4gY2hvIHRo4bqleSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIOG6o25oIGjGsOG7n25nICDEkeG6v24ga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nLiBCaeG6v24gcGjhu6UgdGh14buZYyBsw6AgdW5pb24gxJHDoyDEkcaw4bujYyBtw6MgaMOzYSBkxrDhu5tpIGThuqFuZyBuaOG7iyBwaMOibiB24bubaSBt4bupYyB0aGFtIGNoaeG6v3UgbMOgIOKAnG5v4oCdIChraMO0bmcgdGhhbSBnaWEpLCBuaOG6sW0gxrDhu5tjIGzGsOG7o25nIHjDoWMgc3XhuqV0IG3hu5l0IGPDoSBuaMOibiBjw7MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuICh1bmlvbiA9IHllcykgZOG7sWEgdHLDqm4gYmnhur9uIGdp4bqjaSB0aMOtY2ggbWFycmllZCAodMOsbmggdHLhuqFuZyBow7RuIG5ow6JuKS4gSOG7hyBz4buRIGjhu5NpIHF1eSBj4bunYSBtYXJyaWVkTSAoxJHDoyBr4bq/dCBow7RuKSBsw6AgMC41NDYyIHbhu5tpIGdpw6EgdHLhu4sgcCA9IDAuMDMyNyAoPCAwLjA1KSwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gSOG7hyBz4buRIGTGsMahbmcgbsOgeSBjaG8gdGjhuqV5IG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIHNvIHbhu5tpIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4uIEtoaSBjaHV54buDbiBzYW5nIGThuqFuZyBvZGRzIHJhdGlvLCB0YSBjw7MgT1IgPSBleHAoMC41NDYyKSDiiYggMS43MywgdOG7qWMgbMOgIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7Mga2jhuqMgbsSDbmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGNhbyBoxqFuIGtob+G6o25nIDEuNzMgbOG6p24gc28gduG7m2kgbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0bi4NCg0KIyMjICoqNS4yIE3DtCBow6xuaCBMb2dpdCDEkWEgYmnhur9uKioNCg0KxJDhu4MgxJHDoW5oIGdpw6EgxJHhu5NuZyB0aOG7nWkg4bqjbmggaMaw4bufbmcgY+G7p2Egbmhp4buBdSB54bq/dSB04buRIMSR4bq/biB4w6FjIHN14bqldCBt4buZdCBjw6EgbmjDom4gbMOgIG7hu68sIHTDoWMgZ2nhuqMgxJHDoyB4w6J5IGThu7FuZyBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIG5o4buLIHBow6JuIHbhu5tpIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBnZW5kZXIgKGdp4bubaSB0w61uaCkgdsOgIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCBiYW8gZ+G7k206IHVuaW9uICh0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiksIHNlY3RvciAobmfDoG5oIG5naOG7gSksIHJlZ2lvbiAodsO5bmcgbWnhu4FuKSwgb2NjdXBhdGlvbiAobG/huqFpIGjDrG5oIGPDtG5nIHZp4buHYyksIHbDoCBtYXJyaWVkICh0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4pLiBWaeG7h2Mgc+G7rSBk4bulbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSDEkWEgYmnhur9uIGNobyBwaMOpcCBraeG7g20gc2/DoXQg4bqjbmggaMaw4bufbmcgY+G7p2EgdOG7q25nIGJp4bq/biBraGkgeMOpdCDEkeG6v24gY8OhYyB54bq/dSB04buRIGPDsm4gbOG6oWksIHThu6sgxJHDsyBnacO6cCBoaeG7g3UgcsO1DQoNCg0KYGBge3J9DQpyZWdsb2dpdF9tdWx0aSA8LSBnbG0oZmFjdG9yKGdlbmRlcikgfiB1bmlvbitzZWN0b3IrcmVnaW9uLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBrX2NhdCwNCiAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpDQpzdW1tYXJ5KHJlZ2xvZ2l0X211bHRpKQ0KDQpgYGANCg0KJCQNClxsb2cgXGxlZnQoIFxmcmFje1AoXHRleHR7Z2VuZGVyfSA9IFx0ZXh0eyJmZW1hbGUifSl9ezEgLSBQKFx0ZXh0e2dlbmRlcn0gPSBcdGV4dHsiZmVtYWxlIn0pfSBccmlnaHQpID0gLTAuMzc1NCsgLTAuODIyNiBcY2RvdCBcdGV4dHt1bmlvbnllc30gLTEuODgxNyBcY2RvdCBcdGV4dHtzZWN0b3Jjb25zdHJ1Y3Rpb24gfSANCiQkDQoNCkThu7FhIHRyw6puIGvhur90IHF14bqjIGjhu5NpIHF1eSB04burIG3DtCBow6xuaCBMb2dpdCDEkWEgYmnhur9uLCB0YSBuaOG6rW4gdGjhuqV5IHLhurFuZyB4w6FjIHN14bqldCBt4buZdCBjw6EgbmjDom4gbMOgIG7hu68gZ2nhu5tpIChnaeG6oyDEkeG7i25oIGJp4bq/biBnZW5kZXIgPSAxIGJp4buDdSB0aOG7iyBnaeG7m2kgdMOtbmggbuG7rykgY2jhu4t1IOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIHThu6sgYmEgbmjDs20gYmnhur9uOiB0w6xuaCB0cuG6oW5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pLCBuZ8Ogbmggbmdo4buBIChzZWN0b3IpIHbDoCBraHUgduG7sWMgc2luaCBz4buRbmcgKHJlZ2lvbikuIEPhu6UgdGjhu4MsIGjhu4cgc+G7kSBjaOG6t24gKEludGVyY2VwdCkgY8OzIGdpw6EgdHLhu4sgw6JtICgtMC4zNzU0KSwgYmnhu4N1IHRo4buLIGxvZ2l0IChsb2ctb2RkcykgY+G7p2EgeMOhYyBzdeG6pXQgbMOgIG7hu68gdHJvbmcgbmjDs20gxJHhu5FpIHTGsOG7o25nIHRoYW0gY2hp4bq/dSwgdOG7qWMgbMOgIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIGThu4tjaCB24bulIChuaMOzbSB0aGFtIGNoaeG6v3UpLCB2w6Agc+G7kW5nIHThuqFpIGtodSB24buxYyB0aGFtIGNoaeG6v3UgKGPDsyB0aOG7gyBsw6AgdGjDoG5oIHRo4buLIGhv4bq3YyBtaeG7gW4gQuG6r2MsIHTDuXkgY8OhY2ggbcOjIGjDs2EgZOG7ryBsaeG7h3UgZ+G7kWMpLg0KDQrEkMOhbmcgY2jDuiDDvSwgYmnhur9uIHVuaW9ueWVzIGPDsyBo4buHIHPhu5Egw6JtIGtow6EgbOG7m24gKC0wLjgyMjYpLCBjaG8gdGjhuqV5IHLhurFuZyBuaOG7r25nIG5nxrDhu51pIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiBjw7MgeMOhYyBzdeG6pXQgbMOgIG7hu68gdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgY8O0bmcgxJFvw6BuLiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIHBo4bqjbiDDoW5oIHh1IGjGsOG7m25nIGdp4bubaSB0w61uaCB0cm9uZyB04buVIGNo4bupYyBjw7RuZyDEkW/DoG4sIG7GoWkgbmFtIGdp4bubaSBjw7MgdGjhu4MgY2hp4bq/bSDGsHUgdGjhur8gaMahbiBkbyDEkeG6t2MgdGjDuSBuZ8Ogbmggbmdo4buBIGhv4bq3YyB2YWkgdHLDsiDEkeG6oWkgZGnhu4duLg0KDQpOZ2/DoGkgcmEsIG5nw6BuaCBuZ2jhu4EgY8WpbmcgY2hvIHRo4bqleSDhuqNuaCBoxrDhu59uZyBt4bqhbmggbeG6vSDEkeG6v24geMOhYyBzdeG6pXQgbMOgIG7hu68uIEPhu6UgdGjhu4MsIG5nxrDhu51pIGxhbyDEkeG7mW5nIHRyb25nIG5nw6BuaCB4w6J5IGThu7FuZyAoc2VjdG9yY29uc3RydWN0aW9uKSBjw7MgaOG7hyBz4buRIMOibSBy4bqldCBs4bubbiAoLTEuODgxNyksIGNo4bupbmcgdOG7jyBraOG6oyBuxINuZyBsw6AgbuG7ryB0cm9uZyBuaMOzbSBuw6B5IGdp4bqjbSDEkcOhbmcga+G7gyBzbyB24bubaSBuaMOzbSBsw6BtIHZp4buHYyB0cm9uZyBuZ8OgbmggZOG7i2NoIHbhu6UuIMSQaeG7gXUgbsOgeSBwaMO5IGjhu6NwIHbhu5tpIHRo4buxYyB04bq/IGtow6FjaCBxdWFuLCBraGkgbmfDoG5oIHjDonkgZOG7sW5nIHRoxrDhu51uZyBjw7MgdOG7tyBs4buHIGxhbyDEkeG7mW5nIG5hbSBjaGnhur9tIMSRYSBz4buRLiBOZ8aw4bujYyBs4bqhaSwgYmnhur9uIHNlY3Rvcm90aGVyIGPDsyBo4buHIHPhu5EgZMawxqFuZyBuaOG6uSAoMC4zOTcxKSwgY2hvIHRo4bqleSBuZ8aw4budaSBsw6BtIHZp4buHYyB0cm9uZyBjw6FjIG5nw6BuaCBuZ2jhu4EgY8OybiBs4bqhaSBjw7MgeHUgaMaw4bubbmcgbMOgIG7hu68gY2FvIGjGoW4gc28gduG7m2kgbmfDoG5oIGThu4tjaCB24bulLCB0dXkgbmhpw6puIG3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGtow7RuZyBs4bubbiB2w6AgY+G6p24ga2nhu4NtIHRyYSB0aMOqbSDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdGjDtG5nIHF1YSBnacOhIHRy4buLIHAtdmFsdWUuDQoNCiMjICoqUGjhuqduIDY6IE3DtCBow6xuaCBQcm9iaXQqKg0KDQojIyMgKio2LjEgTcO0IGjDrG5oIFByb2JpdCBjaG8gZOG7ryBsaeG7h3Ugbmjhu4sgcGjDom4qKg0KDQojIyMjICoqNi4xLjEgIFTDoWMgxJHhu5luZyBj4bunYSB2aeG7h2MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIMSR4bq/biB4w6FjIHN14bqldCBsw6AgbuG7ryoqDQoNClRyb25nIG3DtCBow6xuaCBuw6B5LCBiaeG6v24gcGjhu6UgdGh14buZYyBnZW5kZXIgbMOgIG5o4buLIHBow6JuLCB24bubaSAibWFsZSIgPSAwIHbDoCAiZmVtYWxlIiA9IDEsIMSRxrDhu6NjIGdp4bqjaSB0aMOtY2ggYuG7n2kgYmnhur9uIHVuaW9uIOKAkyB0aOG7gyBoaeG7h24gdmnhu4djIGPDoSBuaMOibiBjw7MgdGhhbSBnaWEgY8O0bmcgxJFvw6BuIGhheSBraMO0bmcuIE3DtCBow6xuaCDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgYuG6sW5nIGjhu5NpIHF1eSBQcm9iaXQsIHbhu5tpIGjDoG0gbGnDqm4ga+G6v3QgbMOgIHBow6JuIHBo4buRaSBjaHXhuqluIHTDrWNoIGzFqXkgKGN1bXVsYXRpdmUgbm9ybWFsIGRpc3RyaWJ1dGlvbiwga8O9IGhp4buHdSBsw6AgzqYo4ouFKSkNCg0KTcO0IGjDrG5oIFByb2JpdCBuaMawIHNhdToNCg0KJCQNClAoXHRleHR7Z2VuZGVyfSA9IFx0ZXh0eyJmZW1hbGUifSkgPSBcUGhpKFxiZXRhXzAgKyBcYmV0YV8xIFxjZG90IFx0ZXh0e3VuaW9ufSkNCiQkDQoNCmBgYHtyfQ0Ka19jYXQkZ2VuZGVyIDwtIGZhY3RvcihrX2NhdCRnZW5kZXIsIGxldmVscyA9IGMoJ21hbGUnLCdmZW1hbGUnKSkNCnJlZ3Byb2JpdCA8LSBnbG0oZ2VuZGVyIH4gdW5pb24sIGRhdGEgPSBrX2NhdCwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdwcm9iaXQnKSkNCnJlZ3Byb2JpdA0KYGBgDQotIEludGVyY2VwdCA9IC0wLjAxMTQ1Og0KDQpLaGkgbeG7mXQgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiwgeMOhYyBzdeG6pXQgaOG7jSBsw6AgbuG7ryDEkcaw4bujYyB4w6FjIMSR4buLbmggYuG7n2k6DQoNCiQkDQpcUGhpKC0wLjAxMTQ1KSBcYXBwcm94IDAuNDk1DQokJA0KDQpU4bupYyBraG/huqNuZyA0OS41JS4NCg0KLSB1bmlvbnllcyA9IC0wLjUzNzA4OiAgDQogIEtoaSBt4buZdCBuZ8aw4budaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4sIGJp4bq/biBgdW5pb25gIGNodXnhu4NuIHNhbmcgZ2nDoSB0cuG7iyAxLCBuw6puIGJp4buDdSB0aOG7qWMgeMOhYyBzdeG6pXQgdHLhu58gdGjDoG5oOg0KDQogICQkDQogIFAoXHRleHR7ZmVtYWxlfSBcbWlkIFx0ZXh0e3VuaW9ufSA9IDEpID0gXFBoaSgtMC4wMTE0NSAtIDAuNTM3MDgpID0gXFBoaSgtMC41NDg1KSBcYXBwcm94IDAuMjkyDQogICQkDQoNCiAg4oaSIFjDoWMgc3XhuqV0IGzDoCBu4buvIGdp4bqjbSBjw7JuIGtob+G6o25nIDI5LjIlIGtoaSB0aGFtIGdpYSBjw7RuZyDEkW/DoG4uDQoNCk5oxrAgduG6rXksIGvhur90IHF14bqjIHThu6sgbcO0IGjDrG5oIFByb2JpdCBjaG8gdGjhuqV5IHBo4bulIG7hu68gY8OzIHh1IGjGsOG7m25nIMOtdCB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gaMahbiBuYW0gZ2nhu5tpLCB0xrDGoW5nIHThu7EgbmjGsCBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgdOG7qyBtw7QgaMOsbmggTG9naXQgdHLGsOG7m2MgxJHDsy4gU+G7sSBraMOhYyBiaeG7h3QgdHJvbmcgeMOhYyBzdeG6pXQgbsOgeSBwaOG6o24gw6FuaCBt4buRaSBsacOqbiBo4buHIHRpw6p1IGPhu7FjIGdp4buvYSBnaeG7m2kgbuG7ryB2w6Agdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQojIyMjICoqNi4xLjIgIFTDoWMgxJHhu5luZyBj4bunYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gxJHhur9uIHZp4buHYyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4qKg0KDQpUcm9uZyBwaOG6p24gbsOgeSwgdGEgc+G7rSBk4bulbmcgbcO0IGjDrG5oIFByb2JpdCBuaOG7iyBwaMOibiDEkeG7gyBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAobWFycmllZCkgdsOgIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiAodW5pb24pLiBCaeG6v24gcGjhu6UgdGh14buZYyB1bmlvbiDEkcaw4bujYyBtw6MgaMOzYSBsw6Agbmjhu4sgcGjDom4gduG7m2kgIm5vIiA9IDAsICJ5ZXMiID0gMS4NCg0KTcO0IGjDrG5oIFByb2JpdCBuaMawIHNhdToNCg0KJCQNClAoXHRleHR7dW5pb259ID0gXHRleHR7InllcyJ9KSA9IFxQaGkoXGJldGFfMCArIFxiZXRhXzEgXGNkb3QgXHRleHR7bWFycmllZH0pDQokJA0KDQoNCmBgYHtyfQ0Ka19jYXQkdW5pb24gPC0gZmFjdG9yKGtfY2F0JHVuaW9uLCBsZXZlbHMgPSBjKCdubycsJ3llcycpKQ0KcmVncHJvYml0MiA8LSBnbG0odW5pb24gfiBtYXJyaWVkLCBkYXRhID0ga19jYXQsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAncHJvYml0JykpDQpyZWdwcm9iaXQyDQpgYGANCg0KS+G6v3QgcXXhuqMgaOG7k2kgcXV5IHThu6sgbcO0IGjDrG5oIFByb2JpdCBjaG8gdGjhuqV5IGjhu4cgc+G7kSBjaOG6t24gSW50ZXJjZXB0IGzDoCAtMS4xMjQsIHbDoCBo4buHIHPhu5EgY+G7p2EgYmnhur9uIG1hcnJpZWRNIGzDoCAwLjMwMy4gxJDDonkgbMOgIGPDoWMgaOG7hyBz4buRIHRyb25nIHBoxrDGoW5nIHRyw6xuaCB4w6FjIHN14bqldCBjw7MgZOG6oW5nOg0KDQokJA0KUChcdGV4dHt1bmlvbn0gPSBcdGV4dHsieWVzIn0pID0gXFBoaShcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcdGV4dHttYXJyaWVkfSkNCiQkDQoNCnRyb25nIMSRw7MgXCggXFBoaSBcKSBsw6AgaMOgbSBwaMOibiBwaOG7kWkgdMOtY2ggbMWpeSBjaHXhuqluIGjDs2EgKENERiksIGTDuW5nIMSR4buDIGNodXnhu4NuIHThu5UgaOG7o3AgdHV54bq/biB0w61uaCB0aMOgbmggeMOhYyBzdeG6pXQuDQoNCkPhu6UgdGjhu4MsIGtoaSBt4buZdCBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLCBnacOhIHRy4buLIHThu5UgaOG7o3AgdHV54bq/biB0w61uaCBsw6A6DQoNCiQkDQpcYmV0YV8wID0gLTEuMTI0IFxSaWdodGFycm93IFxQaGkoLTEuMTI0KSBcYXBwcm94IDAuMTMwDQokJA0KDQpOZ2jEqWEgbMOgIGNo4buJIGtob+G6o25nIDEzJSBuaOG7r25nIG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4gdGhhbSBnaWEgY8O0bmcgxJFvw6BuLg0KDQpOZ8aw4bujYyBs4bqhaSwgxJHhu5FpIHbhu5tpIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biwgdGEgY8OzOg0KDQokJA0KXGJldGFfMCArIFxiZXRhXzEgPSAtMS4xMjQgKyAwLjMwMyA9IC0wLjgyMSBcUmlnaHRhcnJvdyBcUGhpKC0wLjgyMSkgXGFwcHJveCAwLjIwNg0KJCQNCg0KDQpL4bq/dCBxdeG6oyBuw6B5IGjDoG0gw70gcuG6sW5nIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7MgbGnDqm4gcXVhbiB0w61jaCBj4buxYyDEkeG6v24gdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4gQ8OzIHRo4buDIGzDvSBnaeG6o2kgcuG6sW5nIG5o4buvbmcgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHRoxrDhu51uZyBjw7MgeHUgaMaw4bubbmcg4buVbiDEkeG7i25oIGjGoW4gduG7gSBjw7RuZyB2aeG7h2MsIGhv4bq3YyBjw7Mgbmh1IGPhuqd1IGLhuqNvIHbhu4cgcXV54buBbiBs4bujaSBsYW8gxJHhu5luZyBjYW8gaMahbiwgbsOqbiBjw7MgxJHhu5luZyBs4buxYyB0aGFtIGdpYSBjw6FjIHThu5UgY2jhu6ljIMSR4bqhaSBkaeG7h24gbmjGsCBjw7RuZyDEkW/DoG4uDQoNClbhu4EgbeG6t3QgdGjhu5FuZyBrw6osIG3DtCBow6xuaCBjw7MgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCB0xrDGoW5nIMSR4buRaSwgduG7m2kgZ2nDoSB0cuG7iyBOdWxsIERldmlhbmNlIGdp4bqjbSB04burIDUwMy4xIHh14buRbmcgUmVzaWR1YWwgRGV2aWFuY2UgY8OybiA0OTguMywgdsOgIGNo4buJIHPhu5EgQUlDID0gNTAyLjMuIE3hurdjIGTDuSBtw7QgaMOsbmggY2jhu4kgc+G7rSBk4bulbmcgbeG7mXQgYmnhur9uIGdp4bqjaSB0aMOtY2gsIG5oxrBuZyBr4bq/dCBxdeG6oyB24bqrbiBjaG8gdGjhuqV5IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBsw6AgbeG7mXQgeeG6v3UgdOG7kSBjw7Mg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIGjDoG5oIHZpIHRoYW0gZ2lhIGPDtG5nIMSRb8Ogbi4NCg0KIyMjICAqKjYuMiBNw7QgaMOsbmggUHJvYml0IMSRYSBiaeG6v24qKg0KDQpgYGB7cn0NCmtfY2F0JGdlbmRlciA8LSBmYWN0b3Ioa19jYXQkZ2VuZGVyLCBsZXZlbHMgPSBjKCdtYWxlJywnZmVtYWxlJykpDQpyZWdwcm9iaXQzIDwtIGdsbShnZW5kZXIgfnVuaW9uK3NlY3RvcityZWdpb24gLCBkYXRhID0ga19jYXQsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAncHJvYml0JykpDQpzdW1tYXJ5KHJlZ3Byb2JpdDMpDQoNCmBgYA0KIA0KQmnhur9uIHVuaW9ueWVzIGPDsyBo4buHIHPhu5Egw6JtIHbDoCDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogbeG6oW5oIChwIDwgMC4wMDEpLCBjaG8gdGjhuqV5IG5nxrDhu51pIGxhbyDEkeG7mW5nIGPDsyB0aGFtIGdpYSBjw7RuZyDEkW/DoG4gY8OzIHjDoWMgc3XhuqV0IGzDoCBu4buvIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyB0aGFtIGdpYS4gTeG6t2MgZMO5IG3DtCBow6xuaCBQcm9iaXQga2jDtG5nIGNobyBwaMOpcCBkaeG7hW4gZ2nhuqNpIHRy4buxYyB0aeG6v3AgbmjGsCBvZGRzIHJhdGlvIHRyb25nIExvZ2l0LCBuaMawbmcgZOG6pXUgw6JtIHLDtSBy4buHdCB2w6AgbeG7qWMgw70gbmdoxKlhIHRo4bqlcCBraOG6s25nIMSR4buLbmgg4bqjbmggaMaw4bufbmcgdGnDqnUgY+G7sWMgY+G7p2Egdmnhu4djIHRoYW0gZ2lhIGPDtG5nIMSRb8OgbiDEkeG6v24ga2jhuqMgbsSDbmcgbMOgIG7hu68uDQoNClTGsMahbmcgdOG7sSwgbMOgbSB2aeG7h2MgdHJvbmcgbmfDoG5oIHjDonkgZOG7sW5nIChzZWN0b3Jjb25zdHJ1Y3Rpb24pIGPFqW5nIGPDsyDhuqNuaCBoxrDhu59uZyB0acOqdSBj4buxYyDEkeG6v24geMOhYyBzdeG6pXQgbMOgIG7hu68sIHbhu5tpIGjhu4cgc+G7kSDDom0gbOG7m24gKC0xLjA3NzM4KSB2w6Agw70gbmdoxKlhIHRo4buRbmcga8OqIGNhbyAocCA9IDAuMDA2OCkuIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCB0aOG7sWMgdHLhuqFuZyBuZ8OgbmggeMOieSBk4buxbmcgY2jhu6cgeeG6v3UgZG8gbmFtIGdp4bubaSDEkeG6o20gbmjhuq1uLiBUcm9uZyBraGkgxJHDsywgYmnhur9uIHNlY3Rvcm90aGVyIChjw6FjIG5nw6BuaCBraMOhYyBuZ2/DoGkgeMOieSBk4buxbmcgdsOgIHPhuqNuIHh14bqldCkgY8OzIGjhu4cgc+G7kSBkxrDGoW5nLCBwaOG6o24gw6FuaCB4dSBoxrDhu5tuZyB0w61jaCBj4buxYyDEkeG7kWkgduG7m2kgbuG7ryBnaeG7m2ksIHR1eSBjaOG7iSBn4bqnbiDEkeG6oXQgw70gbmdoxKlhIHRo4buRbmcga8OqIChwID0gMC4wODQ1KS4NCg0KQmnhur9uIHJlZ2lvbm90aGVyIChraHUgduG7sWMgc2luaCBz4buRbmcga2jDoWMgdsO5bmcgY2jDrW5oKSBjw7MgaOG7hyBz4buRIGTGsMahbmcgcuG6pXQgbmjhu48gdsOgIHAtdmFsdWUgY2FvIChwID0gMC40OTMpLCBjaG8gdGjhuqV5IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgduG7gSBnaeG7m2kgdMOtbmggZ2nhu69hIGPDoWMga2h1IHbhu7FjIMSR4buLYSBsw70uDQoNCg0KIyMgKipQaOG6p24gNzogQ8OhYyB0acOqdSBjaGkgxJHDoW5oIGdpw6EgbcO0IGjDrG5oKioNCg0KIyMjICoqNy4xIENo4buJIHPhu5EgQUlDKioNCg0KYGBge3J9DQpBSUMocmVnbG9naXRfbXVsdGkpDQpBSUMocmVncHJvYml0MykNCmBgYA0KTcO0IGjDrG5oIHByb2JpdCBjw7MgQUlDIG5o4buPIG5o4bqldCAoNzE0LjM4NTMpLCBjaG8gdGjhuqV5IMSRw6J5IGzDoCBtw7QgaMOsbmggcGjDuSBo4bujcCBuaOG6pXQgdHJvbmcgYmEgbcO0IGjDrG5oIMSRxrDhu6NjIHNvIHPDoW5oLCB0aGVvIHRpw6p1IGNow60gQUlDLg0KDQojIyMgKio3LjIgSOG7hyBz4buRIEJyaWVyIFNjb3JlKioNCg0KYGBge3J9DQpCcmllclNjb3JlKHJlZ2xvZ2l0X211bHRpKQ0KQnJpZXJTY29yZShyZWdwcm9iaXQzICkNCmBgYA0KDQpL4bq/dCBxdeG6oyDEkcOhbmggZ2nDoSBi4bqxbmcgY2jhu4kgc+G7kSBCcmllciBTY29yZSBjaG8gdGjhuqV5IG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXQgY8OzIGdpw6EgdHLhu4sgQnJpZXIgbMOgIDAuMjM1MTI4MSwgdHJvbmcga2hpIG3DtCBow6xuaCBwcm9iaXQgY8OzIGdpw6EgdHLhu4sgQnJpZXIgdGjhuqVwIGjGoW4gbeG7mXQgY2jDunQsIGzDoCAwLjIzNTEwNDkuIEJyaWVyIFNjb3JlIMSRbyBsxrDhu51uZyBzYWkgc+G7kSB0cnVuZyBiw6xuaCBiw6xuaCBwaMawxqFuZyBnaeG7r2EgeMOhYyBzdeG6pXQgZOG7sSDEkW/DoW4gdsOgIGdpw6EgdHLhu4sgdGjhu7FjIHThur8sIHbhu5tpIGdpw6EgdHLhu4sgY8Ogbmcgbmjhu48gdGjhu4MgaGnhu4duIGThu7EgYsOhbyB4w6FjIHN14bqldCBjw6BuZyBjaMOtbmggeMOhYy4gTeG6t2MgZMO5IHPhu7EgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIG3DtCBow6xuaCBsw6AgcuG6pXQgbmjhu48gKDAuMDAwMDIzMiksIG5oxrBuZyBr4bq/dCBxdeG6oyBuw6B5IGNobyB0aOG6pXkgbcO0IGjDrG5oIHByb2JpdCBjw7MgaGnhu4d1IG7Eg25nIHThu5F0IGjGoW4gbeG7mXQgY8OhY2ggbmjhurkgduG7gSBt4bq3dCBk4buxIGLDoW8geMOhYyBzdeG6pXQuDQoNCiMjIyAqKjcuMyBNYSB0cuG6rW4gbmjhuqdtIGzhuqtuKioNCg0KLSBNYSB0cuG6rW4gbmjhuqdtIGzhuqtuIGPhu6dhIG3DtCBow6xuaCBsb2dpdA0KDQpgYGB7cn0NCmFjdHVhbDEgPC0gaWZlbHNlKGtfY2F0JGdlbmRlciA9PSAiZmVtYWxlIiwgMSwgMCkNCnByZWQxIDwtIGlmZWxzZShwcmVkaWN0KHJlZ2xvZ2l0X211bHRpLCB0eXBlID0gInJlc3BvbnNlIikgPj0gMC41LCAxLCAwKQ0KY29uZl9tYXQxIDwtIHRhYmxlKFByZWRpY3RlZCA9IHByZWQxLCBBY3R1YWwgPSBhY3R1YWwxKQ0KcHJpbnQoY29uZl9tYXQxKQ0KbGlicmFyeShjYXJldCkNCmNvbmZ1c2lvbk1hdHJpeChhcy5mYWN0b3IocHJlZDEpLCBhcy5mYWN0b3IoYWN0dWFsMSksIHBvc2l0aXZlID0gIjEiKQ0KDQpgYGANCg0KDQotIE1hIHRy4bqtbiBuaOG6p20gbOG6q24gY8awYSBtw7QgaMOsbmggcHJvYml0DQoNCmBgYHtyfQ0KYWN0dWFsMiA8LSBpZmVsc2Uoa19jYXQkZ2VuZGVyID09ICJmZW1hbGUiLCAxLCAwKQ0KcHJlZDIgPC0gaWZlbHNlKHByZWRpY3QocmVncHJvYml0MywgdHlwZSA9ICJyZXNwb25zZSIpID49IDAuNSwgMSwgMCkNCmNvbmZfbWF0MiA8LSB0YWJsZShQcmVkaWN0ZWQgPSBwcmVkMiwgQWN0dWFsID0gYWN0dWFsMikNCnByaW50KGNvbmZfbWF0MikNCmNvbmZ1c2lvbk1hdHJpeChhcy5mYWN0b3IocHJlZDIpLCBhcy5mYWN0b3IoYWN0dWFsMiksIHBvc2l0aXZlID0gIjEiKQ0KDQpgYGANClThu6sga+G6v3QgcXXhuqMgbWEgdHLhuq1uIG5o4bqnbSBs4bqrbiBj4bunYSBoYWkgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpdCB2w6AgcHJvYml0LCBjaMO6bmcgdMO0aSBuaOG6rW4gdGjhuqV5IHLhurFuZyBj4bqjIGhhaSBtw7QgaMOsbmggxJHhu4F1IGNobyBr4bq/dCBxdeG6oyBk4buxIMSRb8OhbiBn4bqnbiBuaMawIHTGsMahbmcgxJHhu5NuZy4gQ+G7pSB0aOG7gywgbcO0IGjDrG5oIGThu7EgxJFvw6FuIMSRw7puZyAxODEgdHLGsOG7nW5nIGjhu6NwIGzDoCBu4buvIChUcnVlIFBvc2l0aXZlKSB2w6AgMTI2IHRyxrDhu51uZyBo4bujcCBsw6AgbmFtIChUcnVlIE5lZ2F0aXZlKSwgdHV5IG5oacOqbiB24bqrbiBjw7JuIDE2MyB0csaw4budbmcgaOG7o3AgbMOgIG5hbSBuaMawbmcgYuG7iyBk4buxIMSRb8OhbiBuaOG6p20gbMOgIG7hu68gKEZhbHNlIFBvc2l0aXZlKSwgdsOgIDY0IHRyxrDhu51uZyBo4bujcCBsw6AgbuG7ryBi4buLIGThu7EgxJFvw6FuIG5o4bqnbSBsw6AgbmFtIChGYWxzZSBOZWdhdGl2ZSkuIFThu7cgbOG7hyBk4buxIMSRb8OhbiDEkcO6bmcgdOG7lW5nIHRo4buDIChBY2N1cmFjeSkgxJHhuqF0IDU3LDUlLCBjYW8gaMahbiBt4bupYyDEkW/DoW4gbcOyIChObyBJbmZvcm1hdGlvbiBSYXRlID0gNTQsMSUpIG5oxrBuZyBjaMawYSDEkeG6oXQgw70gbmdoxKlhIHRo4buRbmcga8OqIHLDtSByw6BuZyAocCA9IDAsMDY0KS4gTcO0IGjDrG5oIGPDsyDEkeG7mSBuaOG6oXkgKFNlbnNpdGl2aXR5KSB0xrDGoW5nIMSR4buRaSBjYW8sIMSR4bqhdCA3Myw5JSwgY2hvIHRo4bqleSBraOG6oyBuxINuZyBuaOG6rW4gZGnhu4duIMSRw7puZyBu4buvIGdp4bubaSBraMOhIHThu5F0LiBUdXkgbmhpw6puLCDEkeG7mSDEkeG6t2MgaGnhu4d1IChTcGVjaWZpY2l0eSkgY2jhu4kgxJHhuqF0IDQzLDYlLCBwaOG6o24gw6FuaCBraOG6oyBuxINuZyBwaMOibiBiaeG7h3QgxJHDum5nIG5hbSBnaeG7m2kgY8OybiBo4bqhbiBjaOG6vy4gR2nDoSB0cuG7iyBLYXBwYSBjaOG7iSDhu58gbeG7qWMgMCwxNywgY2hvIHRo4bqleSBt4bupYyDEkeG7mSDEkeG7k25nIHRodeG6rW4gZ2nhu69hIG3DtCBow6xuaCB2w6AgdGjhu7FjIHThur8gY8OybiB0aOG6pXAsIHRyb25nIGtoaSBraeG7g20gxJHhu4tuaCBNY05lbWFyIGNobyB0aOG6pXkgY8OzIHPhu7Egc2FpIGzhu4djaCDEkcOhbmcga+G7gyBnaeG7r2EgaGFpIG5ow7NtIGThu7EgxJFvw6FuIHNhaS4gVOG7qyDEkcOzIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nLCBt4bq3YyBkw7kgbcO0IGjDrG5oIGPDsyBraOG6oyBuxINuZyBuaOG6rW4gZGnhu4duIG5ow7NtIG7hu68gdOG7kXQsIGhp4buHdSBxdeG6oyBwaMOibiBsb+G6oWkgdOG7lW5nIHRo4buDIHbhuqtuIGPDsm4gaOG6oW4gY2jhur8gdsOgIGPhuqduIMSRxrDhu6NjIGPhuqNpIHRoaeG7h24gdGjDqm0sIGNo4bqzbmcgaOG6oW4gYuG6sW5nIGPDoWNoIMSRxrBhIHRow6ptIGPDoWMgYmnhur9uIGdp4bqjaSB0aMOtY2gga2jDoWMgaG/hurdjIMSRaeG7gXUgY2jhu4luaCBuZ8aw4buhbmcgcGjDom4gbG/huqFpIHBow7kgaOG7o3AgaMahbi4NCg==