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

1.1 ĐỌC DỮ LIỆU

  • Bộ dữ liệu “Supermarket Transactions” lưu trữ thông tin chi tiết về các giao dịch mua sắm tại một siêu thị trong một khoảng thời gian cụ thể. Mỗi dòng trong tập dữ liệu tương ứng với một giao dịch, bao gồm nhiều trường thông tin liên quan đến khách hàng (giới tính, hạng thành viên, chi nhánh mua hàng), sản phẩm (nhóm hàng, phương thức thanh toán), cũng như các yếu tố phản ánh hành vi tiêu dùng (thời điểm mua hàng, mức độ hài lòng, tổng giá trị đơn hàng,…).

  • Dữ liệu được lưu dưới định dạng CSV, vì vậy cần được đọc từ tệp .csv. Ta gán bộ dữ liệu Supermarket Transactions vào một đối tượng có tên là npta.

  • Đọc file CSV với dấu phân cách là dấu chấm phẩy

1.1.1 Đọc file dữ liệu gốc và xác định cấu trúc dữ liệu

data <- read.csv("Supermarket Transactions TH.csv", sep = ";", stringsAsFactors = FALSE)
  • Để kiểm tra cấu trúc tổng quát của bộ dữ liệu, ta sử dụng hàm str(), viết tắt của từ structure.

  • Hàm str() thường được dùng để khảo sát nhanh đặc điểm của một đối tượng, đặc biệt là các npta frame. Cụ thể, lệnh này cung cấp:

  • Số lượng dòng và số lượng cột trong dữ liệu

  • Tên các biến (cột)

  • Kiểu dữ liệu của từng biến (số, chuỗi, nhân tố,…)

  • Một vài giá trị mẫu ban đầu của mỗi biến

  • Nhờ đó, str() là công cụ hữu ích giúp ta hình dung sơ bộ về cấu trúc dữ liệu trước khi tiến hành phân tích chi tiết.

str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "12/18/2007" "12/20/2007" "12/21/2007" "12/21/2007" ...
##  $ 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          : chr  "27,38" "14,9" "5,52" "4,44" ...

Từ kết quả hiển thị của hàm str(), ta nhận thấy:

Bộ dữ liệu gồm 14.059 quan sát (obs) và 16 biến (variables).

Tên các biến, kiểu dữ liệu tương ứng, cùng với một vài giá trị tiêu biểu đã được liệt kê rõ ràng.

Mục tiêu của phân tích: Áp dụng các kỹ thuật thống kê mô tả và thống kê suy diễn nhằm khám phá những đặc điểm nổi bật của khách hàng cũng như hành vi mua sắm của họ. Phân tích tập trung vào các biến định tính (categorical variables), bao gồm:

  • Gender: Giới tính (F – Nữ, M – Nam)

  • 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: Thu nhập hàng năm (được phân chia theo các khoảng)

  • City, StateorProvince, Country: Thông tin về vị trí địa lý của khách hàng

  • ProductFamily, ProductDepartment, ProductCategory: Các cấp độ phân loại sản phẩm mà khách hàng đã mua

Thông qua việc phân tích các biến định tính này, ta kỳ vọng có thể rút ra những hiểu biết giá trị về phân khúc khách hàng, xu hướng tiêu dùng, cũng như các yếu tố ảnh hưởng đến hành vi mua sắm tại siêu thị.

1.1.2 Lựa chọn các biến định tính

Giải thích:

  • c(““): tạo vecto
  • npthinh <- data[, dldt]: lấy trong bộ dữ liệu data các cột trong dldt vừa tạo ra (các biến định tính), và lấy tất cả các hàng (full quan sát)
# Chọn các biến định tính
dldt <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")

# Tạo bộ dữ liệu mới chỉ chứa định tính
npt <- data[, dldt]

1.2. TỔNG QUAN VỀ DỮ LIỆU

1.2.1 Nội dung dữ liệu

  • Bộ dữ liệu Supermarket Transactions này gồm 14,059 giao dịch mua hàng tại siêu thị, với các thông tin liên quan đến khách hàng và sản phẩm bao gồm mã định danh khách hàng và các thông tin liên quan, vị trí địa lý, chi tiết các sản phẩm được mua.

  • Dữ liệu này có thể được sử dụng để phân tích hành vi mua sắm của khách hàng, phân khúc thị trường, hoặc đánh giá hiệu quả kinh doanh theo từng sản phẩm, từng khu vực và từng nhóm đối tượng.

1.2.2 Danh sách các biến và mô tả

Cấu trúc bộ dữ liệu Supermarket Transactions

str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "12/18/2007" "12/20/2007" "12/21/2007" "12/21/2007" ...
##  $ 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          : chr  "27,38" "14,9" "5,52" "4,44" ...
  • Nhưng với yêu cầu chỉ sử dụng các biến định tính để phân tính nên chúng ta chỉ quan tâm đến các biến như sau :

    • Gender: Giới tính (F - Nữ, M - Nam)
    • MaritalStatus: Tình trạng hôn nhân (S - Độc thân, M - Đã kết hôn)
    • Homeowner: Có sở hữu nhà hay không (Y - Có, N - Không)
    • AnnualIncome: Thu nhập hàng năm (được biểu thị dưới dạng các khoảng)
    • City, StateorProvince, Country: Thông tin địa lý
    • ProductFamily, ProductDepartment, ProductCategory: Phân loại sản phẩm

1.2.3 Số biến và số quan sát

dim(npt)
## [1] 14059    10
  • Bộ dữ liệu npt chứa tổng cộng 14.059 quan sát cùng với 10 biến đặc trưng tương ứng là biến định tính.
  • Mỗi quan sát sẽ tưởng ứng với mỗi giao dịch mua hàng tại siêu thị.

1.2.4 Hiển thị dữ liệu

1.2.4.1 Hiển thị vài dòng đầu
head(npt)
##   Gender MaritalStatus Homeowner  AnnualIncome          City StateorProvince
## 1      F             S         Y   $30K - $50K   Los Angeles              CA
## 2      M             M         Y   $70K - $90K   Los Angeles              CA
## 3      F             M         N   $50K - $70K     Bremerton              WA
## 4      M             M         Y   $30K - $50K      Portland              OR
## 5      F             S         Y $130K - $150K Beverly Hills              CA
## 6      F             M         Y   $10K - $30K Beverly Hills              CA
##   Country ProductFamily ProductDepartment      ProductCategory
## 1     USA          Food       Snack Foods          Snack Foods
## 2     USA          Food           Produce           Vegetables
## 3     USA          Food       Snack Foods          Snack Foods
## 4     USA          Food            Snacks                Candy
## 5     USA         Drink         Beverages Carbonated Beverages
## 6     USA          Food              Deli          Side Dishes
1.2.4.2 Hiển thị vài dòng cuối
tail(npt)
##       Gender MaritalStatus Homeowner AnnualIncome        City StateorProvince
## 14054      F             M         N  $10K - $30K      Yakima              WA
## 14055      F             M         Y  $10K - $30K   Bremerton              WA
## 14056      F             M         Y  $10K - $30K Walla Walla              WA
## 14057      M             S         Y  $30K - $50K    Portland              OR
## 14058      F             S         N  $50K - $70K     Spokane              WA
## 14059      M             S         N  $50K - $70K    Portland              OR
##       Country  ProductFamily ProductDepartment      ProductCategory
## 14054     USA Non-Consumable         Household       Paper Products
## 14055     USA           Food      Baking Goods         Baking Goods
## 14056     USA           Food      Frozen Foods           Vegetables
## 14057     USA          Drink         Beverages Pure Juice Beverages
## 14058     USA          Drink             Dairy                Dairy
## 14059     USA Non-Consumable         Household           Electrical

1.2.5 Kiểm tra dữ liệu

1.2.5.1 Kiểm tra số lượng NA trong cột định tính

Giải thích:

sapply(npt, …): áp dụng hàm cho từng cột trong dữ liệu npt.

sum(is.na(x)): đếm số lượng NA trong từng cột.

# Kiểm tra số lượng NA trong mỗi cột định tính
na_counts <- sapply(npt, function(x) sum(is.na(x)))
na_counts
##            Gender     MaritalStatus         Homeowner      AnnualIncome 
##                 0                 0                 0                 0 
##              City   StateorProvince           Country     ProductFamily 
##                 0                 0                 0                 0 
## ProductDepartment   ProductCategory 
##                 0                 0

Nhận xét - Kết quả thu được cho thấy rằng tất cả các cột định tính đều không có giá trị thiếu (NA) vì số lượng NA trong các cột đều hiển thị là 0

1.2.5.2 Chuyển đổi các cột sang factor nếu chúng chưa phải là factor

Giải thích:

  • lapply(npt, function(x) { … }): Áp dụng hàm cho từng cột của npt. Trong R, lapply() hoạt động trên list (và data frame về bản chất là list các cột).

  • if (!is.factor(x)): Nếu cột đó chưa phải là factor.

  • as.factor(x): Chuyển cột đó thành kiểu factor.

  • return(x): Nếu đã là factor rồi thì giữ nguyên.

  • as.data.frame(…): Vì lapply() trả về một list, nên ta gói lại thành data.frame để đảm bảo giữ đúng cấu trúc bảng dữ liệu ban đầu.

# Chuyển đổi các cột sang factor nếu chưa phải là factor
npt <- as.data.frame(lapply(npt, function(x) {
  if (!is.factor(x)) {
    return(as.factor(x))
  } else {
    return(x)
  }
}))

Kiểm tra lại sau khi chuyển đổi

Giải thích:

  • sapply(npt, class): Áp dụng hàm class() cho từng cột để kiểm tra kiểu dữ liệu. Kết quả trả về là một vector hiển thị tên cột và loại dữ liệu tương ứng.

  • Nếu kết quả là “factor” cho tất cả các cột → chuyển đổi thành công.

sapply(npt, class)
##            Gender     MaritalStatus         Homeowner      AnnualIncome 
##          "factor"          "factor"          "factor"          "factor" 
##              City   StateorProvince           Country     ProductFamily 
##          "factor"          "factor"          "factor"          "factor" 
## ProductDepartment   ProductCategory 
##          "factor"          "factor"

Nhận xét : Kết quả thu được toàn bộ các biến đã được chuyển đổi thành dạng factor.

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

2.1. GENDER

2.1.1 Thống kê tần suất và trực quan hóa

Giải thích:

  • Sử dụng hàm table() để đếm số lần xuất hiện (tần suất) của từng giá trị trong biến định tính.

  • prop.table(tab_gender) tạo bảng tỷ lệ phần trăm (theo dạng thập phân). Nhân với 100 để ra phần trăm.

  • round(…, 2) làm tròn 2 chữ số sau dấu phẩy.

  • barplot() tạo biểu đồ cột từ bảng tần suất.

  • main: tiêu đề biểu đồ.

  • col: màu sắc cột (ở đây là màu “steelblue”).

  • las = 2: xoay nhãn trục hoành (X) theo chiều dọc để dễ đọc.

tab_gender <- table(npt$Gender)
tab_gender
## 
##    F    M 
## 7170 6889
table(npt$Gender)/sum(nrow(npt))
## 
##         F         M 
## 0.5099936 0.4900064
barplot(tab_gender, main = "Tần suất - Gender", col = "steelblue", las = 2)

2.1.2 Nhận xét

  • Dữ liệu cho thấy có 7170 khách hàng là nữ (50.9993598%) và 6889 là khách hàng nam (49.0006402%).

  • Phân bố giới tính gần như đồng đều, không có sự chênh lệch lớn.

  • Điều này phản ánh rằng chuỗi siêu thị không nhắm đến một giới tính cụ thể, mà phục vụ tốt cả hai nhóm.

  • Ngoài ra, tỷ lệ nữ hơi cao hơn có thể do phụ nữ thường đảm nhận vai trò mua sắm thực phẩm và tiêu dùng gia đình, nên khả năng cao họ là người đứng tên giao dịch nhiều hơn trong hóa đơn.

2.2 MARITALSTATUS

2.2.1 Thống kê tuần suất và trực quan hóa

tab_MaritalStatus <- table(npt$MaritalStatus)
tab_MaritalStatus
## 
##    M    S 
## 6866 7193
table(npt$MaritalStatus)/sum(nrow(npt))
## 
##         M         S 
## 0.4883704 0.5116296
barplot(tab_MaritalStatus, main = "Tình trạng hôn nhân - MaritalStatus", col = "coral", las = 2) 

2.2.2 Nhận xét

  • Số lượng khách hàng độc thân (Single – ký hiệu S) là 6866 người (chiếm 48.8370439%), còn người đã kết hôn (Married – M) là 1, 0 người (chiếm 51.1629561%)

  • Mặc dù tỷ lệ khá cân bằng, nhưng nhóm độc thân chiếm tỷ lệ cao hơn một chút.

  • Giải thích hợp lý cho điều này có thể là:

    • Những người độc thân có xu hướng tự đi mua sắm nhiều hơn, không dựa vào bạn đời.

    • Ngoài ra, người trẻ độc thân thường sống ở thành thị và sử dụng dịch vụ siêu thị thường xuyên hơn, trong khi người đã kết hôn có thể mua theo nhóm hoặc theo hộ gia đình lớn và ít giao dịch hơn trên mỗi cá nhân.

2.3 HOMEOWNER

2.3.1 Thống kê tần suất và trực quan hóa

tab_Homeowner <- table(npt$Homeowner)
tab_Homeowner
## 
##    N    Y 
## 5615 8444
table(npt$Homeowner)/sum(nrow(npt))
## 
##         N         Y 
## 0.3993883 0.6006117
barplot(tab_Homeowner, main = "Sở hữu nhà - Homeowner", col = "darkseagreen", las = 2)

2.3.2 Nhận xét

  • Từ kết quả thu được ta thấy có 5615 khách hàng (chiếm 39.9388292%) không sở hữu nhà, còn 8444 khách hàng (chiếm 60.0611708%) là chủ sở hữu nhà.

  • Đây là một chỉ báo quan trọng về sự ổn định tài chính của khách hàng.

  • Người sở hữu nhà thường có:

    • Chi tiêu ổn định hơn.

    • Nhu cầu mua sắm nhiều hơn cho gia đình (thực phẩm, đồ gia dụng).

  • Trong khi đó, người không sở hữu nhà (có thể thuê nhà hoặc sống tạm thời) có thể:

    • Chi tiêu dè dặt hơn.

    • Ít mua hàng số lượng lớn, hoặc ưu tiên hàng nhỏ gọn, dễ vận chuyển.

3.3 ANNUALINCOME

3.3.1 Thống kê tần suất và trực quan hóa

tab_AnnualIncome <- table(npt$AnnualIncome)
tab_AnnualIncome
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
table(npt$AnnualIncome)/sum(nrow(npt))
## 
##   $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
barplot(tab_AnnualIncome, main = "Thu nhập/tháng - AnnualIncome", col = "lightblue", las = 2)

3.3.2 Nhận xét

  • Nhóm $30K - $50K chiếm đa số với 3090 khách hàng (chiếm 32.7263675%), theo sau là:

    • Nhóm $10K - $30K (21.9788036%)

    • Nhóm $50K - $70K (16.857529%)

  • Rất ít khách hàng có thu nhập trên $150K (1.9418166%)

  • Điều này cho thấy rằng chuỗi siêu thị chủ yếu phục vụ nhóm thu nhập trung bình và thấp – phù hợp với chiến lược giá rẻ, hàng hóa thiết yếu.

  • Chiến lược marketing, khuyến mãi, và chính sách giá nên tập trung vào nhóm này (ví dụ: combo tiết kiệm, chiết khấu theo số lượng).

3.4. CITY

3.4.1 Thống kê tần suất và trực quan hóa

tab_City <- table(npt$City)
tab_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
table(npt$City)/sum(nrow(npt))
## 
##      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
barplot(tab_City, main = "Thành phố - City", col = "pink", las = 2)

3.4.2 Nhận xét

  • Các thành phố có tỷ lệ giao dịch cao là:

    • Salem là thành phố có tỉ lệ khách hàng mua sản phẩm cao nhất với 1386 khách hàng và chiếm hết (9.8584537%)

    • Theo sau là thành phố Tacoma (1.2518671%)

    • Kế tiếp là thành phố Los Angeles (6.5865282%) và ta thấy thành phố Seattle với 6.5580767% xấp xỉ bằng với thành phố Los Angeles. Qua đó ta nhìn nhận được rằng 2 thành phố này có lượng khách hàng mua sắm gần như nhau.

  • Có thể nhận thấy sự tập trung mạnh tại các thành phố bờ Tây Hoa Kỳ, đặc biệt ở các bang Washington, Oregon và California.

  • Điều này gợi ý rằng:

    • Các chi nhánh ở các thành phố này có lưu lượng khách hàng lớn, hoặc

    • Các thành phố này có mật độ dân cư cao, nhu cầu tiêu dùng thường xuyên.

3.5. STATEORPROVINCE

3.5.1 Thống kê tần suất và trực quan hóa

tab_StateorProvince <- table(npt$StateorProvince)
tab_StateorProvince
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
table(npt$StateorProvince)/sum(nrow(npt))
## 
##          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
barplot(tab_StateorProvince, main = "Bang/Tỉnh - StateorProvince", col = "goldenrod", las = 2)

3.5.2 Nhận xét

  • Phân bố:

    • Washington(WA): 32.4845295%

    • California(CA): 19.4395049%

    • Oregon(OR): 16.0893378%

  • Ba bang này đều ở bờ Tây Hoa Kỳ, và là những bang có:

    • Dân số đông, thị trường bán lẻ phát triển.

    • Thói quen tiêu dùng hiện đại, sử dụng dịch vụ siêu thị nhiều hơn so với các khu vực nông thôn.

  • Việc mở rộng kinh doanh hoặc đầu tư thêm vào các bang này là chiến lược khả thi.

3.6. COUNTRY

3.6.1 Thống kê tần suất và trực quan hóa

tab_Country <- table(npt$Country)
tab_Country
## 
## Canada Mexico    USA 
##    809   3688   9562
table(npt$Country)/sum(nrow(npt))
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372
barplot(tab_Country, main = "Quốc gia - Country", col = "orchid", las = 2)

3.6.2 Nhận xét

  • Tỷ lệ khách hàng theo quốc gia phân bổ theo trình tự giảm dần:

    • Cao nhất là USA: 68.0133722%

    • Kế tiếp là Mexico: 26.2323067%

    • Thấp nhất là Canada: 5.7543211%

  • US Hoa Kỳ rõ ràng là thị trường trọng điểm với tỷ lệ khách hàng giao dịch cao nhất trong 3 quốc gia. Điều này chứng tỏ Hoa Kỳ là một quốc gia phát triển mạnh với nhu cầu tiêu dùng chiến phần lớn.

  • Tuy nhiên, sự hiện diện tại Mexico (hơn 1/4 số giao dịch) cho thấy đây là thị trường thứ cấp tiềm năng, có thể mở rộng hoặc tăng nhận diện thương hiệu.

3.7. PRODUCTFAMILY

3.7.1 Thống kê tần suất và trực quan hóa

tab_ProductFamily <- table(npt$ProductFamily)
tab_ProductFamily
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
table(npt$ProductFamily)/sum(nrow(npt))
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813
barplot(tab_ProductFamily, main = "Nhóm sản phẩm - ProductFamily", col = "mediumvioletred", las = 2)

3.7.2 Nhận xét

  • Thực phẩm (Food) chiếm đa số (72.2170851%), cao vượt trội so với:

    • Non-Consumables chiếm 18.8918131%

    • Nhóm đồ uống chiếm 8.8911018%

  • Điều này cho thấy khách hàng mua sắm chủ yếu là để phục vụ nhu cầu ăn uống hàng ngày.

  • Siêu thị nên tiếp tục đầu tư mạnh vào:

    • Nguồn cung thực phẩm tươi,

    • Các sản phẩm thiết yếu giá tốt,

    • Chính sách ưu đãi số lượng lớn cho thực phẩm.

3.8. PRODUCTDEPARTMENT

3.8.1 Thống kê tần suất và trực quan hóa

tab_ProductDepartment <- table(npt$ProductDepartment)
tab_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
table(npt$ProductDepartment)/sum(nrow(npt))
## 
## 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
barplot(tab_ProductDepartment, main = "Bộ phận sản phẩm - ProductDepartment", col = "dodgerblue", las = 2)

3.8.2 Nhận xét

  • Các bộ phân chiếm đa số trong toàn bộ các bộ phận được thống kê:

    • Produce (Rau quả): 14.1830856%

    • Snack Foods: 11.3806103%

    • Household: 10.1002916%

  • Khách hàng mua nhiều các mặt hàng:

    • Tươi sống, dễ hỏng (produce) -> yêu cầu bảo quản và chuỗi cung ứng tốt.

    • Đồ ăn vặt và hàng gia dụng -> phản ánh thói quen tiêu dùng nhanh, tiện lợi.

  • Đây là cơ hội để tăng cường marketing nhóm sản phẩm tiện lợi, combo bữa ăn, sản phẩm cho hộ gia đình.

3.9. PRODUCTCATEGORY

3.9.1 Thống kê tuần suất và trực quan hóa

tab_ProductCategory <- table(npt$ProductCategory)
tab_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
table(npt$ProductCategory)/sum(nrow(npt))
## 
##         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
barplot(tab_ProductCategory, main = "Danh mục sản phẩm - ProductCategory", col = "seagreen", las = 2)

3.9.2 Nhận xét

  • Các loại thực phẩm phổ biến được quan sát từ biểu đồ:

    • Vegetables (Rau): với số lượng là 1728 khách hàng và chiếm hết (12.2910591%)

    • Snack Foods: 1600 khách hàng và chiếm hết (11.3806103%)

    • Dairy (Sữa): 903 khách hàng và chiếm hết (6.4229319%)

    • Fruit, Meat, Frozen Foods…

  • Đây là những mặt hàng tiêu dùng nhanh, có vòng đời ngắn.

  • Việc khách hàng mua chủ yếu các mặt hàng thiết yếu cho thấy siêu thị hoạt động tốt trong việc phục vụ nhu cầu cơ bản, chứ không phải sản phẩm xa xỉ hay không thường xuyên.

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

  • table(): Thống kê số lượng từng loại trong biến định tính
  • sum(…): Đếm bao nhiêu dòng thỏa điều kiện (giá trị quan tâm)
  • length(…): Tổng số mẫu
  • prop.test(…): Tính khoảng tin cậy và kiểm định giả thuyết cho tỷ lệ
  • p = … : Tỷ lệ giả định trong giả thuyết H0
  • alternative = …: Kiểm định hai phía (“two.sided”), một phía lớn hơn (“greater”), nhỏ hơn (“less”)

3.1 Biến Gender và hạng mục đề cập là Female

# Xác định hạng mục quan tâm
table(npt$Gender)
## 
##    F    M 
## 7170 6889
# Số lượng và tổng số 
slfemale <- sum(npt$Gender == "F")
totalgender <- length(npt$Gender)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ "Female"
prop.test(slfemale, totalgender, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slfemale out of totalgender, 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
# Kiểm định giả thuyết: tỷ lệ Female = 0.5
prop.test(slfemale, totalgender, p = 0.5, alternative = "two.sided", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slfemale out of totalgender, 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

Giả thuyết

  • H0: p = 0.5

  • H1: p ≠ 0.5

Đọc kết quả và kết luận

  • Tổng số cá thể trong mẫu là 14.059 người, trong đó có 7.170 người là nữ và 6.889 người là nam. Tỷ lệ nữ giới trong mẫu là 50.99936%.

  • Kết quả kiểm định tỷ lệ một mẫu với giả thuyết tỷ lệ nữ trong tổng thể là 50% (H₀: p = 0.5) cho thấy giá trị thống kê Chi-squared = 5.5765 với 1 bậc tự do, và p-value = 0.0182. Với mức ý nghĩa thông thường α = 0.05, ta bác bỏ giả thuyết không, cho thấy tỷ lệ nữ giới trong mẫu có sự khác biệt có ý nghĩa thống kê so với tỷ lệ 50%.

  • Khoảng tin cậy 95% cho tỷ lệ nữ trong quần thể nằm trong khoảng từ 50.16931% đến 51.82886%, cho thấy tỷ lệ này chỉ hơi cao hơn 50%.

Tóm lại

  • Tuy tỷ lệ nữ giới trong mẫu chỉ nhỉnh hơn nam giới không quá cao (50.99936%), nhưng sự chênh lệch này là có ý nghĩa thống kê. Do đó, có thể kết luận rằng nữ giới chiếm ưu thế nhẹ nhưng đáng kể về mặt thống kê trong mẫu khảo sát này.

Kết luận

  • Tỷ lệ nữ trong tổng mẫu là 50.999%, khác có ý nghĩa thống kê so với 50%.
  • Với p-value = 0.0182, bạn bác bỏ giả thuyết rằng tỷ lệ nữ là 50% ở mức ý nghĩa 5%.
  • Tuy nhiên, sự chênh lệch dù có ý nghĩa thống kê, nhưng rất nhỏ về mặt thực tế (~1%)

3.2 Biến Homeowner với hạng mục đề cập là “Y”

# Xác định hạng mục quan tâm
table(npt$Homeowner)
## 
##    N    Y 
## 5615 8444
slshn <- sum(npt$Homeowner == "Y")
totalhomeowner <- length(npt$Homeowner)

# Ước lượng khoảng tin cậy
prop.test(slshn, totalhomeowner, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slshn out of totalhomeowner, 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
# Kiểm định giả thuyết H0: tỷ lệ chủ nhà = 0.6
prop.test(slshn, totalhomeowner, p = 0.6, alternative = "two.sided", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slshn out of totalhomeowner, null probability 0.6
## X-squared = 0.019445, df = 1, p-value = 0.8891
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
##  0.5924537 0.6087145
## sample estimates:
##         p 
## 0.6006117

Giả thuyết 1

  • H0: p = 0.5

  • H1: p ≠ 0.5

Đọc kết quả và kết luận

  • Kết quả phân tích tỷ lệ một mẫu cho thấy tỷ lệ đối tượng chọn lựa trong tổng thể mẫu là 60.06%. Khi tiến hành kiểm định giả thuyết với tỷ lệ chuẩn là 50%, ta thu được giá trị thống kê Chi-squared là 568.86 với một bậc tự do, và p-value < 2.2e-16. Với mức ý nghĩa thông thường (α = 0.05), ta bác bỏ giả thuyết không (H₀: p = 0.5). Điều này cho thấy tỷ lệ thực tế khác biệt một cách có ý nghĩa thống kê so với 50%.

Giả thuyết 2

  • H0: p = 0.6

  • H1: p ≠ 0.6

Đọc kết quả và kết luận

  • Ngược lại, khi kiểm định với tỷ lệ giả định là 60%, giá trị thống kê Chi-squared chỉ là 0.019445 với p-value = 0.8891. Do p-value lớn hơn đáng kể so với mức ý nghĩa 0.05, ta không bác bỏ giả thuyết không (H₀: p = 0.6). Điều này cho thấy không có bằng chứng thống kê cho thấy tỷ lệ thực tế khác biệt so với 60%.

Tóm lại:

  • Tỷ lệ lựa chọn trong mẫu khảo sát là khoảng 60.06% và khác biệt có ý nghĩa thống kê so với tỷ lệ giả định 50%, nhưng không khác biệt đáng kể so với tỷ lệ 60%. Đây là cơ sở để giả định rằng tỷ lệ lựa chọn trong quần thể có thể vào khoảng 60%.

3.3 Biến ProductFamily với hạng mục đề cập là “Food”

# Xác định hạng mục đề cập
table(npt$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
slfood <- sum(npt$ProductFamily == "Food")
totalproduct <- length(npt$ProductFamily)
# Ước lượng khoảng tin cậy
prop.test(slfood, totalproduct, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slfood out of totalproduct, null probability 0.5
## X-squared = 2774.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7146709 0.7295489
## sample estimates:
##         p 
## 0.7221709
# Kiểm định giả thuyết H0: tỷ lệ >= 0.7 (alternative = "greater": kiểm định 1 phía (>))
prop.test(slfood, totalproduct, p = 0.7, alternative = "greater", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  slfood out of totalproduct, null probability 0.7
## X-squared = 32.802, df = 1, p-value = 5.101e-09
## alternative hypothesis: true p is greater than 0.7
## 95 percent confidence interval:
##  0.7158789 1.0000000
## sample estimates:
##         p 
## 0.7221709

Giả thuyết 1

  • H0: p = 0.5

  • H1: p ≠ 0.5

Đọc kết quả và kết luận

  • Kết quả kiểm định tỷ lệ một mẫu cho giả thuyết rằng tỷ lệ sản phẩm thuộc nhóm Food bằng 50% (H₀: p = 0.5) cho thấy:

    • Giá trị thống kê Chi-squared = 2774.9, df = 1

    • p-value < 2.2e-16

  • Với mức ý nghĩa là 0.05, ta bác bỏ giả thuyết H0, nghĩa là tỷ lệ sản phẩm nhóm Food không chiếm 50% trong tổng số “ProductFamily”.

  • Khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 71.47% đến 72.95%.

Giả thuyết 2

  • H0: p = 0.7

  • H1: p > 0.7

Đọc kết quả và kết luận

  • Kết quả kiểm định tiếp theo kiểm tra xem liệu tỷ lệ sản phẩm nhóm Food có cao hơn 70% hay không, cho thấy:

    • Giá trị Chi-squared = 32.802, df = 1

    • p-value = 5.101e-09

  • Với mức ý nghĩa 0.05, ta tiếp tục bác bỏ giả thuyết không, và chấp nhận giả thuyết đối (H₁: p > 0.7). Điều này chứng tỏ tỷ lệ sản phẩm nhóm Food lớn hơn 70% với ý nghĩa thống kê cao.

  • Khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 71.58% đến 100%.

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

  • Chọn lần lượt các cặp biến có mối tương quan thú vị làm ảnh hưởng đến hành vi mua hàng, giao dịch của khách hàng.
install.packages("tidyverse", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'tidyverse' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PC_Dell\AppData\Local\Temp\RtmpqUZkTV\downloaded_packages
install.packages("janitor", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'janitor' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PC_Dell\AppData\Local\Temp\RtmpqUZkTV\downloaded_packages
install.packages("gmodels", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'gmodels' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PC_Dell\AppData\Local\Temp\RtmpqUZkTV\downloaded_packages
install.packages("ggplot2", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## 
##   There is a binary version available but the source version is later:
##         binary source needs_compilation
## ggplot2  3.5.1  3.5.2             FALSE
## installing the source package 'ggplot2'
install.packages("scales", repos = "https://cran.r-project.org")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## 
##   There is a binary version available but the source version is later:
##        binary source needs_compilation
## scales  1.3.0  1.4.0             FALSE
## installing the source package 'scales'
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor)
## Warning: package 'janitor' was built under R version 4.3.3
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(gmodels)
## Warning: package 'gmodels' was built under R version 4.3.3
library(ggplot2)
library(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor

4.1 Gender và ProductFamily

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

tab1 <- table(npt$Gender, npt$ProductFamily)
tab1 
##    
##     Drink Food Non-Consumable
##   F   669 5149           1352
##   M   581 5004           1304
prop.table(tab1, 1) # theo hàng
##    
##          Drink       Food Non-Consumable
##   F 0.09330544 0.71813110     0.18856346
##   M 0.08433735 0.72637538     0.18928727
  • Dựa trên bảng tần suất chéo giữa Giới tính (Gender) và Nhóm sản phẩm (ProductFamily):

  • Nữ giới (F) có xu hướng chọn sản phẩm Food nhiều nhất, chiếm khoảng 71.8% trong tổng số sản phẩm mà nữ giới chọn. Tiếp theo là nhóm Non-Consumable (18.9%) và Drink (9.3%).

  • Nam giới (M) cũng có xu hướng tương tự khi lựa chọn nhiều nhất là Food (72.6%), kế đến là Non-Consumable (18.9%) và ít nhất là Drink (8.4%).

  • So sánh giới tính:

    • Cả hai giới đều ưu tiên nhóm sản phẩm Food với tỷ lệ cao nhất, trên 70%.

    • Tỷ lệ chọn Drink của nữ cao hơn nam một chút (9.3% so với 8.4%).

    • Tỷ lệ chọn Non-Consumable gần như tương đương giữa hai giới (18.9%).

Kết luận:

Sở thích về nhóm sản phẩm không có sự khác biệt đáng kể giữa nam và nữ. Nhóm sản phẩm Food chiếm ưu thế trong lựa chọn của cả hai giới, trong khi nhóm Drink là ít được chọn nhất.

4.1.2 Trực quan hóa

# Tạo dữ liệu
df <- tribble(
  ~Gender, ~Drink, ~Food, ~Non_Consumable,
  "F",     0.09330544, 0.71813110, 0.18856346,
  "M",     0.08433735, 0.72637538, 0.18928727
)

# Chuyển sang dạng long
df_long <- df %>%
  pivot_longer(cols = -Gender, names_to = "Category", values_to = "Proportion")

# Vẽ biểu đồ có hiển thị số trên cột
ggplot(df_long, aes(x = Category, y = Proportion, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = scales::percent(Proportion, accuracy = 1)),
    position = position_dodge(width = 0.9),
    vjust = -0.5, size = 4
  ) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = c(0, 0.8)) +
  labs(
    title = "Tỷ lệ tiêu dùng theo giới tính và nhóm hàng",
    x = "Nhóm hàng",
    y = "Tỷ lệ (%)"
  ) +
  scale_fill_manual(values = c("F" = "red", "M" = "blue")) +
  theme_minimal() +
  theme(text = element_text(size = 12))

4.1.3 Nhận xét

  • Dựa trên bảng tần suất chéo giữa Giới tính (Gender) và Nhóm sản phẩm (ProductFamily):

  • Nữ giới (F) có xu hướng chọn sản phẩm Food nhiều nhất, chiếm khoảng 71.8% trong tổng số sản phẩm mà nữ giới chọn. Tiếp theo là nhóm Non-Consumable (18.9%) và Drink (9.3%).

  • Nam giới (M) cũng có xu hướng tương tự khi lựa chọn nhiều nhất là Food (72.6%), kế đến là Non-Consumable (18.9%) và ít nhất là Drink (8.4%).

  • So sánh giới tính:

    • Cả hai giới đều ưu tiên nhóm sản phẩm Food với tỷ lệ cao nhất, trên 70%.

    • Tỷ lệ chọn Drink của nữ cao hơn nam một chút (9.3% so với 8.4%).

    • Tỷ lệ chọn Non-Consumable gần như tương đương giữa hai giới (18.9%).

Kết luận:

  • Sở thích về nhóm sản phẩm không có sự khác biệt đáng kể giữa nam và nữ. Nhóm sản phẩm Food chiếm ưu thế trong lựa chọn của cả hai giới, trong khi nhóm Drink là ít được chọn nhất.

4.1.4 Kiểm định Chi-bình phương

chi_result1 <- chisq.test(tab1)
chi_result1
## 
##  Pearson's Chi-squared test
## 
## data:  tab1
## X-squared = 3.5185, df = 2, p-value = 0.1722
# Giá trị thống kê Chi-squared
chi_result1$statistic
## X-squared 
##   3.51849
# Bậc tự do 
chi_result1$parameter
## df 
##  2
# Giá trị p
chi_result1$p.value
## [1] 0.1721748

Giả thuyết

  • Giả thuyết H0: Giới tính (Gender) và Nhóm sản phẩm (ProductFamily) là độc lập, không có mối liên hệ.

  • Giả thuyết H1: Giới tính và Nhóm sản phẩm có liên hệ với nhau.

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

  • Giá trị thống kê Chi-squared: X-squared = 3.51849

  • Bậc tự do: df = 2

  • Giá trị p: p = 0.1721748

Kết luận:

  • Với mức ý nghĩa 0.05, p_value = 0.1722 >= 0.05 → không đủ bằng chứng để bác bỏ H0, tức là không có mối liên hệ giữa 2 biến Gender và ProductFamily.

4.2 MaritalStatus và Homeowner

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

tab2 <- table(npt$MaritalStatus, npt$Homeowner)
tab2 
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297
prop.table(tab2, 1)
##    
##             N         Y
##   M 0.2503641 0.7496359
##   S 0.5416377 0.4583623

4.2.2 Trực quan hóa

ggplot(npt, aes(x = MaritalStatus, fill = Homeowner)) +
  geom_bar(position = "fill") +
  labs(title = "Tỷ lệ Homeowner theo Marital Status", y = "Tỷ lệ", x = "Marital Status") +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

4.2.3 Nhận xét

4.2.4 Kiểm định Chi-bình phương

chi_result2 <- chisq.test(tab2)
chi_result2
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tab2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
# Giá trị thống kê Chi-squared
chi_result2$statistic
## X-squared 
##  1241.218
# Bậc tự do 
chi_result2$parameter
## df 
##  1
# Giá trị p
chi_result2$p.value
## [1] 6.724506e-272

Giả thuyết

  • Giả thuyết H0: Tình trạng hôn nhân (MaritalStatus) và sở hữu nhà (Homeowwner) là độc lập, không có mối liên hệ.

  • Giả thuyết H1: Tình trạng hôn nhân (MaritalStatus) và sở hữu nhà (Homeowwner) có liên hệ với nhau.

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

  • Giá trị thống kê Chi-squared: X-squared = 1241.22

  • Bậc tự do: df = 1

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

Kết luận:

  • Với mức ý nghĩa 0.05, p_value < 0.05 → ta đủ điều kiện để bác bỏ H0, tức là có mối liên hệ giữa 2 biến MaritalStatus và Homeowner. Có thể hiểu rằng tình trạng hôn nhân có ảnh hưởng đến việc một người có sở hữu nhà hay không (hoặc ngược lại).

4.3 AnnualIncome và ProductCategory

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

tab3 <- table(npt$AnnualIncome, npt$ProductDepartment)
tab3 
##                
##                 Alcoholic Beverages Baked Goods Baking Goods Beverages
##   $10K - $30K                    80         108          256       148
##   $110K - $130K                  14          23           49        35
##   $130K - $150K                  15          24           54        25
##   $150K +                         3          10           19        20
##   $30K - $50K                   121         134          336       228
##   $50K - $70K                    61          63          189        97
##   $70K - $90K                    39          50          130        91
##   $90K - $110K                   23          13           39        36
##                
##                 Breakfast Foods Canned Foods Canned Products Carousel Checkout
##   $10K - $30K                54          203              29        8       20
##   $110K - $130K               3           49               4        1        2
##   $130K - $150K              11           46               6        3        9
##   $150K +                     3           21               0        1        1
##   $30K - $50K                63          335              37       30       21
##   $50K - $70K                31          170              18        8       22
##   $70K - $90K                19          120              11        7        5
##   $90K - $110K                4           33               4        1        2
##                
##                 Dairy Deli Eggs Frozen Foods Health and Hygiene Household Meat
##   $10K - $30K     174  147   37          327                201       313   24
##   $110K - $130K    38   33    9           66                 33        63    5
##   $130K - $150K    49   45   15           84                 51        76    4
##   $150K +          17   13    4           26                 19        27    2
##   $30K - $50K     299  233   67          442                292       432   27
##   $50K - $70K     160  107   36          212                134       272   17
##   $70K - $90K     126   96   20          151                120       182    7
##   $90K - $110K     40   25   10           74                 43        55    3
##                
##                 Periodicals Produce Seafood Snack Foods Snacks Starchy Foods
##   $10K - $30K            49     420      17         329     76            70
##   $110K - $130K          17      77       3          85     16            18
##   $130K - $150K           9     109       8          83     19            15
##   $150K +                 1      33       5          35      8             5
##   $30K - $50K            65     650      44         533    127            85
##   $50K - $70K            36     344      11         274     60            48
##   $70K - $90K            18     264      12         184     29            28
##   $90K - $110K            7      97       2          77     17             8
prop.table(tab3, 1)
##                
##                 Alcoholic Beverages Baked Goods Baking Goods   Beverages
##   $10K - $30K           0.025889968 0.034951456  0.082847896 0.047896440
##   $110K - $130K         0.021772939 0.035769829  0.076205288 0.054432348
##   $130K - $150K         0.019736842 0.031578947  0.071052632 0.032894737
##   $150K +               0.010989011 0.036630037  0.069597070 0.073260073
##   $30K - $50K           0.026298631 0.029124103  0.073027603 0.049554445
##   $50K - $70K           0.025738397 0.026582278  0.079746835 0.040928270
##   $70K - $90K           0.022820363 0.029256875  0.076067876 0.053247513
##   $90K - $110K          0.037520392 0.021207178  0.063621533 0.058727569
##                
##                 Breakfast Foods Canned Foods Canned Products    Carousel
##   $10K - $30K       0.017475728  0.065695793     0.009385113 0.002588997
##   $110K - $130K     0.004665630  0.076205288     0.006220840 0.001555210
##   $130K - $150K     0.014473684  0.060526316     0.007894737 0.003947368
##   $150K +           0.010989011  0.076923077     0.000000000 0.003663004
##   $30K - $50K       0.013692676  0.072810259     0.008041730 0.006520322
##   $50K - $70K       0.013080169  0.071729958     0.007594937 0.003375527
##   $70K - $90K       0.011117613  0.070216501     0.006436513 0.004095963
##   $90K - $110K      0.006525285  0.053833605     0.006525285 0.001631321
##                
##                    Checkout       Dairy        Deli        Eggs Frozen Foods
##   $10K - $30K   0.006472492 0.056310680 0.047572816 0.011974110  0.105825243
##   $110K - $130K 0.003110420 0.059097978 0.051321928 0.013996890  0.102643857
##   $130K - $150K 0.011842105 0.064473684 0.059210526 0.019736842  0.110526316
##   $150K +       0.003663004 0.062271062 0.047619048 0.014652015  0.095238095
##   $30K - $50K   0.004564225 0.064985873 0.050641165 0.014562052  0.096066073
##   $50K - $70K   0.009282700 0.067510549 0.045147679 0.015189873  0.089451477
##   $70K - $90K   0.002925688 0.073727326 0.056173201 0.011702750  0.088355764
##   $90K - $110K  0.003262643 0.065252855 0.040783034 0.016313214  0.120717781
##                
##                 Health and Hygiene   Household        Meat Periodicals
##   $10K - $30K          0.065048544 0.101294498 0.007766990 0.015857605
##   $110K - $130K        0.051321928 0.097978227 0.007776050 0.026438569
##   $130K - $150K        0.067105263 0.100000000 0.005263158 0.011842105
##   $150K +              0.069597070 0.098901099 0.007326007 0.003663004
##   $30K - $50K          0.063464464 0.093892632 0.005868290 0.014127364
##   $50K - $70K          0.056540084 0.114767932 0.007172996 0.015189873
##   $70K - $90K          0.070216501 0.106495026 0.004095963 0.010532475
##   $90K - $110K         0.070146819 0.089722675 0.004893964 0.011419250
##                
##                     Produce     Seafood Snack Foods      Snacks Starchy Foods
##   $10K - $30K   0.135922330 0.005501618 0.106472492 0.024595469   0.022653722
##   $110K - $130K 0.119751166 0.004665630 0.132192846 0.024883359   0.027993779
##   $130K - $150K 0.143421053 0.010526316 0.109210526 0.025000000   0.019736842
##   $150K +       0.120879121 0.018315018 0.128205128 0.029304029   0.018315018
##   $30K - $50K   0.141273636 0.009563138 0.115844382 0.027602695   0.018474245
##   $50K - $70K   0.145147679 0.004641350 0.115611814 0.025316456   0.020253165
##   $70K - $90K   0.154476302 0.007021650 0.107665301 0.016968988   0.016383850
##   $90K - $110K  0.158238173 0.003262643 0.125611746 0.027732463   0.013050571

4.3.2 Trực quan hóa

ggplot(npt, aes(x = AnnualIncome, fill = ProductDepartment)) +
  geom_bar(position = "fill") +
  labs(title = "Tỷ lệ ProductDepartment theo Annual Income", y = "Tỷ lệ", x = "Annual Income") +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

4.3.3 Nhận xét

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

chi_result3 <- chisq.test(tab3)
## Warning in stats::chisq.test(x, y, ...): Chi-squared approximation may be
## incorrect
chi_result3
## 
##  Pearson's Chi-squared test
## 
## data:  tab3
## X-squared = 170.16, df = 147, p-value = 0.09276
# Giá trị thống kê Chi-squared
chi_result3$statistic
## X-squared 
##  170.1572
# Bậc tự do 
chi_result3$parameter
##  df 
## 147
# Giá trị p
chi_result3$p.value
## [1] 0.0927647

Giả thuyết

  • Giả thuyết H0: Thu nhập hàng tháng (AnnualIncome) và ProductDepartment là độc lập, không có mối liên hệ.

  • Giả thuyết H1: Thu nhập hàng tháng (AnnualIncome) và ProductDepartment có liên hệ với nhau.

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

  • Giá trị thống kê Chi-squared: X-squared = 170.16

  • Bậc tự do: df = 147

  • Giá trị p: p = 0.0927647

Kết luận:

  • Với mức ý nghĩa 0.05 p_value = 0.09276 > 0.05 → ta không đủ điều kiện để bác bỏ H0, tức là không có mối liên hệ giữa 2 biến AnnualIncome và ProductDepartment.

4.4 Homeowner và AnnualIncome

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

tab4 <- table(npt$Homeowner, npt$AnnualIncome)
tab4
##    
##     $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
prop.table(tab4, 1)
##    
##     $10K - $30K $110K - $130K $130K - $150K     $150K + $30K - $50K $50K - $70K
##   N 0.242030276   0.021193232   0.024220837 0.008548531 0.371682992 0.189314337
##   Y 0.204997631   0.062055898   0.073898626 0.026646139 0.297726196 0.154784462
##    
##     $70K - $90K $90K - $110K
##   N 0.122172752  0.020837044
##   Y 0.121151113  0.058739934

4.4.2 Trực quan hóa

library(tidyverse)

# Tạo dữ liệu
df <- tribble(
  ~Income, ~N, ~Y,
  "$10K - $30K",   1359, 1731,
  "$30K - $50K",   2087, 2514,
  "$50K - $70K",   1063, 1307,
  "$70K - $90K",    686, 1023,
  "$90K - $110K",   117, 496,
  "$110K - $130K",  119, 524,
  "$130K - $150K",  136, 624,
  "$150K +",         48, 225
)

# Chuyển sang long format
df_long <- df %>%
  pivot_longer(cols = c(N, Y), names_to = "Ownership", values_to = "Count")

# Vẽ biểu đồ
ggplot(df_long, aes(x = Income, y = Count, fill = Ownership)) +
  geom_col(position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = Count),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.5
  ) +
  scale_fill_manual(values = c("N" = "pink", "Y" = "#00BFC4")) +
  labs(
    title = "Số người sở hữu và không sở hữu nhà theo thu nhập",
    x = "Thu nhập hằng năm",
    y = "Số lượng người",
    fill = "Sở hữu nhà"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    text = element_text(size = 12)
  )

4.4.3 Nhận xét

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

chi_result4 <- chisq.test(tab4)
chi_result4
## 
##  Pearson's Chi-squared test
## 
## data:  tab4
## X-squared = 546.37, df = 7, p-value < 2.2e-16
# Giá trị thống kê Chi-squared
chi_result4$statistic
## X-squared 
##  546.3723
# Bậc tự do 
chi_result4$parameter
## df 
##  7
# Giá trị p
chi_result4$p.value
## [1] 8.517274e-114

Giả thuyết

  • Giả thuyết H0: Thu nhập hàng tháng (AnnualIncome) và tình trạng sở hữu nhà (Homeowner) là độc lập, không có mối liên hệ.

  • Giả thuyết H1: Thu nhập hàng tháng (AnnualIncome) và tình trạng sở hữu nhà (Homeowner) có liên hệ với nhau.

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

  • Giá trị thống kê Chi-squared: X-squared = 546.37

  • Bậc tự do: df = 7

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

Kết luận:

  • Với mức ý nghĩa 0.05 p_value < 0.05 → ta có đủ điều kiện để bác bỏ H0, tức là có mối liên hệ giữa 2 thu nhập hàng tháng và tình trạng sở hữu nhà.

PHẦN 5: Tổng kết và thảo luận

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

Thông qua các phân tích thống kê mô tả và kiểm định giả thuyết, một số phát hiện đáng chú ý đã được rút ra:

  • Thứ nhất, phân tích mối quan hệ giữa giới tính (Gender) và nhóm sản phẩm (ProductFamily) cho thấy không có sự khác biệt đáng kể giữa nam và nữ trong sở thích tiêu dùng các nhóm sản phẩm. Cả hai giới đều ưu tiên lựa chọn sản phẩm thuộc nhóm Food (trên 70%), tiếp theo là Non-Consumable, và ít lựa chọn nhất là Drink. Kiểm định Chi-bình phương cho thấy p-value = 0.1722 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết rằng hai biến này độc lập, tức là giới tính không có mối liên hệ có ý nghĩa thống kê với nhóm sản phẩm được chọn.

  • Thứ hai, khi phân tích giữa tình trạng hôn nhân (MaritalStatus) và việc sở hữu nhà (Homeowner), kết quả cho thấy có sự khác biệt rõ rệt. Tỷ lệ sở hữu nhà ở nhóm người đã kết hôn (Married) là khoảng 75%, trong khi ở nhóm độc thân (Single) là dưới 50%. Kết quả kiểm định Chi-bình phương (p-value < 2.2e-16) cho thấy sự khác biệt này có ý nghĩa thống kê, tức là có tồn tại mối quan hệ giữa tình trạng hôn nhân và khả năng sở hữu nhà.

  • Thứ ba, khi xem xét mối quan hệ giữa mức thu nhập hàng năm (AnnualIncome) và loại sản phẩm (ProductCategory), kết quả bảng tần suất cho thấy có sự phân bổ khác biệt về hành vi tiêu dùng giữa các nhóm thu nhập. Các nhóm thu nhập thấp có xu hướng tiêu dùng nhiều hơn các mặt hàng thiết yếu như Produce, Frozen Foods, và Baking Goods, trong khi nhóm thu nhập cao có mức tiêu dùng trải đều hơn ở nhiều loại sản phẩm khác nhau, bao gồm cả Snack Foods và Health and Hygiene. Dù chưa tiến hành kiểm định thống kê trong phần này, kết quả mô tả cho thấy có khả năng tồn tại sự khác biệt trong hành vi tiêu dùng theo mức thu nhập, gợi ý cho các phân tích sâu hơn trong nghiên cứu tiếp theo.

  • Cuối cùng, Với mức ý nghĩa 5%, kết quả kiểm định Mối quan hệ giữa tình trạng sở hữu nhà và thu nhập (Homeowner – AnnualIncome) khẳng định có mối liên hệ chặt chẽ và có ý nghĩa thống kê giữa thu nhập hàng năm và tình trạng sở hữu nhà. Điều này phù hợp với kỳ vọng thực tiễn rằng những người có thu nhập cao sẽ có khả năng tích lũy và chi trả tốt hơn cho tài sản cố định như nhà ở. Ngoài ra, kết quả còn gợi ý rằng thu nhập là yếu tố dự báo quan trọng cho hành vi sở hữu bất động sản, mở ra khả năng tích hợp vào các mô hình phân loại khách hàng tiềm năng hoặc mô hình chấm điểm tín dụng (credit scoring) trong ngành ngân hàng và bất động sản.

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

  • Phạm vi phân tích biến: Phân tích chỉ tập trung vào các biến định tính. Các biến định lượng quan trọng như Children, UnitsSold, và Revenue chưa được phân tích mô tả sâu, ước lượng khoảng/kiểm định giả thuyết, hoặc phân tích mối quan hệ (ví dụ: mối quan hệ giữa thu nhập và số con, số lượng con và số lượng sản phẩm mua).

  • Phân tích mối quan hệ còn hạn chế: Phần phân tích mối quan hệ giữa hai biến định tính mới chỉ xem xét một vài cặp biến cụ thể

  • Nhiều mối quan hệ tiềm năng khác giữa các biến định tính chưa được khám phá (ví dụ: Thu nhập và Tình trạng hôn nhân, Vị trí địa lý và Loại sản phẩm mua).

  • Thiếu phân tích thời gian: Biến PurchaseDate có sẵn, nhưng không được sử dụng trong các phân tích mô tả hoặc quan hệ được trình bày trong nguồn. Do đó, không thể xác định xu hướng mua sắm theo thời gian, mùa vụ, hoặc các mẫu hành vi liên quan đến thời điểm giao dịch.

  • Chất lượng dữ liệu: Bài thực hành đề cập việc kiểm tra NA và dữ liệu không có NA. Tuy nhiên, phân tích không đề cập đến việc kiểm tra các vấn đề chất lượng dữ liệu khác như giá trị ngoại lai (outliers) trong biến định lượng (mặc dù không phân tích biến định lượng).

  • Không đề cập đến phân tích khách hàng cá nhân: Mặc dù có biến CustomerID, phân tích tập trung vào tổng thể hoặc các nhóm lớn, không đi sâu vào hành vi của từng khách hàng hoặc phân tích các nhóm khách hàng (segmentation) dựa trên nhiều biến.

Khuyến nghị: - Về Giới tính (Gender) và Nhóm sản phẩm (ProductFamily): Không cần thiết phải phân biệt chiến lược tiếp thị dựa trên giới tính đối với các nhóm sản phẩm chính này. Các chiến dịch quảng cáo và khuyến mãi cho nhóm Food có thể áp dụng rộng rãi cho cả nam và nữ, tập trung vào các yếu tố chung về hương vị, dinh dưỡng, hoặc sự tiện lợi.

  • Về Tình trạng hôn nhân (MaritalStatus) và Tình trạng sở hữu nhà (Homeowner): Phát triển các thông điệp tiếp thị riêng biệt, nhấn mạnh các lợi ích phù hợp với từng đối tượng khách hàng dựa trên tình trạng hôn nhân và sở hữu nhà. Ví dụ, quảng cáo cho người đã kết hôn có thể tập trung vào sự ổn định và an toàn, trong khi quảng cáo cho người độc thân có thể nhấn mạnh sự tự do và tiện lợi.

  • Về Thu nhập hàng năm (AnnualIncome) và Danh mục sản phẩm (ProductCategory: Mặc dù không có mối liên hệ tổng thể, doanh nghiệp vẫn có thể thử nghiệm các chiến lược giá và sản phẩm khác nhau nhắm vào từng phân khúc thu nhập dựa trên hiểu biết chung về hành vi tiêu dùng, và sau đó đánh giá hiệu quả.

  • Về Tình trạng sở hữu nhà (Homeowner) và Thu nhập hàng năm (AnnualIncome): Khách hàng sở hữu nhà với thu nhập cao: Có thể là đối tượng tiềm năng cho các sản phẩm/dịch vụ giá trị cao, đầu tư dài hạn, hoặc các gói tài chính phức tạp hơn. Khách hàng không sở hữu nhà với thu nhập thấp: Có thể quan tâm đến các sản phẩm thiết yếu, khuyến mãi, hoặc các giải pháp tài chính hỗ trợ chi tiêu hàng ngày.

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

  • Tìm hiểu lý do đằng sau sự ưu tiên nhóm sản phẩm Food: Mặc dù cả nam và nữ đều ưa chuộng nhóm Food, cần nghiên cứu định tính hoặc định lượng sâu hơn để hiểu rõ tại sao nhóm này lại được ưa chuộng đến vậy. Có phải vì tính thiết yếu, sự đa dạng, hay các yếu tố văn hóa? Việc này có thể giúp phát triển sản phẩm hoặc chiến lược tiếp thị hiệu quả hơn cho nhóm Food.

  • Phân tích thời gian: Phân tích xu hướng bán hàng, doanh thu, và hành vi khách hàng theo thời gian (PurchaseDate). Có mùa vụ nào nổi bật? Xu hướng mua sắm thay đổi như thế nào qua các năm?

  • Dự đoán: Xây dựng mô hình dự đoán hành vi mua sắm trong tương lai, doanh thu, hoặc khả năng khách hàng thuộc một nhóm nhất định dựa trên các biến có sẵn.

  • Phân tích giỏ hàng (Market Basket Analysis): Xác định các nhóm sản phẩm thường được mua cùng nhau để tối ưu hóa cách bố trí sản phẩm trong cửa hàng hoặc đề xuất sản phẩm.

  • Kiểm tra chất lượng dữ liệu nâng cao: Mặc dù không có NA, cần kiểm tra thêm các vấn đề khác như giá trị không hợp lý hoặc sai sót trong dữ liệu để đảm bảo độ tin cậy cao nhất cho các phân tích phức tạp hơn.

PHẦN 6: RELATIVE RISK

6.1. Giới thiệu

Trong phân tích thống kê định lượng, bảng ngẫu nhiên (contingency table) là một công cụ cơ bản để khảo sát mối liên hệ giữa hai biến phân loại. Trong trường hợp đơn giản nhất, bảng ngẫu nhiên 2x2 biểu diễn sự phân bố của hai biến nhị phân, giúp xác định và đo lường mối liên hệ giữa chúng. Các chỉ số như hiệu tỷ lệ (risk difference), tỷ số nguy cơ (Relative Risk - RR) và tỷ số chênh (Odds Ratio - OR) đóng vai trò quan trọng trong việc lượng hóa mối quan hệ đó. Bài viết này sẽ trình bày chi tiết cấu trúc xác suất sinh ra bảng ngẫu nhiên, phương pháp so sánh hai tỷ lệ, cách xây dựng khoảng tin cậy cho Odds Ratio, và kết thúc bằng một ví dụ thực tiễn trong lĩnh vực kinh doanh.

6.2. Cấu trúc và xác suất của bảng ngẫu nhiên

Một bảng ngẫu nhiên 2x2 là bảng tần suất đếm số quan sát thuộc vào từng tổ hợp của hai biến nhị phân:

\[ \begin{array}{|c|c|c|c|} \hline & \text{Kết quả (+)} & \text{Kết quả (–)} & \text{Tổng} \\ \hline \text{Phơi nhiễm (Yes)} & a & b & a + b \\ \hline \text{Không phơi nhiễm (No)} & c & d & c + d \\ \hline \text{Tổng cộng} & a + c & b + d & n = a + b + c + d \\ \hline \end{array} \]

Để hiểu được sự hình thành của bảng này, cần xác định mô hình xác suất sinh ra dữ liệu — trong đó phổ biến nhất là phân phối PoissonMultinomial.

6.2.1. Phân phối Poisson

Phân phối Poisson thường được sử dụng để mô hình hóa số lượng sự kiện xảy ra trong một khoảng thời gian, không gian hoặc đơn vị cụ thể. Giả sử các sự kiện xảy ra độc lập và với một tỷ lệ trung bình không đổi, mỗi ô trong bảng có thể xem là biến ngẫu nhiên Poisson:

\[ X_{ij} \sim \text{Poisson}(\lambda_{ij}) \]

Ưu điểm:

  • Phù hợp khi tổng số quan sát không cố định.

  • Áp dụng trong phân tích số sự kiện như: số lượt truy cập, số đơn hàng lỗi, v.v.

Hạn chế:

  • Không kiểm soát được tổng số mẫu (n).

6.2.2. Phân phối Multinomial

Trong trường hợp tổng số quan sát \(n\) là cố định, và mỗi quan sát rơi vào một trong bốn ô với xác suất \(p_1, p_2, p_3, p_4\), thì bảng ngẫu nhiên 2x2 có thể được mô hình hóa theo phân phối đa thức Multinomial như sau:

\[ (a, b, c, d) \sim \text{Multinomial}(n; p_1, p_2, p_3, p_4) \]

Phân phối này thường được sử dụng trong các tình huống mà dữ liệu được thu thập từ khảo sát hoặc nghiên cứu xã hội học với kích thước mẫu cố định. Khi đó, các xác suất \(p_1, p_2, p_3, p_4\) biểu diễn xác suất mà một cá thể rơi vào từng ô trong bảng 2x2.

Ưu điểm của mô hình Multinomial:

  • Kiểm soát được tổng số mẫu.

  • Phù hợp cho dữ liệu khảo sát, thử nghiệm.

So sánh giữa phân phối Poisson và Multinomial

Tiêu chí Poisson Multinomial
Tổng số mẫu Không cố định Cố định
Ứng dụng chính Số sự kiện Tần suất khảo sát
Dữ liệu phù hợp Giao dịch, lỗi, tai nạn Trả lời khảo sát, phân nhóm

6.3. Các chỉ số đo mối liên hệ

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

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

Ý nghĩa:

  • Đo lường chênh lệch tuyệt đối giữa xác suất xảy ra kết quả ở nhóm phơi nhiễm và nhóm không phơi nhiễm.

  • Thường được sử dụng trong đánh giá tác động của chính sách, can thiệp hoặc chương trình thí điểm, khi sự khác biệt về xác suất là quan trọng hơn so với tỷ số.

Khoảng tin cậy 95% (CI) cho RD có thể được ước lượng bằng:

\[ CI_{RD} = RD \pm Z_{1 - \alpha/2} \cdot SE_{RD} \]

Trong đó: - \(Z_{1 - \alpha/2}\) là giá trị tới hạn (thường ≈ 1.96 với 95% CI),

  • \(SE_{RD} = \sqrt{\frac{a(a+b-a)}{(a+b)^3} + \frac{c(c+d-c)}{(c+d)^3}}\)

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

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

Ý nghĩa:

  • \(RR > 1\): nguy cơ xảy ra kết quả cao hơn ở nhóm phơi nhiễm.

  • \(RR < 1\): nguy cơ xảy ra kết quả thấp hơn ở nhóm phơi nhiễm.

  • \(RR = 1\): không có mối liên hệ giữa phơi nhiễm và kết quả.

Ta thường lấy log của RR để tính khoảng tin cậy:

\[ CI_{RR} = \exp \left[ \ln(RR) \pm Z_{1 - \alpha/2} \cdot SE_{\ln(RR)} \right] \]

Trong đó:

\[ SE_{\ln(RR)} = \sqrt{ \frac{1}{a} - \frac{1}{a + b} + \frac{1}{c} - \frac{1}{c + d} } \]

Ví dụ trong kinh doanh:

  • Tỷ lệ khách mua hàng khi có khuyến mãi: \(80/100 = 0.8\)

  • Khi không có khuyến mãi: \(40/100 = 0.4\)

  • \(RR = 0.8 / 0.4 = 2\)

⇒ Khuyến mãi làm tăng gấp đôi khả năng khách mua hàng.

Hạn chế:

⚠️ Không sử dụng được trong nghiên cứu bệnh chứng (case-control) vì ta không biết nguy cơ tuyệt đối.

⚠️ Dễ gây hiểu nhầm nếu không đi kèm nguy cơ tuyệt đối. Ví dụ: RR = 2 có vẻ cao, nhưng nếu nguy cơ ban đầu là 1%, thì tăng lên 2% vẫn là rất thấp.

⚠️ Không đối xứng: Nếu đổi nhóm tham chiếu thì giá trị RR thay đổi, khác với OR.

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

6.3.3.1. Odds
  • Odds (tỷ số cơ hội):
    \[ \text{Odds} = \frac{p}{1 - p} \] Trong đó, \(p\) là xác suất xảy ra của một biến nhị phân (như việc sở hữu nhà).
6.3.3.1. Odds Ratio - OR

\[ OR = \frac{a / b}{c / d} = \frac{ad}{bc} \]

Hay

\[ \text{OR} = \frac{\text{Odds ở nhóm 1}}{\text{Odds ở nhóm 2}} \] OR thường dùng để đo lường mối liên hệ giữa một yếu tố và một kết quả trong bảng 2x2.

  • OR = 1: Không có sự khác biệt về odds giữa hai nhóm.

  • OR > 1: Nhóm 1 có odds xảy ra kết quả cao hơn nhóm 2.

  • OR < 1: Nhóm 1 có odds xảy ra kết quả thấp hơn nhóm 2.

Ví dụ: OR = 2 nghĩa là odds xảy ra kết quả ở nhóm 1 cao gấp 2 lần nhóm 2.

  • Lưu ý: OR khác với RR, đặc biệt khi biến phụ thuộc không hiếm gặp. Khi kết quả là hiếm (p nhỏ), thì OR ≈ RR.

Ý nghĩa:

  • OR cho biết tỷ lệ odds (tức là “xác suất chia cho 1 trừ xác suất”) giữa hai nhóm.

  • Thường được sử dụng phổ biến trong mô hình logistic regression.

  • Trong các nghiên cứu bệnh hiếm (rare disease assumption), OR xấp xỉ với RR.

Ưu điểm của Odds Ratio:

  • Dễ tính và dễ diễn giải.

  • Ổn định về mặt toán học khi sử dụng trong các mô hình hồi quy.

  • Không phụ thuộc vào tỷ lệ hiện diện trong mẫu (đặc biệt trong các thiết kế bệnh – chứng: case-control study).

6.4. Khoảng ước lượng tin cậy cho ODDS RATIO

Để xác định xem OR có ý nghĩa thống kê hay không, cần xây dựng khoảng tin cậy.

Logarithm tự nhiên của Odds Ratio:

\[ \log(OR) = \log\left( \frac{a \cdot d}{b \cdot c} \right) \]

Sai số chuẩn (Standard Error):

\[ SE = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \]

Khoảng tin cậy 95% cho \(\log(OR)\):

\[ \log(OR) \pm 1.96 \cdot SE \]

Lấy mũ để có khoảng tin cậy 95% cho OR:

\[ CI_{95\%} = \left[ e^{\log(OR) - 1.96 \cdot SE},\quad e^{\log(OR) + 1.96 \cdot SE} \right] \]

  • Nếu khoảng tin cậy không chứa 1, ta có thể kết luận rằng mối liên hệ có ý nghĩa thống kê ở mức ý nghĩa 5%.

6.5. Ứng dụng trong kinh doanh: HIỆU QUẢ CỦA KHUYẾN MÃI

Một công ty thương mại điện tử thử nghiệm chiến dịch khuyến mãi để kiểm tra xem liệu có ảnh hưởng đến hành vi mua hàng không. Họ lấy mẫu 200 khách hàng ngẫu nhiên và thu được bảng sau:

Mua hàng Không mua Tổng
Có khuyến mãi 80 20 100
Không khuyến mãi 40 60 100
  • Tính Odds Ratio (OR):

\[ OR = \frac{80 \cdot 60}{20 \cdot 40} = \frac{4800}{800} = 6 \]

→ Odds mua hàng khi có khuyến mãi cao gấp 6 lần so với khi không có khuyến mãi.

  • Logarithm tự nhiên của OR:

\[ \log(OR) = \log(6) \approx 1.79 \]

  • Sai số chuẩn (SE):

\[ SE = \sqrt{ \frac{1}{80} + \frac{1}{20} + \frac{1}{40} + \frac{1}{60} } \approx 0.35 \]

  • Khoảng tin cậy 95% cho OR:

\[ CI = \left[ e^{1.79 - 1.96 \cdot 0.35},\quad e^{1.79 + 1.96 \cdot 0.35} \right] \approx \left[ e^{1.11},\quad e^{2.47} \right] = [3.03,\ 11.81] \]

  • Vì khoảng tin cậy không chứa 1, có thể kết luận rằng khuyến mãi có ảnh hưởng có ý nghĩa thống kê đến hành vi mua hàng.

  • Với \(OR = 6\)\(CI = (3.03,\ 11.81)\), doanh nghiệp có thể tự tin triển khai chiến lược khuyến mãi quy mô lớn hơn.

6.6 GENDER VÀ MARITALSTATUS

6.6.1 Tạo bảng chéo

# Tạo bảng chéo giữa Gender và MaritalStatus
table_gender_marital <- table(npt$Gender, npt$MaritalStatus)
addmargins(table_gender_marital)  # Thêm hàng và cột tổng
##      
##           M     S   Sum
##   F    3602  3568  7170
##   M    3264  3625  6889
##   Sum  6866  7193 14059

6.6.2 Tính toán Relative Risk

# Trích xuất số liệu từ bảng chéo
A <- table_gender_marital["F","S"] # nữ độc thân
B <- table_gender_marital["F","M"] # nữ kết hôn
C <- table_gender_marital["M","S"] # nam độc thân
D <- table_gender_marital["M","M"] # nam kết hôn

# Tính RR
RR <- (A/(A+B))/(C/(C+D))
RR
## [1] 0.945701
# Trong đó: A/(A+B) là tỷ lệ phụ nữ độc thân trong tổng số nữ
# Và: C/(C+D) là tỷ lệ nam giới độc thân trong tổng số nam

6.6.3 Ý nghĩa

  • RR = 1: Không có sự khác biệt về tỷ lệ độc thân giữa hai giới tính.
  • RR > 1: Nam giới có tỷ lệ độc thân cao hơn phụ nữ.
  • RR < 1: Phụ nữ có tỷ lệ độc thân cao hơn nam giới.

6.6.4 Nhận xét

  • Tỷ lệ phụ nữ độc thân bằng khoảng 94.57% tỷ lệ nam giới độc thân. Điều này cho thấy không có sự khác biệt lớn về tỷ lệ độc thân giữa hai giới tính trong dữ liệu.
install.packages("epitools", repos = "https://cran.rstudio.com/")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'epitools' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PC_Dell\AppData\Local\Temp\RtmpqUZkTV\downloaded_packages
library(epitools)
riskratio(table_gender_marital, method="wald")
## $data
##        
##            M    S Total
##   F     3602 3568  7170
##   M     3264 3625  6889
##   Total 6866 7193 14059
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate    lower    upper
##   F 1.000000       NA       NA
##   M 1.057417 1.023813 1.092123
## 
## $p.value
##    two-sided
##       midp.exact fisher.exact   chi.square
##   F           NA           NA           NA
##   M 0.0007045092 0.0007373895 0.0007038837
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
# Chỉ định phương pháp tính khoảng tin cậy (confidence interval) cho Risk Ratio.
# "wald" là phương pháp sử dụng ước lượng Wald, giả định phân phối chuẩn, để tính khoảng tin cậy.

Nhận xét

  • Relative Risk (RR)

    • F (Female): 1.000000
    • M (Male): 1.057417 (CI: 1.023813 - 1.092123)
  • Nhận xét về RR:

    • RR của nhóm F (Phụ nữ) là 1 vì nhóm này được lấy làm nhóm tham chiếu.
    • RR của nhóm M (Nam giới) là 1.0574, điều này cho thấy nam giới có tỷ lệ kết hôn (M) cao hơn một chút so với phụ nữ, với tỷ lệ 1.0574 lần so với nhóm phụ nữ. Sự khác biệt này có thể là không lớn, nhưng nó chỉ ra rằng nam giới có một khả năng kết hôn cao hơn phụ nữ trong mẫu nghiên cứu này.
    • Confidence Interval (CI) của RR cho nhóm M là [1.0238, 1.0921], nghĩa là khoảng tin cậy của RR không bao gồm giá trị 1. Điều này cho thấy sự khác biệt giữa hai nhóm F và M là có ý nghĩa thống kê và không phải ngẫu nhiên.
  • Kết luận về RR:

    • RR cho thấy nam giới có xu hướng kết hôn cao hơn so với phụ nữ, với RR = 1.0574.
    • Confidence Interval không bao gồm giá trị 1, điều này hỗ trợ cho giả thuyết rằng sự khác biệt giữa tỷ lệ kết hôn của nam và nữ có ý nghĩa thống kê.
  • p-value từ các kiểm định:

    • Chi-square test: p-value = 0.0007038837
    • Fisher’s exact test: p-value = 0.0007373895
    • Midpoint exact test: p-value = 0.0007045092
  • Nhận xét về p-value:

    • Các p-value từ các kiểm định đều nhỏ hơn mức ý nghĩa thông thường là 0.05, nghĩa là có đủ bằng chứng để bác bỏ giả thuyết null hypothesis (giả thuyết không có sự khác biệt giữa nam và nữ).
    • Điều này chỉ ra rằng có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ kết hôn ở phụ nữ và nam giới.
  • Tóm tắt và nhận xét tổng quát

    • Relative Risk (RR): Tỷ lệ kết hôn của nam giới là 1.0574 lần so với phụ nữ, điều này cho thấy nam giới có khả năng kết hôn cao hơn phụ nữ trong mẫu nghiên cứu này.
    • Confidence Interval (C.I.): Khoảng tin cậy [1.0238, 1.0921] không bao gồm giá trị 1, điều này có nghĩa là sự khác biệt giữa tỷ lệ kết hôn của nam và nữ là có ý nghĩa thống kê.
    • p-value: Các p-value từ Chi-square, Fisher’s exact test và midp.exact đều nhỏ hơn 0.05, cho thấy có sự khác biệt đáng kể giữa tỷ lệ kết hôn của nam và nữ.
  • Kết luận

    • Tỷ lệ kết hôn giữa nam và nữ có sự khác biệt có ý nghĩa thống kê. Cụ thể, nam giới có tỷ lệ kết hôn cao hơn phụ nữ.
    • Relative Risk cho thấy nam giới có khả năng kết hôn cao hơn phụ nữ (với RR = 1.0574), và kết quả này có ý nghĩa thống kê rõ ràng, vì p-value đều rất nhỏ.
    • Khoảng tin cậy 95% của RR không bao gồm giá trị 1, điều này càng củng cố kết luận về sự khác biệt giữa tỷ lệ kết hôn của hai giới.

6.7 GENDER VÀ HOMEOWNER

Câu hỏi nghiên cứu: Liệu có sự khác biệt về tỷ lệ sở hữu nhà giữa nam và nữ không?

6.7.1 Tạo bảng chéo

# Tạo bảng chéo giữa Gender và Homeowner
table_gender_homeowner <- table(npt$Gender, npt$Homeowner)
addmargins(table_gender_homeowner)  # Thêm hàng và cột tổng
##      
##           N     Y   Sum
##   F    2826  4344  7170
##   M    2789  4100  6889
##   Sum  5615  8444 14059

6.7.2 Tính toán RR

# Trích xuất số liệu từ bảng chéo
A <- table_gender_homeowner["F", "Y"]  # nữ sở hữu nhà
B <- table_gender_homeowner["F", "N"]   # nữ không sở hữu nhà
C <- table_gender_homeowner["M", "Y"]  # nam sở hữu nhà
D <- table_gender_homeowner["M", "N"]   # nam không sở hữu nhà

# Tính RR
RR <- (A / (A + B)) / (C / (C + D))
RR
## [1] 1.017989
# Trong đó:
# A / (A + B): Tỷ lệ nữ sở hữu nhà trong tổng số nữ.
# C / (C + D): Tỷ lệ nam sở hữu nhà trong tổng số nam.
riskratio(table_gender_homeowner, method="wald")
## $data
##        
##            N    Y Total
##   F     2826 4344  7170
##   M     2789 4100  6889
##   Total 5615 8444 14059
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower    upper
##   F 1.0000000        NA       NA
##   M 0.9823291 0.9561812 1.009192
## 
## $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] "Unconditional MLE & normal approximation (Wald) CI"

6.7.3 Nhận xét

  • Nhóm nữ (F) được chọn làm nhóm tham chiếu, nên RR = 1. Điều này có nghĩa chúng ta so sánh nguy cơ sở hữu nhà của nhóm nam (M) với nhóm nữ.

  • Nhóm nam (M) có RR = 0.9823 nghĩa là:

    • Tỷ lệ sở hữu nhà ở nam bằng khoảng 98.23% so với nữ. Hay nói cách khác, nguy cơ (xác suất) sở hữu nhà của nam thấp hơn nữ khoảng 1.77%.
  • Khoảng tin cậy 95% của RR là (0.9562 – 1.0092):

    • Khoảng này bao gồm số 1, nghĩa là giá trị RR thực sự có thể là 1 (không có khác biệt).

    • Khoảng tin cậy cho ta biết mức độ chính xác của ước lượng RR; khoảng rộng và bao gồm 1 cho thấy sự không chắc chắn và thiếu bằng chứng về sự khác biệt thực sự.

  • Ta có giả thuyết:

    • H₀: Tỷ lệ sở hữu nhà ở Nam và Nữ không khác nhau, tức là RR = 1

    • H₁: Tỷ lệ sở hữu nhà ở Nam và Nữ khác nhau, RR ≠ 1

  • p-value từ các kiểm định:

    • Chi-square test: p-value = 0.1950884
    • Fisher’s exact test: p-value = 0.1964833
    • Midpoint exact test: p-value = 0.195158
  • Nhận xét về p-value:

    • Các giá trị p-value từ chi-square, Fisher’s exact, và midp.exact đều lớn hơn mức ý nghĩa thông thường là 0.05.
    • Điều này có nghĩa là không có đủ bằng chứng để bác bỏ giả thuyết null hypothesis, tức là không có sự khác biệt đáng kể về tỉ lệ tình trạng hôn nhân có (Y) giữa nhóm nam và nữ. Sự khác biệt giữa hai nhóm có thể là do ngẫu nhiên.

Nhận xét tổng quát

  • Relative Risk cho thấy rằng tỷ lệ sự kiện giữa hai nhóm giới tính F (phụ nữ) và M (nam giới) rất gần nhau, với RR của nhóm M là 0.9823, cho thấy không có sự khác biệt rõ rệt giữa tỷ lệ tình trạng hôn nhân có (Y) giữa hai nhóm.

  • Confidence Interval cho nhóm nam giới (M) bao gồm giá trị 1, điều này hỗ trợ giả thuyết rằng không có sự khác biệt thống kê đáng kể giữa tỷ lệ sự kiện ở nam và nữ.

  • Các kiểm định thống kê (Chi-square, Fisher’s exact test) đều cho p-value lớn hơn 0.05, điều này có nghĩa là không có sự khác biệt ý nghĩa giữa hai nhóm giới tính về tỷ lệ tình trạng hôn nhân có (Y).

  • Tóm lại, các kết quả này cho thấy không có sự khác biệt rõ rệt và có ý nghĩa giữa tỷ lệ tình trạng hôn nhân có (Y) ở phụ nữ và nam giới.

Kết luận

Dựa trên các kết quả từ Relative Risk và các kiểm định thống kê, chúng ta có thể kết luận rằng không có sự khác biệt đáng kể giữa nam và nữ về tỷ lệ tình trạng hôn nhân có (Y). Dữ liệu cho thấy rằng tỷ lệ hôn nhân có (Y) ở nam và nữ là khá tương đồng và không có sự khác biệt thống kê đáng kể.

6.8 MaritalStatus và Homeowner

table_mari_home <- table(npt$MaritalStatus, npt$Homeowner)
addmargins(table_mari_home)
##      
##           N     Y   Sum
##   M    1719  5147  6866
##   S    3896  3297  7193
##   Sum  5615  8444 14059
riskratio(table_mari_home)
## $data
##        
##            N    Y Total
##   M     1719 5147  6866
##   S     3896 3297  7193
##   Total 5615 8444 14059
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower     upper
##   M 1.0000000        NA        NA
##   S 0.6114466 0.5942071 0.6291862
## 
## $p.value
##    two-sided
##     midp.exact  fisher.exact    chi.square
##   M         NA            NA            NA
##   S          0 1.822183e-277 3.663022e-272
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhóm đã kết hôn (M) được dùng làm nhóm tham chiếu với RR = 1.

Nhóm độc thân (S) có:

  • RR = 0.6114 (khoảng tin cậy 95%: 0.5942 – 0.6292).Vì khoảng này không chứa 1, nên kết quả có ý nghĩa thống kê.

  • Điều này có nghĩa là người độc thân có nguy cơ sở hữu nhà thấp hơn khoảng 38.86% so với người đã kết hôn.

  • Khoảng tin cậy 95% khá hẹp và không bao gồm giá trị 1, cho thấy sự khác biệt này là rõ ràng và đáng tin cậy.

Ta thực hiện kiểm định giả thuyết như sau:

  • H₀: Tỷ lệ sở hữu nhà của người đã kết hôn và độc thân là như nhau (RR = 1).

  • H₁: Tỷ lệ sở hữu nhà của hai nhóm là khác nhau (RR ≠ 1).

Kết quả phân tích chỉ ra RR = 0.6114 với khoảng tin cậy 95% (0.5942 – 0.6292), và các kiểm định cho p-value ≈ 0 < mức ý nghĩa 0.05. Do đó, ta bác bỏ H₀ và kết luận rằng tình trạng hôn nhân có mối liên hệ thống kê rõ rệt với khả năng sở hữu nhà. Người độc thân có khả năng sở hữu nhà thấp hơn đáng kể so với người đã kết hôn.

PHẦN 7: ODDS RATIO

7.1 Gender và Homeowner

# Cài và gọi gói
install.packages("epitools")
## Warning: package 'epitools' is in use and will not be installed
library(epitools)
# Tính odds ratio
or_mh <- oddsratio(table_mari_home, method = "wald", conf.level = 0.95)
or_mh$measure
##    odds ratio with 95% C.I.
##      estimate     lower     upper
##   M 1.0000000        NA        NA
##   S 0.2826322 0.2630929 0.3036227
  • Kết quả phân tích Odds Ratio giữa giới tính và khả năng sở hữu nhà như sau:

    • Odds Ratio (OR) = 0.956

    • Khoảng tin cậy 95%: từ 0.894 đến 1.023

  • Diễn giải:

    • Giá trị OR = 0.956 cho thấy odds (cơ hội) sở hữu nhà của nữ thấp hơn nam khoảng 4.4%. Tuy nhiên, sự khác biệt là nhỏ.

    • Do khoảng tin cậy 95% chứa giá trị 1, nên:

      • Không có đủ bằng chứng thống kê để kết luận rằng giới tính ảnh hưởng đến odds sở hữu nhà.
  • Kết luận: Mặc dù nữ có vẻ có odds sở hữu nhà thấp hơn nam một chút, nhưng sự khác biệt không có ý nghĩa thống kê. Do đó, giới tính không phải là yếu tố ảnh hưởng rõ rệt đến khả năng sở hữu nhà trong dữ liệu hiện tại.

7.2 MaritalStatus và Homeowner

# Tính OR và khoảng tin cậy
or_mh <- oddsratio(table_mari_home, method = "wald", conf.level = 0.95)
or_mh$measure
##    odds ratio with 95% C.I.
##      estimate     lower     upper
##   M 1.0000000        NA        NA
##   S 0.2826322 0.2630929 0.3036227
  • Odds Ratio (OR) = 0.283

  • Khoảng tin cậy 95%: từ 0.263 đến 0.304

  • Diễn giải:

    • Giá trị Odds Ratio 0.283 có nghĩa là odds sở hữu nhà của nhóm người độc thân chỉ bằng khoảng 28.3% odds của nhóm người đã kết hôn. Nói cách khác, người đã kết hôn có khả năng sở hữu nhà cao hơn gần 3.5 lần so với người độc thân (vì 1/0.283≈3.53).

    • Khoảng tin cậy 95% cho Odds Ratio nằm hoàn toàn dưới 1, từ 0.263 đến 0.304, điều này cho thấy sự khác biệt về odds sở hữu nhà giữa hai nhóm là có ý nghĩa thống kê và không phải do ngẫu nhiên.

  • Kết luận:

Dữ liệu cho thấy tình trạng hôn nhân ảnh hưởng rõ ràng đến khả năng sở hữu nhà. Người đã kết hôn có odds sở hữu nhà cao hơn đáng kể so với người độc thân, và khác biệt này là có ý nghĩa thống kê với mức độ tin cậy 95%. Đây là bằng chứng cho thấy việc đã kết hôn có liên quan chặt chẽ đến khả năng sở hữu nhà trong mẫu khảo sát này.

7.3 Gender và MaritalStatus

# Tính OR và khoảng tin cậy
or_gm <- oddsratio(table_gender_marital, method = "wald", conf.level = 0.95)
or_gm$measure
##    odds ratio with 95% C.I.
##     estimate    lower    upper
##   F 1.000000       NA       NA
##   M 1.121184 1.049386 1.197893
  • Odds Ratio (OR) = 1.121

  • Khoảng tin cậy 95%: từ 1.049 đến 1.198

  • Diễn giải:

    • Giá trị Odds Ratio 1.121 có nghĩa là odds (cơ hội) đã kết hôn của nữ cao hơn odds đã kết hôn của nam khoảng 12.1%, hay nói cách khác, nữ có khả năng đã kết hôn cao hơn nam khoảng 1.12 lần.

    • Khoảng tin cậy 95% từ 1.049 đến 1.198, không chứa giá trị 1, chứng tỏ sự khác biệt này là có ý nghĩa thống kê. Điều này nghĩa là với mức tin cậy 95%, chúng ta chắc chắn rằng tỷ lệ đã kết hôn của nữ và nam không bằng nhau.

  • Kết luận:

Dữ liệu cho thấy nữ giới có odds đã kết hôn cao hơn nam giới khoảng 12%, tương đương với việc nữ có khả năng đã kết hôn gấp 1.12 lần so với nam giới.

LS0tDQp0aXRsZTogIk5ISeG7hk0gVuG7pCBUVeG6pk4gMiINCmF1dGhvcjogIk5ndXnhu4VuIFBow7pjIFRo4buLbmgiDQpucHRlOiAiMjAyNS0wNS0yNSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyMgKipQSOG6pk4gMTogVMOMTSBISeG7glUgVsOAIENIVeG6qE4gQuG7iiBE4buuIExJ4buGVSoqDQoNCiMjIyAqKjEuMSDEkOG7jEMgROG7riBMSeG7hlUqKg0KDQotIELhu5kgZOG7ryBsaeG7h3Ug4oCcU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25z4oCdIGzGsHUgdHLhu68gdGjDtG5nIHRpbiBjaGkgdGnhur90IHbhu4EgY8OhYyBnaWFvIGThu4tjaCBtdWEgc+G6r20gdOG6oWkgbeG7mXQgc2nDqnUgdGjhu4sgdHJvbmcgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gY+G7pSB0aOG7gy4gTeG7l2kgZMOybmcgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgdMawxqFuZyDhu6luZyB24bubaSBt4buZdCBnaWFvIGThu4tjaCwgYmFvIGfhu5NtIG5oaeG7gXUgdHLGsOG7nW5nIHRow7RuZyB0aW4gbGnDqm4gcXVhbiDEkeG6v24ga2jDoWNoIGjDoG5nIChnaeG7m2kgdMOtbmgsIGjhuqFuZyB0aMOgbmggdmnDqm4sIGNoaSBuaMOhbmggbXVhIGjDoG5nKSwgc+G6o24gcGjhuqltIChuaMOzbSBow6BuZywgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuKSwgY8WpbmcgbmjGsCBjw6FjIHnhur91IHThu5EgcGjhuqNuIMOhbmggaMOgbmggdmkgdGnDqnUgZMO5bmcgKHRo4budaSDEkWnhu4NtIG11YSBow6BuZywgbeG7qWMgxJHhu5kgaMOgaSBsw7JuZywgdOG7lW5nIGdpw6EgdHLhu4sgxJHGoW4gaMOgbmcs4oCmKS4NCg0KLSBE4buvIGxp4buHdSDEkcaw4bujYyBsxrB1IGTGsOG7m2kgxJHhu4tuaCBk4bqhbmcgQ1NWLCB2w6wgduG6rXkgY+G6p24gxJHGsOG7o2MgxJHhu41jIHThu6sgdOG7h3AgLmNzdi4gVGEgZ8OhbiBi4buZIGThu68gbGnhu4d1IFN1cGVybWFya2V0IFRyYW5zYWN0aW9ucyB2w6BvIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBjw7MgdMOqbiBsw6AgbnB0YS4gDQoNCi0gxJDhu41jIGZpbGUgQ1NWIHbhu5tpIGThuqV1IHBow6JuIGPDoWNoIGzDoCBk4bqldSBjaOG6pW0gcGjhuql5DQoNCiMjIyMgKioxLjEuMSDEkOG7jWMgZmlsZSBk4buvIGxp4buHdSBn4buRYyB2w6AgeMOhYyDEkeG7i25oIGPhuqV1IHRyw7pjIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQpkYXRhIDwtIHJlYWQuY3N2KCJTdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMgVEguY3N2Iiwgc2VwID0gIjsiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQpgYGANCg0KLSDEkOG7gyBraeG7g20gdHJhIGPhuqV1IHRyw7pjIHThu5VuZyBxdcOhdCBj4bunYSBi4buZIGThu68gbGnhu4d1LCB0YSBz4butIGThu6VuZyBow6BtIHN0cigpLCB2aeG6v3QgdOG6r3QgY+G7p2EgdOG7qyBzdHJ1Y3R1cmUuDQoNCi0gSMOgbSBzdHIoKSB0aMaw4budbmcgxJHGsOG7o2MgZMO5bmcgxJHhu4Mga2jhuqNvIHPDoXQgbmhhbmggxJHhurdjIMSRaeG7g20gY+G7p2EgbeG7mXQgxJHhu5FpIHTGsOG7o25nLCDEkeG6t2MgYmnhu4d0IGzDoCBjw6FjIG5wdGEgZnJhbWUuIEPhu6UgdGjhu4MsIGzhu4duaCBuw6B5IGN1bmcgY+G6pXA6DQoNCi0gU+G7kSBsxrDhu6NuZyBkw7JuZyB2w6Agc+G7kSBsxrDhu6NuZyBj4buZdCB0cm9uZyBk4buvIGxp4buHdQ0KDQotIFTDqm4gY8OhYyBiaeG6v24gKGPhu5l0KQ0KDQotIEtp4buDdSBk4buvIGxp4buHdSBj4bunYSB04burbmcgYmnhur9uIChz4buRLCBjaHXhu5dpLCBuaMOibiB04buRLOKApikNCg0KLSBN4buZdCB2w6BpIGdpw6EgdHLhu4sgbeG6q3UgYmFuIMSR4bqndSBj4bunYSBt4buXaSBiaeG6v24NCg0KLSBOaOG7nSDEkcOzLCBzdHIoKSBsw6AgY8O0bmcgY+G7pSBo4buvdSDDrWNoIGdpw7pwIHRhIGjDrG5oIGR1bmcgc8ahIGLhu5kgduG7gSBj4bqldSB0csO6YyBk4buvIGxp4buHdSB0csaw4bubYyBraGkgdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoIGNoaSB0aeG6v3QuDQoNCmBgYHtyfQ0Kc3RyKGRhdGEpDQpgYGANCg0KVOG7qyBr4bq/dCBxdeG6oyBoaeG7g24gdGjhu4sgY+G7p2EgaMOgbSBzdHIoKSwgdGEgbmjhuq1uIHRo4bqleToNCg0KQuG7mSBk4buvIGxp4buHdSBn4buTbSAxNC4wNTkgcXVhbiBzw6F0IChvYnMpIHbDoCAxNiBiaeG6v24gKHZhcmlhYmxlcykuDQoNClTDqm4gY8OhYyBiaeG6v24sIGtp4buDdSBk4buvIGxp4buHdSB0xrDGoW5nIOG7qW5nLCBjw7luZyB24bubaSBt4buZdCB2w6BpIGdpw6EgdHLhu4sgdGnDqnUgYmnhu4N1IMSRw6MgxJHGsOG7o2MgbGnhu4d0IGvDqiByw7UgcsOgbmcuDQoNCk3hu6VjIHRpw6p1IGPhu6dhIHBow6JuIHTDrWNoOiDDgXAgZOG7pW5nIGPDoWMga+G7uSB0aHXhuq10IHRo4buRbmcga8OqIG3DtCB04bqjIHbDoCB0aOG7kW5nIGvDqiBzdXkgZGnhu4VuIG5o4bqxbSBraMOhbSBwaMOhIG5o4buvbmcgxJHhurdjIMSRaeG7g20gbuG7lWkgYuG6rXQgY+G7p2Ega2jDoWNoIGjDoG5nIGPFqW5nIG5oxrAgaMOgbmggdmkgbXVhIHPhuq9tIGPhu6dhIGjhu40uIFBow6JuIHTDrWNoIHThuq1wIHRydW5nIHbDoG8gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCAoY2F0ZWdvcmljYWwgdmFyaWFibGVzKSwgYmFvIGfhu5NtOg0KDQotIEdlbmRlcjogR2nhu5tpIHTDrW5oIChGIOKAkyBO4buvLCBNIOKAkyBOYW0pDQoNCi0gTWFyaXRhbFN0YXR1czogVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChTIOKAkyDEkOG7mWMgdGjDom4sIE0g4oCTIMSQw6Mga+G6v3QgaMO0bikNCg0KLSBIb21lb3duZXI6IFTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgIChZIOKAkyBDw7MsIE4g4oCTIEtow7RuZykNCg0KLSBBbm51YWxJbmNvbWU6IFRodSBuaOG6rXAgaMOgbmcgbsSDbSAoxJHGsOG7o2MgcGjDom4gY2hpYSB0aGVvIGPDoWMga2hv4bqjbmcpDQoNCi0gQ2l0eSwgU3RhdGVvclByb3ZpbmNlLCBDb3VudHJ5OiBUaMO0bmcgdGluIHbhu4EgduG7iyB0csOtIMSR4buLYSBsw70gY+G7p2Ega2jDoWNoIGjDoG5nDQoNCi0gUHJvZHVjdEZhbWlseSwgUHJvZHVjdERlcGFydG1lbnQsIFByb2R1Y3RDYXRlZ29yeTogQ8OhYyBj4bqlcCDEkeG7mSBwaMOibiBsb+G6oWkgc+G6o24gcGjhuqltIG3DoCBraMOhY2ggaMOgbmcgxJHDoyBtdWENCg0KVGjDtG5nIHF1YSB2aeG7h2MgcGjDom4gdMOtY2ggY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBuw6B5LCB0YSBr4buzIHbhu41uZyBjw7MgdGjhu4MgcsO6dCByYSBuaOG7r25nIGhp4buDdSBiaeG6v3QgZ2nDoSB0cuG7iyB24buBIHBow6JuIGtow7pjIGtow6FjaCBow6BuZywgeHUgaMaw4bubbmcgdGnDqnUgZMO5bmcsIGPFqW5nIG5oxrAgY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBow6BuaCB2aSBtdWEgc+G6r20gdOG6oWkgc2nDqnUgdGjhu4suDQoNCg0KIyMjIyAqKjEuMS4yIEzhu7FhIGNo4buNbiBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oKioNCg0KR2nhuqNpIHRow61jaDoNCg0KLSBjKCIiKTogdOG6oW8gdmVjdG8NCi0gbnB0aGluaCA8LSBkYXRhWywgZGxkdF06IGzhuqV5IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgZGF0YSBjw6FjIGPhu5l0IHRyb25nIGRsZHQgduG7q2EgdOG6oW8gcmEgKGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgpLCB2w6AgbOG6pXkgdOG6pXQgY+G6oyBjw6FjIGjDoG5nIChmdWxsIHF1YW4gc8OhdCkNCg0KYGBge3J9DQojIENo4buNbiBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oDQpkbGR0IDwtIGMoIkdlbmRlciIsICJNYXJpdGFsU3RhdHVzIiwgIkhvbWVvd25lciIsICJBbm51YWxJbmNvbWUiLCAiQ2l0eSIsICJTdGF0ZW9yUHJvdmluY2UiLCAiQ291bnRyeSIsICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIpDQoNCiMgVOG6oW8gYuG7mSBk4buvIGxp4buHdSBt4bubaSBjaOG7iSBjaOG7qWEgxJHhu4tuaCB0w61uaA0KbnB0IDwtIGRhdGFbLCBkbGR0XQ0KYGBgDQoNCg0KIyMjICoqMS4yLiBU4buUTkcgUVVBTiBW4buAIEThu64gTEnhu4ZVKioNCg0KIyMjIyAqKjEuMi4xIE7hu5lpIGR1bmcgZOG7ryBsaeG7h3UqKg0KDQotIELhu5kgZOG7ryBsaeG7h3UgKlN1cGVybWFya2V0IFRyYW5zYWN0aW9ucyogbsOgeSBn4buTbSAxNCwwNTkgZ2lhbyBk4buLY2ggbXVhIGjDoG5nIHThuqFpIHNpw6p1IHRo4buLLCB24bubaSBjw6FjIHRow7RuZyB0aW4gbGnDqm4gcXVhbiDEkeG6v24ga2jDoWNoIGjDoG5nIHbDoCBz4bqjbiBwaOG6qW0gYmFvIGfhu5NtICoqbcOjIMSR4buLbmggZGFuaCBraMOhY2ggaMOgbmcgdsOgIGPDoWMgdGjDtG5nIHRpbiBsacOqbiBxdWFuKiosICoqduG7iyB0csOtIMSR4buLYSBsw70qKiwgKipjaGkgdGnhur90IGPDoWMgc+G6o24gcGjhuqltIMSRxrDhu6NjIG11YSoqLg0KDQotIEThu68gbGnhu4d1IG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDICoqcGjDom4gdMOtY2ggaMOgbmggdmkgbXVhIHPhuq9tIGPhu6dhIGtow6FjaCBow6BuZyoqLCAqKnBow6JuIGtow7pjIHRo4buLIHRyxrDhu51uZyoqLCBob+G6t2MgKirEkcOhbmggZ2nDoSBoaeG7h3UgcXXhuqMga2luaCBkb2FuaCoqIHRoZW8gdOG7q25nIHPhuqNuIHBo4bqpbSwgdOG7q25nIGtodSB24buxYyB2w6AgdOG7q25nIG5ow7NtIMSR4buRaSB0xrDhu6NuZy4gDQoNCiMjIyMgKioxLjIuMiBEYW5oIHPDoWNoIGPDoWMgYmnhur9uIHbDoCBtw7QgdOG6oyoqDQoNCioqQ+G6pXUgdHLDumMgYuG7mSBk4buvIGxp4buHdSBTdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMqKg0KDQpgYGB7cn0NCnN0cihkYXRhKQ0KYGBgDQoNCi0gTmjGsG5nIHbhu5tpIHnDqnUgY+G6p3UgY2jhu4kgc+G7rSBk4bulbmcgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCDEkeG7gyBwaMOibiB0w61uaCBuw6puIGNow7puZyB0YSBjaOG7iSBxdWFuIHTDom0gxJHhur9uIGPDoWMgYmnhur9uIG5oxrAgc2F1IDogDQoNCiAgLSBHZW5kZXI6IEdp4bubaSB0w61uaCAoRiAtIE7hu68sIE0gLSBOYW0pDQogIC0gTWFyaXRhbFN0YXR1czogVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChTIC0gxJDhu5ljIHRow6JuLCBNIC0gxJDDoyBr4bq/dCBow7RuKQ0KICAtIEhvbWVvd25lcjogQ8OzIHPhu58gaOG7r3UgbmjDoCBoYXkga2jDtG5nIChZIC0gQ8OzLCBOIC0gS2jDtG5nKQ0KICAtIEFubnVhbEluY29tZTogVGh1IG5o4bqtcCBow6BuZyBuxINtICjEkcaw4bujYyBiaeG7g3UgdGjhu4sgZMaw4bubaSBk4bqhbmcgY8OhYyBraG/huqNuZykNCiAgLSBDaXR5LCBTdGF0ZW9yUHJvdmluY2UsIENvdW50cnk6IFRow7RuZyB0aW4gxJHhu4thIGzDvQ0KICAtIFByb2R1Y3RGYW1pbHksIFByb2R1Y3REZXBhcnRtZW50LCBQcm9kdWN0Q2F0ZWdvcnk6IFBow6JuIGxv4bqhaSBz4bqjbiBwaOG6qW0NCiAgDQojIyMjICoqMS4yLjMgU+G7kSBiaeG6v24gdsOgIHPhu5EgcXVhbiBzw6F0KioNCg0KYGBge3J9DQpkaW0obnB0KQ0KYGBgDQoNCi0gQuG7mSBk4buvIGxp4buHdSAqKm5wdCoqIGNo4bupYSB04buVbmcgY+G7mW5nICoqMTQuMDU5IHF1YW4gc8OhdCoqIGPDuW5nIHbhu5tpICoqMTAgYmnhur9uKiogxJHhurdjIHRyxrBuZyB0xrDGoW5nIOG7qW5nIGzDoCBiaeG6v24gxJHhu4tuaCB0w61uaC4NCi0gTeG7l2kgcXVhbiBzw6F0IHPhur0gdMaw4bufbmcg4bupbmcgduG7m2kgbeG7l2kgZ2lhbyBk4buLY2ggbXVhIGjDoG5nIHThuqFpIHNpw6p1IHRo4buLLg0KDQojIyMjICoqMS4yLjQgSGnhu4NuIHRo4buLIGThu68gbGnhu4d1KioNCg0KIyMjIyMgKioxLjIuNC4xIEhp4buDbiB0aOG7iyB2w6BpIGTDsm5nIMSR4bqndSoqDQoNCmBgYHtyfQ0KaGVhZChucHQpDQpgYGANCg0KIyMjIyMgKioxLjIuNC4yIEhp4buDbiB0aOG7iyB2w6BpIGTDsm5nIGN14buRaSoqDQoNCmBgYHtyfQ0KdGFpbChucHQpDQpgYGANCg0KIyMjIyAqKjEuMi41IEtp4buDbSB0cmEgZOG7ryBsaeG7h3UqKg0KDQojIyMjIyAqKjEuMi41LjEgS2nhu4NtIHRyYSBz4buRIGzGsOG7o25nIE5BIHRyb25nIGPhu5l0IMSR4buLbmggdMOtbmgqKg0KDQpHaeG6o2kgdGjDrWNoOg0KDQpzYXBwbHkobnB0LCAuLi4pOiDDoXAgZOG7pW5nIGjDoG0gY2hvIHThu6tuZyBj4buZdCB0cm9uZyBk4buvIGxp4buHdSAqKm5wdCoqLg0KDQpzdW0oaXMubmEoeCkpOiDEkeG6v20gc+G7kSBsxrDhu6NuZyBOQSB0cm9uZyB04burbmcgY+G7mXQuDQoNCmBgYHtyfQ0KIyBLaeG7g20gdHJhIHPhu5EgbMaw4bujbmcgTkEgdHJvbmcgbeG7l2kgY+G7mXQgxJHhu4tuaCB0w61uaA0KbmFfY291bnRzIDwtIHNhcHBseShucHQsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpDQpuYV9jb3VudHMNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KiogDQotIEvhur90IHF14bqjIHRodSDEkcaw4bujYyBjaG8gdGjhuqV5IHLhurFuZyB04bqldCBj4bqjIGPDoWMgY+G7mXQgxJHhu4tuaCB0w61uaCDEkeG7gXUga2jDtG5nIGPDsyBnacOhIHRy4buLIHRoaeG6v3UgKE5BKSB2w6wgc+G7kSBsxrDhu6NuZyBOQSB0cm9uZyBjw6FjIGPhu5l0IMSR4buBdSBoaeG7g24gdGjhu4sgbMOgIDANCg0KIyMjIyMgKioxLjIuNS4yIENodXnhu4NuIMSR4buVaSBjw6FjIGPhu5l0IHNhbmcgZmFjdG9yIG7hur91IGNow7puZyBjaMawYSBwaOG6o2kgbMOgIGZhY3RvcioqDQoNCkdp4bqjaSB0aMOtY2g6DQoNCi0gbGFwcGx5KG5wdCwgZnVuY3Rpb24oeCkgeyAuLi4gfSk6IMOBcCBk4bulbmcgaMOgbSBjaG8gdOG7q25nIGPhu5l0IGPhu6dhIG5wdC4gVHJvbmcgUiwgbGFwcGx5KCkgaG/huqF0IMSR4buZbmcgdHLDqm4gbGlzdCAodsOgIGRhdGEgZnJhbWUgduG7gSBi4bqjbiBjaOG6pXQgbMOgIGxpc3QgY8OhYyBj4buZdCkuDQoNCi0gaWYgKCFpcy5mYWN0b3IoeCkpOiBO4bq/dSBj4buZdCDEkcOzIGNoxrBhIHBo4bqjaSBsw6AgZmFjdG9yLg0KDQotIGFzLmZhY3Rvcih4KTogQ2h1eeG7g24gY+G7mXQgxJHDsyB0aMOgbmgga2nhu4N1IGZhY3Rvci4NCg0KLSByZXR1cm4oeCk6IE7hur91IMSRw6MgbMOgIGZhY3RvciBy4buTaSB0aMOsIGdp4buvIG5ndXnDqm4uDQoNCi0gYXMuZGF0YS5mcmFtZSguLi4pOiBWw6wgbGFwcGx5KCkgdHLhuqMgduG7gSBt4buZdCBsaXN0LCBuw6puIHRhIGfDs2kgbOG6oWkgdGjDoG5oIGRhdGEuZnJhbWUgxJHhu4MgxJHhuqNtIGLhuqNvIGdp4buvIMSRw7puZyBj4bqldSB0csO6YyBi4bqjbmcgZOG7ryBsaeG7h3UgYmFuIMSR4bqndS4NCg0KYGBge3J9DQojIENodXnhu4NuIMSR4buVaSBjw6FjIGPhu5l0IHNhbmcgZmFjdG9yIG7hur91IGNoxrBhIHBo4bqjaSBsw6AgZmFjdG9yDQpucHQgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkobnB0LCBmdW5jdGlvbih4KSB7DQogIGlmICghaXMuZmFjdG9yKHgpKSB7DQogICAgcmV0dXJuKGFzLmZhY3Rvcih4KSkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4oeCkNCiAgfQ0KfSkpDQpgYGANCg0KKipLaeG7g20gdHJhIGzhuqFpIHNhdSBraGkgY2h1eeG7g24gxJHhu5VpKioNCg0KR2nhuqNpIHRow61jaDoNCg0KLSBzYXBwbHkobnB0LCBjbGFzcyk6IMOBcCBk4bulbmcgaMOgbSBjbGFzcygpIGNobyB04burbmcgY+G7mXQgxJHhu4Mga2nhu4NtIHRyYSBraeG7g3UgZOG7ryBsaeG7h3UuIEvhur90IHF14bqjIHRy4bqjIHbhu4EgbMOgIG3hu5l0IHZlY3RvciBoaeG7g24gdGjhu4sgdMOqbiBj4buZdCB2w6AgbG/huqFpIGThu68gbGnhu4d1IHTGsMahbmcg4bupbmcuDQoNCi0gTuG6v3Uga+G6v3QgcXXhuqMgbMOgICJmYWN0b3IiIGNobyB04bqldCBj4bqjIGPDoWMgY+G7mXQg4oaSIGNodXnhu4NuIMSR4buVaSB0aMOgbmggY8O0bmcuDQoNCmBgYHtyfQ0Kc2FwcGx5KG5wdCwgY2xhc3MpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqIDogS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHRvw6BuIGLhu5kgY8OhYyBiaeG6v24gxJHDoyDEkcaw4bujYyBjaHV54buDbiDEkeG7lWkgdGjDoG5oIGThuqFuZyBmYWN0b3IuDQoNCiMjICoqUEjhuqZOIDI6IFBIw4JOIFTDjUNIIE3DlCBU4bqiIEJJ4bq+TiDEkOG7ik5IIFTDjU5IKioNCg0KIyMjICoqMi4xLiBHRU5ERVIqKg0KDQojIyMjICoqMi4xLjEgVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KR2nhuqNpIHRow61jaDoNCg0KLSBT4butIGThu6VuZyBow6BtIHRhYmxlKCkgxJHhu4MgxJHhur9tIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiAodOG6p24gc3XhuqV0KSBj4bunYSB04burbmcgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gxJHhu4tuaCB0w61uaC4NCg0KLSBwcm9wLnRhYmxlKHRhYl9nZW5kZXIpIHThuqFvIGLhuqNuZyB04bu3IGzhu4cgcGjhuqduIHRyxINtICh0aGVvIGThuqFuZyB0aOG6rXAgcGjDom4pLiBOaMOibiB24bubaSAxMDAgxJHhu4MgcmEgcGjhuqduIHRyxINtLg0KDQotIHJvdW5kKC4uLiwgMikgbMOgbSB0csOybiAyIGNo4buvIHPhu5Egc2F1IGThuqV1IHBo4bqpeS4NCg0KLSBiYXJwbG90KCkgdOG6oW8gYmnhu4N1IMSR4buTIGPhu5l0IHThu6sgYuG6o25nIHThuqduIHN14bqldC4NCg0KLSBtYWluOiB0acOqdSDEkeG7gSBiaeG7g3UgxJHhu5MuDQoNCi0gY29sOiBtw6B1IHPhuq9jIGPhu5l0ICjhu58gxJHDonkgbMOgIG3DoHUgInN0ZWVsYmx1ZSIpLg0KDQotIGxhcyA9IDI6IHhvYXkgbmjDo24gdHLhu6VjIGhvw6BuaCAoWCkgdGhlbyBjaGnhu4F1IGThu41jIMSR4buDIGThu4UgxJHhu41jLg0KDQoNCg0KYGBge3J9DQp0YWJfZ2VuZGVyIDwtIHRhYmxlKG5wdCRHZW5kZXIpDQp0YWJfZ2VuZGVyDQp0YWJsZShucHQkR2VuZGVyKS9zdW0obnJvdyhucHQpKQ0KYmFycGxvdCh0YWJfZ2VuZGVyLCBtYWluID0gIlThuqduIHN14bqldCAtIEdlbmRlciIsIGNvbCA9ICJzdGVlbGJsdWUiLCBsYXMgPSAyKQ0KYGBgDQoNCg0KIyMjIyAqKjIuMS4yIE5o4bqtbiB4w6l0KioNCg0KLSBE4buvIGxp4buHdSBjaG8gdGjhuqV5IGPDsyBgciB0YWJsZShucHQkR2VuZGVyKVsxXWAga2jDoWNoIGjDoG5nIGzDoCBu4buvIChgciB0YWJsZShucHQkR2VuZGVyKVsxXS9zdW0obnJvdyhucHQpKSoxMDBgXCUpIHbDoCBgciB0YWJsZShucHQkR2VuZGVyKVsyXWAgbMOgIGtow6FjaCBow6BuZyBuYW0gKGByIHRhYmxlKG5wdCRHZW5kZXIpWzJdL3N1bShucm93KG5wdCkpKjEwMGBcJSkuDQoNCi0gUGjDom4gYuG7kSBnaeG7m2kgdMOtbmggZ+G6p24gbmjGsCDEkeG7k25nIMSR4buBdSwga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggbOG7m24uDQoNCi0gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHLhurFuZyBjaHXhu5dpIHNpw6p1IHRo4buLIGtow7RuZyBuaOG6r20gxJHhur9uIG3hu5l0IGdp4bubaSB0w61uaCBj4bulIHRo4buDLCBtw6AgcGjhu6VjIHbhu6UgdOG7kXQgY+G6oyBoYWkgbmjDs20uDQoNCi0gTmdvw6BpIHJhLCB04bu3IGzhu4cgbuG7ryBoxqFpIGNhbyBoxqFuIGPDsyB0aOG7gyBkbyBwaOG7pSBu4buvIHRoxrDhu51uZyDEkeG6o20gbmjhuq1uIHZhaSB0csOyIG11YSBz4bqvbSB0aOG7sWMgcGjhuqltIHbDoCB0acOqdSBkw7luZyBnaWEgxJHDrG5oLCBuw6puIGto4bqjIG7Eg25nIGNhbyBo4buNIGzDoCBuZ8aw4budaSDEkeG7qW5nIHTDqm4gZ2lhbyBk4buLY2ggbmhp4buBdSBoxqFuIHRyb25nIGjDs2EgxJHGoW4uDQoNCiMjIyAqKjIuMiBNQVJJVEFMU1RBVFVTKioNCg0KIyMjIyAqKjIuMi4xIFRo4buRbmcga8OqIHR14bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCnRhYl9NYXJpdGFsU3RhdHVzIDwtIHRhYmxlKG5wdCRNYXJpdGFsU3RhdHVzKQ0KdGFiX01hcml0YWxTdGF0dXMNCnRhYmxlKG5wdCRNYXJpdGFsU3RhdHVzKS9zdW0obnJvdyhucHQpKQ0KYmFycGxvdCh0YWJfTWFyaXRhbFN0YXR1cywgbWFpbiA9ICJUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gLSBNYXJpdGFsU3RhdHVzIiwgY29sID0gImNvcmFsIiwgbGFzID0gMikgDQpgYGANCg0KIyMjIyAqKjIuMi4yIE5o4bqtbiB4w6l0KioNCg0KLSBT4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyDEkeG7mWMgdGjDom4gKFNpbmdsZSDigJMga8O9IGhp4buHdSBTKSBsw6AgYHIgdGFibGUobnB0JE1hcml0YWxTdGF0dXMpWzFdYCBuZ8aw4budaSAoY2hp4bq/bSBgciB0YWJsZShucHQkTWFyaXRhbFN0YXR1cylbMV0vc3VtKG5yb3cobnB0KSkqMTAwYFwlKSwgY8OybiBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gKE1hcnJpZWQg4oCTIE0pIGzDoCBgciB0YWJsZShucHQkTWFyaXRhbFN0YXR1c1syXSlgIG5nxrDhu51pIChjaGnhur9tIGByIHRhYmxlKG5wdCRNYXJpdGFsU3RhdHVzKVsyXS9zdW0obnJvdyhucHQpKSoxMDBgXCUpDQotIE3hurdjIGTDuSB04bu3IGzhu4cga2jDoSBjw6JuIGLhurFuZywgbmjGsG5nIG5ow7NtIMSR4buZYyB0aMOibiBjaGnhur9tIHThu7cgbOG7hyBjYW8gaMahbiBt4buZdCBjaMO6dC4NCg0KLSBHaeG6o2kgdGjDrWNoIGjhu6NwIGzDvSBjaG8gxJFp4buBdSBuw6B5IGPDsyB0aOG7gyBsw6A6DQoNCiAgLSBOaOG7r25nIG5nxrDhu51pIMSR4buZYyB0aMOibiBjw7MgeHUgaMaw4bubbmcgdOG7sSDEkWkgbXVhIHPhuq9tIG5oaeG7gXUgaMahbiwga2jDtG5nIGThu7FhIHbDoG8gYuG6oW4gxJHhu51pLg0KDQogIC0gTmdvw6BpIHJhLCBuZ8aw4budaSB0cuG6uyDEkeG7mWMgdGjDom4gdGjGsOG7nW5nIHPhu5FuZyDhu58gdGjDoG5oIHRo4buLIHbDoCBz4butIGThu6VuZyBk4buLY2ggduG7pSBzacOqdSB0aOG7iyB0aMaw4budbmcgeHV5w6puIGjGoW4sIHRyb25nIGtoaSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHRo4buDIG11YSB0aGVvIG5ow7NtIGhv4bq3YyB0aGVvIGjhu5kgZ2lhIMSRw6xuaCBs4bubbiB2w6Agw610IGdpYW8gZOG7i2NoIGjGoW4gdHLDqm4gbeG7l2kgY8OhIG5ow6JuLg0KICANCiMjIyAqKjIuMyBIT01FT1dORVIqKg0KDQojIyMjICoqMi4zLjEgVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQp0YWJfSG9tZW93bmVyIDwtIHRhYmxlKG5wdCRIb21lb3duZXIpDQp0YWJfSG9tZW93bmVyDQp0YWJsZShucHQkSG9tZW93bmVyKS9zdW0obnJvdyhucHQpKQ0KYmFycGxvdCh0YWJfSG9tZW93bmVyLCBtYWluID0gIlPhu58gaOG7r3UgbmjDoCAtIEhvbWVvd25lciIsIGNvbCA9ICJkYXJrc2VhZ3JlZW4iLCBsYXMgPSAyKQ0KYGBgDQoNCiMjIyMgKioyLjMuMiBOaOG6rW4geMOpdCoqDQoNCi0gVOG7qyBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgdGEgdGjhuqV5IGPDsyBgciB0YWJsZShucHQkSG9tZW93bmVyKVsxXWAga2jDoWNoIGjDoG5nIChjaGnhur9tIGByIHRhYmxlKG5wdCRIb21lb3duZXIpWzFdL3N1bShucm93KG5wdCkpKjEwMGBcJSkga2jDtG5nIHPhu58gaOG7r3UgbmjDoCwgY8OybiBgciB0YWJsZShucHQkSG9tZW93bmVyKVsyXWAga2jDoWNoIGjDoG5nIChjaGnhur9tIGByIHRhYmxlKG5wdCRIb21lb3duZXIpWzJdL3N1bShucm93KG5wdCkpKjEwMGBcJSkgbMOgIGNo4bunIHPhu58gaOG7r3UgbmjDoC4NCg0KLSDEkMOieSBsw6AgbeG7mXQgY2jhu4kgYsOhbyBxdWFuIHRy4buNbmcgduG7gSBz4buxIOG7lW4gxJHhu4tuaCB0w6BpIGNow61uaCBj4bunYSBraMOhY2ggaMOgbmcuDQoNCi0gTmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIHRoxrDhu51uZyBjw7M6DQoNCiAgLSBDaGkgdGnDqnUg4buVbiDEkeG7i25oIGjGoW4uDQoNCiAgLSBOaHUgY+G6p3UgbXVhIHPhuq9tIG5oaeG7gXUgaMahbiBjaG8gZ2lhIMSRw6xuaCAodGjhu7FjIHBo4bqpbSwgxJHhu5MgZ2lhIGThu6VuZykuDQoNCi0gVHJvbmcga2hpIMSRw7MsIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgKGPDsyB0aOG7gyB0aHXDqiBuaMOgIGhv4bq3YyBz4buRbmcgdOG6oW0gdGjhu51pKSBjw7MgdGjhu4M6DQoNCiAgLSBDaGkgdGnDqnUgZMOoIGThurd0IGjGoW4uDQoNCiAgLSDDjXQgbXVhIGjDoG5nIHPhu5EgbMaw4bujbmcgbOG7m24sIGhv4bq3YyDGsHUgdGnDqm4gaMOgbmcgbmjhu48gZ+G7jW4sIGThu4UgduG6rW4gY2h1eeG7g24uDQogIA0KIyMjICoqMy4zIEFOTlVBTElOQ09NRSoqDQoNCiMjIyMgKiozLjMuMSBUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCnRhYl9Bbm51YWxJbmNvbWUgPC0gdGFibGUobnB0JEFubnVhbEluY29tZSkNCnRhYl9Bbm51YWxJbmNvbWUNCnRhYmxlKG5wdCRBbm51YWxJbmNvbWUpL3N1bShucm93KG5wdCkpDQpiYXJwbG90KHRhYl9Bbm51YWxJbmNvbWUsIG1haW4gPSAiVGh1IG5o4bqtcC90aMOhbmcgLSBBbm51YWxJbmNvbWUiLCBjb2wgPSAibGlnaHRibHVlIiwgbGFzID0gMikNCmBgYA0KDQojIyMjICoqMy4zLjIgTmjhuq1uIHjDqXQqKg0KDQotIE5ow7NtICQzMEsgLSAkNTBLIGNoaeG6v20gxJFhIHPhu5EgduG7m2kgYHIgdGFibGUobnB0JEFubnVhbEluY29tZSlbMV1gIGtow6FjaCBow6BuZyAgKGNoaeG6v20gYHIgdGFibGUobnB0JEFubnVhbEluY29tZSlbNV0vc3VtKG5yb3cobnB0KSkqMTAwYFwlKSwgdGhlbyBzYXUgbMOgOg0KDQogIC0gTmjDs20gJDEwSyAtICQzMEsgKGByIHRhYmxlKG5wdCRBbm51YWxJbmNvbWUpWzFdL3N1bShucm93KG5wdCkpKjEwMGBcJSkNCg0KICAtIE5ow7NtICQ1MEsgLSAkNzBLIChgciB0YWJsZShucHQkQW5udWFsSW5jb21lKVs2XS9zdW0obnJvdyhucHQpKSoxMDBgXCUpDQoNCi0gUuG6pXQgw610IGtow6FjaCBow6BuZyBjw7MgdGh1IG5o4bqtcCB0csOqbiAkMTUwSyAoYHIgdGFibGUobnB0JEFubnVhbEluY29tZSlbNF0vc3VtKG5yb3cobnB0KSkqMTAwYFwlKQ0KDQotIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBjaHXhu5dpIHNpw6p1IHRo4buLIGNo4bunIHnhur91IHBo4bulYyB24bulIG5ow7NtIHRodSBuaOG6rXAgdHJ1bmcgYsOsbmggdsOgIHRo4bqlcCDigJMgcGjDuSBo4bujcCB24bubaSBjaGnhur9uIGzGsOG7o2MgZ2nDoSBy4bq7LCBow6BuZyBow7NhIHRoaeG6v3QgeeG6v3UuDQoNCi0gQ2hp4bq/biBsxrDhu6NjIG1hcmtldGluZywga2h1eeG6v24gbcOjaSwgdsOgIGNow61uaCBzw6FjaCBnacOhIG7Dqm4gdOG6rXAgdHJ1bmcgdsOgbyBuaMOzbSBuw6B5ICh2w60gZOG7pTogY29tYm8gdGnhur90IGtp4buHbSwgY2hp4bq/dCBraOG6pXUgdGhlbyBz4buRIGzGsOG7o25nKS4NCg0KIyMjICoqMy40LiBDSVRZKioNCg0KIyMjIyAqKjMuNC4xIFRo4buRbmcga8OqIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KdGFiX0NpdHkgPC0gdGFibGUobnB0JENpdHkpDQp0YWJfQ2l0eQ0KdGFibGUobnB0JENpdHkpL3N1bShucm93KG5wdCkpDQpiYXJwbG90KHRhYl9DaXR5LCBtYWluID0gIlRow6BuaCBwaOG7kSAtIENpdHkiLCBjb2wgPSAicGluayIsIGxhcyA9IDIpDQpgYGANCg0KIyMjIyAqKjMuNC4yIE5o4bqtbiB4w6l0KioNCg0KLSBDw6FjIHRow6BuaCBwaOG7kSBjw7MgdOG7tyBs4buHIGdpYW8gZOG7i2NoIGNhbyBsw6A6DQoNCiAgLSBTYWxlbSBsw6AgdGjDoG5oIHBo4buRIGPDsyB04buJIGzhu4cga2jDoWNoIGjDoG5nIG11YSBz4bqjbiBwaOG6qW0gY2FvIG5o4bqldCB24bubaSBgciB0YWJsZShucHQkQ2l0eSlbMTNdYCBraMOhY2ggaMOgbmcgdsOgIGNoaeG6v20gaOG6v3QgKGByIHRhYmxlKG5wdCRDaXR5KVsxM10vc3VtKG5yb3cobnB0KSkqMTAwYFwlKQ0KDQogIC0gVGhlbyBzYXUgbMOgIHRow6BuaCBwaOG7kSBUYWNvbWEgKGByIHRhYmxlKG5wdCRDaXR5KVsyMV0vc3VtKG5yb3cobnB0KSkqMTAwYFwlKQ0KDQogIC0gS+G6vyB0aeG6v3AgbMOgIHRow6BuaCBwaOG7kSBMb3MgQW5nZWxlcyAoYHIgdGFibGUobnB0JENpdHkpWzhdL3N1bShucm93KG5wdCkpKjEwMGBcJSkgdsOgIHRhIHRo4bqleSB0aMOgbmggcGjhu5EgU2VhdHRsZSB24bubaSBgciB0YWJsZShucHQkQ2l0eSlbMTddL3N1bShucm93KG5wdCkpKjEwMGBcJSB44bqlcCB44buJIGLhurFuZyB24bubaSB0aMOgbmggcGjhu5EgTG9zIEFuZ2VsZXMuIFF1YSDEkcOzIHRhIG5ow6xuIG5o4bqtbiDEkcaw4bujYyBy4bqxbmcgMiB0aMOgbmggcGjhu5EgbsOgeSBjw7MgbMaw4bujbmcga2jDoWNoIGjDoG5nIG11YSBz4bqvbSBn4bqnbiBuaMawIG5oYXUuIA0KDQotIEPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHPhu7EgdOG6rXAgdHJ1bmcgbeG6oW5oIHThuqFpIGPDoWMgdGjDoG5oIHBo4buRIGLhu50gVMOieSBIb2EgS+G7sywgxJHhurdjIGJp4buHdCDhu58gY8OhYyBiYW5nIFdhc2hpbmd0b24sIE9yZWdvbiB2w6AgQ2FsaWZvcm5pYS4NCg0KLSDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nOg0KDQogIC0gQ8OhYyBjaGkgbmjDoW5oIOG7nyBjw6FjIHRow6BuaCBwaOG7kSBuw6B5IGPDsyBsxrB1IGzGsOG7o25nIGtow6FjaCBow6BuZyBs4bubbiwgaG/hurdjDQoNCiAgLSBDw6FjIHRow6BuaCBwaOG7kSBuw6B5IGPDsyBt4bqtdCDEkeG7mSBkw6JuIGPGsCBjYW8sIG5odSBj4bqndSB0acOqdSBkw7luZyB0aMaw4budbmcgeHV5w6puLg0KICANCiMjIyAqKjMuNS4gU1RBVEVPUlBST1ZJTkNFKioNCg0KIyMjIyAqKjMuNS4xIFRo4buRbmcga8OqIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KdGFiX1N0YXRlb3JQcm92aW5jZSA8LSB0YWJsZShucHQkU3RhdGVvclByb3ZpbmNlKQ0KdGFiX1N0YXRlb3JQcm92aW5jZQ0KdGFibGUobnB0JFN0YXRlb3JQcm92aW5jZSkvc3VtKG5yb3cobnB0KSkNCmJhcnBsb3QodGFiX1N0YXRlb3JQcm92aW5jZSwgbWFpbiA9ICJCYW5nL1Thu4luaCAtIFN0YXRlb3JQcm92aW5jZSIsIGNvbCA9ICJnb2xkZW5yb2QiLCBsYXMgPSAyKQ0KYGBgDQoNCiMjIyMgKiozLjUuMiBOaOG6rW4geMOpdCoqDQoNCi0gUGjDom4gYuG7kToNCg0KICAtIFdhc2hpbmd0b24oV0EpOiBgciB0YWJsZShucHQkU3RhdGVvclByb3ZpbmNlKVs4XS9zdW0obnJvdyhucHQpKSoxMDBgXCUNCg0KICAtIENhbGlmb3JuaWEoQ0EpOiBgciB0YWJsZShucHQkU3RhdGVvclByb3ZpbmNlKVsyXS9zdW0obnJvdyhucHQpKSoxMDBgXCUNCg0KICAtIE9yZWdvbihPUik6IGByIHRhYmxlKG5wdCRTdGF0ZW9yUHJvdmluY2UpWzZdL3N1bShucm93KG5wdCkpKjEwMGBcJQ0KDQotIEJhIGJhbmcgbsOgeSDEkeG7gXUg4bufIGLhu50gVMOieSBIb2EgS+G7sywgdsOgIGzDoCBuaOG7r25nIGJhbmcgY8OzOg0KDQogIC0gRMOibiBz4buRIMSRw7RuZywgdGjhu4sgdHLGsOG7nW5nIGLDoW4gbOG6uyBwaMOhdCB0cmnhu4NuLg0KDQogIC0gVGjDs2kgcXVlbiB0acOqdSBkw7luZyBoaeG7h24gxJHhuqFpLCBz4butIGThu6VuZyBk4buLY2ggduG7pSBzacOqdSB0aOG7iyBuaGnhu4F1IGjGoW4gc28gduG7m2kgY8OhYyBraHUgduG7sWMgbsO0bmcgdGjDtG4uDQoNCi0gVmnhu4djIG3hu58gcuG7mW5nIGtpbmggZG9hbmggaG/hurdjIMSR4bqndSB0xrAgdGjDqm0gdsOgbyBjw6FjIGJhbmcgbsOgeSBsw6AgY2hp4bq/biBsxrDhu6NjIGto4bqjIHRoaS4NCg0KIyMjICoqMy42LiBDT1VOVFJZKioNCg0KIyMjIyAqKjMuNi4xIFRo4buRbmcga8OqIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KdGFiX0NvdW50cnkgPC0gdGFibGUobnB0JENvdW50cnkpDQp0YWJfQ291bnRyeQ0KdGFibGUobnB0JENvdW50cnkpL3N1bShucm93KG5wdCkpDQpiYXJwbG90KHRhYl9Db3VudHJ5LCBtYWluID0gIlF14buRYyBnaWEgLSBDb3VudHJ5IiwgY29sID0gIm9yY2hpZCIsIGxhcyA9IDIpDQpgYGANCg0KIyMjIyAqKjMuNi4yIE5o4bqtbiB4w6l0KioNCg0KLSBU4bu3IGzhu4cga2jDoWNoIGjDoG5nIHRoZW8gcXXhu5FjIGdpYSBwaMOibiBi4buVIHRoZW8gdHLDrG5oIHThu7EgZ2nhuqNtIGThuqduOg0KDQogIC0gQ2FvIG5o4bqldCBsw6AgVVNBOiBgciB0YWJsZShucHQkQ291bnRyeSlbM10vc3VtKG5yb3cobnB0KSkqMTAwYFwlDQoNCiAgLSBL4bq/IHRp4bq/cCBsw6AgTWV4aWNvOiBgciB0YWJsZShucHQkQ291bnRyeSlbMl0vc3VtKG5yb3cobnB0KSkqMTAwYFwlDQoNCiAgLSBUaOG6pXAgbmjhuqV0IGzDoCBDYW5hZGE6IGByIHRhYmxlKG5wdCRDb3VudHJ5KVsxXS9zdW0obnJvdyhucHQpKSoxMDBgXCUNCiAgDQotIFVTIEhvYSBL4buzIHLDtSByw6BuZyBsw6AgdGjhu4sgdHLGsOG7nW5nIHRy4buNbmcgxJFp4buDbSB24bubaSB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGdpYW8gZOG7i2NoICBjYW8gbmjhuqV0IHRyb25nIDMgcXXhu5FjIGdpYS4gxJBp4buBdSBuw6B5IGNo4bupbmcgdOG7jyBIb2EgS+G7syBsw6AgbeG7mXQgcXXhu5FjIGdpYSBwaMOhdCB0cmnhu4NuIG3huqFuaCB24bubaSBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgY2hp4bq/biBwaOG6p24gbOG7m24uIA0KDQotIFR1eSBuaGnDqm4sIHPhu7EgaGnhu4duIGRp4buHbiB04bqhaSBNZXhpY28gKGjGoW4gMS80IHPhu5EgZ2lhbyBk4buLY2gpIGNobyB0aOG6pXkgxJHDonkgbMOgIHRo4buLIHRyxrDhu51uZyB0aOG7qSBj4bqlcCB0aeG7gW0gbsSDbmcsIGPDsyB0aOG7gyBt4bufIHLhu5luZyBob+G6t2MgdMSDbmcgbmjhuq1uIGRp4buHbiB0aMawxqFuZw0KaGnhu4d1Lg0KDQojIyMgKiozLjcuIFBST0RVQ1RGQU1JTFkqKg0KDQojIyMjICoqMy43LjEgVGjhu5FuZyBrw6ogdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQp0YWJfUHJvZHVjdEZhbWlseSA8LSB0YWJsZShucHQkUHJvZHVjdEZhbWlseSkNCnRhYl9Qcm9kdWN0RmFtaWx5DQp0YWJsZShucHQkUHJvZHVjdEZhbWlseSkvc3VtKG5yb3cobnB0KSkNCmJhcnBsb3QodGFiX1Byb2R1Y3RGYW1pbHksIG1haW4gPSAiTmjDs20gc+G6o24gcGjhuqltIC0gUHJvZHVjdEZhbWlseSIsIGNvbCA9ICJtZWRpdW12aW9sZXRyZWQiLCBsYXMgPSAyKQ0KYGBgDQoNCiMjIyMgKiozLjcuMiBOaOG6rW4geMOpdCoqDQoNCi0gVGjhu7FjIHBo4bqpbSAoRm9vZCkgY2hp4bq/bSDEkWEgc+G7kSAoYHIgdGFibGUobnB0JFByb2R1Y3RGYW1pbHkpWzJdL3N1bShucm93KG5wdCkpKjEwMGBcJSksIGNhbyB2xrDhu6N0IHRy4buZaSBzbyB24bubaToNCg0KICAtIE5vbi1Db25zdW1hYmxlcyBjaGnhur9tIGByIHRhYmxlKG5wdCRQcm9kdWN0RmFtaWx5KVszXS9zdW0obnJvdyhucHQpKSoxMDBgXCUNCg0KICAtIE5ow7NtIMSR4buTIHXhu5FuZyBjaGnhur9tIGByIHRhYmxlKG5wdCRQcm9kdWN0RmFtaWx5KVsxXS9zdW0obnJvdyhucHQpKSoxMDBgXCUNCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcgbXVhIHPhuq9tIGNo4bunIHnhur91IGzDoCDEkeG7gyBwaOG7pWMgduG7pSBuaHUgY+G6p3UgxINuIHXhu5FuZyBow6BuZyBuZ8OgeS4NCg0KLSBTacOqdSB0aOG7iyBuw6puIHRp4bq/cCB04bulYyDEkeG6p3UgdMawIG3huqFuaCB2w6BvOg0KDQogIC0gTmd14buTbiBjdW5nIHRo4buxYyBwaOG6qW0gdMawxqFpLA0KDQogIC0gQ8OhYyBz4bqjbiBwaOG6qW0gdGhp4bq/dCB54bq/dSBnacOhIHThu5F0LA0KDQogIC0gQ2jDrW5oIHPDoWNoIMawdSDEkcOjaSBz4buRIGzGsOG7o25nIGzhu5tuIGNobyB0aOG7sWMgcGjhuqltLg0KDQojIyMgKiozLjguIFBST0RVQ1RERVBBUlRNRU5UKioNCg0KIyMjIyAqKjMuOC4xIFRo4buRbmcga8OqIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KdGFiX1Byb2R1Y3REZXBhcnRtZW50IDwtIHRhYmxlKG5wdCRQcm9kdWN0RGVwYXJ0bWVudCkNCnRhYl9Qcm9kdWN0RGVwYXJ0bWVudA0KdGFibGUobnB0JFByb2R1Y3REZXBhcnRtZW50KS9zdW0obnJvdyhucHQpKQ0KYmFycGxvdCh0YWJfUHJvZHVjdERlcGFydG1lbnQsIG1haW4gPSAiQuG7mSBwaOG6rW4gc+G6o24gcGjhuqltIC0gUHJvZHVjdERlcGFydG1lbnQiLCBjb2wgPSAiZG9kZ2VyYmx1ZSIsIGxhcyA9IDIpDQpgYGANCg0KIyMjIyAqKjMuOC4yIE5o4bqtbiB4w6l0ICoqDQoNCi0gQ8OhYyBi4buZIHBow6JuIGNoaeG6v20gxJFhIHPhu5EgdHJvbmcgdG/DoG4gYuG7mSBjw6FjIGLhu5kgcGjhuq1uIMSRxrDhu6NjIHRo4buRbmcga8OqOg0KDQogIC0gUHJvZHVjZSAoUmF1IHF14bqjKTogYHIgdGFibGUobnB0JFByb2R1Y3REZXBhcnRtZW50KVsxOF0vc3VtKG5yb3cobnB0KSkqMTAwYFwlDQoNCiAgLSBTbmFjayBGb29kczogYHIgdGFibGUobnB0JFByb2R1Y3REZXBhcnRtZW50KVsyMF0vc3VtKG5yb3cobnB0KSkqMTAwYFwlDQoNCiAgLSBIb3VzZWhvbGQ6IGByIHRhYmxlKG5wdCRQcm9kdWN0RGVwYXJ0bWVudClbMTVdL3N1bShucm93KG5wdCkpKjEwMGBcJQ0KDQotIEtow6FjaCBow6BuZyBtdWEgbmhp4buBdSBjw6FjIG3hurd0IGjDoG5nOg0KDQogIC0gVMawxqFpIHPhu5FuZywgZOG7hSBo4buPbmcgKHByb2R1Y2UpIC0+IHnDqnUgY+G6p3UgYuG6o28gcXXhuqNuIHbDoCBjaHXhu5dpIGN1bmcg4bupbmcgdOG7kXQuDQoNCiAgLSDEkOG7kyDEg24gduG6t3QgdsOgIGjDoG5nIGdpYSBk4bulbmcgLT4gcGjhuqNuIMOhbmggdGjDs2kgcXVlbiB0acOqdSBkw7luZyBuaGFuaCwgdGnhu4duIGzhu6NpLg0KDQotIMSQw6J5IGzDoCBjxqEgaOG7mWkgxJHhu4MgdMSDbmcgY8aw4budbmcgbWFya2V0aW5nIG5ow7NtIHPhuqNuIHBo4bqpbSB0aeG7h24gbOG7o2ksIGNvbWJvIGLhu69hIMSDbiwgc+G6o24gcGjhuqltIGNobyBo4buZIGdpYSDEkcOsbmguDQoNCiMjIyAqKjMuOS4gUFJPRFVDVENBVEVHT1JZKioNCg0KIyMjIyAqKjMuOS4xIFRo4buRbmcga8OqIHR14bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCnRhYl9Qcm9kdWN0Q2F0ZWdvcnkgPC0gdGFibGUobnB0JFByb2R1Y3RDYXRlZ29yeSkNCnRhYl9Qcm9kdWN0Q2F0ZWdvcnkNCnRhYmxlKG5wdCRQcm9kdWN0Q2F0ZWdvcnkpL3N1bShucm93KG5wdCkpDQpiYXJwbG90KHRhYl9Qcm9kdWN0Q2F0ZWdvcnksIG1haW4gPSAiRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gLSBQcm9kdWN0Q2F0ZWdvcnkiLCBjb2wgPSAic2VhZ3JlZW4iLCBsYXMgPSAyKQ0KYGBgDQoNCiMjIyMgKiozLjkuMiBOaOG6rW4geMOpdCoqDQoNCi0gQ8OhYyBsb+G6oWkgdGjhu7FjIHBo4bqpbSBwaOG7lSBiaeG6v24gxJHGsOG7o2MgcXVhbiBzw6F0IHThu6sgYmnhu4N1IMSR4buTOg0KDQogIC0gVmVnZXRhYmxlcyAoUmF1KTogduG7m2kgc+G7kSBsxrDhu6NuZyBsw6AgYHIgdGFibGUobnB0JFByb2R1Y3RDYXRlZ29yeSlbNDVdYCBraMOhY2ggaMOgbmcgdsOgIGNoaeG6v20gaOG6v3QgKGByIHRhYmxlKG5wdCRQcm9kdWN0Q2F0ZWdvcnkpWzQ1XS9zdW0obnJvdyhucHQpKSoxMDBgXCUpDQoNCiAgLSBTbmFjayBGb29kczogYHIgdGFibGUobnB0JFByb2R1Y3RDYXRlZ29yeSlbNDJdYCBraMOhY2ggaMOgbmcgdsOgIGNoaeG6v20gaOG6v3QgKGByIHRhYmxlKG5wdCRQcm9kdWN0Q2F0ZWdvcnkpWzQyXS9zdW0obnJvdyhucHQpKSoxMDBgXCUpDQoNCiAgLSBEYWlyeSAoU+G7r2EpOiBgciB0YWJsZShucHQkUHJvZHVjdENhdGVnb3J5KVsxOF1gIGtow6FjaCBow6BuZyB2w6AgY2hp4bq/bSBo4bq/dCAoYHIgdGFibGUobnB0JFByb2R1Y3RDYXRlZ29yeSlbMThdL3N1bShucm93KG5wdCkpKjEwMGBcJSkNCg0KICAtIEZydWl0LCBNZWF0LCBGcm96ZW4gRm9vZHMuLi4NCg0KLSDEkMOieSBsw6Agbmjhu69uZyBt4bq3dCBow6BuZyB0acOqdSBkw7luZyBuaGFuaCwgY8OzIHbDsm5nIMSR4budaSBuZ+G6r24uDQoNCi0gVmnhu4djIGtow6FjaCBow6BuZyBtdWEgY2jhu6cgeeG6v3UgY8OhYyBt4bq3dCBow6BuZyB0aGnhur90IHnhur91IGNobyB0aOG6pXkgc2nDqnUgdGjhu4sgaG/huqF0IMSR4buZbmcgdOG7kXQgdHJvbmcgdmnhu4djIHBo4bulYyB24bulIG5odSBj4bqndSBjxqEgYuG6o24sIGNo4bupIGtow7RuZyBwaOG6o2kgc+G6o24gcGjhuqltIHhhIHjhu4kgaGF5IGtow7RuZyB0aMaw4budbmcgeHV5w6puLg0KDQojIyAqKlBI4bqmTiAzOiDGr+G7mkMgTMav4buiTkcgS0hP4bqiTkcgVsOAIEtJ4buCTSDEkOG7ik5IIEdJ4bqiIFRIVVnhur5UIENITyBU4bu2IEzhu4YgKE3hu5hUIEJJ4bq+TikqKg0KDQotIHRhYmxlKCk6CVRo4buRbmcga8OqIHPhu5EgbMaw4bujbmcgdOG7q25nIGxv4bqhaSB0cm9uZyBiaeG6v24gxJHhu4tuaCB0w61uaA0KLSBzdW0oLi4uKToJxJDhur9tIGJhbyBuaGnDqnUgZMOybmcgdGjhu49hIMSRaeG7gXUga2nhu4duIChnacOhIHRy4buLIHF1YW4gdMOibSkNCi0gbGVuZ3RoKC4uLik6CVThu5VuZyBz4buRIG3huqt1DQotIHByb3AudGVzdCguLi4pOglUw61uaCBraG/huqNuZyB0aW4gY+G6rXkgdsOgIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IGNobyB04bu3IGzhu4cNCi0gcCA9IC4uLgk6IFThu7cgbOG7hyBnaeG6oyDEkeG7i25oIHRyb25nIGdp4bqjIHRodXnhur90IEgwDQotIGFsdGVybmF0aXZlID0gLi4uOglLaeG7g20gxJHhu4tuaCBoYWkgcGjDrWEgKCJ0d28uc2lkZWQiKSwgbeG7mXQgcGjDrWEgbOG7m24gaMahbiAoImdyZWF0ZXIiKSwgbmjhu48gaMahbiAoImxlc3MiKQ0KDQojIyMgKiozLjEgQmnhur9uIEdlbmRlciB2w6AgaOG6oW5nIG3hu6VjIMSR4buBIGPhuq1wIGzDoCBGZW1hbGUqKg0KDQpgYGB7cn0NCiMgWMOhYyDEkeG7i25oIGjhuqFuZyBt4bulYyBxdWFuIHTDom0NCnRhYmxlKG5wdCRHZW5kZXIpDQojIFPhu5EgbMaw4bujbmcgdsOgIHThu5VuZyBz4buRIA0Kc2xmZW1hbGUgPC0gc3VtKG5wdCRHZW5kZXIgPT0gIkYiKQ0KdG90YWxnZW5kZXIgPC0gbGVuZ3RoKG5wdCRHZW5kZXIpDQojIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgIkZlbWFsZSINCnByb3AudGVzdChzbGZlbWFsZSwgdG90YWxnZW5kZXIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KIyBLaeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dDogdOG7tyBs4buHIEZlbWFsZSA9IDAuNQ0KcHJvcC50ZXN0KHNsZmVtYWxlLCB0b3RhbGdlbmRlciwgcCA9IDAuNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgY29uZi5sZXZlbCA9IDAuOTUpDQpgYGANCg0KKipHaeG6oyB0aHV54bq/dCoqDQoNCi0gSDA6IHAgPSAwLjUNCg0KLSBIMTogcCDiiaAgMC41DQoNCioqxJDhu41jIGvhur90IHF14bqjIHbDoCBr4bq/dCBsdeG6rW4gKioNCg0KLSBU4buVbmcgc+G7kSBjw6EgdGjhu4MgdHJvbmcgbeG6q3UgbMOgIDE0LjA1OSBuZ8aw4budaSwgdHJvbmcgxJHDsyBjw7MgNy4xNzAgbmfGsOG7nWkgbMOgIG7hu68gdsOgIDYuODg5IG5nxrDhu51pIGzDoCBuYW0uIFThu7cgbOG7hyBu4buvIGdp4bubaSB0cm9uZyBt4bqrdSBsw6AgNTAuOTk5MzYlLg0KDQotIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIHThu7cgbOG7hyBt4buZdCBt4bqrdSB24bubaSBnaeG6oyB0aHV54bq/dCB04bu3IGzhu4cgbuG7ryB0cm9uZyB04buVbmcgdGjhu4MgbMOgIDUwJSAoSOKCgDogcCA9IDAuNSkgY2hvIHRo4bqleSBnacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkID0gNS41NzY1IHbhu5tpIDEgYuG6rWMgdOG7sSBkbywgdsOgIHAtdmFsdWUgPSAwLjAxODIuIFbhu5tpIG3hu6ljIMO9IG5naMSpYSB0aMO0bmcgdGjGsOG7nW5nIM6xID0gMC4wNSwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZywgY2hvIHRo4bqleSB04bu3IGzhu4cgbuG7ryBnaeG7m2kgdHJvbmcgbeG6q3UgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogc28gduG7m2kgdOG7tyBs4buHIDUwJS4NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbuG7ryB0cm9uZyBxdeG6p24gdGjhu4MgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA1MC4xNjkzMSUgxJHhur9uIDUxLjgyODg2JSwgY2hvIHRo4bqleSB04bu3IGzhu4cgbsOgeSBjaOG7iSBoxqFpIGNhbyBoxqFuIDUwJS4NCg0KKipUw7NtIGzhuqFpKioNCg0KLSBUdXkgdOG7tyBs4buHIG7hu68gZ2nhu5tpIHRyb25nIG3huqt1IGNo4buJIG5o4buJbmggaMahbiBuYW0gZ2nhu5tpIGtow7RuZyBxdcOhIGNhbyAgKDUwLjk5OTM2JSksIG5oxrBuZyBz4buxIGNow6puaCBs4buHY2ggbsOgeSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gRG8gxJHDsywgY8OzIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgbuG7ryBnaeG7m2kgY2hp4bq/bSDGsHUgdGjhur8gbmjhurkgbmjGsG5nIMSRw6FuZyBr4buDIHbhu4EgbeG6t3QgdGjhu5FuZyBrw6ogdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbsOgeS4NCg0KKipL4bq/dCBsdeG6rW4qKg0KDQotIFThu7cgbOG7hyBu4buvIHRyb25nIHThu5VuZyBt4bqrdSBsw6AgNTAuOTk5JSwga2jDoWMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBzbyB24bubaSA1MCUuDQotIFbhu5tpIHAtdmFsdWUgPSAwLjAxODIsIGLhuqFuIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBy4bqxbmcgdOG7tyBs4buHIG7hu68gbMOgIDUwJSDhu58gbeG7qWMgw70gbmdoxKlhIDUlLg0KLSBUdXkgbmhpw6puLCBz4buxIGNow6puaCBs4buHY2ggZMO5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6osIG5oxrBuZyBy4bqldCBuaOG7jyB24buBIG3hurd0IHRo4buxYyB04bq/ICh+MSUpDQoNCiMjIyAqKjMuMiBCaeG6v24gSG9tZW93bmVyIHbhu5tpIGjhuqFuZyBt4bulYyDEkeG7gSBj4bqtcCBsw6AgIlkiKioNCg0KYGBge3J9DQojIFjDoWMgxJHhu4tuaCBo4bqhbmcgbeG7pWMgcXVhbiB0w6JtDQp0YWJsZShucHQkSG9tZW93bmVyKQ0Kc2xzaG4gPC0gc3VtKG5wdCRIb21lb3duZXIgPT0gIlkiKQ0KdG90YWxob21lb3duZXIgPC0gbGVuZ3RoKG5wdCRIb21lb3duZXIpDQoNCiMgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteQ0KcHJvcC50ZXN0KHNsc2huLCB0b3RhbGhvbWVvd25lciwgY29uZi5sZXZlbCA9IDAuOTUpDQoNCiMgS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgSDA6IHThu7cgbOG7hyBjaOG7pyBuaMOgID0gMC42DQpwcm9wLnRlc3Qoc2xzaG4sIHRvdGFsaG9tZW93bmVyLCBwID0gMC42LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQoqKkdp4bqjIHRodXnhur90IDEqKg0KDQotIEgwOiBwID0gMC41DQoNCi0gSDE6IHAg4omgIDAuNQ0KDQoqKsSQ4buNYyBr4bq/dCBxdeG6oyB2w6Aga+G6v3QgbHXhuq1uKioNCg0KLSBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCB04bu3IGzhu4cgbeG7mXQgbeG6q3UgY2hvIHRo4bqleSB04bu3IGzhu4cgxJHhu5FpIHTGsOG7o25nIGNo4buNbiBs4buxYSB0cm9uZyB04buVbmcgdGjhu4MgbeG6q3UgbMOgIDYwLjA2JS4gS2hpIHRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB24bubaSB04bu3IGzhu4cgY2h14bqpbiBsw6AgNTAlLCB0YSB0aHUgxJHGsOG7o2MgZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZCBsw6AgNTY4Ljg2IHbhu5tpIG3hu5l0IGLhuq1jIHThu7EgZG8sIHbDoCBwLXZhbHVlIDwgMi4yZS0xNi4gVuG7m2kgbeG7qWMgw70gbmdoxKlhIHRow7RuZyB0aMaw4budbmcgKM6xID0gMC4wNSksIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEjigoA6IHAgPSAwLjUpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB04bu3IGzhu4cgdGjhu7FjIHThur8ga2jDoWMgYmnhu4d0IG3hu5l0IGPDoWNoIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogc28gduG7m2kgNTAlLg0KDQoqKkdp4bqjIHRodXnhur90IDIqKg0KDQotIEgwOiBwID0gMC42DQoNCi0gSDE6IHAg4omgIDAuNg0KDQoqKsSQ4buNYyBr4bq/dCBxdeG6oyB2w6Aga+G6v3QgbHXhuq1uKioNCg0KLSBOZ8aw4bujYyBs4bqhaSwga2hpIGtp4buDbSDEkeG7i25oIHbhu5tpIHThu7cgbOG7hyBnaeG6oyDEkeG7i25oIGzDoCA2MCUsIGdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQgY2jhu4kgbMOgIDAuMDE5NDQ1IHbhu5tpIHAtdmFsdWUgPSAwLjg4OTEuIERvIHAtdmFsdWUgbOG7m24gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgdGEga2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEjigoA6IHAgPSAwLjYpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBraMO0bmcgY8OzIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIGNobyB0aOG6pXkgdOG7tyBs4buHIHRo4buxYyB04bq/IGtow6FjIGJp4buHdCBzbyB24bubaSA2MCUuDQoNCioqVMOzbSBs4bqhaToqKg0KDQotIFThu7cgbOG7hyBs4buxYSBjaOG7jW4gdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbMOgIGtob+G6o25nIDYwLjA2JSB2w6Aga2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogc28gduG7m2kgdOG7tyBs4buHIGdp4bqjIMSR4buLbmggNTAlLCBuaMawbmcga2jDtG5nIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyBzbyB24bubaSB04bu3IGzhu4cgNjAlLiDEkMOieSBsw6AgY8ahIHPhu58gxJHhu4MgZ2nhuqMgxJHhu4tuaCBy4bqxbmcgdOG7tyBs4buHIGzhu7FhIGNo4buNbiB0cm9uZyBxdeG6p24gdGjhu4MgY8OzIHRo4buDIHbDoG8ga2hv4bqjbmcgNjAlLg0KDQojIyMgKiozLjMgQmnhur9uIFByb2R1Y3RGYW1pbHkgduG7m2kgaOG6oW5nIG3hu6VjIMSR4buBIGPhuq1wIGzDoCAiRm9vZCIqKg0KDQpgYGB7cn0NCiMgWMOhYyDEkeG7i25oIGjhuqFuZyBt4bulYyDEkeG7gSBj4bqtcA0KdGFibGUobnB0JFByb2R1Y3RGYW1pbHkpDQpzbGZvb2QgPC0gc3VtKG5wdCRQcm9kdWN0RmFtaWx5ID09ICJGb29kIikNCnRvdGFscHJvZHVjdCA8LSBsZW5ndGgobnB0JFByb2R1Y3RGYW1pbHkpDQojIMav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkNCnByb3AudGVzdChzbGZvb2QsIHRvdGFscHJvZHVjdCwgY29uZi5sZXZlbCA9IDAuOTUpDQojIEtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IEgwOiB04bu3IGzhu4cgPj0gMC43IChhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIjoga2nhu4NtIMSR4buLbmggMSBwaMOtYSAoPikpDQpwcm9wLnRlc3Qoc2xmb29kLCB0b3RhbHByb2R1Y3QsIHAgPSAwLjcsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb25mLmxldmVsID0gMC45NSkNCg0KDQpgYGANCg0KKipHaeG6oyB0aHV54bq/dCAxKioNCg0KLSBIMDogcCA9IDAuNQ0KDQotIEgxOiBwIOKJoCAwLjUNCg0KKirEkOG7jWMga+G6v3QgcXXhuqMgdsOgIGvhur90IGx14bqtbioqDQoNCi0gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdOG7tyBs4buHIG3hu5l0IG3huqt1IGNobyBnaeG6oyB0aHV54bq/dCBy4bqxbmcgdOG7tyBs4buHIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtIEZvb2QgYuG6sW5nIDUwJSAoSOKCgDogcCA9IDAuNSkgY2hvIHRo4bqleToNCg0KICAtIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQgPSAyNzc0LjksIGRmID0gMQ0KDQogIC0gcC12YWx1ZSA8IDIuMmUtMTYNCg0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgbMOgIDAuMDUsIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMCwgbmdoxKlhIGzDoCB04bu3IGzhu4cgc+G6o24gcGjhuqltIG5ow7NtIEZvb2Qga2jDtG5nIGNoaeG6v20gNTAlIHRyb25nIHThu5VuZyBz4buRICJQcm9kdWN0RmFtaWx5Ii4NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbsOgeSBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDcxLjQ3JSDEkeG6v24gNzIuOTUlLg0KDQoqKkdp4bqjIHRodXnhur90IDIqKg0KDQotIEgwOiBwID0gMC43DQoNCi0gSDE6IHAgPiAwLjcNCg0KKirEkOG7jWMga+G6v3QgcXXhuqMgdsOgIGvhur90IGx14bqtbioqDQoNCi0gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdGnhur9wIHRoZW8ga2nhu4NtIHRyYSB4ZW0gbGnhu4d1IHThu7cgbOG7hyBz4bqjbiBwaOG6qW0gbmjDs20gRm9vZCBjw7MgY2FvIGjGoW4gNzAlIGhheSBraMO0bmcsIGNobyB0aOG6pXk6DQoNCiAgLSBHacOhIHRy4buLIENoaS1zcXVhcmVkID0gMzIuODAyLCBkZiA9IDENCg0KICAtIHAtdmFsdWUgPSA1LjEwMWUtMDkNCg0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgdGEgdGnhur9wIHThu6VjIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcsIHbDoCBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90IMSR4buRaSAoSOKCgTogcCA+IDAuNykuIMSQaeG7gXUgbsOgeSBjaOG7qW5nIHThu48gdOG7tyBs4buHIHPhuqNuIHBo4bqpbSBuaMOzbSBGb29kIGzhu5tuIGjGoW4gNzAlIHbhu5tpIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBjYW8uDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG7DoHkgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA3MS41OCUgxJHhur9uIDEwMCUuDQoNCg0KIyMgKipQSOG6pk4gNDogUEjDgk4gVMONQ0ggTeG7kEkgUVVBTiBI4buGIEdJ4buuQSBIQUkgQknhur5OIMSQ4buKTkggVMONTkgqKg0KDQotIENo4buNbiBs4bqnbiBsxrDhu6N0IGPDoWMgY+G6t3AgYmnhur9uIGPDsyBt4buRaSB0xrDGoW5nIHF1YW4gdGjDuiB24buLIGzDoG0g4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIG11YSBow6BuZywgZ2lhbyBk4buLY2ggY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgcmVwb3MgPSAiaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KaW5zdGFsbC5wYWNrYWdlcygiamFuaXRvciIsIHJlcG9zID0gImh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnIikNCmluc3RhbGwucGFja2FnZXMoImdtb2RlbHMiLCByZXBvcyA9ICJodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQppbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIiwgcmVwb3MgPSAiaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KaW5zdGFsbC5wYWNrYWdlcygic2NhbGVzIiwgcmVwb3MgPSAiaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGdtb2RlbHMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCmBgYA0KDQoNCiMjIyAqKjQuMSBHZW5kZXIgdsOgIFByb2R1Y3RGYW1pbHkqKg0KDQojIyMjICoqNC4xLjEgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoqDQoNCmBgYHtyfQ0KdGFiMSA8LSB0YWJsZShucHQkR2VuZGVyLCBucHQkUHJvZHVjdEZhbWlseSkNCnRhYjEgDQpwcm9wLnRhYmxlKHRhYjEsIDEpICMgdGhlbyBow6BuZw0KYGBgDQoNCg0KLSBE4buxYSB0csOqbiBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIGdp4buvYSBHaeG7m2kgdMOtbmggKEdlbmRlcikgdsOgIE5ow7NtIHPhuqNuIHBo4bqpbSAoUHJvZHVjdEZhbWlseSk6DQoNCi0gTuG7ryBnaeG7m2kgKEYpIGPDsyB4dSBoxrDhu5tuZyBjaOG7jW4gc+G6o24gcGjhuqltIEZvb2Qgbmhp4buBdSBuaOG6pXQsIGNoaeG6v20ga2hv4bqjbmcgNzEuOCUgdHJvbmcgdOG7lW5nIHPhu5Egc+G6o24gcGjhuqltIG3DoCBu4buvIGdp4bubaSBjaOG7jW4uIFRp4bq/cCB0aGVvIGzDoCBuaMOzbSBOb24tQ29uc3VtYWJsZSAoMTguOSUpIHbDoCBEcmluayAoOS4zJSkuDQoNCi0gTmFtIGdp4bubaSAoTSkgY8WpbmcgY8OzIHh1IGjGsOG7m25nIHTGsMahbmcgdOG7sSBraGkgbOG7sWEgY2jhu41uIG5oaeG7gXUgbmjhuqV0IGzDoCBGb29kICg3Mi42JSksIGvhur8gxJHhur9uIGzDoCBOb24tQ29uc3VtYWJsZSAoMTguOSUpIHbDoCDDrXQgbmjhuqV0IGzDoCBEcmluayAoOC40JSkuDQoNCi0gU28gc8OhbmggZ2nhu5tpIHTDrW5oOg0KDQogIC0gQ+G6oyBoYWkgZ2nhu5tpIMSR4buBdSDGsHUgdGnDqm4gbmjDs20gc+G6o24gcGjhuqltIEZvb2QgduG7m2kgdOG7tyBs4buHIGNhbyBuaOG6pXQsIHRyw6puIDcwJS4NCg0KICAtIFThu7cgbOG7hyBjaOG7jW4gRHJpbmsgY+G7p2EgbuG7ryBjYW8gaMahbiBuYW0gbeG7mXQgY2jDunQgKDkuMyUgc28gduG7m2kgOC40JSkuDQoNCiAgLSBU4bu3IGzhu4cgY2jhu41uIE5vbi1Db25zdW1hYmxlIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZyBnaeG7r2EgaGFpIGdp4bubaSAoMTguOSUpLg0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpT4bufIHRow61jaCB24buBIG5ow7NtIHPhuqNuIHBo4bqpbSBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIGdp4buvYSBuYW0gdsOgIG7hu68uIE5ow7NtIHPhuqNuIHBo4bqpbSBGb29kIGNoaeG6v20gxrB1IHRo4bq/IHRyb25nIGzhu7FhIGNo4buNbiBj4bunYSBj4bqjIGhhaSBnaeG7m2ksIHRyb25nIGtoaSBuaMOzbSBEcmluayBsw6Agw610IMSRxrDhu6NjIGNo4buNbiBuaOG6pXQuDQoNCiMjIyMgKio0LjEuMiBUcuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQojIFThuqFvIGThu68gbGnhu4d1DQpkZiA8LSB0cmliYmxlKA0KICB+R2VuZGVyLCB+RHJpbmssIH5Gb29kLCB+Tm9uX0NvbnN1bWFibGUsDQogICJGIiwgICAgIDAuMDkzMzA1NDQsIDAuNzE4MTMxMTAsIDAuMTg4NTYzNDYsDQogICJNIiwgICAgIDAuMDg0MzM3MzUsIDAuNzI2Mzc1MzgsIDAuMTg5Mjg3MjcNCikNCg0KIyBDaHV54buDbiBzYW5nIGThuqFuZyBsb25nDQpkZl9sb25nIDwtIGRmICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IC1HZW5kZXIsIG5hbWVzX3RvID0gIkNhdGVnb3J5IiwgdmFsdWVzX3RvID0gIlByb3BvcnRpb24iKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPDsyBoaeG7g24gdGjhu4sgc+G7kSB0csOqbiBj4buZdA0KZ2dwbG90KGRmX2xvbmcsIGFlcyh4ID0gQ2F0ZWdvcnksIHkgPSBQcm9wb3J0aW9uLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkgKw0KICBnZW9tX3RleHQoDQogICAgYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KFByb3BvcnRpb24sIGFjY3VyYWN5ID0gMSkpLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLA0KICAgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDQNCiAgKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGxpbWl0cyA9IGMoMCwgMC44KSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlThu7cgbOG7hyB0acOqdSBkw7luZyB0aGVvIGdp4bubaSB0w61uaCB2w6AgbmjDs20gaMOgbmciLA0KICAgIHggPSAiTmjDs20gaMOgbmciLA0KICAgIHkgPSAiVOG7tyBs4buHICglKSINCiAgKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkYiID0gInJlZCIsICJNIiA9ICJibHVlIikpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQ0KYGBgDQoNCg0KIyMjIyAqKjQuMS4zIE5o4bqtbiB4w6l0KioNCg0KLSBE4buxYSB0csOqbiBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIGdp4buvYSBHaeG7m2kgdMOtbmggKEdlbmRlcikgdsOgIE5ow7NtIHPhuqNuIHBo4bqpbSAoUHJvZHVjdEZhbWlseSk6DQoNCi0gTuG7ryBnaeG7m2kgKEYpIGPDsyB4dSBoxrDhu5tuZyBjaOG7jW4gc+G6o24gcGjhuqltIEZvb2Qgbmhp4buBdSBuaOG6pXQsIGNoaeG6v20ga2hv4bqjbmcgNzEuOCUgdHJvbmcgdOG7lW5nIHPhu5Egc+G6o24gcGjhuqltIG3DoCBu4buvIGdp4bubaSBjaOG7jW4uIFRp4bq/cCB0aGVvIGzDoCBuaMOzbSBOb24tQ29uc3VtYWJsZSAoMTguOSUpIHbDoCBEcmluayAoOS4zJSkuDQoNCi0gTmFtIGdp4bubaSAoTSkgY8WpbmcgY8OzIHh1IGjGsOG7m25nIHTGsMahbmcgdOG7sSBraGkgbOG7sWEgY2jhu41uIG5oaeG7gXUgbmjhuqV0IGzDoCBGb29kICg3Mi42JSksIGvhur8gxJHhur9uIGzDoCBOb24tQ29uc3VtYWJsZSAoMTguOSUpIHbDoCDDrXQgbmjhuqV0IGzDoCBEcmluayAoOC40JSkuDQoNCi0gU28gc8OhbmggZ2nhu5tpIHTDrW5oOg0KDQogIC0gQ+G6oyBoYWkgZ2nhu5tpIMSR4buBdSDGsHUgdGnDqm4gbmjDs20gc+G6o24gcGjhuqltIEZvb2QgduG7m2kgdOG7tyBs4buHIGNhbyBuaOG6pXQsIHRyw6puIDcwJS4NCg0KICAtIFThu7cgbOG7hyBjaOG7jW4gRHJpbmsgY+G7p2EgbuG7ryBjYW8gaMahbiBuYW0gbeG7mXQgY2jDunQgKDkuMyUgc28gduG7m2kgOC40JSkuDQoNCiAgLSBU4bu3IGzhu4cgY2jhu41uIE5vbi1Db25zdW1hYmxlIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZyBnaeG7r2EgaGFpIGdp4bubaSAoMTguOSUpLg0KDQoqKkvhur90IGx14bqtbjoqKg0KDQotIFPhu58gdGjDrWNoIHbhu4EgbmjDs20gc+G6o24gcGjhuqltIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgZ2nhu69hIG5hbSB2w6AgbuG7ry4gTmjDs20gc+G6o24gcGjhuqltIEZvb2QgY2hp4bq/bSDGsHUgdGjhur8gdHJvbmcgbOG7sWEgY2jhu41uIGPhu6dhIGPhuqMgaGFpIGdp4bubaSwgdHJvbmcga2hpIG5ow7NtIERyaW5rIGzDoCDDrXQgxJHGsOG7o2MgY2jhu41uIG5o4bqldC4NCg0KIyMjIyAqKjQuMS40IEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KY2hpX3Jlc3VsdDEgPC0gY2hpc3EudGVzdCh0YWIxKQ0KY2hpX3Jlc3VsdDENCg0KIyBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkDQpjaGlfcmVzdWx0MSRzdGF0aXN0aWMNCiMgQuG6rWMgdOG7sSBkbyANCmNoaV9yZXN1bHQxJHBhcmFtZXRlcg0KIyBHacOhIHRy4buLIHANCmNoaV9yZXN1bHQxJHAudmFsdWUNCmBgYA0KDQoqKkdp4bqjIHRodXnhur90KioNCg0KLSBHaeG6oyB0aHV54bq/dCBIMDogR2nhu5tpIHTDrW5oIChHZW5kZXIpIHbDoCBOaMOzbSBz4bqjbiBwaOG6qW0gKFByb2R1Y3RGYW1pbHkpIGzDoCDEkeG7mWMgbOG6rXAsIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hy4NCg0KLSBHaeG6oyB0aHV54bq/dCBIMTogR2nhu5tpIHTDrW5oIHbDoCBOaMOzbSBz4bqjbiBwaOG6qW0gY8OzIGxpw6puIGjhu4cgduG7m2kgbmhhdS4NCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQ6IFgtc3F1YXJlZCA9IDMuNTE4NDkNCg0KLSBC4bqtYyB04buxIGRvOiBkZiA9IDINCg0KLSBHacOhIHRy4buLIHA6IHAgPSAwLjE3MjE3NDgNCg0KKipL4bq/dCBsdeG6rW46KioNCg0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgcF92YWx1ZSA9IDAuMTcyMiA+PSAwLjA1IOKGkiBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIEgwLCB04bupYyBsw6Aga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSAyIGJp4bq/biBHZW5kZXIgdsOgIFByb2R1Y3RGYW1pbHkuDQoNCg0KIyMjICoqNC4yIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lcioqDQoNCiMjIyMgKio0LjIuMSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioNCg0KYGBge3J9DQp0YWIyIDwtIHRhYmxlKG5wdCRNYXJpdGFsU3RhdHVzLCBucHQkSG9tZW93bmVyKQ0KdGFiMiANCnByb3AudGFibGUodGFiMiwgMSkNCmBgYA0KDQojIyMjICoqNC4yLjIgVHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KZ2dwbG90KG5wdCwgYWVzKHggPSBNYXJpdGFsU3RhdHVzLCBmaWxsID0gSG9tZW93bmVyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKw0KICBsYWJzKHRpdGxlID0gIlThu7cgbOG7hyBIb21lb3duZXIgdGhlbyBNYXJpdGFsIFN0YXR1cyIsIHkgPSAiVOG7tyBs4buHIiwgeCA9ICJNYXJpdGFsIFN0YXR1cyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyMjICoqNC4yLjMgTmjhuq1uIHjDqXQqKg0KDQojIyMjICoqNC4yLjQgS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nKioNCg0KYGBge3J9DQpjaGlfcmVzdWx0MiA8LSBjaGlzcS50ZXN0KHRhYjIpDQpjaGlfcmVzdWx0Mg0KDQojIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLXNxdWFyZWQNCmNoaV9yZXN1bHQyJHN0YXRpc3RpYw0KIyBC4bqtYyB04buxIGRvIA0KY2hpX3Jlc3VsdDIkcGFyYW1ldGVyDQojIEdpw6EgdHLhu4sgcA0KY2hpX3Jlc3VsdDIkcC52YWx1ZQ0KYGBgDQoNCioqR2nhuqMgdGh1eeG6v3QqKg0KDQotIEdp4bqjIHRodXnhur90IEgwOiBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gKE1hcml0YWxTdGF0dXMpIHbDoCBz4bufIGjhu691IG5ow6AgKEhvbWVvd3duZXIpIGzDoCDEkeG7mWMgbOG6rXAsIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hy4NCg0KLSBHaeG6oyB0aHV54bq/dCBIMTogVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChNYXJpdGFsU3RhdHVzKSB2w6Agc+G7nyBo4buvdSBuaMOgIChIb21lb3d3bmVyKSBjw7MgbGnDqm4gaOG7hyB24bubaSBuaGF1Lg0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZDogWC1zcXVhcmVkID0gMTI0MS4yMg0KDQotIELhuq1jIHThu7EgZG86IGRmID0gMQ0KDQotIEdpw6EgdHLhu4sgcDogcCA8IDIuMmUtMTYNCg0KKipL4bq/dCBsdeG6rW46KioNCg0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgMC4wNSwgcF92YWx1ZSA8IDAuMDUg4oaSIHRhIMSR4bunIMSRaeG7gXUga2nhu4duIMSR4buDIGLDoWMgYuG7jyBIMCwgdOG7qWMgbMOgIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSAyIGJp4bq/biBNYXJpdGFsU3RhdHVzIHbDoCBIb21lb3duZXIuIEPDsyB0aOG7gyBoaeG7g3UgcuG6sW5nIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBt4buZdCBuZ8aw4budaSBjw7Mgc+G7nyBo4buvdSBuaMOgIGhheSBraMO0bmcgKGhv4bq3YyBuZ8aw4bujYyBs4bqhaSkuDQoNCiMjIyAqKjQuMyBBbm51YWxJbmNvbWUgdsOgIFByb2R1Y3RDYXRlZ29yeSoqDQoNCiMjIyMgKio0LjMuMSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioNCg0KYGBge3J9DQp0YWIzIDwtIHRhYmxlKG5wdCRBbm51YWxJbmNvbWUsIG5wdCRQcm9kdWN0RGVwYXJ0bWVudCkNCnRhYjMgDQpwcm9wLnRhYmxlKHRhYjMsIDEpDQpgYGANCg0KIyMjIyAqKjQuMy4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCmdncGxvdChucHQsIGFlcyh4ID0gQW5udWFsSW5jb21lLCBmaWxsID0gUHJvZHVjdERlcGFydG1lbnQpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIFByb2R1Y3REZXBhcnRtZW50IHRoZW8gQW5udWFsIEluY29tZSIsIHkgPSAiVOG7tyBs4buHIiwgeCA9ICJBbm51YWwgSW5jb21lIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyMgKio0LjMuMyBOaOG6rW4geMOpdCoqDQoNCiMjIyMgKio0LjMuNCBLaeG7g20gxJHhu4tuaCBjaGkgLSBiw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KY2hpX3Jlc3VsdDMgPC0gY2hpc3EudGVzdCh0YWIzKQ0KY2hpX3Jlc3VsdDMNCg0KIyBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkDQpjaGlfcmVzdWx0MyRzdGF0aXN0aWMNCiMgQuG6rWMgdOG7sSBkbyANCmNoaV9yZXN1bHQzJHBhcmFtZXRlcg0KIyBHacOhIHRy4buLIHANCmNoaV9yZXN1bHQzJHAudmFsdWUNCmBgYA0KDQoqKkdp4bqjIHRodXnhur90KioNCg0KLSBHaeG6oyB0aHV54bq/dCBIMDogVGh1IG5o4bqtcCBow6BuZyB0aMOhbmcgKEFubnVhbEluY29tZSkgdsOgIFByb2R1Y3REZXBhcnRtZW50IGzDoCDEkeG7mWMgbOG6rXAsIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hy4NCg0KLSBHaeG6oyB0aHV54bq/dCBIMTogVGh1IG5o4bqtcCBow6BuZyB0aMOhbmcgKEFubnVhbEluY29tZSkgdsOgIFByb2R1Y3REZXBhcnRtZW50IGPDsyBsacOqbiBo4buHIHbhu5tpIG5oYXUuDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkOiBYLXNxdWFyZWQgPSAxNzAuMTYNCg0KLSBC4bqtYyB04buxIGRvOiBkZiA9IDE0Nw0KDQotIEdpw6EgdHLhu4sgcDogcCA9IDAuMDkyNzY0Nw0KDQoqKkvhur90IGx14bqtbjoqKg0KDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLjA1IHBfdmFsdWUgPSAwLjA5Mjc2ID4gMC4wNSDihpIgdGEga2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIMSR4buDIGLDoWMgYuG7jyBIMCwgdOG7qWMgbMOgIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgMiBiaeG6v24gQW5udWFsSW5jb21lIHbDoCBQcm9kdWN0RGVwYXJ0bWVudC4gDQoNCiMjIyAqKjQuNCBIb21lb3duZXIgdsOgIEFubnVhbEluY29tZSoqDQoNCiMjIyMgKio0LjQuMSBC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioNCmBgYHtyfQ0KdGFiNCA8LSB0YWJsZShucHQkSG9tZW93bmVyLCBucHQkQW5udWFsSW5jb21lKQ0KdGFiNA0KcHJvcC50YWJsZSh0YWI0LCAxKQ0KDQpgYGANCg0KIyMjIyAqKjQuNC4yIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQojIFThuqFvIGThu68gbGnhu4d1DQpkZiA8LSB0cmliYmxlKA0KICB+SW5jb21lLCB+TiwgflksDQogICIkMTBLIC0gJDMwSyIsICAgMTM1OSwgMTczMSwNCiAgIiQzMEsgLSAkNTBLIiwgICAyMDg3LCAyNTE0LA0KICAiJDUwSyAtICQ3MEsiLCAgIDEwNjMsIDEzMDcsDQogICIkNzBLIC0gJDkwSyIsICAgIDY4NiwgMTAyMywNCiAgIiQ5MEsgLSAkMTEwSyIsICAgMTE3LCA0OTYsDQogICIkMTEwSyAtICQxMzBLIiwgIDExOSwgNTI0LA0KICAiJDEzMEsgLSAkMTUwSyIsICAxMzYsIDYyNCwNCiAgIiQxNTBLICsiLCAgICAgICAgIDQ4LCAyMjUNCikNCg0KIyBDaHV54buDbiBzYW5nIGxvbmcgZm9ybWF0DQpkZl9sb25nIDwtIGRmICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoTiwgWSksIG5hbWVzX3RvID0gIk93bmVyc2hpcCIsIHZhbHVlc190byA9ICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MNCmdncGxvdChkZl9sb25nLCBhZXMoeCA9IEluY29tZSwgeSA9IENvdW50LCBmaWxsID0gT3duZXJzaGlwKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkgKw0KICBnZW9tX3RleHQoDQogICAgYWVzKGxhYmVsID0gQ291bnQpLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLA0KICAgIHZqdXN0ID0gLTAuMywNCiAgICBzaXplID0gMy41DQogICkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJOIiA9ICJwaW5rIiwgIlkiID0gIiMwMEJGQzQiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlPhu5EgbmfGsOG7nWkgc+G7nyBo4buvdSB2w6Aga2jDtG5nIHPhu58gaOG7r3UgbmjDoCB0aGVvIHRodSBuaOG6rXAiLA0KICAgIHggPSAiVGh1IG5o4bqtcCBo4bqxbmcgbsSDbSIsDQogICAgeSA9ICJT4buRIGzGsOG7o25nIG5nxrDhu51pIiwNCiAgICBmaWxsID0gIlPhu58gaOG7r3UgbmjDoCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpDQogICkNCmBgYA0KDQojIyMjICoqNC40LjMgTmjhuq1uIHjDqXQqKg0KDQojIyMjICoqNC40LjQgS2nhu4NtIMSR4buLbmggY2hpIC0gYsOsbmggcGjGsMahbmcqKg0KDQpgYGB7cn0NCmNoaV9yZXN1bHQ0IDwtIGNoaXNxLnRlc3QodGFiNCkNCmNoaV9yZXN1bHQ0DQoNCiMgR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZA0KY2hpX3Jlc3VsdDQkc3RhdGlzdGljDQojIELhuq1jIHThu7EgZG8gDQpjaGlfcmVzdWx0NCRwYXJhbWV0ZXINCiMgR2nDoSB0cuG7iyBwDQpjaGlfcmVzdWx0NCRwLnZhbHVlDQpgYGANCg0KKipHaeG6oyB0aHV54bq/dCoqDQoNCi0gR2nhuqMgdGh1eeG6v3QgSDA6IFRodSBuaOG6rXAgaMOgbmcgdGjDoW5nIChBbm51YWxJbmNvbWUpIHbDoCB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCAoSG9tZW93bmVyKSBsw6AgxJHhu5ljIGzhuq1wLCBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cuDQoNCi0gR2nhuqMgdGh1eeG6v3QgSDE6IFRodSBuaOG6rXAgaMOgbmcgdGjDoW5nIChBbm51YWxJbmNvbWUpIHbDoCB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCAoSG9tZW93bmVyKSBjw7MgbGnDqm4gaOG7hyB24bubaSBuaGF1Lg0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZDogWC1zcXVhcmVkID0gNTQ2LjM3DQoNCi0gQuG6rWMgdOG7sSBkbzogZGYgPSA3DQoNCi0gR2nDoSB0cuG7iyBwOiBwIDwyLjJlLTE2DQoNCioqS+G6v3QgbHXhuq1uOioqDQoNCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDAuMDUgcF92YWx1ZSA8IDAuMDUg4oaSIHRhIGPDsyDEkeG7pyDEkWnhu4F1IGtp4buHbiDEkeG7gyBiw6FjIGLhu48gSDAsIHThu6ljIGzDoCAgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIDIgdGh1IG5o4bqtcCBow6BuZyB0aMOhbmcgdsOgIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgLiANCg0KIyMgKipQSOG6pk4gNTogVOG7lW5nIGvhur90IHbDoCB0aOG6o28gbHXhuq1uKioNCg0KKipUw7NtIHThuq90IG5o4buvbmcgcGjDoXQgaGnhu4duIGNow61uaDoqKg0KDQpUaMO0bmcgcXVhIGPDoWMgcGjDom4gdMOtY2ggdGjhu5FuZyBrw6ogbcO0IHThuqMgdsOgIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90LCBt4buZdCBz4buRIHBow6F0IGhp4buHbiDEkcOhbmcgY2jDuiDDvSDEkcOjIMSRxrDhu6NjIHLDunQgcmE6DQoNCi0gVGjhu6kgbmjhuqV0LCBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCAoR2VuZGVyKSB2w6AgbmjDs20gc+G6o24gcGjhuqltIChQcm9kdWN0RmFtaWx5KSBjaG8gdGjhuqV5IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgZ2nhu69hIG5hbSB2w6AgbuG7ryB0cm9uZyBz4bufIHRow61jaCB0acOqdSBkw7luZyBjw6FjIG5ow7NtIHPhuqNuIHBo4bqpbS4gQ+G6oyBoYWkgZ2nhu5tpIMSR4buBdSDGsHUgdGnDqm4gbOG7sWEgY2jhu41uIHPhuqNuIHBo4bqpbSB0aHXhu5ljIG5ow7NtIEZvb2QgKHRyw6puIDcwJSksIHRp4bq/cCB0aGVvIGzDoCBOb24tQ29uc3VtYWJsZSwgdsOgIMOtdCBs4buxYSBjaOG7jW4gbmjhuqV0IGzDoCBEcmluay4gS2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIGNobyB0aOG6pXkgcC12YWx1ZSA9IDAuMTcyMiA+IDAuMDUsIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG6sW5nIGhhaSBiaeG6v24gbsOgeSDEkeG7mWMgbOG6rXAsIHThu6ljIGzDoCBnaeG7m2kgdMOtbmgga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogduG7m2kgbmjDs20gc+G6o24gcGjhuqltIMSRxrDhu6NjIGNo4buNbi4NCg0KLSBUaOG7qSBoYWksIGtoaSBwaMOibiB0w61jaCBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIChNYXJpdGFsU3RhdHVzKSB2w6Agdmnhu4djIHPhu58gaOG7r3UgbmjDoCAoSG9tZW93bmVyKSwga+G6v3QgcXXhuqMgY2hvIHRo4bqleSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0LiBU4bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIOG7nyBuaMOzbSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gKE1hcnJpZWQpIGzDoCBraG/huqNuZyA3NSUsIHRyb25nIGtoaSDhu58gbmjDs20gxJHhu5ljIHRow6JuIChTaW5nbGUpIGzDoCBkxrDhu5tpIDUwJS4gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIChwLXZhbHVlIDwgMi4yZS0xNikgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6osIHThu6ljIGzDoCBjw7MgdOG7k24gdOG6oWkgbeG7kWkgcXVhbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoC4NCg0KLSBUaOG7qSBiYSwga2hpIHhlbSB4w6l0IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbeG7qWMgdGh1IG5o4bqtcCBow6BuZyBuxINtIChBbm51YWxJbmNvbWUpIHbDoCBsb+G6oWkgc+G6o24gcGjhuqltIChQcm9kdWN0Q2F0ZWdvcnkpLCBr4bq/dCBxdeG6oyBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyB0aOG6pXkgY8OzIHPhu7EgcGjDom4gYuG7lSBraMOhYyBiaeG7h3QgduG7gSBow6BuaCB2aSB0acOqdSBkw7luZyBnaeG7r2EgY8OhYyBuaMOzbSB0aHUgbmjhuq1wLiBDw6FjIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwIGPDsyB4dSBoxrDhu5tuZyB0acOqdSBkw7luZyBuaGnhu4F1IGjGoW4gY8OhYyBt4bq3dCBow6BuZyB0aGnhur90IHnhur91IG5oxrAgUHJvZHVjZSwgRnJvemVuIEZvb2RzLCB2w6AgQmFraW5nIEdvb2RzLCB0cm9uZyBraGkgbmjDs20gdGh1IG5o4bqtcCBjYW8gY8OzIG3hu6ljIHRpw6p1IGTDuW5nIHRy4bqjaSDEkeG7gXUgaMahbiDhu58gbmhp4buBdSBsb+G6oWkgc+G6o24gcGjhuqltIGtow6FjIG5oYXUsIGJhbyBn4buTbSBj4bqjIFNuYWNrIEZvb2RzIHbDoCBIZWFsdGggYW5kIEh5Z2llbmUuIETDuSBjaMawYSB0aeG6v24gaMOgbmgga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogdHJvbmcgcGjhuqduIG7DoHksIGvhur90IHF14bqjIG3DtCB04bqjIGNobyB0aOG6pXkgY8OzIGto4bqjIG7Eg25nIHThu5NuIHThuqFpIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIGjDoG5oIHZpIHRpw6p1IGTDuW5nIHRoZW8gbeG7qWMgdGh1IG5o4bqtcCwgZ+G7o2kgw70gY2hvIGPDoWMgcGjDom4gdMOtY2ggc8OidSBoxqFuIHRyb25nIG5naGnDqm4gY+G7qXUgdGnhur9wIHRoZW8uDQoNCi0gQ3Xhu5FpIGPDuW5nLCBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6AgdsOgIHRodSBuaOG6rXAgKEhvbWVvd25lciDigJMgQW5udWFsSW5jb21lKSBraOG6s25nIMSR4buLbmggY8OzIG3hu5FpIGxpw6puIGjhu4cgY2jhurd0IGNo4bq9IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gdsOgIHTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgLiDEkGnhu4F1IG7DoHkgcGjDuSBo4bujcCB24bubaSBr4buzIHbhu41uZyB0aOG7sWMgdGnhu4VuIHLhurFuZyBuaOG7r25nIG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIGNhbyBz4bq9IGPDsyBraOG6oyBuxINuZyB0w61jaCBsxal5IHbDoCBjaGkgdHLhuqMgdOG7kXQgaMahbiBjaG8gdMOgaSBz4bqjbiBj4buRIMSR4buLbmggbmjGsCBuaMOgIOG7ny4gTmdvw6BpIHJhLCBr4bq/dCBxdeG6oyBjw7JuIGfhu6NpIMO9IHLhurFuZyB0aHUgbmjhuq1wIGzDoCB54bq/dSB04buRIGThu7EgYsOhbyBxdWFuIHRy4buNbmcgY2hvIGjDoG5oIHZpIHPhu58gaOG7r3UgYuG6pXQgxJHhu5luZyBz4bqjbiwgbeG7nyByYSBraOG6oyBuxINuZyB0w61jaCBo4bujcCB2w6BvIGPDoWMgbcO0IGjDrG5oIHBow6JuIGxv4bqhaSBraMOhY2ggaMOgbmcgdGnhu4FtIG7Eg25nIGhv4bq3YyBtw7QgaMOsbmggY2jhuqVtIMSRaeG7g20gdMOtbiBk4bulbmcgKGNyZWRpdCBzY29yaW5nKSB0cm9uZyBuZ8OgbmggbmfDom4gaMOgbmcgdsOgIGLhuqV0IMSR4buZbmcgc+G6o24uDQoNCioqSOG6oW4gY2jhur8gY+G7p2EgcGjDom4gdMOtY2g6KioNCg0KLSBQaOG6oW0gdmkgcGjDom4gdMOtY2ggYmnhur9uOiBQaMOibiB0w61jaCBjaOG7iSB04bqtcCB0cnVuZyB2w6BvIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmguIEPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgcXVhbiB0cuG7jW5nIG5oxrAgQ2hpbGRyZW4sIFVuaXRzU29sZCwgdsOgIFJldmVudWUgY2jGsGEgxJHGsOG7o2MgcGjDom4gdMOtY2ggbcO0IHThuqMgc8OidSwgxrDhu5tjIGzGsOG7o25nIGtob+G6o25nL2tp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90LCBob+G6t2MgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHICh2w60gZOG7pTogbeG7kWkgcXVhbiBo4buHIGdp4buvYSB0aHUgbmjhuq1wIHbDoCBz4buRIGNvbiwgc+G7kSBsxrDhu6NuZyBjb24gdsOgIHPhu5EgbMaw4bujbmcgc+G6o24gcGjhuqltIG11YSkuDQoNCi0gUGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGPDsm4gaOG6oW4gY2jhur86IFBo4bqnbiBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGhhaSBiaeG6v24gxJHhu4tuaCB0w61uaCBt4bubaSBjaOG7iSB4ZW0geMOpdCBt4buZdCB2w6BpIGPhurdwIGJp4bq/biBj4bulIHRo4buDIA0KDQotIE5oaeG7gXUgbeG7kWkgcXVhbiBo4buHIHRp4buBbSBuxINuZyBraMOhYyBnaeG7r2EgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBjaMawYSDEkcaw4bujYyBraMOhbSBwaMOhICh2w60gZOG7pTogVGh1IG5o4bqtcCB2w6AgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCBW4buLIHRyw60gxJHhu4thIGzDvSB2w6AgTG/huqFpIHPhuqNuIHBo4bqpbSBtdWEpLg0KDQotIFRoaeG6v3UgcGjDom4gdMOtY2ggdGjhu51pIGdpYW46IEJp4bq/biBQdXJjaGFzZURhdGUgY8OzIHPhurVuLCBuaMawbmcga2jDtG5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIGPDoWMgcGjDom4gdMOtY2ggbcO0IHThuqMgaG/hurdjIHF1YW4gaOG7hyDEkcaw4bujYyB0csOsbmggYsOgeSB0cm9uZyBuZ3Xhu5NuLiBEbyDEkcOzLCBraMO0bmcgdGjhu4MgeMOhYyDEkeG7i25oIHh1IGjGsOG7m25nIG11YSBz4bqvbSB0aGVvIHRo4budaSBnaWFuLCBtw7lhIHbhu6UsIGhv4bq3YyBjw6FjIG3huqt1IGjDoG5oIHZpIGxpw6puIHF1YW4gxJHhur9uIHRo4budaSDEkWnhu4NtIGdpYW8gZOG7i2NoLg0KDQotIENo4bqldCBsxrDhu6NuZyBk4buvIGxp4buHdTogQsOgaSB0aOG7sWMgaMOgbmggxJHhu4EgY+G6rXAgdmnhu4djIGtp4buDbSB0cmEgTkEgdsOgIGThu68gbGnhu4d1IGtow7RuZyBjw7MgTkEuIFR1eSBuaGnDqm4sIHBow6JuIHTDrWNoIGtow7RuZyDEkeG7gSBj4bqtcCDEkeG6v24gdmnhu4djIGtp4buDbSB0cmEgY8OhYyB24bqlbiDEkeG7gSBjaOG6pXQgbMaw4bujbmcgZOG7ryBsaeG7h3Uga2jDoWMgbmjGsCBnacOhIHRy4buLIG5nb+G6oWkgbGFpIChvdXRsaWVycykgdHJvbmcgYmnhur9uIMSR4buLbmggbMaw4bujbmcgKG3hurdjIGTDuSBraMO0bmcgcGjDom4gdMOtY2ggYmnhur9uIMSR4buLbmggbMaw4bujbmcpLg0KDQotIEtow7RuZyDEkeG7gSBj4bqtcCDEkeG6v24gcGjDom4gdMOtY2gga2jDoWNoIGjDoG5nIGPDoSBuaMOibjogTeG6t2MgZMO5IGPDsyBiaeG6v24gQ3VzdG9tZXJJRCwgcGjDom4gdMOtY2ggdOG6rXAgdHJ1bmcgdsOgbyB04buVbmcgdGjhu4MgaG/hurdjIGPDoWMgbmjDs20gbOG7m24sIGtow7RuZyDEkWkgc8OidSB2w6BvIGjDoG5oIHZpIGPhu6dhIHThu6tuZyBraMOhY2ggaMOgbmcgaG/hurdjIHBow6JuIHTDrWNoIGPDoWMgbmjDs20ga2jDoWNoIGjDoG5nIChzZWdtZW50YXRpb24pIGThu7FhIHRyw6puIG5oaeG7gXUgYmnhur9uLg0KDQoqKktodXnhur9uIG5naOG7izoqKg0KLSAqKlbhu4EgR2nhu5tpIHTDrW5oIChHZW5kZXIpIHbDoCBOaMOzbSBz4bqjbiBwaOG6qW0gKFByb2R1Y3RGYW1pbHkpOioqIEtow7RuZyBj4bqnbiB0aGnhur90IHBo4bqjaSBwaMOibiBiaeG7h3QgY2hp4bq/biBsxrDhu6NjIHRp4bq/cCB0aOG7iyBk4buxYSB0csOqbiBnaeG7m2kgdMOtbmggxJHhu5FpIHbhu5tpIGPDoWMgbmjDs20gc+G6o24gcGjhuqltIGNow61uaCBuw6B5LiBDw6FjIGNoaeG6v24gZOG7i2NoIHF14bqjbmcgY8OhbyB2w6Aga2h1eeG6v24gbcOjaSBjaG8gbmjDs20gRm9vZCBjw7MgdGjhu4Mgw6FwIGThu6VuZyBy4buZbmcgcsOjaSBjaG8gY+G6oyBuYW0gdsOgIG7hu68sIHThuq1wIHRydW5nIHbDoG8gY8OhYyB54bq/dSB04buRIGNodW5nIHbhu4EgaMawxqFuZyB24buLLCBkaW5oIGTGsOG7oW5nLCBob+G6t2Mgc+G7sSB0aeG7h24gbOG7o2kuDQoNCi0gKipW4buBIFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoTWFyaXRhbFN0YXR1cykgdsOgIFTDrG5oIHRy4bqhbmcgc+G7nyBo4buvdSBuaMOgIChIb21lb3duZXIpOioqIFBow6F0IHRyaeG7g24gY8OhYyB0aMO0bmcgxJFp4buHcCB0aeG6v3AgdGjhu4sgcmnDqm5nIGJp4buHdCwgbmjhuqVuIG3huqFuaCBjw6FjIGzhu6NpIMOtY2ggcGjDuSBo4bujcCB24bubaSB04burbmcgxJHhu5FpIHTGsOG7o25nIGtow6FjaCBow6BuZyBk4buxYSB0csOqbiB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIHPhu58gaOG7r3UgbmjDoC4gVsOtIGThu6UsIHF14bqjbmcgY8OhbyBjaG8gbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIGPDsyB0aOG7gyB04bqtcCB0cnVuZyB2w6BvIHPhu7Eg4buVbiDEkeG7i25oIHbDoCBhbiB0b8OgbiwgdHJvbmcga2hpIHF14bqjbmcgY8OhbyBjaG8gbmfGsOG7nWkgxJHhu5ljIHRow6JuIGPDsyB0aOG7gyBuaOG6pW4gbeG6oW5oIHPhu7EgdOG7sSBkbyB2w6AgdGnhu4duIGzhu6NpLg0KDQotICoqVuG7gSBUaHUgbmjhuq1wIGjDoG5nIG7Eg20gKEFubnVhbEluY29tZSkgdsOgIERhbmggbeG7pWMgc+G6o24gcGjhuqltIChQcm9kdWN0Q2F0ZWdvcnk6KiogIE3hurdjIGTDuSBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgdOG7lW5nIHRo4buDLCBkb2FuaCBuZ2hp4buHcCB24bqrbiBjw7MgdGjhu4MgdGjhu60gbmdoaeG7h20gY8OhYyBjaGnhur9uIGzGsOG7o2MgZ2nDoSB2w6Agc+G6o24gcGjhuqltIGtow6FjIG5oYXUgbmjhuq9tIHbDoG8gdOG7q25nIHBow6JuIGtow7pjIHRodSBuaOG6rXAgZOG7sWEgdHLDqm4gaGnhu4N1IGJp4bq/dCBjaHVuZyB24buBIGjDoG5oIHZpIHRpw6p1IGTDuW5nLCB2w6Agc2F1IMSRw7MgxJHDoW5oIGdpw6EgaGnhu4d1IHF14bqjLg0KDQotICoqVuG7gSBUw6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCAoSG9tZW93bmVyKSB2w6AgVGh1IG5o4bqtcCBow6BuZyBuxINtIChBbm51YWxJbmNvbWUpOioqIEtow6FjaCBow6BuZyBz4bufIGjhu691IG5ow6AgduG7m2kgdGh1IG5o4bqtcCBjYW86IEPDsyB0aOG7gyBsw6AgxJHhu5FpIHTGsOG7o25nIHRp4buBbSBuxINuZyBjaG8gY8OhYyBz4bqjbiBwaOG6qW0vZOG7i2NoIHbhu6UgZ2nDoSB0cuG7iyBjYW8sIMSR4bqndSB0xrAgZMOgaSBo4bqhbiwgaG/hurdjIGPDoWMgZ8OzaSB0w6BpIGNow61uaCBwaOG7qWMgdOG6oXAgaMahbi4NCktow6FjaCBow6BuZyBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHbhu5tpIHRodSBuaOG6rXAgdGjhuqVwOiBDw7MgdGjhu4MgcXVhbiB0w6JtIMSR4bq/biBjw6FjIHPhuqNuIHBo4bqpbSB0aGnhur90IHnhur91LCBraHV54bq/biBtw6NpLCBob+G6t2MgY8OhYyBnaeG6o2kgcGjDoXAgdMOgaSBjaMOtbmggaOG7lyB0cuG7oyBjaGkgdGnDqnUgaMOgbmcgbmfDoHkuDQoNCioqQ8OidSBo4buPaSBt4bufL0jGsOG7m25nIG5naGnDqm4gY+G7qXUgdGnhur9wIHRoZW86KioNCg0KLSAqKlTDrG0gaGnhu4N1IGzDvSBkbyDEkeG6sW5nIHNhdSBz4buxIMawdSB0acOqbiBuaMOzbSBz4bqjbiBwaOG6qW0gRm9vZCoqOiBN4bq3YyBkw7kgY+G6oyBuYW0gdsOgIG7hu68gxJHhu4F1IMawYSBjaHXhu5luZyBuaMOzbSBGb29kLCBj4bqnbiBuZ2hpw6puIGPhu6l1IMSR4buLbmggdMOtbmggaG/hurdjIMSR4buLbmggbMaw4bujbmcgc8OidSBoxqFuIMSR4buDIGhp4buDdSByw7UgdOG6oWkgc2FvIG5ow7NtIG7DoHkgbOG6oWkgxJHGsOG7o2MgxrBhIGNodeG7mW5nIMSR4bq/biB24bqteS4gQ8OzIHBo4bqjaSB2w6wgdMOtbmggdGhp4bq/dCB54bq/dSwgc+G7sSDEkWEgZOG6oW5nLCBoYXkgY8OhYyB54bq/dSB04buRIHbEg24gaMOzYT8gVmnhu4djIG7DoHkgY8OzIHRo4buDIGdpw7pwIHBow6F0IHRyaeG7g24gc+G6o24gcGjhuqltIGhv4bq3YyBjaGnhur9uIGzGsOG7o2MgdGnhur9wIHRo4buLIGhp4buHdSBxdeG6oyBoxqFuIGNobyBuaMOzbSBGb29kLg0KDQotICoqUGjDom4gdMOtY2ggdGjhu51pIGdpYW4qKjogUGjDom4gdMOtY2ggeHUgaMaw4bubbmcgYsOhbiBow6BuZywgZG9hbmggdGh1LCB2w6AgaMOgbmggdmkga2jDoWNoIGjDoG5nIHRoZW8gdGjhu51pIGdpYW4gKFB1cmNoYXNlRGF0ZSkuIEPDsyBtw7lhIHbhu6UgbsOgbyBu4buVaSBi4bqtdD8gWHUgaMaw4bubbmcgbXVhIHPhuq9tIHRoYXkgxJHhu5VpIG5oxrAgdGjhur8gbsOgbyBxdWEgY8OhYyBuxINtPw0KDQotICoqROG7sSDEkW/DoW4qKjogWMOieSBk4buxbmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuIGjDoG5oIHZpIG11YSBz4bqvbSB0cm9uZyB0xrDGoW5nIGxhaSwgZG9hbmggdGh1LCBob+G6t2Mga2jhuqMgbsSDbmcga2jDoWNoIGjDoG5nIHRodeG7mWMgbeG7mXQgbmjDs20gbmjhuqV0IMSR4buLbmggZOG7sWEgdHLDqm4gY8OhYyBiaeG6v24gY8OzIHPhurVuLg0KDQotICoqUGjDom4gdMOtY2ggZ2nhu48gaMOgbmcgKE1hcmtldCBCYXNrZXQgQW5hbHlzaXMpKio6IFjDoWMgxJHhu4tuaCBjw6FjIG5ow7NtIHPhuqNuIHBo4bqpbSB0aMaw4budbmcgxJHGsOG7o2MgbXVhIGPDuW5nIG5oYXUgxJHhu4MgdOG7kWkgxrB1IGjDs2EgY8OhY2ggYuG7kSB0csOtIHPhuqNuIHBo4bqpbSB0cm9uZyBj4butYSBow6BuZyBob+G6t2MgxJHhu4EgeHXhuqV0IHPhuqNuIHBo4bqpbS4NCg0KLSAqKktp4buDbSB0cmEgY2jhuqV0IGzGsOG7o25nIGThu68gbGnhu4d1IG7Dom5nIGNhbyoqOiBN4bq3YyBkw7kga2jDtG5nIGPDsyBOQSwgY+G6p24ga2nhu4NtIHRyYSB0aMOqbSBjw6FjIHbhuqVuIMSR4buBIGtow6FjIG5oxrAgZ2nDoSB0cuG7iyBraMO0bmcgaOG7o3AgbMO9IGhv4bq3YyBzYWkgc8OzdCB0cm9uZyBk4buvIGxp4buHdSDEkeG7gyDEkeG6o20gYuG6o28gxJHhu5kgdGluIGPhuq15IGNhbyBuaOG6pXQgY2hvIGPDoWMgcGjDom4gdMOtY2ggcGjhu6ljIHThuqFwIGjGoW4uDQoNCiMjICoqUEjhuqZOIDY6IFJFTEFUSVZFIFJJU0sgKioNCg0KIyMjICoqNi4xLiBHaeG7m2kgdGhp4buHdSoqDQoNClRyb25nIHBow6JuIHTDrWNoIHRo4buRbmcga8OqIMSR4buLbmggbMaw4bujbmcsIGLhuqNuZyBuZ+G6q3Ugbmhpw6puIChjb250aW5nZW5jeSB0YWJsZSkgbMOgIG3hu5l0IGPDtG5nIGPhu6UgY8ahIGLhuqNuIMSR4buDIGto4bqjbyBzw6F0IG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGhhaSBiaeG6v24gcGjDom4gbG/huqFpLiBUcm9uZyB0csaw4budbmcgaOG7o3AgxJHGoW4gZ2nhuqNuIG5o4bqldCwgYuG6o25nIG5n4bqrdSBuaGnDqm4gMngyIGJp4buDdSBkaeG7hW4gc+G7sSBwaMOibiBi4buRIGPhu6dhIGhhaSBiaeG6v24gbmjhu4sgcGjDom4sIGdpw7pwIHjDoWMgxJHhu4tuaCB2w6AgxJFvIGzGsOG7nW5nIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGNow7puZy4gQ8OhYyBjaOG7iSBz4buRIG5oxrAgaGnhu4d1IHThu7cgbOG7hyAocmlzayBkaWZmZXJlbmNlKSwgdOG7tyBz4buRIG5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpIHbDoCB04bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgdmnhu4djIGzGsOG7o25nIGjDs2EgbeG7kWkgcXVhbiBo4buHIMSRw7MuIELDoGkgdmnhur90IG7DoHkgc+G6vSB0csOsbmggYsOgeSBjaGkgdGnhur90IGPhuqV1IHRyw7pjIHjDoWMgc3XhuqV0IHNpbmggcmEgYuG6o25nIG5n4bqrdSBuaGnDqm4sIHBoxrDGoW5nIHBow6FwIHNvIHPDoW5oIGhhaSB04bu3IGzhu4csIGPDoWNoIHjDonkgZOG7sW5nIGtob+G6o25nIHRpbiBj4bqteSBjaG8gT2RkcyBSYXRpbywgdsOgIGvhur90IHRow7pjIGLhurFuZyBt4buZdCB2w60gZOG7pSB0aOG7sWMgdGnhu4VuIHRyb25nIGzEqW5oIHbhu7FjIGtpbmggZG9hbmguDQoNCiMjIyAqKjYuMi4gQ+G6pXUgdHLDumMgdsOgIHjDoWMgc3XhuqV0IGPhu6dhIGLhuqNuZyBuZ+G6q3Ugbmhpw6puKioNCg0KTeG7mXQgYuG6o25nIG5n4bqrdSBuaGnDqm4gMngyIGzDoCBi4bqjbmcgdOG6p24gc3XhuqV0IMSR4bq/bSBz4buRIHF1YW4gc8OhdCB0aHXhu5ljIHbDoG8gdOG7q25nIHThu5UgaOG7o3AgY+G7p2EgaGFpIGJp4bq/biBuaOG7iyBwaMOibjoNCg0KXFsNClxiZWdpbnthcnJheX17fGN8Y3xjfGN8fQ0KXGhsaW5lDQogJiBcdGV4dHtL4bq/dCBxdeG6oyAoKyl9ICYgXHRleHR7S+G6v3QgcXXhuqMgKOKAkyl9ICYgXHRleHR7VOG7lW5nfSBcXA0KXGhsaW5lDQpcdGV4dHtQaMahaSBuaGnhu4VtIChZZXMpfSAmIGEgJiBiICYgYSArIGIgXFwNClxobGluZQ0KXHRleHR7S2jDtG5nIHBoxqFpIG5oaeG7hW0gKE5vKX0gJiBjICYgZCAmIGMgKyBkIFxcDQpcaGxpbmUNClx0ZXh0e1Thu5VuZyBj4buZbmd9ICYgYSArIGMgJiBiICsgZCAmIG4gPSBhICsgYiArIGMgKyBkIFxcDQpcaGxpbmUNClxlbmR7YXJyYXl9DQpcXQ0KDQrEkOG7gyBoaeG7g3UgxJHGsOG7o2Mgc+G7sSBow6xuaCB0aMOgbmggY+G7p2EgYuG6o25nIG7DoHksIGPhuqduIHjDoWMgxJHhu4tuaCBtw7QgaMOsbmggeMOhYyBzdeG6pXQgc2luaCByYSBk4buvIGxp4buHdSDigJQgdHJvbmcgxJHDsyBwaOG7lSBiaeG6v24gbmjhuqV0IGzDoCBwaMOibiBwaOG7kWkgKipQb2lzc29uKiogdsOgICoqTXVsdGlub21pYWwqKi4NCg0KIyMjIyAqKjYuMi4xLiBQaMOibiBwaOG7kWkgUG9pc3NvbioqDQoNClBow6JuIHBo4buRaSBQb2lzc29uIHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBz4buRIGzGsOG7o25nIHPhu7Ega2nhu4duIHjhuqN5IHJhIHRyb25nIG3hu5l0IGtob+G6o25nIHRo4budaSBnaWFuLCBraMO0bmcgZ2lhbiBob+G6t2MgxJHGoW4gduG7iyBj4bulIHRo4buDLiBHaeG6oyBz4butIGPDoWMgc+G7sSBraeG7h24geOG6o3kgcmEgxJHhu5ljIGzhuq1wIHbDoCB24bubaSBt4buZdCB04bu3IGzhu4cgdHJ1bmcgYsOsbmgga2jDtG5nIMSR4buVaSwgbeG7l2kgw7QgdHJvbmcgYuG6o25nIGPDsyB0aOG7gyB4ZW0gbMOgIGJp4bq/biBuZ+G6q3Ugbmhpw6puIFBvaXNzb246DQoNClxbDQpYX3tpan0gXHNpbSBcdGV4dHtQb2lzc29ufShcbGFtYmRhX3tpan0pDQpcXQ0KDQoqKsavdSDEkWnhu4NtOioqDQoNCi0gUGjDuSBo4bujcCBraGkgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IGtow7RuZyBj4buRIMSR4buLbmguDQoNCi0gw4FwIGThu6VuZyB0cm9uZyBwaMOibiB0w61jaCBz4buRIHPhu7Ega2nhu4duIG5oxrA6IHPhu5EgbMaw4bujdCB0cnV5IGPhuq1wLCBz4buRIMSRxqFuIGjDoG5nIGzhu5dpLCB2LnYuDQoNCioqSOG6oW4gY2jhur86KioNCg0KLSBLaMO0bmcga2nhu4NtIHNvw6F0IMSRxrDhu6NjIHThu5VuZyBz4buRIG3huqt1IChuKS4NCg0KIyMjIyAqKjYuMi4yLiBQaMOibiBwaOG7kWkgTXVsdGlub21pYWwqKg0KDQpUcm9uZyB0csaw4budbmcgaOG7o3AgdOG7lW5nIHPhu5EgcXVhbiBzw6F0IFwoIG4gXCkgbMOgIGPhu5EgxJHhu4tuaCwgdsOgIG3hu5dpIHF1YW4gc8OhdCByxqFpIHbDoG8gbeG7mXQgdHJvbmcgYuG7kW4gw7QgduG7m2kgeMOhYyBzdeG6pXQgXCggcF8xLCBwXzIsIHBfMywgcF80IFwpLCB0aMOsIGLhuqNuZyBuZ+G6q3Ugbmhpw6puIDJ4MiBjw7MgdGjhu4MgxJHGsOG7o2MgbcO0IGjDrG5oIGjDs2EgdGhlbyBwaMOibiBwaOG7kWkgxJFhIHRo4bupYyBNdWx0aW5vbWlhbCBuaMawIHNhdToNCg0KXFsNCihhLCBiLCBjLCBkKSBcc2ltIFx0ZXh0e011bHRpbm9taWFsfShuOyBwXzEsIHBfMiwgcF8zLCBwXzQpDQpcXQ0KDQpQaMOibiBwaOG7kWkgbsOgeSB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgY8OhYyB0w6xuaCBodeG7kW5nIG3DoCBk4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sga2jhuqNvIHPDoXQgaG/hurdjIG5naGnDqm4gY+G7qXUgeMOjIGjhu5lpIGjhu41jIHbhu5tpIGvDrWNoIHRoxrDhu5tjIG3huqt1IGPhu5EgxJHhu4tuaC4gS2hpIMSRw7MsIGPDoWMgeMOhYyBzdeG6pXQgXCggcF8xLCBwXzIsIHBfMywgcF80IFwpIGJp4buDdSBkaeG7hW4geMOhYyBzdeG6pXQgbcOgIG3hu5l0IGPDoSB0aOG7gyByxqFpIHbDoG8gdOG7q25nIMO0IHRyb25nIGLhuqNuZyAyeDIuDQoNCioqxq91IMSRaeG7g20gY+G7p2EgbcO0IGjDrG5oIE11bHRpbm9taWFsOioqDQoNCi0gS2nhu4NtIHNvw6F0IMSRxrDhu6NjIHThu5VuZyBz4buRIG3huqt1Lg0KDQotIFBow7kgaOG7o3AgY2hvIGThu68gbGnhu4d1IGto4bqjbyBzw6F0LCB0aOG7rSBuZ2hp4buHbS4NCg0KKipTbyBzw6FuaCBnaeG7r2EgcGjDom4gcGjhu5FpIFBvaXNzb24gdsOgIE11bHRpbm9taWFsKioNCg0KfCBUacOqdSBjaMOtICAgICAgICAgfCBQb2lzc29uICAgICAgICAgICAgICAgICAgfCBNdWx0aW5vbWlhbCAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBU4buVbmcgc+G7kSBt4bqrdSAgICAgIHwgS2jDtG5nIGPhu5EgxJHhu4tuaCAgICAgICAgICAgICB8IEPhu5EgxJHhu4tuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IOG7qG5nIGThu6VuZyBjaMOtbmggICB8IFPhu5Egc+G7sSBraeG7h24gICAgICAgICAgICAgICAgfCBU4bqnbiBzdeG6pXQga2jhuqNvIHPDoXQgICAgICAgICAgICAgICAgICAgICB8DQp8IEThu68gbGnhu4d1IHBow7kgaOG7o3AgIHwgR2lhbyBk4buLY2gsIGzhu5dpLCB0YWkgbuG6oW4gICB8IFRy4bqjIGzhu51pIGto4bqjbyBzw6F0LCBwaMOibiBuaMOzbSAgICAgICAgICB8DQoNCiMjIyAqKjYuMy4gQ8OhYyBjaOG7iSBz4buRIMSRbyBt4buRaSBsacOqbiBo4buHKioNCg0KIyMjIyAqKjYuMy4xLiAgSGnhu4d1IHThu7cgbOG7hyAoUmlzayBEaWZmZXJlbmNlIC0gUkQpKioNCg0KXFsNClJEID0gXGZyYWN7YX17YSArIGJ9IC0gXGZyYWN7Y317YyArIGR9DQpcXQ0KDQoqKsOdIG5naMSpYSoqOg0KDQotIMSQbyBsxrDhu51uZyAqKmNow6puaCBs4buHY2ggdHV54buHdCDEkeG7kWkqKiBnaeG7r2EgeMOhYyBzdeG6pXQgeOG6o3kgcmEga+G6v3QgcXXhuqMg4bufIG5ow7NtIHBoxqFpIG5oaeG7hW0gdsOgIG5ow7NtIGtow7RuZyBwaMahaSBuaGnhu4VtLg0KDQotIFRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyDEkcOhbmggZ2nDoSAqKnTDoWMgxJHhu5luZyBj4bunYSBjaMOtbmggc8OhY2gqKiwgY2FuIHRoaeG7h3AgaG/hurdjIGNoxrDGoW5nIHRyw6xuaCB0aMOtIMSRaeG7g20sIGtoaSBz4buxIGtow6FjIGJp4buHdCB24buBIHjDoWMgc3XhuqV0IGzDoCBxdWFuIHRy4buNbmcgaMahbiBzbyB24bubaSB04bu3IHPhu5EuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgKENJKSBjaG8gUkQgY8OzIHRo4buDIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBi4bqxbmc6DQoNClxbDQpDSV97UkR9ID0gUkQgXHBtIFpfezEgLSBcYWxwaGEvMn0gXGNkb3QgU0Vfe1JEfQ0KXF0NCg0KVHJvbmcgxJHDszoNCi0gXCggWl97MSAtIFxhbHBoYS8yfSBcKSBsw6AgZ2nDoSB0cuG7iyB04bubaSBo4bqhbiAodGjGsOG7nW5nIOKJiCAxLjk2IHbhu5tpIDk1JSBDSSksDQoNCi0gXCggU0Vfe1JEfSA9IFxzcXJ0e1xmcmFje2EoYStiLWEpfXsoYStiKV4zfSArIFxmcmFje2MoYytkLWMpfXsoYytkKV4zfX0gXCkNCg0KIyMjIyAqKjYuMy4yLiAgVOG7tyBz4buRIG5ndXkgY8ahIChSZWxhdGl2ZSBSaXNrIC0gUlIpKioNCg0KXFsNClJSID0gXGZyYWN7YSAvIChhICsgYil9e2MgLyAoYyArIGQpfQ0KXF0NCg0KKirDnSBuZ2jEqWEqKjoNCg0KLSBcKCBSUiA+IDEgXCk6IG5ndXkgY8ahIHjhuqN5IHJhIGvhur90IHF14bqjIGNhbyBoxqFuIOG7nyBuaMOzbSBwaMahaSBuaGnhu4VtLg0KDQotIFwoIFJSIDwgMSBcKTogbmd1eSBjxqEgeOG6o3kgcmEga+G6v3QgcXXhuqMgdGjhuqVwIGjGoW4g4bufIG5ow7NtIHBoxqFpIG5oaeG7hW0uDQoNCi0gXCggUlIgPSAxIFwpOiBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHBoxqFpIG5oaeG7hW0gdsOgIGvhur90IHF14bqjLg0KDQpUYSB0aMaw4budbmcgbOG6pXkgKipsb2cqKiBj4bunYSBSUiDEkeG7gyB0w61uaCBraG/huqNuZyB0aW4gY+G6rXk6DQoNClxbDQpDSV97UlJ9ID0gXGV4cCBcbGVmdFsgXGxuKFJSKSBccG0gWl97MSAtIFxhbHBoYS8yfSBcY2RvdCBTRV97XGxuKFJSKX0gXHJpZ2h0XQ0KXF0NCg0KVHJvbmcgxJHDszoNCg0KXFsNClNFX3tcbG4oUlIpfSA9IFxzcXJ0eyBcZnJhY3sxfXthfSAtIFxmcmFjezF9e2EgKyBifSArIFxmcmFjezF9e2N9IC0gXGZyYWN7MX17YyArIGR9IH0NClxdDQoNCioqVsOtIGThu6UgdHJvbmcga2luaCBkb2FuaCoqOg0KDQotIFThu7cgbOG7hyBraMOhY2ggbXVhIGjDoG5nIGtoaSBjw7Mga2h1eeG6v24gbcOjaTogXCggODAvMTAwID0gMC44IFwpDQoNCi0gS2hpIGtow7RuZyBjw7Mga2h1eeG6v24gbcOjaTogXCggNDAvMTAwID0gMC40IFwpDQoNCi0gXCggUlIgPSAwLjggLyAwLjQgPSAyIFwpDQoNCuKHkiBLaHV54bq/biBtw6NpIGzDoG0gdMSDbmcgZ+G6pXAgKirEkcO0aSoqIGto4bqjIG7Eg25nIGtow6FjaCBtdWEgaMOgbmcuDQoNCkjhuqFuIGNo4bq/Og0KDQrimqDvuI8gS2jDtG5nIHPhu60gZOG7pW5nIMSRxrDhu6NjIHRyb25nIG5naGnDqm4gY+G7qXUgYuG7h25oIGNo4bupbmcgKGNhc2UtY29udHJvbCkgdsOsIHRhIGtow7RuZyBiaeG6v3Qgbmd1eSBjxqEgdHV54buHdCDEkeG7kWkuDQoNCuKaoO+4jyBE4buFIGfDonkgaGnhu4N1IG5o4bqnbSBu4bq/dSBraMO0bmcgxJFpIGvDqG0gbmd1eSBjxqEgdHV54buHdCDEkeG7kWkuIFbDrSBk4bulOiBSUiA9IDIgY8OzIHbhursgY2FvLCBuaMawbmcgbuG6v3Ugbmd1eSBjxqEgYmFuIMSR4bqndSBsw6AgMSUsIHRow6wgdMSDbmcgbMOqbiAyJSB24bqrbiBsw6AgcuG6pXQgdGjhuqVwLg0KDQrimqDvuI8gS2jDtG5nIMSR4buRaSB44bupbmc6IE7hur91IMSR4buVaSBuaMOzbSB0aGFtIGNoaeG6v3UgdGjDrCBnacOhIHRy4buLIFJSIHRoYXkgxJHhu5VpLCBraMOhYyB24bubaSBPUi4NCg0KIyMjIyAqKjYuMy4zLiAgVOG7tyBz4buRIGNow6puaCAoT2RkcyBSYXRpbyAtIE9SKSoqDQoNCiMjIyMjICoqNi4zLjMuMS4gT2RkcyoqDQoNCi0gKipPZGRzICh04bu3IHPhu5EgY8ahIGjhu5lpKSoqOiAgDQogIFxbDQogIFx0ZXh0e09kZHN9ID0gXGZyYWN7cH17MSAtIHB9DQogIFxdDQogIFRyb25nIMSRw7MsIFwocFwpIGzDoCB4w6FjIHN14bqldCB44bqjeSByYSBj4bunYSBt4buZdCBiaeG6v24gbmjhu4sgcGjDom4gKG5oxrAgdmnhu4djIHPhu58gaOG7r3UgbmjDoCkuDQogIA0KIyMjIyMgKio2LjMuMy4xLiBPZGRzIFJhdGlvIC0gT1IqKg0KDQpcWw0KT1IgPSBcZnJhY3thIC8gYn17YyAvIGR9ID0gXGZyYWN7YWR9e2JjfQ0KXF0NCg0KSGF5ICANCg0KXFsNCiAgXHRleHR7T1J9ID0gXGZyYWN7XHRleHR7T2RkcyDhu58gbmjDs20gMX19e1x0ZXh0e09kZHMg4bufIG5ow7NtIDJ9fQ0KXF0NCiAgT1IgdGjGsOG7nW5nIGTDuW5nIMSR4buDIMSRbyBsxrDhu51uZyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBt4buZdCB54bq/dSB04buRIHbDoCBt4buZdCBr4bq/dCBxdeG6oyB0cm9uZyBi4bqjbmcgMngyLg0KICANCi0gKipPUiA9IDEqKjogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIG9kZHMgZ2nhu69hIGhhaSBuaMOzbS4gIA0KDQotICoqT1IgPiAxKio6IE5ow7NtIDEgY8OzIG9kZHMgeOG6o3kgcmEga+G6v3QgcXXhuqMgY2FvIGjGoW4gbmjDs20gMi4gIA0KDQotICoqT1IgPCAxKio6IE5ow7NtIDEgY8OzIG9kZHMgeOG6o3kgcmEga+G6v3QgcXXhuqMgdGjhuqVwIGjGoW4gbmjDs20gMi4NCg0KPiBWw60gZOG7pTogT1IgPSAyIG5naMSpYSBsw6AgKipvZGRzIHjhuqN5IHJhIGvhur90IHF14bqjIOG7nyBuaMOzbSAxIGNhbyBn4bqlcCAyIGzhuqduIG5ow7NtIDIqKi4NCg0KLSAqKkzGsHUgw70qKjogT1Iga2jDoWMgduG7m2kgUlIsIMSR4bq3YyBiaeG7h3Qga2hpIGJp4bq/biBwaOG7pSB0aHXhu5ljIGtow7RuZyBoaeG6v20gZ+G6t3AuIEtoaSBr4bq/dCBxdeG6oyBsw6AgaGnhur9tIChwIG5o4buPKSwgdGjDrCBPUiDiiYggUlIuDQoNCioqw50gbmdoxKlhKio6DQoNCi0gT1IgY2hvIGJp4bq/dCB04bu3IGzhu4cgKipvZGRzKiogKHThu6ljIGzDoCAieMOhYyBzdeG6pXQgY2hpYSBjaG8gMSB0cuG7qyB4w6FjIHN14bqldCIpIGdp4buvYSBoYWkgbmjDs20uDQoNCi0gVGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIHBo4buVIGJp4bq/biB0cm9uZyBtw7QgaMOsbmggKipsb2dpc3RpYyByZWdyZXNzaW9uKiouDQoNCi0gVHJvbmcgY8OhYyBuZ2hpw6puIGPhu6l1IGLhu4duaCBoaeG6v20gKHJhcmUgZGlzZWFzZSBhc3N1bXB0aW9uKSwgT1IgeOG6pXAgeOG7iSB24bubaSBSUi4NCg0KKirGr3UgxJFp4buDbSBj4bunYSBPZGRzIFJhdGlvKio6DQoNCi0gROG7hSB0w61uaCB2w6AgZOG7hSBkaeG7hW4gZ2nhuqNpLg0KDQotIOG7lG4gxJHhu4tuaCB24buBIG3hurd0IHRvw6FuIGjhu41jIGtoaSBz4butIGThu6VuZyB0cm9uZyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkuDQoNCi0gS2jDtG5nIHBo4bulIHRodeG7mWMgdsOgbyB04bu3IGzhu4cgaGnhu4duIGRp4buHbiB0cm9uZyBt4bqrdSAoxJHhurdjIGJp4buHdCB0cm9uZyBjw6FjIHRoaeG6v3Qga+G6vyAqKmLhu4duaCDigJMgY2jhu6luZyoqOiAqY2FzZS1jb250cm9sIHN0dWR5KikuDQoNCiMjIyAqKjYuNC4gS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHRpbiBj4bqteSBjaG8gT0REUyBSQVRJTyoqDQoNCsSQ4buDIHjDoWMgxJHhu4tuaCB4ZW0gT1IgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nLCBj4bqnbiB4w6J5IGThu7FuZyBraG/huqNuZyB0aW4gY+G6rXkuDQoNCioqTG9nYXJpdGhtIHThu7Egbmhpw6puIGPhu6dhIE9kZHMgUmF0aW86KioNCg0KXFsNClxsb2coT1IpID0gXGxvZ1xsZWZ0KCBcZnJhY3thIFxjZG90IGR9e2IgXGNkb3QgY30gXHJpZ2h0KQ0KXF0NCg0KKipTYWkgc+G7kSBjaHXhuqluIChTdGFuZGFyZCBFcnJvcik6KioNCg0KXFsNClNFID0gXHNxcnR7IFxmcmFjezF9e2F9ICsgXGZyYWN7MX17Yn0gKyBcZnJhY3sxfXtjfSArIFxmcmFjezF9e2R9IH0NClxdDQoNCioqS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gXChcbG9nKE9SKVwpOioqDQoNClxbDQpcbG9nKE9SKSBccG0gMS45NiBcY2RvdCBTRQ0KXF0NCg0KKipM4bqleSBtxakgxJHhu4MgY8OzIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIE9SOioqDQoNClxbDQpDSV97OTVcJX0gPSBcbGVmdFsgZV57XGxvZyhPUikgLSAxLjk2IFxjZG90IFNFfSxccXVhZCBlXntcbG9nKE9SKSArIDEuOTYgXGNkb3QgU0V9IFxyaWdodF0NClxdDQoNCi0gTuG6v3Uga2hv4bqjbmcgdGluIGPhuq15ICoqa2jDtG5nIGNo4bupYSAxKiosIHRhIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nICoqbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiog4bufIG3hu6ljIMO9IG5naMSpYSA1JS4NCg0KIyMjICoqNi41LiDhu6huZyBk4bulbmcgdHJvbmcga2luaCBkb2FuaDogSEnhu4ZVIFFV4bqiIEPhu6ZBIEtIVVnhur5OIE3Dg0kqKg0KDQpN4buZdCBjw7RuZyB0eSB0aMawxqFuZyBt4bqhaSDEkWnhu4duIHThu60gdGjhu60gbmdoaeG7h20gY2hp4bq/biBk4buLY2gga2h1eeG6v24gbcOjaSDEkeG7gyBraeG7g20gdHJhIHhlbSBsaeG7h3UgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBow6BuaCB2aSBtdWEgaMOgbmcga2jDtG5nLiBI4buNIGzhuqV5IG3huqt1IDIwMCBraMOhY2ggaMOgbmcgbmfhuqt1IG5oacOqbiB2w6AgdGh1IMSRxrDhu6NjIGLhuqNuZyBzYXU6DQoNCnwgICAgICAgICAgICAgICAgICB8IE11YSBow6BuZyB8IEtow7RuZyBtdWEgfCBU4buVbmcgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tfA0KfCBDw7Mga2h1eeG6v24gbcOjaSAgICB8IDgwICAgICAgIHwgMjAgICAgICAgICB8IDEwMCAgIHwNCnwgS2jDtG5nIGtodXnhur9uIG3Do2kgfCA0MCAgICAgICB8IDYwICAgICAgICAgfCAxMDAgICB8DQoNCi0gVMOtbmggT2RkcyBSYXRpbyAoT1IpOg0KDQpcWw0KT1IgPSBcZnJhY3s4MCBcY2RvdCA2MH17MjAgXGNkb3QgNDB9ID0gXGZyYWN7NDgwMH17ODAwfSA9IDYNClxdDQoNCuKGkiBPZGRzIG11YSBow6BuZyBraGkgY8OzIGtodXnhur9uIG3Do2kgKipjYW8gZ+G6pXAgNiBs4bqnbioqIHNvIHbhu5tpIGtoaSBraMO0bmcgY8OzIGtodXnhur9uIG3Do2kuDQoNCi0gTG9nYXJpdGhtIHThu7Egbmhpw6puIGPhu6dhIE9SOg0KDQpcWw0KXGxvZyhPUikgPSBcbG9nKDYpIFxhcHByb3ggMS43OQ0KXF0NCg0KLSBTYWkgc+G7kSBjaHXhuqluIChTRSk6DQoNClxbDQpTRSA9IFxzcXJ0eyBcZnJhY3sxfXs4MH0gKyBcZnJhY3sxfXsyMH0gKyBcZnJhY3sxfXs0MH0gKyBcZnJhY3sxfXs2MH0gfSBcYXBwcm94IDAuMzUNClxdDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT1I6DQoNClxbDQpDSSA9IFxsZWZ0WyBlXnsxLjc5IC0gMS45NiBcY2RvdCAwLjM1fSxccXVhZCBlXnsxLjc5ICsgMS45NiBcY2RvdCAwLjM1fSBccmlnaHRdIA0KXGFwcHJveCBcbGVmdFsgZV57MS4xMX0sXHF1YWQgZV57Mi40N30gXHJpZ2h0XSANCj0gWzMuMDMsXCAxMS44MV0NClxdDQoNCi0gVsOsIGtob+G6o25nIHRpbiBj4bqteSAqKmtow7RuZyBjaOG7qWEgMSoqLCBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyAqKmtodXnhur9uIG3Do2kgY8OzIOG6o25oIGjGsOG7n25nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKiDEkeG6v24gaMOgbmggdmkgbXVhIGjDoG5nLg0KDQotIFbhu5tpIFwoIE9SID0gNiBcKSB2w6AgXCggQ0kgPSAoMy4wMyxcIDExLjgxKSBcKSwgZG9hbmggbmdoaeG7h3AgY8OzIHRo4buDIHThu7EgdGluIHRyaeG7g24ga2hhaSAqKmNoaeG6v24gbMaw4bujYyBraHV54bq/biBtw6NpIHF1eSBtw7QgbOG7m24gaMahbioqLg0KDQojIyMgKio2LjYgR0VOREVSIFbDgCBNQVJJVEFMU1RBVFVTKioNCg0KIyMjIyAqKjYuNi4xIFThuqFvIGLhuqNuZyBjaMOpbyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gZ2nhu69hIEdlbmRlciB2w6AgTWFyaXRhbFN0YXR1cw0KdGFibGVfZ2VuZGVyX21hcml0YWwgPC0gdGFibGUobnB0JEdlbmRlciwgbnB0JE1hcml0YWxTdGF0dXMpDQphZGRtYXJnaW5zKHRhYmxlX2dlbmRlcl9tYXJpdGFsKSAgIyBUaMOqbSBow6BuZyB2w6AgY+G7mXQgdOG7lW5nDQpgYGANCg0KIyMjIyAqKjYuNi4yIFTDrW5oIHRvw6FuIFJlbGF0aXZlIFJpc2sqKg0KDQpgYGB7cn0NCiMgVHLDrWNoIHh14bqldCBz4buRIGxp4buHdSB04burIGLhuqNuZyBjaMOpbw0KQSA8LSB0YWJsZV9nZW5kZXJfbWFyaXRhbFsiRiIsIlMiXSAjIG7hu68gxJHhu5ljIHRow6JuDQpCIDwtIHRhYmxlX2dlbmRlcl9tYXJpdGFsWyJGIiwiTSJdICMgbuG7ryBr4bq/dCBow7RuDQpDIDwtIHRhYmxlX2dlbmRlcl9tYXJpdGFsWyJNIiwiUyJdICMgbmFtIMSR4buZYyB0aMOibg0KRCA8LSB0YWJsZV9nZW5kZXJfbWFyaXRhbFsiTSIsIk0iXSAjIG5hbSBr4bq/dCBow7RuDQoNCiMgVMOtbmggUlINClJSIDwtIChBLyhBK0IpKS8oQy8oQytEKSkNClJSDQojIFRyb25nIMSRw7M6IEEvKEErQikgbMOgIHThu7cgbOG7hyBwaOG7pSBu4buvIMSR4buZYyB0aMOibiB0cm9uZyB04buVbmcgc+G7kSBu4buvDQojIFbDoDogQy8oQytEKSBsw6AgdOG7tyBs4buHIG5hbSBnaeG7m2kgxJHhu5ljIHRow6JuIHRyb25nIHThu5VuZyBz4buRIG5hbQ0KYGBgDQoNCiMjIyMgKio2LjYuMyDDnSBuZ2jEqWEqKg0KDQotIFJSID0gMTogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyDEkeG7mWMgdGjDom4gZ2nhu69hIGhhaSBnaeG7m2kgdMOtbmguDQotIFJSID4gMTogTmFtIGdp4bubaSBjw7MgdOG7tyBs4buHIMSR4buZYyB0aMOibiBjYW8gaMahbiBwaOG7pSBu4buvLg0KLSBSUiA8IDE6IFBo4bulIG7hu68gY8OzIHThu7cgbOG7hyDEkeG7mWMgdGjDom4gY2FvIGjGoW4gbmFtIGdp4bubaS4NCg0KIyMjIyAqKjYuNi40IE5o4bqtbiB4w6l0KioNCg0KLSBU4bu3IGzhu4cgcGjhu6UgbuG7ryDEkeG7mWMgdGjDom4gYuG6sW5nIGtob+G6o25nIDk0LjU3JSB04bu3IGzhu4cgbmFtIGdp4bubaSDEkeG7mWMgdGjDom4uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgbOG7m24gduG7gSB04bu3IGzhu4cgxJHhu5ljIHRow6JuIGdp4buvYSBoYWkgZ2nhu5tpIHTDrW5oIHRyb25nIGThu68gbGnhu4d1LiANCg0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJlcGl0b29scyIsIHJlcG9zID0gImh0dHBzOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKQ0KbGlicmFyeShlcGl0b29scykNCnJpc2tyYXRpbyh0YWJsZV9nZW5kZXJfbWFyaXRhbCwgbWV0aG9kPSJ3YWxkIikNCiMgQ2jhu4kgxJHhu4tuaCBwaMawxqFuZyBwaMOhcCB0w61uaCBraG/huqNuZyB0aW4gY+G6rXkgKGNvbmZpZGVuY2UgaW50ZXJ2YWwpIGNobyBSaXNrIFJhdGlvLg0KIyAid2FsZCIgbMOgIHBoxrDGoW5nIHBow6FwIHPhu60gZOG7pW5nIMaw4bubYyBsxrDhu6NuZyBXYWxkLCBnaeG6oyDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluLCDEkeG7gyB0w61uaCBraG/huqNuZyB0aW4gY+G6rXkuDQpgYGANCioqTmjhuq1uIHjDqXQqKg0KDQotIFJlbGF0aXZlIFJpc2sgKFJSKQ0KDQogIC0gRiAoRmVtYWxlKTogMS4wMDAwMDANCiAgLSBNIChNYWxlKTogMS4wNTc0MTcgKENJOiAxLjAyMzgxMyAtIDEuMDkyMTIzKQ0KICANCi0gTmjhuq1uIHjDqXQgduG7gSBSUjoNCg0KICAtIFJSIGPhu6dhIG5ow7NtIEYgKFBo4bulIG7hu68pIGzDoCAxIHbDrCBuaMOzbSBuw6B5IMSRxrDhu6NjIGzhuqV5IGzDoG0gbmjDs20gdGhhbSBjaGnhur91Lg0KICAtIFJSIGPhu6dhIG5ow7NtIE0gKE5hbSBnaeG7m2kpIGzDoCAxLjA1NzQsIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG5hbSBnaeG7m2kgY8OzIHThu7cgbOG7hyBr4bq/dCBow7RuIChNKSBjYW8gaMahbiBt4buZdCBjaMO6dCBzbyB24bubaSBwaOG7pSBu4buvLCB24bubaSB04bu3IGzhu4cgMS4wNTc0IGzhuqduIHNvIHbhu5tpIG5ow7NtIHBo4bulIG7hu68uIFPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY8OzIHRo4buDIGzDoCBraMO0bmcgbOG7m24sIG5oxrBuZyBuw7MgY2jhu4kgcmEgcuG6sW5nIG5hbSBnaeG7m2kgY8OzIG3hu5l0IGto4bqjIG7Eg25nIGvhur90IGjDtG4gY2FvIGjGoW4gcGjhu6UgbuG7ryB0cm9uZyBt4bqrdSBuZ2hpw6puIGPhu6l1IG7DoHkuDQogIC0gQ29uZmlkZW5jZSBJbnRlcnZhbCAoQ0kpIGPhu6dhIFJSIGNobyBuaMOzbSBNIGzDoCBbMS4wMjM4LCAxLjA5MjFdLCBuZ2jEqWEgbMOgIGtob+G6o25nIHRpbiBj4bqteSBj4bunYSBSUiBraMO0bmcgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGhhaSBuaMOzbSBGIHbDoCBNIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbDoCBraMO0bmcgcGjhuqNpIG5n4bqrdSBuaGnDqm4uDQotIEvhur90IGx14bqtbiB24buBIFJSOg0KDQogIC0gUlIgY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGPDsyB4dSBoxrDhu5tuZyBr4bq/dCBow7RuIGNhbyBoxqFuIHNvIHbhu5tpIHBo4bulIG7hu68sIHbhu5tpIFJSID0gMS4wNTc0Lg0KICAtIENvbmZpZGVuY2UgSW50ZXJ2YWwga2jDtG5nIGJhbyBn4buTbSBnacOhIHRy4buLIDEsIMSRaeG7gXUgbsOgeSBo4buXIHRy4bujIGNobyBnaeG6oyB0aHV54bq/dCBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIHThu7cgbOG7hyBr4bq/dCBow7RuIGPhu6dhIG5hbSB2w6AgbuG7ryBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KICANCi0gcC12YWx1ZSB04burIGPDoWMga2nhu4NtIMSR4buLbmg6DQoNCiAgLSBDaGktc3F1YXJlIHRlc3Q6IHAtdmFsdWUgPSAwLjAwMDcwMzg4MzcNCiAgLSBGaXNoZXIncyBleGFjdCB0ZXN0OiBwLXZhbHVlID0gMC4wMDA3MzczODk1DQogIC0gTWlkcG9pbnQgZXhhY3QgdGVzdDogcC12YWx1ZSA9IDAuMDAwNzA0NTA5Mg0KICANCi0gTmjhuq1uIHjDqXQgduG7gSBwLXZhbHVlOg0KICAtIEPDoWMgcC12YWx1ZSB04burIGPDoWMga2nhu4NtIMSR4buLbmggxJHhu4F1IG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhIHRow7RuZyB0aMaw4budbmcgbMOgIDAuMDUsIG5naMSpYSBsw6AgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBudWxsIGh5cG90aGVzaXMgKGdp4bqjIHRodXnhur90IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIG5hbSB2w6AgbuG7rykuDQogIC0gxJBp4buBdSBuw6B5IGNo4buJIHJhIHLhurFuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdOG7tyBs4buHIGvhur90IGjDtG4g4bufIHBo4bulIG7hu68gdsOgIG5hbSBnaeG7m2kuDQogIA0KLSBUw7NtIHThuq90IHbDoCBuaOG6rW4geMOpdCB04buVbmcgcXXDoXQNCiAgLSBSZWxhdGl2ZSBSaXNrIChSUik6IFThu7cgbOG7hyBr4bq/dCBow7RuIGPhu6dhIG5hbSBnaeG7m2kgbMOgIDEuMDU3NCBs4bqnbiBzbyB24bubaSBwaOG7pSBu4buvLCDEkWnhu4F1IG7DoHkgY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGPDsyBraOG6oyBuxINuZyBr4bq/dCBow7RuIGNhbyBoxqFuIHBo4bulIG7hu68gdHJvbmcgbeG6q3UgbmdoacOqbiBj4bupdSBuw6B5Lg0KICAtIENvbmZpZGVuY2UgSW50ZXJ2YWwgKEMuSS4pOiBLaG/huqNuZyB0aW4gY+G6rXkgWzEuMDIzOCwgMS4wOTIxXSBraMO0bmcgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgxJFp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSB04bu3IGzhu4cga+G6v3QgaMO0biBj4bunYSBuYW0gdsOgIG7hu68gbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQogIC0gcC12YWx1ZTogQ8OhYyBwLXZhbHVlIHThu6sgQ2hpLXNxdWFyZSwgRmlzaGVyJ3MgZXhhY3QgdGVzdCB2w6AgbWlkcC5leGFjdCDEkeG7gXUgbmjhu48gaMahbiAwLjA1LCBjaG8gdGjhuqV5IGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyBnaeG7r2EgdOG7tyBs4buHIGvhur90IGjDtG4gY+G7p2EgbmFtIHbDoCBu4buvLg0KICANCi0gS+G6v3QgbHXhuq1uDQogIC0gVOG7tyBs4buHIGvhur90IGjDtG4gZ2nhu69hIG5hbSB2w6AgbuG7ryBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gQ+G7pSB0aOG7gywgbmFtIGdp4bubaSBjw7MgdOG7tyBs4buHIGvhur90IGjDtG4gY2FvIGjGoW4gcGjhu6UgbuG7ry4NCiAgLSBSZWxhdGl2ZSBSaXNrIGNobyB0aOG6pXkgbmFtIGdp4bubaSBjw7Mga2jhuqMgbsSDbmcga+G6v3QgaMO0biBjYW8gaMahbiBwaOG7pSBu4buvICh24bubaSBSUiA9IDEuMDU3NCksIHbDoCBr4bq/dCBxdeG6oyBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogcsO1IHLDoG5nLCB2w6wgcC12YWx1ZSDEkeG7gXUgcuG6pXQgbmjhu48uDQogIC0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBj4bunYSBSUiBraMO0bmcgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgxJFp4buBdSBuw6B5IGPDoG5nIGPhu6duZyBj4buRIGvhur90IGx14bqtbiB24buBIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSB04bu3IGzhu4cga+G6v3QgaMO0biBj4bunYSBoYWkgZ2nhu5tpLg0KICANCiMjIyAqKjYuNyBHRU5ERVIgVsOAIEhPTUVPV05FUioqDQoNCkPDonUgaOG7j2kgbmdoacOqbiBj4bupdTogTGnhu4d1IGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgZ2nhu69hIG5hbSB2w6AgbuG7ryBraMO0bmc/DQoNCiMjIyMgKio2LjcuMSBU4bqhbyBi4bqjbmcgY2jDqW8qKg0KDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIGNow6lvIGdp4buvYSBHZW5kZXIgdsOgIEhvbWVvd25lcg0KdGFibGVfZ2VuZGVyX2hvbWVvd25lciA8LSB0YWJsZShucHQkR2VuZGVyLCBucHQkSG9tZW93bmVyKQ0KYWRkbWFyZ2lucyh0YWJsZV9nZW5kZXJfaG9tZW93bmVyKSAgIyBUaMOqbSBow6BuZyB2w6AgY+G7mXQgdOG7lW5nDQpgYGANCg0KIyMjIyAqKjYuNy4yIFTDrW5oIHRvw6FuIFJSKioNCmBgYHtyfQ0KIyBUcsOtY2ggeHXhuqV0IHPhu5EgbGnhu4d1IHThu6sgYuG6o25nIGNow6lvDQpBIDwtIHRhYmxlX2dlbmRlcl9ob21lb3duZXJbIkYiLCAiWSJdICAjIG7hu68gc+G7nyBo4buvdSBuaMOgDQpCIDwtIHRhYmxlX2dlbmRlcl9ob21lb3duZXJbIkYiLCAiTiJdICAgIyBu4buvIGtow7RuZyBz4bufIGjhu691IG5ow6ANCkMgPC0gdGFibGVfZ2VuZGVyX2hvbWVvd25lclsiTSIsICJZIl0gICMgbmFtIHPhu58gaOG7r3UgbmjDoA0KRCA8LSB0YWJsZV9nZW5kZXJfaG9tZW93bmVyWyJNIiwgIk4iXSAgICMgbmFtIGtow7RuZyBz4bufIGjhu691IG5ow6ANCg0KIyBUw61uaCBSUg0KUlIgPC0gKEEgLyAoQSArIEIpKSAvIChDIC8gKEMgKyBEKSkNClJSDQoNCiMgVHJvbmcgxJHDszoNCiMgQSAvIChBICsgQik6IFThu7cgbOG7hyBu4buvIHPhu58gaOG7r3UgbmjDoCB0cm9uZyB04buVbmcgc+G7kSBu4buvLg0KIyBDIC8gKEMgKyBEKTogVOG7tyBs4buHIG5hbSBz4bufIGjhu691IG5ow6AgdHJvbmcgdOG7lW5nIHPhu5EgbmFtLg0KDQoNCmBgYA0KDQpgYGB7cn0NCnJpc2tyYXRpbyh0YWJsZV9nZW5kZXJfaG9tZW93bmVyLCBtZXRob2Q9IndhbGQiKQ0KYGBgDQoNCg0KIyMjIyAqKjYuNy4zIE5o4bqtbiB4w6l0ICoqDQoNCi0gTmjDs20gbuG7ryAoRikgxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91LCBuw6puIFJSID0gMS4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgY2jDum5nIHRhIHNvIHPDoW5oIG5ndXkgY8ahIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuaMOzbSBuYW0gKE0pIHbhu5tpIG5ow7NtIG7hu68uDQoNCi0gTmjDs20gbmFtIChNKSBjw7MgUlIgPSAwLjk4MjMgbmdoxKlhIGzDoDoNCg0KICAtIFThu7cgbOG7hyBz4bufIGjhu691IG5ow6Ag4bufIG5hbSBi4bqxbmcga2hv4bqjbmcgOTguMjMlIHNvIHbhu5tpIG7hu68uDQpIYXkgbsOzaSBjw6FjaCBraMOhYywgbmd1eSBjxqEgKHjDoWMgc3XhuqV0KSBz4bufIGjhu691IG5ow6AgY+G7p2EgbmFtIHRo4bqlcCBoxqFuIG7hu68ga2hv4bqjbmcgMS43NyUuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBj4bunYSBSUiBsw6AgKDAuOTU2MiDigJMgMS4wMDkyKToNCg0KICAtIEtob+G6o25nIG7DoHkgYmFvIGfhu5NtIHPhu5EgMSwgbmdoxKlhIGzDoCBnacOhIHRy4buLIFJSIHRo4buxYyBz4buxIGPDsyB0aOG7gyBsw6AgMSAoa2jDtG5nIGPDsyBraMOhYyBiaeG7h3QpLg0KDQogIC0gS2hv4bqjbmcgdGluIGPhuq15IGNobyB0YSBiaeG6v3QgbeG7qWMgxJHhu5kgY2jDrW5oIHjDoWMgY+G7p2EgxrDhu5tjIGzGsOG7o25nIFJSOyBraG/huqNuZyBy4buZbmcgdsOgIGJhbyBn4buTbSAxIGNobyB0aOG6pXkgc+G7sSBraMO0bmcgY2jhuq9jIGNo4bqvbiB2w6AgdGhp4bq/dSBi4bqxbmcgY2jhu6luZyB24buBIHPhu7Ega2jDoWMgYmnhu4d0IHRo4buxYyBz4buxLg0KDQotIFRhIGPDsyBnaeG6oyB0aHV54bq/dDoNCg0KICAtIEjigoA6IFThu7cgbOG7hyBz4bufIGjhu691IG5ow6Ag4bufIE5hbSB2w6AgTuG7ryBraMO0bmcga2jDoWMgbmhhdSwgdOG7qWMgbMOgIFJSID0gMQ0KDQogIC0gSOKCgTogVOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCDhu58gTmFtIHbDoCBO4buvIGtow6FjIG5oYXUsIFJSIOKJoCAxDQoNCi0gcC12YWx1ZSB04burIGPDoWMga2nhu4NtIMSR4buLbmg6DQoNCiAgLSBDaGktc3F1YXJlIHRlc3Q6IHAtdmFsdWUgPSAwLjE5NTA4ODQNCiAgLSBGaXNoZXIncyBleGFjdCB0ZXN0OiBwLXZhbHVlID0gMC4xOTY0ODMzDQogIC0gTWlkcG9pbnQgZXhhY3QgdGVzdDogcC12YWx1ZSA9IDAuMTk1MTU4DQogIA0KLSBOaOG6rW4geMOpdCB24buBIHAtdmFsdWU6DQoNCiAgLSBDw6FjIGdpw6EgdHLhu4sgcC12YWx1ZSB04burIGNoaS1zcXVhcmUsIEZpc2hlcidzIGV4YWN0LCB2w6AgbWlkcC5leGFjdCDEkeG7gXUgbOG7m24gaMahbiBt4bupYyDDvSBuZ2jEqWEgdGjDtG5nIHRoxrDhu51uZyBsw6AgMC4wNS4NCiAgLSDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6Aga2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgbnVsbCBoeXBvdGhlc2lzLCB04bupYyBsw6Aga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIHThu4kgbOG7hyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIChZKSBnaeG7r2EgbmjDs20gbmFtIHbDoCBu4buvLiBT4buxIGtow6FjIGJp4buHdCBnaeG7r2EgaGFpIG5ow7NtIGPDsyB0aOG7gyBsw6AgZG8gbmfhuqt1IG5oacOqbi4NCg0KKipOaOG6rW4geMOpdCB04buVbmcgcXXDoXQqKg0KDQotIFJlbGF0aXZlIFJpc2sgY2hvIHRo4bqleSBy4bqxbmcgdOG7tyBs4buHIHPhu7Ega2nhu4duIGdp4buvYSBoYWkgbmjDs20gZ2nhu5tpIHTDrW5oIEYgKHBo4bulIG7hu68pIHbDoCBNIChuYW0gZ2nhu5tpKSBy4bqldCBn4bqnbiBuaGF1LCB24bubaSBSUiBj4bunYSBuaMOzbSBNIGzDoCAwLjk4MjMsIGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgZ2nhu69hIHThu7cgbOG7hyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIChZKSBnaeG7r2EgaGFpIG5ow7NtLg0KDQotIENvbmZpZGVuY2UgSW50ZXJ2YWwgY2hvIG5ow7NtIG5hbSBnaeG7m2kgKE0pIGJhbyBn4buTbSBnacOhIHRy4buLIDEsIMSRaeG7gXUgbsOgeSBo4buXIHRy4bujIGdp4bqjIHRodXnhur90IHLhurFuZyBraMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHRo4buRbmcga8OqIMSRw6FuZyBr4buDIGdp4buvYSB04bu3IGzhu4cgc+G7sSBraeG7h24g4bufIG5hbSB2w6AgbuG7ry4NCg0KLSBDw6FjIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChDaGktc3F1YXJlLCBGaXNoZXIncyBleGFjdCB0ZXN0KSDEkeG7gXUgY2hvIHAtdmFsdWUgbOG7m24gaMahbiAwLjA1LCDEkWnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6Aga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDDvSBuZ2jEqWEgZ2nhu69hIGhhaSBuaMOzbSBnaeG7m2kgdMOtbmggduG7gSB04bu3IGzhu4cgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIGPDsyAoWSkuDQoNCi0gVMOzbSBs4bqhaSwgY8OhYyBr4bq/dCBxdeG6oyBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgdsOgIGPDsyDDvSBuZ2jEqWEgZ2nhu69hIHThu7cgbOG7hyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIChZKSDhu58gcGjhu6UgbuG7ryB2w6AgbmFtIGdp4bubaS4NCg0KKipL4bq/dCBsdeG6rW4qKg0KDQpE4buxYSB0csOqbiBjw6FjIGvhur90IHF14bqjIHThu6sgUmVsYXRpdmUgUmlzayB2w6AgY8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiwgY2jDum5nIHRhIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgZ2nhu69hIG5hbSB2w6AgbuG7ryB24buBIHThu7cgbOG7hyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIChZKS4gROG7ryBsaeG7h3UgY2hvIHRo4bqleSBy4bqxbmcgdOG7tyBs4buHIGjDtG4gbmjDom4gY8OzIChZKSDhu58gbmFtIHbDoCBu4buvIGzDoCBraMOhIHTGsMahbmcgxJHhu5NuZyB2w6Aga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB0aOG7kW5nIGvDqiDEkcOhbmcga+G7gy4NCg0KIyMjICoqNi44IE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lcioqDQoNCmBgYHtyfQ0KdGFibGVfbWFyaV9ob21lIDwtIHRhYmxlKG5wdCRNYXJpdGFsU3RhdHVzLCBucHQkSG9tZW93bmVyKQ0KYWRkbWFyZ2lucyh0YWJsZV9tYXJpX2hvbWUpDQpgYGANCg0KYGBge3J9DQpyaXNrcmF0aW8odGFibGVfbWFyaV9ob21lKQ0KYGBgDQoNCk5ow7NtIMSRw6Mga+G6v3QgaMO0biAoTSkgxJHGsOG7o2MgZMO5bmcgbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgUlIgPSAxLg0KDQpOaMOzbSDEkeG7mWMgdGjDom4gKFMpIGPDszoNCg0KLSBSUiA9IDAuNjExNCAoa2hv4bqjbmcgdGluIGPhuq15IDk1JTogMC41OTQyIOKAkyAwLjYyOTIpLlbDrCBraG/huqNuZyBuw6B5IGtow7RuZyBjaOG7qWEgMSwgbsOqbiBr4bq/dCBxdeG6oyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiANCg0KLSDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgbmfGsOG7nWkgxJHhu5ljIHRow6JuIGPDsyBuZ3V5IGPGoSBz4bufIGjhu691IG5ow6AgdGjhuqVwIGjGoW4ga2hv4bqjbmcgMzguODYlIHNvIHbhu5tpIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0bi4NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGtow6EgaOG6uXAgdsOgIGtow7RuZyBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbMOgIHLDtSByw6BuZyB2w6AgxJHDoW5nIHRpbiBj4bqteS4NCg0KVGEgdGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCBuaMawIHNhdToNCg0KLSAqKkjigoA6KiogVOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gdsOgIMSR4buZYyB0aMOibiBsw6AgbmjGsCBuaGF1IChSUiA9IDEpLg0KDQotICoqSOKCgToqKiBU4bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGPhu6dhIGhhaSBuaMOzbSBsw6Aga2jDoWMgbmhhdSAoUlIg4omgIDEpLg0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaOG7iSByYSBSUiA9IDAuNjExNCB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlICgwLjU5NDIg4oCTIDAuNjI5MiksIHbDoCBjw6FjIGtp4buDbSDEkeG7i25oIGNobyBwLXZhbHVlIOKJiCAwIDwgbeG7qWMgw70gbmdoxKlhIDAuMDUuIERvIMSRw7MsIHRhIGLDoWMgYuG7jyBI4oKAIHbDoCBr4bq/dCBsdeG6rW4gcuG6sW5nIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7MgbeG7kWkgbGnDqm4gaOG7hyB0aOG7kW5nIGvDqiByw7UgcuG7h3QgduG7m2kga2jhuqMgbsSDbmcgc+G7nyBo4buvdSBuaMOgLiBOZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4uDQoNCiMjICoqUEjhuqZOIDc6IE9ERFMgUkFUSU8qKg0KDQojIyMgKio3LjEgR2VuZGVyIHbDoCBIb21lb3duZXIqKg0KDQpgYGB7cn0NCiMgQ8OgaSB2w6AgZ+G7jWkgZ8OzaQ0KaW5zdGFsbC5wYWNrYWdlcygiZXBpdG9vbHMiKQ0KbGlicmFyeShlcGl0b29scykNCmBgYA0KDQoNCmBgYHtyfQ0KIyBUw61uaCBvZGRzIHJhdGlvDQpvcl9taCA8LSBvZGRzcmF0aW8odGFibGVfbWFyaV9ob21lLCBtZXRob2QgPSAid2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0Kb3JfbWgkbWVhc3VyZQ0KYGBgDQoNCg0KLSBL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBPZGRzIFJhdGlvIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCBuaMawIHNhdToNCg0KICAtIE9kZHMgUmF0aW8gKE9SKSA9IDAuOTU2DQoNCiAgLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiB04burIDAuODk0IMSR4bq/biAxLjAyMw0KDQotIERp4buFbiBnaeG6o2k6DQoNCiAgLSBHacOhIHRy4buLIE9SID0gMC45NTYgY2hvIHRo4bqleSBvZGRzIChjxqEgaOG7mWkpIHPhu58gaOG7r3UgbmjDoCBj4bunYSBu4buvIHRo4bqlcCBoxqFuIG5hbSBraG/huqNuZyA0LjQlLiBUdXkgbmhpw6puLCBz4buxIGtow6FjIGJp4buHdCBsw6Agbmjhu48uDQoNCiAgLSBEbyBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNo4bupYSBnacOhIHRy4buLIDEsIG7Dqm46DQoNCiAgICAtIEtow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBnaeG7m2kgdMOtbmgg4bqjbmggaMaw4bufbmcgxJHhur9uIG9kZHMgc+G7nyBo4buvdSBuaMOgLg0KDQotICoqS+G6v3QgbHXhuq1uOioqIE3hurdjIGTDuSBu4buvIGPDsyB24bq7IGPDsyBvZGRzIHPhu58gaOG7r3UgbmjDoCB0aOG6pXAgaMahbiBuYW0gbeG7mXQgY2jDunQsIG5oxrBuZyBz4buxIGtow6FjIGJp4buHdCBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gRG8gxJHDsywgZ2nhu5tpIHTDrW5oIGtow7RuZyBwaOG6o2kgbMOgIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IMSR4bq/biBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgdHJvbmcgZOG7ryBsaeG7h3UgaGnhu4duIHThuqFpLg0KDQojIyMgKio3LjIgTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyKioNCg0KYGBge3J9DQojIFTDrW5oIE9SIHbDoCBraG/huqNuZyB0aW4gY+G6rXkNCm9yX21oIDwtIG9kZHNyYXRpbyh0YWJsZV9tYXJpX2hvbWUsIG1ldGhvZCA9ICJ3YWxkIiwgY29uZi5sZXZlbCA9IDAuOTUpDQpvcl9taCRtZWFzdXJlDQpgYGANCg0KLSBPZGRzIFJhdGlvIChPUikgPSAwLjI4Mw0KDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSU6IHThu6sgMC4yNjMgxJHhur9uIDAuMzA0DQoNCi0gRGnhu4VuIGdp4bqjaToNCg0KICAtIEdpw6EgdHLhu4sgT2RkcyBSYXRpbyAwLjI4MyBjw7MgbmdoxKlhIGzDoCBvZGRzIHPhu58gaOG7r3UgbmjDoCBj4bunYSBuaMOzbSBuZ8aw4budaSDEkeG7mWMgdGjDom4gY2jhu4kgYuG6sW5nIGtob+G6o25nIDI4LjMlIG9kZHMgY+G7p2EgbmjDs20gbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuLiBOw7NpIGPDoWNoIGtow6FjLCBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCBjYW8gaMahbiBn4bqnbiAzLjUgbOG6p24gc28gduG7m2kgbmfGsOG7nWkgxJHhu5ljIHRow6JuICh2w6wgMS8wLjI4M+KJiDMuNTMpLg0KDQogIC0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gT2RkcyBSYXRpbyBu4bqxbSBob8OgbiB0b8OgbiBkxrDhu5tpIDEsIHThu6sgMC4yNjMgxJHhur9uIDAuMzA0LCDEkWnhu4F1IG7DoHkgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCB24buBIG9kZHMgc+G7nyBo4buvdSBuaMOgIGdp4buvYSBoYWkgbmjDs20gbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdsOgIGtow7RuZyBwaOG6o2kgZG8gbmfhuqt1IG5oacOqbi4NCg0KLSBL4bq/dCBsdeG6rW46DQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIOG6o25oIGjGsOG7n25nIHLDtSByw6BuZyDEkeG6v24ga2jhuqMgbsSDbmcgc+G7nyBo4buvdSBuaMOgLiBOZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIG9kZHMgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5nxrDhu51pIMSR4buZYyB0aMOibiwgdsOgIGtow6FjIGJp4buHdCBuw6B5IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbhu5tpIG3hu6ljIMSR4buZIHRpbiBj4bqteSA5NSUuIMSQw6J5IGzDoCBi4bqxbmcgY2jhu6luZyBjaG8gdGjhuqV5IHZp4buHYyDEkcOjIGvhur90IGjDtG4gY8OzIGxpw6puIHF1YW4gY2jhurd0IGNo4bq9IMSR4bq/biBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbsOgeS4NCg0KIyMjICoqNy4zIEdlbmRlciB2w6AgTWFyaXRhbFN0YXR1cyoqDQoNCmBgYHtyfQ0KIyBUw61uaCBPUiB2w6Aga2hv4bqjbmcgdGluIGPhuq15DQpvcl9nbSA8LSBvZGRzcmF0aW8odGFibGVfZ2VuZGVyX21hcml0YWwsIG1ldGhvZCA9ICJ3YWxkIiwgY29uZi5sZXZlbCA9IDAuOTUpDQpvcl9nbSRtZWFzdXJlDQpgYGANCg0KLSBPZGRzIFJhdGlvIChPUikgPSAxLjEyMQ0KDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSU6IHThu6sgMS4wNDkgxJHhur9uIDEuMTk4DQoNCi0gRGnhu4VuIGdp4bqjaToNCg0KICAtIEdpw6EgdHLhu4sgT2RkcyBSYXRpbyAxLjEyMSBjw7MgbmdoxKlhIGzDoCBvZGRzIChjxqEgaOG7mWkpIMSRw6Mga+G6v3QgaMO0biBj4bunYSBu4buvIGNhbyBoxqFuIG9kZHMgxJHDoyBr4bq/dCBow7RuIGPhu6dhIG5hbSBraG/huqNuZyAxMi4xJSwgaGF5IG7Ds2kgY8OhY2gga2jDoWMsIG7hu68gY8OzIGto4bqjIG7Eg25nIMSRw6Mga+G6v3QgaMO0biBjYW8gaMahbiBuYW0ga2hv4bqjbmcgMS4xMiBs4bqnbi4NCg0KICAtIEtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAxLjA0OSDEkeG6v24gMS4xOTgsIGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAxLCBjaOG7qW5nIHThu48gc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gxJBp4buBdSBuw6B5IG5naMSpYSBsw6AgduG7m2kgbeG7qWMgdGluIGPhuq15IDk1JSwgY2jDum5nIHRhIGNo4bqvYyBjaOG6r24gcuG6sW5nIHThu7cgbOG7hyDEkcOjIGvhur90IGjDtG4gY+G7p2EgbuG7ryB2w6AgbmFtIGtow7RuZyBi4bqxbmcgbmhhdS4NCg0KLSBL4bq/dCBsdeG6rW46DQoNCkThu68gbGnhu4d1IGNobyB0aOG6pXkgbuG7ryBnaeG7m2kgY8OzIG9kZHMgxJHDoyBr4bq/dCBow7RuIGNhbyBoxqFuIG5hbSBnaeG7m2kga2hv4bqjbmcgMTIlLCB0xrDGoW5nIMSRxrDGoW5nIHbhu5tpIHZp4buHYyBu4buvIGPDsyBraOG6oyBuxINuZyDEkcOjIGvhur90IGjDtG4gZ+G6pXAgMS4xMiBs4bqnbiBzbyB24bubaSBuYW0gZ2nhu5tpLg==