1 Giới thiệu

Bộ dữ liệu mpg là một tập dữ liệu kinh điển được thu thập bởi Cơ quan Bảo vệ Môi trường Hoa Kỳ (EPA), chứa thông tin về mức tiêu thụ nhiên liệu của các mẫu xe phổ biến từ năm 1999 đến 2008. Dữ liệu này thường được dùng để nghiên cứu mối quan hệ giữa các đặc tính của xe và hiệu suất nhiên liệu. Trong nghiên cứu này, tác giả tập trung vào hai biến định tính quan trọng liên quan đến cấu trúc và phân loại xe, đó là:

  • drv: Loại hệ dẫn động của xe (f = cầu trước, r = cầu sau, 4 = hai cầu).
  • class: Phân loại xe (ví dụ: compact, suv, midsize).

Hai biến này được chọn làm biến nghiên cứu chính, với mục tiêu phân tích xem các yếu tố kỹ thuật và đặc điểm của nhà sản xuất như:

  • Nhà sản xuất (manufacturer)
  • Số xi-lanh của động cơ (cyl)
  • Dung tích động cơ (displ)
  • Loại hộp số (trans)

… có ảnh hưởng như thế nào đến loại hệ dẫn độngphân khúc xe của một mẫu xe.

Thông qua việc sử dụng các công cụ phân tích dữ liệu định tính như: bảng tần số, biểu đồ minh họa, kiểm định Chi bình phương, phân tích tỷ số chênh lệch (Odds Ratio) và rủi ro tương đối (Relative Risk), bài nghiên cứu sẽ làm rõ các yếu tố quan trọng ảnh hưởng đến đặc tính kỹ thuật của các dòng xe, từ đó đưa ra những góc nhìn hữu ích cho ngành công nghiệp ô tô về xu hướng thiết kế và sản xuất.

1.1 Đọc và khám phá dữ liệu

library(ggplot2)
library(dplyr)
library(epitools)

# Đọc dữ liệu từ package ggplot2
data("mpg")
str(mpg)
## tibble [234 × 11] (S3: tbl_df/tbl/data.frame)
##  $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
##  $ model       : chr [1:234] "a4" "a4" "a4" "a4" ...
##  $ displ       : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
##  $ drv         : chr [1:234] "f" "f" "f" "f" ...
##  $ cty         : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : chr [1:234] "p" "p" "p" "p" ...
##  $ class       : chr [1:234] "compact" "compact" "compact" "compact" ...
summary(mpg)
##  manufacturer          model               displ            year     
##  Length:234         Length:234         Min.   :1.600   Min.   :1999  
##  Class :character   Class :character   1st Qu.:2.400   1st Qu.:1999  
##  Mode  :character   Mode  :character   Median :3.300   Median :2004  
##                                        Mean   :3.472   Mean   :2004  
##                                        3rd Qu.:4.600   3rd Qu.:2008  
##                                        Max.   :7.000   Max.   :2008  
##       cyl           trans               drv                 cty       
##  Min.   :4.000   Length:234         Length:234         Min.   : 9.00  
##  1st Qu.:4.000   Class :character   Class :character   1st Qu.:14.00  
##  Median :6.000   Mode  :character   Mode  :character   Median :17.00  
##  Mean   :5.889                                         Mean   :16.86  
##  3rd Qu.:8.000                                         3rd Qu.:19.00  
##  Max.   :8.000                                         Max.   :35.00  
##       hwy             fl               class          
##  Min.   :12.00   Length:234         Length:234        
##  1st Qu.:18.00   Class :character   Class :character  
##  Median :24.00   Mode  :character   Mode  :character  
##  Mean   :23.44                                        
##  3rd Qu.:27.00                                        
##  Max.   :44.00
sapply(mpg, function(x) length(unique(x)))
## manufacturer        model        displ         year          cyl        trans 
##           15           38           35            2            4           10 
##          drv          cty          hwy           fl        class 
##            3           21           27            5            7

1.2 Mô tả các biến

Tên biến Kiểu dữ liệu Số lượng giá trị duy nhất Mô tả nội dung
manufacturer Character 15 Hãng sản xuất xe (ví dụ: audi, ford, toyota).
model Character 38 Tên dòng xe.
displ Numeric 47 Dung tích động cơ (lít).
year Integer 2 Năm sản xuất (1999 hoặc 2008).
cyl Integer 4 Số xi-lanh động cơ (4, 5, 6, 8).
trans Character 10 Loại hộp số (ví dụ: auto(l5), manual(m6)).
drv Character 3 Loại hệ dẫn động (f=cầu trước, r=cầu sau, 4=hai cầu).
cty Integer 21 Mức tiêu thụ nhiên liệu trong thành phố (dặm/gallon).
hwy Integer 27 Mức tiêu thụ nhiên liệu trên cao tốc (dặm/gallon).
fl Character 5 Loại nhiên liệu (p=premium, r=regular, e=ethanol, d=diesel, c=cng).
class Character 7 Phân loại xe (ví dụ: compact, suv, pickup).

Nhận xét

Bộ dữ liệu gồm 11 biến và 234 quan sát, được chia thành hai nhóm chính: biến định lượng và biến định tính.

  • Biến định lượng: Gồm các biến displ, year, cyl, cty, hwy. Các biến này đo lường các thông số kỹ thuật và hiệu suất, có thể dùng để tính toán các chỉ số thống kê và xây dựng mô hình hồi quy.

  • Các biến định tính: Gồm các biến manufacturer, model, trans, drv, fl, class. Các biến này mang thông tin dạng danh mục, thường được phân tích bằng cách đếm tần số, tỷ lệ, và sử dụng các phương pháp thống kê cho dữ liệu định tính.

Tạo bộ dữ liệu chỉ có biến định tính (và các biến định lượng cần thiết)

# Tạo bộ dữ liệu chỉ chứa các biến cần thiết cho phân tích định tính
data1 <- mpg %>%
  select(manufacturer, class, drv, cyl, trans)

# Xem trước dữ liệu mới
str(data1)
## tibble [234 × 5] (S3: tbl_df/tbl/data.frame)
##  $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
##  $ class       : chr [1:234] "compact" "compact" "compact" "compact" ...
##  $ drv         : chr [1:234] "f" "f" "f" "f" ...
##  $ cyl         : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
head(data1)

2 Thống kê mô tả biến nghiên cứu

2.1 Thống kê mô tả biến phụ thuộc

2.1.1 Biến drv (Hệ dẫn động)

Lập bảng tần số và tần suất

table(data1$drv)
## 
##   4   f   r 
## 103 106  25
prop.table(table(data1$drv))
## 
##         4         f         r 
## 0.4401709 0.4529915 0.1068376

Vẽ biểu đồ cột

freq_drv <- as.data.frame(table(data1$drv))
colnames(freq_drv) <- c("DRV", "Count")

ggplot(freq_drv, aes(x = DRV, y = Count)) +
  geom_col(fill = "#9370DB", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5) +
  labs(title = "Tần số theo loại hệ dẫn động", x = "Loại hệ dẫn động", y = "Số lượng") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào bảng tần số, tần suất và biểu đồ của biến drv, ta có các nhận định sau:

  • Xe dẫn động cầu trước (f) chiếm số lượng lớn nhất với 106 xe, tương ứng 45.3% tổng số mẫu.
  • Xe dẫn động hai cầu (4) đứng thứ hai với 103 xe, chiếm 44.0%.
  • Xe dẫn động cầu sau (r) chỉ có 25 xe, là loại ít phổ biến nhất trong bộ dữ liệu, chiếm khoảng 10.7%.

Kết luận:

Phân bố cho thấy các mẫu xe trong bộ dữ liệu này chủ yếu là xe dẫn động cầu trước và hai cầu, phản ánh xu hướng phổ biến của thị trường xe du lịch tại Mỹ trong giai đoạn đó.

2.1.2 Biến class (Phân loại xe)

Lập bảng tần số và tần suất

table(data1$class)
## 
##    2seater    compact    midsize    minivan     pickup subcompact        suv 
##          5         47         41         11         33         35         62
prop.table(table(data1$class))
## 
##    2seater    compact    midsize    minivan     pickup subcompact        suv 
## 0.02136752 0.20085470 0.17521368 0.04700855 0.14102564 0.14957265 0.26495726

Vẽ biểu đồ cột

freq_class <- as.data.frame(table(data1$class))
colnames(freq_class) <- c("Class", "Count")

ggplot(freq_class, aes(x = reorder(Class, -Count), y = Count)) +
  geom_col(fill = "#66CDAA", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5) +
  labs(title = "Tần số theo phân loại xe", x = "Phân loại xe", y = "Số lượng") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào bảng tần số và biểu đồ của biến class, ta có các nhận định sau:

  • Dòng xe SUV là phổ biến nhất với 62 xe, chiếm 26.5%.
  • Theo sau là các dòng compact (47 xe, ~20.1%) và midsize (41 xe, ~17.5%).
  • Các dòng xe ít phổ biến hơn là 2seater, minivan, và subcompact.

Kết luận:

Phân bố dữ liệu cho thấy sự thống trị của phân khúc SUV, phù hợp với xu hướng tiêu dùng xe tại Mỹ. Các dòng xe sedan cỡ vừa và nhỏ cũng chiếm một thị phần đáng kể.

2.2 Thống kê mô tả biến độc lập

2.2.1 Biến manufacturer (Hãng sản xuất)

Lập bảng tần số và tần suất

table(data1$manufacturer)
## 
##       audi  chevrolet      dodge       ford      honda    hyundai       jeep 
##         18         19         37         25          9         14          8 
## land rover    lincoln    mercury     nissan    pontiac     subaru     toyota 
##          4          3          4         13          5         14         34 
## volkswagen 
##         27
prop.table(table(data1$manufacturer))
## 
##       audi  chevrolet      dodge       ford      honda    hyundai       jeep 
## 0.07692308 0.08119658 0.15811966 0.10683761 0.03846154 0.05982906 0.03418803 
## land rover    lincoln    mercury     nissan    pontiac     subaru     toyota 
## 0.01709402 0.01282051 0.01709402 0.05555556 0.02136752 0.05982906 0.14529915 
## volkswagen 
## 0.11538462

Vẽ biểu đồ cột

freq_mfr <- as.data.frame(table(data1$manufacturer))
colnames(freq_mfr) <- c("Manufacturer", "Count")

ggplot(freq_mfr, aes(x = reorder(Manufacturer, -Count), y = Count)) +
  geom_col(fill = "#6495ED", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, size = 3) +
  labs(title = "Tần số theo hãng sản xuất", x = "Hãng sản xuất", y = "Số lượng") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào bảng tần số và biểu đồ trên, ta có các nhận định sau:

  • Dodge là hãng có nhiều mẫu xe nhất trong bộ dữ liệu (37 xe).
  • Theo sau là Toyota (34 xe) và Volkswagen (27 xe).
  • Các hãng như lincoln, land rover, mercury có số lượng mẫu rất ít.

Kết luận:

Phân bố không đều, cho thấy bộ dữ liệu tập trung vào các mẫu xe từ một số hãng sản xuất phổ biến tại thị trường Mỹ.

2.2.2 Biến cyl (Số xi-lanh)

Lập bảng tần số và tần suất

table(data1$cyl)
## 
##  4  5  6  8 
## 81  4 79 70
prop.table(table(data1$cyl))
## 
##          4          5          6          8 
## 0.34615385 0.01709402 0.33760684 0.29914530

Vẽ biểu đồ cột

freq_cyl <- as.data.frame(table(data1$cyl))
colnames(freq_cyl) <- c("Cylinders", "Count")

ggplot(freq_cyl, aes(x = as.factor(Cylinders), y = Count)) +
  geom_col(fill = "#FF9966", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5) +
  labs(title = "Tần số theo số xi-lanh", x = "Số xi-lanh", y = "Số lượng") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Dựa vào bảng tần số và tần suất của biến cyl, ta có các nhận định sau:

  • Động cơ 4 xi-lanh6 xi-lanh là phổ biến nhất, chiếm lần lượt 34.6% và 33.8%.
  • Động cơ 8 xi-lanh cũng chiếm một tỷ lệ đáng kể (30.3%).
  • Động cơ 5 xi-lanh rất hiếm, chỉ có 4 mẫu.

Kết luận:

Phân bố cho thấy sự đa dạng trong cấu hình động cơ, nhưng tập trung chủ yếu vào các loại động cơ 4, 6, và 8 xi-lanh, phù hợp với các phân khúc xe khác nhau từ xe nhỏ tiết kiệm nhiên liệu đến xe SUV và bán tải mạnh mẽ.


3 Ước lượng khoảng và kiểm định giả thuyết cho tỷ lệ

3.1 Kiểm định hai phía

3.1.1 Biến class: Tỷ lệ xe SUV

3.1.1.1 Mục tiêu

Thực hiện kiểm định để xác định xem tỷ lệ xe thuộc phân khúc SUV (class = "suv") trong tập dữ liệu có khác biệt so với 25% hay không.

3.1.1.2 Tính toán tỷ lệ mẫu

# Số lượng xe SUV
sumSUV <- sum(data1$class == "suv")

# Tổng số xe
sumTotal <- nrow(data1)

# Tỷ lệ mẫu
p_hat_suv <- sumSUV / sumTotal
p_hat_suv
## [1] 0.2649573

3.1.1.3 Kiểm định tỷ lệ 1 mẫu

Giả thuyết kiểm định

  • H0: p = 0.25 (Tỷ lệ xe SUV bằng 25%)
  • H1: p ≠ 0.25 (Tỷ lệ xe SUV khác 25%)

Tiến hành kiểm định hai phía với mức ý nghĩa α = 0.05.

prop.test(x = sumSUV, n = sumTotal, p = 0.25, conf.level = 0.95, correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sumSUV out of sumTotal, null probability 0.25
## X-squared = 0.20513, df = 1, p-value = 0.6506
## alternative hypothesis: true p is not equal to 0.25
## 95 percent confidence interval:
##  0.2105805 0.3272105
## sample estimates:
##         p 
## 0.2649573

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

  • Giá trị thống kê (X-squared): 0.20798
  • Giá trị p (p-value): 0.6483
  • Khoảng tin cậy 95% cho tỷ lệ thực: [0.211, 0.326]
  • Ước lượng tỷ lệ từ mẫu (p̂): 0.2649573

Kết luận:

Với p-value = 0.6483 > 0.05, chúng ta không có đủ bằng chứng thống kê để bác bỏ giả thuyết H0. Có thể chấp nhận rằng tỷ lệ xe SUV trong tổng thể không khác biệt một cách có ý nghĩa so với 25%.

3.2 Kiểm định một phía

3.2.1 Biến drv: Tỷ lệ xe dẫn động hai cầu (4WD)

3.2.1.1 Mục tiêu

Xác định xem tỷ lệ xe có hệ dẫn động hai cầu (drv = "4") có nhỏ hơn 50% hay không.

3.2.1.2 Tính toán tỷ lệ mẫu

sum4WD <- sum(data1$drv == "4")
p_hat_4wd <- sum4WD / sumTotal
p_hat_4wd
## [1] 0.4401709

3.2.1.3 Kiểm định tỷ lệ 1 mẫu

Giả thuyết kiểm định

  • H0: p ≥ 0.50 (Tỷ lệ xe 4WD không nhỏ hơn 50%)
  • H1: p < 0.50 (Tỷ lệ xe 4WD nhỏ hơn 50%)

Tiến hành kiểm định một phía với mức ý nghĩa α = 0.05.

prop.test(x = sum4WD, n = sumTotal, p = 0.50, conf.level = 0.95, correct = TRUE, alternative = "less")
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum4WD out of sumTotal, null probability 0.5
## X-squared = 3.1154, df = 1, p-value = 0.03878
## alternative hypothesis: true p is less than 0.5
## 95 percent confidence interval:
##  0.0000000 0.4960698
## sample estimates:
##         p 
## 0.4401709

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

  • Giá trị thống kê (X-squared): 2.4042
  • p-value: 0.06069
  • Khoảng tin cậy 95% (một phía): [0, 0.495]
  • Tỷ lệ mẫu (p̂): 0.4401709

Kết luận:

Với p-value = 0.06069, lớn hơn một chút so với mức ý nghĩa 0.05, chúng ta không có đủ bằng chứng thống kê để bác bỏ giả thuyết H0. Mặc dù tỷ lệ mẫu (44%) nhỏ hơn 50%, sự khác biệt này chưa đủ lớn để có thể khẳng định một cách chắc chắn ở mức ý nghĩa 5%.


4 Phân tích mối quan hệ giữa biến độc lập và phụ thuộc

4.1 Phân tích mối quan hệ giữa drv (hệ dẫn động) và class (phân loại xe)

Câu hỏi nghiên cứu: “Phân loại xe có ảnh hưởng đến loại hệ dẫn động được trang bị không?”

4.1.1 Phân loại xe có ảnh hưởng đến hệ dẫn động không?

Bảng tần số chéo

table_drv_class <- table(data1$drv, data1$class)
table_drv_class
##    
##     2seater compact midsize minivan pickup subcompact suv
##   4       0      12       3       0     33          4  51
##   f       0      35      38      11      0         22   0
##   r       5       0       0       0      0          9  11

Vẽ biểu đồ

df_drv_class <- as.data.frame(table_drv_class)
colnames(df_drv_class) <- c("DRV", "Class", "Count")

# Vẽ biểu đồ cột theo nhóm
ggplot(df_drv_class, aes(x = Class, y = Count, fill = DRV)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(
    title = "Phân bố hệ dẫn động theo phân loại xe",
    x = "Phân loại xe",
    y = "Số lượng",
    fill = "Hệ dẫn động"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 45, hjust = 1))

Kiểm định chi bình phương

Giả thuyết thống kê

  • Giả thuyết không (H₀): Không có mối liên hệ giữa phân loại xe và hệ dẫn động.
  • Giả thuyết đối (H₁): Có mối liên hệ giữa phân loại xe và hệ dẫn động.
chisq_test <- chisq.test(table_drv_class)
chisq_test
## 
##  Pearson's Chi-squared test
## 
## data:  table_drv_class
## X-squared = 221.6, df = 12, p-value < 2.2e-16

Nhận xét kết quả kiểm định:

Với p-value < 2.2e-16 (rất gần 0), ta bác bỏ giả thuyết H0. Do đó, có thể kết luận rằng phân loại xe và loại hệ dẫn động có mối liên hệ có ý nghĩa thống kê rất mạnh mẽ. Từ biểu đồ, có thể thấy rõ xe SUV và pickup gần như chỉ có hệ dẫn động 4 hoặc r, trong khi xe compactmidsize chủ yếu là f.

4.1.2 So sánh khả năng được trang bị dẫn động hai cầu (4WD) giữa xe SUV và Compact

Tạo bảng tần số mới

# Lọc dữ liệu chỉ bao gồm 2 nhóm 'suv' và 'compact'
data_sub <- data1 %>%
  filter(class %in% c("suv", "compact"))

# Tạo bảng 2x2: Class (suv vs compact) ~ DRV (4WD vs Not 4WD)
# Đặt 'suv' là nhóm phơi nhiễm, '4' là sự kiện
table_suv_compact <- table(
  Class = factor(data_sub$class, levels = c("suv", "compact")),
  Is_4WD = ifelse(data_sub$drv == "4", "yes", "no")
)

# Đảm bảo thứ tự cột là 'yes', 'no'
table_suv_compact <- table_suv_compact[, c("yes", "no")]
print(table_suv_compact)
##          Is_4WD
## Class     yes no
##   suv      51 11
##   compact  12 35

Tính Relative Risk (RR) và Odds Ratio (OR)

# Tính RR
rr_result <- riskratio(table_suv_compact)
print(rr_result$measure)
##          risk ratio with 95% C.I.
## Class     estimate    lower    upper
##   suv     1.000000       NA       NA
##   compact 4.197292 2.393927 7.359147
# Tính OR
or_result <- oddsratio(table_suv_compact)
print(or_result$measure)
##          odds ratio with 95% C.I.
## Class     estimate    lower    upper
##   suv      1.00000       NA       NA
##   compact 12.97504 5.310361 34.47191

Nhận xét

  • Relative Risk (RR) = 4.197: Tỷ lệ một chiếc xe là xe dẫn động hai cầu (4WD) ở nhóm Compact cao gấp 4.197 lần so với nhóm SUV.
  • Odds Ratio (OR) = 12.97: Tỷ lệ để một chiếc xe là xe 4WD ở nhóm Compact cao gấp 12.97 lần so với odds ở nhóm SUV.

Cả hai chỉ số đều cho thấy một mối liên hệ cực kỳ mạnh mẽ. Xe Compact có khả năng được trang bị hệ dẫn động hai cầu cao hơn rất nhiều so với xe SUV.


4.2 Phân tích mối quan hệ giữa drv (hệ dẫn động) và cyl (số xi-lanh)

Câu hỏi nghiên cứu: “Số xi-lanh của động cơ, một chỉ số quan trọng về sức mạnh, có liên quan đến loại hệ dẫn động được trang bị trên xe hay không?”

4.2.1 Số xi-lanh có ảnh hưởng đến hệ dẫn động không?

Bảng tần số chéo

table_drv_cyl <- table(data1$drv, data1$cyl)
table_drv_cyl
##    
##      4  5  6  8
##   4 23  0 32 48
##   f 58  4 43  1
##   r  0  0  4 21

Vẽ biểu đồ

df_drv_cyl <- as.data.frame(table_drv_cyl)
colnames(df_drv_cyl) <- c("DRV", "Cylinders", "Count")

ggplot(df_drv_cyl, aes(x = as.factor(Cylinders), y = Count, fill = DRV)) +
  geom_bar(stat = "identity", position = "fill") +
  labs(
    title = "Tỷ lệ hệ dẫn động theo số xi-lanh",
    x = "Số xi-lanh",
    y = "Tỷ lệ",
    fill = "Hệ dẫn động"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Kiểm định chi bình phương

Giả thuyết thống kê

  • Giả thuyết không (H₀): Không có mối liên hệ giữa số xi-lanh và hệ dẫn động.
  • Giả thuyết đối (H₁): Có mối liên hệ giữa số xi-lanh và hệ dẫn động.
chisq.test(table_drv_cyl)
## 
##  Pearson's Chi-squared test
## 
## data:  table_drv_cyl
## X-squared = 98.136, df = 6, p-value < 2.2e-16

Nhận xét kết quả kiểm định:

Với p-value < 2.2e-16, ta bác bỏ giả thuyết H0. Có một mối liên hệ có ý nghĩa thống kê rất mạnh mẽ giữa số xi-lanh và loại hệ dẫn động.

4.2.2 Phân tích rủi ro và tỷ số chênh

Để lượng hóa mối quan hệ này, chúng ta sẽ so sánh khả năng một chiếc xe được trang bị hệ dẫn động hai cầu (4WD) giữa hai nhóm động cơ phổ biến và đối lập nhất: 8 xi-lanh (công suất cao) và 4 xi-lanh (công suất thấp).

Tạo bảng tần số 2x2

# Lọc dữ liệu chỉ bao gồm xe 4 và 8 xi-lanh
data_cyl_sub <- data1 %>%
  filter(cyl %in% c(8, 4))

# Tạo bảng 2x2: Số xi-lanh (8 vs 4) ~ Hệ dẫn động (4WD vs Not 4WD)
# Đặt 8 xi-lanh là nhóm phơi nhiễm (exposure group)
table_cyl_4wd <- table(
  Cylinders = factor(data_cyl_sub$cyl, levels = c(8, 4)),
  Is_4WD = ifelse(data_cyl_sub$drv == "4", "yes", "no")
)

# Đảm bảo thứ tự cột "yes", "no"
table_cyl_4wd <- table_cyl_4wd[, c("yes", "no")]
print(table_cyl_4wd)
##          Is_4WD
## Cylinders yes no
##         8  48 22
##         4  23 58

Tính Relative Risk (RR)

# Tính RR
rr_cyl_4wd <- riskratio(table_cyl_4wd)
print(rr_cyl_4wd$measure)
##          risk ratio with 95% C.I.
## Cylinders estimate    lower    upper
##         8 1.000000       NA       NA
##         4 2.278339 1.570253 3.305728

Tính Odds Ratio (OR)

# Tính OR
or_cyl_4wd <- oddsratio(table_cyl_4wd)
print(or_cyl_4wd$measure)
##          odds ratio with 95% C.I.
## Cylinders estimate    lower    upper
##         8 1.000000       NA       NA
##         4 5.410297 2.721399 11.12334

Nhận xét

  • Relative Risk (RR) = 2.27: Tỷ lệ một chiếc xe được trang bị hệ dẫn động hai cầu (4WD) ở nhóm 4 xi-lanh cao gấp 2.27 lần so với nhóm 8 xi-lanh. Đây là một sự khác biệt rất lớn.

  • Odds Ratio (OR) = 5.41: Tỷ lệ để một chiếc xe là xe 4WD ở nhóm 4 xi-lanh cao gấp 5.41 lần so với odds ở nhóm 8 xi-lanh.

Kết luận:

Cả hai chỉ số RR và OR đều cho thấy một mối liên hệ cực kỳ mạnh mẽ. Việc một chiếc xe được trang bị động cơ 4 xi-lanh làm tăng đáng kể khả năng xe đó cũng được trang bị hệ dẫn động hai cầu.


5 Phương pháp Ước lượng Hợp lý Tối đa (Maximum Likelihood Estimation – MLE)

5.1 Giới thiệu chung

Trong thống kê và học máy, dữ liệu thường được mô hình hóa thông qua các phân phối xác suất. Một phân phối xác suất được đặc trưng bởi một số tham số, ví dụ như:

  • Phân phối chuẩn (Gaussian): \(\mu\) (trung bình), \(\sigma^2\) (phương sai).
  • Phân phối Poisson: tham số đặc trưng là \(\lambda\).

Nếu ta đã biết được dạng của phân phối xác suất, vấn đề đặt ra là: làm sao tìm được các tham số mô tả phân phối đó một cách phù hợp nhất với dữ liệu quan sát? Đó chính là nhiệm vụ của phương pháp ước lượng hợp lý tối đa (Maximum Likelihood Estimation – MLE).

MLE là một công cụ căn bản và quan trọng trong thống kê suy diễn và học máy, giúp chúng ta tìm ra các tham số mô hình sao cho phân phối xác suất sinh ra dữ liệu là “phù hợp nhất” với thực tế đã quan sát.

5.2 Mục tiêu và nguyên lý của MLE

5.2.1 Khái niệm hàm hợp lý (Likelihood Function)

Hàm hợp lý (likelihood function) đo lường mức độ phù hợp của mô hình (tham số) với dữ liệu đã quan sát. Tức là, với một mô hình xác suất có tham số \(\mathbf{w}\), hàm hợp lý cho biết xác suất để toàn bộ tập dữ liệu \(\mathcal{D}\) xảy ra, dưới giả định rằng dữ liệu được sinh ra từ mô hình đó.

Giả sử có một bộ dữ liệu gồm \(N\) quan sát đầu vào:

\[ \mathcal{D} = \{ \mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_N \} \]

và mô hình phân phối xác suất \(P(\mathbf{x}|\mathbf{w})\) phụ thuộc vào tham số

\[ \mathbf{w} = (w_1, w_2, \ldots, w_k)^T \]

Khi đó, hàm hợp lý được định nghĩa là:

\[ L(\mathbf{w}) = P(\mathcal{D}|\mathbf{w}) = P(\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_N|\mathbf{w}) \]

Nếu các quan sát \(\mathbf{x}_i\)độc lập và phân phối giống nhau (i.i.d – independent and identically distributed), thì hàm hợp lý có thể viết lại thành:

\[ L(\mathbf{w}) = \prod_{i=1}^{N} P(\mathbf{x}_i|\mathbf{w}) \]

5.2.2 Nguyên lý tối đa hóa hợp lý

Nguyên lý cốt lõi của MLE là chọn giá trị tham số \(\hat{\mathbf{w}}\) sao cho hàm hợp lý đạt giá trị lớn nhất. Nói cách khác, ta tìm tham số mà dưới nó thì xác suất tạo ra dữ liệu quan sát là cao nhất:

\[ \hat{\mathbf{w}} = \arg\max_{\mathbf{w}} L(\mathbf{w}) \]

Tuy nhiên, việc tối ưu một tích lớn các xác suất như vậy thường không thuận tiện. Vì vậy, ta thường lấy log của hàm hợp lý để thu được hàm log-hợp lý (log-likelihood function):

\[ \ell(\mathbf{w}) = \log L(\mathbf{w}) = \sum_{i=1}^{N} \log P(\mathbf{x}_i|\mathbf{w}) \]

Do hàm log là đơn điệu tăng, nên điểm cực đại của \(\ell(\mathbf{w})\) cũng chính là cực đại của \(L(\mathbf{w})\). Vậy nên:

\[ \hat{\mathbf{w}} = \arg\max_{\mathbf{w}} \ell(\mathbf{w}) \]

5.3 Tóm tắt quy trình MLE

Bước Mô tả
Bước 1 Xác định mô hình xác suất \(P(x|\mathbf{w})\) và giả định dữ liệu độc lập (i.i.d).
Bước 2 Viết hàm hợp lý \(L(\mathbf{w})\) hoặc log-hợp lý \(\ell(\mathbf{w})\).
Bước 3 Tính đạo hàm của \(\ell(\mathbf{w})\) theo \(\mathbf{w}\), rồi giải phương trình đạo hàm bằng 0.
Bước 4 Kiểm tra điều kiện tối ưu (đạo hàm bậc hai, tính lồi, v.v.).
Bước 5 Kết luận \(\hat{\mathbf{w}}\) là ước lượng MLE.

5.4 Mô hình hóa bài toán dưới dạng toán học

Trong trường hợp dữ liệu phân phối i.i.d, bài toán MLE trở thành:

\[ \hat{\mathbf{w}} = \arg\max_{\mathbf{w}} \sum_{i=1}^{N} \log P(\mathbf{x}_i|\mathbf{w}) \]

Đây là một bài toán tối ưu hóa có thể giải bằng:

  • Đạo hàm tường minh (nếu có thể),
  • Gradient Descent / Newton-Raphson (trong trường hợp phức tạp),
  • Kỹ thuật tối ưu hóa số.

5.5 Tính chất của ước lượng MLE

Tính chất Mô tả
Nhất quán (Consistency) Khi \(N \to \infty\), MLE hội tụ về đúng tham số thực sự.
Bất biến (Invariance) Nếu \(\hat{\theta}\) là MLE của \(\theta\), thì \(g(\hat{\theta})\) là MLE của \(g(\theta)\).
Phân phối tiệm cận chuẩn MLE tiệm cận theo phân phối chuẩn khi \(N \to \infty\).
Không thiên lệch tiệm cận Khi mẫu lớn, sai số trung bình của MLE tiến về 0.

5.6 Kết luận

Phương pháp ước lượng hợp lý tối đa (MLE) là một công cụ then chốt trong thống kê và học máy. Bằng cách tối đa hóa xác suất sinh ra dữ liệu đã quan sát, MLE hướng tới mục tiêu chọn mô hình phù hợp nhất với thực tế. Phương pháp này có cơ sở lý thuyết vững chắc và có thể áp dụng để ước lượng tham số của nhiều phân phối phổ biến như Bernoulli, Gaussian, Poisson, v.v.


6 Mô hình Hồi quy Logistic và Probit

6.1 Giới thiệu chung

Khi các phương pháp phân tích bảng chéo và kiểm định Chi bình phương đã xác nhận sự tồn tại của mối quan hệ giữa các biến định tính, bước tiếp theo là xây dựng một mô hình dự báo để lượng hóa tác động của các biến độc lập lên một biến phụ thuộc nhị phân. Khi biến phụ thuộc có hai giá trị (ví dụ: 4WD / Không 4WD), mô hình hồi quy tuyến tính thông thường (OLS) sẽ không còn phù hợp vì nó có thể dự đoán các giá trị nằm ngoài khoảng [0, 1], điều vô lý đối với một xác suất.

Để giải quyết vấn đề này, các mô hình xác suất phi tuyến như Hồi quy LogisticHồi quy Probit được sử dụng. Cả hai đều thuộc nhóm Mô hình Tuyến tính Tổng quát (Generalized Linear Models - GLM), với mục tiêu mô hình hóa xác suất xảy ra của một sự kiện, \(P(Y=1|X)\), dựa trên các biến độc lập \(X\).

6.2 Hồi quy Logistic (Logistic Regression)

6.2.1 Mục tiêu và nguyên lý

Hồi quy Logistic không mô hình hóa trực tiếp xác suất \(p\), mà mô hình hóa logarit của tỷ số chênh (log-odds), còn gọi là hàm logit.

  • Tỷ số chênh (Odds): Là tỷ lệ giữa xác suất xảy ra sự kiện và xác suất không xảy ra sự kiện: \[ \text{Odds} = \frac{p}{1-p} \]
  • Hàm Logit: Là logarit tự nhiên của Odds: \[ \text{logit}(p) = \ln\left(\frac{p}{1-p}\right) \]

Hàm logit có một đặc tính tuyệt vời: nó biến một giá trị xác suất \(p\) trong khoảng (0, 1) thành một giá trị trên toàn bộ trục số thực \((-\infty, +\infty)\). Điều này cho phép chúng ta mô hình hóa nó như một tổ hợp tuyến tính của các biến độc lập:

\[ \ln\left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 X_{i1} + \beta_2 X_{i2} + \ldots + \beta_k X_{ik} \]

6.2.2 Diễn giải hệ số

Việc diễn giải hệ số \(\beta\) trực tiếp khá phức tạp (“sự thay đổi trong log-odds”). Thay vào đó, chúng ta thường lấy lũy thừa cơ số \(e\) của hệ số để có được Tỷ số chênh (Odds Ratio - OR):

\[ \text{OR} = e^\beta \]

  • Nếu \(\beta_1 > 0 \implies e^{\beta_1} > 1\): Khi \(X_1\) tăng 1 đơn vị, odds để sự kiện \(Y=1\) xảy ra sẽ tăng lên \(e^{\beta_1}\) lần, giữ các biến khác không đổi.
  • Nếu \(\beta_1 < 0 \implies e^{\beta_1} < 1\): Khi \(X_1\) tăng 1 đơn vị, odds để sự kiện \(Y=1\) xảy ra sẽ giảm xuống còn \(e^{\beta_1}\) lần, giữ các biến khác không đổi.
  • Nếu \(\beta_1 = 0 \implies e^{\beta_1} = 1\): Biến \(X_1\) không ảnh hưởng đến odds của sự kiện.

6.3 Hồi quy Probit (Probit Regression)

6.3.1 Mục tiêu và nguyên lý

Hồi quy Probit cũng mô hình hóa xác suất \(p\), nhưng thay vì dùng hàm logit, nó sử dụng hàm phân phối tích lũy (CDF) của phân phối chuẩn tắc, ký hiệu là \(\Phi(z)\).

Ý tưởng cơ bản là có một “biến tiềm ẩn” (latent variable) \(Y^*\) tuân theo phân phối chuẩn. Chúng ta không quan sát được \(Y^*\), mà chỉ quan sát được \(Y=1\) nếu \(Y^*\) vượt qua một ngưỡng nào đó.

Mô hình Probit có dạng: \[ P(Y=1|X) = \Phi(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \ldots + \beta_k X_k) \] Hoặc viết theo dạng hàm ngược (hàm probit): \[ \Phi^{-1}(p_i) = \beta_0 + \beta_1 X_{i1} + \beta_2 X_{i2} + \ldots + \beta_k X_{ik} \]

6.3.2 Diễn giải hệ số

Hệ số \(\beta\) trong mô hình Probit thể hiện sự thay đổi trong z-score (giá trị trên trục hoành của phân phối chuẩn tắc) khi biến độc lập \(X\) thay đổi 1 đơn vị. Việc diễn giải này không trực quan và thường ít được sử dụng trong báo cáo kinh doanh. Thay vào đó, người ta thường tính toán và báo cáo tác động biên (marginal effects), tức là sự thay đổi trong xác suất \(p\) khi \(X\) thay đổi.

6.4 Logistic vs. Probit: Lựa chọn nào?

Tiêu chí Hồi quy Logistic Hồi quy Probit
Hàm liên kết Logit, dựa trên phân phối Logistic Probit, dựa trên phân phối Chuẩn
Độ dốc Đường cong S (sigmoid) hơi phẳng hơn ở đuôi Đường cong S (sigmoid) dốc hơn ở đuôi
Diễn giải Hệ số có thể diễn giải trực tiếp qua Odds Ratio (OR) Hệ số khó diễn giải, thường dùng tác động biên
Sử dụng Rất phổ biến trong y sinh, khoa học xã hội, marketing Phổ biến trong kinh tế lượng

Trong thực tế, cả hai mô hình thường cho kết quả dự đoán rất giống nhau. Hồi quy Logistic thường được ưa chuộng hơn vì tính dễ diễn giải của Odds Ratio.

6.5 Áp dụng mô hình dự đoán hệ dẫn động hai cầu (4WD)

Câu hỏi nghiên cứu: Những yếu tố kỹ thuật nào (dung tích động cơ, số xi-lanh) ảnh hưởng đến khả năng một chiếc xe được trang bị hệ dẫn động hai cầu (4WD)?

6.5.1 Chuẩn bị dữ liệu

Chúng ta sẽ tạo một biến phụ thuộc mới là is_4wd, nhận giá trị 1 nếu xe là 4WD0 trong trường hợp còn lại.

# Tạo biến phụ thuộc nhị phân
mpg_model_data <- mpg %>%
  mutate(is_4wd = ifelse(drv == "4", 1, 0))

# Xem qua dữ liệu mới
head(mpg_model_data %>% select(manufacturer, model, drv, is_4wd, displ, cyl))

6.5.2 Xây dựng và phân tích mô hình Hồi quy Logistic

Chúng ta sẽ xây dựng mô hình dự đoán is_4wd dựa trên displ (dung tích động cơ) và cyl (số xi-lanh).

# Xây dựng mô hình Logistic
logit_model <- glm(is_4wd ~ displ + cyl, 
                   data = mpg_model_data, 
                   family = binomial(link = "logit"))

# Xem kết quả
summary(logit_model)
## 
## Call:
## glm(formula = is_4wd ~ displ + cyl, family = binomial(link = "logit"), 
##     data = mpg_model_data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -2.2004     0.6051  -3.637 0.000276 ***
## displ         0.7385     0.3118   2.368 0.017871 *  
## cyl          -0.1056     0.2412  -0.438 0.661626    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 321.03  on 233  degrees of freedom
## Residual deviance: 289.07  on 231  degrees of freedom
## AIC: 295.07
## 
## Number of Fisher Scoring iterations: 4

Diễn giải kết quả mô hình Logistic:

  • Hệ số của displ (Dung tích động cơ):
    • Hệ số là 0.7385. Giá trị này dương và có ý nghĩa thống kê (p-value = 0.017 < 0.05).
    • Để diễn giải, ta tính Odds Ratio: exp(0.7385) ≈ 2.09.
    • Diễn giải: Nếu số xi-lanh không đổi thì khi dung tích động cơ tăng 1 lít, tỷ lệ (odds) để chiếc xe đó là xe 4WD tăng lên 2.09 lần.
  • Hệ số của cyl (Số xi-lanh):
    • Hệ số là -0.1056. Giá trị âm nhưng không có ý nghĩa thống kê ở mức 5% (p-value = 0.661 > 0.05).

6.5.3 Xây dựng và phân tích mô hình Hồi quy Probit

# Xây dựng mô hình Probit
probit_model <- glm(is_4wd ~ displ + cyl, 
                    data = mpg_model_data, 
                    family = binomial(link = "probit"))

# Xem kết quả
summary(probit_model)
## 
## Call:
## glm(formula = is_4wd ~ displ + cyl, family = binomial(link = "probit"), 
##     data = mpg_model_data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.37030    0.36683  -3.736 0.000187 ***
## displ        0.42691    0.18580   2.298 0.021581 *  
## cyl         -0.04788    0.14594  -0.328 0.742878    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 321.03  on 233  degrees of freedom
## Residual deviance: 289.29  on 231  degrees of freedom
## AIC: 295.29
## 
## Number of Fisher Scoring iterations: 5

Diễn giải kết quả mô hình Probit:

  • Hệ số của displ (Dung tích động cơ):
    • Hệ số là 0.4269. Giá trị này dương và có ý nghĩa thống kê (p-value = 0.0001 < 0.05).
    • Diễn giải: Nếu số xi-lanh không đổi thì khi dung tích động cơ tăng 1 lít, z-score dự đoán xác suất xe là 4WD tăng lên 0.4269 đơn vị.
  • Hệ số của cyl (Số xi-lanh):
    • Hệ số là -0.0478. Giá trị âm nhưng không có ý nghĩa thống kê ở mức 5% (p-value = 0.7428 > 0.05).

6.5.4 So sánh hai mô hình

Cả hai mô hình đều cho cùng một kết luận: dung tích động cơ (displ) là yếu tố dự báo quan trọng cho việc một chiếc xe có phải là 4WD hay không. Chúng ta có thể so sánh trực tiếp xác suất dự đoán từ hai mô hình.

# Lấy xác suất dự đoán từ hai mô hình
mpg_model_data$pred_logit <- predict(logit_model, type = "response")
mpg_model_data$pred_probit <- predict(probit_model, type = "response")

# Vẽ biểu đồ so sánh
ggplot(mpg_model_data, aes(x = pred_logit, y = pred_probit)) +
  geom_point(alpha = 0.5) +
  geom_abline(intercept = 0, slope = 1, color = "red", linetype = "dashed") +
  labs(
    title = "So sánh xác suất dự đoán giữa mô hình Logit và Probit",
    x = "Xác suất dự đoán từ mô hình Logistic",
    y = "Xác suất dự đoán từ mô hình Probit"
  ) +
  theme_minimal()

Kết luận:

Biểu đồ cho thấy các điểm dữ liệu nằm rất sát đường chéo màu đỏ, chứng tỏ xác suất dự đoán từ hai mô hình gần như tương đương nhau.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBlbmNvZGluZzogVVRGLTgNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpDQpgYGANCg0KDQojICoqR2nhu5tpIHRoaeG7h3UqKg0KDQpC4buZIGThu68gbGnhu4d1IGBtcGdgIGzDoCBt4buZdCB04bqtcCBk4buvIGxp4buHdSBraW5oIMSRaeG7g24gxJHGsOG7o2MgdGh1IHRo4bqtcCBi4bufaSBDxqEgcXVhbiBC4bqjbyB24buHIE3DtGkgdHLGsOG7nW5nIEhvYSBL4buzIChFUEEpLCBjaOG7qWEgdGjDtG5nIHRpbiB24buBIG3hu6ljIHRpw6p1IHRo4bulIG5oacOqbiBsaeG7h3UgY+G7p2EgY8OhYyBt4bqrdSB4ZSBwaOG7lSBiaeG6v24gdOG7qyBuxINtIDE5OTkgxJHhur9uIDIwMDguIEThu68gbGnhu4d1IG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIGTDuW5nIMSR4buDIG5naGnDqm4gY+G7qXUgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIMSR4bq3YyB0w61uaCBj4bunYSB4ZSB2w6AgaGnhu4d1IHN14bqldCBuaGnDqm4gbGnhu4d1LiBUcm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIHTDoWMgZ2nhuqMgdOG6rXAgdHJ1bmcgdsOgbyBoYWkgYmnhur9uIMSR4buLbmggdMOtbmggcXVhbiB0cuG7jW5nIGxpw6puIHF1YW4gxJHhur9uIGPhuqV1IHRyw7pjIHbDoCBwaMOibiBsb+G6oWkgeGUsIMSRw7MgbMOgOg0KDQotICoqYGRydmAqKjogTG/huqFpIGjhu4cgZOG6q24gxJHhu5luZyBj4bunYSB4ZSAoYGZgID0gY+G6p3UgdHLGsOG7m2MsIGByYCA9IGPhuqd1IHNhdSwgYDRgID0gaGFpIGPhuqd1KS4NCi0gKipgY2xhc3NgKio6IFBow6JuIGxv4bqhaSB4ZSAodsOtIGThu6U6IGBjb21wYWN0YCwgYHN1dmAsIGBtaWRzaXplYCkuDQoNCkhhaSBiaeG6v24gbsOgeSDEkcaw4bujYyBjaOG7jW4gbMOgbSAqKmJp4bq/biBuZ2hpw6puIGPhu6l1IGNow61uaCoqLCB24bubaSBt4bulYyB0acOqdSBwaMOibiB0w61jaCB4ZW0gKipjw6FjIHnhur91IHThu5Ega+G7uSB0aHXhuq10IHbDoCDEkeG6t2MgxJFp4buDbSBj4bunYSBuaMOgIHPhuqNuIHh14bqldCoqIG5oxrA6DQoNCi0gTmjDoCBz4bqjbiB4deG6pXQgKGBtYW51ZmFjdHVyZXJgKQ0KLSBT4buRIHhpLWxhbmggY+G7p2EgxJHhu5luZyBjxqEgKGBjeWxgKQ0KLSBEdW5nIHTDrWNoIMSR4buZbmcgY8ahIChgZGlzcGxgKQ0KLSBMb+G6oWkgaOG7mXAgc+G7kSAoYHRyYW5zYCkNCg0KLi4uIGPDsyDhuqNuaCBoxrDhu59uZyBuaMawIHRo4bq/IG7DoG8gxJHhur9uICoqbG/huqFpIGjhu4cgZOG6q24gxJHhu5luZyoqIHbDoCAqKnBow6JuIGtow7pjIHhlKiogY+G7p2EgbeG7mXQgbeG6q3UgeGUuDQoNClRow7RuZyBxdWEgdmnhu4djIHPhu60gZOG7pW5nIGPDoWMgY8O0bmcgY+G7pSBwaMOibiB0w61jaCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oIG5oxrA6IGLhuqNuZyB04bqnbiBz4buRLCBiaeG7g3UgxJHhu5MgbWluaCBo4buNYSwga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nLCBwaMOibiB0w61jaCB04bu3IHPhu5EgY2jDqm5oIGzhu4djaCAoT2RkcyBSYXRpbykgdsOgIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSZWxhdGl2ZSBSaXNrKSwgYsOgaSBuZ2hpw6puIGPhu6l1IHPhur0gbMOgbSByw7UgY8OhYyB54bq/dSB04buRIHF1YW4gdHLhu41uZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gxJHhurdjIHTDrW5oIGvhu7kgdGh14bqtdCBj4bunYSBjw6FjIGTDsm5nIHhlLCB04burIMSRw7MgxJHGsGEgcmEgbmjhu69uZyBnw7NjIG5ow6xuIGjhu691IMOtY2ggY2hvIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCDDtCB0w7QgduG7gSB4dSBoxrDhu5tuZyB0aGnhur90IGvhur8gdsOgIHPhuqNuIHh14bqldC4NCg0KIyMgKirEkOG7jWMgdsOgIGtow6FtIHBow6EgZOG7ryBsaeG7h3UqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KDQojIMSQ4buNYyBk4buvIGxp4buHdSB04burIHBhY2thZ2UgZ2dwbG90Mg0KZGF0YSgibXBnIikNCnN0cihtcGcpDQpzdW1tYXJ5KG1wZykNCnNhcHBseShtcGcsIGZ1bmN0aW9uKHgpIGxlbmd0aCh1bmlxdWUoeCkpKQ0KYGBgDQoNCg0KIyMgKipNw7QgdOG6oyBjw6FjIGJp4bq/bioqDQoNCnwgVMOqbiBiaeG6v24gfCBLaeG7g3UgZOG7ryBsaeG7h3UgfCBT4buRIGzGsOG7o25nIGdpw6EgdHLhu4sgZHV5IG5o4bqldCB8IE3DtCB04bqjIG7hu5lpIGR1bmcgfA0KfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfA0KfCBgbWFudWZhY3R1cmVyYHwgQ2hhcmFjdGVyIHwgMTUgfCBIw6NuZyBz4bqjbiB4deG6pXQgeGUgKHbDrSBk4bulOiBgYXVkaWAsIGBmb3JkYCwgYHRveW90YWApLiB8DQp8IGBtb2RlbGAgfCBDaGFyYWN0ZXIgfCAzOCB8IFTDqm4gZMOybmcgeGUuIHwNCnwgYGRpc3BsYCB8IE51bWVyaWMgfCA0NyB8IER1bmcgdMOtY2ggxJHhu5luZyBjxqEgKGzDrXQpLiB8DQp8IGB5ZWFyYCB8IEludGVnZXIgfCAyIHwgTsSDbSBz4bqjbiB4deG6pXQgKDE5OTkgaG/hurdjIDIwMDgpLiB8DQp8IGBjeWxgIHwgSW50ZWdlciB8IDQgfCBT4buRIHhpLWxhbmggxJHhu5luZyBjxqEgKDQsIDUsIDYsIDgpLiB8DQp8IGB0cmFuc2AgfCBDaGFyYWN0ZXIgfCAxMCB8IExv4bqhaSBo4buZcCBz4buRICh2w60gZOG7pTogYGF1dG8obDUpYCwgYG1hbnVhbChtNilgKS4gfA0KfCBgZHJ2YCB8IENoYXJhY3RlciB8IDMgfCBMb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nIChgZmA9Y+G6p3UgdHLGsOG7m2MsIGByYD1j4bqndSBzYXUsIGA0YD1oYWkgY+G6p3UpLiB8DQp8IGBjdHlgIHwgSW50ZWdlciB8IDIxIHwgTeG7qWMgdGnDqnUgdGjhu6Ugbmhpw6puIGxp4buHdSB0cm9uZyB0aMOgbmggcGjhu5EgKGThurdtL2dhbGxvbikuIHwNCnwgYGh3eWAgfCBJbnRlZ2VyIHwgMjcgfCBN4bupYyB0acOqdSB0aOG7pSBuaGnDqm4gbGnhu4d1IHRyw6puIGNhbyB04buRYyAoZOG6t20vZ2FsbG9uKS4gfA0KfCBgZmxgIHwgQ2hhcmFjdGVyIHwgNSB8IExv4bqhaSBuaGnDqm4gbGnhu4d1IChgcGA9cHJlbWl1bSwgYHJgPXJlZ3VsYXIsIGBlYD1ldGhhbm9sLCBgZGA9ZGllc2VsLCBgY2A9Y25nKS4gfA0KfCBgY2xhc3NgIHwgQ2hhcmFjdGVyIHwgNyB8IFBow6JuIGxv4bqhaSB4ZSAodsOtIGThu6U6IGBjb21wYWN0YCwgYHN1dmAsIGBwaWNrdXBgKS4gfA0KDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpC4buZIGThu68gbGnhu4d1IGfhu5NtIDExIGJp4bq/biB2w6AgMjM0IHF1YW4gc8OhdCwgxJHGsOG7o2MgY2hpYSB0aMOgbmggaGFpIG5ow7NtIGNow61uaDogYmnhur9uIMSR4buLbmggbMaw4bujbmcgdsOgIGJp4bq/biDEkeG7i25oIHTDrW5oLg0KDQotICoqQmnhur9uIMSR4buLbmggbMaw4bujbmc6KiogR+G7k20gY8OhYyBiaeG6v24gYGRpc3BsYCwgYHllYXJgLCBgY3lsYCwgYGN0eWAsIGBod3lgLiBDw6FjIGJp4bq/biBuw6B5IMSRbyBsxrDhu51uZyBjw6FjIHRow7RuZyBz4buRIGvhu7kgdGh14bqtdCB2w6AgaGnhu4d1IHN14bqldCwgY8OzIHRo4buDIGTDuW5nIMSR4buDIHTDrW5oIHRvw6FuIGPDoWMgY2jhu4kgc+G7kSB0aOG7kW5nIGvDqiB2w6AgeMOieSBk4buxbmcgbcO0IGjDrG5oIGjhu5NpIHF1eS4NCg0KLSAqKkPDoWMgYmnhur9uIMSR4buLbmggdMOtbmg6KiogR+G7k20gY8OhYyBiaeG6v24gYG1hbnVmYWN0dXJlcmAsIGBtb2RlbGAsIGB0cmFuc2AsIGBkcnZgLCBgZmxgLCBgY2xhc3NgLiBDw6FjIGJp4bq/biBuw6B5IG1hbmcgdGjDtG5nIHRpbiBk4bqhbmcgZGFuaCBt4bulYywgdGjGsOG7nW5nIMSRxrDhu6NjIHBow6JuIHTDrWNoIGLhurFuZyBjw6FjaCDEkeG6v20gdOG6p24gc+G7kSwgdOG7tyBs4buHLCB2w6Agc+G7rSBk4bulbmcgY8OhYyBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiBjaG8gZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaC4NCg0KKipU4bqhbyBi4buZIGThu68gbGnhu4d1IGNo4buJIGPDsyBiaeG6v24gxJHhu4tuaCB0w61uaCAodsOgIGPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgY+G6p24gdGhp4bq/dCkqKg0KDQpgYGB7cn0NCiMgVOG6oW8gYuG7mSBk4buvIGxp4buHdSBjaOG7iSBjaOG7qWEgY8OhYyBiaeG6v24gY+G6p24gdGhp4bq/dCBjaG8gcGjDom4gdMOtY2ggxJHhu4tuaCB0w61uaA0KZGF0YTEgPC0gbXBnICU+JQ0KICBzZWxlY3QobWFudWZhY3R1cmVyLCBjbGFzcywgZHJ2LCBjeWwsIHRyYW5zKQ0KDQojIFhlbSB0csaw4bubYyBk4buvIGxp4buHdSBt4bubaQ0Kc3RyKGRhdGExKQ0KaGVhZChkYXRhMSkNCmBgYA0KDQotLS0NCg0KIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBuZ2hpw6puIGPhu6l1KioNCg0KIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gcGjhu6UgdGh14buZYyoqDQoNCiMjIyAqKkJp4bq/biBgZHJ2YCAoSOG7hyBk4bqrbiDEkeG7mW5nKSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YTEkZHJ2KQ0KcHJvcC50YWJsZSh0YWJsZShkYXRhMSRkcnYpKQ0KYGBgDQoNCg0KKipW4bq9IGJp4buDdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KZnJlcV9kcnYgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhMSRkcnYpKQ0KY29sbmFtZXMoZnJlcV9kcnYpIDwtIGMoIkRSViIsICJDb3VudCIpDQoNCmdncGxvdChmcmVxX2RydiwgYWVzKHggPSBEUlYsIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjOTM3MERCIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlThuqduIHPhu5EgdGhlbyBsb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nIiwgeCA9ICJMb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoqKkThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTIGPhu6dhIGJp4bq/biBgZHJ2YCwgdGEgY8OzIGPDoWMgbmjhuq1uIMSR4buLbmggc2F1OioqDQoNCi0gWGUgZOG6q24gxJHhu5luZyBj4bqndSB0csaw4bubYyAoYGZgKSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIDEwNiB4ZSwgdMawxqFuZyDhu6luZyA0NS4zJSB04buVbmcgc+G7kSBt4bqrdS4NCi0gWGUgZOG6q24gxJHhu5luZyBoYWkgY+G6p3UgKGA0YCkgxJHhu6luZyB0aOG7qSBoYWkgduG7m2kgMTAzIHhlLCBjaGnhur9tIDQ0LjAlLg0KLSBYZSBk4bqrbiDEkeG7mW5nIGPhuqd1IHNhdSAoYHJgKSBjaOG7iSBjw7MgMjUgeGUsIGzDoCBsb+G6oWkgw610IHBo4buVIGJp4bq/biBuaOG6pXQgdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgY2hp4bq/bSBraG/huqNuZyAxMC43JS4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KUGjDom4gYuG7kSBjaG8gdGjhuqV5IGPDoWMgbeG6q3UgeGUgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGNo4bunIHnhur91IGzDoCB4ZSBk4bqrbiDEkeG7mW5nIGPhuqd1IHRyxrDhu5tjIHbDoCBoYWkgY+G6p3UsIHBo4bqjbiDDoW5oIHh1IGjGsOG7m25nIHBo4buVIGJp4bq/biBj4bunYSB0aOG7iyB0csaw4budbmcgeGUgZHUgbOG7i2NoIHThuqFpIE3hu7kgdHJvbmcgZ2lhaSDEkW/huqFuIMSRw7MuDQoNCiMjIyAqKkJp4bq/biBgY2xhc3NgIChQaMOibiBsb+G6oWkgeGUpKioNCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQp0YWJsZShkYXRhMSRjbGFzcykNCnByb3AudGFibGUodGFibGUoZGF0YTEkY2xhc3MpKQ0KYGBgDQoNCg0KKipW4bq9IGJp4buDdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KZnJlcV9jbGFzcyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGExJGNsYXNzKSkNCmNvbG5hbWVzKGZyZXFfY2xhc3MpIDwtIGMoIkNsYXNzIiwgIkNvdW50IikNCg0KZ2dwbG90KGZyZXFfY2xhc3MsIGFlcyh4ID0gcmVvcmRlcihDbGFzcywgLUNvdW50KSwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM2NkNEQUEiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41KSArDQogIGxhYnModGl0bGUgPSAiVOG6p24gc+G7kSB0aGVvIHBow6JuIGxv4bqhaSB4ZSIsIHggPSAiUGjDom4gbG/huqFpIHhlIiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoqKkThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EgdsOgIGJp4buDdSDEkeG7kyBj4bunYSBiaeG6v24gYGNsYXNzYCwgdGEgY8OzIGPDoWMgbmjhuq1uIMSR4buLbmggc2F1OioqDQoNCi0gRMOybmcgeGUgKipTVVYqKiBsw6AgcGjhu5UgYmnhur9uIG5o4bqldCB24bubaSA2MiB4ZSwgY2hp4bq/bSAyNi41JS4NCi0gVGhlbyBzYXUgbMOgIGPDoWMgZMOybmcgKipjb21wYWN0KiogKDQ3IHhlLCB+MjAuMSUpIHbDoCAqKm1pZHNpemUqKiAoNDEgeGUsIH4xNy41JSkuDQotIEPDoWMgZMOybmcgeGUgw610IHBo4buVIGJp4bq/biBoxqFuIGzDoCBgMnNlYXRlcmAsIGBtaW5pdmFuYCwgdsOgIGBzdWJjb21wYWN0YC4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KUGjDom4gYuG7kSBk4buvIGxp4buHdSBjaG8gdGjhuqV5IHPhu7EgdGjhu5FuZyB0cuG7iyBj4bunYSBwaMOibiBraMO6YyBTVVYsIHBow7kgaOG7o3AgduG7m2kgeHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgeGUgdOG6oWkgTeG7uS4gQ8OhYyBkw7JuZyB4ZSBzZWRhbiBj4buhIHbhu6thIHbDoCBuaOG7jyBjxaluZyBjaGnhur9tIG3hu5l0IHRo4buLIHBo4bqnbiDEkcOhbmcga+G7gy4NCg0KDQojIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biDEkeG7mWMgbOG6rXAqKg0KDQojIyMgKipCaeG6v24gYG1hbnVmYWN0dXJlcmAgKEjDo25nIHPhuqNuIHh14bqldCkqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCnRhYmxlKGRhdGExJG1hbnVmYWN0dXJlcikNCnByb3AudGFibGUodGFibGUoZGF0YTEkbWFudWZhY3R1cmVyKSkNCmBgYA0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCg0KYGBge3J9DQpmcmVxX21mciA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGExJG1hbnVmYWN0dXJlcikpDQpjb2xuYW1lcyhmcmVxX21mcikgPC0gYygiTWFudWZhY3R1cmVyIiwgIkNvdW50IikNCg0KZ2dwbG90KGZyZXFfbWZyLCBhZXMoeCA9IHJlb3JkZXIoTWFudWZhY3R1cmVyLCAtQ291bnQpLCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzY0OTVFRCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIGxhYnModGl0bGUgPSAiVOG6p24gc+G7kSB0aGVvIGjDo25nIHPhuqNuIHh14bqldCIsIHggPSAiSMOjbmcgc+G6o24geHXhuqV0IiwgeSA9ICJT4buRIGzGsOG7o25nIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCioqROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSB2w6AgYmnhu4N1IMSR4buTIHRyw6puLCB0YSBjw7MgY8OhYyBuaOG6rW4gxJHhu4tuaCBzYXU6KioNCg0KLSAqKkRvZGdlKiogbMOgIGjDo25nIGPDsyBuaGnhu4F1IG3huqt1IHhlIG5o4bqldCB0cm9uZyBi4buZIGThu68gbGnhu4d1ICgzNyB4ZSkuDQotIFRoZW8gc2F1IGzDoCAqKlRveW90YSoqICgzNCB4ZSkgdsOgICoqVm9sa3N3YWdlbioqICgyNyB4ZSkuDQotIEPDoWMgaMOjbmcgbmjGsCBgbGluY29sbmAsIGBsYW5kIHJvdmVyYCwgYG1lcmN1cnlgIGPDsyBz4buRIGzGsOG7o25nIG3huqt1IHLhuqV0IMOtdC4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KUGjDom4gYuG7kSBraMO0bmcgxJHhu4F1LCBjaG8gdGjhuqV5IGLhu5kgZOG7ryBsaeG7h3UgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIG3huqt1IHhlIHThu6sgbeG7mXQgc+G7kSBow6NuZyBz4bqjbiB4deG6pXQgcGjhu5UgYmnhur9uIHThuqFpIHRo4buLIHRyxrDhu51uZyBN4bu5Lg0KDQoNCiMjIyAqKkJp4bq/biBgY3lsYCAoU+G7kSB4aS1sYW5oKSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YTEkY3lsKQ0KcHJvcC50YWJsZSh0YWJsZShkYXRhMSRjeWwpKQ0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KDQpgYGB7cn0NCmZyZXFfY3lsIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGF0YTEkY3lsKSkNCmNvbG5hbWVzKGZyZXFfY3lsKSA8LSBjKCJDeWxpbmRlcnMiLCAiQ291bnQiKQ0KDQpnZ3Bsb3QoZnJlcV9jeWwsIGFlcyh4ID0gYXMuZmFjdG9yKEN5bGluZGVycyksIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjRkY5OTY2IiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlThuqduIHPhu5EgdGhlbyBz4buRIHhpLWxhbmgiLCB4ID0gIlPhu5EgeGktbGFuaCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KKipE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIGBjeWxgLCB0YSBjw7MgY8OhYyBuaOG6rW4gxJHhu4tuaCBzYXU6KioNCg0KLSDEkOG7mW5nIGPGoSAqKjQgeGktbGFuaCoqIHbDoCAqKjYgeGktbGFuaCoqIGzDoCBwaOG7lSBiaeG6v24gbmjhuqV0LCBjaGnhur9tIGzhuqduIGzGsOG7o3QgMzQuNiUgdsOgIDMzLjglLg0KLSDEkOG7mW5nIGPGoSAqKjggeGktbGFuaCoqIGPFqW5nIGNoaeG6v20gbeG7mXQgdOG7tyBs4buHIMSRw6FuZyBr4buDICgzMC4zJSkuDQotIMSQ4buZbmcgY8ahIDUgeGktbGFuaCBy4bqldCBoaeG6v20sIGNo4buJIGPDsyA0IG3huqt1Lg0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpQaMOibiBi4buRIGNobyB0aOG6pXkgc+G7sSDEkWEgZOG6oW5nIHRyb25nIGPhuqV1IGjDrG5oIMSR4buZbmcgY8ahLCBuaMawbmcgdOG6rXAgdHJ1bmcgY2jhu6cgeeG6v3UgdsOgbyBjw6FjIGxv4bqhaSDEkeG7mW5nIGPGoSA0LCA2LCB2w6AgOCB4aS1sYW5oLCBwaMO5IGjhu6NwIHbhu5tpIGPDoWMgcGjDom4ga2jDumMgeGUga2jDoWMgbmhhdSB04burIHhlIG5o4buPIHRp4bq/dCBraeG7h20gbmhpw6puIGxp4buHdSDEkeG6v24geGUgU1VWIHbDoCBiw6FuIHThuqNpIG3huqFuaCBt4bq9Lg0KDQotLS0NCg0KIyAqKsav4bubYyBsxrDhu6NuZyBraG/huqNuZyB2w6Aga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgY2hvIHThu7cgbOG7hyoqDQoNCiMjICoqS2nhu4NtIMSR4buLbmggaGFpIHBow61hKioNCg0KIyMjICoqQmnhur9uIGBjbGFzc2A6IFThu7cgbOG7hyB4ZSBTVVYqKg0KDQojIyMjICoqTeG7pWMgdGnDqnUqKg0KDQpUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIMSR4buDIHjDoWMgxJHhu4tuaCB4ZW0gKip04bu3IGzhu4cgeGUgdGh14buZYyBwaMOibiBraMO6YyBTVVYgKGBjbGFzcyA9ICJzdXYiYCkqKiB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBjw7Mga2jDoWMgYmnhu4d0IHNvIHbhu5tpIDI1JSBoYXkga2jDtG5nLg0KDQojIyMjICoqVMOtbmggdG/DoW4gdOG7tyBs4buHIG3huqt1KioNCg0KYGBge3J9DQojIFPhu5EgbMaw4bujbmcgeGUgU1VWDQpzdW1TVVYgPC0gc3VtKGRhdGExJGNsYXNzID09ICJzdXYiKQ0KDQojIFThu5VuZyBz4buRIHhlDQpzdW1Ub3RhbCA8LSBucm93KGRhdGExKQ0KDQojIFThu7cgbOG7hyBt4bqrdQ0KcF9oYXRfc3V2IDwtIHN1bVNVViAvIHN1bVRvdGFsDQpwX2hhdF9zdXYNCmBgYA0KDQojIyMjICoqS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oKioNCg0KLSAqKkgwOioqIHAgPSAwLjI1IChU4bu3IGzhu4cgeGUgU1VWIGLhurFuZyAyNSUpDQotICoqSDE6KiogcCDiiaAgMC4yNSAoVOG7tyBs4buHIHhlIFNVViBraMOhYyAyNSUpDQoNClRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCBoYWkgcGjDrWEgduG7m2kgbeG7qWMgw70gbmdoxKlhIM6xID0gMC4wNS4NCg0KYGBge3J9DQpwcm9wLnRlc3QoeCA9IHN1bVNVViwgbiA9IHN1bVRvdGFsLCBwID0gMC4yNSwgY29uZi5sZXZlbCA9IDAuOTUsIGNvcnJlY3QgPSBUUlVFKQ0KYGBgDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIChYLXNxdWFyZWQpOiAwLjIwNzk4DQotIEdpw6EgdHLhu4sgcCAocC12YWx1ZSk6IDAuNjQ4Mw0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgdGjhu7FjOiBbMC4yMTEsIDAuMzI2XQ0KLSDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIHThu6sgbeG6q3UgKHDMgik6IDAuMjY0OTU3Mw0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpW4bubaSBwLXZhbHVlID0gMC42NDgzID4gMC4wNSwgY2jDum5nIHRhICoqa2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAqKi4gQ8OzIHRo4buDIGNo4bqlcCBuaOG6rW4gcuG6sW5nIHThu7cgbOG7hyB4ZSBTVVYgdHJvbmcgdOG7lW5nIHRo4buDIGtow7RuZyBraMOhYyBiaeG7h3QgbeG7mXQgY8OhY2ggY8OzIMO9IG5naMSpYSBzbyB24bubaSAyNSUuDQoNCiMjICoqS2nhu4NtIMSR4buLbmggbeG7mXQgcGjDrWEqKg0KDQojIyMgKipCaeG6v24gYGRydmA6IFThu7cgbOG7hyB4ZSBk4bqrbiDEkeG7mW5nIGhhaSBj4bqndSAoYDRXRGApKioNCg0KIyMjIyAqKk3hu6VjIHRpw6p1KioNCg0KWMOhYyDEkeG7i25oIHhlbSB04bu3IGzhu4cgeGUgY8OzIGjhu4cgZOG6q24gxJHhu5luZyBoYWkgY+G6p3UgKGBkcnYgPSAiNCJgKSBjw7Mgbmjhu48gaMahbiA1MCUgaGF5IGtow7RuZy4NCg0KIyMjIyAqKlTDrW5oIHRvw6FuIHThu7cgbOG7hyBt4bqrdSoqDQoNCmBgYHtyfQ0Kc3VtNFdEIDwtIHN1bShkYXRhMSRkcnYgPT0gIjQiKQ0KcF9oYXRfNHdkIDwtIHN1bTRXRCAvIHN1bVRvdGFsDQpwX2hhdF80d2QNCmBgYA0KDQojIyMjICoqS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oKioNCg0KLSAqKkgwOioqIHAg4omlIDAuNTAgKFThu7cgbOG7hyB4ZSA0V0Qga2jDtG5nIG5o4buPIGjGoW4gNTAlKQ0KLSAqKkgxOioqIHAgPCAwLjUwIChU4bu3IGzhu4cgeGUgNFdEIG5o4buPIGjGoW4gNTAlKQ0KDQpUaeG6v24gaMOgbmgga2nhu4NtIMSR4buLbmggbeG7mXQgcGjDrWEgduG7m2kgbeG7qWMgw70gbmdoxKlhIM6xID0gMC4wNS4NCg0KYGBge3J9DQpwcm9wLnRlc3QoeCA9IHN1bTRXRCwgbiA9IHN1bVRvdGFsLCBwID0gMC41MCwgY29uZi5sZXZlbCA9IDAuOTUsIGNvcnJlY3QgPSBUUlVFLCBhbHRlcm5hdGl2ZSA9ICJsZXNzIikNCmBgYA0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiAoWC1zcXVhcmVkKTogMi40MDQyDQotIHAtdmFsdWU6IDAuMDYwNjkNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSAobeG7mXQgcGjDrWEpOiBbMCwgMC40OTVdDQotIFThu7cgbOG7hyBt4bqrdSAocMyCKTogMC40NDAxNzA5DQoNCioqS+G6v3QgbHXhuq1uOioqDQoNClbhu5tpIHAtdmFsdWUgPSAwLjA2MDY5LCBs4bubbiBoxqFuIG3hu5l0IGNow7p0IHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1LCBjaMO6bmcgdGEgKipraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMCoqLiBN4bq3YyBkw7kgdOG7tyBs4buHIG3huqt1ICg0NCUpIG5o4buPIGjGoW4gNTAlLCBz4buxIGtow6FjIGJp4buHdCBuw6B5IGNoxrBhIMSR4bunIGzhu5tuIMSR4buDIGPDsyB0aOG7gyBraOG6s25nIMSR4buLbmggbeG7mXQgY8OhY2ggY2jhuq9jIGNo4bqvbiDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KDQotLS0NCg0KIyAqKlBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIMSR4buZYyBs4bqtcCB2w6AgcGjhu6UgdGh14buZYyoqDQoNCiMjICoqUGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBgZHJ2YCAoaOG7hyBk4bqrbiDEkeG7mW5nKSB2w6AgYGNsYXNzYCAocGjDom4gbG/huqFpIHhlKSoqDQoNCioqQ8OidSBo4buPaSBuZ2hpw6puIGPhu6l1OioqICJQaMOibiBsb+G6oWkgeGUgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBsb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nIMSRxrDhu6NjIHRyYW5nIGLhu4sga2jDtG5nPyINCg0KIyMjICoqUGjDom4gbG/huqFpIHhlIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gaOG7hyBk4bqrbiDEkeG7mW5nIGtow7RuZz8qKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioNCg0KYGBge3J9DQp0YWJsZV9kcnZfY2xhc3MgPC0gdGFibGUoZGF0YTEkZHJ2LCBkYXRhMSRjbGFzcykNCnRhYmxlX2Rydl9jbGFzcw0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCmRmX2Rydl9jbGFzcyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlX2Rydl9jbGFzcykNCmNvbG5hbWVzKGRmX2Rydl9jbGFzcykgPC0gYygiRFJWIiwgIkNsYXNzIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCB0aGVvIG5ow7NtDQpnZ3Bsb3QoZGZfZHJ2X2NsYXNzLCBhZXMoeCA9IENsYXNzLCB5ID0gQ291bnQsIGZpbGwgPSBEUlYpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQaMOibiBi4buRIGjhu4cgZOG6q24gxJHhu5luZyB0aGVvIHBow6JuIGxv4bqhaSB4ZSIsDQogICAgeCA9ICJQaMOibiBsb+G6oWkgeGUiLA0KICAgIHkgPSAiU+G7kSBsxrDhu6NuZyIsDQogICAgZmlsbCA9ICJI4buHIGThuqtuIMSR4buZbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQoqKktp4buDbSDEkeG7i25oIGNoaSBiw6xuaCBwaMawxqFuZyoqDQoNCioqR2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6oqKg0KDQotIEdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgCk6IEtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgcGjDom4gbG/huqFpIHhlIHbDoCBo4buHIGThuqtuIMSR4buZbmcuDQotIEdp4bqjIHRodXnhur90IMSR4buRaSAoSOKCgSk6IEPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBwaMOibiBsb+G6oWkgeGUgdsOgIGjhu4cgZOG6q24gxJHhu5luZy4NCg0KYGBge3J9DQpjaGlzcV90ZXN0IDwtIGNoaXNxLnRlc3QodGFibGVfZHJ2X2NsYXNzKQ0KY2hpc3FfdGVzdA0KYGBgDQoNCioqTmjhuq1uIHjDqXQga+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KVuG7m2kgcC12YWx1ZSA8IDIuMmUtMTYgKHLhuqV0IGfhuqduIDApLCB0YSAqKmLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMCoqLiBEbyDEkcOzLCBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyAqKnBow6JuIGxv4bqhaSB4ZSB2w6AgbG/huqFpIGjhu4cgZOG6q24gxJHhu5luZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IG3huqFuaCBt4bq9KiouIFThu6sgYmnhu4N1IMSR4buTLCBjw7MgdGjhu4MgdGjhuqV5IHLDtSB4ZSBTVVYgdsOgIHBpY2t1cCBn4bqnbiBuaMawIGNo4buJIGPDsyBo4buHIGThuqtuIMSR4buZbmcgYDRgIGhv4bq3YyBgcmAsIHRyb25nIGtoaSB4ZSBgY29tcGFjdGAgdsOgIGBtaWRzaXplYCBjaOG7pyB54bq/dSBsw6AgYGZgLg0KDQojIyMgKipTbyBzw6FuaCBraOG6oyBuxINuZyDEkcaw4bujYyB0cmFuZyBi4buLIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1IChgNFdEYCkgZ2nhu69hIHhlIFNVViB2w6AgQ29tcGFjdCoqDQoNCioqVOG6oW8gYuG6o25nIHThuqduIHPhu5EgbeG7m2kqKg0KDQpgYGB7cn0NCiMgTOG7jWMgZOG7ryBsaeG7h3UgY2jhu4kgYmFvIGfhu5NtIDIgbmjDs20gJ3N1dicgdsOgICdjb21wYWN0Jw0KZGF0YV9zdWIgPC0gZGF0YTEgJT4lDQogIGZpbHRlcihjbGFzcyAlaW4lIGMoInN1diIsICJjb21wYWN0IikpDQoNCiMgVOG6oW8gYuG6o25nIDJ4MjogQ2xhc3MgKHN1diB2cyBjb21wYWN0KSB+IERSViAoNFdEIHZzIE5vdCA0V0QpDQojIMSQ4bq3dCAnc3V2JyBsw6AgbmjDs20gcGjGoWkgbmhp4buFbSwgJzQnIGzDoCBz4buxIGtp4buHbg0KdGFibGVfc3V2X2NvbXBhY3QgPC0gdGFibGUoDQogIENsYXNzID0gZmFjdG9yKGRhdGFfc3ViJGNsYXNzLCBsZXZlbHMgPSBjKCJzdXYiLCAiY29tcGFjdCIpKSwNCiAgSXNfNFdEID0gaWZlbHNlKGRhdGFfc3ViJGRydiA9PSAiNCIsICJ5ZXMiLCAibm8iKQ0KKQ0KDQojIMSQ4bqjbSBi4bqjbyB0aOG7qSB04buxIGPhu5l0IGzDoCAneWVzJywgJ25vJw0KdGFibGVfc3V2X2NvbXBhY3QgPC0gdGFibGVfc3V2X2NvbXBhY3RbLCBjKCJ5ZXMiLCAibm8iKV0NCnByaW50KHRhYmxlX3N1dl9jb21wYWN0KQ0KYGBgDQoNCioqVMOtbmggUmVsYXRpdmUgUmlzayAoUlIpIHbDoCBPZGRzIFJhdGlvIChPUikqKg0KDQpgYGB7cn0NCiMgVMOtbmggUlINCnJyX3Jlc3VsdCA8LSByaXNrcmF0aW8odGFibGVfc3V2X2NvbXBhY3QpDQpwcmludChycl9yZXN1bHQkbWVhc3VyZSkNCg0KIyBUw61uaCBPUg0Kb3JfcmVzdWx0IDwtIG9kZHNyYXRpbyh0YWJsZV9zdXZfY29tcGFjdCkNCnByaW50KG9yX3Jlc3VsdCRtZWFzdXJlKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqUmVsYXRpdmUgUmlzayAoUlIpID0gNC4xOTcqKjogVOG7tyBs4buHIG3hu5l0IGNoaeG6v2MgeGUgbMOgIHhlIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1IChgNFdEYCkg4bufIG5ow7NtICoqQ29tcGFjdCoqIGNhbyBn4bqlcCAqKjQuMTk3IGzhuqduKiogc28gduG7m2kgbmjDs20gKipTVVYqKi4NCi0gKipPZGRzIFJhdGlvIChPUikgPSAxMi45NyoqOiBU4bu3IGzhu4cgxJHhu4MgbeG7mXQgY2hp4bq/YyB4ZSBsw6AgeGUgYDRXRGAg4bufIG5ow7NtICoqQ29tcGFjdCoqIGNhbyBn4bqlcCAqKjEyLjk3IGzhuqduKiogc28gduG7m2kgb2RkcyDhu58gbmjDs20gKipTVVYqKi4NCg0KQ+G6oyBoYWkgY2jhu4kgc+G7kSDEkeG7gXUgY2hvIHRo4bqleSBt4buZdCBt4buRaSBsacOqbiBo4buHIGPhu7FjIGvhu7MgbeG6oW5oIG3hur0uIFhlIENvbXBhY3QgY8OzIGto4bqjIG7Eg25nIMSRxrDhu6NjIHRyYW5nIGLhu4sgaOG7hyBk4bqrbiDEkeG7mW5nIGhhaSBj4bqndSBjYW8gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIHhlIFNVVi4NCg0KLS0tDQoNCiMjICoqUGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBgZHJ2YCAoaOG7hyBk4bqrbiDEkeG7mW5nKSB2w6AgYGN5bGAgKHPhu5EgeGktbGFuaCkqKg0KDQoqKkPDonUgaOG7j2kgbmdoacOqbiBj4bupdToqKiAiU+G7kSB4aS1sYW5oIGPhu6dhIMSR4buZbmcgY8ahLCBt4buZdCBjaOG7iSBz4buRIHF1YW4gdHLhu41uZyB24buBIHPhu6ljIG3huqFuaCwgY8OzIGxpw6puIHF1YW4gxJHhur9uIGxv4bqhaSBo4buHIGThuqtuIMSR4buZbmcgxJHGsOG7o2MgdHJhbmcgYuG7iyB0csOqbiB4ZSBoYXkga2jDtG5nPyINCg0KIyMjICoqU+G7kSB4aS1sYW5oIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gaOG7hyBk4bqrbiDEkeG7mW5nIGtow7RuZz8qKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioNCg0KYGBge3J9DQp0YWJsZV9kcnZfY3lsIDwtIHRhYmxlKGRhdGExJGRydiwgZGF0YTEkY3lsKQ0KdGFibGVfZHJ2X2N5bA0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCmRmX2Rydl9jeWwgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZV9kcnZfY3lsKQ0KY29sbmFtZXMoZGZfZHJ2X2N5bCkgPC0gYygiRFJWIiwgIkN5bGluZGVycyIsICJDb3VudCIpDQoNCmdncGxvdChkZl9kcnZfY3lsLCBhZXMoeCA9IGFzLmZhY3RvcihDeWxpbmRlcnMpLCB5ID0gQ291bnQsIGZpbGwgPSBEUlYpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlThu7cgbOG7hyBo4buHIGThuqtuIMSR4buZbmcgdGhlbyBz4buRIHhpLWxhbmgiLA0KICAgIHggPSAiU+G7kSB4aS1sYW5oIiwNCiAgICB5ID0gIlThu7cgbOG7hyIsDQogICAgZmlsbCA9ICJI4buHIGThuqtuIMSR4buZbmciDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoqKktp4buDbSDEkeG7i25oIGNoaSBiw6xuaCBwaMawxqFuZyoqDQoNCioqR2nhuqMgdGh1eeG6v3QgdGjhu5FuZyBrw6oqKg0KDQotIEdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgCk6IEtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2Egc+G7kSB4aS1sYW5oIHbDoCBo4buHIGThuqtuIMSR4buZbmcuDQotIEdp4bqjIHRodXnhur90IMSR4buRaSAoSOKCgSk6IEPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBz4buRIHhpLWxhbmggdsOgIGjhu4cgZOG6q24gxJHhu5luZy4NCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlX2Rydl9jeWwpDQpgYGANCg0KKipOaOG6rW4geMOpdCBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQpW4bubaSBwLXZhbHVlIDwgMi4yZS0xNiwgdGEgKipiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAqKi4gQ8OzIG3hu5l0IG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBt4bqhbmggbeG6vSBnaeG7r2Egc+G7kSB4aS1sYW5oIHbDoCBsb+G6oWkgaOG7hyBk4bqrbiDEkeG7mW5nLg0KDQojIyMgKipQaMOibiB0w61jaCBy4bunaSBybyB2w6AgdOG7tyBz4buRIGNow6puaCoqDQoNCsSQ4buDIGzGsOG7o25nIGjDs2EgbeG7kWkgcXVhbiBo4buHIG7DoHksIGNow7puZyB0YSBz4bq9IHNvIHPDoW5oIGto4bqjIG7Eg25nIG3hu5l0IGNoaeG6v2MgeGUgxJHGsOG7o2MgdHJhbmcgYuG7iyBo4buHIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1IChgNFdEYCkgZ2nhu69hIGhhaSBuaMOzbSDEkeG7mW5nIGPGoSBwaOG7lSBiaeG6v24gdsOgIMSR4buRaSBs4bqtcCBuaOG6pXQ6ICoqOCB4aS1sYW5oKiogKGPDtG5nIHN14bqldCBjYW8pIHbDoCAqKjQgeGktbGFuaCoqIChjw7RuZyBzdeG6pXQgdGjhuqVwKS4NCg0KKipU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSAyeDIqKg0KDQpgYGB7cn0NCiMgTOG7jWMgZOG7ryBsaeG7h3UgY2jhu4kgYmFvIGfhu5NtIHhlIDQgdsOgIDggeGktbGFuaA0KZGF0YV9jeWxfc3ViIDwtIGRhdGExICU+JQ0KICBmaWx0ZXIoY3lsICVpbiUgYyg4LCA0KSkNCg0KIyBU4bqhbyBi4bqjbmcgMngyOiBT4buRIHhpLWxhbmggKDggdnMgNCkgfiBI4buHIGThuqtuIMSR4buZbmcgKDRXRCB2cyBOb3QgNFdEKQ0KIyDEkOG6t3QgOCB4aS1sYW5oIGzDoCBuaMOzbSBwaMahaSBuaGnhu4VtIChleHBvc3VyZSBncm91cCkNCnRhYmxlX2N5bF80d2QgPC0gdGFibGUoDQogIEN5bGluZGVycyA9IGZhY3RvcihkYXRhX2N5bF9zdWIkY3lsLCBsZXZlbHMgPSBjKDgsIDQpKSwNCiAgSXNfNFdEID0gaWZlbHNlKGRhdGFfY3lsX3N1YiRkcnYgPT0gIjQiLCAieWVzIiwgIm5vIikNCikNCg0KIyDEkOG6o20gYuG6o28gdGjhu6kgdOG7sSBj4buZdCAieWVzIiwgIm5vIg0KdGFibGVfY3lsXzR3ZCA8LSB0YWJsZV9jeWxfNHdkWywgYygieWVzIiwgIm5vIildDQpwcmludCh0YWJsZV9jeWxfNHdkKQ0KYGBgDQoNCioqVMOtbmggUmVsYXRpdmUgUmlzayAoUlIpKioNCg0KYGBge3J9DQojIFTDrW5oIFJSDQpycl9jeWxfNHdkIDwtIHJpc2tyYXRpbyh0YWJsZV9jeWxfNHdkKQ0KcHJpbnQocnJfY3lsXzR3ZCRtZWFzdXJlKQ0KYGBgDQoNCioqVMOtbmggT2RkcyBSYXRpbyAoT1IpKioNCg0KYGBge3J9DQojIFTDrW5oIE9SDQpvcl9jeWxfNHdkIDwtIG9kZHNyYXRpbyh0YWJsZV9jeWxfNHdkKQ0KcHJpbnQob3JfY3lsXzR3ZCRtZWFzdXJlKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqUmVsYXRpdmUgUmlzayAoUlIpID0gMi4yNyoqOg0KVOG7tyBs4buHIG3hu5l0IGNoaeG6v2MgeGUgxJHGsOG7o2MgdHJhbmcgYuG7iyBo4buHIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1IChgNFdEYCkg4bufIG5ow7NtICoqNCB4aS1sYW5oKiogY2FvIGfhuqVwICoqMi4yNyBs4bqnbioqIHNvIHbhu5tpIG5ow7NtICoqOCB4aS1sYW5oKiouIMSQw6J5IGzDoCBt4buZdCBz4buxIGtow6FjIGJp4buHdCBy4bqldCBs4bubbi4NCg0KLSAqKk9kZHMgUmF0aW8gKE9SKSA9IDUuNDEqKjoNClThu7cgbOG7hyDEkeG7gyBt4buZdCBjaGnhur9jIHhlIGzDoCB4ZSBgNFdEYCDhu58gbmjDs20gKio0IHhpLWxhbmgqKiBjYW8gZ+G6pXAgKio1LjQxIGzhuqduKiogc28gduG7m2kgb2RkcyDhu58gbmjDs20gKio4IHhpLWxhbmgqKi4NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KQ+G6oyBoYWkgY2jhu4kgc+G7kSBSUiB2w6AgT1IgxJHhu4F1IGNobyB0aOG6pXkgbeG7mXQgbeG7kWkgbGnDqm4gaOG7hyBj4buxYyBr4buzIG3huqFuaCBt4bq9LiBWaeG7h2MgbeG7mXQgY2hp4bq/YyB4ZSDEkcaw4bujYyB0cmFuZyBi4buLIMSR4buZbmcgY8ahIDQgeGktbGFuaCBsw6BtIHTEg25nIMSRw6FuZyBr4buDIGto4bqjIG7Eg25nIHhlIMSRw7MgY8WpbmcgxJHGsOG7o2MgdHJhbmcgYuG7iyBo4buHIGThuqtuIMSR4buZbmcgaGFpIGPhuqd1Lg0KDQotLS0NCg0KIyAqKlBoxrDGoW5nIHBow6FwIMav4bubYyBsxrDhu6NuZyBI4bujcCBsw70gVOG7kWkgxJFhIChNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiDigJMgTUxFKSoqDQoNCiMjICoqR2nhu5tpIHRoaeG7h3UgY2h1bmcqKg0KDQpUcm9uZyB0aOG7kW5nIGvDqiB2w6AgaOG7jWMgbcOheSwgZOG7ryBsaeG7h3UgdGjGsOG7nW5nIMSRxrDhu6NjIG3DtCBow6xuaCBow7NhIHRow7RuZyBxdWEgY8OhYyAqKnBow6JuIHBo4buRaSB4w6FjIHN14bqldCoqLiBN4buZdCBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQgxJHGsOG7o2MgxJHhurdjIHRyxrBuZyBi4bufaSBt4buZdCBz4buRICoqdGhhbSBz4buRKiosIHbDrSBk4bulIG5oxrA6DQoNCi0gUGjDom4gcGjhu5FpIGNodeG6qW4gKEdhdXNzaWFuKTogJFxtdSQgKHRydW5nIGLDrG5oKSwgJFxzaWdtYV4yJCAocGjGsMahbmcgc2FpKS4NCi0gUGjDom4gcGjhu5FpIFBvaXNzb246IHRoYW0gc+G7kSDEkeG6t2MgdHLGsG5nIGzDoCAkXGxhbWJkYSQuDQoNCk7hur91IHRhIMSRw6MgYmnhur90IMSRxrDhu6NjIGThuqFuZyBj4bunYSBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQsIHbhuqVuIMSR4buBIMSR4bq3dCByYSBsw6A6ICoqbMOgbSBzYW8gdMOsbSDEkcaw4bujYyBjw6FjIHRoYW0gc+G7kSBtw7QgdOG6oyBwaMOibiBwaOG7kWkgxJHDsyBt4buZdCBjw6FjaCBwaMO5IGjhu6NwIG5o4bqldCB24bubaSBk4buvIGxp4buHdSBxdWFuIHPDoXQ/KiogxJDDsyBjaMOtbmggbMOgIG5oaeG7h20gduG7pSBj4bunYSBwaMawxqFuZyBwaMOhcCAqKsaw4bubYyBsxrDhu6NuZyBo4bujcCBsw70gdOG7kWkgxJFhIChNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiDigJMgTUxFKSoqLg0KDQpNTEUgbMOgIG3hu5l0IGPDtG5nIGPhu6UgY8SDbiBi4bqjbiB2w6AgcXVhbiB0cuG7jW5nIHRyb25nIHRo4buRbmcga8OqIHN1eSBkaeG7hW4gdsOgIGjhu41jIG3DoXksIGdpw7pwIGNow7puZyB0YSB0w6xtIHJhIGPDoWMgdGhhbSBz4buRIG3DtCBow6xuaCBzYW8gY2hvICoqcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IHNpbmggcmEgZOG7ryBsaeG7h3UgbMOgICJwaMO5IGjhu6NwIG5o4bqldCIgduG7m2kgdGjhu7FjIHThur8gxJHDoyBxdWFuIHPDoXQqKi4NCg0KIyMgKipN4bulYyB0acOqdSB2w6Agbmd1ecOqbiBsw70gY+G7p2EgTUxFKioNCg0KIyMjICoqS2jDoWkgbmnhu4dtIGjDoG0gaOG7o3AgbMO9IChMaWtlbGlob29kIEZ1bmN0aW9uKSoqDQoNCioqSMOgbSBo4bujcCBsw70qKiAobGlrZWxpaG9vZCBmdW5jdGlvbikgxJFvIGzGsOG7nW5nICoqbeG7qWMgxJHhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggKHRoYW0gc+G7kSkgduG7m2kgZOG7ryBsaeG7h3UgxJHDoyBxdWFuIHPDoXQqKi4gVOG7qWMgbMOgLCB24bubaSBt4buZdCBtw7QgaMOsbmggeMOhYyBzdeG6pXQgY8OzIHRoYW0gc+G7kSAkXG1hdGhiZnt3fSQsIGjDoG0gaOG7o3AgbMO9IGNobyBiaeG6v3QgKip4w6FjIHN14bqldCDEkeG7gyB0b8OgbiBi4buZIHThuq1wIGThu68gbGnhu4d1ICRcbWF0aGNhbHtEfSQgeOG6o3kgcmEqKiwgZMaw4bubaSBnaeG6oyDEkeG7i25oIHLhurFuZyBk4buvIGxp4buHdSDEkcaw4bujYyBzaW5oIHJhIHThu6sgbcO0IGjDrG5oIMSRw7MuDQoNCkdp4bqjIHPhu60gY8OzIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3UgZ+G7k20gJE4kIHF1YW4gc8OhdCDEkeG6p3UgdsOgbzoNCg0KJCQNClxtYXRoY2Fse0R9ID0gXHsgXG1hdGhiZnt4fV8xLCBcbWF0aGJme3h9XzIsIFxsZG90cywgXG1hdGhiZnt4fV9OIFx9DQokJA0KDQp2w6AgbcO0IGjDrG5oIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCAkUChcbWF0aGJme3h9fFxtYXRoYmZ7d30pJCBwaOG7pSB0aHXhu5ljIHbDoG8gdGhhbSBz4buRDQoNCiQkDQpcbWF0aGJme3d9ID0gKHdfMSwgd18yLCBcbGRvdHMsIHdfayleVA0KJCQNCg0KS2hpIMSRw7MsICoqaMOgbSBo4bujcCBsw70qKiDEkcaw4bujYyDEkeG7i25oIG5naMSpYSBsw6A6DQoNCiQkDQpMKFxtYXRoYmZ7d30pID0gUChcbWF0aGNhbHtEfXxcbWF0aGJme3d9KSA9IFAoXG1hdGhiZnt4fV8xLCBcbWF0aGJme3h9XzIsIFxsZG90cywgXG1hdGhiZnt4fV9OfFxtYXRoYmZ7d30pDQokJA0KDQpO4bq/dSBjw6FjIHF1YW4gc8OhdCAkXG1hdGhiZnt4fV9pJCBsw6AgKirEkeG7mWMgbOG6rXAgdsOgIHBow6JuIHBo4buRaSBnaeG7kW5nIG5oYXUgKGkuaS5kIOKAkyBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQpKiosIHRow6wgaMOgbSBo4bujcCBsw70gY8OzIHRo4buDIHZp4bq/dCBs4bqhaSB0aMOgbmg6DQoNCiQkDQpMKFxtYXRoYmZ7d30pID0gXHByb2Rfe2k9MX1ee059IFAoXG1hdGhiZnt4fV9pfFxtYXRoYmZ7d30pDQokJA0KDQojIyMgKipOZ3V5w6puIGzDvSB04buRaSDEkWEgaMOzYSBo4bujcCBsw70qKg0KDQpOZ3V5w6puIGzDvSBj4buRdCBsw7VpIGPhu6dhIE1MRSBsw6AgY2jhu41uIGdpw6EgdHLhu4sgdGhhbSBz4buRICRcaGF0e1xtYXRoYmZ7d319JCBzYW8gY2hvICoqaMOgbSBo4bujcCBsw70gxJHhuqF0IGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0KiouIE7Ds2kgY8OhY2gga2jDoWMsIHRhIHTDrG0gdGhhbSBz4buRIG3DoCAqKmTGsOG7m2kgbsOzIHRow6wgeMOhYyBzdeG6pXQgdOG6oW8gcmEgZOG7ryBsaeG7h3UgcXVhbiBzw6F0IGzDoCBjYW8gbmjhuqV0Kio6DQoNCiQkDQpcaGF0e1xtYXRoYmZ7d319ID0gXGFyZ1xtYXhfe1xtYXRoYmZ7d319IEwoXG1hdGhiZnt3fSkNCiQkDQoNClR1eSBuaGnDqm4sIHZp4buHYyB04buRaSDGsHUgbeG7mXQgdMOtY2ggbOG7m24gY8OhYyB4w6FjIHN14bqldCBuaMawIHbhuq15IHRoxrDhu51uZyBraMO0bmcgdGh14bqtbiB0aeG7h24uIFbDrCB24bqteSwgdGEgdGjGsOG7nW5nICoqbOG6pXkgbG9nKiogY+G7p2EgaMOgbSBo4bujcCBsw70gxJHhu4MgdGh1IMSRxrDhu6NjICoqaMOgbSBsb2ctaOG7o3AgbMO9IChsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbikqKjoNCg0KJCQNClxlbGwoXG1hdGhiZnt3fSkgPSBcbG9nIEwoXG1hdGhiZnt3fSkgPSBcc3VtX3tpPTF9XntOfSBcbG9nIFAoXG1hdGhiZnt4fV9pfFxtYXRoYmZ7d30pDQokJA0KDQpEbyBow6BtIGxvZyBsw6AgxJHGoW4gxJFp4buHdSB0xINuZywgbsOqbiDEkWnhu4NtIGPhu7FjIMSR4bqhaSBj4bunYSAkXGVsbChcbWF0aGJme3d9KSQgY8WpbmcgY2jDrW5oIGzDoCBj4buxYyDEkeG6oWkgY+G7p2EgJEwoXG1hdGhiZnt3fSkkLiBW4bqteSBuw6puOg0KDQokJA0KXGhhdHtcbWF0aGJme3d9fSA9IFxhcmdcbWF4X3tcbWF0aGJme3d9fSBcZWxsKFxtYXRoYmZ7d30pDQokJA0KDQojIyAqKlTDs20gdOG6r3QgcXV5IHRyw6xuaCBNTEUqKg0KDQp8ICoqQsaw4bubYyoqIHwgKipNw7QgdOG6oyoqIHwNCnwtLS0tLS0tLS18LS0tLS0tLS0tLS18DQp8IELGsOG7m2MgMSB8IFjDoWMgxJHhu4tuaCBtw7QgaMOsbmggeMOhYyBzdeG6pXQgJFAoeHxcbWF0aGJme3d9KSQgdsOgIGdp4bqjIMSR4buLbmggZOG7ryBsaeG7h3UgxJHhu5ljIGzhuq1wIChpLmkuZCkuIHwNCnwgQsaw4bubYyAyIHwgVmnhur90IGjDoG0gaOG7o3AgbMO9ICRMKFxtYXRoYmZ7d30pJCBob+G6t2MgbG9nLWjhu6NwIGzDvSAkXGVsbChcbWF0aGJme3d9KSQuIHwNCnwgQsaw4bubYyAzIHwgVMOtbmggxJHhuqFvIGjDoG0gY+G7p2EgJFxlbGwoXG1hdGhiZnt3fSkkIHRoZW8gJFxtYXRoYmZ7d30kLCBy4buTaSBnaeG6o2kgcGjGsMahbmcgdHLDrG5oIMSR4bqhbyBow6BtIGLhurFuZyAwLiB8DQp8IELGsOG7m2MgNCB8IEtp4buDbSB0cmEgxJFp4buBdSBraeG7h24gdOG7kWkgxrB1ICjEkeG6oW8gaMOgbSBi4bqtYyBoYWksIHTDrW5oIGzhu5NpLCB2LnYuKS4gfA0KfCBCxrDhu5tjIDUgfCBL4bq/dCBsdeG6rW4gJFxoYXR7XG1hdGhiZnt3fX0kIGzDoCDGsOG7m2MgbMaw4bujbmcgTUxFLiB8DQoNCiMjICoqTcO0IGjDrG5oIGjDs2EgYsOgaSB0b8OhbiBkxrDhu5tpIGThuqFuZyB0b8OhbiBo4buNYyoqDQoNClRyb25nIHRyxrDhu51uZyBo4bujcCBk4buvIGxp4buHdSBwaMOibiBwaOG7kWkgaS5pLmQsIGLDoGkgdG/DoW4gTUxFIHRy4bufIHRow6BuaDoNCg0KJCQNClxoYXR7XG1hdGhiZnt3fX0gPSBcYXJnXG1heF97XG1hdGhiZnt3fX0gXHN1bV97aT0xfV57Tn0gXGxvZyBQKFxtYXRoYmZ7eH1faXxcbWF0aGJme3d9KQ0KJCQNCg0KxJDDonkgbMOgIG3hu5l0IGLDoGkgdG/DoW4gdOG7kWkgxrB1IGjDs2EgY8OzIHRo4buDIGdp4bqjaSBi4bqxbmc6DQoNCi0gxJDhuqFvIGjDoG0gdMaw4budbmcgbWluaCAobuG6v3UgY8OzIHRo4buDKSwNCi0gR3JhZGllbnQgRGVzY2VudCAvIE5ld3Rvbi1SYXBoc29uICh0cm9uZyB0csaw4budbmcgaOG7o3AgcGjhu6ljIHThuqFwKSwNCi0gS+G7uSB0aHXhuq10IHThu5FpIMawdSBow7NhIHPhu5EuDQoNCiMjICoqVMOtbmggY2jhuqV0IGPhu6dhIMaw4bubYyBsxrDhu6NuZyBNTEUqKg0KDQp8ICoqVMOtbmggY2jhuqV0KiogfCAqKk3DtCB04bqjKiogfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwNCnwgKipOaOG6pXQgcXXDoW4gKENvbnNpc3RlbmN5KSoqIHwgS2hpICROIFx0byBcaW5mdHkkLCBNTEUgaOG7mWkgdOG7pSB24buBIMSRw7puZyB0aGFtIHPhu5EgdGjhu7FjIHPhu7EuIHwNCnwgKipC4bqldCBiaeG6v24gKEludmFyaWFuY2UpKiogfCBO4bq/dSAkXGhhdHtcdGhldGF9JCBsw6AgTUxFIGPhu6dhICRcdGhldGEkLCB0aMOsICRnKFxoYXR7XHRoZXRhfSkkIGzDoCBNTEUgY+G7p2EgJGcoXHRoZXRhKSQuIHwNCnwgKipQaMOibiBwaOG7kWkgdGnhu4dtIGPhuq1uIGNodeG6qW4qKiB8IE1MRSB0aeG7h20gY+G6rW4gdGhlbyBwaMOibiBwaOG7kWkgY2h14bqpbiBraGkgJE4gXHRvIFxpbmZ0eSQuIHwNCnwgKipLaMO0bmcgdGhpw6puIGzhu4djaCB0aeG7h20gY+G6rW4qKiB8IEtoaSBt4bqrdSBs4bubbiwgc2FpIHPhu5EgdHJ1bmcgYsOsbmggY+G7p2EgTUxFIHRp4bq/biB24buBIDAuIHwNCg0KIyMgKipL4bq/dCBsdeG6rW4qKg0KDQpQaMawxqFuZyBwaMOhcCAqKsaw4bubYyBsxrDhu6NuZyBo4bujcCBsw70gdOG7kWkgxJFhIChNTEUpKiogbMOgIG3hu5l0IGPDtG5nIGPhu6UgdGhlbiBjaOG7kXQgdHJvbmcgdGjhu5FuZyBrw6ogdsOgIGjhu41jIG3DoXkuIELhurFuZyBjw6FjaCB04buRaSDEkWEgaMOzYSB4w6FjIHN14bqldCBzaW5oIHJhIGThu68gbGnhu4d1IMSRw6MgcXVhbiBzw6F0LCBNTEUgaMaw4bubbmcgdOG7m2kgbeG7pWMgdGnDqnUgY2jhu41uIG3DtCBow6xuaCBwaMO5IGjhu6NwIG5o4bqldCB24bubaSB0aOG7sWMgdOG6vy4gUGjGsMahbmcgcGjDoXAgbsOgeSBjw7MgY8ahIHPhu58gbMO9IHRodXnhur90IHbhu69uZyBjaOG6r2MgdsOgIGPDsyB0aOG7gyDDoXAgZOG7pW5nIMSR4buDIMaw4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgY+G7p2Egbmhp4buBdSBwaMOibiBwaOG7kWkgcGjhu5UgYmnhur9uIG5oxrAgQmVybm91bGxpLCBHYXVzc2lhbiwgUG9pc3Nvbiwgdi52Lg0KDQotLS0NCg0KIyAqKk3DtCBow6xuaCBI4buTaSBxdXkgTG9naXN0aWMgdsOgIFByb2JpdCoqDQoNCiMjICoqR2nhu5tpIHRoaeG7h3UgY2h1bmcqKg0KDQpLaGkgY8OhYyBwaMawxqFuZyBwaMOhcCBwaMOibiB0w61jaCBi4bqjbmcgY2jDqW8gdsOgIGtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZyDEkcOjIHjDoWMgbmjhuq1uIHPhu7EgdOG7k24gdOG6oWkgY+G7p2EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oLCBixrDhu5tjIHRp4bq/cCB0aGVvIGzDoCB4w6J5IGThu7FuZyBt4buZdCBtw7QgaMOsbmggZOG7sSBiw6FvIMSR4buDIGzGsOG7o25nIGjDs2EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCBsw6puIG3hu5l0IGJp4bq/biBwaOG7pSB0aHXhu5ljIG5o4buLIHBow6JuLiBLaGkgYmnhur9uIHBo4bulIHRodeG7mWMgY8OzIGhhaSBnacOhIHRy4buLICh2w60gZOG7pTogYDRXRGAgLyBgS2jDtG5nIDRXRGApLCBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdGjDtG5nIHRoxrDhu51uZyAoT0xTKSBz4bq9IGtow7RuZyBjw7JuIHBow7kgaOG7o3AgdsOsIG7DsyBjw7MgdGjhu4MgZOG7sSDEkW/DoW4gY8OhYyBnacOhIHRy4buLIG7hurFtIG5nb8OgaSBraG/huqNuZyBbMCwgMV0sIMSRaeG7gXUgdsO0IGzDvSDEkeG7kWkgduG7m2kgbeG7mXQgeMOhYyBzdeG6pXQuDQoNCsSQ4buDIGdp4bqjaSBxdXnhur90IHbhuqVuIMSR4buBIG7DoHksIGPDoWMgbcO0IGjDrG5oIHjDoWMgc3XhuqV0IHBoaSB0dXnhur9uIG5oxrAgKipI4buTaSBxdXkgTG9naXN0aWMqKiB2w6AgKipI4buTaSBxdXkgUHJvYml0KiogxJHGsOG7o2Mgc+G7rSBk4bulbmcuIEPhuqMgaGFpIMSR4buBdSB0aHXhu5ljIG5ow7NtICoqTcO0IGjDrG5oIFR1eeG6v24gdMOtbmggVOG7lW5nIHF1w6F0IChHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWxzIC0gR0xNKSoqLCB24bubaSBt4bulYyB0acOqdSBtw7QgaMOsbmggaMOzYSB4w6FjIHN14bqldCB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbiwgJFAoWT0xfFgpJCwgZOG7sWEgdHLDqm4gY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wICRYJC4NCg0KIyMgKipI4buTaSBxdXkgTG9naXN0aWMgKExvZ2lzdGljIFJlZ3Jlc3Npb24pKioNCg0KIyMjICoqTeG7pWMgdGnDqnUgdsOgIG5ndXnDqm4gbMO9KioNCg0KSOG7k2kgcXV5IExvZ2lzdGljIGtow7RuZyBtw7QgaMOsbmggaMOzYSB0cuG7sWMgdGnhur9wIHjDoWMgc3XhuqV0ICRwJCwgbcOgIG3DtCBow6xuaCBow7NhICoqbG9nYXJpdCBj4bunYSB04bu3IHPhu5EgY2jDqm5oIChsb2ctb2RkcykqKiwgY8OybiBn4buNaSBsw6AgKipow6BtIGxvZ2l0KiouDQoNCi0gKipU4bu3IHPhu5EgY2jDqm5oIChPZGRzKToqKiBMw6AgdOG7tyBs4buHIGdp4buvYSB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiB2w6AgeMOhYyBzdeG6pXQga2jDtG5nIHjhuqN5IHJhIHPhu7Ega2nhu4duOg0KICAkJCBcdGV4dHtPZGRzfSA9IFxmcmFje3B9ezEtcH0gJCQNCi0gKipIw6BtIExvZ2l0OioqIEzDoCBsb2dhcml0IHThu7Egbmhpw6puIGPhu6dhIE9kZHM6DQogICQkIFx0ZXh0e2xvZ2l0fShwKSA9IFxsblxsZWZ0KFxmcmFje3B9ezEtcH1ccmlnaHQpICQkDQoNCkjDoG0gbG9naXQgY8OzIG3hu5l0IMSR4bq3YyB0w61uaCB0dXnhu4d0IHbhu51pOiBuw7MgYmnhur9uIG3hu5l0IGdpw6EgdHLhu4sgeMOhYyBzdeG6pXQgJHAkIHRyb25nIGtob+G6o25nICgwLCAxKSB0aMOgbmggbeG7mXQgZ2nDoSB0cuG7iyB0csOqbiB0b8OgbiBi4buZIHRy4bulYyBz4buRIHRo4buxYyAkKC1caW5mdHksICtcaW5mdHkpJC4gxJBp4buBdSBuw6B5IGNobyBwaMOpcCBjaMO6bmcgdGEgbcO0IGjDrG5oIGjDs2EgbsOzIG5oxrAgbeG7mXQgdOG7lSBo4bujcCB0dXnhur9uIHTDrW5oIGPhu6dhIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcDoNCg0KJCQNClxsblxsZWZ0KFxmcmFje3BfaX17MS1wX2l9XHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFhfe2kxfSArIFxiZXRhXzIgWF97aTJ9ICsgXGxkb3RzICsgXGJldGFfayBYX3tpa30NCiQkDQoNCiMjIyAqKkRp4buFbiBnaeG6o2kgaOG7hyBz4buRKioNCg0KVmnhu4djIGRp4buFbiBnaeG6o2kgaOG7hyBz4buRICRcYmV0YSQgdHLhu7FjIHRp4bq/cCBraMOhIHBo4bupYyB04bqhcCAoInPhu7EgdGhheSDEkeG7lWkgdHJvbmcgbG9nLW9kZHMiKS4gVGhheSB2w6BvIMSRw7MsIGNow7puZyB0YSB0aMaw4budbmcgbOG6pXkgbMWpeSB0aOG7q2EgY8ahIHPhu5EgJGUkIGPhu6dhIGjhu4cgc+G7kSDEkeG7gyBjw7MgxJHGsOG7o2MgKipU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpKio6DQoNCiQkDQpcdGV4dHtPUn0gPSBlXlxiZXRhDQokJA0KDQotIE7hur91ICRcYmV0YV8xID4gMCBcaW1wbGllcyBlXntcYmV0YV8xfSA+IDEkOiBLaGkgJFhfMSQgdMSDbmcgMSDEkcahbiB24buLLCBvZGRzIMSR4buDIHPhu7Ega2nhu4duICRZPTEkIHjhuqN5IHJhIHPhur0gKip0xINuZyBsw6puKiogJGVee1xiZXRhXzF9JCBs4bqnbiwgZ2nhu68gY8OhYyBiaeG6v24ga2jDoWMga2jDtG5nIMSR4buVaS4NCi0gTuG6v3UgJFxiZXRhXzEgPCAwIFxpbXBsaWVzIGVee1xiZXRhXzF9IDwgMSQ6IEtoaSAkWF8xJCB0xINuZyAxIMSRxqFuIHbhu4ssIG9kZHMgxJHhu4Mgc+G7sSBraeG7h24gJFk9MSQgeOG6o3kgcmEgc+G6vSAqKmdp4bqjbSB4deG7kW5nKiogY8OybiAkZV57XGJldGFfMX0kIGzhuqduLCBnaeG7ryBjw6FjIGJp4bq/biBraMOhYyBraMO0bmcgxJHhu5VpLg0KLSBO4bq/dSAkXGJldGFfMSA9IDAgXGltcGxpZXMgZV57XGJldGFfMX0gPSAxJDogQmnhur9uICRYXzEkIGtow7RuZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gb2RkcyBj4bunYSBz4buxIGtp4buHbi4NCg0KIyMgKipI4buTaSBxdXkgUHJvYml0IChQcm9iaXQgUmVncmVzc2lvbikqKg0KDQojIyMgKipN4bulYyB0acOqdSB2w6Agbmd1ecOqbiBsw70qKg0KDQpI4buTaSBxdXkgUHJvYml0IGPFqW5nIG3DtCBow6xuaCBow7NhIHjDoWMgc3XhuqV0ICRwJCwgbmjGsG5nIHRoYXkgdsOsIGTDuW5nIGjDoG0gbG9naXQsIG7DsyBz4butIGThu6VuZyAqKmjDoG0gcGjDom4gcGjhu5FpIHTDrWNoIGzFqXkgKENERikgY+G7p2EgcGjDom4gcGjhu5FpIGNodeG6qW4gdOG6r2MqKiwga8O9IGhp4buHdSBsw6AgJFxQaGkoeikkLg0KDQrDnSB0xrDhu59uZyBjxqEgYuG6o24gbMOgIGPDsyBt4buZdCAiYmnhur9uIHRp4buBbSDhuqluIiAobGF0ZW50IHZhcmlhYmxlKSAkWV4qJCB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluLiBDaMO6bmcgdGEga2jDtG5nIHF1YW4gc8OhdCDEkcaw4bujYyAkWV4qJCwgbcOgIGNo4buJIHF1YW4gc8OhdCDEkcaw4bujYyAkWT0xJCBu4bq/dSAkWV4qJCB2xrDhu6N0IHF1YSBt4buZdCBuZ8aw4buhbmcgbsOgbyDEkcOzLg0KDQpNw7QgaMOsbmggUHJvYml0IGPDsyBk4bqhbmc6DQokJA0KUChZPTF8WCkgPSBcUGhpKFxiZXRhXzAgKyBcYmV0YV8xIFhfMSArIFxiZXRhXzIgWF8yICsgXGxkb3RzICsgXGJldGFfayBYX2spDQokJA0KSG/hurdjIHZp4bq/dCB0aGVvIGThuqFuZyBow6BtIG5nxrDhu6NjIChow6BtIHByb2JpdCk6DQokJA0KXFBoaV57LTF9KHBfaSkgPSBcYmV0YV8wICsgXGJldGFfMSBYX3tpMX0gKyBcYmV0YV8yIFhfe2kyfSArIFxsZG90cyArIFxiZXRhX2sgWF97aWt9DQokJA0KDQojIyMgKipEaeG7hW4gZ2nhuqNpIGjhu4cgc+G7kSoqDQoNCkjhu4cgc+G7kSAkXGJldGEkIHRyb25nIG3DtCBow6xuaCBQcm9iaXQgdGjhu4MgaGnhu4duIHPhu7EgdGhheSDEkeG7lWkgdHJvbmcgKip6LXNjb3JlKiogKGdpw6EgdHLhu4sgdHLDqm4gdHLhu6VjIGhvw6BuaCBj4bunYSBwaMOibiBwaOG7kWkgY2h14bqpbiB04bqvYykga2hpIGJp4bq/biDEkeG7mWMgbOG6rXAgJFgkIHRoYXkgxJHhu5VpIDEgxJHGoW4gduG7iy4gVmnhu4djIGRp4buFbiBnaeG6o2kgbsOgeSBraMO0bmcgdHLhu7FjIHF1YW4gdsOgIHRoxrDhu51uZyDDrXQgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgYsOhbyBjw6FvIGtpbmggZG9hbmguIFRoYXkgdsOgbyDEkcOzLCBuZ8aw4budaSB0YSB0aMaw4budbmcgdMOtbmggdG/DoW4gdsOgIGLDoW8gY8OhbyAqKnTDoWMgxJHhu5luZyBiacOqbiAobWFyZ2luYWwgZWZmZWN0cykqKiwgdOG7qWMgbMOgIHPhu7EgdGhheSDEkeG7lWkgdHJvbmcgeMOhYyBzdeG6pXQgJHAkIGtoaSAkWCQgdGhheSDEkeG7lWkuDQoNCiMjICoqTG9naXN0aWMgdnMuIFByb2JpdDogTOG7sWEgY2jhu41uIG7DoG8/KioNCg0KfCBUacOqdSBjaMOtIHwgSOG7k2kgcXV5IExvZ2lzdGljIHwgSOG7k2kgcXV5IFByb2JpdCB8DQp8Oi0tLXw6LS0tfDotLS18DQp8ICoqSMOgbSBsacOqbiBr4bq/dCoqIHwgTG9naXQsIGThu7FhIHRyw6puIHBow6JuIHBo4buRaSBMb2dpc3RpYyB8IFByb2JpdCwgZOG7sWEgdHLDqm4gcGjDom4gcGjhu5FpIENodeG6qW4gfA0KfCAqKsSQ4buZIGThu5FjKiogfCDEkMaw4budbmcgY29uZyBTIChzaWdtb2lkKSBoxqFpIHBo4bqzbmcgaMahbiDhu58gxJF1w7RpIHwgxJDGsOG7nW5nIGNvbmcgUyAoc2lnbW9pZCkgZOG7kWMgaMahbiDhu58gxJF1w7RpIHwNCnwgKipEaeG7hW4gZ2nhuqNpKiogfCBI4buHIHPhu5EgY8OzIHRo4buDIGRp4buFbiBnaeG6o2kgdHLhu7FjIHRp4bq/cCBxdWEgT2RkcyBSYXRpbyAoT1IpIHwgSOG7hyBz4buRIGtow7MgZGnhu4VuIGdp4bqjaSwgdGjGsOG7nW5nIGTDuW5nIHTDoWMgxJHhu5luZyBiacOqbiB8DQp8ICoqU+G7rSBk4bulbmcqKiB8IFLhuqV0IHBo4buVIGJp4bq/biB0cm9uZyB5IHNpbmgsIGtob2EgaOG7jWMgeMOjIGjhu5lpLCBtYXJrZXRpbmcgfCBQaOG7lSBiaeG6v24gdHJvbmcga2luaCB04bq/IGzGsOG7o25nIHwNCg0KVHJvbmcgdGjhu7FjIHThur8sIGPhuqMgaGFpIG3DtCBow6xuaCB0aMaw4budbmcgY2hvIGvhur90IHF14bqjIGThu7EgxJFvw6FuIHLhuqV0IGdp4buRbmcgbmhhdS4gKipI4buTaSBxdXkgTG9naXN0aWMgdGjGsOG7nW5nIMSRxrDhu6NjIMawYSBjaHXhu5luZyBoxqFuIHbDrCB0w61uaCBk4buFIGRp4buFbiBnaeG6o2kgY+G7p2EgT2RkcyBSYXRpby4qKg0KDQojIyAqKsOBcCBk4bulbmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuIGjhu4cgZOG6q24gxJHhu5luZyBoYWkgY+G6p3UgKGA0V0RgKSoqDQoNCioqQ8OidSBo4buPaSBuZ2hpw6puIGPhu6l1OioqIE5o4buvbmcgeeG6v3UgdOG7kSBr4bu5IHRodeG6rXQgbsOgbyAoZHVuZyB0w61jaCDEkeG7mW5nIGPGoSwgc+G7kSB4aS1sYW5oKSDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgbeG7mXQgY2hp4bq/YyB4ZSDEkcaw4bujYyB0cmFuZyBi4buLICoqaOG7hyBk4bqrbiDEkeG7mW5nIGhhaSBj4bqndSAoYDRXRGApKio/DQoNCiMjIyAqKkNodeG6qW4gYuG7iyBk4buvIGxp4buHdSoqDQoNCkNow7puZyB0YSBz4bq9IHThuqFvIG3hu5l0IGJp4bq/biBwaOG7pSB0aHXhu5ljIG3hu5tpIGzDoCBgaXNfNHdkYCwgbmjhuq1uIGdpw6EgdHLhu4sgYDFgIG7hur91IHhlIGzDoCBgNFdEYCB2w6AgYDBgIHRyb25nIHRyxrDhu51uZyBo4bujcCBjw7JuIGzhuqFpLg0KDQpgYGB7cn0NCiMgVOG6oW8gYmnhur9uIHBo4bulIHRodeG7mWMgbmjhu4sgcGjDom4NCm1wZ19tb2RlbF9kYXRhIDwtIG1wZyAlPiUNCiAgbXV0YXRlKGlzXzR3ZCA9IGlmZWxzZShkcnYgPT0gIjQiLCAxLCAwKSkNCg0KIyBYZW0gcXVhIGThu68gbGnhu4d1IG3hu5tpDQpoZWFkKG1wZ19tb2RlbF9kYXRhICU+JSBzZWxlY3QobWFudWZhY3R1cmVyLCBtb2RlbCwgZHJ2LCBpc180d2QsIGRpc3BsLCBjeWwpKQ0KYGBgDQoNCiMjIyAqKljDonkgZOG7sW5nIHbDoCBwaMOibiB0w61jaCBtw7QgaMOsbmggSOG7k2kgcXV5IExvZ2lzdGljKioNCg0KQ2jDum5nIHRhIHPhur0geMOieSBk4buxbmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuIGBpc180d2RgIGThu7FhIHRyw6puIGBkaXNwbGAgKGR1bmcgdMOtY2ggxJHhu5luZyBjxqEpIHbDoCBgY3lsYCAoc+G7kSB4aS1sYW5oKS4NCg0KYGBge3J9DQojIFjDonkgZOG7sW5nIG3DtCBow6xuaCBMb2dpc3RpYw0KbG9naXRfbW9kZWwgPC0gZ2xtKGlzXzR3ZCB+IGRpc3BsICsgY3lsLCANCiAgICAgICAgICAgICAgICAgICBkYXRhID0gbXBnX21vZGVsX2RhdGEsIA0KICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCg0KIyBYZW0ga+G6v3QgcXXhuqMNCnN1bW1hcnkobG9naXRfbW9kZWwpDQpgYGANCg0KKipEaeG7hW4gZ2nhuqNpIGvhur90IHF14bqjIG3DtCBow6xuaCBMb2dpc3RpYzoqKg0KDQotICoqSOG7hyBz4buRIGPhu6dhIGBkaXNwbGAgKER1bmcgdMOtY2ggxJHhu5luZyBjxqEpOioqDQogIC0gSOG7hyBz4buRIGzDoCBgMC43Mzg1YC4gR2nDoSB0cuG7iyBuw6B5IGTGsMahbmcgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogKHAtdmFsdWUgPSAwLjAxNyA8IDAuMDUpLg0KICAtIMSQ4buDIGRp4buFbiBnaeG6o2ksIHRhIHTDrW5oIE9kZHMgUmF0aW86IGBleHAoMC43Mzg1KSDiiYggMi4wOWAuDQogIC0gKipEaeG7hW4gZ2nhuqNpOioqIE7hur91IHPhu5EgeGktbGFuaCBraMO0bmcgxJHhu5VpIHRow6wga2hpIGR1bmcgdMOtY2ggxJHhu5luZyBjxqEgKip0xINuZyAxIGzDrXQqKiwgdOG7tyBs4buHIChvZGRzKSDEkeG7gyBjaGnhur9jIHhlIMSRw7MgbMOgIHhlIGA0V0RgICoqdMSDbmcgbMOqbiAyLjA5IGzhuqduKiouDQoNCi0gKipI4buHIHPhu5EgY+G7p2EgYGN5bGAgKFPhu5EgeGktbGFuaCk6KioNCiAgLSBI4buHIHPhu5EgbMOgIGAtMC4xMDU2YC4gR2nDoSB0cuG7iyDDom0gbmjGsG5nICoqa2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKiDhu58gbeG7qWMgNSUgKHAtdmFsdWUgPSAwLjY2MSA+IDAuMDUpLg0KDQojIyMgKipYw6J5IGThu7FuZyB2w6AgcGjDom4gdMOtY2ggbcO0IGjDrG5oIEjhu5NpIHF1eSBQcm9iaXQqKg0KDQpgYGB7cn0NCiMgWMOieSBk4buxbmcgbcO0IGjDrG5oIFByb2JpdA0KcHJvYml0X21vZGVsIDwtIGdsbShpc180d2QgfiBkaXNwbCArIGN5bCwgDQogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBtcGdfbW9kZWxfZGF0YSwgDQogICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQoNCiMgWGVtIGvhur90IHF14bqjDQpzdW1tYXJ5KHByb2JpdF9tb2RlbCkNCmBgYA0KDQoqKkRp4buFbiBnaeG6o2kga+G6v3QgcXXhuqMgbcO0IGjDrG5oIFByb2JpdDoqKg0KDQotICoqSOG7hyBz4buRIGPhu6dhIGBkaXNwbGAgKER1bmcgdMOtY2ggxJHhu5luZyBjxqEpOioqDQogIC0gSOG7hyBz4buRIGzDoCBgIDAuNDI2OWAuIEdpw6EgdHLhu4sgbsOgeSBkxrDGoW5nIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIChwLXZhbHVlID0gMC4wMDAxIDwgMC4wNSkuDQogIC0gKipEaeG7hW4gZ2nhuqNpOioqIE7hur91IHPhu5EgeGktbGFuaCBraMO0bmcgxJHhu5VpIHRow6wga2hpIGR1bmcgdMOtY2ggxJHhu5luZyBjxqEgKip0xINuZyAxIGzDrXQqKiwgKip6LXNjb3JlKiogZOG7sSDEkW/DoW4geMOhYyBzdeG6pXQgeGUgbMOgIGA0V0RgICoqdMSDbmcgbMOqbiAwLjQyNjkgxJHGoW4gduG7iyoqLg0KDQotICoqSOG7hyBz4buRIGPhu6dhIGBjeWxgIChT4buRIHhpLWxhbmgpOioqDQogIC0gSOG7hyBz4buRIGzDoCBgLTAuMDQ3OGAuIEdpw6EgdHLhu4sgw6JtIG5oxrBuZyAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiog4bufIG3hu6ljIDUlIChwLXZhbHVlID0gMC43NDI4ID4gMC4wNSkuDQoNCiMjIyAqKlNvIHPDoW5oIGhhaSBtw7QgaMOsbmgqKg0KDQpD4bqjIGhhaSBtw7QgaMOsbmggxJHhu4F1IGNobyBjw7luZyBt4buZdCBr4bq/dCBsdeG6rW46IGR1bmcgdMOtY2ggxJHhu5luZyBjxqEgKGBkaXNwbGApIGzDoCB54bq/dSB04buRIGThu7EgYsOhbyBxdWFuIHRy4buNbmcgY2hvIHZp4buHYyBt4buZdCBjaGnhur9jIHhlIGPDsyBwaOG6o2kgbMOgIGA0V0RgIGhheSBraMO0bmcuIENow7puZyB0YSBjw7MgdGjhu4Mgc28gc8OhbmggdHLhu7FjIHRp4bq/cCB4w6FjIHN14bqldCBk4buxIMSRb8OhbiB04burIGhhaSBtw7QgaMOsbmguDQoNCmBgYHtyfQ0KIyBM4bqleSB4w6FjIHN14bqldCBk4buxIMSRb8OhbiB04burIGhhaSBtw7QgaMOsbmgNCm1wZ19tb2RlbF9kYXRhJHByZWRfbG9naXQgPC0gcHJlZGljdChsb2dpdF9tb2RlbCwgdHlwZSA9ICJyZXNwb25zZSIpDQptcGdfbW9kZWxfZGF0YSRwcmVkX3Byb2JpdCA8LSBwcmVkaWN0KHByb2JpdF9tb2RlbCwgdHlwZSA9ICJyZXNwb25zZSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5Mgc28gc8OhbmgNCmdncGxvdChtcGdfbW9kZWxfZGF0YSwgYWVzKHggPSBwcmVkX2xvZ2l0LCB5ID0gcHJlZF9wcm9iaXQpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiU28gc8OhbmggeMOhYyBzdeG6pXQgZOG7sSDEkW/DoW4gZ2nhu69hIG3DtCBow6xuaCBMb2dpdCB2w6AgUHJvYml0IiwNCiAgICB4ID0gIljDoWMgc3XhuqV0IGThu7EgxJFvw6FuIHThu6sgbcO0IGjDrG5oIExvZ2lzdGljIiwNCiAgICB5ID0gIljDoWMgc3XhuqV0IGThu7EgxJFvw6FuIHThu6sgbcO0IGjDrG5oIFByb2JpdCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNCkJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IGPDoWMgxJFp4buDbSBk4buvIGxp4buHdSBu4bqxbSBy4bqldCBzw6F0IMSRxrDhu51uZyBjaMOpbyBtw6B1IMSR4buPLCBjaOG7qW5nIHThu48geMOhYyBzdeG6pXQgZOG7sSDEkW/DoW4gdOG7qyBoYWkgbcO0IGjDrG5oIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZyBuaGF1Lg==