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

1.1 Đọc và làm quen với dữ liệu

Bộ dữ liệu “Supermarket Transactions” phản ánh các giao dịch mua hàng của khách hàng tại một siêu thị trong một khoảng thời gian cụ thể. Mỗi dòng dữ liệu tương ứng với một giao dịch, bao gồm thông tin nhân khẩu học (giới tính, loại thành viên, chi nhánh), đặc điểm sản phẩm (loại sản phẩm, kênh thanh toán), và các yếu tố hành vi tiêu dùng (thời gian mua sắm, mức độ hài lòng, giá trị đơn hàng,…). Tập dữ liệu gồm 14.059 quan sát và 16 biến, cung cấp nền tảng chi tiết để phân tích hành vi khách hàng và hiệu quả kinh doanh của siêu thị.

# Đọc file
library("csv")
## Warning: package 'csv' was built under R version 4.4.3
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)

# Hiển thị cấu trúc dữ liệu
str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : chr  "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
##  $ City             : chr  "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
##  $ StateorProvince  : chr  "CA" "CA" "WA" "OR" ...
##  $ Country          : chr  "USA" "USA" "USA" "USA" ...
##  $ ProductFamily    : chr  "Food" "Food" "Food" "Food" ...
##  $ ProductDepartment: chr  "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
##  $ ProductCategory  : chr  "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...
# Hiển thị vài dòng đầu và cuối
head(data)
##   X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1   2007-12-18       7223      F             S         Y        2
## 2 2   2007-12-20       7841      M             M         Y        5
## 3 3   2007-12-21       8374      F             M         N        2
## 4 4   2007-12-21       9619      M             M         Y        3
## 5 5   2007-12-22       1900      F             S         Y        3
## 6 6   2007-12-22       6696      F             M         Y        3
##    AnnualIncome          City StateorProvince Country ProductFamily
## 1   $30K - $50K   Los Angeles              CA     USA          Food
## 2   $70K - $90K   Los Angeles              CA     USA          Food
## 3   $50K - $70K     Bremerton              WA     USA          Food
## 4   $30K - $50K      Portland              OR     USA          Food
## 5 $130K - $150K Beverly Hills              CA     USA         Drink
## 6   $10K - $30K Beverly Hills              CA     USA          Food
##   ProductDepartment      ProductCategory UnitsSold Revenue
## 1       Snack Foods          Snack Foods         5   27.38
## 2           Produce           Vegetables         5   14.90
## 3       Snack Foods          Snack Foods         3    5.52
## 4            Snacks                Candy         4    4.44
## 5         Beverages Carbonated Beverages         4   14.00
## 6              Deli          Side Dishes         3    4.37
tail(data)
##           X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14054 14054   2009-12-29       2032      F             M         N        3
## 14055 14055   2009-12-29       9102      F             M         Y        2
## 14056 14056   2009-12-29       4822      F             M         Y        3
## 14057 14057   2009-12-31        250      M             S         Y        1
## 14058 14058   2009-12-31       6153      F             S         N        4
## 14059 14059   2009-12-31       3656      M             S         N        3
##       AnnualIncome        City StateorProvince Country  ProductFamily
## 14054  $10K - $30K      Yakima              WA     USA Non-Consumable
## 14055  $10K - $30K   Bremerton              WA     USA           Food
## 14056  $10K - $30K Walla Walla              WA     USA           Food
## 14057  $30K - $50K    Portland              OR     USA          Drink
## 14058  $50K - $70K     Spokane              WA     USA          Drink
## 14059  $50K - $70K    Portland              OR     USA Non-Consumable
##       ProductDepartment      ProductCategory UnitsSold Revenue
## 14054         Household       Paper Products         5   14.50
## 14055      Baking Goods         Baking Goods         3    9.64
## 14056      Frozen Foods           Vegetables         3    7.45
## 14057         Beverages Pure Juice Beverages         4    3.24
## 14058             Dairy                Dairy         2    4.00
## 14059         Household           Electrical         5   25.53
# Chuyển các biến định tính phù hợp sang factor
factor <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
                    "City", "StateorProvince", "Country",
                    "ProductFamily", "ProductDepartment", "ProductCategory")

# Kiểm tra biến nào tồn tại trong data
factor <- intersect(factor, names(data))

# Chuyển sang factor
data[factor] <- lapply(data[factor], as.factor)

# Kiểm tra lại cấu trúc
str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
##  $ MaritalStatus    : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
##  $ Homeowner        : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
##  $ City             : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
##  $ StateorProvince  : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
##  $ Country          : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ ProductFamily    : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
##  $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
##  $ ProductCategory  : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...

1.2 Giải thích các biến

Bộ dữ liệu ghi lại thông tin về các giao dịch mua hàng của khách hàng, bao gồm thông tin nhân khẩu học, thông tin sản phẩm, số lượng bán ra và doanh thu. Dữ liệu bao gồm 14059 quan sát và 16 biến. Dưới đây là mô tả chi tiết các biến có trong bộ dữ liệu:

Tên Biến Ý Nghĩa
PurchaseDate Ngày giao dịch mua hàng diễn ra (định dạng ngày/tháng/năm).
CustomerID Mã định danh duy nhất cho mỗi khách hàng.
Gender Giới tính của khách hàng: M (Nam), F (Nữ).
MaritalStatus Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn).
Homeowner Tình trạng sở hữu nhà: Y (Có), N (Không).
Children Số lượng con cái của khách hàng.
AnnualIncome Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K).
City Thành phố nơi khách hàng thực hiện giao dịch.
StateorProvince Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon).
Country Quốc gia.
ProductFamily Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng).
ProductDepartment Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v.
ProductCategory Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine.
UnitsSold Số lượng đơn vị sản phẩm đã bán trong giao dịch đó.
Revenue Doanh thu từ giao dịch (tính theo USD).

Trước khi tiến hành thống kê mô tả các biến trong bộ dữ liệu, ta tiến hành phân loại dữ liệu thành 2 nhóm bao gồm: dữ liệu định tính và dữ liệu định lượng như sau:

Phân loại biến theo kiểu dữ liệu:

Dữ liệu Định tính:

Tên Biến Ý Nghĩa
Gender Giới tính của khách hàng: M (Nam), F (Nữ).
MaritalStatus Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn).
Homeowner Tình trạng sở hữu nhà: Y (Có), N (Không).
AnnualIncome Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K).
City Thành phố nơi khách hàng thực hiện giao dịch.
StateorProvince Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon).
Country Quốc gia.
ProductFamily Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng).
ProductDepartment Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v.
ProductCategory Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine.

Dữ liệu Định lượng:

Tên Biến Ý Nghĩa
Children Số lượng con cái của khách hàng.
UnitsSold Số lượng đơn vị sản phẩm đã bán trong giao dịch đó.
Revenue Doanh thu từ giao dịch (tính theo USD).

1.3 Kiểm tra giá trị NA

Trước khi tiến hành phân tích dữ liệu, chúng ta cần kiểm tra và xử lý các giá trị bị thiếu nhằm đảm bảo độ chính xác và tính toàn vẹn của kết quả phân tích.

sum(is.na(data))
## [1] 0
which(is.na(data))
## integer(0)

Cả hai lệnh đều trả về kết quả cho thấy không tồn tại giá trị thiếu:

  • sum(is.na(data)) trả về 0, nghĩa là không có giá trị NA nào.

  • which(is.na(data)) trả về integer(0), nghĩa là không có vị trí nào chứa NA.

Điều này cho phép chúng ta tiếp tục các bước xử lý dữ liệu và phân tích mà không cần thực hiện bước xử lý giá trị thiếu.

1.4 Tạo bộ dữ liệu chỉ có biến định tính

dataDT <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", 
            "City", "StateorProvince", "Country", 
            "ProductFamily", "ProductDepartment", "ProductCategory")
dataDT <- data[,dataDT] 
str(dataDT)
## 'data.frame':    14059 obs. of  10 variables:
##  $ Gender           : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
##  $ MaritalStatus    : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
##  $ Homeowner        : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
##  $ AnnualIncome     : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
##  $ City             : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
##  $ StateorProvince  : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
##  $ Country          : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ ProductFamily    : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
##  $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
##  $ ProductCategory  : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...

2 PHẦN 2: PHÂN TÍCH MÔ TẢ MỘT BIẾN ĐỊNH TÍNH

2.1 Biến Gender

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

#Bảng tần số
table(dataDT$Gender)
## 
##    F    M 
## 7170 6889
#Bảng tần suất
table(dataDT$Gender)/sum(table(dataDT$Gender))
## 
##         F         M 
## 0.5099936 0.4900064

2.1.2 Vẽ biểu đồ cột

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Tạo bảng tần số
freq1 <- table(dataDT$Gender)

# Chuyển thành data frame
Gender <- as.data.frame(freq1)
colnames(Gender) <- c("Gender", "Count")

# Vẽ biểu đồ cột
ggplot(Gender, aes(x = Gender, y = Count, fill = Gender)) +
  geom_col(color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") +
  scale_fill_manual(values = c("M" = "#6495ED", "F" = "#F08080")) +
  labs(
    title = "Gender")+
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5)) 

2.1.3 Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq1,
    labels = paste0(names(freq1), " (", round(100 * freq1 / sum(freq1), 1), "%)"),
    col = c("#F08080", "#6495ED"),  # màu tùy chọn
    main = "Gender")

Nhận xét:

  • Dựa vào bảng tần số và tần suất, có thể thấy rằng trong bộ dữ liệu hiện tại có 7170 khách hàng là nữ và 6889 khách hàng là nam. Tỷ lệ tương ứng là khoảng 51% nữ và 49% nam.
  • Kết quả này cho thấy giới tính nữ chiếm tỷ trọng nhỉnh hơn trong tập khách hàng được khảo sát (dựa trên biểu đồ tròn).Đồng thời, biểu đồ cột minh họa trực quan cho thấy sự chênh lệch không quá lớn giữa hai giới, nhưng nữ vẫn chiếm ưu thế nhẹ về mặt số lượng.

2.2 Biến MaritalStatus

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

#Bảng tần số
table(dataDT$MaritalStatus)
## 
##    M    S 
## 6866 7193
#Bảng tần suất
table(dataDT$MaritalStatus)/sum(table(dataDT$MaritalStatus))
## 
##         M         S 
## 0.4883704 0.5116296

2.2.2 Vẽ biểu đồ cột

# Tạo bảng tần số
freq2 <- table(dataDT$MaritalStatus)

# Chuyển thành data frame
MaritalStatus <- as.data.frame(freq2)
colnames(MaritalStatus) <- c("MaritalStatus", "Count")

# Vẽ biểu đồ cột
ggplot(MaritalStatus, aes(x = MaritalStatus, y = Count, fill = MaritalStatus)) +
  geom_col(color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") +
  scale_fill_manual(values = c("S" = "#FC8D62", "M" = "#66C2A5")) +
  labs(
    title = "MaritalStatus"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

2.2.3 Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq2,
    labels = paste0(names(freq2), " (", round(100 * freq2 / sum(freq2), 1), "%)"),
    col = c("#66C2A5", "#FC8D62"),  # màu tùy chọn
    main = "MaritalStatus")

Nhận xét:

  • Dựa vào bảng tần số và tần suất, ta thấy trong tập dữ liệu có 7193 khách hàng thuộc nhóm độc thân (Single) và 6866 khách hàng thuộc nhóm đã kết hôn (Married). Tỷ lệ tương ứng là 51.16% độc thân và 48.84% đã kết hôn.

  • Biểu đồ cột minh họa rõ ràng rằng số lượng khách hàng độc thân nhỉnh hơn một chút so với nhóm đã kết hôn. Biểu đồ tròn cũng cho thấy sự phân bố khá cân bằng giữa hai nhóm tình trạng hôn nhân.
    Điều này cho thấy dữ liệu có tính đại diện tốt cho cả hai nhóm, tránh được tình trạng thiên lệch mẫu trong nghiên cứu.

2.3 Biến Homeowner

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

#Bảng tần số
table(dataDT$Homeowner)
## 
##    N    Y 
## 5615 8444
#Bảng tần suất
table(dataDT$Homeowner)/sum(table(dataDT$Homeowner))
## 
##         N         Y 
## 0.3993883 0.6006117

2.3.2 Vẽ biểu đồ cột

# Tạo bảng tần số
freq3 <- table(dataDT$Homeowner)

# Chuyển thành data frame
homeowner <- as.data.frame(freq3)
colnames(homeowner) <- c("Homeowner", "Count")

# Vẽ biểu đồ cột
ggplot(homeowner, aes(x = Homeowner, y = Count, fill = Homeowner)) +
  geom_col(color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") +
  scale_fill_manual(values = c("N" = "#FDB462", "Y" = "#80B1D3")) +
  labs(
    title = "Homeowner") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

2.3.3 Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq3,
    labels = paste0(names(freq3), " (", round(100 * freq3 / sum(freq3), 1), "%)"),
    col = c("#FDB462", "#80B1D3"),  # màu tùy chọn
    main = "Homeowner")

Nhận xét:

  • Dựa trên bảng tần số, có 5615 khách hàng chưa có nhà và 8444 khách hàng đã có nhà. Xét về tỷ lệ, nhóm chưa có nhà chiếm khoảng 39.94%, trong khi nhóm đã có nhà chiếm 60.06%.
  • Biểu đồ cột thể hiện rõ rằng phần lớn khách hàng trong dữ liệu thuộc nhóm đã có nhà, cho thấy khả năng tài chính tương đối ổn định hoặc thuộc nhóm khách hàng trung niên trở lên. Biểu đồ tròn bổ sung góc nhìn trực quan, cho thấy sự chênh lệch rõ rệt giữa hai nhóm, tuy chưa đến mức áp đảo tuyệt đối.

2.4 Biến AnnualIncome

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

#Bảng tần số
table(dataDT$AnnualIncome)
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
#Bảng tần suất
table(dataDT$AnnualIncome)/sum(table(dataDT$AnnualIncome))
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##    0.21978804    0.04573583    0.05405790    0.01941817    0.32726367 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##    0.16857529    0.12155914    0.04360196

2.4.2 Vẽ đồ thị

# Tạo bảng tần số
freq4 <- table(dataDT$AnnualIncome)

# Chuyển thành data frame
AnnualIncome <- as.data.frame(freq4)
colnames(AnnualIncome) <- c("AnnualIncome", "Count")

# Vẽ biểu đồ cột
ggplot(AnnualIncome, aes(x = AnnualIncome, y = Count)) +
  geom_col(fill = "#F08080", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") 

Nhận xét:

  • Dựa vào bảng tần số, nhóm thu nhập phổ biến nhất là từ 30K – 50K USD/năm, với 4601 người, chiếm khoảng 32.73% theo bảng tần suất. Theo sau là nhóm 10K – 30K USD/năm với 3090 người (~21.98%).

  • Ngược lại, các nhóm thu nhập cao như $150K+ hoặc $110K – $130K chiếm tỷ trọng rất nhỏ trong bộ dữ liệu (chỉ khoảng NA% và 4.57%), cho thấy nhóm khách hàng chính nằm trong phân khúc thu nhập trung bình.

  • Biểu đồ cột giúp hình dung rõ sự phân bố thu nhập, cho thấy phân khúc dưới 90K chiếm phần lớn, đặc biệt là 2 nhóm 30K – 50K và 10K – 30K.

2.5 Biến City

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

#Bảng tần số
table(dataDT$City)
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##           383           143           811           834           452 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##            75           845           926           654           194 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##           464           876          1386           621           866 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##           130           922           875          1257           633 
##      Victoria   Walla Walla        Yakima 
##           176           160           376
#Bảng tần suất
table(dataDT$City)/sum(table(data$City))
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##   0.027242336   0.010171420   0.057685468   0.059321431   0.032150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##   0.005334661   0.060103848   0.065865282   0.046518245   0.013798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##   0.033003770   0.062308841   0.098584537   0.044170994   0.061597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##   0.009246746   0.065580767   0.062237712   0.089408920   0.045024539 
##      Victoria   Walla Walla        Yakima 
##   0.012518671   0.011380610   0.026744434

2.5.2 Vẽ biểu đồ cột

library(ggplot2)
library(patchwork)
## Warning: package 'patchwork' was built under R version 4.4.3
# Bảng tần suất -> data frame
freq5 <- as.data.frame(table(dataDT$City))
colnames(freq5) <- c("City", "Count")

# Sắp xếp giảm dần
freq5 <- freq5[order(-freq5$Count), ]

# Chia đôi danh sách thành phố
n <- nrow(freq5)
mid <- ceiling(n / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top <- head(freq5, mid)

plot1 <- ggplot(top, aes(x = City, y = Count)) +
  geom_col(fill = "#DB7093", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom <- tail(freq5, n - mid)

plot2 <- ggplot(bottom, aes(x = City, y = Count)) +
  geom_col(fill = "#F08080", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Ghép hai biểu đồ
plot1 + plot2

Nhận xét:

  • Dựa vào bảng tần số, thành phố xuất hiện phổ biến nhất là Salem với 1386 người, chiếm khoảng 9.86% theo bảng tần suất.Theo sau là Tacoma và Portland với lần lượt 1257 người (~8.94%) và 876 người (~6.23%).

  • Ngược lại, các thành phố như Guadalajara hoặc Victoria có số lượng rất ít, chỉ lần lượt 75 và 176 người, chiếm chưa đến 0.53% và 1.25% trong toàn bộ dữ liệu.

  • Biểu đồ cột giúp trực quan hóa sự phân bố thành phố, cho thấy một số thành phố như Salem, Tacoma và Portland chiếm tỷ lệ vượt trội, trong khi phần lớn các thành phố còn lại có tần suất thấp. Điều này cho thấy dữ liệu tập trung vào một số khu vực địa lý nhất định thay vì phân bố đồng đều.

2.6 Biến StateorProvince

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

#Bảng tần số
table(dataDT$StateorProvince)
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
#Bảng tần suất
table(dataDT$StateorProvince)/sum(table(dataDT$StateorProvince))
## 
##          BC          CA          DF    Guerrero     Jalisco          OR 
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378 
##    Veracruz          WA     Yucatan   Zacatecas 
## 0.033003770 0.324845295 0.046518245 0.092254072

2.6.2 Vẽ biểu đồ cột

# Tạo bảng tần số
freq6 <- table(dataDT$StateorProvince)

# Chuyển thành data frame
StateorProvince <- as.data.frame(freq6)
colnames(StateorProvince) <- c("StateorProvince", "Count")

# Vẽ biểu đồ cột
ggplot(StateorProvince, aes(x = StateorProvince, y = Count)) +
  geom_col(fill = "#F08080", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") 

Nhận xét:

  • Dựa trên bảng tần số, tiểu bang có số lượng khách hàng lớn nhất là WA (Washington) với 4567 người, chiếm khoảng 32.48% toàn bộ dữ liệu.
  • Theo sau là CA (California) với 2733 khách hàng (~19.44%) và BC (British Columbia) với 809 người (~5.75%).Ngược lại, một số tiểu bang như Jalisco, Veracruz và Guerrero có số lượng khách hàng rất thấp, dưới 5% mỗi nhóm.
  • Biểu đồ cột cho thấy sự phân bố không đều giữa các tiểu bang, trong đó WA và CA chiếm phần lớn dữ liệu. Điều này cho thấy hai tiểu bang này có thể là thị trường chính hoặc có mạng lưới phân phối mạnh hơn trong tập dữ liệu này.

2.7 Biến Country

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

#Bảng tần số
table(dataDT$Country)
## 
## Canada Mexico    USA 
##    809   3688   9562
#Bảng tần suất
table(dataDT$Country)/sum(table(dataDT$Country))
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372

2.7.2 Vẽ biểu đồ cột

# Tạo bảng tần số
freq7 <- table(dataDT$Country)

# Chuyển thành data frame
Country <- as.data.frame(freq7)
colnames(Country) <- c("Country", "Count")

# Vẽ biểu đồ cột
ggplot(Country, aes(x = Country, y = Count)) +
  geom_col(fill = "#FDB462", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") 

2.7.3 Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq7,
    labels = paste0(names(freq7), " (", round(100 * freq7 / sum(freq7), 1), "%)"),
    col = c("#89CFF0", "#F4A460", "#F08080"),  # màu tùy chọn
    main = "Country")

Nhận xét:

  • Dựa vào bảng tần số, phần lớn khách hàng trong dữ liệu đến từ USA với 9562 người, chiếm khoảng 68.01% tổng số quan sát. Theo sau là Mexico với 3688 người (~26.23%), và Canada chỉ có 809 người (~5.75%).
  • Biểu đồ cột thể hiện rõ rằng USA là quốc gia chiếm ưu thế trong tập dữ liệu, với số lượng khách hàng vượt trội so với Mexico và Canada. Biểu đồ tròn bổ sung góc nhìn trực quan, cho thấy phần hình tròn đại diện cho USA lớn gấp nhiều lần hai nhóm còn lại. Điều này cho thấy rằng tập dữ liệu chủ yếu tập trung vào thị trường Mỹ, trong khi Mexico và Canada đóng vai trò nhỏ hơn trong phân phối khách hàng.

2.8 Biến Product Family

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

#Bảng tần số
table(dataDT$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
#Bảng tần suất
table(dataDT$ProductFamily)/sum(table(dataDT$ProductFamily))
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813

2.8.2 Vẽ biểu đồ cột

# Tạo bảng tần số
freq8 <- table(dataDT$ProductFamily)

# Chuyển thành data frame
ProductFamily <- as.data.frame(freq8)
colnames(ProductFamily) <- c("ProductFamily", "Count")

# Vẽ biểu đồ cột
ggplot(ProductFamily, aes(x = ProductFamily, y = Count)) +
  geom_col(fill = "#6495ED", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") 

2.8.3 Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq8,
    labels = paste0(names(freq8), " (", round(100 * freq8 / sum(freq8), 1), "%)"),
    col = c("#89CFF0", "#F4A460", "#F08080"),  # màu tùy chọn
    main = "ProductFamily")

Nhận xét:

  • Dựa vào bảng tần số, phần lớn sản phẩm trong dữ liệu thuộc nhóm Food với 10153 sản phẩm, chiếm khoảng 72.22% tổng số quan sát. Theo sau là nhóm Non-Consumable với 2656 sản phẩm (~18.89%), và Drink chỉ có 1250 sản phẩm (~8.89%).
  • Biểu đồ cột thể hiện rõ rằng Food là nhóm sản phẩm chiếm ưu thế trong tập dữ liệu, với số lượng vượt trội so với hai nhóm còn lại.Biểu đồ tròn bổ sung góc nhìn trực quan, cho thấy phần hình tròn đại diện cho Food lớn hơn nhiều so với Non-Consumable và Drink. Điều này cho thấy rằng tập dữ liệu tập trung nhiều nhất vào sản phẩm thực phẩm, trong khi các nhóm sản phẩm không tiêu dùng và đồ uống chiếm tỷ trọng nhỏ hơn trong phân phối sản phẩm.

2.9 Biến Product Department

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

#Bảng tần số
table(dataDT$ProductDepartment)
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##                 356                 425                1072                 680 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##                 188                 977                 109                  59 
##            Checkout               Dairy                Deli                Eggs 
##                  82                 903                 699                 198 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##                1382                 893                1420                  89 
##         Periodicals             Produce             Seafood         Snack Foods 
##                 202                1994                 102                1600 
##              Snacks       Starchy Foods 
##                 352                 277
#Bảng tần suất
table(dataDT$ProductDepartment)/sum(table(dataDT$ProductDepartment))
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##         0.025321858         0.030229746         0.076250089         0.048367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##         0.013372217         0.069492852         0.007753041         0.004196600 
##            Checkout               Dairy                Deli                Eggs 
##         0.005832563         0.064229319         0.049719041         0.014083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##         0.098300021         0.063518031         0.101002916         0.006330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##         0.014368020         0.141830856         0.007255139         0.113806103 
##              Snacks       Starchy Foods 
##         0.025037343         0.019702682

2.9.2 Vẽ biều đồ cột

# Bảng tần suất -> data frame
freq9 <- as.data.frame(table(dataDT$ProductDepartment))
colnames(freq9) <- c("ProductDepartment", "Count")

# Sắp xếp giảm dần
freq9 <- freq9[order(-freq9$Count), ]

# Chia đôi danh sách thành phố
n1 <- nrow(freq9)
mid1 <- ceiling(n1 / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top1 <- head(freq9, mid1)

plot11 <- ggplot(top1, aes(x = ProductDepartment, y = Count)) +
  geom_col(fill = "#DB7093", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom1 <- tail(freq9, n1 - mid1)

plot22 <- ggplot(bottom1, aes(x = ProductDepartment, y = Count)) +
  geom_col(fill = "#6495ED", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Ghép hai biểu đồ
plot11 + plot22

Nhận xét:

  • Dựa vào bảng tần số, nhóm sản phẩm phổ biến nhất là Produce với 1994 sản phẩm, chiếm khoảng 14.18% tổng số quan sát. Theo sau là các nhóm Snack Foods (1600, ~11.38%), Household (1420), và Frozen Foods (1382).

  • Ngược lại, các nhóm ít xuất hiện nhất trong dữ liệu gồm Carousel (59 sản phẩm), Checkout (82), và Eggs (198).

  • Biểu đồ cột bên trái thể hiện rõ sự áp đảo của nhóm Produce, vượt trội hẳn về số lượng so với các nhóm còn lại. Biểu đồ cột bên phải bổ sung thêm các nhóm có tần số thấp hơn, cho thấy mức độ phân tán rộng giữa các nhóm sản phẩm.

Tổng thể, dữ liệu nghiêng mạnh về các mặt hàng thực phẩm tươi sống và ăn nhẹ, trong khi các nhóm như sản phẩm đặc biệt (Carousel, Checkout) chiếm tỷ trọng rất nhỏ. Điều này phản ánh cơ cấu hàng hóa tập trung vào các mặt hàng tiêu dùng phổ biến.

2.10 Biến Product Category

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

#Bảng tần số
table(dataDT$ProductCategory)
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##                  484                  365                  356 
##                Bread      Breakfast Foods              Candles 
##                  425                  417                   45 
##                Candy     Canned Anchovies         Canned Clams 
##                  352                   44                   53 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##                   35                   40                   38 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##                  404                   87                  154 
##    Cleaning Supplies        Cold Remedies                Dairy 
##                  189                   93                  903 
##        Decongestants               Drinks                 Eggs 
##                   85                  135                  198 
##           Electrical      Frozen Desserts       Frozen Entrees 
##                  355                  323                  118 
##                Fruit             Hardware        Hot Beverages 
##                  765                  129                  226 
##              Hygiene     Jams and Jellies     Kitchen Products 
##                  197                  588                  217 
##            Magazines                 Meat        Miscellaneous 
##                  202                  761                   42 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##                   48                  192                  345 
##                Pizza     Plastic Products Pure Juice Beverages 
##                  194                  141                  165 
##              Seafood          Side Dishes          Snack Foods 
##                  102                  153                 1600 
##            Specialty        Starchy Foods           Vegetables 
##                  289                  277                 1728
#Bảng tần suất
table(dataDT$ProductCategory)/sum(table(dataDT$ProductCategory))
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##          0.034426346          0.025962017          0.025321858 
##                Bread      Breakfast Foods              Candles 
##          0.030229746          0.029660716          0.003200797 
##                Candy     Canned Anchovies         Canned Clams 
##          0.025037343          0.003129668          0.003769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##          0.002489508          0.002845153          0.002702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##          0.028736041          0.006188207          0.010953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##          0.013443346          0.006614980          0.064229319 
##        Decongestants               Drinks                 Eggs 
##          0.006045949          0.009602390          0.014083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##          0.025250729          0.022974607          0.008393200 
##                Fruit             Hardware        Hot Beverages 
##          0.054413543          0.009175617          0.016075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##          0.014012376          0.041823743          0.015434953 
##            Magazines                 Meat        Miscellaneous 
##          0.014368020          0.054129028          0.002987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##          0.003414183          0.013656732          0.024539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##          0.013798990          0.010029163          0.011736254 
##              Seafood          Side Dishes          Snack Foods 
##          0.007255139          0.010882709          0.113806103 
##            Specialty        Starchy Foods           Vegetables 
##          0.020556227          0.019702682          0.122910591

2.10.2 Vẽ biều đồ cột

# Bảng tần suất -> data frame
freq10 <- as.data.frame(table(dataDT$ProductCategory))
colnames(freq10) <- c("ProductCategory", "Count")

# Sắp xếp giảm dần
freq10 <- freq10[order(-freq10$Count), ]

# Chia đôi danh sách thành phố
n2 <- nrow(freq10)
mid2 <- ceiling(n2 / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top2 <- head(freq10, mid2)

plot12 <- ggplot(top2, aes(x = ProductCategory, y = Count)) +
  geom_col(fill = "#F4A460", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))

# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom2 <- tail(freq10, n2 - mid2)

plot21 <- ggplot(bottom2, aes(x = ProductCategory, y = Count)) +
  geom_col(fill = "#89CFF0", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))

# Ghép hai biểu đồ
plot12 + plot21

Nhận xét:

  • Dựa vào bảng tần số, nhóm sản phẩm phổ biến nhất là Vegetables với 1728 sản phẩm, chiếm khoảng 12.29% tổng số quan sát. Theo sau là Snack Foods với 1600 sản phẩm (~11.38%), Fruit (765), và Meat (761). Ngược lại, các nhóm ít phổ biến nhất gồm Canned Oysters (35), Canned Sardines (40), và Candy (352), mỗi nhóm có chưa đến 50 quan sát, chiếm tỷ lệ rất nhỏ trong tổng thể dữ liệu.
  • Biểu đồ cột bên trái cho thấy sự phân bố không đồng đều, nổi bật nhất là hai nhóm Vegetables và Snack Foods với số lượng vượt trội so với các nhóm khác. Biểu đồ cột bên phải cung cấp thêm góc nhìn chi tiết hơn về các nhóm có tần suất thấp, cho thấy sự đa dạng nhưng phân tán nhỏ lẻ giữa nhiều danh mục.

Tổng quan, dữ liệu tập trung chủ yếu vào các mặt hàng rau củ, đồ ăn nhẹ và thực phẩm tươi sống, phản ánh xu hướng tiêu dùng chính. Những nhóm còn lại tuy nhiều về chủng loại nhưng chiếm tỷ trọng không lớn trong tập dữ liệu.

3 PHẦN 3: ƯỚC LƯỢNG KHOẢNG VÀ KIỂM ĐỊNH GIẢ THUYẾT CHO TỶ LỆ

3.1 Biến Gender

3.1.1 Mục tiêu

Thực hiện kiểm định để xác định xem tỷ lệ nữ trong tập dữ liệu có khác biệt so với 50% hay không.

Dữ liệu và biến quan tâm

  • Biến quan tâm: Gender
  • Hạng mục quan tâm: "F" (Female)

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

# Số lượng nữ trong dữ liệu
sumF <- sum(dataDT$Gender == "F")

# Tổng số cá thể trong dữ liệu
sumGender <- length(dataDT$Gender)

3.1.3 Thực hiện kiểm định tỷ lệ 1 mẫu

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

  • H0: Tỷ lệ nữ bằng 0.5
  • H1: Tỷ lệ nữ khác 0.5
# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumF, n = sumGender, p = 0.5, conf.level = 0.95, correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sumF out of sumGender, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5016931 0.5182886
## sample estimates:
##         p 
## 0.5099936

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

  • Giá trị thống kê Chi-squared: 5.5765
  • Bậc tự do (df): 1
  • p-value: 0.0182
  • Khoảng tin cậy 95% cho tỷ lệ nữ: (0.5017, 0.5183)
  • Ước lượng tỷ lệ nữ từ mẫu: 0.50999 (tức ~51%)

Kết luận:

Với mức ý nghĩa 5%, vì p-value = 0.0182 < 0.05, ta bác bỏ giả thuyết H0.Kết luận rằng tỷ lệ nữ trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê.


3.2 Biến MaritalStatus

3.2.1 Mục tiêu

Thực hiện kiểm định để xác định xem tỷ lệ khách hàng đã kết hôn (Married) trong tập dữ liệu có khác biệt so với 50% hay không.

Dữ liệu và biến quan tâm

  • Biến quan tâm: MaritalStatus
  • Hạng mục quan tâm: "M" (Married)

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

# Số lượng khách hàng đã kết hôn trong dữ liệu
sumM <- sum(dataDT$MaritalStatus == "M")

# Tổng số khách hàng trong dữ liệu
sumMarital <- length(dataDT$MaritalStatus)

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

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

  • H0: Tỷ lệ khách hàng đã kết hôn bằng 0.5
  • H1: Tỷ lệ khách hàng đã kết hôn khác 0.5
# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumM, n = sumMarital, p = 0.5, conf.level = 0.95, correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sumM out of sumMarital, null probability 0.5
## X-squared = 7.5593, df = 1, p-value = 0.00597
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4800765 0.4966708
## sample estimates:
##         p 
## 0.4883704

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

  • Giá trị thống kê Chi-squared: 7.5593
  • Bậc tự do (df): 1
  • p-value: 0.006
  • Khoảng tin cậy 95% cho tỷ lệ đã kết hôn: (0.4801, 0.4967)
  • Ước lượng tỷ lệ đã kết hôn từ mẫu: 0.48837 (tức ~48.84%)

Kết luận:

Với mức ý nghĩa 5% (α = 0.05), vì p-value = 0.00597 < 0.05, ta bác bỏ giả thuyết H0. Điều này cho thấy rằng tỷ lệ khách hàng đã kết hôn trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê. Cụ thể, tỷ lệ kết hôn trong mẫu là khoảng 48.84%, thấp hơn 50%.


3.3 Biến Homeowner

3.3.1 Mục tiêu

Thực hiện kiểm định để xác định xem tỷ lệ khách hàng có nhà (Homeowner = “Y”) có khác biệt so với 50% hay không.

Dữ liệu và biến quan tâm

  • Biến quan tâm: Homeowner
  • Hạng mục quan tâm: "Y" (Có nhà)

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

# Số lượng khách hàng có nhà
sumY <- sum(dataDT$Homeowner == "Y")

# Tổng số khách hàng
sumHomeowner <- length(dataDT$Homeowner)

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

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

  • H0: Tỷ lệ khách hàng có nhà bằng 0.5
  • H1: Tỷ lệ khách hàng có nhà khác 0.5
# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumY, n = sumHomeowner, p = 0.5, conf.level = 0.95, correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sumY out of sumHomeowner, null probability 0.5
## X-squared = 568.86, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5924537 0.6087145
## sample estimates:
##         p 
## 0.6006117

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

  • Giá trị thống kê Chi-squared là 568.86, với 1 bậc tự do.

  • Giá trị p-value < 2.2e-16, rất nhỏ hơn nhiều so với mức ý nghĩa thông thường 0.05.

  • Khoảng tin cậy 95% cho tỷ lệ khách hàng có nhà là (0.5925, 0.6087).

  • Ước lượng tỷ lệ khách hàng có nhà trong mẫu là 0.6006 (tức khoảng 60.06%).

Kết luận

Với mức ý nghĩa 5% (α = 0.05), vì p-value < 2.2e-16 < 0.05, ta bác bỏ giả thuyết H0.Điều này cho thấy rằng tỷ lệ khách hàng sở hữu nhà trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê.Cụ thể, tỷ lệ sở hữu nhà trong mẫu là khoảng 60.06%, cao hơn 50%.


4 PHẦN 4: PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH

4.1 Cặp biến: MaritalStatus và Homeowner

4.1.1 Thống kê mô tả cặp biến MaritalStatus và Homeowner

4.1.1.1 Bảng tần số chéo

marital_homeowner <- table(dataDT$MaritalStatus, dataDT$Homeowner)
marital_homeowner
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297

Nhận xét

  • Khách hàng đã kết hôn (M): Có tới 5147 người sở hữu nhà ở, chiếm phần lớn trong nhóm này, trong khi chỉ có 1719 người không sở hữu nhà.

  • Khách hàng độc thân (S): Ngược lại, nhóm này có xu hướng không sở hữu nhà ở cao hơn với 3896 người, trong khi số người sở hữu nhà chỉ là 3297 người.

  • So sánh giữa hai nhóm:

    • Nhóm đã kết hôn có tỷ lệ sở hữu nhà ở cao hơn đáng kể so với nhóm độc thân.

    • Nhóm độc thân có số lượng không sở hữu nhà ở vượt trội, cho thấy xu hướng chưa ổn định về tài chính hoặc cuộc sống gia đình.

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

prop.table(marital_homeowner)
##    
##             N         Y
##   M 0.1222704 0.3661000
##   S 0.2771179 0.2345117

Nhận xét

  • Nhóm khách hàng đã kết hôn sở hữu nhà chiếm tỷ trọng lớn nhất trong toàn bộ dữ liệu (36.61%), cho thấy đây là nhóm có xu hướng ổn định về tài chính và chỗ ở.

  • Khách hàng độc thân không sở hữu nhà cũng chiếm tỷ trọng khá lớn (27.71%), phản ánh phần nào sự chưa ổn định về tài sản hoặc giai đoạn đầu trong chu kỳ sống cá nhân.

Nhìn chung, dữ liệu cho thấy mối liên hệ đáng chú ý giữa tình trạng hôn nhân và quyền sở hữu nhà ở, trong đó việc đã kết hôn thường đi kèm với tỷ lệ sở hữu nhà cao hơn.

4.1.1.3 Vẽ đồ thị

library(ggplot2)
library(dplyr)
# Chuyển đổi dữ liệu sang dạng data frame
df_marital_homeowner <- as.data.frame(marital_homeowner)
colnames(df_marital_homeowner) <- c("MaritalStatus", "Homeowner", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(df_marital_homeowner, aes(x = Homeowner, y = Count, fill = MaritalStatus)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Số lượng khách hàng theo Homeowner và Marital Status", 
       x = "Tình trạng sở hữu nhà", y = "Số lượng") +
  theme_minimal()+
   theme(plot.title = element_text(hjust = 0.5))

Nhận xét

  • Khác biệt giữa hai nhóm hôn nhân: Khách hàng đã kết hôn (M) có số lượng sở hữu nhà (Y) vượt trội (hơn 5000 người), trong khi khách hàng độc thân (S) lại chủ yếu thuộc nhóm không sở hữu nhà (N), với khoảng 3900 người.

  • Xu hướng ổn định tài chính khi kết hôn: Nhóm đã kết hôn có tỷ lệ sở hữu nhà cao, phản ánh sự ổn định về tài chính hoặc nhu cầu ổn định nơi ở cho gia đình. Ngược lại, nhóm độc thân có tỷ lệ không sở hữu nhà cao hơn, có thể do ưu tiên linh hoạt, chưa ổn định cuộc sống.

  • Sự chênh lệch trong nhóm không sở hữu nhà: Trong nhóm không sở hữu nhà (N), số lượng khách hàng độc thân gần gấp đôi so với khách hàng đã kết hôn.

  • Mối liên hệ tiềm năng: Biểu đồ cho thấy tình trạng hôn nhân có thể liên quan đến việc sở hữu nhà – người đã kết hôn có xu hướng sở hữu nhà nhiều hơn.

Biểu đồ gợi ý rằng tình trạng hôn nhân có thể ảnh hưởng đến quyền sở hữu nhà. Tuy nhiên, để xác định mối liên hệ này có ý nghĩa thống kê hay không, cần thực hiện thêm kiểm định Chi-bình phương.

4.1.2 Kiểm định thống kê

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

  • H0: Hai biến MaritalStatus và Homeowner độc lập

  • H1: Hai biến MaritalStatus và Homeowner có mối liên hệ

Thực hiện kiểm định Chi- bình phương

chisq_result1 <- chisq.test(marital_homeowner)
chisq_result1
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  marital_homeowner
## X-squared = 1241.2, df = 1, p-value < 2.2e-16

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

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

  • Bậc tự do: df = 1

  • Giá trị p: p-value < 2.2e-16

4.1.4 Kết luận:

  • Vì giá trị p rất nhỏ (p < 0.05), ta bác bỏ giả thuyết không H0. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và tình trạng sở hữu nhà.

  • Kết quả kiểm định củng cố cho nhận định trước đó từ biểu đồ: khách hàng đã kết hôn có xu hướng sở hữu nhà nhiều hơn so với khách hàng độc thân. Mối quan hệ này có thể phản ánh các yếu tố kinh tế – xã hội như:

  • Những người đã kết hôn thường có nhu cầu ổn định nơi ở và khả năng tài chính cao hơn (do thu nhập hộ gia đình gộp lại).

  • Người độc thân có thể ưu tiên tính linh hoạt, hoặc đang trong giai đoạn chưa ổn định sự nghiệp hay thu nhập.

4.2 Cặp biến: Gender và ProductFamily

4.2.1 Thống kê mô tả cặp biến Gender và ProductFamily

4.2.1.1 Bảng tần số chéo

gender_family <- table(dataDT$Gender, dataDT$ProductFamily)
gender_family
##    
##     Drink Food Non-Consumable
##   F   669 5149           1352
##   M   581 5004           1304

Nhận xét

Cả nam và nữ đều có xu hướng tiêu dùng tương tự nhau, trong đó nhóm sản phẩm Food là được lựa chọn nhiều nhất.

  • Khách hàng nữ (F) mua 5149 sản phẩm thuộc nhóm Food, cao nhất trong ba nhóm, tiếp theo là Non-Consumable (1352) và thấp nhất là Drink (669).

  • Khách hàng nam (M) cũng có xu hướng tương tự với 5004 lượt mua Food, tiếp đến là Non-Consumable (1304) và Drink (581).

Nhìn chung, nhóm Food chiếm tỷ lệ lớn nhất ở cả hai giới, cho thấy đây là nhóm sản phẩm phổ biến nhất. Trong khi đó, nhóm Drink có số lượt mua thấp nhất, phản ánh mức độ quan tâm hoặc nhu cầu tiêu dùng thấp hơn đối với loại sản phẩm này. Sự khác biệt nhỏ giữa hai giới cho thấy hành vi lựa chọn sản phẩm theo giới tính có thể tồn tại một số khác biệt nhẹ, cần được kiểm chứng bằng phân tích thống kê tiếp theo.

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

prop.table(gender_family)
##    
##          Drink       Food Non-Consumable
##   F 0.04758518 0.36624226     0.09616616
##   M 0.04132584 0.35592859     0.09275197

Nhận xét

Kết quả trong bảng tần suất chéo cho thấy:

  • Trong tổng số khách hàng mua hàng, khoảng 4.76% là khách hàng nữ (F) mua sản phẩm nhóm Drink, và khoảng 4.13% là khách hàng nam (M) mua nhóm này.

  • Nhóm sản phẩm Food là nhóm được mua nhiều nhất, chiếm khoảng 36.62% tổng số giao dịch từ nữ và 35.59% từ nam.

  • Nhóm Non-Consumable chiếm khoảng 9.62% tổng số giao dịch từ nữ và 9.28% từ nam.

Như vậy, nhóm sản phẩm Food chiếm tỷ lệ lớn nhất trong tổng thể số lượt mua của cả hai giới, phản ánh sự phổ biến và nhu cầu cao đối với nhóm sản phẩm này. Mức độ mua hàng của nam và nữ ở các nhóm sản phẩm có sự tương đồng khá lớn, cho thấy hành vi tiêu dùng giữa hai giới trong các nhóm sản phẩm này tương đối đồng đều. Tuy nhiên, nhóm Drink có tỷ lệ thấp nhất trong tổng thể lượt mua, cho thấy nhóm sản phẩm này ít được lựa chọn hơn.

4.2.1.3 Vẽ đồ thị

# Chuyển đổi dữ liệu sang dạng data frame
df_gender_family <- as.data.frame(gender_family)
colnames(df_gender_family) <- c("Gender", "ProductFamily", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(df_gender_family, aes(x = ProductFamily, y = Count, fill = Gender)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Số lượt mua theo ProductFamily và Gender", 
       x = "Product Family", y = "Số lượt mua") +
  theme_minimal()

Nhận xét

  • Xu hướng tiêu dùng tương đồng: Biểu đồ cho thấy cả nam và nữ đều có xu hướng tiêu dùng tương tự nhau. Ở mỗi nhóm sản phẩm, chiều cao cột của hai giới gần bằng nhau, cho thấy mức độ mua sắm giữa hai giới không chênh lệch đáng kể.

  • Nhóm sản phẩm Food được ưa chuộng nhất: Đây là nhóm sản phẩm có số lượt mua cao vượt trội so với hai nhóm còn lại ở cả nam và nữ. Điều này phản ánh nhu cầu tiêu dùng thực phẩm là chủ yếu trong tổng thể các giao dịch.

  • Drink là nhóm ít được mua nhất: Số lượt mua nhóm Drink thấp nhất ở cả hai giới, điều này có thể cho thấy mức độ ưu tiên thấp hơn của khách hàng đối với đồ uống trong danh sách tiêu dùng.

Sự khác biệt giới tính nhỏ: Trong từng nhóm sản phẩm, nữ có số lượt mua nhỉnh hơn nam một chút, nhưng không đáng kể. Điều này gợi ý rằng giới tính không phải là yếu tố chi phối mạnh hành vi tiêu dùng theo nhóm sản phẩm, mặc dù có thể có những xu hướng nhỏ.

Biểu đồ trực quan hỗ trợ kết luận rằng hai biến định tính “Giới tính” và “Nhóm sản phẩm” có mối quan hệ tương đối ổn định và tương đồng, không có sự khác biệt lớn giữa nam và nữ trong hành vi chọn loại sản phẩm. Tuy nhiên, để khẳng định mối liên kết có ý nghĩa thống kê hay không, cần thực hiện thêm các kiểm định như kiểm định Chi-bình phương (Chi-square test).

4.2.2 Kiểm định thống kê

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

  • H0: Hai biến Gender và ProductFamily độc lập

  • H1: Hai biến Gender và ProductFamily có mối liên hệ

Thực hiện kiểm định Chi- bình phương

chisq_result2 <- chisq.test(gender_family)
chisq_result2
## 
##  Pearson's Chi-squared test
## 
## data:  gender_family
## X-squared = 3.5185, df = 2, p-value = 0.1722

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

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

  • Bậc tự do: df = 2

  • Giá trị p: p-value = 0.1722

4.2.3 Kết luận

  • Với mức ý nghĩa α = 0.05, ta không đủ bằng chứng để bác bỏ giả thuyết không vì giá trị p = 0.1722 > 0.05.

  • Điều này có nghĩa là chưa có đủ bằng chứng thống kê để khẳng định rằng giới tính có ảnh hưởng đến loại sản phẩm được chọn. Nói cách khác, hai biến GenderProductFamily có thể được xem là độc lập trong dữ liệu này.

  • Mặc dù kiểm định thống kê không phát hiện mối quan hệ có ý nghĩa giữa hai biến, nhưng qua bảng tần suất chéo và biểu đồ minh họa, ta vẫn có thể quan sát được một số xu hướng nhỏ như:

  • Cả namnữ đều chọn nhóm sản phẩm Food nhiều nhất, tiếp theo là Non-Consumable, và ít nhất là Drink.

  • Số lượt mua giữa nam và nữ ở từng nhóm sản phẩm có sự chênh lệch nhẹ, tuy nhiên, mức độ khác biệt này chưa đủ lớn để trở nên có ý nghĩa thống kê.

Do đó, mặc dù kết quả kiểm định cho thấy tính độc lập giữa hai biến, nhưng việc khám phá xu hướng hành vi tiêu dùng theo giới tính vẫn có thể hữu ích khi phân tích sâu hơn hoặc mở rộng mẫu dữ liệu trong các nghiên cứu tiếp theo.

4.3 Cặp biến: Homeowner và AnnualIncome

4.3.1 Thống kê mô tả cặp biến Homeowner và AnnualIncome

4.3.1.1 Bảng tần số chéo

home_income <- table(dataDT$Homeowner, dataDT$AnnualIncome)
home_income
##    
##     $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
##   N        1359           119           136      48        2087        1063
##   Y        1731           524           624     225        2514        1307
##    
##     $70K - $90K $90K - $110K
##   N         686          117
##   Y        1023          496

Nhận xét:

Kết quả thể hiện số lượng người sở hữu nhà (Homeowner = Y) và không sở hữu nhà (Homeowner = N) theo các nhóm thu nhập hằng năm. Từ đó, ta có thể rút ra một số nhận xét quan trọng:

  • Nhóm thu nhập $10K – $30K là nhóm có số lượng cá nhân khá lớn. Đáng chú ý, số người sở hữu nhà (1.731) vượt qua số người không sở hữu (1.359), điều này cho thấy rằng ở nhóm thu nhập thấp nhất, việc sở hữu nhà có thể đến từ các yếu tố phi thu nhập như hỗ trợ từ gia đình hoặc chi phí nhà ở thấp.

  • Nhóm $30K – $50K có sự chênh lệch đáng kể với 2.514 người sở hữu nhà so với 2.087 người không sở hữu, cho thấy khi thu nhập tăng lên mức trung bình thấp, khả năng sở hữu nhà tăng đáng kể, có thể nhờ tích lũy tài chính hoặc khả năng tiếp cận tín dụng.

  • Ở nhóm thu nhập $50K – $70K, xu hướng tiếp tục được duy trì với 1.307 người sở hữu1.063 người không sở hữu, cho thấy thu nhập từ mức trung bình trở lên đã bắt đầu giúp đa số cá nhân sở hữu nhà.

  • Nhóm thu nhập $70K – $90K cho thấy tỷ lệ sở hữu nhà tiếp tục tăng mạnh, với 1.023 người sở hữu so với 686 người không sở hữu, tương đương khoảng 60% cá nhân trong nhóm này đã sở hữu nhà.

  • Ở mức $90K – $110K, xu hướng sở hữu nhà trở nên rõ rệt, khi có tới 496 người sở hữu nhà và chỉ 117 người không sở hữu, tương đương tỷ lệ sở hữu nhà khoảng 80%.

  • Trong nhóm $110K – $130K, có tới 524 người sở hữu nhà so với 119 người không sở hữu, cho thấy thu nhập cao hơn tiếp tục gia tăng xác suất sở hữu bất động sản.

  • Nhóm $130K – $150K thể hiện tỷ lệ sở hữu nhà vượt trội với 624 người có nhàchỉ 136 người không có, phản ánh rằng tại mức thu nhập này, việc sở hữu nhà đã trở thành chuẩn mực phổ biến.

  • Cuối cùng, nhóm thu nhập trên $150K225 người sở hữu nhà và chỉ 48 người không sở hữu, tương đương tỷ lệ sở hữu trên 82%, cho thấy rằng ở mức thu nhập rất cao, việc sở hữu nhà gần như là mặc định.

Từ những phân tích trên, có thể thấy rằng mức thu nhập hằng năm có mối quan hệ thuận chiều với tỷ lệ sở hữu nhà. Khi thu nhập tăng, khả năng sở hữu bất động sản tăng lên rõ rệt. Tuy nhiên, việc một số nhóm thu nhập thấp vẫn có tỷ lệ sở hữu nhà cao cũng gợi ý rằng các yếu tố ngoài thu nhập như thừa kế, giá nhà ở thấp hoặc các chương trình hỗ trợ nhà ở có thể đóng vai trò quan trọng.

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

prop.table(home_income)
##    
##     $10K - $30K $110K - $130K $130K - $150K     $150K + $30K - $50K $50K - $70K
##   N 0.096664059   0.008464329   0.009673519 0.003414183 0.148445835 0.075609930
##   Y 0.123123978   0.037271499   0.044384380 0.016003983 0.178817839 0.092965360
##    
##     $70K - $90K $90K - $110K
##   N 0.048794367  0.008322071
##   Y 0.072764777  0.035279892

Nhận xét

Bảng tỷ lệ phần trăm tổng thể cho thấy xu hướng rất rõ ràng về mối quan hệ giữa thu nhập và quyền sở hữu nhà ở. Cụ thể:

  • Ở nhóm thu nhập $10K – $30K, tỷ lệ người sở hữu nhà chiếm 12.31%, cao hơn so với 9.66% người không sở hữu. Điều này cho thấy rằng ngay cả ở mức thu nhập thấp nhất, vẫn có một bộ phận lớn người dân có khả năng sở hữu nhà, có thể nhờ các yếu tố hỗ trợ như tài sản thừa kế hoặc chi phí nhà ở thấp.

  • Khi thu nhập tăng lên nhóm $30K – $50K, tỷ lệ người sở hữu nhà tăng lên 17.88%, vượt khá xa so với 14.84% người không sở hữu. Đây có thể là giai đoạn nhiều người bắt đầu có khả năng tích lũy hoặc tiếp cận các khoản vay mua nhà.

  • Nhóm thu nhập $50K – $70K tiếp tục phản ánh xu hướng này, với 9.30% người sở hữu nhà so với 7.50% người không sở hữu.

  • Ở các nhóm thu nhập trung bình cao như $70K – $90K và $90K – $110K, chênh lệch trở nên rõ rệt hơn. Tỷ lệ người sở hữu nhà lần lượt là 7.28%3.53%, so với tỷ lệ không sở hữu chỉ là 4.87%0.83%. Đây là minh chứng rõ ràng cho việc thu nhập cao giúp nâng cao khả năng sở hữu nhà.

  • Từ mức thu nhập $110K – $130K trở đi, khoảng cách giữa hai nhóm tăng mạnh. Người sở hữu nhà chiếm 3.73%, cao gấp hơn 4 lần so với 0.84% người không sở hữu.

  • Với nhóm $130K – $150K, tỷ lệ người sở hữu nhà lên tới 4.44%, trong khi không sở hữu nhà chỉ chiếm 0.97%. Điều này cho thấy rằng ở mức thu nhập này, việc sở hữu nhà gần như trở thành chuẩn mực phổ biến.

  • Cuối cùng, nhóm thu nhập trên $150K có tỷ lệ người sở hữu nhà là 1.60%, cao gấp gần 5 lần so với 0.34% người không sở hữu. Tức là, tại mức thu nhập rất cao, quyền sở hữu nhà gần như là mặc định*.

Nhìn chung, dữ liệu phản ánh một mối quan hệ thuận chiều rất rõ ràng giữa thu nhập hằng năm và tỷ lệ sở hữu nhà. Khi thu nhập tăng lên, khả năng sở hữu bất động sản cũng tăng theo một cách đáng kể. Tuy nhiên, cũng cần lưu ý rằng ở nhóm thu nhập thấp, tỷ lệ sở hữu nhà vẫn không hề nhỏ. Điều này cho thấy rằng thu nhập không phải là yếu tố duy nhất quyết định, và các yếu tố khác như thừa kế, giá bất động sản vùng, hay hỗ trợ chính sách nhà ở cũng có thể đóng vai trò quan trọng.

4.3.1.3 Vẽ đồ thị

# Chuyển bảng tần suất chéo sang data frame
df_home_income <- as.data.frame(home_income)
colnames(df_home_income) <- c("Homeowner", "AnnualIncome", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(df_home_income, aes(x = AnnualIncome, y = Count, fill = Homeowner)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Số lượng người sở hữu và không sở hữu nhà theo nhóm thu nhập",
       x = "Nhóm thu nhập hằng năm",
       y = "Số lượng cá nhân") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

  • Tỷ lệ sở hữu nhà tăng theo thu nhập: Biểu đồ cho thấy xu hướng rất rõ ràng: khi nhóm thu nhập tăng, số lượng người sở hữu nhà (Y) cũng tăng đáng kể, đặc biệt rõ ràng ở nhóm $30K – $50K$50K – $70K.

  • Nhóm thu nhập $30K – $50K chiếm ưu thế rõ rệt: Đây là nhóm có số lượng người sở hữu nhà cao nhất trong toàn bộ biểu đồ, vượt trội hơn hẳn so với nhóm không sở hữu trong cùng phân khúc. Điều này cho thấy đây có thể là mức thu nhập trung bình phổ biến, đủ để người dân bắt đầu tiếp cận thị trường bất động sản.

  • Người thu nhập thấp vẫn có khả năng sở hữu nhà: Ở nhóm thu nhập $10K – $30K, số lượng người sở hữu nhà vẫn cao hơn người không sở hữu. Điều này có thể phản ánh sự hỗ trợ từ các yếu tố khác như tài sản thừa kế, nhà giá rẻ vùng nông thôn hoặc hỗ trợ xã hội.

  • Tỷ lệ không sở hữu nhà giảm ở các nhóm thu nhập cao: Từ nhóm $70K – $90K trở đi, số người không sở hữu nhà (N) giảm mạnh, trong khi người sở hữu nhà vẫn duy trì số lượng ổn định. Điều này phản ánh rằng thu nhập cao gắn liền với khả năng sở hữu nhà gần như mặc định.

  • Chênh lệch rõ rệt giữa hai nhóm sở hữu: Ở các nhóm thu nhập cao hơn ($90K – $110K, $110K – $130K và trên $150K), số người sở hữu nhà tuy có xu hướng giảm nhẹ về số tuyệt đối, nhưng vẫn vượt xa số người không sở hữu, cho thấy mức độ phổ biến của việc sở hữu nhà ở nhóm thu nhập cao.

Biểu đồ cho thấy mối quan hệ thuận chiều mạnh mẽ giữa thu nhập hằng năm và khả năng sở hữu nhà. Càng có thu nhập cao, người dân càng có xu hướng sở hữu nhà nhiều hơn. Tuy nhiên, sự hiện diện đáng kể của chủ sở hữu nhà trong nhóm thu nhập thấp cũng cho thấy thu nhập không phải yếu tố duy nhất, và cần xét thêm đến các yếu tố khác như chính sách nhà ở, môi trường sống, hoặc hỗ trợ tài chính từ gia đình. Để khẳng định rõ ràng hơn về mối liên hệ này, có thể cần thực hiện thêm kiểm định thống kê (như Chi-squared test).

4.3.2 Kiểm định thống kê

Giả thuyết kiểm định

  • H0: Hai biến Homeowner và AnnualIncome độc lập
  • H1: Hai biến Homeowner và AnnualIncome có mối liên hệ

Thực hiện kiểm định Chi-bình phương

chisq_result3<- chisq.test(home_income)
chisq_result3
## 
##  Pearson's Chi-squared test
## 
## data:  home_income
## X-squared = 546.37, df = 7, p-value < 2.2e-16

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

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

  • Bậc tự do: df = 7

  • Giá trị p: p-value < 2.2e-16

4.3.4 Kết luận:

Với giá trị p rất nhỏ (p < 0.05), ta bác bỏ giả thuyết không H0. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa thu nhập hằng năm và việc sở hữu nhà.

Kết quả kiểm định này củng cố các nhận xét mô tả và trực quan hóa trước đó:

  • Thu nhập hằng năm là yếu tố quan trọng ảnh hưởng đến khả năng sở hữu nhà.

  • Mức thu nhập càng cao thì tỷ lệ sở hữu nhà càng lớn, phản ánh xu hướng tích lũy tài sản hoặc khả năng tiếp cận các nguồn tài chính mua nhà thuận lợi hơn.

  • Tỷ lệ sở hữu nhà trong các nhóm thu nhập thấp vẫn không nhỏ, cho thấy ngoài thu nhập còn có các yếu tố hỗ trợ như thừa kế, chính sách nhà ở, hoặc điều kiện thị trường bất động sản vùng miền.

  • Để hiểu rõ hơn về mối quan hệ này, có thể tiếp tục nghiên cứu bằng các mô hình hồi quy đa biến hoặc phân tích sâu hơn.

5 PHẦN 5: TỔNG KẾT VÀ THẢO LUẬN

5.1 Tóm tắt những phát hiện chính

Qua các phân tích định tính, ta rút ra được những hiểu biết quan trọng như sau:

  • Mối quan hệ giữa tình trạng hôn nhân và việc sở hữu nhà (MaritalStatus – Homeowner):
    Kết quả kiểm định Chi-bình phương cho thấy có sự khác biệt đáng kể giữa các nhóm tình trạng hôn nhân về tỷ lệ sở hữu nhà. Điều này cho thấy nhóm khách hàng đã kết hôn có xu hướng sở hữu nhà cao hơn so với những người độc thân hoặc chưa kết hôn, phản ánh đặc điểm tài chính và ổn định hơn của nhóm này.

  • Mối quan hệ giữa việc sở hữu nhà và thu nhập hàng năm (Homeowner – AnnualIncome):
    Khách hàng sở hữu nhà thường có mức thu nhập cao hơn so với khách hàng thuê nhà hoặc chưa sở hữu. Mối quan hệ này phản ánh mức độ khả năng tài chính và sự ổn định của khách hàng, có thể ảnh hưởng đến khả năng chi tiêu và lựa chọn sản phẩm cao cấp hơn.

Những phát hiện này cung cấp một cái nhìn toàn diện về các nhóm khách hàng chính dựa trên các đặc điểm định tính, giúp doanh nghiệp nắm bắt được phân khúc khách hàng, nhu cầu và xu hướng tiêu dùng để từ đó tối ưu hóa chiến lược kinh doanh.

5.2 Hạn chế của phân tích

  • Giới hạn phân tích biến định tính: Việc chỉ tập trung phân tích các biến định tính mà không kết hợp các biến định lượng (như tuổi, số lần mua hàng, chi tiêu trung bình…) có thể làm giảm độ sâu và tính toàn diện của phân tích hành vi khách hàng.

  • Kích thước mẫu không đồng đều: Một số hạng mục con trong các biến định tính có thể có số lượng mẫu rất nhỏ, ảnh hưởng đến độ tin cậy của kết quả kiểm định và khả năng tổng quát hóa.

  • Không xem xét yếu tố thời gian: Phân tích tĩnh, không theo dõi biến đổi hành vi theo thời gian có thể bỏ lỡ các xu hướng thay đổi trong hành vi khách hàng.

5.3 Đề xuất

  • Chiến lược marketing theo phân khúc: Dựa trên sự khác biệt về sở thích sản phẩm theo giới tính và tình trạng hôn nhân, doanh nghiệp nên phát triển các chiến dịch marketing được cá nhân hóa, nhắm đúng nhóm khách hàng mục tiêu.

  • Phân loại sản phẩm phù hợp: Cần tập trung phát triển các dòng sản phẩm phù hợp với từng nhóm khách hàng đặc trưng, ví dụ sản phẩm cao cấp cho nhóm khách hàng thu nhập cao và sở hữu nhà, sản phẩm giá cả phải chăng hơn cho nhóm khách hàng thu nhập thấp.

  • Nhắm mục tiêu khách hàng ổn định tài chính: Khách hàng sở hữu nhà và có thu nhập cao là nhóm khách hàng tiềm năng để phát triển các chương trình chăm sóc và khuyến mãi đặc biệt nhằm tăng tỷ lệ giữ chân và giá trị vòng đời khách hàng.

5.4 Câu hỏi mở / Hướng nghiên cứu tiếp theo

  • Phân tích kết hợp biến định tính và định lượng: Liệu việc tích hợp các biến định lượng như tuổi, số lần mua hàng, chi tiêu trung bình sẽ giúp hiểu rõ hơn về hành vi và giá trị khách hàng?

  • Phân tích hành vi theo thời gian: Có những xu hướng thay đổi nào trong sở thích sản phẩm hoặc đặc điểm khách hàng theo thời gian (ví dụ theo mùa hoặc theo năm)?

  • Tác động của các yếu tố xã hội khác: Liệu các yếu tố như vùng địa lý, trình độ học vấn, nghề nghiệp có ảnh hưởng như thế nào đến hành vi mua sắm của khách hàng?

  • Ứng dụng mô hình dự đoán: Có thể xây dựng các mô hình dự đoán hành vi khách hàng dựa trên các đặc điểm định tính và định lượng đã phân tích để tối ưu hóa chiến lược marketing và bán hàng?

5.5 🧪 Kiểm định tỷ lệ khách Mexico so với Canada

5.5.1 ✅ Đặt giả thuyết

Gọi:

  • \(p_{\text{Mexico}}\): tỷ lệ khách đến từ Mexico
  • \(p_{\text{Canada}}\): tỷ lệ khách đến từ Canada

Ta kiểm định giả thuyết:

  • Giả thuyết không (H₀): \[ H_0: p_{\text{Mexico}} = p_{\text{Canada}} \] (Tỷ lệ khách từ Mexico bằng với Canada)

  • Giả thuyết đối (H₁): \[ H_1: p_{\text{Mexico}} > p_{\text{Canada}} \] (Tỷ lệ khách từ Mexico với Canada)


5.5.2 📌 Mã R thực hiện kiểm định

# Số khách từ mỗi nước
x <- c(3688, 809)           # Mexico, Canada
n <- c(3688 + 809 + 9562, 3688 + 809 + 9562)  # Tổng khách từ tất cả các nước

# Kiểm định giả thuyết 
result <- prop.test(x = x, n = n, correct = TRUE)
print(result)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  x out of n
## X-squared = 2192.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.1964812 0.2130785
## sample estimates:
##     prop 1     prop 2 
## 0.26232307 0.05754321

6 A: ĐỌC VÀ CHUẨN BỊ TRƯỚC BUỔI HỌC

6.1 Giới thiệu chung

Tuần này, chúng ta đi sâu vào suy diễn thống kê trên bảng ngẫu nhiên (Contingency Table), đặc biệt tập trung vào:

  • Kiểm định Chi-square về tính độc lập giữa hai biến phân loại.
  • Các chỉ số đo lường mối liên hệ trong bảng 2x2: Relative Risk (RR)Odds Ratio (OR).
  • Cách tính khoảng tin cậy cho Odds Ratio.
  • Ứng dụng các kiến thức trên vào một ví dụ thực tế từ bộ dữ liệu Supermarket Transactions.

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

library("csv")
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : chr  "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
##  $ City             : chr  "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
##  $ StateorProvince  : chr  "CA" "CA" "WA" "OR" ...
##  $ Country          : chr  "USA" "USA" "USA" "USA" ...
##  $ ProductFamily    : chr  "Food" "Food" "Food" "Food" ...
##  $ ProductDepartment: chr  "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
##  $ ProductCategory  : chr  "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...

Đầu tiên, ta sẽ sử dụng 2 biến định tính: Gender (Giới tính) và Homeowner (Có sở hữu nhà hay không) để tiến hành đưa ra ví dụ cũng như phân tích.

6.2 Bảng ngẫu nhiên

Bảng ngẫu nhiên (contingency table) là công cụ thống kê dùng để trình bày tần số của các biến phân loại. Trong trường hợp đơn giản nhất – bảng 2x2 – bảng có dạng:

Biến B = Yes Biến B = No
Biến A = Yes a b
Biến A = No c d

Trong phân tích thống kê, bảng 2x2 thường dùng để:

  • So sánh xác suất giữa hai nhóm (như Nam vs Nữ).
  • Tính toán các chỉ số đo lường mối liên hệ: Risk, Odds, Relative Risk (RR), Odds Ratio (OR).
  • Kiểm định giả thuyết về sự độc lập giữa hai biến (Chi-square test, Fisher’s Exact Test,…).

Bảng có thể sinh ra từ các phân phối như:

  • Multinomial: nếu tổng số quan sát cố định.
  • Poisson: nếu từng ô trong bảng là biến Poisson độc lập (áp dụng khi dữ liệu hiếm).

Các bước thực hiện trong R

table_gender_homeowner <- table(data$Gender, data$Homeowner)
table_gender_homeowner
##    
##        N    Y
##   F 2826 4344
##   M 2789 4100

6.3 Kiểm định Chi-square về tính độc lập

Lý thuyết: Kiểm định Chi-square

Dùng để kiểm tra xem hai biến phân loại có độc lập thống kê không.

  • Giả thuyết H₀: Hai biến độc lập.
  • Giả thuyết H₁: Hai biến có mối liên hệ.

Chỉ số kiểm định: \[ X^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]

Trong đó:

  • \(O_{ij}\) là tần số quan sát
  • \(E_{ij}\) là tần số kỳ vọng.

Nếu p-value < 0.05, ta có đủ cơ sở để bác bỏ H₀ → Có bằng chứng về sự phụ thuộc giữa hai biến.

Các bước thực hiện trong R

chisq.test(table_gender_homeowner, correct = FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  table_gender_homeowner
## X-squared = 1.6788, df = 1, p-value = 0.1951

6.4 Tính Odds Ratio, Relative Risk

6.4.1 Tỷ số nguy cơ (Relative Risk - RR)

Khái niệm: Relative Risk (RR) là tỷ lệ giữa xác suất xảy ra sự kiện ở nhóm tiếp xúc so với nhóm không tiếp xúc.

Công thức:

\[ RR = \frac{\frac{a}{a+b}}{\frac{c}{c+d}} \]

Diễn giải:

  • RR = 1: Không có sự khác biệt về nguy cơ giữa hai nhóm.
  • RR > 1: Nguy cơ ở nhóm tiếp xúc cao hơn nhóm không tiếp xúc.
  • RR < 1: Nguy cơ ở nhóm tiếp xúc thấp hơn nhóm không tiếp xúc.

6.4.2 Tỷ số chênh (Odds Ratio - OR)

Khái niệm: Odds Ratio (OR) là tỷ lệ giữa odds xảy ra sự kiện ở nhóm tiếp xúc so với nhóm không tiếp xúc.

Công thức:

\[ OR = \frac{\frac{a}{b}}{\frac{c}{d}} = \frac{a \times d}{b \times c} \]

Diễn giải:

  • OR = 1: Không có sự khác biệt về odds giữa hai nhóm.
  • OR > 1: Odds xảy ra sự kiện ở nhóm tiếp xúc cao hơn nhóm không tiếp xúc.
  • OR < 1: Odds xảy ra sự kiện ở nhóm tiếp xúc thấp hơn nhóm không tiếp xúc.

Các bước thực hiện trên R

# Lấy số liệu
a <- table_gender_homeowner["F", "Y"]
b <- table_gender_homeowner["F", "N"]
c <- table_gender_homeowner["M", "Y"]
d <- table_gender_homeowner["M", "N"]

# Tính Odds
odds_female <- a / b
odds_male <- c / d

# Odds Ratio (OR)
or <- odds_female / odds_male

# Relative Risk (RR)
risk_female <- a / (a + b)
risk_male <- c / (c + d)
rr <- risk_female / risk_male

list(
  odds_female = odds_female,
  odds_male = odds_male,
  OR = or,
  RR = rr
)
## $odds_female
## [1] 1.537155
## 
## $odds_male
## [1] 1.470061
## 
## $OR
## [1] 1.04564
## 
## $RR
## [1] 1.017989

Khoảng tin cậy 95% cho Odds Ratio

Do OR không phân phối chuẩn, nên lấy log(OR) để xây dựng khoảng tin cậy:

\[ CI_{log(OR)} = \log(OR) \pm Z \cdot SE_{log(OR)} \]

Với: \[ SE = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}} \]

Chuyển về thang OR bằng hàm mũ: \(e^{CI}\).

Các bước thực hiện trên R

se_log_or <- sqrt(1/a + 1/b + 1/c + 1/d)
z <- 1.96  # hệ số cho 95%
ci_lower <- exp(log(or) - z * se_log_or)
ci_upper <- exp(log(or) + z * se_log_or)
c(ci_lower, ci_upper)
## [1] 0.9773755 1.1186731

Nhận xét:

  • Nếu OR < 1, odds của việc sở hữu nhà ở nhóm Female nhỏ hơn Male.
  • Nếu RR < 1, phụ nữ có nguy cơ sở hữu nhà thấp hơn nam giới.

Kết luận cần đi kèm với kiểm định Chi-square và khoảng tin cậy, không nên chỉ nhìn vào OR/RR.

Đây là một ví dụ điển hình cho việc sử dụng Odds Ratio trong kinh tế/xã hội học để mô tả mối liên hệ giữa hai đặc điểm phân loại.

6.5 Thực hành trên bộ dữ liệu

Tạo bảng tần số

# Bảng tần số chéo giữa MaritalStatus và Homeowner
tbl <- table(data$MaritalStatus, data$Homeowner)
tbl
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297

Nhận xét

  • Khách hàng đã kết hôn (M): Có tới 5147 người sở hữu nhà ở, chiếm phần lớn trong nhóm này, trong khi chỉ có 1719 người không sở hữu nhà.

  • Khách hàng độc thân (S): Ngược lại, nhóm này có xu hướng không sở hữu nhà ở cao hơn với 3896 người, trong khi số người sở hữu nhà chỉ là 3297 người.

Kiểm định Chi-square

chi_test <- chisq.test(tbl)
chi_test
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl
## X-squared = 1241.2, df = 1, p-value < 2.2e-16

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

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

  • Bậc tự do: df = 1

  • Giá trị p: p-value < 2.2e-16

Kết luận:

  • Vì giá trị p rất nhỏ (p < 0.05), ta bác bỏ giả thuyết không H0. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và tình trạng sở hữu nhà.

Tính Odds Ratio và Relative Risk

# Lọc dữ liệu: chỉ lấy Married và Single
data2 <- subset(data, MaritalStatus %in% c("M", "S"))

# Tạo bảng 2x2
tbl2 <- table(data2$MaritalStatus, data2$Homeowner)
tbl2
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297
# Tính toán Odds Ratio và Relative Risk
library(epiR)
## Warning: package 'epiR' was built under R version 4.4.3
## Loading required package: survival
## Package epiR 2.0.84 is loaded
## Type help(epi.about) for summary information
## Type browseVignettes(package = 'epiR') to learn how to use epiR for applied epidemiological analyses
## 
epi_result <- epi.2by2(tbl2, method = "cohort.count", conf.level = 0.95)
epi_result
##              Outcome+    Outcome-      Total                 Inc risk *
## Exposure+        1719        5147       6866     25.04 (24.02 to 26.08)
## Exposure-        3896        3297       7193     54.16 (53.00 to 55.32)
## Total            5615        8444      14059     39.94 (39.13 to 40.75)
## 
## Point estimates and 95% CIs:
## -------------------------------------------------------------------
## Inc risk ratio                                 0.46 (0.44, 0.48)
## Inc odds ratio                                 0.28 (0.26, 0.30)
## Attrib risk in the exposed *                   -29.13 (-30.67, -27.59)
## Attrib fraction in the exposed (%)            -116.34 (-126.59, -106.62)
## Attrib risk in the population *                -14.22 (-15.63, -12.82)
## Attrib fraction in the population (%)         -35.62 (-35.74, -35.46)
## -------------------------------------------------------------------
## Uncorrected chi2 test that OR = 1: chi2(1) = 1242.432 Pr>chi2 = <0.001
## Fisher exact test that OR = 1: Pr>chi2 = <0.001
##  Wald confidence limits
##  CI: confidence interval
##  * Outcomes per 100 population units

6.6 Kết quả phân tích

Bảng chéo tần suất giữa MaritalStatus và Homeowner

Marital Status Không sở hữu nhà (N) Có sở hữu nhà (Y) Tổng cộng
Married (M) 1,719 5,147 6,866
Single (S) 3,896 3,297 7,193
Tổng cộng 5,615 8,444 14,059

Tỷ lệ hiện mắc (Incidence Risk)

  • Nhóm Married: 25.04% (CI: 24.02 – 26.08)
  • Nhóm Single: 54.16% (CI: 53.00 – 55.32)

Những người độc thân có xác suất không sở hữu nhà cao hơn gấp đôi so với người đã kết hôn.


Relative Risk (RR)

  • RR = 0.46 (95% CI: 0.44 – 0.48)

Nguy cơ không sở hữu nhà ở nhóm đã kết hôn chỉ bằng 46% so với nhóm độc thân.


Odds Ratio (OR)

  • OR = 0.28 (95% CI: 0.26 – 0.30)

Xác suất không sở hữu nhà ở nhóm đã kết hôn thấp hơn 72% so với nhóm độc thân.


Risk Difference và Attribution

  • Chênh lệch nguy cơ tuyệt đối (risk difference): -29.13 điểm phần trăm
  • Tỷ lệ quy trách trong nhóm phơi nhiễm (exposed): -116.34%
  • Tỷ lệ quy trách toàn dân (population): -35.62%

Điều này cho thấy rằng việc kết hôn có thể giúp giảm đáng kể rủi ro không sở hữu nhà ở cấp độ cá nhân lẫn dân số.


Kiểm định ý nghĩa thống kê

  • Chi-squared test: χ²(1) = 1242.43, p < 0.001
  • Fisher’s exact test: p < 0.001

Kết quả kiểm định cho thấy mối liên hệ giữa tình trạng hôn nhân và việc sở hữu nhà là rất có ý nghĩa thống kê (p < 0.001).


Kết luận:

  • Có mối liên hệ rất rõ ràng và có ý nghĩa giữa tình trạng hôn nhân và việc sở hữu nhà.
  • Những người đã kết hôn có tỷ lệ và xác suất không sở hữu nhà thấp hơn đáng kể so với người độc thân.
  • Đây là một phát hiện quan trọng có thể được sử dụng trong các nghiên cứu xã hội học hoặc chính sách nhà ở.

7 B: HOẠT ĐỘNG TRÊN LỚP

Trong hoạt động này, chúng ta sẽ sử dụng dữ liệu Supermarket Transactions để phân tích mối liên hệ giữa các biến nhị phân. Mục tiêu là:

  • Tạo bảng 2x2
  • Tính và diễn giải Hiệu hai tỷ lệ (Difference in Proportions)
  • Tính Relative Risk (RR) và Odds Ratio (OR)
  • Tính khoảng tin cậy 95% cho OR
  • Thực hiện phân tích phân tầng (stratified analysis)

7.1 Đọc và làm quen với dữ liệu

Bộ dữ liệu “Supermarket Transactions” phản ánh các giao dịch mua hàng của khách hàng tại một siêu thị trong một khoảng thời gian cụ thể. Mỗi dòng dữ liệu tương ứng với một giao dịch, bao gồm thông tin nhân khẩu học (giới tính, loại thành viên, chi nhánh), đặc điểm sản phẩm (loại sản phẩm, kênh thanh toán), và các yếu tố hành vi tiêu dùng (thời gian mua sắm, mức độ hài lòng, giá trị đơn hàng,…). Tập dữ liệu gồm 14.059 quan sát và 16 biến, cung cấp nền tảng chi tiết để phân tích hành vi khách hàng và hiệu quả kinh doanh của siêu thị.

# Đọc file
library("csv")
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)

# Hiển thị cấu trúc dữ liệu
str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : chr  "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
##  $ City             : chr  "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
##  $ StateorProvince  : chr  "CA" "CA" "WA" "OR" ...
##  $ Country          : chr  "USA" "USA" "USA" "USA" ...
##  $ ProductFamily    : chr  "Food" "Food" "Food" "Food" ...
##  $ ProductDepartment: chr  "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
##  $ ProductCategory  : chr  "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...
# Hiển thị vài dòng đầu và cuối
head(data)
##   X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1   2007-12-18       7223      F             S         Y        2
## 2 2   2007-12-20       7841      M             M         Y        5
## 3 3   2007-12-21       8374      F             M         N        2
## 4 4   2007-12-21       9619      M             M         Y        3
## 5 5   2007-12-22       1900      F             S         Y        3
## 6 6   2007-12-22       6696      F             M         Y        3
##    AnnualIncome          City StateorProvince Country ProductFamily
## 1   $30K - $50K   Los Angeles              CA     USA          Food
## 2   $70K - $90K   Los Angeles              CA     USA          Food
## 3   $50K - $70K     Bremerton              WA     USA          Food
## 4   $30K - $50K      Portland              OR     USA          Food
## 5 $130K - $150K Beverly Hills              CA     USA         Drink
## 6   $10K - $30K Beverly Hills              CA     USA          Food
##   ProductDepartment      ProductCategory UnitsSold Revenue
## 1       Snack Foods          Snack Foods         5   27.38
## 2           Produce           Vegetables         5   14.90
## 3       Snack Foods          Snack Foods         3    5.52
## 4            Snacks                Candy         4    4.44
## 5         Beverages Carbonated Beverages         4   14.00
## 6              Deli          Side Dishes         3    4.37
tail(data)
##           X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14054 14054   2009-12-29       2032      F             M         N        3
## 14055 14055   2009-12-29       9102      F             M         Y        2
## 14056 14056   2009-12-29       4822      F             M         Y        3
## 14057 14057   2009-12-31        250      M             S         Y        1
## 14058 14058   2009-12-31       6153      F             S         N        4
## 14059 14059   2009-12-31       3656      M             S         N        3
##       AnnualIncome        City StateorProvince Country  ProductFamily
## 14054  $10K - $30K      Yakima              WA     USA Non-Consumable
## 14055  $10K - $30K   Bremerton              WA     USA           Food
## 14056  $10K - $30K Walla Walla              WA     USA           Food
## 14057  $30K - $50K    Portland              OR     USA          Drink
## 14058  $50K - $70K     Spokane              WA     USA          Drink
## 14059  $50K - $70K    Portland              OR     USA Non-Consumable
##       ProductDepartment      ProductCategory UnitsSold Revenue
## 14054         Household       Paper Products         5   14.50
## 14055      Baking Goods         Baking Goods         3    9.64
## 14056      Frozen Foods           Vegetables         3    7.45
## 14057         Beverages Pure Juice Beverages         4    3.24
## 14058             Dairy                Dairy         2    4.00
## 14059         Household           Electrical         5   25.53
# Chuyển các biến định tính phù hợp sang factor
factor <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
                    "City", "StateorProvince", "Country",
                    "ProductFamily", "ProductDepartment", "ProductCategory")

# Kiểm tra biến nào tồn tại trong data
factor <- intersect(factor, names(data))

# Chuyển sang factor
data[factor] <- lapply(data[factor], as.factor)

# Kiểm tra lại cấu trúc
str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
##  $ MaritalStatus    : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
##  $ Homeowner        : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
##  $ City             : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
##  $ StateorProvince  : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
##  $ Country          : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ ProductFamily    : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
##  $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
##  $ ProductCategory  : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...

Giải thích các biến

Bộ dữ liệu ghi lại thông tin về các giao dịch mua hàng của khách hàng, bao gồm thông tin nhân khẩu học, thông tin sản phẩm, số lượng bán ra và doanh thu. Dữ liệu bao gồm 14059 quan sát và 16 biến. Dưới đây là mô tả chi tiết các biến có trong bộ dữ liệu:

Tên Biến Ý Nghĩa
PurchaseDate Ngày giao dịch mua hàng diễn ra (định dạng ngày/tháng/năm).
CustomerID Mã định danh duy nhất cho mỗi khách hàng.
Gender Giới tính của khách hàng: M (Nam), F (Nữ).
MaritalStatus Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn).
Homeowner Tình trạng sở hữu nhà: Y (Có), N (Không).
Children Số lượng con cái của khách hàng.
AnnualIncome Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K).
City Thành phố nơi khách hàng thực hiện giao dịch.
StateorProvince Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon).
Country Quốc gia.
ProductFamily Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng).
ProductDepartment Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v.
ProductCategory Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine.
UnitsSold Số lượng đơn vị sản phẩm đã bán trong giao dịch đó.
Revenue Doanh thu từ giao dịch (tính theo USD).

7.2 Phân tích mối liên hệ giữa Gender và Homeowner

7.2.1 Tạo bảng tần số chéo

table_gender_home <- table(data$Gender, data$Homeowner)
table_gender_home
##    
##        N    Y
##   F 2826 4344
##   M 2789 4100

Dựa vào bảng trên:

  • Nữ (F) có tổng cộng 7170 người, trong đó 4344 người sở hữu nhà, chiếm khoảng 60.6%.

  • Nam (M) có tổng cộng 6889 người, với 4100 người sở hữu nhà, tương ứng khoảng 59.5%.

Nhận xét:

Tỷ lệ sở hữu nhà của nữ có vẻ nhỉnh hơn một chút so với nam (khoảng 60.6% so với 59.5%), tuy nhiên sự khác biệt này là khá nhỏ.
Để đánh giá rõ ràng hơn về mức độ liên hệ giữa hai biến, ta sẽ tiếp tục tính các chỉ số định lượng như:
Hiệu hai tỷ lệ (Difference in Proportions), Relative Risk (RR), Odds Ratio (OR).


7.2.2 Tính Hiệu Hai Tỷ Lệ

prop_table <- prop.table(table_gender_home, margin = 1)
prop_table
##    
##             N         Y
##   F 0.3941423 0.6058577
##   M 0.4048483 0.5951517
diff_prop <- prop_table[1, "Y"] - prop_table[2, "N"]
diff_prop
## [1] 0.2010094

Tỷ lệ sở hữu nhà:

  • nữ là 0.6059 (tức là 60.6%)

  • nam là 0.5952 (tức là 59.5%)

Hiệu hai tỷ lệ giữa nữ và nam là 0.201, tương đương 20.1 điểm phần trăm.

Kết luận:

Tỷ lệ nữ sở hữu nhà cao hơn nam khoảng 1.00%, tuy nhiên mức chênh lệch này khá nhỏ và chưa thể kết luận có ý nghĩa thống kê nếu chưa tính khoảng tin cậy (confidence interval) hoặc thực hiện các kiểm định thống kê chính thức như kiểm định z hoặc chi bình phương.


7.2.3 Tính Relative Risk (RR)

library(epitools)
## 
## Attaching package: 'epitools'
## The following object is masked from 'package:survival':
## 
##     ratetable
rr_result <- riskratio(table_gender_home)
rr_result$measure
##    risk ratio with 95% C.I.
##      estimate     lower    upper
##   F 1.0000000        NA       NA
##   M 0.9823291 0.9561812 1.009192

Dựa vào kết quả ta thấy Relative Risk (RR) của nam so với nữ là 0.9823. Khoảng tin cậy 95% của RR nằm trong khoảng từ 0.9562 đến 1.0092.

Kết luận:
RR < 1 cho thấy nam có tỷ lệ sở hữu nhà thấp hơn nữ một chút (chỉ còn khoảng 98.23% so với nữ). Tuy nhiên, vì khoảng tin cậy 95% bao gồm giá trị 1.0, nên không có bằng chứng đủ mạnh để kết luận sự khác biệt này có ý nghĩa thống kê. Nói cách khác, tỷ lệ sở hữu nhà giữa nam và nữ có thể coi là tương đương.


7.2.4 Tính Odds Ratio (OR) và Khoảng Tin Cậy

library(epitools)
or_result <- oddsratio(table_gender_home)
or_result
## $data
##        
##            N    Y Total
##   F     2826 4344  7170
##   M     2789 4100  6889
##   Total 5615 8444 14059
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate     lower    upper
##   F 1.000000        NA       NA
##   M 0.956381 0.8938974 1.023169
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M   0.195158    0.1964833  0.1950884
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
or_result$conf.int
## NULL

Phân tích bảng thì giữa hai nhóm giới tính (F và M) cho thấy:

  • Tỷ số odds (odds ratio) giữa nhóm nam (M) so với nữ (F) là 0.96, với khoảng tin cậy 95% là [0.89; 1.02].
  • Giá trị p từ các phép kiểm định hai phía:
    • Mid-p exact: p = 0.195
    • Fisher’s exact: p = 0.196
    • Chi-square: p = 0.195

Do tất cả các giá trị p đều lớn hơn mức ý nghĩa thông thường (α = 0.05), không có sự khác biệt có ý nghĩa thống kê giữa nhóm nam và nữ về biến được phân tích.

Như vậy, kết quả cho thấy không có mối liên quan rõ rệt giữa giới tính và biến, theo phân tích odds ratio và các kiểm định xác suất tương ứng.

LS0tDQp0aXRsZTogIioqTmhp4buHbSBW4bulIDIqKiINCmF1dGhvcjogIk5ndXnhu4VuIEzDqiBUaGnDqm4gS2ltIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICAgIHNtb290aF9zY3JvbGw6IHllcw0KLS0tDQoNCjxzdHlsZT4NCi8qIEluIMSR4bqtbSB0b8OgbiBi4buZIHRpw6p1IMSR4buBIChiYW8gZ+G7k20gY+G6oyBz4buRIGNoxrDGoW5nKSAqLw0KaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KPC9zdHlsZT4NCg0KPHN0eWxlPg0KLyog4bqobiBz4buRIG3hu6VjIOG7nyBj4bqlcCAxICovDQpoMSAuaGVhZGVyLXNlY3Rpb24tbnVtYmVyIHsNCiAgZGlzcGxheTogbm9uZTsNCn0NCjwvc3R5bGU+DQoNCjxzdHlsZT4NCi8qIOG6qG4gc+G7kSBt4bulYyBs4bulYyAoY2jhu4kgY+G6pXAgMSkgdHJvbmcgYuG6o25nIFRPQyAqLw0KbmF2I1RPQyB1bCBsaSA+IGEgPiBzcGFuLnRvYy1zZWN0aW9uLW51bWJlciB7DQogIGRpc3BsYXk6IG5vbmU7DQp9DQoNCi8qIE5oxrBuZyBnaeG7ryBs4bqhaSBz4buRIGNobyBj4bqlcCBkxrDhu5tpICovDQpuYXYjVE9DIHVsIGxpIHVsIGxpID4gYSA+IHNwYW4udG9jLXNlY3Rpb24tbnVtYmVyIHsNCiAgZGlzcGxheTogaW5saW5lOw0KfQ0KPC9zdHlsZT4NCg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KIyAqKlBI4bqmTiAxOiBUw4xNIEhJ4buDVSBWw4AgQ0hV4bqoTiBC4buKIEThu64gTEnhu4ZVKiogDQoNCiMjICoqxJDhu41jIHbDoCBsw6BtIHF1ZW4gduG7m2kgZOG7ryBsaeG7h3UqKg0KDQpC4buZIGThu68gbGnhu4d1IOKAnFN1cGVybWFya2V0IFRyYW5zYWN0aW9uc+KAnSBwaOG6o24gw6FuaCBjw6FjIGdpYW8gZOG7i2NoIG11YSBow6BuZyBj4bunYSBraMOhY2ggaMOgbmcgdOG6oWkgbeG7mXQgc2nDqnUgdGjhu4sgdHJvbmcgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gY+G7pSB0aOG7gy4gTeG7l2kgZMOybmcgZOG7ryBsaeG7h3UgdMawxqFuZyDhu6luZyB24bubaSBt4buZdCBnaWFvIGThu4tjaCwgYmFvIGfhu5NtIHRow7RuZyB0aW4gbmjDom4ga2jhuql1IGjhu41jIChnaeG7m2kgdMOtbmgsIGxv4bqhaSB0aMOgbmggdmnDqm4sIGNoaSBuaMOhbmgpLCDEkeG6t2MgxJFp4buDbSBz4bqjbiBwaOG6qW0gKGxv4bqhaSBz4bqjbiBwaOG6qW0sIGvDqm5oIHRoYW5oIHRvw6FuKSwgdsOgIGPDoWMgeeG6v3UgdOG7kSBow6BuaCB2aSB0acOqdSBkw7luZyAodGjhu51pIGdpYW4gbXVhIHPhuq9tLCBt4bupYyDEkeG7mSBow6BpIGzDsm5nLCBnacOhIHRy4buLIMSRxqFuIGjDoG5nLC4uLikuIFThuq1wIGThu68gbGnhu4d1IGfhu5NtIDE0LjA1OSBxdWFuIHPDoXQgdsOgIDE2IGJp4bq/biwgY3VuZyBj4bqlcCBu4buBbiB04bqjbmcgY2hpIHRp4bq/dCDEkeG7gyBwaMOibiB0w61jaCBow6BuaCB2aSBraMOhY2ggaMOgbmcgdsOgIGhp4buHdSBxdeG6oyBraW5oIGRvYW5oIGPhu6dhIHNpw6p1IHRo4buLLg0KDQpgYGB7cn0NCiMgxJDhu41jIGZpbGUNCmxpYnJhcnkoImNzdiIpDQpkYXRhIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9BZG1pbi9Eb3dubG9hZHMvU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zLmNzdiIsIGhlYWRlciA9IFQpDQoNCiMgSGnhu4NuIHRo4buLIGPhuqV1IHRyw7pjIGThu68gbGnhu4d1DQpzdHIoZGF0YSkNCg0KIyBIaeG7g24gdGjhu4sgdsOgaSBkw7JuZyDEkeG6p3UgdsOgIGN14buRaQ0KaGVhZChkYXRhKQ0KdGFpbChkYXRhKQ0KDQojIENodXnhu4NuIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggcGjDuSBo4bujcCBzYW5nIGZhY3Rvcg0KZmFjdG9yIDwtIGMoIkdlbmRlciIsICJNYXJpdGFsU3RhdHVzIiwgIkhvbWVvd25lciIsICJBbm51YWxJbmNvbWUiLA0KICAgICAgICAgICAgICAgICAgICAiQ2l0eSIsICJTdGF0ZW9yUHJvdmluY2UiLCAiQ291bnRyeSIsDQogICAgICAgICAgICAgICAgICAgICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIpDQoNCiMgS2nhu4NtIHRyYSBiaeG6v24gbsOgbyB04buTbiB04bqhaSB0cm9uZyBkYXRhDQpmYWN0b3IgPC0gaW50ZXJzZWN0KGZhY3RvciwgbmFtZXMoZGF0YSkpDQoNCiMgQ2h1eeG7g24gc2FuZyBmYWN0b3INCmRhdGFbZmFjdG9yXSA8LSBsYXBwbHkoZGF0YVtmYWN0b3JdLCBhcy5mYWN0b3IpDQoNCiMgS2nhu4NtIHRyYSBs4bqhaSBj4bqldSB0csO6Yw0Kc3RyKGRhdGEpDQpgYGANCg0KIyMgKipHaeG6o2kgdGjDrWNoIGPDoWMgYmnhur9uKioNCg0KQuG7mSBk4buvIGxp4buHdSBnaGkgbOG6oWkgdGjDtG5nIHRpbiB24buBIGPDoWMgZ2lhbyBk4buLY2ggbXVhIGjDoG5nIGPhu6dhIGtow6FjaCBow6BuZywgYmFvIGfhu5NtIHRow7RuZyB0aW4gbmjDom4ga2jhuql1IGjhu41jLCB0aMO0bmcgdGluIHPhuqNuIHBo4bqpbSwgc+G7kSBsxrDhu6NuZyBiw6FuIHJhIHbDoCBkb2FuaCB0aHUuIEThu68gbGnhu4d1IGJhbyBn4buTbSAxNDA1OSBxdWFuIHPDoXQgdsOgIDE2IGJp4bq/bi4gRMaw4bubaSDEkcOieSBsw6AgbcO0IHThuqMgY2hpIHRp4bq/dCBjw6FjIGJp4bq/biBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdToNCg0KfCAgICAqKlTDqm4gQmnhur9uKiogICAgICAgICAgIHwgICAgKirDnSBOZ2jEqWEqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqUHVyY2hhc2VEYXRlKiogICAgICAgICB8IE5nw6B5IGdpYW8gZOG7i2NoIG11YSBow6BuZyBkaeG7hW4gcmEgKMSR4buLbmggZOG6oW5nIG5nw6B5L3Row6FuZy9uxINtKS4gICAgICAgICAgICAgICAgIHwNCnwgKipDdXN0b21lcklEKiogICAgICAgICAgfCBNw6MgxJHhu4tuaCBkYW5oIGR1eSBuaOG6pXQgY2hvIG3hu5dpIGtow6FjaCBow6BuZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkdlbmRlcioqICAgICAgICAgICAgICAgfCBHaeG7m2kgdMOtbmggY+G7p2Ega2jDoWNoIGjDoG5nOiAqKk0qKiAoTmFtKSwgKipGKiogKE7hu68pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipNYXJpdGFsU3RhdHVzKiogICAgICAgIHwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuOiAqKlMqKiAoxJDhu5ljIHRow6JuKSwgKipNKiogKMSQw6Mga+G6v3QgaMO0bikuICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipIb21lb3duZXIqKiAgICAgICAgICAgIHwgVMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6A6ICoqWSoqIChDw7MpLCAqKk4qKiAoS2jDtG5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkNoaWxkcmVuKiogICAgICAgICAgICAgfCBT4buRIGzGsOG7o25nIGNvbiBjw6FpIGPhu6dhIGtow6FjaCBow6BuZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipBbm51YWxJbmNvbWUqKiAgICAgICAgIHwgTeG7qWMgdGh1IG5o4bqtcCBow6BuZyBuxINtIHRoZW8ga2hv4bqjbmcgKFbDrSBk4bulOiAqKiQzMEsgLSAkNTBLKiopLiAgICAgICAgICAgICAgICAgIHwNCnwgKipDaXR5KiogICAgICAgICAgICAgICAgIHwgVGjDoG5oIHBo4buRIG7GoWkga2jDoWNoIGjDoG5nIHRo4buxYyBoaeG7h24gZ2lhbyBk4buLY2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipTdGF0ZW9yUHJvdmluY2UqKiAgICAgIHwgQmFuZyBob+G6t2MgdOG7iW5oICh2w60gZOG7pTogKipDQSoqIGNobyBDYWxpZm9ybmlhLCAqKk9SKiogY2hvIE9yZWdvbikuICAgICAgICAgICAgICAgfA0KfCAqKkNvdW50cnkqKiAgICAgICAgICAgICAgfCBRdeG7kWMgZ2lhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlByb2R1Y3RGYW1pbHkqKiAgICAgICAgfCBOaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oOiAqKkZvb2QqKiAoVGjhu7FjIHBo4bqpbSksICoqRHJpbmsqKiAoxJDhu5MgdeG7kW5nKSwgKipOb24tQ29uc3VtYWJsZSoqIChLaMO0bmcgdGnDqnUgZMO5bmcpLiB8DQp8ICoqUHJvZHVjdERlcGFydG1lbnQqKiAgICB8IELhu5kgcGjhuq1uIHPhuqNuIHBo4bqpbSBuaMawICoqU25hY2sgRm9vZHMqKiwgKipGcm96ZW4gRm9vZHMqKiwgdi52LiAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlByb2R1Y3RDYXRlZ29yeSoqICAgICAgfCBEYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBj4bulIHRo4buDIGjGoW4sIHbDrSBk4bulOiAqKkNhbmR5KiosICoqQmVlciBhbmQgV2luZSoqLiAgICAgICAgICAgICAgfA0KfCAqKlVuaXRzU29sZCoqICAgICAgICAgICAgfCBT4buRIGzGsOG7o25nIMSRxqFuIHbhu4sgc+G6o24gcGjhuqltIMSRw6MgYsOhbiB0cm9uZyBnaWFvIGThu4tjaCDEkcOzLiAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUmV2ZW51ZSoqICAgICAgICAgICAgICB8IERvYW5oIHRodSB04burIGdpYW8gZOG7i2NoICh0w61uaCB0aGVvIFVTRCkuICAgfA0KDQoNClRyxrDhu5tjIGtoaSB0aeG6v24gaMOgbmggdGjhu5FuZyBrw6ogbcO0IHThuqMgY8OhYyBiaeG6v24gdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgdGEgdGnhur9uIGjDoG5oIHBow6JuIGxv4bqhaSBk4buvIGxp4buHdSB0aMOgbmggMiBuaMOzbSBiYW8gZ+G7k206IGThu68gbGnhu4d1IMSR4buLbmggdMOtbmggdsOgIGThu68gbGnhu4d1IMSR4buLbmggbMaw4bujbmcgbmjGsCBzYXU6DQoNCioqUGjDom4gbG/huqFpIGJp4bq/biB0aGVvIGtp4buDdSBk4buvIGxp4buHdToqKg0KDQoqKkThu68gbGnhu4d1IMSQ4buLbmggdMOtbmg6KioNCg0KfCAgICAqKlTDqm4gQmnhur9uKiogICAgICAgICAgIHwgICAgKirDnSBOZ2jEqWEqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqR2VuZGVyKiogICAgICAgICAgICAgICB8IEdp4bubaSB0w61uaCBj4bunYSBraMOhY2ggaMOgbmc6ICoqTSoqIChOYW0pLCAqKkYqKiAoTuG7rykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKk1hcml0YWxTdGF0dXMqKiAgICAgICAgfCBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom46ICoqUyoqICjEkOG7mWMgdGjDom4pLCAqKk0qKiAoxJDDoyBr4bq/dCBow7RuKS4gICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkhvbWVvd25lcioqICAgICAgICAgICAgfCBUw6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoDogKipZKiogKEPDsyksICoqTioqIChLaMO0bmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQW5udWFsSW5jb21lKiogICAgICAgICB8IE3hu6ljIHRodSBuaOG6rXAgaMOgbmcgbsSDbSB0aGVvIGtob+G6o25nIChWw60gZOG7pTogKiokMzBLIC0gJDUwSyoqKS4gICAgICAgICAgICAgICAgICB8DQp8ICoqQ2l0eSoqICAgICAgICAgICAgICAgICB8IFRow6BuaCBwaOG7kSBuxqFpIGtow6FjaCBow6BuZyB0aOG7sWMgaGnhu4duIGdpYW8gZOG7i2NoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqU3RhdGVvclByb3ZpbmNlKiogICAgICB8IEJhbmcgaG/hurdjIHThu4luaCAodsOtIGThu6U6ICoqQ0EqKiBjaG8gQ2FsaWZvcm5pYSwgKipPUioqIGNobyBPcmVnb24pLiAgICAgICAgICAgICAgIHwNCnwgKipDb3VudHJ5KiogICAgICAgICAgICAgIHwgUXXhu5FjIGdpYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipQcm9kdWN0RmFtaWx5KiogICAgICAgIHwgTmjDs20gc+G6o24gcGjhuqltIGNow61uaDogKipGb29kKiogKFRo4buxYyBwaOG6qW0pLCAqKkRyaW5rKiogKMSQ4buTIHXhu5FuZyksICoqTm9uLUNvbnN1bWFibGUqKiAoS2jDtG5nIHRpw6p1IGTDuW5nKS4gfA0KfCAqKlByb2R1Y3REZXBhcnRtZW50KiogICAgfCBC4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0gbmjGsCAqKlNuYWNrIEZvb2RzKiosICoqRnJvemVuIEZvb2RzKiosIHYudi4gICAgICAgICAgICAgICAgICAgIHwNCnwgKipQcm9kdWN0Q2F0ZWdvcnkqKiAgICAgIHwgRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7pSB0aOG7gyBoxqFuLCB2w60gZOG7pTogKipDYW5keSoqLCAqKkJlZXIgYW5kIFdpbmUqKi4gICAgICAgICAgICAgIHwNCg0KKipE4buvIGxp4buHdSDEkOG7i25oIGzGsOG7o25nOioqDQoNCnwgICAgKipUw6puIEJp4bq/bioqICAgICAgICAgICB8ICAgICoqw50gTmdoxKlhKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAqKkNoaWxkcmVuKiogICAgICAgICAgICAgfCBT4buRIGzGsOG7o25nIGNvbiBjw6FpIGPhu6dhIGtow6FjaCBow6BuZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipVbml0c1NvbGQqKiAgICAgICAgICAgIHwgU+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSDEkcOjIGLDoW4gdHJvbmcgZ2lhbyBk4buLY2ggxJHDsy4gICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlJldmVudWUqKiAgICAgICAgICAgICAgfCBEb2FuaCB0aHUgdOG7qyBnaWFvIGThu4tjaCAodMOtbmggdGhlbyBVU0QpLiAgIHwNCg0KIyMgKipLaeG7g20gdHJhIGdpw6EgdHLhu4sgTkEqKg0KDQpUcsaw4bubYyBraGkgdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoIGThu68gbGnhu4d1LCBjaMO6bmcgdGEgY+G6p24ga2nhu4NtIHRyYSB2w6AgeOG7rSBsw70gY8OhYyBnacOhIHRy4buLIGLhu4sgdGhp4bq/dSBuaOG6sW0gxJHhuqNtIGLhuqNvIMSR4buZIGNow61uaCB4w6FjIHbDoCB0w61uaCB0b8OgbiB24bq5biBj4bunYSBr4bq/dCBxdeG6oyBwaMOibiB0w61jaC4NCg0KYGBge3J9DQpzdW0oaXMubmEoZGF0YSkpDQp3aGljaChpcy5uYShkYXRhKSkNCmBgYA0KQ+G6oyBoYWkgbOG7h25oIMSR4buBdSB0cuG6oyB24buBIGvhur90IHF14bqjIGNobyB0aOG6pXkga2jDtG5nIHThu5NuIHThuqFpIGdpw6EgdHLhu4sgdGhp4bq/dToNCg0KLSAqKnN1bShpcy5uYShkYXRhKSkqKiB0cuG6oyB24buBIDAsIG5naMSpYSBsw6Aga2jDtG5nIGPDsyBnacOhIHRy4buLIE5BIG7DoG8uDQoNCi0gKip3aGljaChpcy5uYShkYXRhKSkqKiB0cuG6oyB24buBIGludGVnZXIoMCksIG5naMSpYSBsw6Aga2jDtG5nIGPDsyB24buLIHRyw60gbsOgbyBjaOG7qWEgTkEuDQoNCsSQaeG7gXUgbsOgeSBjaG8gcGjDqXAgY2jDum5nIHRhIHRp4bq/cCB04bulYyBjw6FjIGLGsOG7m2MgeOG7rSBsw70gZOG7ryBsaeG7h3UgdsOgIHBow6JuIHTDrWNoIG3DoCBraMO0bmcgY+G6p24gdGjhu7FjIGhp4buHbiBixrDhu5tjIHjhu60gbMO9IGdpw6EgdHLhu4sgdGhp4bq/dS4NCg0KDQojIyAqKlThuqFvIGLhu5kgZOG7ryBsaeG7h3UgY2jhu4kgY8OzIGJp4bq/biDEkeG7i25oIHTDrW5oKioNCg0KYGBge3J9DQpkYXRhRFQgPC0gYygiR2VuZGVyIiwgIk1hcml0YWxTdGF0dXMiLCAiSG9tZW93bmVyIiwgIkFubnVhbEluY29tZSIsIA0KICAgICAgICAgICAgIkNpdHkiLCAiU3RhdGVvclByb3ZpbmNlIiwgIkNvdW50cnkiLCANCiAgICAgICAgICAgICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIpDQpkYXRhRFQgPC0gZGF0YVssZGF0YURUXSANCnN0cihkYXRhRFQpDQpgYGANCg0KLS0tDQoNCiMgKipQSOG6pk4gMjogUEjDgk4gVMONQ0ggTcOUIFThuqIgTeG7mFQgQknhur5OIMSQ4buKTkggVMONTkgqKiANCg0KIyMgKipCaeG6v24gR2VuZGVyKioNCg0KIyMjICoqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJEdlbmRlcikNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkR2VuZGVyKS9zdW0odGFibGUoZGF0YURUJEdlbmRlcikpDQpgYGANCg0KIyMjICoqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5ENCmZyZXExIDwtIHRhYmxlKGRhdGFEVCRHZW5kZXIpDQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUNCkdlbmRlciA8LSBhcy5kYXRhLmZyYW1lKGZyZXExKQ0KY29sbmFtZXMoR2VuZGVyKSA8LSBjKCJHZW5kZXIiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QoR2VuZGVyLCBhZXMoeCA9IEdlbmRlciwgeSA9IENvdW50LCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2NvbChjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTSIgPSAiIzY0OTVFRCIsICJGIiA9ICIjRjA4MDgwIikpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJHZW5kZXIiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgDQpgYGANCg0KIyMjICoqVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4qKg0KYGBge3J9DQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoZnJlcTEsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKGZyZXExKSwgIiAoIiwgcm91bmQoMTAwICogZnJlcTEgLyBzdW0oZnJlcTEpLCAxKSwgIiUpIiksDQogICAgY29sID0gYygiI0YwODA4MCIsICIjNjQ5NUVEIiksICAjIG3DoHUgdMO5eSBjaOG7jW4NCiAgICBtYWluID0gIkdlbmRlciIpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCwgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBoaeG7h24gdOG6oWkgY8OzIGByIHRhYmxlKGRhdGFEVCRHZW5kZXIpWzFdYCBraMOhY2ggaMOgbmcgbMOgIG7hu68gdsOgIGByIHRhYmxlKGRhdGFEVCRHZW5kZXIpWzJdYCBraMOhY2ggaMOgbmcgbMOgIG5hbS4gVOG7tyBs4buHIHTGsMahbmcg4bupbmcgbMOgIGtob+G6o25nIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRHZW5kZXIpWzFdIC8gbnJvdyhkYXRhRFQpLCAyKWAlIG7hu68gdsOgIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRHZW5kZXIpWzJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlIG5hbS4NCi0gS+G6v3QgcXXhuqMgbsOgeSBjaG8gdGjhuqV5IGdp4bubaSB0w61uaCBu4buvIGNoaeG6v20gdOG7tyB0cuG7jW5nIG5o4buJbmggaMahbiB0cm9uZyB04bqtcCBraMOhY2ggaMOgbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQgKGThu7FhIHRyw6puIGJp4buDdSDEkeG7kyB0csOybikuxJDhu5NuZyB0aOG7nWksIGJp4buDdSDEkeG7kyBj4buZdCBtaW5oIGjhu41hIHRy4buxYyBxdWFuIGNobyB0aOG6pXkgc+G7sSBjaMOqbmggbOG7h2NoIGtow7RuZyBxdcOhIGzhu5tuIGdp4buvYSBoYWkgZ2nhu5tpLCBuaMawbmcgbuG7ryB24bqrbiBjaGnhur9tIMawdSB0aOG6vyBuaOG6uSB24buBIG3hurd0IHPhu5EgbMaw4bujbmcuDQoNCg0KIyMgKipCaeG6v24gTWFyaXRhbFN0YXR1cyoqDQoNCiMjIyAqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGFEVCRNYXJpdGFsU3RhdHVzKQ0KI0LhuqNuZyB04bqnbiBzdeG6pXQNCnRhYmxlKGRhdGFEVCRNYXJpdGFsU3RhdHVzKS9zdW0odGFibGUoZGF0YURUJE1hcml0YWxTdGF0dXMpKQ0KYGBgDQoNCiMjIyAqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kQ0KZnJlcTIgPC0gdGFibGUoZGF0YURUJE1hcml0YWxTdGF0dXMpDQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUNCk1hcml0YWxTdGF0dXMgPC0gYXMuZGF0YS5mcmFtZShmcmVxMikNCmNvbG5hbWVzKE1hcml0YWxTdGF0dXMpIDwtIGMoIk1hcml0YWxTdGF0dXMiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QoTWFyaXRhbFN0YXR1cywgYWVzKHggPSBNYXJpdGFsU3RhdHVzLCB5ID0gQ291bnQsIGZpbGwgPSBNYXJpdGFsU3RhdHVzKSkgKw0KICBnZW9tX2NvbChjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiUyIgPSAiI0ZDOEQ2MiIsICJNIiA9ICIjNjZDMkE1IikpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJNYXJpdGFsU3RhdHVzIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KIyMjICoqVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4qKg0KYGBge3J9DQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoZnJlcTIsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKGZyZXEyKSwgIiAoIiwgcm91bmQoMTAwICogZnJlcTIgLyBzdW0oZnJlcTIpLCAxKSwgIiUpIiksDQogICAgY29sID0gYygiIzY2QzJBNSIsICIjRkM4RDYyIiksICAjIG3DoHUgdMO5eSBjaOG7jW4NCiAgICBtYWluID0gIk1hcml0YWxTdGF0dXMiKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQsIHRhIHRo4bqleSB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBjw7MgYHIgdGFibGUoZGF0YURUJE1hcml0YWxTdGF0dXMpWyJTIl1gIGtow6FjaCBow6BuZyB0aHXhu5ljIG5ow7NtIMSR4buZYyB0aMOibiAoU2luZ2xlKSB2w6AgYHIgdGFibGUoZGF0YURUJE1hcml0YWxTdGF0dXMpWyJNIl1gIGtow6FjaCBow6BuZyB0aHXhu5ljIG5ow7NtIMSRw6Mga+G6v3QgaMO0biAoTWFycmllZCkuIFThu7cgbOG7hyB0xrDGoW5nIOG7qW5nIGzDoCBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkTWFyaXRhbFN0YXR1cylbIlMiXSAvIG5yb3coZGF0YURUKSwgMilgJSDEkeG7mWMgdGjDom4gdsOgIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRNYXJpdGFsU3RhdHVzKVsiTSJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlIMSRw6Mga+G6v3QgaMO0bi4NCg0KLSBCaeG7g3UgxJHhu5MgY+G7mXQgbWluaCBo4buNYSByw7UgcsOgbmcgcuG6sW5nIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIMSR4buZYyB0aMOibiBuaOG7iW5oIGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgbmjDs20gxJHDoyBr4bq/dCBow7RuLiBCaeG7g3UgxJHhu5MgdHLDsm4gY8WpbmcgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5Ega2jDoSBjw6JuIGLhurFuZyBnaeG7r2EgaGFpIG5ow7NtIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi4gIA0KxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgZOG7ryBsaeG7h3UgY8OzIHTDrW5oIMSR4bqhaSBkaeG7h24gdOG7kXQgY2hvIGPhuqMgaGFpIG5ow7NtLCB0csOhbmggxJHGsOG7o2MgdMOsbmggdHLhuqFuZyB0aGnDqm4gbOG7h2NoIG3huqt1IHRyb25nIG5naGnDqm4gY+G7qXUuDQoNCg0KIyMgKipCaeG6v24gSG9tZW93bmVyKioNCg0KIyMjICoqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJEhvbWVvd25lcikNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkSG9tZW93bmVyKS9zdW0odGFibGUoZGF0YURUJEhvbWVvd25lcikpDQpgYGANCg0KIyMjICoqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpmcmVxMyA8LSB0YWJsZShkYXRhRFQkSG9tZW93bmVyKQ0KDQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lDQpob21lb3duZXIgPC0gYXMuZGF0YS5mcmFtZShmcmVxMykNCmNvbG5hbWVzKGhvbWVvd25lcikgPC0gYygiSG9tZW93bmVyIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdA0KZ2dwbG90KGhvbWVvd25lciwgYWVzKHggPSBIb21lb3duZXIsIHkgPSBDb3VudCwgZmlsbCA9IEhvbWVvd25lcikpICsNCiAgZ2VvbV9jb2woY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk4iID0gIiNGREI0NjIiLCAiWSIgPSAiIzgwQjFEMyIpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSG9tZW93bmVyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoNCiMjIyAqKlbhur0gYmnhu4N1IMSR4buTIHRyw7JuKioNCmBgYHtyfQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKGZyZXEzLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhmcmVxMyksICIgKCIsIHJvdW5kKDEwMCAqIGZyZXEzIC8gc3VtKGZyZXEzKSwgMSksICIlKSIpLA0KICAgIGNvbCA9IGMoIiNGREI0NjIiLCAiIzgwQjFEMyIpLCAgIyBtw6B1IHTDuXkgY2jhu41uDQogICAgbWFpbiA9ICJIb21lb3duZXIiKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBE4buxYSB0csOqbiBi4bqjbmcgdOG6p24gc+G7kSwgY8OzIGByIHN1bShkYXRhRFQkSG9tZW93bmVyID09ICJOIilgIGtow6FjaCBow6BuZyBjaMawYSBjw7MgbmjDoCB2w6AgYHIgc3VtKGRhdGFEVCRIb21lb3duZXIgPT0gIlkiKWAga2jDoWNoIGjDoG5nIMSRw6MgY8OzIG5ow6AuIFjDqXQgduG7gSB04bu3IGzhu4csIG5ow7NtIGNoxrBhIGPDsyBuaMOgIGNoaeG6v20ga2hv4bqjbmcgYHIgcm91bmQoMTAwICogc3VtKGRhdGFEVCRIb21lb3duZXIgPT0gIk4iKSAvIG5yb3coZGF0YURUKSwgMilgJSwgdHJvbmcga2hpIG5ow7NtIMSRw6MgY8OzIG5ow6AgY2hp4bq/bSBgciByb3VuZCgxMDAgKiBzdW0oZGF0YURUJEhvbWVvd25lciA9PSAiWSIpIC8gbnJvdyhkYXRhRFQpLCAyKWAlLg0KLSBCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHLDtSBy4bqxbmcgcGjhuqduIGzhu5tuIGtow6FjaCBow6BuZyB0cm9uZyBk4buvIGxp4buHdSB0aHXhu5ljIG5ow7NtIMSRw6MgY8OzIG5ow6AsIGNobyB0aOG6pXkga2jhuqMgbsSDbmcgdMOgaSBjaMOtbmggdMawxqFuZyDEkeG7kWkg4buVbiDEkeG7i25oIGhv4bq3YyB0aHXhu5ljIG5ow7NtIGtow6FjaCBow6BuZyB0cnVuZyBuacOqbiB0cuG7nyBsw6puLiBCaeG7g3UgxJHhu5MgdHLDsm4gYuG7lSBzdW5nIGfDs2MgbmjDrG4gdHLhu7FjIHF1YW4sIGNobyB0aOG6pXkgc+G7sSBjaMOqbmggbOG7h2NoIHLDtSBy4buHdCBnaeG7r2EgaGFpIG5ow7NtLCB0dXkgY2jGsGEgxJHhur9uIG3hu6ljIMOhcCDEkeG6o28gdHV54buHdCDEkeG7kWkuDQoNCg0KDQojIyAqKkJp4bq/biBBbm51YWxJbmNvbWUqKg0KDQojIyMgKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YURUJEFubnVhbEluY29tZSkvc3VtKHRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpKQ0KYGBgDQoNCiMjIyAqKlbhur0gxJHhu5MgdGjhu4sqKg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpmcmVxNCA8LSB0YWJsZShkYXRhRFQkQW5udWFsSW5jb21lKQ0KDQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lDQpBbm51YWxJbmNvbWUgPC0gYXMuZGF0YS5mcmFtZShmcmVxNCkNCmNvbG5hbWVzKEFubnVhbEluY29tZSkgPC0gYygiQW5udWFsSW5jb21lIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdA0KZ2dwbG90KEFubnVhbEluY29tZSwgYWVzKHggPSBBbm51YWxJbmNvbWUsIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjRjA4MDgwIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siKSANCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSwgbmjDs20gdGh1IG5o4bqtcCBwaOG7lSBiaeG6v24gbmjhuqV0IGzDoCB04burIDMwSyDigJMgNTBLIFVTRC9uxINtLCB24bubaSBgciB0YWJsZShkYXRhRFQkQW5udWFsSW5jb21lKVsiJDMwSyAtICQ1MEsiXWAgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgYHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJEFubnVhbEluY29tZSlbIiQzMEsgLSAkNTBLIl0gLyBucm93KGRhdGFEVCksIDIpYCUgdGhlbyBi4bqjbmcgdOG6p24gc3XhuqV0LiBUaGVvIHNhdSBsw6AgbmjDs20gMTBLIOKAkyAzMEsgVVNEL27Eg20gduG7m2kgYHIgdGFibGUoZGF0YURUJEFubnVhbEluY29tZSlbIiQxMEsgLSAkMzBLIl1gIG5nxrDhu51pICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJEFubnVhbEluY29tZSlbIiQxMEsgLSAkMzBLIl0gLyBucm93KGRhdGFEVCksIDIpYCUpLg0KDQotIE5nxrDhu6NjIGzhuqFpLCBjw6FjIG5ow7NtIHRodSBuaOG6rXAgY2FvIG5oxrAgJDE1MEsrIGhv4bq3YyAkMTEwSyDigJMgJDEzMEsgY2hp4bq/bSB04bu3IHRy4buNbmcgcuG6pXQgbmjhu48gdHJvbmcgYuG7mSBk4buvIGxp4buHdSAoY2jhu4kga2hv4bqjbmcgYHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJEFubnVhbEluY29tZSlbIiQxNTBLKyJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlIHbDoCBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkQW5udWFsSW5jb21lKVsiJDExMEsgLSAkMTMwSyJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlKSwgY2hvIHRo4bqleSBuaMOzbSBraMOhY2ggaMOgbmcgY2jDrW5oIG7hurFtIHRyb25nIHBow6JuIGtow7pjIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmguDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IGdpw7pwIGjDrG5oIGR1bmcgcsO1IHPhu7EgcGjDom4gYuG7kSB0aHUgbmjhuq1wLCBjaG8gdGjhuqV5IHBow6JuIGtow7pjIGTGsOG7m2kgOTBLIGNoaeG6v20gcGjhuqduIGzhu5tuLCDEkeG6t2MgYmnhu4d0IGzDoCAyIG5ow7NtIDMwSyDigJMgNTBLIHbDoCAxMEsg4oCTIDMwSy4NCg0KDQojIyAqKkJp4bq/biBDaXR5KioNCg0KIyMjICoqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhRFQkQ2l0eSkNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkQ2l0eSkvc3VtKHRhYmxlKGRhdGEkQ2l0eSkpDQpgYGANCg0KIyMjICoqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KDQojIELhuqNuZyB04bqnbiBzdeG6pXQgLT4gZGF0YSBmcmFtZQ0KZnJlcTUgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhRFQkQ2l0eSkpDQpjb2xuYW1lcyhmcmVxNSkgPC0gYygiQ2l0eSIsICJDb3VudCIpDQoNCiMgU+G6r3AgeOG6v3AgZ2nhuqNtIGThuqduDQpmcmVxNSA8LSBmcmVxNVtvcmRlcigtZnJlcTUkQ291bnQpLCBdDQoNCiMgQ2hpYSDEkcO0aSBkYW5oIHPDoWNoIHRow6BuaCBwaOG7kQ0KbiA8LSBucm93KGZyZXE1KQ0KbWlkIDwtIGNlaWxpbmcobiAvIDIpDQoNCiMgROG7ryBsaeG7h3UgY2hvIGJp4buDdSDEkeG7kyB0aOG7qSBuaOG6pXQgKG7hu61hIHRyw6puIHRoZW8gdOG6p24gc3XhuqV0KQ0KdG9wIDwtIGhlYWQoZnJlcTUsIG1pZCkNCg0KcGxvdDEgPC0gZ2dwbG90KHRvcCwgYWVzKHggPSBDaXR5LCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0RCNzA5MyIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gOCkpDQoNCiMgROG7ryBsaeG7h3UgY2hvIGJp4buDdSDEkeG7kyB0aOG7qSBoYWkgKG7hu61hIGTGsOG7m2kgdGhlbyB04bqnbiBzdeG6pXQpDQpib3R0b20gPC0gdGFpbChmcmVxNSwgbiAtIG1pZCkNCg0KcGxvdDIgPC0gZ2dwbG90KGJvdHRvbSwgYWVzKHggPSBDaXR5LCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0YwODA4MCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gOCkpDQoNCiMgR2jDqXAgaGFpIGJp4buDdSDEkeG7kw0KcGxvdDEgKyBwbG90Mg0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRLCB0aMOgbmggcGjhu5EgeHXhuqV0IGhp4buHbiBwaOG7lSBiaeG6v24gbmjhuqV0IGzDoCBTYWxlbSB24bubaSBgciB0YWJsZShkYXRhRFQkQ2l0eSlbIlNhbGVtIl1gIG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRDaXR5KVsiU2FsZW0iXSAvIG5yb3coZGF0YURUKSwgMilgJSB0aGVvIGLhuqNuZyB04bqnbiBzdeG6pXQuVGhlbyBzYXUgbMOgIFRhY29tYSB2w6AgUG9ydGxhbmQgduG7m2kgbOG6p24gbMaw4bujdCBgciB0YWJsZShkYXRhRFQkQ2l0eSlbIlRhY29tYSJdYCBuZ8aw4budaSAofmByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRDaXR5KVsiVGFjb21hIl0gLyBucm93KGRhdGFEVCksIDIpYCUpIHbDoCBgciB0YWJsZShkYXRhRFQkQ2l0eSlbIlBvcnRsYW5kIl1gIG5nxrDhu51pICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJENpdHkpWyJQb3J0bGFuZCJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlKS4NCg0KLSBOZ8aw4bujYyBs4bqhaSwgY8OhYyB0aMOgbmggcGjhu5EgbmjGsCBHdWFkYWxhamFyYSBob+G6t2MgVmljdG9yaWEgY8OzIHPhu5EgbMaw4bujbmcgcuG6pXQgw610LCBjaOG7iSBs4bqnbiBsxrDhu6N0IGByIHRhYmxlKGRhdGFEVCRDaXR5KVsiR3VhZGFsYWphcmEiXWAgdsOgIGByIHRhYmxlKGRhdGFEVCRDaXR5KVsiVmljdG9yaWEiXWAgbmfGsOG7nWksIGNoaeG6v20gY2jGsGEgxJHhur9uIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRDaXR5KVsiR3VhZGFsYWphcmEiXSAvIG5yb3coZGF0YURUKSwgMilgJSB2w6AgYHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJENpdHkpWyJWaWN0b3JpYSJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlIHRyb25nIHRvw6BuIGLhu5kgZOG7ryBsaeG7h3UuDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IGdpw7pwIHRy4buxYyBxdWFuIGjDs2Egc+G7sSBwaMOibiBi4buRIHRow6BuaCBwaOG7kSwgY2hvIHRo4bqleSBt4buZdCBz4buRIHRow6BuaCBwaOG7kSBuaMawIFNhbGVtLCBUYWNvbWEgdsOgIFBvcnRsYW5kIGNoaeG6v20gdOG7tyBs4buHIHbGsOG7o3QgdHLhu5lpLCB0cm9uZyBraGkgcGjhuqduIGzhu5tuIGPDoWMgdGjDoG5oIHBo4buRIGPDsm4gbOG6oWkgY8OzIHThuqduIHN14bqldCB0aOG6pXAuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1IHThuq1wIHRydW5nIHbDoG8gbeG7mXQgc+G7kSBraHUgduG7sWMgxJHhu4thIGzDvSBuaOG6pXQgxJHhu4tuaCB0aGF5IHbDrCBwaMOibiBi4buRIMSR4buTbmcgxJHhu4F1Lg0KDQoNCiMjICoqQmnhur9uIFN0YXRlb3JQcm92aW5jZSoqDQoNCiMjIyAqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSkNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkU3RhdGVvclByb3ZpbmNlKS9zdW0odGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSkpDQpgYGANCg0KIyMjICoqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpmcmVxNiA8LSB0YWJsZShkYXRhRFQkU3RhdGVvclByb3ZpbmNlKQ0KDQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lDQpTdGF0ZW9yUHJvdmluY2UgPC0gYXMuZGF0YS5mcmFtZShmcmVxNikNCmNvbG5hbWVzKFN0YXRlb3JQcm92aW5jZSkgPC0gYygiU3RhdGVvclByb3ZpbmNlIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdA0KZ2dwbG90KFN0YXRlb3JQcm92aW5jZSwgYWVzKHggPSBTdGF0ZW9yUHJvdmluY2UsIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjRjA4MDgwIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siKSANCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gROG7sWEgdHLDqm4gYuG6o25nIHThuqduIHPhu5EsIHRp4buDdSBiYW5nIGPDsyBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBs4bubbiBuaOG6pXQgbMOgIFdBIChXYXNoaW5ndG9uKSB24bubaSBgciB0YWJsZShkYXRhRFQkU3RhdGVvclByb3ZpbmNlKVsiV0EiXWAgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgYHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSlbIldBIl0gLyBucm93KGRhdGFEVCksIDIpYCUgdG/DoG4gYuG7mSBk4buvIGxp4buHdS4gDQotIFRoZW8gc2F1IGzDoCBDQSAoQ2FsaWZvcm5pYSkgduG7m2kgYHIgdGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSlbIkNBIl1gIGtow6FjaCBow6BuZyAofmByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRTdGF0ZW9yUHJvdmluY2UpWyJDQSJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlKSB2w6AgQkMgKEJyaXRpc2ggQ29sdW1iaWEpIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRTdGF0ZW9yUHJvdmluY2UpWyJCQyJdYCBuZ8aw4budaSAofmByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRTdGF0ZW9yUHJvdmluY2UpWyJCQyJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlKS5OZ8aw4bujYyBs4bqhaSwgbeG7mXQgc+G7kSB0aeG7g3UgYmFuZyBuaMawIEphbGlzY28sIFZlcmFjcnV6IHbDoCBHdWVycmVybyBjw7Mgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgcuG6pXQgdGjhuqVwLCBkxrDhu5tpIDUlIG3hu5dpIG5ow7NtLg0KLSBCaeG7g3UgxJHhu5MgY+G7mXQgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5Ega2jDtG5nIMSR4buBdSBnaeG7r2EgY8OhYyB0aeG7g3UgYmFuZywgdHJvbmcgxJHDsyBXQSB2w6AgQ0EgY2hp4bq/bSBwaOG6p24gbOG7m24gZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGhhaSB0aeG7g3UgYmFuZyBuw6B5IGPDsyB0aOG7gyBsw6AgdGjhu4sgdHLGsOG7nW5nIGNow61uaCBob+G6t2MgY8OzIG3huqFuZyBsxrDhu5tpIHBow6JuIHBo4buRaSBt4bqhbmggaMahbiB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBuw6B5Lg0KDQoNCiMjICoqQmnhur9uIENvdW50cnkqKg0KDQojIyMgKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGFEVCRDb3VudHJ5KQ0KI0LhuqNuZyB04bqnbiBzdeG6pXQNCnRhYmxlKGRhdGFEVCRDb3VudHJ5KS9zdW0odGFibGUoZGF0YURUJENvdW50cnkpKQ0KYGBgDQoNCiMjIyAqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kQ0KZnJlcTcgPC0gdGFibGUoZGF0YURUJENvdW50cnkpDQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUNCkNvdW50cnkgPC0gYXMuZGF0YS5mcmFtZShmcmVxNykNCmNvbG5hbWVzKENvdW50cnkpIDwtIGMoIkNvdW50cnkiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QoQ291bnRyeSwgYWVzKHggPSBDb3VudHJ5LCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0ZEQjQ2MiIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgDQpgYGANCg0KDQojIyMgKipW4bq9IGJp4buDdSDEkeG7kyB0csOybioqDQoNCmBgYHtyfQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKGZyZXE3LA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhmcmVxNyksICIgKCIsIHJvdW5kKDEwMCAqIGZyZXE3IC8gc3VtKGZyZXE3KSwgMSksICIlKSIpLA0KICAgIGNvbCA9IGMoIiM4OUNGRjAiLCAiI0Y0QTQ2MCIsICIjRjA4MDgwIiksICAjIG3DoHUgdMO5eSBjaOG7jW4NCiAgICBtYWluID0gIkNvdW50cnkiKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRLCBwaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIHRyb25nIGThu68gbGnhu4d1IMSR4bq/biB04burIFVTQSB24bubaSBgciB0YWJsZShkYXRhRFQkQ291bnRyeSlbIlVTQSJdYCBuZ8aw4budaSwgY2hp4bq/bSBraG/huqNuZyBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkQ291bnRyeSlbIlVTQSJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gVGhlbyBzYXUgbMOgIE1leGljbyB24bubaSBgciB0YWJsZShkYXRhRFQkQ291bnRyeSlbIk1leGljbyJdYCBuZ8aw4budaSAofmByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRDb3VudHJ5KVsiTWV4aWNvIl0gLyBucm93KGRhdGFEVCksIDIpYCUpLCB2w6AgQ2FuYWRhIGNo4buJIGPDsyBgciB0YWJsZShkYXRhRFQkQ291bnRyeSlbIkNhbmFkYSJdYCBuZ8aw4budaSAofmByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRDb3VudHJ5KVsiQ2FuYWRhIl0gLyBucm93KGRhdGFEVCksIDIpYCUpLg0KLSBCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHLDtSBy4bqxbmcgVVNBIGzDoCBxdeG7kWMgZ2lhIGNoaeG6v20gxrB1IHRo4bq/IHRyb25nIHThuq1wIGThu68gbGnhu4d1LCB24bubaSBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyB2xrDhu6N0IHRy4buZaSBzbyB24bubaSBNZXhpY28gdsOgIENhbmFkYS4gQmnhu4N1IMSR4buTIHRyw7JuIGLhu5Ugc3VuZyBnw7NjIG5ow6xuIHRy4buxYyBxdWFuLCBjaG8gdGjhuqV5IHBo4bqnbiBow6xuaCB0csOybiDEkeG6oWkgZGnhu4duIGNobyBVU0EgbOG7m24gZ+G6pXAgbmhp4buBdSBs4bqnbiBoYWkgbmjDs20gY8OybiBs4bqhaS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIHThuq1wIGThu68gbGnhu4d1IGNo4bunIHnhur91IHThuq1wIHRydW5nIHbDoG8gdGjhu4sgdHLGsOG7nW5nIE3hu7ksIHRyb25nIGtoaSBNZXhpY28gdsOgIENhbmFkYSDEkcOzbmcgdmFpIHRyw7Igbmjhu48gaMahbiB0cm9uZyBwaMOibiBwaOG7kWkga2jDoWNoIGjDoG5nLg0KDQojIyAqKkJp4bq/biBQcm9kdWN0IEZhbWlseSoqDQoNCiMjIyAqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpL3N1bSh0YWJsZShkYXRhRFQkUHJvZHVjdEZhbWlseSkpDQpgYGANCg0KDQojIyMgKipW4bq9IGJp4buDdSDEkeG7kyBj4buZdCoqDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5ENCmZyZXE4IDwtIHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KQ0KDQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lDQpQcm9kdWN0RmFtaWx5IDwtIGFzLmRhdGEuZnJhbWUoZnJlcTgpDQpjb2xuYW1lcyhQcm9kdWN0RmFtaWx5KSA8LSBjKCJQcm9kdWN0RmFtaWx5IiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdA0KZ2dwbG90KFByb2R1Y3RGYW1pbHksIGFlcyh4ID0gUHJvZHVjdEZhbWlseSwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM2NDk1RUQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIpIA0KYGBgDQoNCg0KIyMjICoqVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4qKg0KDQpgYGB7cn0NCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZShmcmVxOCwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoZnJlcTgpLCAiICgiLCByb3VuZCgxMDAgKiBmcmVxOCAvIHN1bShmcmVxOCksIDEpLCAiJSkiKSwNCiAgICBjb2wgPSBjKCIjODlDRkYwIiwgIiNGNEE0NjAiLCAiI0YwODA4MCIpLCAgIyBtw6B1IHTDuXkgY2jhu41uDQogICAgbWFpbiA9ICJQcm9kdWN0RmFtaWx5IikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSwgcGjhuqduIGzhu5tuIHPhuqNuIHBo4bqpbSB0cm9uZyBk4buvIGxp4buHdSB0aHXhu5ljIG5ow7NtIEZvb2QgduG7m2kgYHIgdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpWyJGb29kIl1gIHPhuqNuIHBo4bqpbSwgY2hp4bq/bSBraG/huqNuZyBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkUHJvZHVjdEZhbWlseSlbIkZvb2QiXSAvIHN1bSh0YWJsZShkYXRhRFQkUHJvZHVjdEZhbWlseSkpLCAyKWAlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gVGhlbyBzYXUgbMOgIG5ow7NtIE5vbi1Db25zdW1hYmxlIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KVsiTm9uLUNvbnN1bWFibGUiXWAgc+G6o24gcGjhuqltICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpWyJOb24tQ29uc3VtYWJsZSJdIC8gc3VtKHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KSksIDIpYCUpLCB2w6AgRHJpbmsgY2jhu4kgY8OzIGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KVsiRHJpbmsiXWAgc+G6o24gcGjhuqltICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpWyJEcmluayJdIC8gc3VtKHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KSksIDIpYCUpLg0KLSBCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHLDtSBy4bqxbmcgRm9vZCBsw6AgbmjDs20gc+G6o24gcGjhuqltIGNoaeG6v20gxrB1IHRo4bq/IHRyb25nIHThuq1wIGThu68gbGnhu4d1LCB24bubaSBz4buRIGzGsOG7o25nIHbGsOG7o3QgdHLhu5lpIHNvIHbhu5tpIGhhaSBuaMOzbSBjw7JuIGzhuqFpLkJp4buDdSDEkeG7kyB0csOybiBi4buVIHN1bmcgZ8OzYyBuaMOsbiB0cuG7sWMgcXVhbiwgY2hvIHRo4bqleSBwaOG6p24gaMOsbmggdHLDsm4gxJHhuqFpIGRp4buHbiBjaG8gRm9vZCBs4bubbiBoxqFuIG5oaeG7gXUgc28gduG7m2kgTm9uLUNvbnN1bWFibGUgdsOgIERyaW5rLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgdOG6rXAgZOG7ryBsaeG7h3UgdOG6rXAgdHJ1bmcgbmhp4buBdSBuaOG6pXQgdsOgbyBz4bqjbiBwaOG6qW0gdGjhu7FjIHBo4bqpbSwgdHJvbmcga2hpIGPDoWMgbmjDs20gc+G6o24gcGjhuqltIGtow7RuZyB0acOqdSBkw7luZyB2w6AgxJHhu5MgdeG7kW5nIGNoaeG6v20gdOG7tyB0cuG7jW5nIG5o4buPIGjGoW4gdHJvbmcgcGjDom4gcGjhu5FpIHPhuqNuIHBo4bqpbS4NCg0KIyMgKipCaeG6v24gUHJvZHVjdCBEZXBhcnRtZW50KioNCg0KIyMjICoqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KS9zdW0odGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KSkNCmBgYA0KDQojIyMgKipW4bq9IGJp4buBdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KDQojIELhuqNuZyB04bqnbiBzdeG6pXQgLT4gZGF0YSBmcmFtZQ0KZnJlcTkgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpKQ0KY29sbmFtZXMoZnJlcTkpIDwtIGMoIlByb2R1Y3REZXBhcnRtZW50IiwgIkNvdW50IikNCg0KIyBT4bqvcCB44bq/cCBnaeG6o20gZOG6p24NCmZyZXE5IDwtIGZyZXE5W29yZGVyKC1mcmVxOSRDb3VudCksIF0NCg0KIyBDaGlhIMSRw7RpIGRhbmggc8OhY2ggdGjDoG5oIHBo4buRDQpuMSA8LSBucm93KGZyZXE5KQ0KbWlkMSA8LSBjZWlsaW5nKG4xIC8gMikNCg0KIyBE4buvIGxp4buHdSBjaG8gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldCAobuG7rWEgdHLDqm4gdGhlbyB04bqnbiBzdeG6pXQpDQp0b3AxIDwtIGhlYWQoZnJlcTksIG1pZDEpDQoNCnBsb3QxMSA8LSBnZ3Bsb3QodG9wMSwgYWVzKHggPSBQcm9kdWN0RGVwYXJ0bWVudCwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiNEQjcwOTMiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDgpKQ0KDQojIEThu68gbGnhu4d1IGNobyBiaeG7g3UgxJHhu5MgdGjhu6kgaGFpIChu4butYSBkxrDhu5tpIHRoZW8gdOG6p24gc3XhuqV0KQ0KYm90dG9tMSA8LSB0YWlsKGZyZXE5LCBuMSAtIG1pZDEpDQoNCnBsb3QyMiA8LSBnZ3Bsb3QoYm90dG9tMSwgYWVzKHggPSBQcm9kdWN0RGVwYXJ0bWVudCwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM2NDk1RUQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDgpKQ0KDQojIEdow6lwIGhhaSBiaeG7g3UgxJHhu5MNCnBsb3QxMSArIHBsb3QyMg0KDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIG5ow7NtIHPhuqNuIHBo4bqpbSBwaOG7lSBiaeG6v24gbmjhuqV0IGzDoCBQcm9kdWNlIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIlByb2R1Y2UiXWAgc+G6o24gcGjhuqltLCBjaGnhur9tIGtob+G6o25nIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIlByb2R1Y2UiXSAvIHN1bSh0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpKSwgMilgJSB04buVbmcgc+G7kSBxdWFuIHPDoXQuIFRoZW8gc2F1IGzDoCBjw6FjIG5ow7NtIFNuYWNrIEZvb2RzIChgciB0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpWyJTbmFjayBGb29kcyJdYCwgfmByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIlNuYWNrIEZvb2RzIl0gLyBzdW0odGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KSksIDIpYCUpLCBIb3VzZWhvbGQgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIkhvdXNlaG9sZCJdYCksIHbDoCBGcm96ZW4gRm9vZHMgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIkZyb3plbiBGb29kcyJdYCkuDQoNCi0gTmfGsOG7o2MgbOG6oWksIGPDoWMgbmjDs20gw610IHh14bqldCBoaeG7h24gbmjhuqV0IHRyb25nIGThu68gbGnhu4d1IGfhu5NtIENhcm91c2VsIChgciB0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpWyJDYXJvdXNlbCJdYCBz4bqjbiBwaOG6qW0pLCBDaGVja291dCAoYHIgdGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KVsiQ2hlY2tvdXQiXWApLCB2w6AgRWdncyAoYHIgdGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KVsiRWdncyJdYCkuDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IGLDqm4gdHLDoWkgdGjhu4MgaGnhu4duIHLDtSBz4buxIMOhcCDEkeG6o28gY+G7p2EgbmjDs20gUHJvZHVjZSwgdsaw4bujdCB0cuG7mWkgaOG6s24gduG7gSBz4buRIGzGsOG7o25nIHNvIHbhu5tpIGPDoWMgbmjDs20gY8OybiBs4bqhaS4gQmnhu4N1IMSR4buTIGPhu5l0IGLDqm4gcGjhuqNpIGLhu5Ugc3VuZyB0aMOqbSBjw6FjIG5ow7NtIGPDsyB04bqnbiBz4buRIHRo4bqlcCBoxqFuLCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIHBow6JuIHTDoW4gcuG7mW5nIGdp4buvYSBjw6FjIG5ow7NtIHPhuqNuIHBo4bqpbS4gIA0KDQpU4buVbmcgdGjhu4MsIGThu68gbGnhu4d1IG5naGnDqm5nIG3huqFuaCB24buBIGPDoWMgbeG6t3QgaMOgbmcgdGjhu7FjIHBo4bqpbSB0xrDGoWkgc+G7kW5nIHbDoCDEg24gbmjhurksIHRyb25nIGtoaSBjw6FjIG5ow7NtIG5oxrAgc+G6o24gcGjhuqltIMSR4bq3YyBiaeG7h3QgKENhcm91c2VsLCBDaGVja291dCkgY2hp4bq/bSB04bu3IHRy4buNbmcgcuG6pXQgbmjhu48uIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBjxqEgY+G6pXUgaMOgbmcgaMOzYSB04bqtcCB0cnVuZyB2w6BvIGPDoWMgbeG6t3QgaMOgbmcgdGnDqnUgZMO5bmcgcGjhu5UgYmnhur9uLg0KDQojIyAqKkJp4bq/biBQcm9kdWN0IENhdGVnb3J5KioNCg0KIyMjICoqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSkNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KS9zdW0odGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSkpDQpgYGANCg0KIyMjICoqVuG6vSBiaeG7gXUgxJHhu5MgY+G7mXQqKg0KDQpgYGB7cn0NCg0KIyBC4bqjbmcgdOG6p24gc3XhuqV0IC0+IGRhdGEgZnJhbWUNCmZyZXExMCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpKQ0KY29sbmFtZXMoZnJlcTEwKSA8LSBjKCJQcm9kdWN0Q2F0ZWdvcnkiLCAiQ291bnQiKQ0KDQojIFPhuq9wIHjhur9wIGdp4bqjbSBk4bqnbg0KZnJlcTEwIDwtIGZyZXExMFtvcmRlcigtZnJlcTEwJENvdW50KSwgXQ0KDQojIENoaWEgxJHDtGkgZGFuaCBzw6FjaCB0aMOgbmggcGjhu5ENCm4yIDwtIG5yb3coZnJlcTEwKQ0KbWlkMiA8LSBjZWlsaW5nKG4yIC8gMikNCg0KIyBE4buvIGxp4buHdSBjaG8gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldCAobuG7rWEgdHLDqm4gdGhlbyB04bqnbiBzdeG6pXQpDQp0b3AyIDwtIGhlYWQoZnJlcTEwLCBtaWQyKQ0KDQpwbG90MTIgPC0gZ2dwbG90KHRvcDIsIGFlcyh4ID0gUHJvZHVjdENhdGVnb3J5LCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0Y0QTQ2MCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gNikpDQoNCiMgROG7ryBsaeG7h3UgY2hvIGJp4buDdSDEkeG7kyB0aOG7qSBoYWkgKG7hu61hIGTGsOG7m2kgdGhlbyB04bqnbiBzdeG6pXQpDQpib3R0b20yIDwtIHRhaWwoZnJlcTEwLCBuMiAtIG1pZDIpDQoNCnBsb3QyMSA8LSBnZ3Bsb3QoYm90dG9tMiwgYWVzKHggPSBQcm9kdWN0Q2F0ZWdvcnksIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjODlDRkYwIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSA2KSkNCg0KIyBHaMOpcCBoYWkgYmnhu4N1IMSR4buTDQpwbG90MTIgKyBwbG90MjENCg0KYGBgDQoNCg0KKipOaOG6rW4geMOpdDoqKg0KDQotIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIG5ow7NtIHPhuqNuIHBo4bqpbSBwaOG7lSBiaeG6v24gbmjhuqV0IGzDoCBWZWdldGFibGVzIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpWyJWZWdldGFibGVzIl1gIHPhuqNuIHBo4bqpbSwgY2hp4bq/bSBraG/huqNuZyBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KVsiVmVnZXRhYmxlcyJdIC8gc3VtKHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpKSwgMilgJSB04buVbmcgc+G7kSBxdWFuIHPDoXQuIFRoZW8gc2F1IGzDoCBTbmFjayBGb29kcyB24bubaSBgciB0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KVsiU25hY2sgRm9vZHMiXWAgc+G6o24gcGjhuqltICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSlbIlNuYWNrIEZvb2RzIl0gLyBzdW0odGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSkpLCAyKWAlKSwgRnJ1aXQgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpWyJGcnVpdCJdYCksIHbDoCBNZWF0IChgciB0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KVsiTWVhdCJdYCkuIE5nxrDhu6NjIGzhuqFpLCBjw6FjIG5ow7NtIMOtdCBwaOG7lSBiaeG6v24gbmjhuqV0IGfhu5NtIENhbm5lZCBPeXN0ZXJzIChgciB0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KVsiQ2FubmVkIE95c3RlcnMiXWApLCBDYW5uZWQgU2FyZGluZXMgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpWyJDYW5uZWQgU2FyZGluZXMiXWApLCB2w6AgQ2FuZHkgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpWyJDYW5keSJdYCksIG3hu5dpIG5ow7NtIGPDsyBjaMawYSDEkeG6v24gNTAgcXVhbiBzw6F0LCBjaGnhur9tIHThu7cgbOG7hyBy4bqldCBuaOG7jyB0cm9uZyB04buVbmcgdGjhu4MgZOG7ryBsaeG7h3UuDQotIEJp4buDdSDEkeG7kyBj4buZdCBiw6puIHRyw6FpIGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIGtow7RuZyDEkeG7k25nIMSR4buBdSwgbuG7lWkgYuG6rXQgbmjhuqV0IGzDoCBoYWkgbmjDs20gVmVnZXRhYmxlcyB2w6AgU25hY2sgRm9vZHMgduG7m2kgc+G7kSBsxrDhu6NuZyB2xrDhu6N0IHRy4buZaSBzbyB24bubaSBjw6FjIG5ow7NtIGtow6FjLiBCaeG7g3UgxJHhu5MgY+G7mXQgYsOqbiBwaOG6o2kgY3VuZyBj4bqlcCB0aMOqbSBnw7NjIG5ow6xuIGNoaSB0aeG6v3QgaMahbiB24buBIGPDoWMgbmjDs20gY8OzIHThuqduIHN14bqldCB0aOG6pXAsIGNobyB0aOG6pXkgc+G7sSDEkWEgZOG6oW5nIG5oxrBuZyBwaMOibiB0w6FuIG5o4buPIGzhursgZ2nhu69hIG5oaeG7gXUgZGFuaCBt4bulYy4gDQoNClThu5VuZyBxdWFuLCBk4buvIGxp4buHdSB04bqtcCB0cnVuZyBjaOG7pyB54bq/dSB2w6BvIGPDoWMgbeG6t3QgaMOgbmcgcmF1IGPhu6csIMSR4buTIMSDbiBuaOG6uSB2w6AgdGjhu7FjIHBo4bqpbSB0xrDGoWkgc+G7kW5nLCBwaOG6o24gw6FuaCB4dSBoxrDhu5tuZyB0acOqdSBkw7luZyBjaMOtbmguIE5o4buvbmcgbmjDs20gY8OybiBs4bqhaSB0dXkgbmhp4buBdSB24buBIGNo4bunbmcgbG/huqFpIG5oxrBuZyBjaGnhur9tIHThu7cgdHLhu41uZyBraMO0bmcgbOG7m24gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UuDQoNCg0KIyAqKlBI4bqmTiAzOiDGr+G7mkMgTMav4buiTkcgS0hP4bqiTkcgVsOAIEtJ4buCTSDEkOG7ik5IIEdJ4bqiIFRIVVnhur5UIENITyBU4bu2IEzhu4YqKiANCg0KIyMgKipCaeG6v24gR2VuZGVyKioNCg0KIyMjICoqTeG7pWMgdGnDqnUqKg0KDQpUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIMSR4buDIHjDoWMgxJHhu4tuaCB4ZW0gdOG7tyBs4buHIG7hu68gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgY8OzIGtow6FjIGJp4buHdCBzbyB24bubaSA1MCUgaGF5IGtow7RuZy4NCg0KKipE4buvIGxp4buHdSB2w6AgYmnhur9uIHF1YW4gdMOibSoqDQoNCi0gQmnhur9uIHF1YW4gdMOibTogYEdlbmRlcmANCi0gSOG6oW5nIG3hu6VjIHF1YW4gdMOibTogYCJGImAgKEZlbWFsZSkNCg0KIyMjICoqVMOtbmggdG/DoW4gdOG7tyBs4buHIG3huqt1KioNCg0KYGBge3J9DQojIFPhu5EgbMaw4bujbmcgbuG7ryB0cm9uZyBk4buvIGxp4buHdQ0Kc3VtRiA8LSBzdW0oZGF0YURUJEdlbmRlciA9PSAiRiIpDQoNCiMgVOG7lW5nIHPhu5EgY8OhIHRo4buDIHRyb25nIGThu68gbGnhu4d1DQpzdW1HZW5kZXIgPC0gbGVuZ3RoKGRhdGFEVCRHZW5kZXIpDQpgYGANCg0KIyMjICoqVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCB04bu3IGzhu4cgMSBt4bqrdSoqDQoNCkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOg0KDQotICoqSDA6KiogVOG7tyBs4buHIG7hu68gYuG6sW5nIDAuNQ0KLSAqKkgxOioqIFThu7cgbOG7hyBu4buvIGtow6FjIDAuNSANCg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UgduG7m2kgZ2nhuqMgdGh1eeG6v3QgcCA9IDAuNQ0KcHJvcC50ZXN0KHggPSBzdW1GLCBuID0gc3VtR2VuZGVyLCBwID0gMC41LCBjb25mLmxldmVsID0gMC45NSwgY29ycmVjdCA9IFRSVUUpDQpgYGANCg0KIyMjICoqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkOiA1LjU3NjUNCi0gQuG6rWMgdOG7sSBkbyAoZGYpOiAxDQotIHAtdmFsdWU6IDAuMDE4Mg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbuG7rzogKDAuNTAxNywgMC41MTgzKQ0KLSDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIG7hu68gdOG7qyBt4bqrdTogMC41MDk5OSAodOG7qWMgfjUxJSkNCg0KKipL4bq/dCBsdeG6rW46KioNCg0KVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCB2w6wgcC12YWx1ZSA9IDAuMDE4MiA8IDAuMDUsIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMC5L4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBu4buvIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGtow6FjIDUwJSBt4buZdCBjw6FjaCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQotLS0NCg0KIyMgKipCaeG6v24gTWFyaXRhbFN0YXR1cyoqDQoNCiMjIyAqKk3hu6VjIHRpw6p1KioNCg0KVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCDEkeG7gyB4w6FjIMSR4buLbmggeGVtICoqdOG7tyBs4buHIGtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4gKE1hcnJpZWQpIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGPDsyBraMOhYyBiaeG7h3Qgc28gduG7m2kgNTAlIGhheSBraMO0bmcqKi4NCg0KKipE4buvIGxp4buHdSB2w6AgYmnhur9uIHF1YW4gdMOibSoqDQoNCi0gQmnhur9uIHF1YW4gdMOibTogYE1hcml0YWxTdGF0dXNgDQotIEjhuqFuZyBt4bulYyBxdWFuIHTDom06IGAiTSJgIChNYXJyaWVkKQ0KDQojIyMgKipUw61uaCB0b8OhbiB04bu3IGzhu4cgbeG6q3UqKg0KDQpgYGB7cn0NCiMgU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIHRyb25nIGThu68gbGnhu4d1DQpzdW1NIDwtIHN1bShkYXRhRFQkTWFyaXRhbFN0YXR1cyA9PSAiTSIpDQoNCiMgVOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nIHRyb25nIGThu68gbGnhu4d1DQpzdW1NYXJpdGFsIDwtIGxlbmd0aChkYXRhRFQkTWFyaXRhbFN0YXR1cykNCmBgYA0KDQojIyMgKipLaeG7g20gxJHhu4tuaCB04bu3IGzhu4cgMSBt4bqrdSoqDQoNCkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOg0KDQotICoqSDA6KiogVOG7tyBs4buHIGtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4gYuG6sW5nIDAuNQ0KLSAqKkgxOioqIFThu7cgbOG7hyBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIGtow6FjIDAuNSANCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHThu7cgbOG7hyAxIG3huqt1IHbhu5tpIGdp4bqjIHRodXnhur90IHAgPSAwLjUNCnByb3AudGVzdCh4ID0gc3VtTSwgbiA9IHN1bU1hcml0YWwsIHAgPSAwLjUsIGNvbmYubGV2ZWwgPSAwLjk1LCBjb3JyZWN0ID0gVFJVRSkNCmBgYA0KDQojIyMgKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQ6IGByIHJvdW5kKHByb3AudGVzdChzdW1NLCBzdW1NYXJpdGFsLCBwID0gMC41LCBjb3JyZWN0ID0gVFJVRSkkc3RhdGlzdGljLCA0KWANCi0gQuG6rWMgdOG7sSBkbyAoZGYpOiAxDQotIHAtdmFsdWU6IGByIHJvdW5kKHByb3AudGVzdChzdW1NLCBzdW1NYXJpdGFsLCBwID0gMC41LCBjb3JyZWN0ID0gVFJVRSkkcC52YWx1ZSwgNClgDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyDEkcOjIGvhur90IGjDtG46IGByIHBhc3RlMCgiKCIsIA0KICAgIHJvdW5kKHByb3AudGVzdChzdW1NLCBzdW1NYXJpdGFsLCBwID0gMC41LCBjb3JyZWN0ID0gVFJVRSkkY29uZi5pbnRbMV0sIDQpLCAiLCAiLCANCiAgICByb3VuZChwcm9wLnRlc3Qoc3VtTSwgc3VtTWFyaXRhbCwgcCA9IDAuNSwgY29ycmVjdCA9IFRSVUUpJGNvbmYuaW50WzJdLCA0KSwgIikiKWANCi0gxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyDEkcOjIGvhur90IGjDtG4gdOG7qyBt4bqrdTogYHIgcm91bmQocHJvcC50ZXN0KHN1bU0sIHN1bU1hcml0YWwsIHAgPSAwLjUsIGNvcnJlY3QgPSBUUlVFKSRlc3RpbWF0ZSwgNSlgICh04bupYyB+YHIgcm91bmQoMTAwICogc3VtTSAvIHN1bU1hcml0YWwsIDIpYCUpDQoNCg0KKipL4bq/dCBsdeG6rW46KioNCg0KVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlICjOsSA9IDAuMDUpLCB2w6wgcC12YWx1ZSA9IDAuMDA1OTcgPCAwLjA1LCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIMSRw6Mga+G6v3QgaMO0biB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBraMOhYyA1MCUgbeG7mXQgY8OhY2ggY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gQ+G7pSB0aOG7gywgdOG7tyBs4buHIGvhur90IGjDtG4gdHJvbmcgbeG6q3UgbMOgIGtob+G6o25nIDQ4Ljg0JSwgdGjhuqVwIGjGoW4gNTAlLg0KDQoNCi0tLQ0KDQojIyAqKkJp4bq/biBIb21lb3duZXIqKg0KDQojIyMgKipN4bulYyB0acOqdSoqDQoNClRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggxJHhu4MgeMOhYyDEkeG7i25oIHhlbSAqKnThu7cgbOG7hyBraMOhY2ggaMOgbmcgY8OzIG5ow6AgKEhvbWVvd25lciA9ICJZIikgY8OzIGtow6FjIGJp4buHdCBzbyB24bubaSA1MCUgaGF5IGtow7RuZyoqLg0KDQoNCioqROG7ryBsaeG7h3UgdsOgIGJp4bq/biBxdWFuIHTDom0qKg0KDQotIEJp4bq/biBxdWFuIHTDom06IGBIb21lb3duZXJgICANCi0gSOG6oW5nIG3hu6VjIHF1YW4gdMOibTogYCJZImAgKEPDsyBuaMOgKQ0KDQoNCiMjIyAqKlTDrW5oIHRvw6FuIHThu7cgbOG7hyBt4bqrdSoqDQoNCmBgYHtyfQ0KIyBT4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBjw7MgbmjDoA0Kc3VtWSA8LSBzdW0oZGF0YURUJEhvbWVvd25lciA9PSAiWSIpDQoNCiMgVOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nDQpzdW1Ib21lb3duZXIgPC0gbGVuZ3RoKGRhdGFEVCRIb21lb3duZXIpDQpgYGANCg0KIyMjICoqS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UqKg0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KLSAqKkgwOioqIFThu7cgbOG7hyBraMOhY2ggaMOgbmcgY8OzIG5ow6AgYuG6sW5nIDAuNQ0KLSAqKkgxOioqIFThu7cgbOG7hyBraMOhY2ggaMOgbmcgY8OzIG5ow6Aga2jDoWMgMC41IA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UgduG7m2kgZ2nhuqMgdGh1eeG6v3QgcCA9IDAuNQ0KcHJvcC50ZXN0KHggPSBzdW1ZLCBuID0gc3VtSG9tZW93bmVyLCBwID0gMC41LCBjb25mLmxldmVsID0gMC45NSwgY29ycmVjdCA9IFRSVUUpDQpgYGANCg0KIyMjICoqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkIGzDoCA1NjguODYsIHbhu5tpIDEgYuG6rWMgdOG7sSBkby4NCg0KLSBHacOhIHRy4buLIHAtdmFsdWUgPCAyLjJlLTE2LCBy4bqldCBuaOG7jyBoxqFuIG5oaeG7gXUgc28gduG7m2kgbeG7qWMgw70gbmdoxKlhIHRow7RuZyB0aMaw4budbmcgMC4wNS4NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyBuaMOgIGzDoCAoMC41OTI1LCAwLjYwODcpLg0KDQotIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyBuaMOgIHRyb25nIG3huqt1IGzDoCAwLjYwMDYgKHThu6ljIGtob+G6o25nIDYwLjA2JSkuDQoNCioqS+G6v3QgbHXhuq1uKioNCg0KVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlICjOsSA9IDAuMDUpLCB2w6wgcC12YWx1ZSA8IDIuMmUtMTYgPCAwLjA1LCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAuxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgc+G7nyBo4buvdSBuaMOgIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGtow6FjIDUwJSBt4buZdCBjw6FjaCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLkPhu6UgdGjhu4MsIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgdHJvbmcgbeG6q3UgbMOgIGtob+G6o25nIDYwLjA2JSwgY2FvIGjGoW4gNTAlLg0KDQoNCi0tLQ0KDQojICoqUEjhuqZOIDQ6IFBIw4JOIFTDjUNIIE3hu5BJIFFVQU4gSOG7hiBHSeG7rkEgSEFJIEJJ4bq+TiDEkOG7ik5IIFTDjU5IKiogDQoNCiMjICoqQ+G6t3AgYmnhur9uOiBNYXJpdGFsU3RhdHVzIHbDoCBIb21lb3duZXIqKg0KDQojIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBj4bq3cCBiaeG6v24gTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyKioNCg0KIyMjIyAqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioNCmBgYHtyfQ0KbWFyaXRhbF9ob21lb3duZXIgPC0gdGFibGUoZGF0YURUJE1hcml0YWxTdGF0dXMsIGRhdGFEVCRIb21lb3duZXIpDQptYXJpdGFsX2hvbWVvd25lcg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqS2jDoWNoIGjDoG5nIMSRw6Mga+G6v3QgaMO0biAoTSkqKjogQ8OzIHThu5tpIDUxNDcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIOG7nywgY2hp4bq/bSBwaOG6p24gbOG7m24gdHJvbmcgbmjDs20gbsOgeSwgdHJvbmcga2hpIGNo4buJIGPDsyAxNzE5IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AuDQoNCi0gKipLaMOhY2ggaMOgbmcgxJHhu5ljIHRow6JuIChTKSoqOiBOZ8aw4bujYyBs4bqhaSwgbmjDs20gbsOgeSBjw7MgeHUgaMaw4bubbmcga2jDtG5nIHPhu58gaOG7r3UgbmjDoCDhu58gY2FvIGjGoW4gduG7m2kgMzg5NiBuZ8aw4budaSwgdHJvbmcga2hpIHPhu5EgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGNo4buJIGzDoCAzMjk3IG5nxrDhu51pLg0KDQotICoqU28gc8OhbmggZ2nhu69hIGhhaSBuaMOzbSoqOg0KDQogIC0gTmjDs20gxJHDoyBr4bq/dCBow7RuIGPDsyB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIOG7nyBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaMOzbSDEkeG7mWMgdGjDom4uDQoNCiAgLSBOaMOzbSDEkeG7mWMgdGjDom4gY8OzIHPhu5EgbMaw4bujbmcga2jDtG5nIHPhu58gaOG7r3UgbmjDoCDhu58gdsaw4bujdCB0cuG7mWksIGNobyB0aOG6pXkgeHUgaMaw4bubbmcgY2jGsGEg4buVbiDEkeG7i25oIHbhu4EgdMOgaSBjaMOtbmggaG/hurdjIGN14buZYyBz4buRbmcgZ2lhIMSRw6xuaC4NCg0KIyMjIyAqKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qKg0KDQpgYGB7cn0NCnByb3AudGFibGUobWFyaXRhbF9ob21lb3duZXIpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gTmjDs20ga2jDoWNoIGjDoG5nIMSRw6Mga+G6v3QgaMO0biBz4bufIGjhu691IG5ow6AgY2hp4bq/bSB04bu3IHRy4buNbmcgbOG7m24gbmjhuqV0IHRyb25nIHRvw6BuIGLhu5kgZOG7ryBsaeG7h3UgKDM2LjYxJSksIGNobyB0aOG6pXkgxJHDonkgbMOgIG5ow7NtIGPDsyB4dSBoxrDhu5tuZyDhu5VuIMSR4buLbmggduG7gSB0w6BpIGNow61uaCB2w6AgY2jhu5cg4bufLg0KDQotIEtow6FjaCBow6BuZyDEkeG7mWMgdGjDom4ga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBjxaluZyBjaGnhur9tIHThu7cgdHLhu41uZyBraMOhIGzhu5tuICgyNy43MSUpLCBwaOG6o24gw6FuaCBwaOG6p24gbsOgbyBz4buxIGNoxrBhIOG7lW4gxJHhu4tuaCB24buBIHTDoGkgc+G6o24gaG/hurdjIGdpYWkgxJFv4bqhbiDEkeG6p3UgdHJvbmcgY2h1IGvhu7Mgc+G7kW5nIGPDoSBuaMOibi4NCg0KTmjDrG4gY2h1bmcsIGThu68gbGnhu4d1IGNobyB0aOG6pXkgbeG7kWkgbGnDqm4gaOG7hyDEkcOhbmcgY2jDuiDDvSBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCBxdXnhu4FuIHPhu58gaOG7r3UgbmjDoCDhu58sIHRyb25nIMSRw7Mgdmnhu4djIMSRw6Mga+G6v3QgaMO0biB0aMaw4budbmcgxJFpIGvDqG0gduG7m2kgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbi4NCg0KIyMjIyAqKlbhur0gxJHhu5MgdGjhu4sqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQojIENodXnhu4NuIMSR4buVaSBk4buvIGxp4buHdSBzYW5nIGThuqFuZyBkYXRhIGZyYW1lDQpkZl9tYXJpdGFsX2hvbWVvd25lciA8LSBhcy5kYXRhLmZyYW1lKG1hcml0YWxfaG9tZW93bmVyKQ0KY29sbmFtZXMoZGZfbWFyaXRhbF9ob21lb3duZXIpIDwtIGMoIk1hcml0YWxTdGF0dXMiLCAiSG9tZW93bmVyIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbQ0KZ2dwbG90KGRmX21hcml0YWxfaG9tZW93bmVyLCBhZXMoeCA9IEhvbWVvd25lciwgeSA9IENvdW50LCBmaWxsID0gTWFyaXRhbFN0YXR1cykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIHRoZW8gSG9tZW93bmVyIHbDoCBNYXJpdGFsIFN0YXR1cyIsIA0KICAgICAgIHggPSAiVMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6AiLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKSsNCiAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqS2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgbmjDs20gaMO0biBuaMOibioqOiBLaMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIChgTWApIGPDsyBz4buRIGzGsOG7o25nIHPhu58gaOG7r3UgbmjDoCAoYFlgKSB2xrDhu6N0IHRy4buZaSAoaMahbiA1MDAwIG5nxrDhu51pKSwgdHJvbmcga2hpIGtow6FjaCBow6BuZyDEkeG7mWMgdGjDom4gKGBTYCkgbOG6oWkgY2jhu6cgeeG6v3UgdGh14buZYyBuaMOzbSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIChgTmApLCB24bubaSBraG/huqNuZyAzOTAwIG5nxrDhu51pLg0KDQotICoqWHUgaMaw4bubbmcg4buVbiDEkeG7i25oIHTDoGkgY2jDrW5oIGtoaSBr4bq/dCBow7RuKio6IE5ow7NtIMSRw6Mga+G6v3QgaMO0biBjw7MgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBjYW8sIHBo4bqjbiDDoW5oIHPhu7Eg4buVbiDEkeG7i25oIHbhu4EgdMOgaSBjaMOtbmggaG/hurdjIG5odSBj4bqndSDhu5VuIMSR4buLbmggbsahaSDhu58gY2hvIGdpYSDEkcOsbmguIE5nxrDhu6NjIGzhuqFpLCBuaMOzbSDEkeG7mWMgdGjDom4gY8OzIHThu7cgbOG7hyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuLCBjw7MgdGjhu4MgZG8gxrB1IHRpw6puIGxpbmggaG/huqF0LCBjaMawYSDhu5VuIMSR4buLbmggY3Xhu5ljIHPhu5FuZy4NCg0KLSAqKlPhu7EgY2jDqm5oIGzhu4djaCB0cm9uZyBuaMOzbSBraMO0bmcgc+G7nyBo4buvdSBuaMOgKio6IFRyb25nIG5ow7NtIGtow7RuZyBz4bufIGjhu691IG5ow6AgKGBOYCksIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIMSR4buZYyB0aMOibiBn4bqnbiBn4bqlcCDEkcO0aSBzbyB24bubaSBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuLg0KDQotICoqTeG7kWkgbGnDqm4gaOG7hyB0aeG7gW0gbsSDbmcqKjogQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPDsyB0aOG7gyBsacOqbiBxdWFuIMSR4bq/biB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIOKAkyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHh1IGjGsOG7m25nIHPhu58gaOG7r3UgbmjDoCBuaGnhu4F1IGjGoW4uDQoNCkJp4buDdSDEkeG7kyBn4bujaSDDvSBy4bqxbmcgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54buBbiBz4bufIGjhu691IG5ow6AuIFR1eSBuaGnDqm4sIMSR4buDIHjDoWMgxJHhu4tuaCBt4buRaSBsacOqbiBo4buHIG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nLCBj4bqnbiB0aOG7sWMgaGnhu4duIHRow6ptIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZy4NCg0KIyMjICoqS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6oqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOjoqKg0KDQotICoqSDA6KiogSGFpIGJp4bq/biBNYXJpdGFsU3RhdHVzIHbDoCBIb21lb3duZXIgxJHhu5ljIGzhuq1wDQoNCi0gKipIMToqKiBIYWkgYmnhur9uIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lciBjw7MgbeG7kWkgbGnDqm4gaOG7hw0KDQoqKlRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLSBiw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KY2hpc3FfcmVzdWx0MSA8LSBjaGlzcS50ZXN0KG1hcml0YWxfaG9tZW93bmVyKQ0KY2hpc3FfcmVzdWx0MQ0KYGBgDQoNCiMjIyAqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktYsOsbmggcGjGsMahbmc6IFgtc3F1YXJlZCA9IDEyNDEuMg0KDQotIELhuq1jIHThu7EgZG86IGRmID0gMQ0KDQotIEdpw6EgdHLhu4sgcDogcC12YWx1ZSA8IDIuMmUtMTYNCg0KIyMjICoqS+G6v3QgbHXhuq1uOioqDQoNCi0gVsOsIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDUpLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIEgwLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgLg0KDQotIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGPhu6duZyBj4buRIGNobyBuaOG6rW4gxJHhu4tuaCB0csaw4bubYyDEkcOzIHThu6sgYmnhu4N1IMSR4buTOiBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyBz4bufIGjhu691IG5ow6Agbmhp4buBdSBoxqFuIHNvIHbhu5tpIGtow6FjaCBow6BuZyDEkeG7mWMgdGjDom4uIE3hu5FpIHF1YW4gaOG7hyBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBjw6FjIHnhur91IHThu5Ega2luaCB04bq/IOKAkyB4w6MgaOG7mWkgbmjGsDoNCg0KIC0gTmjhu69uZyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdGjGsOG7nW5nIGPDsyBuaHUgY+G6p3Ug4buVbiDEkeG7i25oIG7GoWkg4bufIHbDoCBraOG6oyBuxINuZyB0w6BpIGNow61uaCBjYW8gaMahbiAoZG8gdGh1IG5o4bqtcCBo4buZIGdpYSDEkcOsbmggZ+G7mXAgbOG6oWkpLg0KDQogLSBOZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIHRo4buDIMawdSB0acOqbiB0w61uaCBsaW5oIGhv4bqhdCwgaG/hurdjIMSRYW5nIHRyb25nIGdpYWkgxJFv4bqhbiBjaMawYSDhu5VuIMSR4buLbmggc+G7sSBuZ2hp4buHcCBoYXkgdGh1IG5o4bqtcC4NCg0KIyMgKipD4bq3cCBiaeG6v246IEdlbmRlciB2w6AgUHJvZHVjdEZhbWlseSoqDQoNCiMjIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGPhurdwIGJp4bq/biBHZW5kZXIgdsOgIFByb2R1Y3RGYW1pbHkqKg0KDQojIyMjICoqQuG6o25nIHThuqduIHPhu5EgY2jDqW8qKg0KYGBge3J9DQpnZW5kZXJfZmFtaWx5IDwtIHRhYmxlKGRhdGFEVCRHZW5kZXIsIGRhdGFEVCRQcm9kdWN0RmFtaWx5KQ0KZ2VuZGVyX2ZhbWlseQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpD4bqjIG5hbSB2w6AgbuG7ryDEkeG7gXUgY8OzIHh1IGjGsOG7m25nIHRpw6p1IGTDuW5nIHTGsMahbmcgdOG7sSBuaGF1LCB0cm9uZyDEkcOzIG5ow7NtIHPhuqNuIHBo4bqpbSBGb29kIGzDoCDEkcaw4bujYyBs4buxYSBjaOG7jW4gbmhp4buBdSBuaOG6pXQuDQoNCi0gS2jDoWNoIGjDoG5nIG7hu68gKEYpIG11YSA1MTQ5IHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtIEZvb2QsIGNhbyBuaOG6pXQgdHJvbmcgYmEgbmjDs20sIHRp4bq/cCB0aGVvIGzDoCBOb24tQ29uc3VtYWJsZSAoMTM1MikgdsOgIHRo4bqlcCBuaOG6pXQgbMOgIERyaW5rICg2NjkpLg0KDQotIEtow6FjaCBow6BuZyBuYW0gKE0pIGPFqW5nIGPDsyB4dSBoxrDhu5tuZyB0xrDGoW5nIHThu7EgduG7m2kgNTAwNCBsxrDhu6N0IG11YSBGb29kLCB0aeG6v3AgxJHhur9uIGzDoCBOb24tQ29uc3VtYWJsZSAoMTMwNCkgdsOgIERyaW5rICg1ODEpLg0KDQpOaMOsbiBjaHVuZywgbmjDs20gRm9vZCBjaGnhur9tIHThu7cgbOG7hyBs4bubbiBuaOG6pXQg4bufIGPhuqMgaGFpIGdp4bubaSwgY2hvIHRo4bqleSDEkcOieSBsw6AgbmjDs20gc+G6o24gcGjhuqltIHBo4buVIGJp4bq/biBuaOG6pXQuIFRyb25nIGtoaSDEkcOzLCBuaMOzbSBEcmluayBjw7Mgc+G7kSBsxrDhu6N0IG11YSB0aOG6pXAgbmjhuqV0LCBwaOG6o24gw6FuaCBt4bupYyDEkeG7mSBxdWFuIHTDom0gaG/hurdjIG5odSBj4bqndSB0acOqdSBkw7luZyB0aOG6pXAgaMahbiDEkeG7kWkgduG7m2kgbG/huqFpIHPhuqNuIHBo4bqpbSBuw6B5LiBT4buxIGtow6FjIGJp4buHdCBuaOG7jyBnaeG7r2EgaGFpIGdp4bubaSBjaG8gdGjhuqV5IGjDoG5oIHZpIGzhu7FhIGNo4buNbiBz4bqjbiBwaOG6qW0gdGhlbyBnaeG7m2kgdMOtbmggY8OzIHRo4buDIHThu5NuIHThuqFpIG3hu5l0IHPhu5Ega2jDoWMgYmnhu4d0IG5o4bq5LCBj4bqnbiDEkcaw4bujYyBraeG7g20gY2jhu6luZyBi4bqxbmcgcGjDom4gdMOtY2ggdGjhu5FuZyBrw6ogdGnhur9wIHRoZW8uDQoNCiMjIyMgKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioNCg0KYGBge3J9DQpwcm9wLnRhYmxlKGdlbmRlcl9mYW1pbHkpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCkvhur90IHF14bqjIHRyb25nIGLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gY2hvIHRo4bqleToNCg0KLSBUcm9uZyB04buVbmcgc+G7kSBraMOhY2ggaMOgbmcgbXVhIGjDoG5nLCBraG/huqNuZyA0Ljc2JSBsw6Aga2jDoWNoIGjDoG5nIG7hu68gKEYpIG11YSBz4bqjbiBwaOG6qW0gbmjDs20gRHJpbmssIHbDoCBraG/huqNuZyA0LjEzJSBsw6Aga2jDoWNoIGjDoG5nIG5hbSAoTSkgbXVhIG5ow7NtIG7DoHkuDQoNCi0gTmjDs20gc+G6o24gcGjhuqltIEZvb2QgbMOgIG5ow7NtIMSRxrDhu6NjIG11YSBuaGnhu4F1IG5o4bqldCwgY2hp4bq/bSBraG/huqNuZyAzNi42MiUgdOG7lW5nIHPhu5EgZ2lhbyBk4buLY2ggdOG7qyBu4buvIHbDoCAzNS41OSUgdOG7qyBuYW0uDQoNCi0gTmjDs20gTm9uLUNvbnN1bWFibGUgY2hp4bq/bSBraG/huqNuZyA5LjYyJSB04buVbmcgc+G7kSBnaWFvIGThu4tjaCB04burIG7hu68gdsOgIDkuMjglIHThu6sgbmFtLg0KDQpOaMawIHbhuq15LCBuaMOzbSBz4bqjbiBwaOG6qW0gRm9vZCBjaGnhur9tIHThu7cgbOG7hyBs4bubbiBuaOG6pXQgdHJvbmcgdOG7lW5nIHRo4buDIHPhu5EgbMaw4bujdCBtdWEgY+G7p2EgY+G6oyBoYWkgZ2nhu5tpLCBwaOG6o24gw6FuaCBz4buxIHBo4buVIGJp4bq/biB2w6Agbmh1IGPhuqd1IGNhbyDEkeG7kWkgduG7m2kgbmjDs20gc+G6o24gcGjhuqltIG7DoHkuIE3hu6ljIMSR4buZIG11YSBow6BuZyBj4bunYSBuYW0gdsOgIG7hu68g4bufIGPDoWMgbmjDs20gc+G6o24gcGjhuqltIGPDsyBz4buxIHTGsMahbmcgxJHhu5NuZyBraMOhIGzhu5tuLCBjaG8gdGjhuqV5IGjDoG5oIHZpIHRpw6p1IGTDuW5nIGdp4buvYSBoYWkgZ2nhu5tpIHRyb25nIGPDoWMgbmjDs20gc+G6o24gcGjhuqltIG7DoHkgdMawxqFuZyDEkeG7kWkgxJHhu5NuZyDEkeG7gXUuIFR1eSBuaGnDqm4sIG5ow7NtIERyaW5rIGPDsyB04bu3IGzhu4cgdGjhuqVwIG5o4bqldCB0cm9uZyB04buVbmcgdGjhu4MgbMaw4bujdCBtdWEsIGNobyB0aOG6pXkgbmjDs20gc+G6o24gcGjhuqltIG7DoHkgw610IMSRxrDhu6NjIGzhu7FhIGNo4buNbiBoxqFuLg0KDQojIyMjICoqVuG6vSDEkeG7kyB0aOG7iyoqDQpgYGB7cn0NCg0KIyBDaHV54buDbiDEkeG7lWkgZOG7ryBsaeG7h3Ugc2FuZyBk4bqhbmcgZGF0YSBmcmFtZQ0KZGZfZ2VuZGVyX2ZhbWlseSA8LSBhcy5kYXRhLmZyYW1lKGdlbmRlcl9mYW1pbHkpDQpjb2xuYW1lcyhkZl9nZW5kZXJfZmFtaWx5KSA8LSBjKCJHZW5kZXIiLCAiUHJvZHVjdEZhbWlseSIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgbmjDs20NCmdncGxvdChkZl9nZW5kZXJfZmFtaWx5LCBhZXMoeCA9IFByb2R1Y3RGYW1pbHksIHkgPSBDb3VudCwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlPhu5EgbMaw4bujdCBtdWEgdGhlbyBQcm9kdWN0RmFtaWx5IHbDoCBHZW5kZXIiLCANCiAgICAgICB4ID0gIlByb2R1Y3QgRmFtaWx5IiwgeSA9ICJT4buRIGzGsOG7o3QgbXVhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqWHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgdMawxqFuZyDEkeG7k25nKio6IEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IGPhuqMgbmFtIHbDoCBu4buvIMSR4buBdSBjw7MgeHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgdMawxqFuZyB04buxIG5oYXUuIOG7niBt4buXaSBuaMOzbSBz4bqjbiBwaOG6qW0sIGNoaeG7gXUgY2FvIGPhu5l0IGPhu6dhIGhhaSBnaeG7m2kgZ+G6p24gYuG6sW5nIG5oYXUsIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgbXVhIHPhuq9tIGdp4buvYSBoYWkgZ2nhu5tpIGtow7RuZyBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDLg0KDQotICoqTmjDs20gc+G6o24gcGjhuqltIEZvb2QgxJHGsOG7o2MgxrBhIGNodeG7mW5nIG5o4bqldCoqOiDEkMOieSBsw6AgbmjDs20gc+G6o24gcGjhuqltIGPDsyBz4buRIGzGsOG7o3QgbXVhIGNhbyB2xrDhu6N0IHRy4buZaSBzbyB24bubaSBoYWkgbmjDs20gY8OybiBs4bqhaSDhu58gY+G6oyBuYW0gdsOgIG7hu68uIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgdGjhu7FjIHBo4bqpbSBsw6AgY2jhu6cgeeG6v3UgdHJvbmcgdOG7lW5nIHRo4buDIGPDoWMgZ2lhbyBk4buLY2guDQoNCi0gKipEcmluayBsw6AgbmjDs20gw610IMSRxrDhu6NjIG11YSBuaOG6pXQqKjogU+G7kSBsxrDhu6N0IG11YSBuaMOzbSBEcmluayB0aOG6pXAgbmjhuqV0IOG7nyBj4bqjIGhhaSBnaeG7m2ksIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4MgY2hvIHRo4bqleSBt4bupYyDEkeG7mSDGsHUgdGnDqm4gdGjhuqVwIGjGoW4gY+G7p2Ega2jDoWNoIGjDoG5nIMSR4buRaSB24bubaSDEkeG7kyB14buRbmcgdHJvbmcgZGFuaCBzw6FjaCB0acOqdSBkw7luZy4NCg0KKipT4buxIGtow6FjIGJp4buHdCBnaeG7m2kgdMOtbmggbmjhu48qKjogVHJvbmcgdOG7q25nIG5ow7NtIHPhuqNuIHBo4bqpbSwgbuG7ryBjw7Mgc+G7kSBsxrDhu6N0IG11YSBuaOG7iW5oIGjGoW4gbmFtIG3hu5l0IGNow7p0LCBuaMawbmcga2jDtG5nIMSRw6FuZyBr4buDLiDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nIGdp4bubaSB0w61uaCBraMO0bmcgcGjhuqNpIGzDoCB54bq/dSB04buRIGNoaSBwaOG7kWkgbeG6oW5oIGjDoG5oIHZpIHRpw6p1IGTDuW5nIHRoZW8gbmjDs20gc+G6o24gcGjhuqltLCBt4bq3YyBkw7kgY8OzIHRo4buDIGPDsyBuaOG7r25nIHh1IGjGsOG7m25nIG5o4buPLg0KDQpCaeG7g3UgxJHhu5MgdHLhu7FjIHF1YW4gaOG7lyB0cuG7oyBr4bq/dCBsdeG6rW4gcuG6sW5nIGhhaSBiaeG6v24gxJHhu4tuaCB0w61uaCAiR2nhu5tpIHTDrW5oIiB2w6AgIk5ow7NtIHPhuqNuIHBo4bqpbSIgY8OzIG3hu5FpIHF1YW4gaOG7hyB0xrDGoW5nIMSR4buRaSDhu5VuIMSR4buLbmggdsOgIHTGsMahbmcgxJHhu5NuZywga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBs4bubbiBnaeG7r2EgbmFtIHbDoCBu4buvIHRyb25nIGjDoG5oIHZpIGNo4buNbiBsb+G6oWkgc+G6o24gcGjhuqltLiBUdXkgbmhpw6puLCDEkeG7gyBraOG6s25nIMSR4buLbmggbeG7kWkgbGnDqm4ga+G6v3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nLCBj4bqnbiB0aOG7sWMgaGnhu4duIHRow6ptIGPDoWMga2nhu4NtIMSR4buLbmggbmjGsCBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKENoaS1zcXVhcmUgdGVzdCkuDQoNCiMjIyAqKktp4buDbSDEkeG7i25oIHRo4buRbmcga8OqKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICoqSDA6KiogSGFpIGJp4bq/biBHZW5kZXIgdsOgIFByb2R1Y3RGYW1pbHkgxJHhu5ljIGzhuq1wDQoNCi0gKipIMToqKiBIYWkgYmnhur9uIEdlbmRlciB2w6AgUHJvZHVjdEZhbWlseSBjw7MgbeG7kWkgbGnDqm4gaOG7hw0KDQoqKlRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLSBiw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KY2hpc3FfcmVzdWx0MiA8LSBjaGlzcS50ZXN0KGdlbmRlcl9mYW1pbHkpDQpjaGlzcV9yZXN1bHQyDQpgYGANCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLWLDrG5oIHBoxrDGoW5nOiBYLXNxdWFyZWQgPSAzLjUxODUNCg0KLSBC4bqtYyB04buxIGRvOiBkZiA9IDINCg0KLSBHacOhIHRy4buLIHA6IHAtdmFsdWUgPSAwLjE3MjINCg0KDQojIyMgKipL4bq/dCBsdeG6rW4qKg0KDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAqKs6xID0gMC4wNSoqLCB0YSBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyB2w6wgZ2nDoSB0cuG7iyAqKnAgPSAwLjE3MjIgPiAwLjA1KiouDQoNCi0gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGNoxrBhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBraOG6s25nIMSR4buLbmggcuG6sW5nIGdp4bubaSB0w61uaCBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGxv4bqhaSBz4bqjbiBwaOG6qW0gxJHGsOG7o2MgY2jhu41uLiBOw7NpIGPDoWNoIGtow6FjLCBoYWkgYmnhur9uICpHZW5kZXIqIHbDoCAqUHJvZHVjdEZhbWlseSogY8OzIHRo4buDIMSRxrDhu6NjIHhlbSBsw6AgxJHhu5ljIGzhuq1wIHRyb25nIGThu68gbGnhu4d1IG7DoHkuDQoNCi0gTeG6t2MgZMO5IGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIGtow7RuZyBwaMOhdCBoaeG7h24gbeG7kWkgcXVhbiBo4buHIGPDsyDDvSBuZ2jEqWEgZ2nhu69hIGhhaSBiaeG6v24sIG5oxrBuZyBxdWEgYuG6o25nIHThuqduIHN14bqldCBjaMOpbyB2w6AgYmnhu4N1IMSR4buTIG1pbmggaOG7jWEsIHRhIHbhuqtuIGPDsyB0aOG7gyBxdWFuIHPDoXQgxJHGsOG7o2MgbeG7mXQgc+G7kSB4dSBoxrDhu5tuZyBuaOG7jyBuaMawOg0KDQogLSBD4bqjICoqbmFtKiogdsOgICoqbuG7ryoqIMSR4buBdSBjaOG7jW4gbmjDs20gc+G6o24gcGjhuqltICoqRm9vZCoqIG5oaeG7gXUgbmjhuqV0LCB0aeG6v3AgdGhlbyBsw6AgKipOb24tQ29uc3VtYWJsZSoqLCB2w6Agw610IG5o4bqldCBsw6AgKipEcmluayoqLg0KDQogLSBT4buRIGzGsOG7o3QgbXVhIGdp4buvYSBuYW0gdsOgIG7hu68g4bufIHThu6tuZyBuaMOzbSBz4bqjbiBwaOG6qW0gY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBuaOG6uSwgdHV5IG5oacOqbiwgbeG7qWMgxJHhu5kga2jDoWMgYmnhu4d0IG7DoHkgY2jGsGEgxJHhu6cgbOG7m24gxJHhu4MgdHLhu58gbsOqbiBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpEbyDEkcOzLCBt4bq3YyBkw7kga+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSB0w61uaCDEkeG7mWMgbOG6rXAgZ2nhu69hIGhhaSBiaeG6v24sIG5oxrBuZyB2aeG7h2Mga2jDoW0gcGjDoSB4dSBoxrDhu5tuZyBow6BuaCB2aSB0acOqdSBkw7luZyB0aGVvIGdp4bubaSB0w61uaCB24bqrbiBjw7MgdGjhu4MgaOG7r3Ugw61jaCBraGkgcGjDom4gdMOtY2ggc8OidSBoxqFuIGhv4bq3YyBt4bufIHLhu5luZyBt4bqrdSBk4buvIGxp4buHdSB0cm9uZyBjw6FjIG5naGnDqm4gY+G7qXUgdGnhur9wIHRoZW8uDQoNCiMjICoqQ+G6t3AgYmnhur9uOiBIb21lb3duZXIgdsOgIEFubnVhbEluY29tZSoqDQoNCiMjIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGPhurdwIGJp4bq/biBIb21lb3duZXIgdsOgIEFubnVhbEluY29tZSoqDQoNCiMjIyMgKipC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyoqDQpgYGB7cn0NCmhvbWVfaW5jb21lIDwtIHRhYmxlKGRhdGFEVCRIb21lb3duZXIsIGRhdGFEVCRBbm51YWxJbmNvbWUpDQpob21lX2luY29tZQ0KYGBgDQoqKk5o4bqtbiB4w6l0OioqDQoNCkvhur90IHF14bqjIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCAoSG9tZW93bmVyID0gWSkgdsOgIGtow7RuZyBz4bufIGjhu691IG5ow6AgKEhvbWVvd25lciA9IE4pIHRoZW8gY8OhYyBuaMOzbSB0aHUgbmjhuq1wIGjhurFuZyBuxINtLiBU4burIMSRw7MsIHRhIGPDsyB0aOG7gyByw7p0IHJhIG3hu5l0IHPhu5Egbmjhuq1uIHjDqXQgcXVhbiB0cuG7jW5nOg0KDQotIE5ow7NtIHRodSBuaOG6rXAgKiokMTBLIOKAkyAkMzBLKiogbMOgIG5ow7NtIGPDsyBz4buRIGzGsOG7o25nIGPDoSBuaMOibiBraMOhIGzhu5tuLiDEkMOhbmcgY2jDuiDDvSwgc+G7kSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgKDEuNzMxKSB2xrDhu6N0IHF1YSBz4buRIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691ICgxLjM1OSksIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyDhu58gbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgbmjhuqV0LCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIGPDsyB0aOG7gyDEkeG6v24gdOG7qyBjw6FjIHnhur91IHThu5EgcGhpIHRodSBuaOG6rXAgbmjGsCBo4buXIHRy4bujIHThu6sgZ2lhIMSRw6xuaCBob+G6t2MgY2hpIHBow60gbmjDoCDhu58gdGjhuqVwLg0KDQotIE5ow7NtICoqJDMwSyDigJMgJDUwSyoqIGPDsyBz4buxIGNow6puaCBs4buHY2ggxJHDoW5nIGvhu4MgduG7m2kgKioyLjUxNCBuZ8aw4budaSBz4bufIGjhu691IG5ow6AqKiBzbyB24bubaSAqKjIuMDg3IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691KiosIGNobyB0aOG6pXkga2hpIHRodSBuaOG6rXAgdMSDbmcgbMOqbiBt4bupYyB0cnVuZyBiw6xuaCB0aOG6pXAsIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCB0xINuZyDEkcOhbmcga+G7gywgY8OzIHRo4buDIG5o4budIHTDrWNoIGzFqXkgdMOgaSBjaMOtbmggaG/hurdjIGto4bqjIG7Eg25nIHRp4bq/cCBj4bqtbiB0w61uIGThu6VuZy4NCg0KLSDhu54gbmjDs20gdGh1IG5o4bqtcCAqKiQ1MEsg4oCTICQ3MEsqKiwgeHUgaMaw4bubbmcgdGnhur9wIHThu6VjIMSRxrDhu6NjIGR1eSB0csOsIHbhu5tpICoqMS4zMDcgbmfGsOG7nWkgc+G7nyBo4buvdSoqIHbDoCAqKjEuMDYzIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691KiosIGNobyB0aOG6pXkgdGh1IG5o4bqtcCB04burIG3hu6ljIHRydW5nIGLDrG5oIHRy4bufIGzDqm4gxJHDoyBi4bqvdCDEkeG6p3UgZ2nDunAgxJFhIHPhu5EgY8OhIG5ow6JuIHPhu58gaOG7r3UgbmjDoC4NCg0KLSBOaMOzbSB0aHUgbmjhuq1wICoqJDcwSyDigJMgJDkwSyoqIGNobyB0aOG6pXkgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCB0aeG6v3AgdOG7pWMgdMSDbmcgbeG6oW5oLCB24bubaSAqKjEuMDIzIG5nxrDhu51pIHPhu58gaOG7r3UqKiBzbyB24bubaSAqKjY4NiBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSoqLCB0xrDGoW5nIMSRxrDGoW5nIGtob+G6o25nIDYwJSBjw6EgbmjDom4gdHJvbmcgbmjDs20gbsOgeSDEkcOjIHPhu58gaOG7r3UgbmjDoC4NCg0KLSDhu54gbeG7qWMgKiokOTBLIOKAkyAkMTEwSyoqLCB4dSBoxrDhu5tuZyBz4bufIGjhu691IG5ow6AgdHLhu58gbsOqbiByw7UgcuG7h3QsIGtoaSBjw7MgdOG7m2kgKio0OTYgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgKiogdsOgIGNo4buJICoqMTE3IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691KiosIHTGsMahbmcgxJHGsMahbmcgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBraG/huqNuZyA4MCUuDQoNCi0gVHJvbmcgbmjDs20gKiokMTEwSyDigJMgJDEzMEsqKiwgY8OzIHThu5tpICoqNTI0IG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCoqIHNvIHbhu5tpICoqMTE5IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691KiosIGNobyB0aOG6pXkgdGh1IG5o4bqtcCBjYW8gaMahbiB0aeG6v3AgdOG7pWMgZ2lhIHTEg25nIHjDoWMgc3XhuqV0IHPhu58gaOG7r3UgYuG6pXQgxJHhu5luZyBz4bqjbi4NCg0KLSBOaMOzbSAqKiQxMzBLIOKAkyAkMTUwSyoqIHRo4buDIGhp4buHbiB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIHbGsOG7o3QgdHLhu5lpIHbhu5tpICoqNjI0IG5nxrDhu51pIGPDsyBuaMOgKiogdsOgICoqY2jhu4kgMTM2IG5nxrDhu51pIGtow7RuZyBjw7MqKiwgcGjhuqNuIMOhbmggcuG6sW5nIHThuqFpIG3hu6ljIHRodSBuaOG6rXAgbsOgeSwgdmnhu4djIHPhu58gaOG7r3UgbmjDoCDEkcOjIHRy4bufIHRow6BuaCBjaHXhuqluIG3hu7FjIHBo4buVIGJp4bq/bi4NCg0KLSBDdeG7kWkgY8O5bmcsIG5ow7NtIHRodSBuaOG6rXAgKip0csOqbiAkMTUwSyoqIGPDsyAqKjIyNSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AqKiB2w6AgY2jhu4kgKio0OCBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSoqLCB0xrDGoW5nIMSRxrDGoW5nIHThu7cgbOG7hyBz4bufIGjhu691IHRyw6puIDgyJSwgY2hvIHRo4bqleSBy4bqxbmcg4bufIG3hu6ljIHRodSBuaOG6rXAgcuG6pXQgY2FvLCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIGfhuqduIG5oxrAgbMOgIG3hurdjIMSR4buLbmguDQoNClThu6sgbmjhu69uZyBwaMOibiB0w61jaCB0csOqbiwgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgbeG7qWMgdGh1IG5o4bqtcCBo4bqxbmcgbsSDbSBjw7MgbeG7kWkgcXVhbiBo4buHIHRodeG6rW4gY2hp4buBdSB24bubaSB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgLiBLaGkgdGh1IG5o4bqtcCB0xINuZywga2jhuqMgbsSDbmcgc+G7nyBo4buvdSBi4bqldCDEkeG7mW5nIHPhuqNuIHTEg25nIGzDqm4gcsO1IHLhu4d0LiBUdXkgbmhpw6puLCB2aeG7h2MgbeG7mXQgc+G7kSBuaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCB24bqrbiBjw7MgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBjYW8gY8WpbmcgZ+G7o2kgw70gcuG6sW5nIGPDoWMgeeG6v3UgdOG7kSBuZ2/DoGkgdGh1IG5o4bqtcCAgbmjGsCB0aOG7q2Ega+G6vywgZ2nDoSBuaMOgIOG7nyB0aOG6pXAgaG/hurdjIGPDoWMgY2jGsMahbmcgdHLDrG5oIGjhu5cgdHLhu6MgbmjDoCDhu58gY8OzIHRo4buDIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcuDQoNCiMjIyMgKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioNCg0KYGBge3J9DQpwcm9wLnRhYmxlKGhvbWVfaW5jb21lKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpC4bqjbmcgdOG7tyBs4buHIHBo4bqnbiB0csSDbSB04buVbmcgdGjhu4MgY2hvIHRo4bqleSB4dSBoxrDhu5tuZyBy4bqldCByw7UgcsOgbmcgduG7gSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIHRodSBuaOG6rXAgdsOgIHF1eeG7gW4gc+G7nyBo4buvdSBuaMOgIOG7ny4gQ+G7pSB0aOG7gzoNCg0KLSDhu54gbmjDs20gdGh1IG5o4bqtcCBcJDEwSyDigJMgXCQzMEssIHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgY2hp4bq/bSAqKjEyLjMxJSoqLCBjYW8gaMahbiBzbyB24bubaSAqKjkuNjYlKiogbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBuZ2F5IGPhuqMg4bufIG3hu6ljIHRodSBuaOG6rXAgdGjhuqVwIG5o4bqldCwgduG6q24gY8OzIG3hu5l0IGLhu5kgcGjhuq1uIGzhu5tuIG5nxrDhu51pIGTDom4gY8OzIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCwgY8OzIHRo4buDIG5o4budIGPDoWMgeeG6v3UgdOG7kSBo4buXIHRy4bujIG5oxrAgdMOgaSBz4bqjbiB0aOG7q2Ega+G6vyBob+G6t2MgY2hpIHBow60gbmjDoCDhu58gdGjhuqVwLg0KDQotIEtoaSB0aHUgbmjhuq1wIHTEg25nIGzDqm4gbmjDs20gXCQzMEsg4oCTIFwkNTBLLCB04bu3IGzhu4cgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIHTEg25nIGzDqm4gKioxNy44OCUqKiwgdsaw4bujdCBraMOhIHhhIHNvIHbhu5tpICoqMTQuODQlKiogbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UuIMSQw6J5IGPDsyB0aOG7gyBsw6AgZ2lhaSDEkW/huqFuIG5oaeG7gXUgbmfGsOG7nWkgYuG6r3QgxJHhuqd1IGPDsyBraOG6oyBuxINuZyB0w61jaCBsxal5IGhv4bq3YyB0aeG6v3AgY+G6rW4gY8OhYyBraG/huqNuIHZheSBtdWEgbmjDoC4NCg0KLSBOaMOzbSB0aHUgbmjhuq1wIFwkNTBLIOKAkyBcJDcwSyB0aeG6v3AgdOG7pWMgcGjhuqNuIMOhbmggeHUgaMaw4bubbmcgbsOgeSwgduG7m2kgKio5LjMwJSoqIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBzbyB24bubaSAqKjcuNTAlKiogbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UuDQoNCi0g4bueIGPDoWMgbmjDs20gdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCBjYW8gbmjGsCBcJDcwSyDigJMgXCQ5MEsgdsOgIFwkOTBLIOKAkyBcJDExMEssIGNow6puaCBs4buHY2ggdHLhu58gbsOqbiByw7UgcuG7h3QgaMahbi4gVOG7tyBs4buHIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBs4bqnbiBsxrDhu6N0IGzDoCAqKjcuMjglKiogdsOgICoqMy41MyUqKiwgc28gduG7m2kgdOG7tyBs4buHIGtow7RuZyBz4bufIGjhu691IGNo4buJIGzDoCAqKjQuODclKiogdsOgICoqMC44MyUqKi4gxJDDonkgbMOgIG1pbmggY2jhu6luZyByw7UgcsOgbmcgY2hvIHZp4buHYyB0aHUgbmjhuq1wIGNhbyBnacO6cCBuw6JuZyBjYW8ga2jhuqMgbsSDbmcgc+G7nyBo4buvdSBuaMOgLg0KDQotIFThu6sgbeG7qWMgdGh1IG5o4bqtcCBcJDExMEsg4oCTIFwkMTMwSyB0cuG7nyDEkWksIGtob+G6o25nIGPDoWNoIGdp4buvYSBoYWkgbmjDs20gdMSDbmcgbeG6oW5oLiBOZ8aw4budaSBz4bufIGjhu691IG5ow6AgY2hp4bq/bSAqKjMuNzMlKiosIGNhbyBn4bqlcCBoxqFuIDQgbOG6p24gc28gduG7m2kgKiowLjg0JSoqIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691Lg0KDQotIFbhu5tpIG5ow7NtIFwkMTMwSyDigJMgXCQxNTBLLCB04bu3IGzhu4cgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGzDqm4gdOG7m2kgKio0LjQ0JSoqLCB0cm9uZyBraGkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBjaOG7iSBjaGnhur9tICoqMC45NyUqKi4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIOG7nyBt4bupYyB0aHUgbmjhuq1wIG7DoHksIHZp4buHYyBz4bufIGjhu691IG5ow6AgZ+G6p24gbmjGsCB0cuG7nyB0aMOgbmggY2h14bqpbiBt4buxYyBwaOG7lSBiaeG6v24uDQoNCi0gQ3Xhu5FpIGPDuW5nLCBuaMOzbSB0aHUgbmjhuq1wICoqdHLDqm4gXCQxNTBLKiogY8OzIHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgbMOgICoqMS42MCUqKiwgY2FvIGfhuqVwIGfhuqduIDUgbOG6p24gc28gduG7m2kgKiowLjM0JSoqIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691LiBU4bupYyBsw6AsIHThuqFpIG3hu6ljIHRodSBuaOG6rXAgcuG6pXQgY2FvLCBxdXnhu4FuIHPhu58gaOG7r3UgbmjDoCBn4bqnbiBuaMawIGzDoCBt4bq3YyDEkeG7i25oKi4NCg0KTmjDrG4gY2h1bmcsIGThu68gbGnhu4d1IHBo4bqjbiDDoW5oIG3hu5l0IG3hu5FpIHF1YW4gaOG7hyB0aHXhuq1uIGNoaeG7gXUgcuG6pXQgcsO1IHLDoG5nIGdp4buvYSB0aHUgbmjhuq1wIGjhurFuZyBuxINtIHbDoCB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgLiBLaGkgdGh1IG5o4bqtcCB0xINuZyBsw6puLCBraOG6oyBuxINuZyBz4bufIGjhu691IGLhuqV0IMSR4buZbmcgc+G6o24gY8WpbmcgdMSDbmcgdGhlbyBt4buZdCBjw6FjaCDEkcOhbmcga+G7gy4gVHV5IG5oacOqbiwgY8WpbmcgY+G6p24gbMawdSDDvSBy4bqxbmcg4bufIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwLCB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIHbhuqtuIGtow7RuZyBo4buBIG5o4buPLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgdGh1IG5o4bqtcCBraMO0bmcgcGjhuqNpIGzDoCB54bq/dSB04buRIGR1eSBuaOG6pXQgcXV54bq/dCDEkeG7i25oLCB2w6AgY8OhYyB54bq/dSB04buRIGtow6FjIG5oxrAgdGjhu6thIGvhur8sIGdpw6EgYuG6pXQgxJHhu5luZyBz4bqjbiB2w7luZywgaGF5IGjhu5cgdHLhu6MgY2jDrW5oIHPDoWNoIG5ow6Ag4bufIGPFqW5nIGPDsyB0aOG7gyDEkcOzbmcgdmFpIHRyw7IgcXVhbiB0cuG7jW5nLg0KDQojIyMjICoqVuG6vSDEkeG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KIyBDaHV54buDbiBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHNhbmcgZGF0YSBmcmFtZQ0KZGZfaG9tZV9pbmNvbWUgPC0gYXMuZGF0YS5mcmFtZShob21lX2luY29tZSkNCmNvbG5hbWVzKGRmX2hvbWVfaW5jb21lKSA8LSBjKCJIb21lb3duZXIiLCAiQW5udWFsSW5jb21lIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbQ0KZ2dwbG90KGRmX2hvbWVfaW5jb21lLCBhZXMoeCA9IEFubnVhbEluY29tZSwgeSA9IENvdW50LCBmaWxsID0gSG9tZW93bmVyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiU+G7kSBsxrDhu6NuZyBuZ8aw4budaSBz4bufIGjhu691IHbDoCBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHRoZW8gbmjDs20gdGh1IG5o4bqtcCIsDQogICAgICAgeCA9ICJOaMOzbSB0aHUgbmjhuq1wIGjhurFuZyBuxINtIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmcgY8OhIG5ow6JuIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSAqKlThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgdMSDbmcgdGhlbyB0aHUgbmjhuq1wOioqIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHh1IGjGsOG7m25nIHLhuqV0IHLDtSByw6BuZzoga2hpIG5ow7NtIHRodSBuaOG6rXAgdMSDbmcsIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIChZKSBjxaluZyB0xINuZyDEkcOhbmcga+G7gywgxJHhurdjIGJp4buHdCByw7UgcsOgbmcg4bufIG5ow7NtIGAkMzBLIOKAkyAkNTBLYCB2w6AgYCQ1MEsg4oCTICQ3MEtgLg0KDQotICoqTmjDs20gdGh1IG5o4bqtcCAkMzBLIOKAkyAkNTBLIGNoaeG6v20gxrB1IHRo4bq/IHLDtSBy4buHdDoqKiDEkMOieSBsw6AgbmjDs20gY8OzIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGNhbyBuaOG6pXQgdHJvbmcgdG/DoG4gYuG7mSBiaeG7g3UgxJHhu5MsIHbGsOG7o3QgdHLhu5lpIGjGoW4gaOG6s24gc28gduG7m2kgbmjDs20ga2jDtG5nIHPhu58gaOG7r3UgdHJvbmcgY8O5bmcgcGjDom4ga2jDumMuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IMSRw6J5IGPDsyB0aOG7gyBsw6AgbeG7qWMgdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCBwaOG7lSBiaeG6v24sIMSR4bunIMSR4buDIG5nxrDhu51pIGTDom4gYuG6r3QgxJHhuqd1IHRp4bq/cCBj4bqtbiB0aOG7iyB0csaw4budbmcgYuG6pXQgxJHhu5luZyBz4bqjbi4NCg0KLSAqKk5nxrDhu51pIHRodSBuaOG6rXAgdGjhuqVwIHbhuqtuIGPDsyBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6A6Kiog4bueIG5ow7NtIHRodSBuaOG6rXAgYCQxMEsg4oCTICQzMEtgLCBz4buRIGzGsOG7o25nIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCB24bqrbiBjYW8gaMahbiBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdS4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBz4buxIGjhu5cgdHLhu6MgdOG7qyBjw6FjIHnhur91IHThu5Ega2jDoWMgbmjGsCB0w6BpIHPhuqNuIHRo4burYSBr4bq/LCBuaMOgIGdpw6EgcuG6uyB2w7luZyBuw7RuZyB0aMO0biBob+G6t2MgaOG7lyB0cuG7oyB4w6MgaOG7mWkuDQoNCi0gKipU4bu3IGzhu4cga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBnaeG6o20g4bufIGPDoWMgbmjDs20gdGh1IG5o4bqtcCBjYW86KiogVOG7qyBuaMOzbSBgJDcwSyDigJMgJDkwS2AgdHLhu58gxJFpLCBz4buRIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgKE4pIGdp4bqjbSBt4bqhbmgsIHRyb25nIGtoaSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgduG6q24gZHV5IHRyw6wgc+G7kSBsxrDhu6NuZyDhu5VuIMSR4buLbmguIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBy4bqxbmcgdGh1IG5o4bqtcCBjYW8gZ+G6r24gbGnhu4FuIHbhu5tpIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCBn4bqnbiBuaMawIG3hurdjIMSR4buLbmguDQoNCi0gKipDaMOqbmggbOG7h2NoIHLDtSBy4buHdCBnaeG7r2EgaGFpIG5ow7NtIHPhu58gaOG7r3U6Kiog4bueIGPDoWMgbmjDs20gdGh1IG5o4bqtcCBjYW8gaMahbiAoYCQ5MEsg4oCTICQxMTBLYCwgYCQxMTBLIOKAkyAkMTMwS2AgdsOgIHRyw6puIGAkMTUwS2ApLCBz4buRIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCB0dXkgY8OzIHh1IGjGsOG7m25nIGdp4bqjbSBuaOG6uSB24buBIHPhu5EgdHV54buHdCDEkeG7kWksIG5oxrBuZyB24bqrbiB2xrDhu6N0IHhhIHPhu5EgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UsIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcGjhu5UgYmnhur9uIGPhu6dhIHZp4buHYyBz4bufIGjhu691IG5ow6Ag4bufIG5ow7NtIHRodSBuaOG6rXAgY2FvLg0KDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBt4buRaSBxdWFuIGjhu4cgdGh14bqtbiBjaGnhu4F1IG3huqFuaCBt4bq9IGdp4buvYSB0aHUgbmjhuq1wIGjhurFuZyBuxINtIHbDoCBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AuIEPDoG5nIGPDsyB0aHUgbmjhuq1wIGNhbywgbmfGsOG7nWkgZMOibiBjw6BuZyBjw7MgeHUgaMaw4bubbmcgc+G7nyBo4buvdSBuaMOgIG5oaeG7gXUgaMahbi4gVHV5IG5oacOqbiwgc+G7sSBoaeG7h24gZGnhu4duIMSRw6FuZyBr4buDIGPhu6dhIGNo4bunIHPhu58gaOG7r3UgbmjDoCB0cm9uZyBuaMOzbSB0aHUgbmjhuq1wIHRo4bqlcCBjxaluZyBjaG8gdGjhuqV5IHRodSBuaOG6rXAga2jDtG5nIHBo4bqjaSB54bq/dSB04buRIGR1eSBuaOG6pXQsIHbDoCBj4bqnbiB4w6l0IHRow6ptIMSR4bq/biBjw6FjIHnhur91IHThu5Ega2jDoWMgbmjGsCBjaMOtbmggc8OhY2ggbmjDoCDhu58sIG3DtGkgdHLGsOG7nW5nIHPhu5FuZywgaG/hurdjIGjhu5cgdHLhu6MgdMOgaSBjaMOtbmggdOG7qyBnaWEgxJHDrG5oLiDEkOG7gyBraOG6s25nIMSR4buLbmggcsO1IHLDoG5nIGjGoW4gduG7gSBt4buRaSBsacOqbiBo4buHIG7DoHksIGPDsyB0aOG7gyBj4bqnbiB0aOG7sWMgaGnhu4duIHRow6ptIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChuaMawIENoaS1zcXVhcmVkIHRlc3QpLg0KDQojIyMgKipLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqioqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotICoqSDA6KiogSGFpIGJp4bq/biBIb21lb3duZXIgdsOgIEFubnVhbEluY29tZSDEkeG7mWMgbOG6rXANCi0gKipIMToqKiBIYWkgYmnhur9uIEhvbWVvd25lciB2w6AgQW5udWFsSW5jb21lIGPDsyBt4buRaSBsacOqbiBo4buHDQoNCioqVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcqKg0KDQpgYGB7cn0NCmNoaXNxX3Jlc3VsdDM8LSBjaGlzcS50ZXN0KGhvbWVfaW5jb21lKQ0KY2hpc3FfcmVzdWx0Mw0KYGBgDQoNCiMjIyAqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktYsOsbmggcGjGsMahbmc6IFgtc3F1YXJlZCA9IDU0Ni4zNyAgDQoNCi0gQuG6rWMgdOG7sSBkbzogZGYgPSA3ICANCg0KLSBHacOhIHRy4buLIHA6IHAtdmFsdWUgPCAyLjJlLTE2ICANCg0KIyMjICoqS+G6v3QgbHXhuq1uOioqDQoNClbhu5tpIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDUpLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIEgwLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB0aHUgbmjhuq1wIGjhurFuZyBuxINtIHbDoCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgLg0KDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIG7DoHkgY+G7p25nIGPhu5EgY8OhYyBuaOG6rW4geMOpdCBtw7QgdOG6oyB2w6AgdHLhu7FjIHF1YW4gaMOzYSB0csaw4bubYyDEkcOzOiAgDQoNCiAgLSBUaHUgbmjhuq1wIGjhurFuZyBuxINtIGzDoCB54bq/dSB04buRIHF1YW4gdHLhu41uZyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgc+G7nyBo4buvdSBuaMOgLiAgDQogIA0KICAtIE3hu6ljIHRodSBuaOG6rXAgY8OgbmcgY2FvIHRow6wgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBjw6BuZyBs4bubbiwgcGjhuqNuIMOhbmggeHUgaMaw4bubbmcgdMOtY2ggbMWpeSB0w6BpIHPhuqNuIGhv4bq3YyBraOG6oyBuxINuZyB0aeG6v3AgY+G6rW4gY8OhYyBuZ3Xhu5NuIHTDoGkgY2jDrW5oIG11YSBuaMOgIHRodeG6rW4gbOG7o2kgaMahbi4gIA0KICANCiAgLSBU4bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIHRyb25nIGPDoWMgbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgduG6q24ga2jDtG5nIG5o4buPLCBjaG8gdGjhuqV5IG5nb8OgaSB0aHUgbmjhuq1wIGPDsm4gY8OzIGPDoWMgeeG6v3UgdOG7kSBo4buXIHRy4bujIG5oxrAgdGjhu6thIGvhur8sIGNow61uaCBzw6FjaCBuaMOgIOG7nywgaG/hurdjIMSRaeG7gXUga2nhu4duIHRo4buLIHRyxrDhu51uZyBi4bqldCDEkeG7mW5nIHPhuqNuIHbDuW5nIG1p4buBbi4NCg0KLSDEkOG7gyBoaeG7g3UgcsO1IGjGoW4gduG7gSBt4buRaSBxdWFuIGjhu4cgbsOgeSwgY8OzIHRo4buDIHRp4bq/cCB04bulYyBuZ2hpw6puIGPhu6l1IGLhurFuZyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgxJFhIGJp4bq/biBob+G6t2MgcGjDom4gdMOtY2ggc8OidSBoxqFuLg0KDQoNCiMgKipQSOG6pk4gNTogVOG7lE5HIEvhur5UIFbDgCBUSOG6ok8gTFXhuqxOKiogDQoNCiMjICoqVMOzbSB04bqvdCBuaOG7r25nIHBow6F0IGhp4buHbiBjaMOtbmgqKg0KDQpRdWEgY8OhYyBwaMOibiB0w61jaCDEkeG7i25oIHTDrW5oLCB0YSByw7p0IHJhIMSRxrDhu6NjIG5o4buvbmcgaGnhu4N1IGJp4bq/dCBxdWFuIHRy4buNbmcgbmjGsCBzYXU6DQoNCi0gKipN4buRaSBxdWFuIGjhu4cgZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6Agdmnhu4djIHPhu58gaOG7r3UgbmjDoCAoTWFyaXRhbFN0YXR1cyDigJMgSG9tZW93bmVyKToqKiAgDQogIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyBjaG8gdGjhuqV5IGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyBnaeG7r2EgY8OhYyBuaMOzbSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gduG7gSB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBuaMOzbSBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIGPDsyB4dSBoxrDhu5tuZyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSDEkeG7mWMgdGjDom4gaG/hurdjIGNoxrBhIGvhur90IGjDtG4sIHBo4bqjbiDDoW5oIMSR4bq3YyDEkWnhu4NtIHTDoGkgY2jDrW5oIHbDoCDhu5VuIMSR4buLbmggaMahbiBj4bunYSBuaMOzbSBuw6B5Lg0KDQotICoqTeG7kWkgcXVhbiBo4buHIGdp4buvYSB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIHbDoCB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gKEhvbWVvd25lciDigJMgQW5udWFsSW5jb21lKToqKiAgDQogIEtow6FjaCBow6BuZyBz4bufIGjhu691IG5ow6AgdGjGsOG7nW5nIGPDsyBt4bupYyB0aHUgbmjhuq1wIGNhbyBoxqFuIHNvIHbhu5tpIGtow6FjaCBow6BuZyB0aHXDqiBuaMOgIGhv4bq3YyBjaMawYSBz4bufIGjhu691LiBN4buRaSBxdWFuIGjhu4cgbsOgeSBwaOG6o24gw6FuaCBt4bupYyDEkeG7mSBraOG6oyBuxINuZyB0w6BpIGNow61uaCB2w6Agc+G7sSDhu5VuIMSR4buLbmggY+G7p2Ega2jDoWNoIGjDoG5nLCBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIGNoaSB0acOqdSB2w6AgbOG7sWEgY2jhu41uIHPhuqNuIHBo4bqpbSBjYW8gY+G6pXAgaMahbi4NCg0KTmjhu69uZyBwaMOhdCBoaeG7h24gbsOgeSBjdW5nIGPhuqVwIG3hu5l0IGPDoWkgbmjDrG4gdG/DoG4gZGnhu4duIHbhu4EgY8OhYyBuaMOzbSBraMOhY2ggaMOgbmcgY2jDrW5oIGThu7FhIHRyw6puIGPDoWMgxJHhurdjIMSRaeG7g20gxJHhu4tuaCB0w61uaCwgZ2nDunAgZG9hbmggbmdoaeG7h3AgbuG6r20gYuG6r3QgxJHGsOG7o2MgcGjDom4ga2jDumMga2jDoWNoIGjDoG5nLCBuaHUgY+G6p3UgdsOgIHh1IGjGsOG7m25nIHRpw6p1IGTDuW5nIMSR4buDIHThu6sgxJHDsyB04buRaSDGsHUgaMOzYSBjaGnhur9uIGzGsOG7o2Mga2luaCBkb2FuaC4NCg0KIyMgKipI4bqhbiBjaOG6vyBj4bunYSBwaMOibiB0w61jaCoqDQoNCi0gR2nhu5tpIGjhuqFuIHBow6JuIHTDrWNoIGJp4bq/biDEkeG7i25oIHTDrW5oOiBWaeG7h2MgY2jhu4kgdOG6rXAgdHJ1bmcgcGjDom4gdMOtY2ggY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBtw6Aga2jDtG5nIGvhur90IGjhu6NwIGPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgKG5oxrAgdHXhu5VpLCBz4buRIGzhuqduIG11YSBow6BuZywgY2hpIHRpw6p1IHRydW5nIGLDrG5oLi4uKSBjw7MgdGjhu4MgbMOgbSBnaeG6o20gxJHhu5kgc8OidSB2w6AgdMOtbmggdG/DoG4gZGnhu4duIGPhu6dhIHBow6JuIHTDrWNoIGjDoG5oIHZpIGtow6FjaCBow6BuZy4NCg0KLSBLw61jaCB0aMaw4bubYyBt4bqrdSBraMO0bmcgxJHhu5NuZyDEkeG7gXU6IE3hu5l0IHPhu5EgaOG6oW5nIG3hu6VjIGNvbiB0cm9uZyBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIGPDsyB0aOG7gyBjw7Mgc+G7kSBsxrDhu6NuZyBt4bqrdSBy4bqldCBuaOG7jywg4bqjbmggaMaw4bufbmcgxJHhur9uIMSR4buZIHRpbiBj4bqteSBj4bunYSBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB2w6Aga2jhuqMgbsSDbmcgdOG7lW5nIHF1w6F0IGjDs2EuDQoNCi0gS2jDtG5nIHhlbSB4w6l0IHnhur91IHThu5EgdGjhu51pIGdpYW46IFBow6JuIHTDrWNoIHTEqW5oLCBraMO0bmcgdGhlbyBkw7VpIGJp4bq/biDEkeG7lWkgaMOgbmggdmkgdGhlbyB0aOG7nWkgZ2lhbiBjw7MgdGjhu4MgYuG7jyBs4buhIGPDoWMgeHUgaMaw4bubbmcgdGhheSDEkeG7lWkgdHJvbmcgaMOgbmggdmkga2jDoWNoIGjDoG5nLg0KDQojIyAqKsSQ4buBIHh14bqldCoqDQoNCi0gQ2hp4bq/biBsxrDhu6NjIG1hcmtldGluZyB0aGVvIHBow6JuIGtow7pjOiBE4buxYSB0csOqbiBz4buxIGtow6FjIGJp4buHdCB24buBIHPhu58gdGjDrWNoIHPhuqNuIHBo4bqpbSB0aGVvIGdp4bubaSB0w61uaCB2w6AgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCBkb2FuaCBuZ2hp4buHcCBuw6puIHBow6F0IHRyaeG7g24gY8OhYyBjaGnhur9uIGThu4tjaCBtYXJrZXRpbmcgxJHGsOG7o2MgY8OhIG5ow6JuIGjDs2EsIG5o4bqvbSDEkcO6bmcgbmjDs20ga2jDoWNoIGjDoG5nIG3hu6VjIHRpw6p1Lg0KDQotIFBow6JuIGxv4bqhaSBz4bqjbiBwaOG6qW0gcGjDuSBo4bujcDogQ+G6p24gdOG6rXAgdHJ1bmcgcGjDoXQgdHJp4buDbiBjw6FjIGTDsm5nIHPhuqNuIHBo4bqpbSBwaMO5IGjhu6NwIHbhu5tpIHThu6tuZyBuaMOzbSBraMOhY2ggaMOgbmcgxJHhurdjIHRyxrBuZywgdsOtIGThu6Ugc+G6o24gcGjhuqltIGNhbyBj4bqlcCBjaG8gbmjDs20ga2jDoWNoIGjDoG5nIHRodSBuaOG6rXAgY2FvIHbDoCBz4bufIGjhu691IG5ow6AsIHPhuqNuIHBo4bqpbSBnacOhIGPhuqMgcGjhuqNpIGNoxINuZyBoxqFuIGNobyBuaMOzbSBraMOhY2ggaMOgbmcgdGh1IG5o4bqtcCB0aOG6pXAuDQoNCi0gTmjhuq9tIG3hu6VjIHRpw6p1IGtow6FjaCBow6BuZyDhu5VuIMSR4buLbmggdMOgaSBjaMOtbmg6IEtow6FjaCBow6BuZyBz4bufIGjhu691IG5ow6AgdsOgIGPDsyB0aHUgbmjhuq1wIGNhbyBsw6AgbmjDs20ga2jDoWNoIGjDoG5nIHRp4buBbSBuxINuZyDEkeG7gyBwaMOhdCB0cmnhu4NuIGPDoWMgY2jGsMahbmcgdHLDrG5oIGNoxINtIHPDs2MgdsOgIGtodXnhur9uIG3Do2kgxJHhurdjIGJp4buHdCBuaOG6sW0gdMSDbmcgdOG7tyBs4buHIGdp4buvIGNow6JuIHbDoCBnacOhIHRy4buLIHbDsm5nIMSR4budaSBraMOhY2ggaMOgbmcuDQoNCg0KIyMgKipDw6J1IGjhu49pIG3hu58gLyBIxrDhu5tuZyBuZ2hpw6puIGPhu6l1IHRp4bq/cCB0aGVvKioNCg0KLSBQaMOibiB0w61jaCBr4bq/dCBo4bujcCBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgxJHhu4tuaCBsxrDhu6NuZzogTGnhu4d1IHZp4buHYyB0w61jaCBo4bujcCBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIG5oxrAgdHXhu5VpLCBz4buRIGzhuqduIG11YSBow6BuZywgY2hpIHRpw6p1IHRydW5nIGLDrG5oIHPhur0gZ2nDunAgaGnhu4N1IHLDtSBoxqFuIHbhu4EgaMOgbmggdmkgdsOgIGdpw6EgdHLhu4sga2jDoWNoIGjDoG5nPw0KDQotIFBow6JuIHTDrWNoIGjDoG5oIHZpIHRoZW8gdGjhu51pIGdpYW46IEPDsyBuaOG7r25nIHh1IGjGsOG7m25nIHRoYXkgxJHhu5VpIG7DoG8gdHJvbmcgc+G7nyB0aMOtY2ggc+G6o24gcGjhuqltIGhv4bq3YyDEkeG6t2MgxJFp4buDbSBraMOhY2ggaMOgbmcgdGhlbyB0aOG7nWkgZ2lhbiAodsOtIGThu6UgdGhlbyBtw7lhIGhv4bq3YyB0aGVvIG7Eg20pPw0KDQotIFTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgeMOjIGjhu5lpIGtow6FjOiBMaeG7h3UgY8OhYyB54bq/dSB04buRIG5oxrAgdsO5bmcgxJHhu4thIGzDvSwgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuLCBuZ2jhu4EgbmdoaeG7h3AgY8OzIOG6o25oIGjGsOG7n25nIG5oxrAgdGjhur8gbsOgbyDEkeG6v24gaMOgbmggdmkgbXVhIHPhuq9tIGPhu6dhIGtow6FjaCBow6BuZz8NCg0KLSDhu6huZyBk4bulbmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuOiBDw7MgdGjhu4MgeMOieSBk4buxbmcgY8OhYyBtw7QgaMOsbmggZOG7sSDEkW/DoW4gaMOgbmggdmkga2jDoWNoIGjDoG5nIGThu7FhIHRyw6puIGPDoWMgxJHhurdjIMSRaeG7g20gxJHhu4tuaCB0w61uaCB2w6AgxJHhu4tuaCBsxrDhu6NuZyDEkcOjIHBow6JuIHTDrWNoIMSR4buDIHThu5FpIMawdSBow7NhIGNoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcgdsOgIGLDoW4gaMOgbmc/DQoNCg0KDQoNCg0KIyMg8J+nqiBLaeG7g20gxJHhu4tuaCB04bu3IGzhu4cga2jDoWNoIE1leGljbyBzbyB24bubaSBDYW5hZGENCg0KIyMjIOKchSDEkOG6t3QgZ2nhuqMgdGh1eeG6v3QNCg0KR+G7jWk6DQoNCi0gXCggcF97XHRleHR7TWV4aWNvfX0gXCk6IHThu7cgbOG7hyBraMOhY2ggxJHhur9uIHThu6sgTWV4aWNvICANCi0gXCggcF97XHRleHR7Q2FuYWRhfX0gXCk6IHThu7cgbOG7hyBraMOhY2ggxJHhur9uIHThu6sgQ2FuYWRhDQoNClRhIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90Og0KDQotICoqR2nhuqMgdGh1eeG6v3Qga2jDtG5nIChI4oKAKSoqOg0KICBcWw0KICBIXzA6IHBfe1x0ZXh0e01leGljb319ID0gcF97XHRleHR7Q2FuYWRhfX0NCiAgXF0NCiAgKFThu7cgbOG7hyBraMOhY2ggdOG7qyBNZXhpY28gYuG6sW5nIHbhu5tpIENhbmFkYSkNCg0KLSAqKkdp4bqjIHRodXnhur90IMSR4buRaSAoSOKCgSkqKjoNCiAgXFsNCiAgSF8xOiBwX3tcdGV4dHtNZXhpY299fSA+IHBfe1x0ZXh0e0NhbmFkYX19DQogIFxdDQogIChU4bu3IGzhu4cga2jDoWNoIHThu6sgTWV4aWNvIHbhu5tpIENhbmFkYSkNCg0KLS0tDQoNCiMjIyDwn5OMIE3DoyBSIHRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmgNCg0KYGBge3J9DQojIFPhu5Ega2jDoWNoIHThu6sgbeG7l2kgbsaw4bubYw0KeCA8LSBjKDM2ODgsIDgwOSkgICAgICAgICAgICMgTWV4aWNvLCBDYW5hZGENCm4gPC0gYygzNjg4ICsgODA5ICsgOTU2MiwgMzY4OCArIDgwOSArIDk1NjIpICAjIFThu5VuZyBraMOhY2ggdOG7qyB04bqldCBj4bqjIGPDoWMgbsaw4bubYw0KDQojIEtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IA0KcmVzdWx0IDwtIHByb3AudGVzdCh4ID0geCwgbiA9IG4sIGNvcnJlY3QgPSBUUlVFKQ0KcHJpbnQocmVzdWx0KQ0KYGBgDQoNCg0KIyAqKkE6IMSQ4buMQyBWw4AgQ0hV4bqoTiBC4buKIFRSxq/hu5pDIEJV4buUSSBI4buMQyoqDQojIyAqKkdp4bubaSB0aGnhu4d1IGNodW5nKioNCg0KVHXhuqduIG7DoHksIGNow7puZyB0YSDEkWkgc8OidSB2w6BvIHN1eSBkaeG7hW4gdGjhu5FuZyBrw6ogdHLDqm4gYuG6o25nIG5n4bqrdSBuaGnDqm4gKENvbnRpbmdlbmN5IFRhYmxlKSwgxJHhurdjIGJp4buHdCB04bqtcCB0cnVuZyB2w6BvOg0KDQotIEtp4buDbSDEkeG7i25oIENoaS1zcXVhcmUgduG7gSB0w61uaCDEkeG7mWMgbOG6rXAgZ2nhu69hIGhhaSBiaeG6v24gcGjDom4gbG/huqFpLg0KLSBDw6FjIGNo4buJIHPhu5EgxJFvIGzGsOG7nW5nIG3hu5FpIGxpw6puIGjhu4cgdHJvbmcgYuG6o25nIDJ4MjogKipSZWxhdGl2ZSBSaXNrIChSUikqKiB2w6AgKipPZGRzIFJhdGlvIChPUikqKi4NCi0gQ8OhY2ggdMOtbmgga2hv4bqjbmcgdGluIGPhuq15IGNobyBPZGRzIFJhdGlvLg0KLSDhu6huZyBk4bulbmcgY8OhYyBraeG6v24gdGjhu6ljIHRyw6puIHbDoG8gbeG7mXQgdsOtIGThu6UgdGjhu7FjIHThur8gdOG7qyBi4buZIGThu68gbGnhu4d1ICoqU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zKiouDQoNCioqxJDhu41jIGThu68gbGnhu4d1IHbDoCBraMOhbSBwaMOhKioNCg0KYGBge3J9DQpsaWJyYXJ5KCJjc3YiKQ0KZGF0YSA8LSByZWFkLmNzdigiQzovVXNlcnMvQWRtaW4vRG93bmxvYWRzL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YiLCBoZWFkZXIgPSBUKQ0Kc3RyKGRhdGEpDQpgYGANCg0KxJDhuqd1IHRpw6puLCB0YSBz4bq9IHPhu60gZOG7pW5nIDIgYmnhur9uIMSR4buLbmggdMOtbmg6ICoqR2VuZGVyKiogKEdp4bubaSB0w61uaCkgdsOgICoqSG9tZW93bmVyKiogKEPDsyBz4bufIGjhu691IG5ow6AgaGF5IGtow7RuZykgxJHhu4MgdGnhur9uIGjDoG5oIMSRxrBhIHJhIHbDrSBk4bulIGPFqW5nIG5oxrAgcGjDom4gdMOtY2guDQoNCiMjICoqQuG6o25nIG5n4bqrdSBuaGnDqm4qKg0KDQpC4bqjbmcgbmfhuqt1IG5oacOqbiAoY29udGluZ2VuY3kgdGFibGUpIGzDoCBjw7RuZyBj4bulIHRo4buRbmcga8OqIGTDuW5nIMSR4buDIHRyw6xuaCBiw6B5IHThuqduIHPhu5EgY+G7p2EgY8OhYyBiaeG6v24gcGjDom4gbG/huqFpLiBUcm9uZyB0csaw4budbmcgaOG7o3AgxJHGoW4gZ2nhuqNuIG5o4bqldCDigJMgYuG6o25nIDJ4MiDigJMgYuG6o25nIGPDsyBk4bqhbmc6DQoNCnwgICAgICAgICAgICAgIHwgQmnhur9uIEIgPSBZZXMgfCBCaeG6v24gQiA9IE5vIHwNCnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfA0KfCAqKkJp4bq/biBBID0gWWVzKiogfCBhICAgICAgICAgICAgfCBiICAgICAgICAgICB8DQp8ICoqQmnhur9uIEEgPSBObyoqICB8IGMgICAgICAgICAgICB8IGQgICAgICAgICAgIHwNCg0KVHJvbmcgcGjDom4gdMOtY2ggdGjhu5FuZyBrw6osIGLhuqNuZyAyeDIgdGjGsOG7nW5nIGTDuW5nIMSR4buDOg0KDQotIFNvIHPDoW5oIHjDoWMgc3XhuqV0IGdp4buvYSBoYWkgbmjDs20gKG5oxrAgTmFtIHZzIE7hu68pLg0KLSBUw61uaCB0b8OhbiBjw6FjIGNo4buJIHPhu5EgxJFvIGzGsOG7nW5nIG3hu5FpIGxpw6puIGjhu4c6IFJpc2ssIE9kZHMsIFJlbGF0aXZlIFJpc2sgKFJSKSwgT2RkcyBSYXRpbyAoT1IpLg0KLSBLaeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB24buBIHPhu7EgxJHhu5ljIGzhuq1wIGdp4buvYSBoYWkgYmnhur9uIChDaGktc3F1YXJlIHRlc3QsIEZpc2hlcuKAmXMgRXhhY3QgVGVzdCwuLi4pLg0KDQpC4bqjbmcgY8OzIHRo4buDIHNpbmggcmEgdOG7qyBjw6FjIHBow6JuIHBo4buRaSBuaMawOg0KDQotICoqTXVsdGlub21pYWwqKjogbuG6v3UgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGPhu5EgxJHhu4tuaC4NCi0gKipQb2lzc29uKio6IG7hur91IHThu6tuZyDDtCB0cm9uZyBi4bqjbmcgbMOgIGJp4bq/biBQb2lzc29uIMSR4buZYyBs4bqtcCAow6FwIGThu6VuZyBraGkgZOG7ryBsaeG7h3UgaGnhur9tKS4NCg0KKipDw6FjIGLGsOG7m2MgdGjhu7FjIGhp4buHbiB0cm9uZyBSKioNCg0KYGBge3J9DQp0YWJsZV9nZW5kZXJfaG9tZW93bmVyIDwtIHRhYmxlKGRhdGEkR2VuZGVyLCBkYXRhJEhvbWVvd25lcikNCnRhYmxlX2dlbmRlcl9ob21lb3duZXINCmBgYA0KDQoNCiMjICoqS2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZSB24buBIHTDrW5oIMSR4buZYyBs4bqtcCoqDQoNCioqTMO9IHRodXnhur90OiBLaeG7g20gxJHhu4tuaCBDaGktc3F1YXJlKioNCg0KRMO5bmcgxJHhu4Mga2nhu4NtIHRyYSB4ZW0gaGFpIGJp4bq/biBwaMOibiBsb+G6oWkgY8OzIMSR4buZYyBs4bqtcCB0aOG7kW5nIGvDqiBraMO0bmcuDQoNCi0gKipHaeG6oyB0aHV54bq/dCBI4oKAKio6IEhhaSBiaeG6v24gxJHhu5ljIGzhuq1wLg0KLSAqKkdp4bqjIHRodXnhur90IEjigoEqKjogSGFpIGJp4bq/biBjw7MgbeG7kWkgbGnDqm4gaOG7hy4NCg0KQ2jhu4kgc+G7kSBraeG7g20gxJHhu4tuaDoNClxbDQpYXjIgPSBcc3VtIFxmcmFjeyhPX3tpan0gLSBFX3tpan0pXjJ9e0Vfe2lqfX0NClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXCggT197aWp9IFwpIGzDoCB04bqnbiBz4buRIHF1YW4gc8OhdCANCi0gXCggRV97aWp9IFwpIGzDoCB04bqnbiBz4buRIGvhu7MgduG7jW5nLg0KDQpO4bq/dSBwLXZhbHVlIDwgMC4wNSwgdGEgY8OzIMSR4bunIGPGoSBz4bufIMSR4buDIGLDoWMgYuG7jyBI4oKAIOKGkiBDw7MgYuG6sW5nIGNo4bupbmcgduG7gSBz4buxIHBo4bulIHRodeG7mWMgZ2nhu69hIGhhaSBiaeG6v24uDQoNCg0KKipDw6FjIGLGsOG7m2MgdGjhu7FjIGhp4buHbiB0cm9uZyBSKioNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlX2dlbmRlcl9ob21lb3duZXIsIGNvcnJlY3QgPSBGQUxTRSkNCmBgYA0KDQojIyAqKlTDrW5oIE9kZHMgUmF0aW8sIFJlbGF0aXZlIFJpc2sqKg0KDQojIyMgKipU4bu3IHPhu5Egbmd1eSBjxqEgKFJlbGF0aXZlIFJpc2sgLSBSUikqKg0KDQoqKktow6FpIG5p4buHbToqKiBSZWxhdGl2ZSBSaXNrIChSUikgbMOgIHThu7cgbOG7hyBnaeG7r2EgeMOhYyBzdeG6pXQgeOG6o3kgcmEgc+G7sSBraeG7h24g4bufIG5ow7NtIHRp4bq/cCB4w7pjIHNvIHbhu5tpIG5ow7NtIGtow7RuZyB0aeG6v3AgeMO6Yy4NCg0KKipDw7RuZyB0aOG7qWM6KioNCg0KXFsNClJSID0gXGZyYWN7XGZyYWN7YX17YStifX17XGZyYWN7Y317YytkfX0NClxdDQoNCioqRGnhu4VuIGdp4bqjaToqKg0KDQotIFJSID0gMTogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIG5ndXkgY8ahIGdp4buvYSBoYWkgbmjDs20uDQotIFJSID4gMTogTmd1eSBjxqEg4bufIG5ow7NtIHRp4bq/cCB4w7pjIGNhbyBoxqFuIG5ow7NtIGtow7RuZyB0aeG6v3AgeMO6Yy4NCi0gUlIgPCAxOiBOZ3V5IGPGoSDhu58gbmjDs20gdGnhur9wIHjDumMgdGjhuqVwIGjGoW4gbmjDs20ga2jDtG5nIHRp4bq/cCB4w7pjLg0KDQojIyMgKipU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpKioNCg0KKipLaMOhaSBuaeG7h206KiogT2RkcyBSYXRpbyAoT1IpIGzDoCB04bu3IGzhu4cgZ2nhu69hIG9kZHMgeOG6o3kgcmEgc+G7sSBraeG7h24g4bufIG5ow7NtIHRp4bq/cCB4w7pjIHNvIHbhu5tpIG5ow7NtIGtow7RuZyB0aeG6v3AgeMO6Yy4NCg0KKipDw7RuZyB0aOG7qWM6KioNCg0KXFsNCk9SID0gXGZyYWN7XGZyYWN7YX17Yn19e1xmcmFje2N9e2R9fSA9IFxmcmFje2EgXHRpbWVzIGR9e2IgXHRpbWVzIGN9DQpcXQ0KDQoqKkRp4buFbiBnaeG6o2k6KioNCg0KLSBPUiA9IDE6IEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSBvZGRzIGdp4buvYSBoYWkgbmjDs20uDQotIE9SID4gMTogT2RkcyB44bqjeSByYSBz4buxIGtp4buHbiDhu58gbmjDs20gdGnhur9wIHjDumMgY2FvIGjGoW4gbmjDs20ga2jDtG5nIHRp4bq/cCB4w7pjLg0KLSBPUiA8IDE6IE9kZHMgeOG6o3kgcmEgc+G7sSBraeG7h24g4bufIG5ow7NtIHRp4bq/cCB4w7pjIHRo4bqlcCBoxqFuIG5ow7NtIGtow7RuZyB0aeG6v3AgeMO6Yy4NCg0KKipDw6FjIGLGsOG7m2MgdGjhu7FjIGhp4buHbiB0csOqbiBSKioNCg0KYGBge3J9DQojIEzhuqV5IHPhu5EgbGnhu4d1DQphIDwtIHRhYmxlX2dlbmRlcl9ob21lb3duZXJbIkYiLCAiWSJdDQpiIDwtIHRhYmxlX2dlbmRlcl9ob21lb3duZXJbIkYiLCAiTiJdDQpjIDwtIHRhYmxlX2dlbmRlcl9ob21lb3duZXJbIk0iLCAiWSJdDQpkIDwtIHRhYmxlX2dlbmRlcl9ob21lb3duZXJbIk0iLCAiTiJdDQoNCiMgVMOtbmggT2Rkcw0Kb2Rkc19mZW1hbGUgPC0gYSAvIGINCm9kZHNfbWFsZSA8LSBjIC8gZA0KDQojIE9kZHMgUmF0aW8gKE9SKQ0Kb3IgPC0gb2Rkc19mZW1hbGUgLyBvZGRzX21hbGUNCg0KIyBSZWxhdGl2ZSBSaXNrIChSUikNCnJpc2tfZmVtYWxlIDwtIGEgLyAoYSArIGIpDQpyaXNrX21hbGUgPC0gYyAvIChjICsgZCkNCnJyIDwtIHJpc2tfZmVtYWxlIC8gcmlza19tYWxlDQoNCmxpc3QoDQogIG9kZHNfZmVtYWxlID0gb2Rkc19mZW1hbGUsDQogIG9kZHNfbWFsZSA9IG9kZHNfbWFsZSwNCiAgT1IgPSBvciwNCiAgUlIgPSBycg0KKQ0KYGBgDQoNCg0KKipLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBPZGRzIFJhdGlvKioNCg0KRG8gT1Iga2jDtG5nIHBow6JuIHBo4buRaSBjaHXhuqluLCBuw6puIGzhuqV5IGxvZyhPUikgxJHhu4MgeMOieSBk4buxbmcga2hv4bqjbmcgdGluIGPhuq15Og0KDQpcWw0KQ0lfe2xvZyhPUil9ID0gXGxvZyhPUikgXHBtIFogXGNkb3QgU0Vfe2xvZyhPUil9DQpcXQ0KDQpW4bubaToNClxbDQpTRSA9IFxzcXJ0e1xmcmFjezF9e2F9ICsgXGZyYWN7MX17Yn0gKyBcZnJhY3sxfXtjfSArIFxmcmFjezF9e2R9fQ0KXF0NCg0KQ2h1eeG7g24gduG7gSB0aGFuZyBPUiBi4bqxbmcgaMOgbSBtxak6IFwoIGVee0NJfSBcKS4NCg0KKipDw6FjIGLGsOG7m2MgdGjhu7FjIGhp4buHbiB0csOqbiBSKioNCg0KYGBge3J9DQpzZV9sb2dfb3IgPC0gc3FydCgxL2EgKyAxL2IgKyAxL2MgKyAxL2QpDQp6IDwtIDEuOTYgICMgaOG7hyBz4buRIGNobyA5NSUNCmNpX2xvd2VyIDwtIGV4cChsb2cob3IpIC0geiAqIHNlX2xvZ19vcikNCmNpX3VwcGVyIDwtIGV4cChsb2cob3IpICsgeiAqIHNlX2xvZ19vcikNCmMoY2lfbG93ZXIsIGNpX3VwcGVyKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBO4bq/dSAqKk9SIDwgMSoqLCBvZGRzIGPhu6dhIHZp4buHYyBz4bufIGjhu691IG5ow6Ag4bufIG5ow7NtIEZlbWFsZSBuaOG7jyBoxqFuIE1hbGUuDQotIE7hur91ICoqUlIgPCAxKiosIHBo4bulIG7hu68gY8OzIG5ndXkgY8ahIHPhu58gaOG7r3UgbmjDoCB0aOG6pXAgaMahbiBuYW0gZ2nhu5tpLg0KDQpL4bq/dCBsdeG6rW4gY+G6p24gxJFpIGvDqG0gduG7m2kga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZSB2w6Aga2hv4bqjbmcgdGluIGPhuq15LCBraMO0bmcgbsOqbiBjaOG7iSBuaMOsbiB2w6BvIE9SL1JSLg0KDQrEkMOieSBsw6AgbeG7mXQgdsOtIGThu6UgxJFp4buDbiBow6xuaCBjaG8gdmnhu4djIHPhu60gZOG7pW5nIE9kZHMgUmF0aW8gdHJvbmcga2luaCB04bq/L3jDoyBo4buZaSBo4buNYyDEkeG7gyBtw7QgdOG6oyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBoYWkgxJHhurdjIMSRaeG7g20gcGjDom4gbG/huqFpLg0KDQojIyAqKlRo4buxYyBow6BuaCB0csOqbiBi4buZIGThu68gbGnhu4d1KioNCg0KKipU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBnaeG7r2EgTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyDQp0YmwgPC0gdGFibGUoZGF0YSRNYXJpdGFsU3RhdHVzLCBkYXRhJEhvbWVvd25lcikNCnRibA0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqS2jDoWNoIGjDoG5nIMSRw6Mga+G6v3QgaMO0biAoTSkqKjogQ8OzIHThu5tpIDUxNDcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIOG7nywgY2hp4bq/bSBwaOG6p24gbOG7m24gdHJvbmcgbmjDs20gbsOgeSwgdHJvbmcga2hpIGNo4buJIGPDsyAxNzE5IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AuDQoNCi0gKipLaMOhY2ggaMOgbmcgxJHhu5ljIHRow6JuIChTKSoqOiBOZ8aw4bujYyBs4bqhaSwgbmjDs20gbsOgeSBjw7MgeHUgaMaw4bubbmcga2jDtG5nIHPhu58gaOG7r3UgbmjDoCDhu58gY2FvIGjGoW4gduG7m2kgMzg5NiBuZ8aw4budaSwgdHJvbmcga2hpIHPhu5EgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGNo4buJIGzDoCAzMjk3IG5nxrDhu51pLg0KDQoqKktp4buDbSDEkeG7i25oIENoaS1zcXVhcmUqKg0KDQpgYGB7cn0NCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QodGJsKQ0KY2hpX3Rlc3QNCmBgYA0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktYsOsbmggcGjGsMahbmc6IFgtc3F1YXJlZCA9IDEyNDEuMg0KDQotIELhuq1jIHThu7EgZG86IGRmID0gMQ0KDQotIEdpw6EgdHLhu4sgcDogcC12YWx1ZSA8IDIuMmUtMTYNCg0KKipL4bq/dCBsdeG6rW46KioNCg0KLSBWw6wgZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIChwIDwgMC4wNSksIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgSDAuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6AuDQoNCioqVMOtbmggT2RkcyBSYXRpbyB2w6AgUmVsYXRpdmUgUmlzayoqDQoNCmBgYHtyfQ0KIyBM4buNYyBk4buvIGxp4buHdTogY2jhu4kgbOG6pXkgTWFycmllZCB2w6AgU2luZ2xlDQpkYXRhMiA8LSBzdWJzZXQoZGF0YSwgTWFyaXRhbFN0YXR1cyAlaW4lIGMoIk0iLCAiUyIpKQ0KDQojIFThuqFvIGLhuqNuZyAyeDINCnRibDIgPC0gdGFibGUoZGF0YTIkTWFyaXRhbFN0YXR1cywgZGF0YTIkSG9tZW93bmVyKQ0KdGJsMg0KDQojIFTDrW5oIHRvw6FuIE9kZHMgUmF0aW8gdsOgIFJlbGF0aXZlIFJpc2sNCmxpYnJhcnkoZXBpUikNCmVwaV9yZXN1bHQgPC0gZXBpLjJieTIodGJsMiwgbWV0aG9kID0gImNvaG9ydC5jb3VudCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KZXBpX3Jlc3VsdA0KYGBgDQoNCg0KDQojIyAqKkvhur90IHF14bqjIHBow6JuIHTDrWNoKioNCg0KKipC4bqjbmcgY2jDqW8gdOG6p24gc3XhuqV0IGdp4buvYSBNYXJpdGFsU3RhdHVzIHbDoCBIb21lb3duZXIqKg0KDQp8IE1hcml0YWwgU3RhdHVzIHwgS2jDtG5nIHPhu58gaOG7r3UgbmjDoCAoTikgfCBDw7Mgc+G7nyBo4buvdSBuaMOgIChZKSB8IFThu5VuZyBj4buZbmcgfA0KfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwNCnwgTWFycmllZCAoTSkgICAgfCAxLDcxOSAgICAgICAgICAgICAgICB8IDUsMTQ3ICAgICAgICAgICAgICB8IDYsODY2ICAgICB8DQp8IFNpbmdsZSAoUykgICAgIHwgMyw4OTYgICAgICAgICAgICAgICAgfCAzLDI5NyAgICAgICAgICAgICAgfCA3LDE5MyAgICAgfA0KfCAqKlThu5VuZyBj4buZbmcqKiAgfCA1LDYxNSAgICAgICAgICAgICAgICB8IDgsNDQ0ICAgICAgICAgICAgICB8IDE0LDA1OSAgICB8DQoNCi0tLQ0KDQoqKlThu7cgbOG7hyBoaeG7h24gbeG6r2MgKEluY2lkZW5jZSBSaXNrKSoqDQoNCi0gKipOaMOzbSBNYXJyaWVkKio6IDI1LjA0JSAoQ0k6IDI0LjAyIOKAkyAyNi4wOCkNCi0gKipOaMOzbSBTaW5nbGUqKjogNTQuMTYlIChDSTogNTMuMDAg4oCTIDU1LjMyKQ0KDQpOaOG7r25nIG5nxrDhu51pICoqxJHhu5ljIHRow6JuKiogY8OzIHjDoWMgc3XhuqV0IGtow7RuZyBz4bufIGjhu691IG5ow6AgKipjYW8gaMahbiBn4bqlcCDEkcO0aSoqIHNvIHbhu5tpIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0bi4NCg0KLS0tDQoNCioqUmVsYXRpdmUgUmlzayAoUlIpKioNCg0KLSAqKlJSID0gMC40NioqICg5NSUgQ0k6IDAuNDQg4oCTIDAuNDgpDQoNCk5ndXkgY8ahIGtow7RuZyBz4bufIGjhu691IG5ow6Ag4bufIG5ow7NtIMSRw6Mga+G6v3QgaMO0biBjaOG7iSBi4bqxbmcgKio0NiUqKiBzbyB24bubaSBuaMOzbSDEkeG7mWMgdGjDom4uDQoNCi0tLQ0KDQoqKk9kZHMgUmF0aW8gKE9SKSoqDQoNCi0gKipPUiA9IDAuMjgqKiAoOTUlIENJOiAwLjI2IOKAkyAwLjMwKQ0KDQpYw6FjIHN14bqldCBraMO0bmcgc+G7nyBo4buvdSBuaMOgIOG7nyBuaMOzbSDEkcOjIGvhur90IGjDtG4gdGjhuqVwIGjGoW4gKio3MiUqKiBzbyB24bubaSBuaMOzbSDEkeG7mWMgdGjDom4uDQoNCi0tLQ0KDQoqKlJpc2sgRGlmZmVyZW5jZSB2w6AgQXR0cmlidXRpb24qKg0KDQotICoqQ2jDqm5oIGzhu4djaCBuZ3V5IGPGoSB0dXnhu4d0IMSR4buRaSAocmlzayBkaWZmZXJlbmNlKSoqOiAtMjkuMTMgxJFp4buDbSBwaOG6p24gdHLEg20NCi0gKipU4bu3IGzhu4cgcXV5IHRyw6FjaCB0cm9uZyBuaMOzbSBwaMahaSBuaGnhu4VtIChleHBvc2VkKSoqOiAtMTE2LjM0JQ0KLSAqKlThu7cgbOG7hyBxdXkgdHLDoWNoIHRvw6BuIGTDom4gKHBvcHVsYXRpb24pKio6IC0zNS42MiUNCg0KxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIHZp4buHYyBr4bq/dCBow7RuIGPDsyB0aOG7gyBnacO6cCBnaeG6o20gxJHDoW5nIGvhu4MgcuG7p2kgcm8ga2jDtG5nIHPhu58gaOG7r3UgbmjDoCDhu58gY+G6pXAgxJHhu5kgY8OhIG5ow6JuIGzhuqtuIGTDom4gc+G7kS4NCg0KLS0tDQoNCioqS2nhu4NtIMSR4buLbmggw70gbmdoxKlhIHRo4buRbmcga8OqKioNCg0KLSAqKkNoaS1zcXVhcmVkIHRlc3QqKjogz4fCsigxKSA9IDEyNDIuNDMsIHAgPCAwLjAwMQ0KLSAqKkZpc2hlcuKAmXMgZXhhY3QgdGVzdCoqOiBwIDwgMC4wMDENCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIHZp4buHYyBz4bufIGjhu691IG5ow6AgbMOgICoqcuG6pXQgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqIChwIDwgMC4wMDEpLg0KDQotLS0NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KLSBDw7MgbeG7kWkgbGnDqm4gaOG7hyBy4bqldCByw7UgcsOgbmcgdsOgIGPDsyDDvSBuZ2jEqWEgZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6Agdmnhu4djIHPhu58gaOG7r3UgbmjDoC4NCi0gTmjhu69uZyBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHThu7cgbOG7hyB2w6AgeMOhYyBzdeG6pXQga2jDtG5nIHPhu58gaOG7r3UgbmjDoCAqKnRo4bqlcCBoxqFuIMSRw6FuZyBr4buDKiogc28gduG7m2kgbmfGsOG7nWkgxJHhu5ljIHRow6JuLg0KLSDEkMOieSBsw6AgbeG7mXQgcGjDoXQgaGnhu4duIHF1YW4gdHLhu41uZyBjw7MgdGjhu4MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgY8OhYyBuZ2hpw6puIGPhu6l1IHjDoyBo4buZaSBo4buNYyBob+G6t2MgY2jDrW5oIHPDoWNoIG5ow6Ag4bufLg0KDQoNCiMgKipCOiBIT+G6oFQgxJDhu5hORyBUUsOKTiBM4buaUCoqDQoNClRyb25nIGhv4bqhdCDEkeG7mW5nIG7DoHksIGNow7puZyB0YSBz4bq9IHPhu60gZOG7pW5nIGThu68gbGnhu4d1ICoqU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zKiogxJHhu4MgcGjDom4gdMOtY2ggbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24gbmjhu4sgcGjDom4uIE3hu6VjIHRpw6p1IGzDoDoNCg0KLSBU4bqhbyBi4bqjbmcgMngyDQotIFTDrW5oIHbDoCBkaeG7hW4gZ2nhuqNpIEhp4buHdSBoYWkgdOG7tyBs4buHIChEaWZmZXJlbmNlIGluIFByb3BvcnRpb25zKQ0KLSBUw61uaCBSZWxhdGl2ZSBSaXNrIChSUikgdsOgIE9kZHMgUmF0aW8gKE9SKQ0KLSBUw61uaCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBPUg0KLSBUaOG7sWMgaGnhu4duIHBow6JuIHTDrWNoIHBow6JuIHThuqduZyAoc3RyYXRpZmllZCBhbmFseXNpcykNCg0KLS0tDQoNCiMjICoqxJDhu41jIHbDoCBsw6BtIHF1ZW4gduG7m2kgZOG7ryBsaeG7h3UqKg0KDQpC4buZIGThu68gbGnhu4d1IOKAnFN1cGVybWFya2V0IFRyYW5zYWN0aW9uc+KAnSBwaOG6o24gw6FuaCBjw6FjIGdpYW8gZOG7i2NoIG11YSBow6BuZyBj4bunYSBraMOhY2ggaMOgbmcgdOG6oWkgbeG7mXQgc2nDqnUgdGjhu4sgdHJvbmcgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gY+G7pSB0aOG7gy4gTeG7l2kgZMOybmcgZOG7ryBsaeG7h3UgdMawxqFuZyDhu6luZyB24bubaSBt4buZdCBnaWFvIGThu4tjaCwgYmFvIGfhu5NtIHRow7RuZyB0aW4gbmjDom4ga2jhuql1IGjhu41jIChnaeG7m2kgdMOtbmgsIGxv4bqhaSB0aMOgbmggdmnDqm4sIGNoaSBuaMOhbmgpLCDEkeG6t2MgxJFp4buDbSBz4bqjbiBwaOG6qW0gKGxv4bqhaSBz4bqjbiBwaOG6qW0sIGvDqm5oIHRoYW5oIHRvw6FuKSwgdsOgIGPDoWMgeeG6v3UgdOG7kSBow6BuaCB2aSB0acOqdSBkw7luZyAodGjhu51pIGdpYW4gbXVhIHPhuq9tLCBt4bupYyDEkeG7mSBow6BpIGzDsm5nLCBnacOhIHRy4buLIMSRxqFuIGjDoG5nLC4uLikuIFThuq1wIGThu68gbGnhu4d1IGfhu5NtIDE0LjA1OSBxdWFuIHPDoXQgdsOgIDE2IGJp4bq/biwgY3VuZyBj4bqlcCBu4buBbiB04bqjbmcgY2hpIHRp4bq/dCDEkeG7gyBwaMOibiB0w61jaCBow6BuaCB2aSBraMOhY2ggaMOgbmcgdsOgIGhp4buHdSBxdeG6oyBraW5oIGRvYW5oIGPhu6dhIHNpw6p1IHRo4buLLg0KDQpgYGB7cn0NCiMgxJDhu41jIGZpbGUNCmxpYnJhcnkoImNzdiIpDQpkYXRhIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9BZG1pbi9Eb3dubG9hZHMvU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zLmNzdiIsIGhlYWRlciA9IFQpDQoNCiMgSGnhu4NuIHRo4buLIGPhuqV1IHRyw7pjIGThu68gbGnhu4d1DQpzdHIoZGF0YSkNCg0KIyBIaeG7g24gdGjhu4sgdsOgaSBkw7JuZyDEkeG6p3UgdsOgIGN14buRaQ0KaGVhZChkYXRhKQ0KdGFpbChkYXRhKQ0KDQojIENodXnhu4NuIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggcGjDuSBo4bujcCBzYW5nIGZhY3Rvcg0KZmFjdG9yIDwtIGMoIkdlbmRlciIsICJNYXJpdGFsU3RhdHVzIiwgIkhvbWVvd25lciIsICJBbm51YWxJbmNvbWUiLA0KICAgICAgICAgICAgICAgICAgICAiQ2l0eSIsICJTdGF0ZW9yUHJvdmluY2UiLCAiQ291bnRyeSIsDQogICAgICAgICAgICAgICAgICAgICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIpDQoNCiMgS2nhu4NtIHRyYSBiaeG6v24gbsOgbyB04buTbiB04bqhaSB0cm9uZyBkYXRhDQpmYWN0b3IgPC0gaW50ZXJzZWN0KGZhY3RvciwgbmFtZXMoZGF0YSkpDQoNCiMgQ2h1eeG7g24gc2FuZyBmYWN0b3INCmRhdGFbZmFjdG9yXSA8LSBsYXBwbHkoZGF0YVtmYWN0b3JdLCBhcy5mYWN0b3IpDQoNCiMgS2nhu4NtIHRyYSBs4bqhaSBj4bqldSB0csO6Yw0Kc3RyKGRhdGEpDQpgYGANCg0KKipHaeG6o2kgdGjDrWNoIGPDoWMgYmnhur9uKioNCg0KQuG7mSBk4buvIGxp4buHdSBnaGkgbOG6oWkgdGjDtG5nIHRpbiB24buBIGPDoWMgZ2lhbyBk4buLY2ggbXVhIGjDoG5nIGPhu6dhIGtow6FjaCBow6BuZywgYmFvIGfhu5NtIHRow7RuZyB0aW4gbmjDom4ga2jhuql1IGjhu41jLCB0aMO0bmcgdGluIHPhuqNuIHBo4bqpbSwgc+G7kSBsxrDhu6NuZyBiw6FuIHJhIHbDoCBkb2FuaCB0aHUuIEThu68gbGnhu4d1IGJhbyBn4buTbSAxNDA1OSBxdWFuIHPDoXQgdsOgIDE2IGJp4bq/bi4gRMaw4bubaSDEkcOieSBsw6AgbcO0IHThuqMgY2hpIHRp4bq/dCBjw6FjIGJp4bq/biBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdToNCg0KfCAgICAqKlTDqm4gQmnhur9uKiogICAgICAgICAgIHwgICAgKirDnSBOZ2jEqWEqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqUHVyY2hhc2VEYXRlKiogICAgICAgICB8IE5nw6B5IGdpYW8gZOG7i2NoIG11YSBow6BuZyBkaeG7hW4gcmEgKMSR4buLbmggZOG6oW5nIG5nw6B5L3Row6FuZy9uxINtKS4gICAgICAgICAgICAgICAgIHwNCnwgKipDdXN0b21lcklEKiogICAgICAgICAgfCBNw6MgxJHhu4tuaCBkYW5oIGR1eSBuaOG6pXQgY2hvIG3hu5dpIGtow6FjaCBow6BuZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkdlbmRlcioqICAgICAgICAgICAgICAgfCBHaeG7m2kgdMOtbmggY+G7p2Ega2jDoWNoIGjDoG5nOiAqKk0qKiAoTmFtKSwgKipGKiogKE7hu68pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipNYXJpdGFsU3RhdHVzKiogICAgICAgIHwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuOiAqKlMqKiAoxJDhu5ljIHRow6JuKSwgKipNKiogKMSQw6Mga+G6v3QgaMO0bikuICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipIb21lb3duZXIqKiAgICAgICAgICAgIHwgVMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6A6ICoqWSoqIChDw7MpLCAqKk4qKiAoS2jDtG5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkNoaWxkcmVuKiogICAgICAgICAgICAgfCBT4buRIGzGsOG7o25nIGNvbiBjw6FpIGPhu6dhIGtow6FjaCBow6BuZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipBbm51YWxJbmNvbWUqKiAgICAgICAgIHwgTeG7qWMgdGh1IG5o4bqtcCBow6BuZyBuxINtIHRoZW8ga2hv4bqjbmcgKFbDrSBk4bulOiAqKiQzMEsgLSAkNTBLKiopLiAgICAgICAgICAgICAgICAgIHwNCnwgKipDaXR5KiogICAgICAgICAgICAgICAgIHwgVGjDoG5oIHBo4buRIG7GoWkga2jDoWNoIGjDoG5nIHRo4buxYyBoaeG7h24gZ2lhbyBk4buLY2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipTdGF0ZW9yUHJvdmluY2UqKiAgICAgIHwgQmFuZyBob+G6t2MgdOG7iW5oICh2w60gZOG7pTogKipDQSoqIGNobyBDYWxpZm9ybmlhLCAqKk9SKiogY2hvIE9yZWdvbikuICAgICAgICAgICAgICAgfA0KfCAqKkNvdW50cnkqKiAgICAgICAgICAgICAgfCBRdeG7kWMgZ2lhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlByb2R1Y3RGYW1pbHkqKiAgICAgICAgfCBOaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oOiAqKkZvb2QqKiAoVGjhu7FjIHBo4bqpbSksICoqRHJpbmsqKiAoxJDhu5MgdeG7kW5nKSwgKipOb24tQ29uc3VtYWJsZSoqIChLaMO0bmcgdGnDqnUgZMO5bmcpLiB8DQp8ICoqUHJvZHVjdERlcGFydG1lbnQqKiAgICB8IELhu5kgcGjhuq1uIHPhuqNuIHBo4bqpbSBuaMawICoqU25hY2sgRm9vZHMqKiwgKipGcm96ZW4gRm9vZHMqKiwgdi52LiAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlByb2R1Y3RDYXRlZ29yeSoqICAgICAgfCBEYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBj4bulIHRo4buDIGjGoW4sIHbDrSBk4bulOiAqKkNhbmR5KiosICoqQmVlciBhbmQgV2luZSoqLiAgICAgICAgICAgICAgfA0KfCAqKlVuaXRzU29sZCoqICAgICAgICAgICAgfCBT4buRIGzGsOG7o25nIMSRxqFuIHbhu4sgc+G6o24gcGjhuqltIMSRw6MgYsOhbiB0cm9uZyBnaWFvIGThu4tjaCDEkcOzLiAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUmV2ZW51ZSoqICAgICAgICAgICAgICB8IERvYW5oIHRodSB04burIGdpYW8gZOG7i2NoICh0w61uaCB0aGVvIFVTRCkuICAgfA0KDQoNCi0tLQ0KDQojIyAqKlBow6JuIHTDrWNoIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIEdlbmRlciB2w6AgSG9tZW93bmVyKioNCg0KIyMjICoqVOG6oW8gYuG6o25nIHThuqduIHPhu5EgY2jDqW8qKg0KDQpgYGB7cn0NCnRhYmxlX2dlbmRlcl9ob21lIDwtIHRhYmxlKGRhdGEkR2VuZGVyLCBkYXRhJEhvbWVvd25lcikNCnRhYmxlX2dlbmRlcl9ob21lDQpgYGANCg0KROG7sWEgdsOgbyBi4bqjbmcgdHLDqm46DQoNCi0gKipO4buvIChGKSoqIGPDsyB04buVbmcgY+G7mW5nIGByIHN1bSh0YWJsZV9nZW5kZXJfaG9tZVsiRiIsIF0pYCBuZ8aw4budaSwgdHJvbmcgxJHDsyBgciB0YWJsZV9nZW5kZXJfaG9tZVsiRiIsICJZIl1gIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCwgY2hp4bq/bSBraG/huqNuZyBgciByb3VuZCgxMDAgKiB0YWJsZV9nZW5kZXJfaG9tZVsiRiIsICJZIl0gLyBzdW0odGFibGVfZ2VuZGVyX2hvbWVbIkYiLCBdKSwgMSlgJS4NCg0KLSAqKk5hbSAoTSkqKiBjw7MgdOG7lW5nIGPhu5luZyBgciBzdW0odGFibGVfZ2VuZGVyX2hvbWVbIk0iLCBdKWAgbmfGsOG7nWksIHbhu5tpIGByIHRhYmxlX2dlbmRlcl9ob21lWyJNIiwgIlkiXWAgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgLCB0xrDGoW5nIOG7qW5nIGtob+G6o25nIGByIHJvdW5kKDEwMCAqIHRhYmxlX2dlbmRlcl9ob21lWyJNIiwgIlkiXSAvIHN1bSh0YWJsZV9nZW5kZXJfaG9tZVsiTSIsIF0pLCAxKWAlLg0KDQoqKk5o4bqtbiB4w6l0OioqIA0KDQpU4bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGPhu6dhIG7hu68gY8OzIHbhursgbmjhu4luaCBoxqFuIG3hu5l0IGNow7p0IHNvIHbhu5tpIG5hbSAoa2hv4bqjbmcgNjAuNiUgc28gduG7m2kgNTkuNSUpLCB0dXkgbmhpw6puIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIGtow6Egbmjhu48uICANCsSQ4buDIMSRw6FuaCBnacOhIHLDtSByw6BuZyBoxqFuIHbhu4EgbeG7qWMgxJHhu5kgbGnDqm4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/biwgdGEgc+G6vSB0aeG6v3AgdOG7pWMgdMOtbmggY8OhYyBjaOG7iSBz4buRIMSR4buLbmggbMaw4bujbmcgbmjGsDogIA0KSGnhu4d1IGhhaSB04bu3IGzhu4cgKERpZmZlcmVuY2UgaW4gUHJvcG9ydGlvbnMpLCBSZWxhdGl2ZSBSaXNrIChSUiksIE9kZHMgUmF0aW8gKE9SKS4NCg0KLS0tDQoNCiMjIyAqKlTDrW5oIEhp4buHdSBIYWkgVOG7tyBM4buHKioNCg0KYGBge3J9DQpwcm9wX3RhYmxlIDwtIHByb3AudGFibGUodGFibGVfZ2VuZGVyX2hvbWUsIG1hcmdpbiA9IDEpDQpwcm9wX3RhYmxlDQoNCmRpZmZfcHJvcCA8LSBwcm9wX3RhYmxlWzEsICJZIl0gLSBwcm9wX3RhYmxlWzIsICJOIl0NCmRpZmZfcHJvcA0KYGBgDQoNClThu7cgbOG7hyBz4bufIGjhu691IG5ow6A6DQoNCi0g4bueICoqbuG7ryoqIGzDoCBgciByb3VuZChwcm9wX3RhYmxlWzEsICJZIl0sIDQpYCAodOG7qWMgbMOgIGByIHJvdW5kKDEwMCAqIHByb3BfdGFibGVbMSwgIlkiXSwgMSlgJSkNCg0KLSDhu54gKipuYW0qKiBsw6AgYHIgcm91bmQocHJvcF90YWJsZVsyLCAiWSJdLCA0KWAgKHThu6ljIGzDoCBgciByb3VuZCgxMDAgKiBwcm9wX3RhYmxlWzIsICJZIl0sIDEpYCUpDQoNCkhp4buHdSBoYWkgdOG7tyBs4buHIGdp4buvYSBu4buvIHbDoCBuYW0gbMOgIGByIHJvdW5kKGRpZmZfcHJvcCwgNClgLCB0xrDGoW5nIMSRxrDGoW5nIGByIHJvdW5kKDEwMCAqIGRpZmZfcHJvcCwgMilgIMSRaeG7g20gcGjhuqduIHRyxINtLg0KDQoqKkvhur90IGx14bqtbjoqKiAgDQoNClThu7cgbOG7hyBu4buvIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiBuYW0ga2hv4bqjbmcgMS4wMCUsIHR1eSBuaGnDqm4gbeG7qWMgY2jDqm5oIGzhu4djaCBuw6B5IGtow6Egbmjhu48gdsOgIGNoxrBhIHRo4buDIGvhur90IGx14bqtbiBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIG7hur91IGNoxrBhIHTDrW5oIGtob+G6o25nIHRpbiBj4bqteSAoY29uZmlkZW5jZSBpbnRlcnZhbCkgaG/hurdjIHRo4buxYyBoaeG7h24gY8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiBjaMOtbmggdGjhu6ljIG5oxrAga2nhu4NtIMSR4buLbmggeiBob+G6t2MgY2hpIGLDrG5oIHBoxrDGoW5nLg0KDQotLS0NCg0KIyMjICoqVMOtbmggUmVsYXRpdmUgUmlzayAoUlIpKioNCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0KcnJfcmVzdWx0IDwtIHJpc2tyYXRpbyh0YWJsZV9nZW5kZXJfaG9tZSkNCnJyX3Jlc3VsdCRtZWFzdXJlDQpgYGANCg0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyB0YSB0aOG6pXkgUmVsYXRpdmUgUmlzayAoUlIpIGPhu6dhIG5hbSBzbyB24bubaSBu4buvIGzDoCBgciByb3VuZChycl9yZXN1bHQkbWVhc3VyZVsiTSIsICJlc3RpbWF0ZSJdLCA0KWAuIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY+G7p2EgUlIgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyBgciByb3VuZChycl9yZXN1bHQkbWVhc3VyZVsiTSIsICJsb3dlciJdLCA0KWAgxJHhur9uIGByIHJvdW5kKHJyX3Jlc3VsdCRtZWFzdXJlWyJNIiwgInVwcGVyIl0sIDQpYC4NCg0KKipL4bq/dCBsdeG6rW46KiogIA0KUlIgPCAxIGNobyB0aOG6pXkgbmFtIGPDsyB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIHRo4bqlcCBoxqFuIG7hu68gbeG7mXQgY2jDunQgKGNo4buJIGPDsm4ga2hv4bqjbmcgYHIgcm91bmQocnJfcmVzdWx0JG1lYXN1cmVbIk0iLCAiZXN0aW1hdGUiXSwgNCkgKiAxMDBgJSBzbyB24bubaSBu4buvKS4gVHV5IG5oacOqbiwgdsOsIGtob+G6o25nIHRpbiBj4bqteSA5NSUgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMS4wLCBuw6puIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgxJHhu6cgbeG6oW5oIMSR4buDIGvhur90IGx14bqtbiBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIE7Ds2kgY8OhY2gga2jDoWMsIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgZ2nhu69hIG5hbSB2w6AgbuG7ryBjw7MgdGjhu4MgY29pIGzDoCB0xrDGoW5nIMSRxrDGoW5nLg0KDQotLS0NCg0KIyMjICoqVMOtbmggT2RkcyBSYXRpbyAoT1IpIHbDoCBLaG/huqNuZyBUaW4gQ+G6rXkqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpvcl9yZXN1bHQgPC0gb2Rkc3JhdGlvKHRhYmxlX2dlbmRlcl9ob21lKQ0Kb3JfcmVzdWx0DQpvcl9yZXN1bHQkY29uZi5pbnQNCmBgYA0KDQpQaMOibiB0w61jaCBi4bqjbmcgdGjDrCBnaeG7r2EgaGFpIG5ow7NtIGdp4bubaSB0w61uaCAoRiB2w6AgTSkgY2hvIHRo4bqleToNCg0KLSBU4bu3IHPhu5Egb2RkcyAob2RkcyByYXRpbykgZ2nhu69hIG5ow7NtIG5hbSAoTSkgc28gduG7m2kgbuG7ryAoRikgbMOgICoqMC45NioqLCB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGzDoCAqKlswLjg5OyAxLjAyXSoqLg0KLSBHacOhIHRy4buLIHAgdOG7qyBjw6FjIHBow6lwIGtp4buDbSDEkeG7i25oIGhhaSBwaMOtYToNCiAgLSBNaWQtcCBleGFjdDogKipwID0gMC4xOTUqKg0KICAtIEZpc2hlcidzIGV4YWN0OiAqKnAgPSAwLjE5NioqDQogIC0gQ2hpLXNxdWFyZTogKipwID0gMC4xOTUqKg0KDQpEbyB04bqldCBj4bqjIGPDoWMgZ2nDoSB0cuG7iyBwIMSR4buBdSBs4bubbiBoxqFuIG3hu6ljIMO9IG5naMSpYSB0aMO0bmcgdGjGsOG7nW5nICgqKs6xID0gMC4wNSoqKSwga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBuaMOzbSBuYW0gdsOgIG7hu68gduG7gSBiaeG6v24gxJHGsOG7o2MgcGjDom4gdMOtY2guDQoNCk5oxrAgduG6rXksIGvhur90IHF14bqjIGNobyB0aOG6pXkga2jDtG5nIGPDsyBt4buRaSBsacOqbiBxdWFuIHLDtSBy4buHdCBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBiaeG6v24sIHRoZW8gcGjDom4gdMOtY2ggb2RkcyByYXRpbyB2w6AgY8OhYyBraeG7g20gxJHhu4tuaCB4w6FjIHN14bqldCB0xrDGoW5nIOG7qW5nLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=