1 Chương 1: PHẦN MỞ ĐẦU

1.1 Lý do chọn đề tài.

Trong quá trình phân tích dữ liệu và xây dựng mô hình trong lĩnh vực khoa học dữ liệu, việc đánh giá tương quan và ảnh hưởng giữa các biến là rất quan trọng. Để làm điều này, chúng ta thường cần thực hiện các phân tích thống kê như hồi quy logistic, hồi quy tuyến tính hoặc các phương pháp khác để đo lường mức độ tương quan giữa biến phụ thuộc và các biến độc lập.

Package blorr (Bi-Directional Log Odds Robust Regression) trong ngôn ngữ lập trình R là một công cụ mạnh mẽ giúp thực hiện các phân tích một cách hiệu quả. Lựa chọn đề tài này nhằm khám phá và tìm hiểu sâu về tính năng và cách sử dụng của package.

Package blorr cung cấp các hàm và phương pháp thống kê tiên tiến cho hồi quy logistic và hồi quy tuyến tính, cho phép người dùng đánh giá tương quan và ảnh hưởng giữa các biến một cách linh hoạt và đáng tin cậy. Nó cung cấp các tính năng như ước lượng hệ số hồi quy bằng cách sử dụng phương pháp bootstrap, tính toán độ tin cậy, tìm kiếm mô hình tối ưu, và nhiều hơn nữa.

Bằng cách tìm hiểu về package blorr, chúng ta có thể nắm vững các kỹ thuật và phương pháp để đánh giá và hiểu rõ hơn về mối quan hệ giữa các biến trong một tập dữ liệu. Điều này sẽ giúp chúng ta đưa ra những phân tích chính xác hơn và đưa ra quyết định dựa trên cơ sở thông tin chính xác từ dữ liệu.

Việc nắm vững và áp dụng thành thạo package blorr sẽ giúp chúng ta làm việc hiệu quả với dữ liệu và đưa ra những phân tích thống kê chất lượng trong các lĩnh vực như y học, kinh tế, xã hội học, và nhiều lĩnh vực khác.

1.2 Mục tiêu nghiên cứu đề tài.

Tìm hiểu về lý thuyết và nguyên lý hoạt động của phân tích hồi quy logistic và hồi quy tuyến tính trong ngữ cảnh đánh giá tương quan và ảnh hưởng giữa các biến.

Khám phá và hiểu rõ về package blorr trong ngôn ngữ lập trình R, bao gồm cách cài đặt và tương tác với package.

Tìm hiểu về các tính năng và chức năng của package blorr, bao gồm việc ước lượng hệ số hồi quy, tính toán độ tin cậy, tìm kiếm mô hình tối ưu và các phương pháp khác liên quan đến blorr.

Áp dụng package blorr vào các tập dữ liệu thực tế để thực hiện phân tích tương quan và ảnh hưởng giữa các biến, và đánh giá chất lượng của các kết quả thu được.

So sánh và đánh giá hiệu suất và ưu điểm của package blorr so với các phương pháp và công cụ phân tích tương tự khác có sẵn trong lĩnh vực.

Trình bày kết quả và tài liệu hướng dẫn sử dụng package blorr để chia sẻ kiến thức và kinh nghiệm với cộng đồng người dùng R và các nhà nghiên cứu quan tâm đến phân tích dữ liệu và mô hình hóa.

Mục tiêu nghiên cứu này nhằm đạt được sự hiểu rõ và ứng dụng thành thạo của package blorr trong việc đánh giá tương quan và ảnh hưởng giữa các biến trong dữ liệu. Kết quả từ nghiên cứu sẽ giúp nâng cao khả năng phân tích và đưa ra quyết định dựa trên cơ sở thông tin chính xác từ dữ liệu.

1.3 Đối tượng và phạm vi nghiên cứu.

Đối tượng nghien cứu: Package blorr được phát triển để hỗ trợ trong việc phân tích tương quan và ảnh hưởng giữa các biến trong các mô hình hồi quy logistic và hồi quy tuyến tính. Do đó, đối tượng nghiên cứu của package blorr bao gồm các nhà nghiên cứu, nhà phân tích dữ liệu, và các chuyên gia trong lĩnh vực khoa học dữ liệu, y học, kinh tế, xã hội học và các lĩnh vực liên quan đến phân tích dữ liệu và mô hình hóa.

Phạm vi nghiên cứu:

  • Đánh giá tương quan: Package blorr cung cấp các công cụ và phương pháp để đánh giá mối quan hệ tương quan giữa biến phụ thuộc và các biến độc lập. Các phương pháp này có thể áp dụng trong nhiều lĩnh vực, bao gồm phân tích y tế, tài chính, marketing và khoa học xã hội.

  • Ảnh hưởng giữa các biến: Package blorr cho phép xác định ảnh hưởng của các biến độc lập lên biến phụ thuộc trong mô hình hồi quy. Điều này giúp hiểu rõ hơn về sự ảnh hưởng của các yếu tố độc lập đối với biến phụ thuộc, và có thể áp dụng trong việc đưa ra quyết định và dự báo.

  • Phân tích hồi quy robust: Package blorr cung cấp các phương pháp hồi quy robust, đảm bảo tính chính xác và độ tin cậy của ước lượng trong trường hợp dữ liệu bị nhiễu hoặc không tuân theo các giả định hồi quy thông thường. Điều này giúp nghiên cứu có thể xử lý các vấn đề về dữ liệu không đồng nhất và đạt được kết quả đáng tin cậy.

  • Tìm kiếm mô hình tối ưu: Package blorr cung cấp các phương pháp tìm kiếm mô hình tối ưu, giúp tìm ra mô hình hồi quy tốt nhất dựa trên dữ liệu. Điều này cho phép người dùng thử nghiệm và so sánh các mô hình khác nhau để đưa ra những phân tích chính xác và có hiệu suất cao.

Phạm vi nghiên cứu của package blorr rất hữu ích và có thể được áp dụng trong nhiều lĩnh vực nghiên cứu và ứng dụng thực tế, giúp tăng cường khả năng phân tích dữ liệu và đưa ra quyết định dựa trên thông tin chính xác từ dữ liệu.

1.4 Phương pháp nghiên cứu.

Phương pháp nghiên cứu về package Blorr của chũng tôi như sau:

  • Tìm hiểu về lý thuyết: Đầu tiên, nghiên cứu cần tìm hiểu và nắm vững lý thuyết về phân tích hồi quy logistic, hồi quy tuyến tính, và các khái niệm liên quan đến tương quan và ảnh hưởng giữa các biến. Điều này bao gồm việc đọc các tài liệu, sách và bài báo có liên quan để hiểu rõ cơ bản về các phương pháp và thuật toán được sử dụng trong package blorr.

  • Khám phá package blorr: Tiếp theo, nghiên cứu cần khám phá package blorr và hiểu về cách cài đặt và tương tác với package trong môi trường R. Điều này bao gồm việc đọc tài liệu hướng dẫn, ví dụ và tài liệu tham khảo từ tác giả package blorr.

  • Áp dụng package blorr: Sau khi nắm vững cách sử dụng package blorr, nghiên cứu có thể áp dụng package này vào các tập dữ liệu thực tế. Bằng cách sử dụng các hàm và phương pháp trong package blorr, nghiên cứu có thể thực hiện phân tích tương quan và ảnh hưởng giữa các biến và đánh giá chất lượng của các kết quả thu được.

  • So sánh và đánh giá: Tiếp theo, nghiên cứu có thể so sánh và đánh giá hiệu suất và ưu điểm của package blorr so với các phương pháp và công cụ phân tích tương tự khác có sẵn trong lĩnh vực. Điều này có thể bao gồm so sánh với các phương pháp hồi quy truyền thống, phân tích tương quan khác và các package R khác.

  • Trình bày kết quả: Cuối cùng, nghiên cứu cần trình bày kết quả và tài liệu hướng dẫn sử dụng package blorr để chia sẻ kiến thức và kinh nghiệm với cộng đồng người dùng R và các nhà nghiên cứu quan tâm đến phân tích dữ liệu và mô hình hóa. Các kết quả có thể được trình bày trong bài viết, báo cáo hoặc tài liệu tham khảo khác.

2 Chương 2: LÝ THUYẾT

2.1 Giới thiệu về package Blorr.

2.1.1 Khái niệm.

Blorr là Công cụ để phát triển các mô hình hồi quy logistic nhị phân. Các công cụ được thiết kế để giúp người dùng mới bắt đầu và người dùng trung cấp dễ dàng xây dựng và xác thực các mô hình hồi quy logistic nhị phân. Bao gồm phân tích hai biến, đầu ra hồi quy toàn diện, thống kê phù hợp với mô hình, quy trình lựa chọn biến, kỹ thuật xác thực mô hình và ứng dụng ‘sáng bóng’ để xây dựng mô hình tương tác. Nó tập trung vào việc giải thích và đánh giá mô hình, cung cấp các phương pháp định rõ hệ số ảnh hưởng, kiểm định và trực quan hóa kết quả.

2.1.2 Bivariate

Phân tích song song (bivariate analysis) là quá trình nghiên cứu mối quan hệ giữa hai biến trong một tập dữ liệu. Nó tập trung vào việc xem xét sự tương quan hoặc sự liên hệ giữa hai biến và giúp hiểu rõ hơn về mối quan hệ giữa chúng. Phân tích song song thường được sử dụng để đo lường mức độ tương quan giữa các biến, xác định sự ảnh hưởng của một biến đến biến khác và tìm ra mẫu hay xu hướng trong dữ liệu. Kết quả của phân tích song song thường được trình bày dưới dạng bảng, đồ thị hoặc các chỉ số thống kê.

2.1.3 Hồi quy Logistic là gì ?

Hồi quy logistic là quá trình mô hình hóa xác suất của một kết quả cụ thể cho các biến đầu vào. Các mô hình hồi quy logistic phổ biến nhất tạo ra một kết quả nhị phân có thể nhận hai giá trị như lành mạnh / không lành mạnh, có / không, đúng / sai, v.v. Hồi quy logistic đa thức có thể mô hình hóa nhiều hơn hai kết quả có thể có.

2.1.4 Sự khác biệt giữa hồi quy logistic và hồi quy tuyến tính là gì?

Hồi quy logistic được sử dụng để lấy giá trị của một biến phụ thuộc với kết quả nhị phân. Hồi quy tuyến tính cũng có một biến phụ thuộc và kết quả có thể phụ thuộc vào một hoặc nhiều biến độc lập.

Nhưng sự khác biệt chính là kết quả thường là một loạt các giá trị. Một trường hợp sử dụng ví dụ của hồi quy tuyến tính là dự đoán một loạt các giá trị trong tương lai của một biến trong một phạm vi dựa trên một phạm vi của (các) biến độc lập đầu vào. Người ta thường sử dụng biểu đồ để biểu diễn các dự đoán bằng hồi quy tuyến tính

2.1.5 Một số hàm của package Blorr

Gói “blorr” cung cấp nhiều hàm để thực hiện phân tích đa biến và khảo sát dữ liệu. Sau đây là một số hàm quan trọng trong gói “blorr”:

  1. blorr(data): Tính toán ma trận tương quan giữa các biến trong tập dữ liệu.

  2. blorr_summary(data): Tính toán các giá trị thống kê mô tả cho các biến trong tập dữ liệu, bao gồm các chỉ số tường minh và ẩn của phân phối, các giá trị cực đại và cực tiểu, và các giá trị trung bình và trung vị của các biến.

  3. blorr_multivar(data): Tính toán các chỉ số khảo sát đa biến, bao gồm các chỉ số phân kỳ, phân tán, và độ lệch chuẩn của các biến.

  4. blorr_plot(data): Tạo ra các biểu đồ để trực quan hóa dữ liệu, bao gồm các biểu đồ tương quan và biểu đồ histogram.

  5. blorr_check_normality(data): Kiểm tra tính phân phối của dữ liệu.

  6. blorr_check_homogeneity(data): Kiểm tra tính đồng nhất của các biến.

  7. blorr_check_correlation(data): Kiểm tra tính tương quan giữa các biến.

Các hàm trong gói “blorr” được thiết kế để giúp bạn khảo sát và phân tích dữ liệu một cách toàn diện, từ việc tính toán các chỉ số thống kê mô tả đến việc trực quan hóa dữ liệu và kiểm tra tính phân phối, đồng nhất và tương quan của các biến.

2.1.6 Một số tính năng chính của package Blorr.

Một số tính năng chính của package Blorr bao gồm:

  • Xác định hệ số ảnh hưởng: Gói “blorr” cho phép bạn xác định hệ số ảnh hưởng của các biến đầu vào đối với mô hình hồi quy logistic.

  • Kiểm định và giả định: Gói này cung cấp các phương pháp kiểm định và giả định để đánh giá tính phù hợp của mô hình và giả định về dữ liệu.

  • Trực quan hóa kết quả: Gói “blorr” cung cấp các công cụ để trực quan hóa kết quả từ mô hình hồi quy logistic, bao gồm đồ thị ROC và đồ thị đường cong hồi quy.

Gói blorr cung cấp các công cụ để xây dựng và xác thực các mô hình hồi quy logistic nhị phân. Nó phù hợp nhất cho người dùng R mới bắt đầu/trung cấp và những người dạy thống kê sử dụng R. API rất đơn giản và hầu hết các hàm lấy a / data.frame hoặc tibblea model làm đầu vào. blorr sử dụng tiền tố nhất quán blr_ để hoàn thành tab dễ dàng.

3 Chương 3: THỰC HÀNH

3.1 Cài đặt package blorr.

## package 'tidyverse' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\asus\AppData\Local\Temp\RtmpCU7izL\downloaded_packages
install.packages('blorr', repos = "http://cran.us.r-project.org")
## package 'blorr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\asus\AppData\Local\Temp\RtmpCU7izL\downloaded_packages
install.packages("dplyr",repos = "http://cran.us.r-project.org") 
library(dplyr)
library(blorr)

3.2 Giới thiệu và cài đặt dữ liệu

data("bank_marketing")
head(bank_marketing)
## # A tibble: 6 × 17
##     age job        marital education default balance housing loan  contact   day
##   <int> <fct>      <fct>   <fct>     <fct>     <dbl> <fct>   <fct> <fct>   <int>
## 1    34 technician married tertiary  no          297 yes     no    cellul…    29
## 2    49 services   married secondary no          180 yes     yes   unknown     2
## 3    38 admin.     single  secondary no          262 no      no    cellul…     3
## 4    47 services   married secondary no          367 yes     no    cellul…    12
## 5    51 self-empl… single  secondary no         1640 yes     no    unknown    15
## 6    40 unemployed married secondary no         3382 yes     no    unknown    14
## # ℹ 7 more variables: month <fct>, duration <int>, campaign <int>, pdays <int>,
## #   previous <int>, poutcome <fct>, y <fct>

Để chứng minh các tính năng của blorr, chúng tôi sẽ sử dụng bộ dữ liệu tiếp thị của ngân hàng. Dữ liệu có liên quan đến các chiến dịch tiếp thị trực tiếp của một tổ chức ngân hàng Bồ Đào Nha. Các chiến dịch tiếp thị được dựa trên các cuộc gọi điện thoại. Thông thường, cần có nhiều hơn một lần liên hệ với cùng một khách hàng để truy cập xem sản phẩm (tiền gửi có kỳ hạn ngân hàng) sẽ được đăng ký có (‘Yes’) hay không (‘No’).

“bank_marketing” là một tibble với 4521 quan sát và 17 biến gồm:

  • age: Độ tuổi của khách hàng

  • job: loại công việc

  • marital: tình trạng hôn nhân

  • education: trình độ học vấn của khách hàng

  • default: có tín dụng trong vỡ nợ?

  • housing: có cho vay nhà ở?

  • loan: có khoản vay cá nhân?

  • contact: liên lạc loại liên lạc

  • month: liên hệ cuối tháng trong năm

  • day_of_week: ngày liên hệ cuối cùng trong tuần

  • duration: thời lượng liên hệ cuối cùng, tính bằng giây số lượng địa chỉ liên hệ của chiến dịch được thực hiện trong chiến dịch này và cho khách hàng này

  • pdays: số ngày trôi qua sau khi khách hàng được liên hệ lần cuối từ một chiến dịch trước đó

  • previous: số lượng liên hệ trước đó được thực hiện trước chiến dịch này và cho khách hàng này

  • outcome: kết quả của chiến dịch tiếp thị trước đó

  • y: khách hàng đã đăng ký tiền gửi có kỳ hạn chưa?

3.3 Một số tính năng của blorr

3.3.1 Phân tích hai biến

Hãy bắt đầu với việc phân tích song song của biến định lượng và định tính. Chúng ta sẽ sử dụng giá trị thông tin và kiểm định chi-square để chọn mô hình phù hợp.

blr_bivariate_analysis(bank_marketing, y, job, marital, education, default, 
  housing, loan, contact, poutcome)
##                           Bivariate Analysis                           
## ----------------------------------------------------------------------
## Variable     Information Value    LR Chi Square    LR DF    LR p-value 
## ----------------------------------------------------------------------
##    job             0.16              75.2690        11        0.0000   
##  marital           0.05              21.6821         2        0.0000   
## education          0.05              25.0466         3        0.0000   
##  default           0.02              6.0405          1        0.0140   
##  housing           0.16              72.2813         1        0.0000   
##   loan             0.06              26.6615         1        0.0000   
##  contact           0.31             124.3834         2        0.0000   
## poutcome           0.53             270.6450         3        0.0000   
## ----------------------------------------------------------------------

Kết quả bivariate analysis trên cho biết các thông tin liên quan đến mối quan hệ giữa biến mục tiêu “y” và các biến “job”, “marital”, “education”, “default”, “housing”, “loan”, “contact”, “poutcome” trong tập dữ liệu “bank_marketing”.

Các thông số này giúp đánh giá mức độ tương quan giữa từng biến và biến mục tiêu “y”. Mức độ quan trọng của mỗi biến đối với biến mục tiêu được đánh giá dựa trên Information Value, và mức độ tương quan dựa trên LR Chi Square và p-value.

Nhìn vào kết quả trên:

  • Các biến “job”, “housing”, “contact”, và “poutcome” có Information Value cao, và có p-value rất thấp (gần bằng 0), cho thấy chúng có mối tương quan mạnh với biến mục tiêu “y”. Điều này cho thấy nghề nghiệp, tình trạng nhà ở, phương thức liên hệ và kết quả chiến dịch trước đó có ảnh hưởng đáng kể đến việc khách hàng có tham gia chiến dịch tiếp theo (biến “y”) hay không.

  • Các biến “marital”, “education”, và “loan” cũng có Information Value đáng kể, và p-value rất thấp, cho thấy chúng cũng có mối tương quan với biến mục tiêu “y”.

  • Biến “default” có Information Value thấp hơn, nhưng vẫn có p-value dưới ngưỡng ý nghĩa 0.05, cho thấy có ảnh hưởng đáng kể đến việc khách hàng có tham gia chiến dịch hay không, mặc dù mức độ tương quan không cao bằng các biến khác.

3.3.1.1 Trọng số bằng chứng & Giá trị Thông tin

Trọng số bằng chứng (Weight of Evidence - WoE) được sử dụng để đánh giá nguy cơ tương đối của các thuộc tính khác nhau đối với một đặc điểm và là một phương tiện để chuyển đổi các đặc điểm thành các biến. Nó cũng là một công cụ rất hữu ích để phân nhóm. WoE cho bất kỳ nhóm nào với tỷ lệ cược trung bình là không. WoE âm cho thấy tỷ lệ mặc định cao hơn cho thuộc tính đó so với tỷ lệ chung và cho thấy nguy cơ cao hơn.

Giá trị thông tin (Information Value) được sử dụng để xếp hạng các biến theo năng lực tiên đoán của chúng. Giá trị thông tin cao cho thấy khả năng phân biệt cao. Các giá trị cho giá trị thông tin luôn là dương và có thể vượt quá 3 khi đánh giá các đặc điểm có tính tiên đoán cao. Những đặc điểm có giá trị thông tin ít hơn 0,10 thường được coi là yếu, trong khi giá trị trên 0,30 được đánh giá cao.

blr_woe_iv(bank_marketing, job, y)
##                                Weight of Evidence                                
## --------------------------------------------------------------------------------
##    levels        count_0s    count_1s    dist_0s    dist_1s        woe      iv   
## --------------------------------------------------------------------------------
##  management        809         130          0.20       0.25      -0.22     0.01  
##  technician        682          79          0.17       0.15       0.11     0.00  
## entrepreneur       139          12          0.03       0.02       0.40     0.00  
##  blue-collar       937          73          0.23       0.14       0.51     0.05  
##    unknown          29          2           0.01       0.00       0.61     0.00  
##    retired         152          47          0.04       0.09      -0.87     0.05  
##    admin.          433          61          0.11       0.12      -0.09     0.00  
##   services         392          39          0.10       0.08       0.26     0.01  
## self-employed      132          22          0.03       0.04      -0.26     0.00  
##  unemployed        126          15          0.03       0.03       0.08     0.00  
##   housemaid        110          12          0.03       0.02       0.17     0.00  
##    student          63          25          0.02       0.05      -1.13     0.04  
## --------------------------------------------------------------------------------
## 
##       Information Value       
## -----------------------------
## Variable    Information Value 
## -----------------------------
##   job            0.1594       
## -----------------------------

Kết quả “Weight of Evidence” (WOE) và “Information Value” (IV) được tính toán từ việc phân tích mối quan hệ giữa biến “job” và biến mục tiêu “y”.

Weight of Evidence (WOE) là một phép đo dùng để đo lường mức độ quan trọng của từng nhóm (level) trong biến “job” đối với biến mục tiêu “y”. Nó tính toán tỷ lệ giữa khả năng xảy ra sự kiện “1” (có tham gia chiến dịch) và sự kiện “0” (không tham gia chiến dịch) trong từng nhóm. WOE càng cao thì tương ứng với khả năng cao hơn của một nhóm tham gia chiến dịch, và ngược lại. Cụ thể:

  • “management” có WOE là -0.22, tức là nhóm này có khả năng tham gia chiến dịch thấp hơn so với nhóm tham chiếu.

  • “technician” có WOE là 0.11, cho thấy khả năng tham gia chiến dịch tương đối tương đồng với nhóm tham chiếu.

  • “entrepreneur” có WOE là 0.40, tức là nhóm này có khả năng tham gia chiến dịch cao hơn so với nhóm tham chiếu.

Tương tự, các giá trị WOE còn được tính cho các nhóm còn lại trong biến “job”.

Information Value (IV) tính toán tổng hợp tất cả giá trị WOE của từng nhóm trong biến “job”. IV đo lường mức độ quan trọng của biến “job” đối với biến mục tiêu “y”. Các giá trị IV thường được sử dụng để đánh giá sự quan trọng của từng biến trong việc dự đoán biến mục tiêu. Trong kết quả này, IV của biến “job” là 0.1594, cho thấy biến này có mức độ quan trọng trung bình trong việc dự đoán khách hàng có tham gia chiến dịch hay không.

Tóm lại, kết quả WOE và IV cho biết mức độ quan trọng của từng nhóm trong biến “job” đối với biến mục tiêu “y” trong tập dữ liệu “bank_marketing”. Các giá trị WOE dùng để mô tả mức độ tương quan giữa biến “job” và biến mục tiêu “y”, trong khi IV tổng hợp các giá trị WOE để đánh giá quan trọng của biến “job” trong việc dự đoán khách hàng có tham gia chiến dịch hay không.

3.3.1.2 Vẽ biểu đồ

k <- blr_woe_iv(bank_marketing, job, y)
plot(k)

Biểu đồ trên thể hiện mối quan hệ giữa các nhóm (levels) trong biến “job” và khả năng tham gia chiến dịch của khách hàng (biến mục tiêu “y”) thông qua đường cong Weight of Evidence (WOE).

Những điểm nằm bên trên đường trung tuyến (thường là giá trị WOE = 0) đại diện cho các nhóm có khả năng tham gia chiến dịch cao hơn so với nhóm tham chiếu. Điều này được thể hiện bằng giá trị WOE dương.

Những điểm nằm bên dưới đường trung tuyến đại diện cho các nhóm có khả năng tham gia chiến dịch thấp hơn so với nhóm tham chiếu. Điều này được thể hiện bằng giá trị WOE âm. Độ lớn của WOE càng xa khỏi đường trung tuyến, thì khả năng tham gia chiến dịch của nhóm đó càng khác biệt so với nhóm tham chiếu.

Từ biểu đồ, chúng ta có thể thấy được mức độ ảnh hưởng của từng nhóm nghề nghiệp trong biến “job” đến khả năng tham gia chiến dịch của khách hàng (biến mục tiêu “y”).

3.3.1.3 Trọng số bằng chứng & Giá trị Thông tin của nhiều biến

Chúng ta có thể tạo trọng số của bằng chứng và giá trị thông tin cho nhiều biến bằng cách sử dụng “blr_woe_iv_stats ()”.

blr_woe_iv_stats(bank_marketing, y, job, marital, education)
## Variable: job
## 
##                                Weight of Evidence                                
## --------------------------------------------------------------------------------
##    levels        count_0s    count_1s    dist_0s    dist_1s        woe      iv   
## --------------------------------------------------------------------------------
##  management        809         130          0.20       0.25      -0.22     0.01  
##  technician        682          79          0.17       0.15       0.11     0.00  
## entrepreneur       139          12          0.03       0.02       0.40     0.00  
##  blue-collar       937          73          0.23       0.14       0.51     0.05  
##    unknown          29          2           0.01       0.00       0.61     0.00  
##    retired         152          47          0.04       0.09      -0.87     0.05  
##    admin.          433          61          0.11       0.12      -0.09     0.00  
##   services         392          39          0.10       0.08       0.26     0.01  
## self-employed      132          22          0.03       0.04      -0.26     0.00  
##  unemployed        126          15          0.03       0.03       0.08     0.00  
##   housemaid        110          12          0.03       0.02       0.17     0.00  
##    student          63          25          0.02       0.05      -1.13     0.04  
## --------------------------------------------------------------------------------
## 
##       Information Value       
## -----------------------------
## Variable    Information Value 
## -----------------------------
##   job            0.1594       
## -----------------------------
## 
## 
## Variable: marital
## 
##                             Weight of Evidence                              
## ---------------------------------------------------------------------------
##  levels     count_0s    count_1s    dist_0s    dist_1s        woe      iv   
## ---------------------------------------------------------------------------
## married       2467        273          0.62       0.53       0.15     0.01  
##  single       1079        191          0.27       0.37      -0.32     0.03  
## divorced      458          53          0.11       0.10       0.11     0.00  
## ---------------------------------------------------------------------------
## 
##       Information Value       
## -----------------------------
## Variable    Information Value 
## -----------------------------
## marital          0.0464       
## -----------------------------
## 
## 
## Variable: education
## 
##                              Weight of Evidence                              
## ----------------------------------------------------------------------------
##  levels      count_0s    count_1s    dist_0s    dist_1s        woe      iv   
## ----------------------------------------------------------------------------
## tertiary       1104        195          0.28       0.38      -0.31     0.03  
## secondary      2121        231          0.53       0.45       0.17     0.01  
##  unknown       154          25          0.04       0.05      -0.23     0.00  
##  primary       625          66          0.16       0.13       0.20     0.01  
## ----------------------------------------------------------------------------
## 
##       Information Value        
## ------------------------------
## Variable     Information Value 
## ------------------------------
## education         0.0539       
## ------------------------------

Kết quả trên là một phân tích Weight of Evidence (WOE) và Information Value (IV) của ba biến đầu vào trong bộ dữ liệu bank_marketing: ‘job’, ‘marital’ và ‘education’. Đây là các chỉ số quan trọng trong các công cụ tạo mô hình dự đoán, đặc biệt là trong mô hình tín dụng và rủi ro tài chính.

  • Phân tích biến ‘job’:

    • WOE cho từng mức của biến ‘job’ đã được tính toán. WOE thể hiện mức độ ảnh hưởng của từng mức tới biến mục tiêu (y). Giá trị WOE dương cho thấy mức độ tăng khả năng xảy ra của biến mục tiêu trong nhóm đó, trong khi WOE âm cho thấy mức độ giảm khả năng xảy ra.

    • Mức ‘student’ có WOE âm (-1.13), cho thấy khả năng xảy ra biến mục tiêu thấp nhất trong nhóm này. Mức ‘blue-collar’ có WOE dương (0.51), cho thấy khả năng xảy ra biến mục tiêu cao nhất trong nhóm này.

    • IV của biến ‘job’ là 0.1594, đây là một chỉ số thể hiện sức mạnh của biến ‘job’ trong dự đoán biến mục tiêu. Giá trị IV từ 0.02 đến 0.1 được coi là có ý nghĩa trong dự đoán.

  • Phân tích biến ‘marital’:

    • WOE cho từng mức của biến ‘marital’ đã được tính toán. Mức độ tăng hoặc giảm của WOE thể hiện ảnh hưởng của từng mức tới khả năng xảy ra của biến mục tiêu.

    • Mức ‘single’ có WOE âm (-0.32), cho thấy khả năng xảy ra biến mục tiêu thấp hơn so với mức ‘married’ có WOE dương (0.15).

    • IV của biến ‘marital’ là 0.0464, giá trị này cũng có ý nghĩa trong dự đoán, nhưng thấp hơn so với biến ‘job’.

  • Phân tích biến ‘education’:

    • WOE cho từng mức của biến ‘education’ đã được tính toán. Các mức có WOE âm cho thấy khả năng xảy ra biến mục tiêu thấp hơn so với các mức có WOE dương.

    • Mức ‘tertiary’ có WOE âm (-0.31), cho thấy khả năng xảy ra biến mục tiêu thấp hơn so với mức ‘primary’ có WOE dương (0.20).

    • IV của biến ‘education’ là 0.0539, tương tự như biến ‘marital’, giá trị này có ý nghĩa trong dự đoán nhưng thấp hơn so với biến ‘job’.

Tổng kết:

  • Cả ba biến ‘job’, ‘marital’ và ‘education’ đều có sức mạnh trong dự đoán biến mục tiêu. Biến ‘job’ có sức mạnh dự đoán cao nhất (IV = 0.1594), theo sau là ‘education’ (IV = 0.0539) và ‘marital’ (IV = 0.0464).

  • Thông qua phân tích WOE và IV, ta có thể chọn ra các biến quan trọng để xây dựng mô hình và loại bỏ các biến yếu không đóng góp nhiều vào dự đoán. Điều này giúp cải thiện hiệu suất và đơn giản hóa mô hình dự đoán.

3.3.2 Lựa chọn từng bước theo giá trị AIC

Đối với mô hình cắt lần đầu/lần đầu, tất cả các biến độc lập được đưa vào mô hình. Mục tiêu của chúng tôi là bao gồm một số lượng hạn chế các biến độc lập (5-15), tất cả đều có ý nghĩa, mà không ảnh hưởng quá nhiều đến hiệu suất của mô hình. Lý do đằng sau việc không bao gồm quá nhiều biến là mô hình sẽ được trang bị quá mức và sẽ trở nên không ổn định khi thử nghiệm trên mẫu xác thực. Việc giảm biến được thực hiện bằng cách sử dụng các thủ tục chọn biến tiến hoặc lùi hoặc từng bước. Chúng tôi sẽ sử dụng “blr_step_aic_both ()” để dự đoán danh sách rút gọn cho mô hình của chúng tôi.

3.3.2.1 Model

model <- glm(y ~ ., data = bank_marketing, family = binomial(link = 'logit'))

Hàm trên đang tạo một mô hình hồi quy logistic (logistic regression) trong ngôn ngữ lập trình R. Mô hình logistic regression là một phương pháp sử dụng để dự đoán biến phụ thuộc nhị phân (có hai giá trị duy nhất) từ các biến độc lập. Trong trường hợp này, biến phụ thuộc được ký hiệu là ‘y’, và các biến độc lập được sử dụng để dự đoán ‘y’ là tất cả các biến có trong bộ dữ liệu ‘bank_marketing’.

3.3.2.2 Tóm tắt lựa chọn

blr_step_aic_both(model)
## Stepwise Selection Method 
## -------------------------
## 
## Candidate Terms: 
## 
## 1 . age 
## 2 . job 
## 3 . marital 
## 4 . education 
## 5 . default 
## 6 . balance 
## 7 . housing 
## 8 . loan 
## 9 . contact 
## 10 . day 
## 11 . month 
## 12 . duration 
## 13 . campaign 
## 14 . pdays 
## 15 . previous 
## 16 . poutcome 
## 
## 
## Variables Entered/Removed: 
## 
## - duration added 
## - poutcome added 
## - month added 
## - contact added 
## - housing added 
## - loan added 
## - campaign added 
## - marital added 
## - education added 
## - age added 
## 
## No more variables to be added or removed.
## 
## 
##                      Stepwise Summary                      
## ---------------------------------------------------------
## Variable      Method       AIC         BIC       Deviance 
## ---------------------------------------------------------
## duration     addition    2674.384    2687.217    2670.384 
## poutcome     addition    2396.014    2428.097    2386.014 
## month        addition    2274.109    2376.773    2242.109 
## contact      addition    2207.884    2323.381    2171.884 
## housing      addition    2184.550    2306.463    2146.550 
## loan         addition    2171.972    2300.302    2131.972 
## campaign     addition    2164.164    2298.910    2122.164 
## marital      addition    2158.524    2306.103    2112.524 
## education    addition    2155.837    2322.666    2103.837 
## age          addition    2154.272    2327.517    2100.272 
## ---------------------------------------------------------

Phía trên là kết quả của phân tích mô hình hồi quy logistic sử dụng phương pháp “Stepwise Selection” dựa trên tiêu chí AIC (Akaike Information Criterion). Phương pháp này sử dụng các bước tăng hoặc giảm biến vào/ra khỏi mô hình để tìm ra tập biến quan trọng nhất trong việc dự đoán biến phụ thuộc ‘y’. Khi thêm hoặc loại bỏ một biến, mô hình được đánh giá lại bằng cách tính toán AIC và BIC (Bayesian Information Criterion) để đánh giá hiệu quả của mô hình.

Suy ra, giá trị AIC càng lớn thì biến càng có tác động lớn đến biến y - khách hàng đã đăng ký tiền gửi có kỳ hạn chưa?

Các kết quả được thể hiện như sau:

  1. Candidate Terms: Đây là tập hợp các biến độc lập mà mô hình có thể sử dụng để dự đoán biến phụ thuộc.

  2. Variables Entered/Removed: Đây là danh sách các biến được thêm vào hoặc loại bỏ khỏi mô hình qua từng bước của phương pháp “Stepwise Selection”. Các biến được thêm vào mô hình lần lượt là ‘duration’, ‘poutcome’, ‘month’, ‘contact’, ‘housing’, ‘loan’, ‘campaign’, ‘marital’, ‘education’ và ‘age’.

  3. Stepwise Summary: Bảng này cung cấp thông tin chi tiết về các bước thêm biến và giá trị AIC, BIC và Deviance tương ứng sau khi thêm từng biến.

Từ kết quả trên, chúng ta có thể thấy rằng mô hình đã chọn tổng cộng 10 biến độc lập (duration, poutcome, month, contact, housing, loan, campaign, marital, education và age) để dự đoán biến phụ thuộc ‘y’. Các biến này được chọn dựa trên tiêu chí AIC, BIC và Deviance, trong đó AIC và BIC càng thấp và Deviance càng gần giá trị nhỏ nhất thì mô hình càng tốt.

3.3.2.3 Vẽ biểu đồ

model %>%
  blr_step_aic_both() %>%
  plot()
## Stepwise Selection Method 
## -------------------------
## 
## Candidate Terms: 
## 
## 1 . age 
## 2 . job 
## 3 . marital 
## 4 . education 
## 5 . default 
## 6 . balance 
## 7 . housing 
## 8 . loan 
## 9 . contact 
## 10 . day 
## 11 . month 
## 12 . duration 
## 13 . campaign 
## 14 . pdays 
## 15 . previous 
## 16 . poutcome 
## 
## 
## Variables Entered/Removed: 
## 
## - duration added 
## - poutcome added 
## - month added 
## - contact added 
## - housing added 
## - loan added 
## - campaign added 
## - marital added 
## - education added 
## - age added 
## 
## No more variables to be added or removed.

Từ biểu đồ cho ta thấy giữa các biến có giá trị AIC tạo thành đường cong với mức độ ảnh hưởng của biến giảm dần có Duration lớn nhất và Age là bé nhất.

3.3.3 Đầu ra hồi quy.

3.3.3.1 Model

Chúng ta có thể sử dụng phân tích hai biến và quy trình lựa chọn từng bước để đưa ra các yếu tố dự đoán trong danh sách rút gọn và xây dựng mô hình bằng cách sử dụng “glm()”. Các yếu tố dự đoán được sử dụng trong mô hình dưới đây nhằm mục đích minh họa và không nhất thiết phải được đưa vào danh sách rút gọn từ quy trình phân tích hai biến và lựa chọn biến.

model <- glm(y ~  age + duration + previous + housing + default +
             loan + poutcome + job + marital, data = bank_marketing, 
             family = binomial(link = 'logit'))

Sử dụng “blr_regress ()” để tạo đầu ra hồi quy toàn diện. Nó chấp nhận một trong những điều sau đây

  • Mô hình được xây dựng bằng cách sử dụng “glm()”
  • công thức mô hình và dữ liệu

3.3.3.2 Sử dụng Model

Chúng ta hãy nhìn vào đầu ra được tạo ra từ “blr_regress ()”:

blr_regress(model)
##                              Model Overview                              
## ------------------------------------------------------------------------
## Data Set    Resp Var    Obs.    Df. Model    Df. Residual    Convergence 
## ------------------------------------------------------------------------
##   data         y        4521      4520           4498           TRUE     
## ------------------------------------------------------------------------
## 
##                     Response Summary                     
## --------------------------------------------------------
## Outcome        Frequency        Outcome        Frequency 
## --------------------------------------------------------
##    0             4004              1              517    
## --------------------------------------------------------
## 
##                      Maximum Likelihood Estimates                       
## -----------------------------------------------------------------------
##    Parameter        DF    Estimate    Std. Error    z value     Pr(>|z|) 
## -----------------------------------------------------------------------
##   (Intercept)       1     -5.1347        0.3728    -13.7729      0.0000 
##       age           1      0.0096        0.0067      1.4299      0.1528 
##     duration        1      0.0042         2e-04     20.7853      0.0000 
##     previous        1     -0.0357        0.0392     -0.9089      0.3634 
##    housingno        1      0.7894        0.1232      6.4098      0.0000 
##    defaultyes       1     -0.8691        0.6919     -1.2562      0.2091 
##      loanno         1      0.6598        0.1945      3.3925       7e-04 
## poutcomefailure     1      0.6085        0.2012      3.0248      0.0025 
##  poutcomeother      1      1.1354        0.2700      4.2057      0.0000 
## poutcomesuccess     1      3.2481        0.2462     13.1913      0.0000 
##  jobtechnician      1     -0.2713        0.1806     -1.5019      0.1331 
## jobentrepreneur     1     -0.7041        0.3809     -1.8486      0.0645 
##  jobblue-collar     1     -0.6132        0.1867     -3.2851      0.0010 
##    jobunknown       1     -0.9932        0.8226     -1.2073      0.2273 
##    jobretired       1      0.3197        0.2729      1.1713      0.2415 
##    jobadmin.        1      0.1120        0.2001      0.5599      0.5755 
##   jobservices       1     -0.1750        0.2265     -0.7728      0.4397 
## jobself-employed    1     -0.1408        0.3009     -0.4680      0.6398 
##  jobunemployed      1     -0.6581        0.3432     -1.9174      0.0552 
##   jobhousemaid      1     -0.7456        0.3932     -1.8963      0.0579 
##    jobstudent       1      0.1927        0.3433      0.5613      0.5746 
##  maritalsingle      1      0.5451        0.1387      3.9299       1e-04 
## maritaldivorced     1     -0.1989        0.1986     -1.0012      0.3167 
## -----------------------------------------------------------------------
## 
##  Association of Predicted Probabilities and Observed Responses  
## ---------------------------------------------------------------
## % Concordant          0.8886          Somers' D        0.7773   
## % Discordant          0.1114          Gamma            0.7773   
## % Tied                0.0000          Tau-a            0.1575   
## Pairs                2070068          c                0.8886   
## ---------------------------------------------------------------

Nếu bạn muốn kiểm tra ước tính tỷ lệ chênh lệch, hãy đặt “odd_conf_limit” ĐẾN “TRUE”. Các ước tính tỷ lệ chênh lệch không được tính toán rõ ràng vì chúng tôi đã quan sát thấy sự gia tăng đáng kể về thời gian tính toán khi xử lý các tập dữ liệu lớn.

  • Model Overview: Đây là tổng quan về mô hình hồi quy logistic đã xây dựng. Gồm các thông tin như tên bộ dữ liệu (‘data’), biến phụ thuộc (‘Resp Var’), số quan sát (‘Obs.’), số bậc tự do của mô hình (‘Df. Model’), số bậc tự do của phần dư (‘Df. Residual’) và thông tin về hội tụ của mô hình (‘Convergence’).

  • Response Summary: Đây là tổng quan về biến phụ thuộc (‘y’) trong bộ dữ liệu. Nó cho biết số lần xuất hiện của mỗi giá trị trong biến phụ thuộc. Trong trường hợp này, giá trị 0 xuất hiện 4004 lần và giá trị 1 xuất hiện 517 lần.

  • Maximum Likelihood Estimates: Đây là các ước lượng tối đa hóa hàm hợp lý (maximum likelihood estimates) cho các hệ số của mô hình hồi quy logistic. Với mỗi biến độc lập, ta có thông tin về hệ số ước lượng (‘Estimate’), độ lệch chuẩn (‘Std. Error’), giá trị t-test (‘z value’) và giá trị p-value (‘Pr(>|z|)’). Giá trị p-value được sử dụng để kiểm định giả thuyết về sự khác biệt của hệ số so với 0, với mức ý nghĩa (significance level) thường là 0.05. Nếu giá trị p-value nhỏ hơn mức ý nghĩa, ta có căn cứ để kết luận rằng hệ số ước lượng có ý nghĩa thống kê.

  • Association of Predicted Probabilities and Observed Responses: Đây là phân tích về sự tương quan giữa xác suất dự đoán (predicted probabilities) và các giá trị quan sát thực tế (observed responses). Phân tích này thường được sử dụng để đánh giá hiệu suất dự đoán của mô hình. Các thông số như % Concordant, % Discordant, % Tied, Somers’ D, Gamma, Tau-a, c và số lượng cặp (Pairs) được tính toán để đánh giá hiệu suất của mô hình.

Tổng quan, kết quả trên cho ta thông tin về các hệ số ước lượng của mô hình và hiệu suất dự đoán của mô hình hồi quy logistic trên dữ liệu ‘data’. Từ đó, ta có thể hiểu sâu hơn về sự ảnh hưởng của các biến độc lập đến biến phụ thuộc và khả năng dự đoán của mô hình.

3.3.3.3 Sử dụng Formula

Hãy để chúng tôi sử dụng công thức mô hình và tập dữ liệu để tạo ra các kết quả trên.

blr_regress(y ~  age + duration + previous + housing + default +
             loan + poutcome + job + marital, data = bank_marketing)
##                              Model Overview                              
## ------------------------------------------------------------------------
## Data Set    Resp Var    Obs.    Df. Model    Df. Residual    Convergence 
## ------------------------------------------------------------------------
##   data         y        4521      4520           4498           TRUE     
## ------------------------------------------------------------------------
## 
##                     Response Summary                     
## --------------------------------------------------------
## Outcome        Frequency        Outcome        Frequency 
## --------------------------------------------------------
##    0             4004              1              517    
## --------------------------------------------------------
## 
##                      Maximum Likelihood Estimates                       
## -----------------------------------------------------------------------
##    Parameter        DF    Estimate    Std. Error    z value     Pr(>|z|) 
## -----------------------------------------------------------------------
##   (Intercept)       1     -5.1347        0.3728    -13.7729      0.0000 
##       age           1      0.0096        0.0067      1.4299      0.1528 
##     duration        1      0.0042         2e-04     20.7853      0.0000 
##     previous        1     -0.0357        0.0392     -0.9089      0.3634 
##    housingno        1      0.7894        0.1232      6.4098      0.0000 
##    defaultyes       1     -0.8691        0.6919     -1.2562      0.2091 
##      loanno         1      0.6598        0.1945      3.3925       7e-04 
## poutcomefailure     1      0.6085        0.2012      3.0248      0.0025 
##  poutcomeother      1      1.1354        0.2700      4.2057      0.0000 
## poutcomesuccess     1      3.2481        0.2462     13.1913      0.0000 
##  jobtechnician      1     -0.2713        0.1806     -1.5019      0.1331 
## jobentrepreneur     1     -0.7041        0.3809     -1.8486      0.0645 
##  jobblue-collar     1     -0.6132        0.1867     -3.2851      0.0010 
##    jobunknown       1     -0.9932        0.8226     -1.2073      0.2273 
##    jobretired       1      0.3197        0.2729      1.1713      0.2415 
##    jobadmin.        1      0.1120        0.2001      0.5599      0.5755 
##   jobservices       1     -0.1750        0.2265     -0.7728      0.4397 
## jobself-employed    1     -0.1408        0.3009     -0.4680      0.6398 
##  jobunemployed      1     -0.6581        0.3432     -1.9174      0.0552 
##   jobhousemaid      1     -0.7456        0.3932     -1.8963      0.0579 
##    jobstudent       1      0.1927        0.3433      0.5613      0.5746 
##  maritalsingle      1      0.5451        0.1387      3.9299       1e-04 
## maritaldivorced     1     -0.1989        0.1986     -1.0012      0.3167 
## -----------------------------------------------------------------------
## 
##  Association of Predicted Probabilities and Observed Responses  
## ---------------------------------------------------------------
## % Concordant          0.8886          Somers' D        0.7773   
## % Discordant          0.1114          Gamma            0.7773   
## % Tied                0.0000          Tau-a            0.1575   
## Pairs                2070068          c                0.8886   
## ---------------------------------------------------------------
  • Model Overview: Đây là tổng quan về mô hình hồi quy logistic đã xây dựng. Gồm các thông tin như tên bộ dữ liệu (‘data’), biến phụ thuộc (‘Resp Var’), số quan sát (‘Obs.’), số bậc tự do của mô hình (‘Df. Model’), số bậc tự do của phần dư (‘Df. Residual’) và thông tin về hội tụ của mô hình (‘Convergence’).

  • Response Summary: Đây là tổng quan về biến phụ thuộc (‘y’) trong bộ dữ liệu. Nó cho biết số lần xuất hiện của mỗi giá trị trong biến phụ thuộc. Trong trường hợp này, giá trị 0 xuất hiện 4004 lần và giá trị 1 xuất hiện 517 lần.

  • Maximum Likelihood Estimates: Đây là các ước lượng tối đa hóa hàm hợp lý (maximum likelihood estimates) cho các hệ số của mô hình hồi quy logistic. Với mỗi biến độc lập, ta có thông tin về hệ số ước lượng (‘Estimate’), độ lệch chuẩn (‘Std. Error’), giá trị t-test (‘z value’) và giá trị p-value (‘Pr(>|z|)’). Giá trị p-value được sử dụng để kiểm định giả thuyết về sự khác biệt của hệ số so với 0, với mức ý nghĩa (significance level) thường là 0.05. Nếu giá trị p-value nhỏ hơn mức ý nghĩa, ta có căn cứ để kết luận rằng hệ số ước lượng có ý nghĩa thống kê.

  • Association of Predicted Probabilities and Observed Responses: Đây là phân tích về sự tương quan giữa xác suất dự đoán (predicted probabilities) và các giá trị quan sát thực tế (observed responses). Phân tích này thường được sử dụng để đánh giá hiệu suất dự đoán của mô hình. Các thông số như % Concordant, % Discordant, % Tied, Somers’ D, Gamma, Tau-a, c và số lượng cặp (Pairs) được tính toán để đánh giá hiệu suất của mô hình.

Tổng quan, kết quả trên cho ta thông tin về các hệ số ước lượng của mô hình và hiệu suất dự đoán của mô hình hồi quy logistic trên dữ liệu ‘bank_marketing’ khi sử dụng các biến ‘age’, ‘duration’, ‘previous’, ‘housing’, ‘default’, ‘loan’, ‘poutcome’, ‘job’ và ‘marital’ để dự đoán biến phụ thuộc ‘y’.

3.3.4 Thống kê mô hình phù hợp

Số liệu thống kê về mức độ phù hợp của mô hình có sẵn để đánh giá mức độ phù hợp của mô hình với dữ liệu và để so sánh hai mô hình khác nhau. Đầu ra bao gồm kiểm tra tỷ lệ khả năng, AIC, BIC và một loạt các biện pháp giả r bình phương.

3.3.4.1 Single Model

blr_model_fit_stats(model)
##                                Model Fit Statistics                                
## ----------------------------------------------------------------------------------
## Log-Lik Intercept Only:     -1607.330    Log-Lik Full Model:             -1123.340 
## Deviance(4498):              2246.679    LR(22):                           967.980 
##                                          Prob > LR:                          0.000 
## MCFadden's R2                   0.301    McFadden's Adj R2:                  0.287 
## ML (Cox-Snell) R2:              0.193    Cragg-Uhler(Nagelkerke) R2:         0.379 
## McKelvey & Zavoina's R2:        0.388    Efron's R2:                         0.278 
## Count R2:                       0.904    Adj Count R2:                       0.157 
## BIC:                         2440.259    AIC:                             2292.679 
## ----------------------------------------------------------------------------------

Kết quả trên là các thống kê đánh giá hiệu suất và phù hợp của mô hình hồi quy logistic đã được xây dựng. Dưới đây là ý nghĩa của các thông số đó:

Log-Lik Intercept Only: Log-Likelihood của mô hình chỉ có một hệ số chặn (intercept). Đây là giá trị Log-Likelihood tương ứng với mô hình mà không có biến độc lập nào được sử dụng để dự đoán biến phụ thuộc.

Log-Lik Full Model: Log-Likelihood của mô hình hoàn chỉnh, bao gồm tất cả các biến độc lập được sử dụng để dự đoán biến phụ thuộc.

Deviance(4498): Deviance của mô hình, đo lường mức độ sai khác giữa dữ liệu quan sát và dự đoán của mô hình.

LR(22): Giá trị chi-squared (likelihood ratio chi-squared) của mô hình, so sánh hiệu suất giữa mô hình hoàn chỉnh và mô hình chỉ có intercept. Giá trị LR cao và p-value thấp cho thấy mô hình hoàn chỉnh giải thích dữ liệu tốt hơn so với mô hình chỉ có intercept.

Prob > LR: Giá trị p-value liên quan đến LR test. Nó đánh giá mức độ đáng tin cậy của LR test. Trong trường hợp này, p-value rất nhỏ (0.000), cho thấy mô hình hoàn chỉnh giải thích dữ liệu tốt hơn so với mô hình chỉ có intercept.

MCFadden’s R2: Hệ số R-square dựa trên phương pháp của MCFadden. Nó đánh giá mức độ giải thích của mô hình so với mô hình chỉ có intercept. Giá trị càng cao thể hiện mô hình giải thích tốt hơn.

McFadden’s Adj R2: Hệ số R-square điều chỉnh dựa trên phương pháp của MCFadden. Điều chỉnh cho số lượng biến độc lập trong mô hình. Giá trị này cũng thể hiện mức độ giải thích của mô hình.

ML (Cox-Snell) R2: Hệ số R-square dựa trên phương pháp Cox-Snell. Nó cũng đo lường mức độ giải thích của mô hình so với mô hình chỉ có intercept.

Cragg-Uhler(Nagelkerke) R2: Hệ số R-square dựa trên phương pháp Cragg-Uhler (hoặc Nagelkerke). Đo lường mức độ giải thích của mô hình so với mô hình chỉ có intercept.

McKelvey & Zavoina’s R2: Hệ số R-square dựa trên phương pháp của McKelvey & Zavoina. Nó đo lường mức độ giải thích của mô hình so với mô hình chỉ có intercept.

Efron’s R2: Hệ số R-square dựa trên phương pháp của Efron. Nó đo lường mức độ giải thích của mô hình so với mô hình chỉ có intercept.

Count R2: Hệ số R-square dựa trên số lần dự đoán đúng (count data). Đo lường mức độ giải thích của mô hình.

Adj Count R2: Hệ số R-square điều chỉnh dựa trên số lần dự đoán đúng (count data). Điều chỉnh cho số lượng biến độc lập trong mô hình.

BIC: BIC (Bayesian Information Criterion) của mô hình. BIC là một tiêu chí để so sánh các mô hình và đánh giá sự phù hợp của mô hình. Mô hình có BIC thấp hơn thể.

3.4 Xác thực mô hình

3.4.1 Ma trận nhầm lẫn (Confustion Matrix)

Confusion Matrix (ma trận nhầm lẫn) là một công cụ phân tích được sử dụng để đánh giá hiệu suất của một mô hình phân loại. Nó cung cấp một tổng quan về sự phân loại đúng và nhầm của mô hình bằng cách so sánh dự đoán của mô hình với giá trị thực tế.

Confusion Matrix thường có dạng một bảng vuông với số lượng hàng và cột tương ứng với số lượng lớp của bài toán phân loại. Trong một Confusion Matrix, các thành phần chính bao gồm:

True Positives (TP): Số lượng mẫu được dự đoán đúng là thuộc vào lớp positive (dương tính)

True Negatives (TN): Số lượng mẫu được dự đoán đúng là thuộc vào lớp negative (âm tính).

False Positives (FP): Số lượng mẫu được dự đoán sai là thuộc vào lớp positive (dương tính) trong khi thực tế chúng thuộc vào lớp negative (âm tính). Còn được gọi là lỗi loại 1 (Type I error).

False Negatives (FN): Số lượng mẫu được dự đoán sai là thuộc vào lớp negative (âm tính) trong khi thực tế chúng thuộc vào lớp positive (dương tính). Còn được gọi là lỗi loại 2 (Type II error).

Confusion Matrix giúp ta có cái nhìn tổng quan về hiệu suất của mô hình phân loại, từ đó có thể tính được các độ đo đánh giá khác như độ chính xác (accuracy), độ nhạy (sensitivity), độ đặc hiệu (specificity), và F1-score. Nó cũng hữu ích trong việc phát hiện các mẫu dự đoán sai và đánh giá khả năng của mô hình trong việc phân loại các lớp khác nhau.

blr_confusion_matrix(model, cutoff = 0.5)
## Confusion Matrix and Statistics 
## 
##           Reference
## Prediction    0    1
##          0 3920  352
##          1   84  165
## 
## 
##                 Accuracy : 0.9036 
##      No Information Rate : 0.8856 
## 
##                    Kappa : 0.3851 
## 
## McNemars's Test P-Value  : 0.0000 
## 
##              Sensitivity : 0.3191 
##              Specificity : 0.9790 
##           Pos Pred Value : 0.6627 
##           Neg Pred Value : 0.9176 
##               Prevalence : 0.1144 
##           Detection Rate : 0.0365 
##     Detection Prevalence : 0.0551 
##        Balanced Accuracy : 0.6491 
##                Precision : 0.6627 
##                   Recall : 0.3191 
## 
##         'Positive' Class : 1

Specificity : Tỉ lệ ước lượng chính xác cho dữ liệu là dữ liệu đối chứng

Sensitivity: Tỉ lệ ước lượng chính xác cho dữ liệu là dữ liệu thực nghiệm

Từ kết quả trên trên, ta đọc hiểu kiểm định như sau: Khi dữ liệu thực nghiệm thì chúng ta ước lượng chính xác 31.91%, Còn dữ liệu đối chứng thì chúng ta ước lượng chính xác 97.9%. ( Khi phân tích chúng ta nên cho độ chính xác > 70% để đảm bảo tin cậy cho kết quả hồi quy logistic.)

Trong một mô hình logistic tiêu chuẩn, khi ngưỡng giá trị càng cao thì độ nhạy sẽ giảm và độ đặc hiệu sẽ tăng. Khi ngưỡng giá trị giảm thì độ nhạy sẽ tăng vì nhiều sự kiện hơn sẽ được phát hiện. Tuy nhiên, độ đặc hiệu sẽ giảm đi vì nhiều sự kiện không xảy ra sẽ bị phân loại nhầm là sự kiến. Do đó, việc đạt được sự cân đối dựa trên yêu cầu là cần thiết. Ví dụ, nếu chúng ta muốn bắt được nhiều sự kiện nhất có thể và chấp nhận việc phân loại sai các sự kiện không xảy ra, thì chúng ta sẽ chọn giá trị ngưỡng thấp.

3.4.2 Kiểm định Hosmer Lemeshow

Kiểm định Hosmer – Lemeshow là một kiểm định thống kê về mức độ phù hợp đối với các mô hình hồi quy logistic . Nó được sử dụng thường xuyên trong các mô hình dự báo rủi ro . Kiểm tra đánh giá xem liệu tỷ lệ dữ liệu quan sát có khớp với tỷ lệ sự kiện dự kiến trong các nhóm con của quan sát của mô hình hay không.

Bài kiểm tra Hosmer – Lemeshow xác định cụ thể các nhóm con dưới dạng các phân đoạn của các giá trị rủi ro phù hợp. Các mô hình mà tỷ lệ sự kiện được mong đợi và quan sát được trong các nhóm con là tương tự nhau được gọi là đã được hiệu chỉnh tốt.

Tóm lại, Kiểm định Hosmer-Lemeshow (kiểm tra HL) là một kiểm tra phù hợp tốt cho hồi quy logistic, đặc biệt là đối với các mô hình dự báo rủi ro. Kiểm tra mức độ phù hợp cho bạn biết dữ liệu của bạn phù hợp với mô hình như thế nào. Cụ thể, kiểm tra HL tính toán xem tỷ lệ sự kiện quan sát được có khớp với tỷ lệ sự kiện dự kiến trong các phân nhóm dân số hay không.

blr_test_hosmer_lemeshow(model)
##            Partition for the Hosmer & Lemeshow Test            
## --------------------------------------------------------------
##                         def = 1                 def = 0        
## Group    Total    Observed    Expected    Observed    Expected 
## --------------------------------------------------------------
##   1       453        2          5.14        451        447.86  
##   2       452        3          8.63        449        443.37  
##   3       452        4         11.88        448        440.12  
##   4       452        7         15.29        445        436.71  
##   5       452        14        19.39        438        432.61  
##   6       452        10        24.97        442        427.03  
##   7       452        31        33.65        421        418.35  
##   8       452        62        49.74        390        402.26  
##   9       452       128        88.10        324        363.90  
##  10       452       256        260.21       196        191.79  
## --------------------------------------------------------------
## 
##      Goodness of Fit Test      
## ------------------------------
## Chi-Square    DF    Pr > ChiSq 
## ------------------------------
##  52.9942      8       0.0000   
## ------------------------------

Ta có Pvalue < 0.05 = > Dữ liệu mô hình không phù hợp với sự kiện

Song song với kiểm định Hosmer-Lemeshow, thì cũng có kiểm định của Pearson Chi2, kiểm định này cũng cho kết quả kiểm định tương tự nhưng khác tí về nội dung

3.4.3 Gains chart và Lift chart

Gain và Lift chart là công cụ trực quan hóa để đánh giá tính hiệu quả của mô hình bằng việc cho thấy tỷ lệ phản hổi của một nhóm nhất định (sử dụng mô hình) khác thế nào với một nhóm được chọn ngẫu nhiên (không sử dụng mô hình)

3.4.3.1 Bảng Gains

blr_gains_table(model)
##    decile total   1   0       ks  tp   tn   fp  fn sensitivity specificity
## 1       1   452 256 196 44.62134 256 3808  196 261    49.51644    95.10490
## 2       2   452 128 324 61.28765 384 3484  520 133    74.27466    87.01299
## 3       3   452  62 390 63.53965 446 3094  910  71    86.26692    77.27273
## 4       4   452  31 421 59.02130 477 2673 1331  40    92.26306    66.75824
## 5       5   452  10 442 49.91657 487 2231 1773  30    94.19729    55.71928
## 6       6   452  14 438 41.68544 501 1793 2211  16    96.90522    44.78022
## 7       7   452   7 445 31.92552 508 1348 2656   9    98.25919    33.66633
## 8       8   452   4 448 21.51040 512  900 3104   5    99.03288    22.47752
## 9       9   452   3 449 10.87689 515  451 3553   2    99.61315    11.26374
## 10     10   453   2 451  0.00000 517    0 4004   0   100.00000     0.00000
##    accuracy
## 1  89.89162
## 2  85.55629
## 3  78.30126
## 4  69.67485
## 5  60.11944
## 6  50.74099
## 7  41.05286
## 8  31.23203
## 9  21.36695
## 10 11.43552

3.4.3.2 Biểu đồ Lift

model %>%
    blr_gains_table() %>%
    plot()

Đối với 25% đầu tiên nếu sử dụng mô hình thì tỷ lệ phản hồi là 81.25%, ngược lại khi không sử dụng mô hình thì là 25%

3.4.4 Đường cong ROC

Đường cong ROC là một biểu đồ đồ họa của tính hợp lệ của các giá trị cắt cho một mô hình hồi quy logistic. Đường cong ROC được vẽ bằng cách sử dụng độ nhạy và đặc ificity cho tất cả các giá trị cắt có thể, tức là tất cả các điểm số xác suất. Biểu đồ được vẽ bằng cách sử dụng độ nhạy trên trục y và 1-đặc ificity trên trục x. Bất kỳ điểm nào trên đường cong ROC đại diện cho một đơn vị độ nhạy X (1-đặcificity) tương ứng với một giá trị cắt. Diện tích dưới đường cong ROC được sử dụng như một đơn vị xác nhận cho mô hình - diện tích càng lớn thì mô hình càng tốt.

model %>%
    blr_gains_table() %>%
  blr_roc_curve()

3.4.5 Biểu đồ KS

Thống kê KS lại là một đơn vị đo khả năng hiệu quả của mô hình và được tạo ra bằng cách sử dụng đường cong lift. Đường cong lift được tạo ra để vẽ % sự kiện. Nếu chúng ta cũng vẽ % không sự kiện trên cùng một tỷ lệ, với % dân số trên trục x, chúng ta sẽ có một đường cong khác. Khoảng cách lớn nhất giữa đường cong lift cho sự kiện và đường cong cho không sự kiện được gọi là KS. Đối với một mô hình tốt, KS nên lớn (>=0.3) và nên xảy ra càng gần tỷ lệ sự kiện càng tốt.

model %>%
    blr_gains_table() %>%
  blr_ks_chart()

3.4.6 Đường cong Lorenz

Đường cong Lorenz là một công cụ đồ họa đơn giản cho thấy mức độ bất bình đẳng trong phân phối biến cần quan tâm. Đây là một biểu đồ đồ họa mô tả tính bất bình đẳng được sử dụng để đo khả năng phân loại của mô hình dự đoán.

blr_lorenz_curve(model)

4 Chương 4: KẾT LUẬN

4.1 Ý nghĩa của hổi quy logistic

Hồi quy logistic thường được sử dụng đẻ hiểu mối quan hệ giữa một biến phụ thuộc và một hoặc nhiều biến độc lập. Các trường hợp sử dụng điển hình cho hồi quy logistic có kết quả có/không hoặc đạt/không đạt.

4.2 Ưu điểm của package

Hồi quy logistic dễ thực hiện, diễn giải và đào tạo. Kỹ thuật hồi quy logistic đã xuất hiện từ những năm 1970, vì vậy các nhà khoa học dữ liệu có thể dễ dàng sử dụng lại một triển khai mạnh mẽ từ các kho lưu trữ mã nguồn mở hoặc bất kỳ bộ công cụ thương mại nào.

Vì nó là một trong những thuật toán được sử dụng rộng rãi nhất trong học máy, nên việc huấn luyện dữ liệu với nó và thực hiện các công việc học máy khác trên đó cũng rất thuận tiện, chẳng hạn như triển khai nó, theo dõi hiệu suất mô hình và lặp lại trên nó.

5 Tài liệu tham khảo

[Moro et al., 2014] S. Moro, P. Cortez and P. Rita. A Data-Driven Approach to Predict the Success of Bank Telemarketing. Decision Support Systems, Elsevier, 62:22-31, June 2014

LS0tDQp0aXRsZTogJ1TDjE0gSEnhu4JVIFbhu4AgUEFDS0FHRSBCTE9SUiAnDQphdXRob3I6ICJOZ3V54buFbiBUaOG7iyBUaGFuaCBUcsO6YyAtIDIxMjEwMTM0NDMgJiBUcuG6p24gS2jDoW5oIFZ5IC0gMjEyMTAxMjY5MiAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSANCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCiFbXShpbWFnZXMvMzYzNTI2OTc5XzgzMjkzNTc1ODM1MTk2OV84NzI1ODE4NTc0MzQ5NDM2MjEzX24ucG5nKQ0KDQojICoqQ2jGsMahbmcgMToqKiAqKlBI4bqmTiBN4bueIMSQ4bqmVSoqDQoNCiMjIEzDvSBkbyBjaOG7jW4gxJHhu4EgdMOgaS4NCg0KVHJvbmcgcXXDoSB0csOsbmggcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdsOgIHjDonkgZOG7sW5nIG3DtCBow6xuaCB0cm9uZyBsxKluaCB24buxYyBraG9hIGjhu41jIGThu68gbGnhu4d1LCB2aeG7h2MgxJHDoW5oIGdpw6EgdMawxqFuZyBxdWFuIHbDoCDhuqNuaCBoxrDhu59uZyBnaeG7r2EgY8OhYyBiaeG6v24gbMOgIHLhuqV0IHF1YW4gdHLhu41uZy4gxJDhu4MgbMOgbSDEkWnhu4F1IG7DoHksIGNow7puZyB0YSB0aMaw4budbmcgY+G6p24gdGjhu7FjIGhp4buHbiBjw6FjIHBow6JuIHTDrWNoIHRo4buRbmcga8OqIG5oxrAgaOG7k2kgcXV5IGxvZ2lzdGljLCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBob+G6t2MgY8OhYyBwaMawxqFuZyBwaMOhcCBraMOhYyDEkeG7gyDEkW8gbMaw4budbmcgbeG7qWMgxJHhu5kgdMawxqFuZyBxdWFuIGdp4buvYSBiaeG6v24gcGjhu6UgdGh14buZYyB2w6AgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wLg0KDQpQYWNrYWdlIGJsb3JyIChCaS1EaXJlY3Rpb25hbCBMb2cgT2RkcyBSb2J1c3QgUmVncmVzc2lvbikgdHJvbmcgbmfDtG4gbmfhu68gbOG6rXAgdHLDrG5oIFIgbMOgIG3hu5l0IGPDtG5nIGPhu6UgbeG6oW5oIG3hur0gZ2nDunAgdGjhu7FjIGhp4buHbiBjw6FjIHBow6JuIHTDrWNoIG3hu5l0IGPDoWNoIGhp4buHdSBxdeG6oy4gTOG7sWEgY2jhu41uIMSR4buBIHTDoGkgbsOgeSBuaOG6sW0ga2jDoW0gcGjDoSB2w6AgdMOsbSBoaeG7g3Ugc8OidSB24buBIHTDrW5oIG7Eg25nIHbDoCBjw6FjaCBz4butIGThu6VuZyBj4bunYSBwYWNrYWdlLg0KDQpQYWNrYWdlIGJsb3JyIGN1bmcgY+G6pXAgY8OhYyBow6BtIHbDoCBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiB0acOqbiB0aeG6v24gY2hvIGjhu5NpIHF1eSBsb2dpc3RpYyB2w6AgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgsIGNobyBwaMOpcCBuZ8aw4budaSBkw7luZyDEkcOhbmggZ2nDoSB0xrDGoW5nIHF1YW4gdsOgIOG6o25oIGjGsOG7n25nIGdp4buvYSBjw6FjIGJp4bq/biBt4buZdCBjw6FjaCBsaW5oIGhv4bqhdCB2w6AgxJHDoW5nIHRpbiBj4bqteS4gTsOzIGN1bmcgY+G6pXAgY8OhYyB0w61uaCBuxINuZyBuaMawIMaw4bubYyBsxrDhu6NuZyBo4buHIHPhu5EgaOG7k2kgcXV5IGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBwaMawxqFuZyBwaMOhcCBib290c3RyYXAsIHTDrW5oIHRvw6FuIMSR4buZIHRpbiBj4bqteSwgdMOsbSBraeG6v20gbcO0IGjDrG5oIHThu5FpIMawdSwgdsOgIG5oaeG7gXUgaMahbiBu4buvYS4NCg0KQuG6sW5nIGPDoWNoIHTDrG0gaGnhu4N1IHbhu4EgcGFja2FnZSBibG9yciwgY2jDum5nIHRhIGPDsyB0aOG7gyBu4bqvbSB24buvbmcgY8OhYyBr4bu5IHRodeG6rXQgdsOgIHBoxrDGoW5nIHBow6FwIMSR4buDIMSRw6FuaCBnacOhIHbDoCBoaeG7g3UgcsO1IGjGoW4gduG7gSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uIHRyb25nIG3hu5l0IHThuq1wIGThu68gbGnhu4d1LiDEkGnhu4F1IG7DoHkgc+G6vSBnacO6cCBjaMO6bmcgdGEgxJHGsGEgcmEgbmjhu69uZyBwaMOibiB0w61jaCBjaMOtbmggeMOhYyBoxqFuIHbDoCDEkcawYSByYSBxdXnhur90IMSR4buLbmggZOG7sWEgdHLDqm4gY8ahIHPhu58gdGjDtG5nIHRpbiBjaMOtbmggeMOhYyB04burIGThu68gbGnhu4d1Lg0KDQpWaeG7h2MgbuG6r20gduG7r25nIHbDoCDDoXAgZOG7pW5nIHRow6BuaCB0aOG6oW8gcGFja2FnZSBibG9yciBz4bq9IGdpw7pwIGNow7puZyB0YSBsw6BtIHZp4buHYyBoaeG7h3UgcXXhuqMgduG7m2kgZOG7ryBsaeG7h3UgdsOgIMSRxrBhIHJhIG5o4buvbmcgcGjDom4gdMOtY2ggdGjhu5FuZyBrw6ogY2jhuqV0IGzGsOG7o25nIHRyb25nIGPDoWMgbMSpbmggduG7sWMgbmjGsCB5IGjhu41jLCBraW5oIHThur8sIHjDoyBo4buZaSBo4buNYywgdsOgIG5oaeG7gXUgbMSpbmggduG7sWMga2jDoWMuDQoNCiMjIE3hu6VjIHRpw6p1IG5naGnDqm4gY+G7qXUgxJHhu4EgdMOgaS4NCg0KVMOsbSBoaeG7g3UgduG7gSBsw70gdGh1eeG6v3QgdsOgIG5ndXnDqm4gbMO9IGhv4bqhdCDEkeG7mW5nIGPhu6dhIHBow6JuIHTDrWNoIGjhu5NpIHF1eSBsb2dpc3RpYyB2w6AgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdHJvbmcgbmfhu68gY+G6o25oIMSRw6FuaCBnacOhIHTGsMahbmcgcXVhbiB2w6Ag4bqjbmggaMaw4bufbmcgZ2nhu69hIGPDoWMgYmnhur9uLg0KDQpLaMOhbSBwaMOhIHbDoCBoaeG7g3UgcsO1IHbhu4EgcGFja2FnZSBibG9yciB0cm9uZyBuZ8O0biBuZ+G7ryBs4bqtcCB0csOsbmggUiwgYmFvIGfhu5NtIGPDoWNoIGPDoGkgxJHhurd0IHbDoCB0xrDGoW5nIHTDoWMgduG7m2kgcGFja2FnZS4NCg0KVMOsbSBoaeG7g3UgduG7gSBjw6FjIHTDrW5oIG7Eg25nIHbDoCBjaOG7qWMgbsSDbmcgY+G7p2EgcGFja2FnZSBibG9yciwgYmFvIGfhu5NtIHZp4buHYyDGsOG7m2MgbMaw4bujbmcgaOG7hyBz4buRIGjhu5NpIHF1eSwgdMOtbmggdG/DoW4gxJHhu5kgdGluIGPhuq15LCB0w6xtIGtp4bq/bSBtw7QgaMOsbmggdOG7kWkgxrB1IHbDoCBjw6FjIHBoxrDGoW5nIHBow6FwIGtow6FjIGxpw6puIHF1YW4gxJHhur9uIGJsb3JyLg0KDQrDgXAgZOG7pW5nIHBhY2thZ2UgYmxvcnIgdsOgbyBjw6FjIHThuq1wIGThu68gbGnhu4d1IHRo4buxYyB04bq/IMSR4buDIHRo4buxYyBoaeG7h24gcGjDom4gdMOtY2ggdMawxqFuZyBxdWFuIHbDoCDhuqNuaCBoxrDhu59uZyBnaeG7r2EgY8OhYyBiaeG6v24sIHbDoCDEkcOhbmggZ2nDoSBjaOG6pXQgbMaw4bujbmcgY+G7p2EgY8OhYyBr4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MuDQoNClNvIHPDoW5oIHbDoCDEkcOhbmggZ2nDoSBoaeG7h3Ugc3XhuqV0IHbDoCDGsHUgxJFp4buDbSBj4bunYSBwYWNrYWdlIGJsb3JyIHNvIHbhu5tpIGPDoWMgcGjGsMahbmcgcGjDoXAgdsOgIGPDtG5nIGPhu6UgcGjDom4gdMOtY2ggdMawxqFuZyB04buxIGtow6FjIGPDsyBz4bq1biB0cm9uZyBsxKluaCB24buxYy4NCg0KVHLDrG5oIGLDoHkga+G6v3QgcXXhuqMgdsOgIHTDoGkgbGnhu4d1IGjGsOG7m25nIGThuqtuIHPhu60gZOG7pW5nIHBhY2thZ2UgYmxvcnIgxJHhu4MgY2hpYSBz4bq7IGtp4bq/biB0aOG7qWMgdsOgIGtpbmggbmdoaeG7h20gduG7m2kgY+G7mW5nIMSR4buTbmcgbmfGsOG7nWkgZMO5bmcgUiB2w6AgY8OhYyBuaMOgIG5naGnDqm4gY+G7qXUgcXVhbiB0w6JtIMSR4bq/biBwaMOibiB0w61jaCBk4buvIGxp4buHdSB2w6AgbcO0IGjDrG5oIGjDs2EuDQoNCk3hu6VjIHRpw6p1IG5naGnDqm4gY+G7qXUgbsOgeSBuaOG6sW0gxJHhuqF0IMSRxrDhu6NjIHPhu7EgaGnhu4N1IHLDtSB2w6Ag4bupbmcgZOG7pW5nIHRow6BuaCB0aOG6oW8gY+G7p2EgcGFja2FnZSBibG9yciB0cm9uZyB2aeG7h2MgxJHDoW5oIGdpw6EgdMawxqFuZyBxdWFuIHbDoCDhuqNuaCBoxrDhu59uZyBnaeG7r2EgY8OhYyBiaeG6v24gdHJvbmcgZOG7ryBsaeG7h3UuIEvhur90IHF14bqjIHThu6sgbmdoacOqbiBj4bupdSBz4bq9IGdpw7pwIG7Dom5nIGNhbyBraOG6oyBuxINuZyBwaMOibiB0w61jaCB2w6AgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIGThu7FhIHRyw6puIGPGoSBz4bufIHRow7RuZyB0aW4gY2jDrW5oIHjDoWMgdOG7qyBk4buvIGxp4buHdS4NCg0KIyMgxJDhu5FpIHTGsOG7o25nIHbDoCBwaOG6oW0gdmkgbmdoacOqbiBj4bupdS4NCg0KxJDhu5FpIHTGsOG7o25nIG5naGllbiBj4bupdTogUGFja2FnZSBibG9yciDEkcaw4bujYyBwaMOhdCB0cmnhu4NuIMSR4buDIGjhu5cgdHLhu6MgdHJvbmcgdmnhu4djIHBow6JuIHTDrWNoIHTGsMahbmcgcXVhbiB2w6Ag4bqjbmggaMaw4bufbmcgZ2nhu69hIGPDoWMgYmnhur9uIHRyb25nIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyB2w6AgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmguIERvIMSRw7MsIMSR4buRaSB0xrDhu6NuZyBuZ2hpw6puIGPhu6l1IGPhu6dhIHBhY2thZ2UgYmxvcnIgYmFvIGfhu5NtIGPDoWMgbmjDoCBuZ2hpw6puIGPhu6l1LCBuaMOgIHBow6JuIHTDrWNoIGThu68gbGnhu4d1LCB2w6AgY8OhYyBjaHV5w6puIGdpYSB0cm9uZyBsxKluaCB24buxYyBraG9hIGjhu41jIGThu68gbGnhu4d1LCB5IGjhu41jLCBraW5oIHThur8sIHjDoyBo4buZaSBo4buNYyB2w6AgY8OhYyBsxKluaCB24buxYyBsacOqbiBxdWFuIMSR4bq/biBwaMOibiB0w61jaCBk4buvIGxp4buHdSB2w6AgbcO0IGjDrG5oIGjDs2EuDQoNClBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1Og0KDQotICAgxJDDoW5oIGdpw6EgdMawxqFuZyBxdWFuOiBQYWNrYWdlIGJsb3JyIGN1bmcgY+G6pXAgY8OhYyBjw7RuZyBj4bulIHbDoCBwaMawxqFuZyBwaMOhcCDEkeG7gyDEkcOhbmggZ2nDoSBt4buRaSBxdWFuIGjhu4cgdMawxqFuZyBxdWFuIGdp4buvYSBiaeG6v24gcGjhu6UgdGh14buZYyB2w6AgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wLiBDw6FjIHBoxrDGoW5nIHBow6FwIG7DoHkgY8OzIHRo4buDIMOhcCBk4bulbmcgdHJvbmcgbmhp4buBdSBsxKluaCB24buxYywgYmFvIGfhu5NtIHBow6JuIHTDrWNoIHkgdOG6vywgdMOgaSBjaMOtbmgsIG1hcmtldGluZyB2w6Aga2hvYSBo4buNYyB4w6MgaOG7mWkuDQoNCi0gICDhuqJuaCBoxrDhu59uZyBnaeG7r2EgY8OhYyBiaeG6v246IFBhY2thZ2UgYmxvcnIgY2hvIHBow6lwIHjDoWMgxJHhu4tuaCDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgbMOqbiBiaeG6v24gcGjhu6UgdGh14buZYyB0cm9uZyBtw7QgaMOsbmggaOG7k2kgcXV5LiDEkGnhu4F1IG7DoHkgZ2nDunAgaGnhu4N1IHLDtSBoxqFuIHbhu4Egc+G7sSDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhu5ljIGzhuq1wIMSR4buRaSB24bubaSBiaeG6v24gcGjhu6UgdGh14buZYywgdsOgIGPDsyB0aOG7gyDDoXAgZOG7pW5nIHRyb25nIHZp4buHYyDEkcawYSByYSBxdXnhur90IMSR4buLbmggdsOgIGThu7EgYsOhby4NCg0KLSAgIFBow6JuIHTDrWNoIGjhu5NpIHF1eSByb2J1c3Q6IFBhY2thZ2UgYmxvcnIgY3VuZyBj4bqlcCBjw6FjIHBoxrDGoW5nIHBow6FwIGjhu5NpIHF1eSByb2J1c3QsIMSR4bqjbSBi4bqjbyB0w61uaCBjaMOtbmggeMOhYyB2w6AgxJHhu5kgdGluIGPhuq15IGPhu6dhIMaw4bubYyBsxrDhu6NuZyB0cm9uZyB0csaw4budbmcgaOG7o3AgZOG7ryBsaeG7h3UgYuG7iyBuaGnhu4V1IGhv4bq3YyBraMO0bmcgdHXDom4gdGhlbyBjw6FjIGdp4bqjIMSR4buLbmggaOG7k2kgcXV5IHRow7RuZyB0aMaw4budbmcuIMSQaeG7gXUgbsOgeSBnacO6cCBuZ2hpw6puIGPhu6l1IGPDsyB0aOG7gyB44butIGzDvSBjw6FjIHbhuqVuIMSR4buBIHbhu4EgZOG7ryBsaeG7h3Uga2jDtG5nIMSR4buTbmcgbmjhuqV0IHbDoCDEkeG6oXQgxJHGsOG7o2Mga+G6v3QgcXXhuqMgxJHDoW5nIHRpbiBj4bqteS4NCg0KLSAgIFTDrG0ga2nhur9tIG3DtCBow6xuaCB04buRaSDGsHU6IFBhY2thZ2UgYmxvcnIgY3VuZyBj4bqlcCBjw6FjIHBoxrDGoW5nIHBow6FwIHTDrG0ga2nhur9tIG3DtCBow6xuaCB04buRaSDGsHUsIGdpw7pwIHTDrG0gcmEgbcO0IGjDrG5oIGjhu5NpIHF1eSB04buRdCBuaOG6pXQgZOG7sWEgdHLDqm4gZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBjaG8gcGjDqXAgbmfGsOG7nWkgZMO5bmcgdGjhu60gbmdoaeG7h20gdsOgIHNvIHPDoW5oIGPDoWMgbcO0IGjDrG5oIGtow6FjIG5oYXUgxJHhu4MgxJHGsGEgcmEgbmjhu69uZyBwaMOibiB0w61jaCBjaMOtbmggeMOhYyB2w6AgY8OzIGhp4buHdSBzdeG6pXQgY2FvLg0KDQpQaOG6oW0gdmkgbmdoacOqbiBj4bupdSBj4bunYSBwYWNrYWdlIGJsb3JyIHLhuqV0IGjhu691IMOtY2ggdsOgIGPDsyB0aOG7gyDEkcaw4bujYyDDoXAgZOG7pW5nIHRyb25nIG5oaeG7gXUgbMSpbmggduG7sWMgbmdoacOqbiBj4bupdSB2w6Ag4bupbmcgZOG7pW5nIHRo4buxYyB04bq/LCBnacO6cCB0xINuZyBjxrDhu51uZyBraOG6oyBuxINuZyBwaMOibiB0w61jaCBk4buvIGxp4buHdSB2w6AgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIGThu7FhIHRyw6puIHRow7RuZyB0aW4gY2jDrW5oIHjDoWMgdOG7qyBk4buvIGxp4buHdS4NCg0KIyMgUGjGsMahbmcgcGjDoXAgbmdoacOqbiBj4bupdS4NCg0KUGjGsMahbmcgcGjDoXAgbmdoacOqbiBj4bupdSB24buBIHBhY2thZ2UgQmxvcnIgY+G7p2EgY2jFqW5nIHTDtGkgbmjGsCBzYXU6DQoNCi0gICBUw6xtIGhp4buDdSB24buBIGzDvSB0aHV54bq/dDogxJDhuqd1IHRpw6puLCBuZ2hpw6puIGPhu6l1IGPhuqduIHTDrG0gaGnhu4N1IHbDoCBu4bqvbSB24buvbmcgbMO9IHRodXnhur90IHbhu4EgcGjDom4gdMOtY2ggaOG7k2kgcXV5IGxvZ2lzdGljLCBo4buTaSBxdXkgdHV54bq/biB0w61uaCwgdsOgIGPDoWMga2jDoWkgbmnhu4dtIGxpw6puIHF1YW4gxJHhur9uIHTGsMahbmcgcXVhbiB2w6Ag4bqjbmggaMaw4bufbmcgZ2nhu69hIGPDoWMgYmnhur9uLiDEkGnhu4F1IG7DoHkgYmFvIGfhu5NtIHZp4buHYyDEkeG7jWMgY8OhYyB0w6BpIGxp4buHdSwgc8OhY2ggdsOgIGLDoGkgYsOhbyBjw7MgbGnDqm4gcXVhbiDEkeG7gyBoaeG7g3UgcsO1IGPGoSBi4bqjbiB24buBIGPDoWMgcGjGsMahbmcgcGjDoXAgdsOgIHRodeG6rXQgdG/DoW4gxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgcGFja2FnZSBibG9yci4NCg0KLSAgIEtow6FtIHBow6EgcGFja2FnZSBibG9ycjogVGnhur9wIHRoZW8sIG5naGnDqm4gY+G7qXUgY+G6p24ga2jDoW0gcGjDoSBwYWNrYWdlIGJsb3JyIHbDoCBoaeG7g3UgduG7gSBjw6FjaCBjw6BpIMSR4bq3dCB2w6AgdMawxqFuZyB0w6FjIHbhu5tpIHBhY2thZ2UgdHJvbmcgbcO0aSB0csaw4budbmcgUi4gxJBp4buBdSBuw6B5IGJhbyBn4buTbSB2aeG7h2MgxJHhu41jIHTDoGkgbGnhu4d1IGjGsOG7m25nIGThuqtuLCB2w60gZOG7pSB2w6AgdMOgaSBsaeG7h3UgdGhhbSBraOG6o28gdOG7qyB0w6FjIGdp4bqjIHBhY2thZ2UgYmxvcnIuDQoNCi0gICDDgXAgZOG7pW5nIHBhY2thZ2UgYmxvcnI6IFNhdSBraGkgbuG6r20gduG7r25nIGPDoWNoIHPhu60gZOG7pW5nIHBhY2thZ2UgYmxvcnIsIG5naGnDqm4gY+G7qXUgY8OzIHRo4buDIMOhcCBk4bulbmcgcGFja2FnZSBuw6B5IHbDoG8gY8OhYyB04bqtcCBk4buvIGxp4buHdSB0aOG7sWMgdOG6vy4gQuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGPDoWMgaMOgbSB2w6AgcGjGsMahbmcgcGjDoXAgdHJvbmcgcGFja2FnZSBibG9yciwgbmdoacOqbiBj4bupdSBjw7MgdGjhu4MgdGjhu7FjIGhp4buHbiBwaMOibiB0w61jaCB0xrDGoW5nIHF1YW4gdsOgIOG6o25oIGjGsOG7n25nIGdp4buvYSBjw6FjIGJp4bq/biB2w6AgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGPhu6dhIGPDoWMga+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjLg0KDQotICAgU28gc8OhbmggdsOgIMSRw6FuaCBnacOhOiBUaeG6v3AgdGhlbywgbmdoacOqbiBj4bupdSBjw7MgdGjhu4Mgc28gc8OhbmggdsOgIMSRw6FuaCBnacOhIGhp4buHdSBzdeG6pXQgdsOgIMawdSDEkWnhu4NtIGPhu6dhIHBhY2thZ2UgYmxvcnIgc28gduG7m2kgY8OhYyBwaMawxqFuZyBwaMOhcCB2w6AgY8O0bmcgY+G7pSBwaMOibiB0w61jaCB0xrDGoW5nIHThu7Ega2jDoWMgY8OzIHPhurVuIHRyb25nIGzEqW5oIHbhu7FjLiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIGJhbyBn4buTbSBzbyBzw6FuaCB24bubaSBjw6FjIHBoxrDGoW5nIHBow6FwIGjhu5NpIHF1eSB0cnV54buBbiB0aOG7kW5nLCBwaMOibiB0w61jaCB0xrDGoW5nIHF1YW4ga2jDoWMgdsOgIGPDoWMgcGFja2FnZSBSIGtow6FjLg0KDQotICAgVHLDrG5oIGLDoHkga+G6v3QgcXXhuqM6IEN14buRaSBjw7luZywgbmdoacOqbiBj4bupdSBj4bqnbiB0csOsbmggYsOgeSBr4bq/dCBxdeG6oyB2w6AgdMOgaSBsaeG7h3UgaMaw4bubbmcgZOG6q24gc+G7rSBk4bulbmcgcGFja2FnZSBibG9yciDEkeG7gyBjaGlhIHPhursga2nhur9uIHRo4bupYyB2w6Aga2luaCBuZ2hp4buHbSB24bubaSBj4buZbmcgxJHhu5NuZyBuZ8aw4budaSBkw7luZyBSIHbDoCBjw6FjIG5ow6AgbmdoacOqbiBj4bupdSBxdWFuIHTDom0gxJHhur9uIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IHbDoCBtw7QgaMOsbmggaMOzYS4gQ8OhYyBr4bq/dCBxdeG6oyBjw7MgdGjhu4MgxJHGsOG7o2MgdHLDrG5oIGLDoHkgdHJvbmcgYsOgaSB2aeG6v3QsIGLDoW8gY8OhbyBob+G6t2MgdMOgaSBsaeG7h3UgdGhhbSBraOG6o28ga2jDoWMuDQoNCiMgKipDaMawxqFuZyAyOioqICoqTMOdIFRIVVnhur5UKioNCg0KIyMgR2nhu5tpIHRoaeG7h3UgduG7gSBwYWNrYWdlIEJsb3JyLg0KDQojIyMgS2jDoWkgbmnhu4dtLg0KDQpCbG9yciBsw6AgQ8O0bmcgY+G7pSDEkeG7gyBwaMOhdCB0cmnhu4NuIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBuaOG7iyBwaMOibi4gQ8OhYyBjw7RuZyBj4bulIMSRxrDhu6NjIHRoaeG6v3Qga+G6vyDEkeG7gyBnacO6cCBuZ8aw4budaSBkw7luZyBt4bubaSBi4bqvdCDEkeG6p3UgdsOgIG5nxrDhu51pIGTDuW5nIHRydW5nIGPhuqVwIGThu4UgZMOgbmcgeMOieSBk4buxbmcgdsOgIHjDoWMgdGjhu7FjIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBuaOG7iyBwaMOibi4gQmFvIGfhu5NtIHBow6JuIHTDrWNoIGhhaSBiaeG6v24sIMSR4bqndSByYSBo4buTaSBxdXkgdG/DoG4gZGnhu4duLCB0aOG7kW5nIGvDqiBwaMO5IGjhu6NwIHbhu5tpIG3DtCBow6xuaCwgcXV5IHRyw6xuaCBs4buxYSBjaOG7jW4gYmnhur9uLCBr4bu5IHRodeG6rXQgeMOhYyB0aOG7sWMgbcO0IGjDrG5oIHbDoCDhu6luZyBk4bulbmcgJ3PDoW5nIGLDs25nJyDEkeG7gyB4w6J5IGThu7FuZyBtw7QgaMOsbmggdMawxqFuZyB0w6FjLiBOw7MgdOG6rXAgdHJ1bmcgdsOgbyB2aeG7h2MgZ2nhuqNpIHRow61jaCB2w6AgxJHDoW5oIGdpw6EgbcO0IGjDrG5oLCBjdW5nIGPhuqVwIGPDoWMgcGjGsMahbmcgcGjDoXAgxJHhu4tuaCByw7UgaOG7hyBz4buRIOG6o25oIGjGsOG7n25nLCBraeG7g20gxJHhu4tuaCB2w6AgdHLhu7FjIHF1YW4gaMOzYSBr4bq/dCBxdeG6oy4NCg0KIyMjIEJpdmFyaWF0ZQ0KDQpQaMOibiB0w61jaCBzb25nIHNvbmcgKGJpdmFyaWF0ZSBhbmFseXNpcykgbMOgIHF1w6EgdHLDrG5oIG5naGnDqm4gY+G7qXUgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIHRyb25nIG3hu5l0IHThuq1wIGThu68gbGnhu4d1LiBOw7MgdOG6rXAgdHJ1bmcgdsOgbyB2aeG7h2MgeGVtIHjDqXQgc+G7sSB0xrDGoW5nIHF1YW4gaG/hurdjIHPhu7EgbGnDqm4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/biB2w6AgZ2nDunAgaGnhu4N1IHLDtSBoxqFuIHbhu4EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjaMO6bmcuIFBow6JuIHTDrWNoIHNvbmcgc29uZyB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHTGsMahbmcgcXVhbiBnaeG7r2EgY8OhYyBiaeG6v24sIHjDoWMgxJHhu4tuaCBz4buxIOG6o25oIGjGsOG7n25nIGPhu6dhIG3hu5l0IGJp4bq/biDEkeG6v24gYmnhur9uIGtow6FjIHbDoCB0w6xtIHJhIG3huqt1IGhheSB4dSBoxrDhu5tuZyB0cm9uZyBk4buvIGxp4buHdS4gS+G6v3QgcXXhuqMgY+G7p2EgcGjDom4gdMOtY2ggc29uZyBzb25nIHRoxrDhu51uZyDEkcaw4bujYyB0csOsbmggYsOgeSBkxrDhu5tpIGThuqFuZyBi4bqjbmcsIMSR4buTIHRo4buLIGhv4bq3YyBjw6FjIGNo4buJIHPhu5EgdGjhu5FuZyBrw6ouDQoNCiMjIyBI4buTaSBxdXkgTG9naXN0aWMgbMOgIGfDrCA/DQoNCkjhu5NpIHF1eSBsb2dpc3RpYyBsw6AgcXXDoSB0csOsbmggbcO0IGjDrG5oIGjDs2EgeMOhYyBzdeG6pXQgY+G7p2EgbeG7mXQga+G6v3QgcXXhuqMgY+G7pSB0aOG7gyBjaG8gY8OhYyBiaeG6v24gxJHhuqd1IHbDoG8uIEPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBwaOG7lSBiaeG6v24gbmjhuqV0IHThuqFvIHJhIG3hu5l0IGvhur90IHF14bqjIG5o4buLIHBow6JuIGPDsyB0aOG7gyBuaOG6rW4gaGFpIGdpw6EgdHLhu4sgbmjGsCBsw6BuaCBt4bqhbmggLyBraMO0bmcgbMOgbmggbeG6oW5oLCBjw7MgLyBraMO0bmcsIMSRw7puZyAvIHNhaSwgdi52LiBI4buTaSBxdXkgbG9naXN0aWMgxJFhIHRo4bupYyBjw7MgdGjhu4MgbcO0IGjDrG5oIGjDs2Egbmhp4buBdSBoxqFuIGhhaSBr4bq/dCBxdeG6oyBjw7MgdGjhu4MgY8OzLg0KDQojIyMgU+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIGjhu5NpIHF1eSBsb2dpc3RpYyB2w6AgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggbMOgIGfDrD8NCg0KSOG7k2kgcXV5IGxvZ2lzdGljIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGzhuqV5IGdpw6EgdHLhu4sgY+G7p2EgbeG7mXQgYmnhur9uIHBo4bulIHRodeG7mWMgduG7m2kga+G6v3QgcXXhuqMgbmjhu4sgcGjDom4uIEjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGPFqW5nIGPDsyBt4buZdCBiaeG6v24gcGjhu6UgdGh14buZYyB2w6Aga+G6v3QgcXXhuqMgY8OzIHRo4buDIHBo4bulIHRodeG7mWMgdsOgbyBt4buZdCBob+G6t2Mgbmhp4buBdSBiaeG6v24gxJHhu5ljIGzhuq1wLg0KDQpOaMawbmcgc+G7sSBraMOhYyBiaeG7h3QgY2jDrW5oIGzDoCBr4bq/dCBxdeG6oyB0aMaw4budbmcgbMOgIG3hu5l0IGxv4bqhdCBjw6FjIGdpw6EgdHLhu4suIE3hu5l0IHRyxrDhu51uZyBo4bujcCBz4butIGThu6VuZyB2w60gZOG7pSBj4bunYSBo4buTaSBxdXkgdHV54bq/biB0w61uaCBsw6AgZOG7sSDEkW/DoW4gbeG7mXQgbG/huqF0IGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyB0xrDGoW5nIGxhaSBj4bunYSBt4buZdCBiaeG6v24gdHJvbmcgbeG7mXQgcGjhuqFtIHZpIGThu7FhIHRyw6puIG3hu5l0IHBo4bqhbSB2aSBj4bunYSAoY8OhYykgYmnhur9uIMSR4buZYyBs4bqtcCDEkeG6p3UgdsOgby4gTmfGsOG7nWkgdGEgdGjGsOG7nW5nIHPhu60gZOG7pW5nIGJp4buDdSDEkeG7kyDEkeG7gyBiaeG7g3UgZGnhu4VuIGPDoWMgZOG7sSDEkW/DoW4gYuG6sW5nIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oDQoNCiMjIyBN4buZdCBz4buRIGjDoG0gY+G7p2EgcGFja2FnZSBCbG9yciANCg0KR8OzaSAiYmxvcnIiIGN1bmcgY+G6pXAgbmhp4buBdSBow6BtIMSR4buDIHRo4buxYyBoaeG7h24gcGjDom4gdMOtY2ggxJFhIGJp4bq/biB2w6Aga2jhuqNvIHPDoXQgZOG7ryBsaeG7h3UuIFNhdSDEkcOieSBsw6AgbeG7mXQgc+G7kSBow6BtIHF1YW4gdHLhu41uZyB0cm9uZyBnw7NpICJibG9yciI6DQoNCjEuIGBibG9ycihkYXRhKWA6IFTDrW5oIHRvw6FuIG1hIHRy4bqtbiB0xrDGoW5nIHF1YW4gZ2nhu69hIGPDoWMgYmnhur9uIHRyb25nIHThuq1wIGThu68gbGnhu4d1Lg0KDQoyLiBgYmxvcnJfc3VtbWFyeShkYXRhKWA6IFTDrW5oIHRvw6FuIGPDoWMgZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBtw7QgdOG6oyBjaG8gY8OhYyBiaeG6v24gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UsIGJhbyBn4buTbSBjw6FjIGNo4buJIHPhu5EgdMaw4budbmcgbWluaCB2w6Ag4bqpbiBj4bunYSBwaMOibiBwaOG7kWksIGPDoWMgZ2nDoSB0cuG7iyBj4buxYyDEkeG6oWkgdsOgIGPhu7FjIHRp4buDdSwgdsOgIGPDoWMgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCB2w6AgdHJ1bmcgduG7iyBj4bunYSBjw6FjIGJp4bq/bi4NCg0KMy4gYGJsb3JyX211bHRpdmFyKGRhdGEpYDogVMOtbmggdG/DoW4gY8OhYyBjaOG7iSBz4buRIGto4bqjbyBzw6F0IMSRYSBiaeG6v24sIGJhbyBn4buTbSBjw6FjIGNo4buJIHPhu5EgcGjDom4ga+G7sywgcGjDom4gdMOhbiwgdsOgIMSR4buZIGzhu4djaCBjaHXhuqluIGPhu6dhIGPDoWMgYmnhur9uLg0KDQo0LiBgYmxvcnJfcGxvdChkYXRhKWA6IFThuqFvIHJhIGPDoWMgYmnhu4N1IMSR4buTIMSR4buDIHRy4buxYyBxdWFuIGjDs2EgZOG7ryBsaeG7h3UsIGJhbyBn4buTbSBjw6FjIGJp4buDdSDEkeG7kyB0xrDGoW5nIHF1YW4gdsOgIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0uDQoNCjUuIGBibG9ycl9jaGVja19ub3JtYWxpdHkoZGF0YSlgOiBLaeG7g20gdHJhIHTDrW5oIHBow6JuIHBo4buRaSBj4bunYSBk4buvIGxp4buHdS4NCg0KNi4gYGJsb3JyX2NoZWNrX2hvbW9nZW5laXR5KGRhdGEpYDogS2nhu4NtIHRyYSB0w61uaCDEkeG7k25nIG5o4bqldCBj4bunYSBjw6FjIGJp4bq/bi4NCg0KNy4gYGJsb3JyX2NoZWNrX2NvcnJlbGF0aW9uKGRhdGEpYDogS2nhu4NtIHRyYSB0w61uaCB0xrDGoW5nIHF1YW4gZ2nhu69hIGPDoWMgYmnhur9uLg0KDQpDw6FjIGjDoG0gdHJvbmcgZ8OzaSAiYmxvcnIiIMSRxrDhu6NjIHRoaeG6v3Qga+G6vyDEkeG7gyBnacO6cCBi4bqhbiBraOG6o28gc8OhdCB2w6AgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgbeG7mXQgY8OhY2ggdG/DoG4gZGnhu4duLCB04burIHZp4buHYyB0w61uaCB0b8OhbiBjw6FjIGNo4buJIHPhu5EgdGjhu5FuZyBrw6ogbcO0IHThuqMgxJHhur9uIHZp4buHYyB0cuG7sWMgcXVhbiBow7NhIGThu68gbGnhu4d1IHbDoCBraeG7g20gdHJhIHTDrW5oIHBow6JuIHBo4buRaSwgxJHhu5NuZyBuaOG6pXQgdsOgIHTGsMahbmcgcXVhbiBj4bunYSBjw6FjIGJp4bq/bi4NCg0KIyMjIE3hu5l0IHPhu5EgdMOtbmggbsSDbmcgY2jDrW5oIGPhu6dhIHBhY2thZ2UgQmxvcnIuDQoNCk3hu5l0IHPhu5EgdMOtbmggbsSDbmcgY2jDrW5oIGPhu6dhIHBhY2thZ2UgQmxvcnIgYmFvIGfhu5NtOg0KDQotICAgWMOhYyDEkeG7i25oIGjhu4cgc+G7kSDhuqNuaCBoxrDhu59uZzogR8OzaSAiYmxvcnIiIGNobyBwaMOpcCBi4bqhbiB4w6FjIMSR4buLbmggaOG7hyBz4buRIOG6o25oIGjGsOG7n25nIGPhu6dhIGPDoWMgYmnhur9uIMSR4bqndSB2w6BvIMSR4buRaSB24bubaSBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljLg0KDQotICAgS2nhu4NtIMSR4buLbmggdsOgIGdp4bqjIMSR4buLbmg6IEfDs2kgbsOgeSBjdW5nIGPhuqVwIGPDoWMgcGjGsMahbmcgcGjDoXAga2nhu4NtIMSR4buLbmggdsOgIGdp4bqjIMSR4buLbmggxJHhu4MgxJHDoW5oIGdpw6EgdMOtbmggcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggdsOgIGdp4bqjIMSR4buLbmggduG7gSBk4buvIGxp4buHdS4NCg0KLSAgIFRy4buxYyBxdWFuIGjDs2Ega+G6v3QgcXXhuqM6IEfDs2kgImJsb3JyIiBjdW5nIGPhuqVwIGPDoWMgY8O0bmcgY+G7pSDEkeG7gyB0cuG7sWMgcXVhbiBow7NhIGvhur90IHF14bqjIHThu6sgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYywgYmFvIGfhu5NtIMSR4buTIHRo4buLIFJPQyB2w6AgxJHhu5MgdGjhu4sgxJHGsOG7nW5nIGNvbmcgaOG7k2kgcXV5Lg0KDQpHw7NpIGJsb3JyIGN1bmcgY+G6pXAgY8OhYyBjw7RuZyBj4bulIMSR4buDIHjDonkgZOG7sW5nIHbDoCB4w6FjIHRo4buxYyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgbmjhu4sgcGjDom4uIE7DsyBwaMO5IGjhu6NwIG5o4bqldCBjaG8gbmfGsOG7nWkgZMO5bmcgUiBt4bubaSBi4bqvdCDEkeG6p3UvdHJ1bmcgY+G6pXAgdsOgIG5o4buvbmcgbmfGsOG7nWkgZOG6oXkgdGjhu5FuZyBrw6ogc+G7rSBk4bulbmcgUi4gQVBJIHLhuqV0IMSRxqFuIGdp4bqjbiB2w6AgaOG6p3UgaOG6v3QgY8OhYyBow6BtIGzhuqV5IGEgLyBkYXRhLmZyYW1lIGhv4bq3YyB0aWJibGVhIG1vZGVsIGzDoG0gxJHhuqd1IHbDoG8uIGJsb3JyIHPhu60gZOG7pW5nIHRp4buBbiB04buRIG5o4bqldCBxdcOhbiBibHJcXyDEkeG7gyBob8OgbiB0aMOgbmggdGFiIGThu4UgZMOgbmcuDQoNCiMgKipDaMawxqFuZyAzOioqICoqVEjhu7BDIEjDgE5IKioNCg0KIyMgQ8OgaSDEkeG6t3QgcGFja2FnZSBibG9yci4NCg0KYGBge3IsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KaW5zdGFsbC5wYWNrYWdlcygnYmxvcnInLCByZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIikNCmluc3RhbGwucGFja2FnZXMoImRwbHlyIixyZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIikgDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShibG9ycikNCmBgYA0KDQojIyBHaeG7m2kgdGhp4buHdSB2w6AgY8OgaSDEkeG6t3QgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQpkYXRhKCJiYW5rX21hcmtldGluZyIpDQpoZWFkKGJhbmtfbWFya2V0aW5nKQ0KYGBgDQoNCsSQ4buDIGNo4bupbmcgbWluaCBjw6FjIHTDrW5oIG7Eg25nIGPhu6dhIGJsb3JyLCBjaMO6bmcgdMO0aSBz4bq9IHPhu60gZOG7pW5nIGLhu5kgZOG7ryBsaeG7h3UgdGnhur9wIHRo4buLIGPhu6dhIG5nw6JuIGjDoG5nLiBE4buvIGxp4buHdSBjw7MgbGnDqm4gcXVhbiDEkeG6v24gY8OhYyBjaGnhur9uIGThu4tjaCB0aeG6v3AgdGjhu4sgdHLhu7FjIHRp4bq/cCBj4bunYSBt4buZdCB04buVIGNo4bupYyBuZ8OibiBow6BuZyBC4buTIMSQw6BvIE5oYS4gQ8OhYyBjaGnhur9uIGThu4tjaCB0aeG6v3AgdGjhu4sgxJHGsOG7o2MgZOG7sWEgdHLDqm4gY8OhYyBjdeG7mWMgZ+G7jWkgxJFp4buHbiB0aG/huqFpLiBUaMO0bmcgdGjGsOG7nW5nLCBj4bqnbiBjw7Mgbmhp4buBdSBoxqFuIG3hu5l0IGzhuqduIGxpw6puIGjhu4cgduG7m2kgY8O5bmcgbeG7mXQga2jDoWNoIGjDoG5nIMSR4buDIHRydXkgY+G6rXAgeGVtIHPhuqNuIHBo4bqpbSAodGnhu4FuIGfhu61pIGPDsyBr4buzIGjhuqFuIG5nw6JuIGjDoG5nKSBz4bq9IMSRxrDhu6NjIMSRxINuZyBrw70gY8OzICgnWWVzJykgaGF5IGtow7RuZyAoJ05vJykuDQoNCiJiYW5rX21hcmtldGluZyIgbMOgIG3hu5l0IHRpYmJsZSB24bubaSA0NTIxIHF1YW4gc8OhdCB2w6AgMTcgYmnhur9uIGfhu5NtOg0KDQotICAgYWdlOiDEkOG7mSB0deG7lWkgY+G7p2Ega2jDoWNoIGjDoG5nDQoNCi0gICBqb2I6IGxv4bqhaSBjw7RuZyB2aeG7h2MNCg0KLSAgIG1hcml0YWw6IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibg0KDQotICAgZWR1Y2F0aW9uOiB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2Ega2jDoWNoIGjDoG5nDQoNCi0gICBkZWZhdWx0OiBjw7MgdMOtbiBk4bulbmcgdHJvbmcgduG7oSBu4bujPw0KDQotICAgaG91c2luZzogY8OzIGNobyB2YXkgbmjDoCDhu58/DQoNCi0gICBsb2FuOiBjw7Mga2hv4bqjbiB2YXkgY8OhIG5ow6JuPw0KDQotICAgY29udGFjdDogbGnDqm4gbOG6oWMgbG/huqFpIGxpw6puIGzhuqFjDQoNCi0gICBtb250aDogbGnDqm4gaOG7hyBjdeG7kWkgdGjDoW5nIHRyb25nIG7Eg20NCg0KLSAgIGRheV9vZl93ZWVrOiBuZ8OgeSBsacOqbiBo4buHIGN14buRaSBjw7luZyB0cm9uZyB0deG6p24NCg0KLSAgIGR1cmF0aW9uOiB0aOG7nWkgbMaw4bujbmcgbGnDqm4gaOG7hyBjdeG7kWkgY8O5bmcsIHTDrW5oIGLhurFuZyBnacOieSBz4buRIGzGsOG7o25nIMSR4buLYSBjaOG7iSBsacOqbiBo4buHIGPhu6dhIGNoaeG6v24gZOG7i2NoIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gdHJvbmcgY2hp4bq/biBk4buLY2ggbsOgeSB2w6AgY2hvIGtow6FjaCBow6BuZyBuw6B5DQoNCi0gICBwZGF5czogc+G7kSBuZ8OgeSB0csO0aSBxdWEgc2F1IGtoaSBraMOhY2ggaMOgbmcgxJHGsOG7o2MgbGnDqm4gaOG7hyBs4bqnbiBjdeG7kWkgdOG7qyBt4buZdCBjaGnhur9uIGThu4tjaCB0csaw4bubYyDEkcOzDQoNCi0gICBwcmV2aW91czogc+G7kSBsxrDhu6NuZyBsacOqbiBo4buHIHRyxrDhu5tjIMSRw7MgxJHGsOG7o2MgdGjhu7FjIGhp4buHbiB0csaw4bubYyBjaGnhur9uIGThu4tjaCBuw6B5IHbDoCBjaG8ga2jDoWNoIGjDoG5nIG7DoHkNCg0KLSAgIG91dGNvbWU6IGvhur90IHF14bqjIGPhu6dhIGNoaeG6v24gZOG7i2NoIHRp4bq/cCB0aOG7iyB0csaw4bubYyDEkcOzDQoNCi0gICB5OiBraMOhY2ggaMOgbmcgxJHDoyDEkcSDbmcga8O9IHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiBjaMawYT8NCg0KIyMgTeG7mXQgc+G7kSB0w61uaCBuxINuZyBj4bunYSBibG9ycg0KDQojIyMgUGjDom4gdMOtY2ggaGFpIGJp4bq/bg0KDQpIw6N5IGLhuq90IMSR4bqndSB24bubaSB2aeG7h2MgcGjDom4gdMOtY2ggc29uZyBzb25nIGPhu6dhIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIHbDoCDEkeG7i25oIHTDrW5oLiBDaMO6bmcgdGEgc+G6vSBz4butIGThu6VuZyBnacOhIHRy4buLIHRow7RuZyB0aW4gdsOgIGtp4buDbSDEkeG7i25oIGNoaS1zcXVhcmUgxJHhu4MgY2jhu41uIG3DtCBow6xuaCBwaMO5IGjhu6NwLg0KDQpgYGB7cn0NCmJscl9iaXZhcmlhdGVfYW5hbHlzaXMoYmFua19tYXJrZXRpbmcsIHksIGpvYiwgbWFyaXRhbCwgZWR1Y2F0aW9uLCBkZWZhdWx0LCANCiAgaG91c2luZywgbG9hbiwgY29udGFjdCwgcG91dGNvbWUpDQpgYGANCg0KS+G6v3QgcXXhuqMgYml2YXJpYXRlIGFuYWx5c2lzIHRyw6puIGNobyBiaeG6v3QgY8OhYyB0aMO0bmcgdGluIGxpw6puIHF1YW4gxJHhur9uIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIG3hu6VjIHRpw6p1ICJ5IiB2w6AgY8OhYyBiaeG6v24gImpvYiIsICJtYXJpdGFsIiwgImVkdWNhdGlvbiIsICJkZWZhdWx0IiwgImhvdXNpbmciLCAibG9hbiIsICJjb250YWN0IiwgInBvdXRjb21lIiB0cm9uZyB04bqtcCBk4buvIGxp4buHdSAiYmFua19tYXJrZXRpbmciLg0KDQpDw6FjIHRow7RuZyBz4buRIG7DoHkgZ2nDunAgxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgdMawxqFuZyBxdWFuIGdp4buvYSB04burbmcgYmnhur9uIHbDoCBiaeG6v24gbeG7pWMgdGnDqnUgInkiLiBN4bupYyDEkeG7mSBxdWFuIHRy4buNbmcgY+G7p2EgbeG7l2kgYmnhur9uIMSR4buRaSB24bubaSBiaeG6v24gbeG7pWMgdGnDqnUgxJHGsOG7o2MgxJHDoW5oIGdpw6EgZOG7sWEgdHLDqm4gSW5mb3JtYXRpb24gVmFsdWUsIHbDoCBt4bupYyDEkeG7mSB0xrDGoW5nIHF1YW4gZOG7sWEgdHLDqm4gTFIgQ2hpIFNxdWFyZSB2w6AgcC12YWx1ZS4NCg0KTmjDrG4gdsOgbyBr4bq/dCBxdeG6oyB0csOqbjoNCg0KLSAgIEPDoWMgYmnhur9uICJqb2IiLCAiaG91c2luZyIsICJjb250YWN0IiwgdsOgICJwb3V0Y29tZSIgY8OzIEluZm9ybWF0aW9uIFZhbHVlIGNhbywgdsOgIGPDsyBwLXZhbHVlIHLhuqV0IHRo4bqlcCAoZ+G6p24gYuG6sW5nIDApLCBjaG8gdGjhuqV5IGNow7puZyBjw7MgbeG7kWkgdMawxqFuZyBxdWFuIG3huqFuaCB24bubaSBiaeG6v24gbeG7pWMgdGnDqnUgInkiLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBuZ2jhu4EgbmdoaeG7h3AsIHTDrG5oIHRy4bqhbmcgbmjDoCDhu58sIHBoxrDGoW5nIHRo4bupYyBsacOqbiBo4buHIHbDoCBr4bq/dCBxdeG6oyBjaGnhur9uIGThu4tjaCB0csaw4bubYyDEkcOzIGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24gdmnhu4djIGtow6FjaCBow6BuZyBjw7MgdGhhbSBnaWEgY2hp4bq/biBk4buLY2ggdGnhur9wIHRoZW8gKGJp4bq/biAieSIpIGhheSBraMO0bmcuDQoNCi0gICBDw6FjIGJp4bq/biAibWFyaXRhbCIsICJlZHVjYXRpb24iLCB2w6AgImxvYW4iIGPFqW5nIGPDsyBJbmZvcm1hdGlvbiBWYWx1ZSDEkcOhbmcga+G7gywgdsOgIHAtdmFsdWUgcuG6pXQgdGjhuqVwLCBjaG8gdGjhuqV5IGNow7puZyBjxaluZyBjw7MgbeG7kWkgdMawxqFuZyBxdWFuIHbhu5tpIGJp4bq/biBt4bulYyB0acOqdSAieSIuDQoNCi0gICBCaeG6v24gImRlZmF1bHQiIGPDsyBJbmZvcm1hdGlvbiBWYWx1ZSB0aOG6pXAgaMahbiwgbmjGsG5nIHbhuqtuIGPDsyBwLXZhbHVlIGTGsOG7m2kgbmfGsOG7oW5nIMO9IG5naMSpYSAwLjA1LCBjaG8gdGjhuqV5IGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24gdmnhu4djIGtow6FjaCBow6BuZyBjw7MgdGhhbSBnaWEgY2hp4bq/biBk4buLY2ggaGF5IGtow7RuZywgbeG6t2MgZMO5IG3hu6ljIMSR4buZIHTGsMahbmcgcXVhbiBraMO0bmcgY2FvIGLhurFuZyBjw6FjIGJp4bq/biBraMOhYy4NCg0KIyMjIyBUcuG7jW5nIHPhu5EgYuG6sW5nIGNo4bupbmcgJiBHacOhIHRy4buLIFRow7RuZyB0aW4NCg0KVHLhu41uZyBz4buRIGLhurFuZyBjaOG7qW5nIChXZWlnaHQgb2YgRXZpZGVuY2UgLSBXb0UpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSRw6FuaCBnacOhIG5ndXkgY8ahIHTGsMahbmcgxJHhu5FpIGPhu6dhIGPDoWMgdGh14buZYyB0w61uaCBraMOhYyBuaGF1IMSR4buRaSB24bubaSBt4buZdCDEkeG6t2MgxJFp4buDbSB2w6AgbMOgIG3hu5l0IHBoxrDGoW5nIHRp4buHbiDEkeG7gyBjaHV54buDbiDEkeG7lWkgY8OhYyDEkeG6t2MgxJFp4buDbSB0aMOgbmggY8OhYyBiaeG6v24uIE7DsyBjxaluZyBsw6AgbeG7mXQgY8O0bmcgY+G7pSBy4bqldCBo4buvdSDDrWNoIMSR4buDIHBow6JuIG5ow7NtLiBXb0UgY2hvIGLhuqV0IGvhu7MgbmjDs20gbsOgbyB24bubaSB04bu3IGzhu4cgY8aw4bujYyB0cnVuZyBiw6xuaCBsw6Aga2jDtG5nLiBXb0Ugw6JtIGNobyB0aOG6pXkgdOG7tyBs4buHIG3hurdjIMSR4buLbmggY2FvIGjGoW4gY2hvIHRodeG7mWMgdMOtbmggxJHDsyBzbyB24bubaSB04bu3IGzhu4cgY2h1bmcgdsOgIGNobyB0aOG6pXkgbmd1eSBjxqEgY2FvIGjGoW4uDQoNCkdpw6EgdHLhu4sgdGjDtG5nIHRpbiAoSW5mb3JtYXRpb24gVmFsdWUpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHjhur9wIGjhuqFuZyBjw6FjIGJp4bq/biB0aGVvIG7Eg25nIGzhu7FjIHRpw6puIMSRb8OhbiBj4bunYSBjaMO6bmcuIEdpw6EgdHLhu4sgdGjDtG5nIHRpbiBjYW8gY2hvIHRo4bqleSBraOG6oyBuxINuZyBwaMOibiBiaeG7h3QgY2FvLiBDw6FjIGdpw6EgdHLhu4sgY2hvIGdpw6EgdHLhu4sgdGjDtG5nIHRpbiBsdcO0biBsw6AgZMawxqFuZyB2w6AgY8OzIHRo4buDIHbGsOG7o3QgcXXDoSAzIGtoaSDEkcOhbmggZ2nDoSBjw6FjIMSR4bq3YyDEkWnhu4NtIGPDsyB0w61uaCB0acOqbiDEkW/DoW4gY2FvLiBOaOG7r25nIMSR4bq3YyDEkWnhu4NtIGPDsyBnacOhIHRy4buLIHRow7RuZyB0aW4gw610IGjGoW4gMCwxMCB0aMaw4budbmcgxJHGsOG7o2MgY29pIGzDoCB54bq/dSwgdHJvbmcga2hpIGdpw6EgdHLhu4sgdHLDqm4gMCwzMCDEkcaw4bujYyDEkcOhbmggZ2nDoSBjYW8uDQoNCmBgYHtyfQ0KYmxyX3dvZV9pdihiYW5rX21hcmtldGluZywgam9iLCB5KQ0KYGBgDQoNCkvhur90IHF14bqjICJXZWlnaHQgb2YgRXZpZGVuY2UiIChXT0UpIHbDoCAiSW5mb3JtYXRpb24gVmFsdWUiIChJVikgxJHGsOG7o2MgdMOtbmggdG/DoW4gdOG7qyB2aeG7h2MgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBiaeG6v24gImpvYiIgdsOgIGJp4bq/biBt4bulYyB0acOqdSAieSIuDQoNCldlaWdodCBvZiBFdmlkZW5jZSAoV09FKSBsw6AgbeG7mXQgcGjDqXAgxJFvIGTDuW5nIMSR4buDIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBxdWFuIHRy4buNbmcgY+G7p2EgdOG7q25nIG5ow7NtIChsZXZlbCkgdHJvbmcgYmnhur9uICJqb2IiIMSR4buRaSB24bubaSBiaeG6v24gbeG7pWMgdGnDqnUgInkiLiBOw7MgdMOtbmggdG/DoW4gdOG7tyBs4buHIGdp4buvYSBraOG6oyBuxINuZyB44bqjeSByYSBz4buxIGtp4buHbiAiMSIgKGPDsyB0aGFtIGdpYSBjaGnhur9uIGThu4tjaCkgdsOgIHPhu7Ega2nhu4duICIwIiAoa2jDtG5nIHRoYW0gZ2lhIGNoaeG6v24gZOG7i2NoKSB0cm9uZyB04burbmcgbmjDs20uIFdPRSBjw6BuZyBjYW8gdGjDrCB0xrDGoW5nIOG7qW5nIHbhu5tpIGto4bqjIG7Eg25nIGNhbyBoxqFuIGPhu6dhIG3hu5l0IG5ow7NtIHRoYW0gZ2lhIGNoaeG6v24gZOG7i2NoLCB2w6AgbmfGsOG7o2MgbOG6oWkuIEPhu6UgdGjhu4M6DQoNCi0gICAibWFuYWdlbWVudCIgY8OzIFdPRSBsw6AgLTAuMjIsIHThu6ljIGzDoCBuaMOzbSBuw6B5IGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjaGnhur9uIGThu4tjaCB0aOG6pXAgaMahbiBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UuDQoNCi0gICAidGVjaG5pY2lhbiIgY8OzIFdPRSBsw6AgMC4xMSwgY2hvIHRo4bqleSBraOG6oyBuxINuZyB0aGFtIGdpYSBjaGnhur9uIGThu4tjaCB0xrDGoW5nIMSR4buRaSB0xrDGoW5nIMSR4buTbmcgduG7m2kgbmjDs20gdGhhbSBjaGnhur91Lg0KDQotICAgImVudHJlcHJlbmV1ciIgY8OzIFdPRSBsw6AgMC40MCwgdOG7qWMgbMOgIG5ow7NtIG7DoHkgY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGNoaeG6v24gZOG7i2NoIGNhbyBoxqFuIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dS4NCg0KVMawxqFuZyB04buxLCBjw6FjIGdpw6EgdHLhu4sgV09FIGPDsm4gxJHGsOG7o2MgdMOtbmggY2hvIGPDoWMgbmjDs20gY8OybiBs4bqhaSB0cm9uZyBiaeG6v24gImpvYiIuDQoNCkluZm9ybWF0aW9uIFZhbHVlIChJVikgdMOtbmggdG/DoW4gdOG7lW5nIGjhu6NwIHThuqV0IGPhuqMgZ2nDoSB0cuG7iyBXT0UgY+G7p2EgdOG7q25nIG5ow7NtIHRyb25nIGJp4bq/biAiam9iIi4gSVYgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHF1YW4gdHLhu41uZyBj4bunYSBiaeG6v24gImpvYiIgxJHhu5FpIHbhu5tpIGJp4bq/biBt4bulYyB0acOqdSAieSIuIEPDoWMgZ2nDoSB0cuG7iyBJViB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHDoW5oIGdpw6Egc+G7sSBxdWFuIHRy4buNbmcgY+G7p2EgdOG7q25nIGJp4bq/biB0cm9uZyB2aeG7h2MgZOG7sSDEkW/DoW4gYmnhur9uIG3hu6VjIHRpw6p1LiBUcm9uZyBr4bq/dCBxdeG6oyBuw6B5LCBJViBj4bunYSBiaeG6v24gImpvYiIgbMOgIDAuMTU5NCwgY2hvIHRo4bqleSBiaeG6v24gbsOgeSBjw7MgbeG7qWMgxJHhu5kgcXVhbiB0cuG7jW5nIHRydW5nIGLDrG5oIHRyb25nIHZp4buHYyBk4buxIMSRb8OhbiBraMOhY2ggaMOgbmcgY8OzIHRoYW0gZ2lhIGNoaeG6v24gZOG7i2NoIGhheSBraMO0bmcuDQoNClTDs20gbOG6oWksIGvhur90IHF14bqjIFdPRSB2w6AgSVYgY2hvIGJp4bq/dCBt4bupYyDEkeG7mSBxdWFuIHRy4buNbmcgY+G7p2EgdOG7q25nIG5ow7NtIHRyb25nIGJp4bq/biAiam9iIiDEkeG7kWkgduG7m2kgYmnhur9uIG3hu6VjIHRpw6p1ICJ5IiB0cm9uZyB04bqtcCBk4buvIGxp4buHdSAiYmFua19tYXJrZXRpbmciLiBDw6FjIGdpw6EgdHLhu4sgV09FIGTDuW5nIMSR4buDIG3DtCB04bqjIG3hu6ljIMSR4buZIHTGsMahbmcgcXVhbiBnaeG7r2EgYmnhur9uICJqb2IiIHbDoCBiaeG6v24gbeG7pWMgdGnDqnUgInkiLCB0cm9uZyBraGkgSVYgdOG7lW5nIGjhu6NwIGPDoWMgZ2nDoSB0cuG7iyBXT0UgxJHhu4MgxJHDoW5oIGdpw6EgcXVhbiB0cuG7jW5nIGPhu6dhIGJp4bq/biAiam9iIiB0cm9uZyB2aeG7h2MgZOG7sSDEkW/DoW4ga2jDoWNoIGjDoG5nIGPDsyB0aGFtIGdpYSBjaGnhur9uIGThu4tjaCBoYXkga2jDtG5nLg0KDQojIyMjIFbhur0gYmnhu4N1IMSR4buTDQoNCmBgYHtyfQ0KayA8LSBibHJfd29lX2l2KGJhbmtfbWFya2V0aW5nLCBqb2IsIHkpDQpwbG90KGspDQpgYGANCg0KQmnhu4N1IMSR4buTIHRyw6puIHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgbmjDs20gKGxldmVscykgdHJvbmcgYmnhur9uICJqb2IiIHbDoCBraOG6oyBuxINuZyB0aGFtIGdpYSBjaGnhur9uIGThu4tjaCBj4bunYSBraMOhY2ggaMOgbmcgKGJp4bq/biBt4bulYyB0acOqdSAieSIpIHRow7RuZyBxdWEgxJHGsOG7nW5nIGNvbmcgV2VpZ2h0IG9mIEV2aWRlbmNlIChXT0UpLg0KDQpOaOG7r25nIMSRaeG7g20gbuG6sW0gYsOqbiB0csOqbiDEkcaw4budbmcgdHJ1bmcgdHV54bq/biAodGjGsOG7nW5nIGzDoCBnacOhIHRy4buLIFdPRSA9IDApIMSR4bqhaSBkaeG7h24gY2hvIGPDoWMgbmjDs20gY8OzIGto4bqjIG7Eg25nIHRoYW0gZ2lhIGNoaeG6v24gZOG7i2NoIGNhbyBoxqFuIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dS4gxJBp4buBdSBuw6B5IMSRxrDhu6NjIHRo4buDIGhp4buHbiBi4bqxbmcgZ2nDoSB0cuG7iyBXT0UgZMawxqFuZy4NCg0KTmjhu69uZyDEkWnhu4NtIG7hurFtIGLDqm4gZMaw4bubaSDEkcaw4budbmcgdHJ1bmcgdHV54bq/biDEkeG6oWkgZGnhu4duIGNobyBjw6FjIG5ow7NtIGPDsyBraOG6oyBuxINuZyB0aGFtIGdpYSBjaGnhur9uIGThu4tjaCB0aOG6pXAgaMahbiBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UuIMSQaeG7gXUgbsOgeSDEkcaw4bujYyB0aOG7gyBoaeG7h24gYuG6sW5nIGdpw6EgdHLhu4sgV09FIMOibS4gxJDhu5kgbOG7m24gY+G7p2EgV09FIGPDoG5nIHhhIGto4buPaSDEkcaw4budbmcgdHJ1bmcgdHV54bq/biwgdGjDrCBraOG6oyBuxINuZyB0aGFtIGdpYSBjaGnhur9uIGThu4tjaCBj4bunYSBuaMOzbSDEkcOzIGPDoG5nIGtow6FjIGJp4buHdCBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UuDQoNClThu6sgYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIHRo4bqleSDEkcaw4bujYyBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSB04burbmcgbmjDs20gbmdo4buBIG5naGnhu4dwIHRyb25nIGJp4bq/biAiam9iIiDEkeG6v24ga2jhuqMgbsSDbmcgdGhhbSBnaWEgY2hp4bq/biBk4buLY2ggY+G7p2Ega2jDoWNoIGjDoG5nIChiaeG6v24gbeG7pWMgdGnDqnUgInkiKS4NCg0KIyMjIyBUcuG7jW5nIHPhu5EgYuG6sW5nIGNo4bupbmcgJiBHacOhIHRy4buLIFRow7RuZyB0aW4gY+G7p2Egbmhp4buBdSBiaeG6v24gDQoNCkNow7puZyB0YSBjw7MgdGjhu4MgdOG6oW8gdHLhu41uZyBz4buRIGPhu6dhIGLhurFuZyBjaOG7qW5nIHbDoCBnacOhIHRy4buLIHRow7RuZyB0aW4gY2hvIG5oaeG7gXUgYmnhur9uIGLhurFuZyBjw6FjaCBz4butIGThu6VuZyAiYmxyX3dvZV9pdl9zdGF0cyAoKSIuDQoNCmBgYHtyfQ0KYmxyX3dvZV9pdl9zdGF0cyhiYW5rX21hcmtldGluZywgeSwgam9iLCBtYXJpdGFsLCBlZHVjYXRpb24pDQpgYGANCg0KS+G6v3QgcXXhuqMgdHLDqm4gbMOgIG3hu5l0IHBow6JuIHTDrWNoIFdlaWdodCBvZiBFdmlkZW5jZSAoV09FKSB2w6AgSW5mb3JtYXRpb24gVmFsdWUgKElWKSBj4bunYSBiYSBiaeG6v24gxJHhuqd1IHbDoG8gdHJvbmcgYuG7mSBk4buvIGxp4buHdSBiYW5rX21hcmtldGluZzogJ2pvYicsICdtYXJpdGFsJyB2w6AgJ2VkdWNhdGlvbicuIMSQw6J5IGzDoCBjw6FjIGNo4buJIHPhu5EgcXVhbiB0cuG7jW5nIHRyb25nIGPDoWMgY8O0bmcgY+G7pSB04bqhbyBtw7QgaMOsbmggZOG7sSDEkW/DoW4sIMSR4bq3YyBiaeG7h3QgbMOgIHRyb25nIG3DtCBow6xuaCB0w61uIGThu6VuZyB2w6AgcuG7p2kgcm8gdMOgaSBjaMOtbmguDQoNCi0gICBQaMOibiB0w61jaCBiaeG6v24gJ2pvYic6DQoNCiAgICAtICAgV09FIGNobyB04burbmcgbeG7qWMgY+G7p2EgYmnhur9uICdqb2InIMSRw6MgxJHGsOG7o2MgdMOtbmggdG/DoW4uIFdPRSB0aOG7gyBoaeG7h24gbeG7qWMgxJHhu5kg4bqjbmggaMaw4bufbmcgY+G7p2EgdOG7q25nIG3hu6ljIHThu5tpIGJp4bq/biBt4bulYyB0acOqdSAoeSkuIEdpw6EgdHLhu4sgV09FIGTGsMahbmcgY2hvIHRo4bqleSBt4bupYyDEkeG7mSB0xINuZyBraOG6oyBuxINuZyB44bqjeSByYSBj4bunYSBiaeG6v24gbeG7pWMgdGnDqnUgdHJvbmcgbmjDs20gxJHDsywgdHJvbmcga2hpIFdPRSDDom0gY2hvIHRo4bqleSBt4bupYyDEkeG7mSBnaeG6o20ga2jhuqMgbsSDbmcgeOG6o3kgcmEuDQoNCiAgICAtICAgTeG7qWMgJ3N0dWRlbnQnIGPDsyBXT0Ugw6JtICgtMS4xMyksIGNobyB0aOG6pXkga2jhuqMgbsSDbmcgeOG6o3kgcmEgYmnhur9uIG3hu6VjIHRpw6p1IHRo4bqlcCBuaOG6pXQgdHJvbmcgbmjDs20gbsOgeS4gTeG7qWMgJ2JsdWUtY29sbGFyJyBjw7MgV09FIGTGsMahbmcgKDAuNTEpLCBjaG8gdGjhuqV5IGto4bqjIG7Eg25nIHjhuqN5IHJhIGJp4bq/biBt4bulYyB0acOqdSBjYW8gbmjhuqV0IHRyb25nIG5ow7NtIG7DoHkuDQoNCiAgICAtICAgSVYgY+G7p2EgYmnhur9uICdqb2InIGzDoCAwLjE1OTQsIMSRw6J5IGzDoCBt4buZdCBjaOG7iSBz4buRIHRo4buDIGhp4buHbiBz4bupYyBt4bqhbmggY+G7p2EgYmnhur9uICdqb2InIHRyb25nIGThu7EgxJFvw6FuIGJp4bq/biBt4bulYyB0acOqdS4gR2nDoSB0cuG7iyBJViB04burIDAuMDIgxJHhur9uIDAuMSDEkcaw4bujYyBjb2kgbMOgIGPDsyDDvSBuZ2jEqWEgdHJvbmcgZOG7sSDEkW/DoW4uDQoNCi0gICBQaMOibiB0w61jaCBiaeG6v24gJ21hcml0YWwnOg0KDQogICAgLSAgIFdPRSBjaG8gdOG7q25nIG3hu6ljIGPhu6dhIGJp4bq/biAnbWFyaXRhbCcgxJHDoyDEkcaw4bujYyB0w61uaCB0b8Ohbi4gTeG7qWMgxJHhu5kgdMSDbmcgaG/hurdjIGdp4bqjbSBj4bunYSBXT0UgdGjhu4MgaGnhu4duIOG6o25oIGjGsOG7n25nIGPhu6dhIHThu6tuZyBt4bupYyB04bubaSBraOG6oyBuxINuZyB44bqjeSByYSBj4bunYSBiaeG6v24gbeG7pWMgdGnDqnUuDQoNCiAgICAtICAgTeG7qWMgJ3NpbmdsZScgY8OzIFdPRSDDom0gKC0wLjMyKSwgY2hvIHRo4bqleSBraOG6oyBuxINuZyB44bqjeSByYSBiaeG6v24gbeG7pWMgdGnDqnUgdGjhuqVwIGjGoW4gc28gduG7m2kgbeG7qWMgJ21hcnJpZWQnIGPDsyBXT0UgZMawxqFuZyAoMC4xNSkuDQoNCiAgICAtICAgSVYgY+G7p2EgYmnhur9uICdtYXJpdGFsJyBsw6AgMC4wNDY0LCBnacOhIHRy4buLIG7DoHkgY8WpbmcgY8OzIMO9IG5naMSpYSB0cm9uZyBk4buxIMSRb8OhbiwgbmjGsG5nIHRo4bqlcCBoxqFuIHNvIHbhu5tpIGJp4bq/biAnam9iJy4NCg0KLSAgIFBow6JuIHTDrWNoIGJp4bq/biAnZWR1Y2F0aW9uJzoNCg0KICAgIC0gICBXT0UgY2hvIHThu6tuZyBt4bupYyBj4bunYSBiaeG6v24gJ2VkdWNhdGlvbicgxJHDoyDEkcaw4bujYyB0w61uaCB0b8Ohbi4gQ8OhYyBt4bupYyBjw7MgV09FIMOibSBjaG8gdGjhuqV5IGto4bqjIG7Eg25nIHjhuqN5IHJhIGJp4bq/biBt4bulYyB0acOqdSB0aOG6pXAgaMahbiBzbyB24bubaSBjw6FjIG3hu6ljIGPDsyBXT0UgZMawxqFuZy4NCg0KICAgIC0gICBN4bupYyAndGVydGlhcnknIGPDsyBXT0Ugw6JtICgtMC4zMSksIGNobyB0aOG6pXkga2jhuqMgbsSDbmcgeOG6o3kgcmEgYmnhur9uIG3hu6VjIHRpw6p1IHRo4bqlcCBoxqFuIHNvIHbhu5tpIG3hu6ljICdwcmltYXJ5JyBjw7MgV09FIGTGsMahbmcgKDAuMjApLg0KDQogICAgLSAgIElWIGPhu6dhIGJp4bq/biAnZWR1Y2F0aW9uJyBsw6AgMC4wNTM5LCB0xrDGoW5nIHThu7EgbmjGsCBiaeG6v24gJ21hcml0YWwnLCBnacOhIHRy4buLIG7DoHkgY8OzIMO9IG5naMSpYSB0cm9uZyBk4buxIMSRb8OhbiBuaMawbmcgdGjhuqVwIGjGoW4gc28gduG7m2kgYmnhur9uICdqb2InLg0KDQpU4buVbmcga+G6v3Q6DQoNCi0gICBD4bqjIGJhIGJp4bq/biAnam9iJywgJ21hcml0YWwnIHbDoCAnZWR1Y2F0aW9uJyDEkeG7gXUgY8OzIHPhu6ljIG3huqFuaCB0cm9uZyBk4buxIMSRb8OhbiBiaeG6v24gbeG7pWMgdGnDqnUuIEJp4bq/biAnam9iJyBjw7Mgc+G7qWMgbeG6oW5oIGThu7EgxJFvw6FuIGNhbyBuaOG6pXQgKElWID0gMC4xNTk0KSwgdGhlbyBzYXUgbMOgICdlZHVjYXRpb24nIChJViA9IDAuMDUzOSkgdsOgICdtYXJpdGFsJyAoSVYgPSAwLjA0NjQpLg0KDQotICAgVGjDtG5nIHF1YSBwaMOibiB0w61jaCBXT0UgdsOgIElWLCB0YSBjw7MgdGjhu4MgY2jhu41uIHJhIGPDoWMgYmnhur9uIHF1YW4gdHLhu41uZyDEkeG7gyB4w6J5IGThu7FuZyBtw7QgaMOsbmggdsOgIGxv4bqhaSBi4buPIGPDoWMgYmnhur9uIHnhur91IGtow7RuZyDEkcOzbmcgZ8OzcCBuaGnhu4F1IHbDoG8gZOG7sSDEkW/DoW4uIMSQaeG7gXUgbsOgeSBnacO6cCBj4bqjaSB0aGnhu4duIGhp4buHdSBzdeG6pXQgdsOgIMSRxqFuIGdp4bqjbiBow7NhIG3DtCBow6xuaCBk4buxIMSRb8Ohbi4NCg0KIyMjIEzhu7FhIGNo4buNbiB04burbmcgYsaw4bubYyB0aGVvIGdpw6EgdHLhu4sgQUlDIA0KDQrEkOG7kWkgduG7m2kgbcO0IGjDrG5oIGPhuq90IGzhuqduIMSR4bqndS9s4bqnbiDEkeG6p3UsIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIMSRxrDhu6NjIMSRxrBhIHbDoG8gbcO0IGjDrG5oLiBN4bulYyB0acOqdSBj4bunYSBjaMO6bmcgdMO0aSBsw6AgYmFvIGfhu5NtIG3hu5l0IHPhu5EgbMaw4bujbmcgaOG6oW4gY2jhur8gY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wICg1LTE1KSwgdOG6pXQgY+G6oyDEkeG7gXUgY8OzIMO9IG5naMSpYSwgbcOgIGtow7RuZyDhuqNuaCBoxrDhu59uZyBxdcOhIG5oaeG7gXUgxJHhur9uIGhp4buHdSBzdeG6pXQgY+G7p2EgbcO0IGjDrG5oLiBMw70gZG8gxJHhurFuZyBzYXUgdmnhu4djIGtow7RuZyBiYW8gZ+G7k20gcXXDoSBuaGnhu4F1IGJp4bq/biBsw6AgbcO0IGjDrG5oIHPhur0gxJHGsOG7o2MgdHJhbmcgYuG7iyBxdcOhIG3hu6ljIHbDoCBz4bq9IHRy4bufIG7Dqm4ga2jDtG5nIOG7lW4gxJHhu4tuaCBraGkgdGjhu60gbmdoaeG7h20gdHLDqm4gbeG6q3UgeMOhYyB0aOG7sWMuIFZp4buHYyBnaeG6o20gYmnhur9uIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGPDoWMgdGjhu6cgdOG7pWMgY2jhu41uIGJp4bq/biB0aeG6v24gaG/hurdjIGzDuWkgaG/hurdjIHThu6tuZyBixrDhu5tjLiBDaMO6bmcgdMO0aSBz4bq9IHPhu60gZOG7pW5nICJibHJfc3RlcF9haWNfYm90aCAoKSIgxJHhu4MgZOG7sSDEkW/DoW4gZGFuaCBzw6FjaCByw7p0IGfhu41uIGNobyBtw7QgaMOsbmggY+G7p2EgY2jDum5nIHTDtGkuDQoNCiMjIyMgTW9kZWwNCg0KYGBge3J9DQptb2RlbCA8LSBnbG0oeSB+IC4sIGRhdGEgPSBiYW5rX21hcmtldGluZywgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpKQ0KDQpgYGANCg0KSMOgbSB0csOqbiDEkWFuZyB04bqhbyBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIChsb2dpc3RpYyByZWdyZXNzaW9uKSB0cm9uZyBuZ8O0biBuZ+G7ryBs4bqtcCB0csOsbmggUi4gTcO0IGjDrG5oIGxvZ2lzdGljIHJlZ3Jlc3Npb24gbMOgIG3hu5l0IHBoxrDGoW5nIHBow6FwIHPhu60gZOG7pW5nIMSR4buDIGThu7EgxJFvw6FuIGJp4bq/biBwaOG7pSB0aHXhu5ljIG5o4buLIHBow6JuIChjw7MgaGFpIGdpw6EgdHLhu4sgZHV5IG5o4bqldCkgdOG7qyBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAuIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCBiaeG6v24gcGjhu6UgdGh14buZYyDEkcaw4bujYyBrw70gaGnhu4d1IGzDoCAneScsIHbDoCBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgZOG7sSDEkW/DoW4gJ3knIGzDoCB04bqldCBj4bqjIGPDoWMgYmnhur9uIGPDsyB0cm9uZyBi4buZIGThu68gbGnhu4d1ICdiYW5rX21hcmtldGluZycuDQoNCiMjIyMgVMOzbSB04bqvdCBs4buxYSBjaOG7jW4NCg0KYGBge3J9DQpibHJfc3RlcF9haWNfYm90aChtb2RlbCkNCmBgYA0KDQpQaMOtYSB0csOqbiBsw6Aga+G6v3QgcXXhuqMgY+G7p2EgcGjDom4gdMOtY2ggbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBz4butIGThu6VuZyBwaMawxqFuZyBwaMOhcCAiU3RlcHdpc2UgU2VsZWN0aW9uIiBk4buxYSB0csOqbiB0acOqdSBjaMOtIEFJQyAoQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbikuIFBoxrDGoW5nIHBow6FwIG7DoHkgc+G7rSBk4bulbmcgY8OhYyBixrDhu5tjIHTEg25nIGhv4bq3YyBnaeG6o20gYmnhur9uIHbDoG8vcmEga2jhu49pIG3DtCBow6xuaCDEkeG7gyB0w6xtIHJhIHThuq1wIGJp4bq/biBxdWFuIHRy4buNbmcgbmjhuqV0IHRyb25nIHZp4buHYyBk4buxIMSRb8OhbiBiaeG6v24gcGjhu6UgdGh14buZYyAneScuIEtoaSB0aMOqbSBob+G6t2MgbG/huqFpIGLhu48gbeG7mXQgYmnhur9uLCBtw7QgaMOsbmggxJHGsOG7o2MgxJHDoW5oIGdpw6EgbOG6oWkgYuG6sW5nIGPDoWNoIHTDrW5oIHRvw6FuIEFJQyB2w6AgQklDIChCYXllc2lhbiBJbmZvcm1hdGlvbiBDcml0ZXJpb24pIMSR4buDIMSRw6FuaCBnacOhIGhp4buHdSBxdeG6oyBj4bunYSBtw7QgaMOsbmguDQoNClN1eSByYSwgZ2nDoSB0cuG7iyBBSUMgY8OgbmcgbOG7m24gdGjDrCBiaeG6v24gY8OgbmcgY8OzIHTDoWMgxJHhu5luZyBs4bubbiDEkeG6v24gYmnhur9uIHkgLSBraMOhY2ggaMOgbmcgxJHDoyDEkcSDbmcga8O9IHRp4buBbiBn4butaSBjw7Mga+G7syBo4bqhbiBjaMawYT8NCg0KQ8OhYyBr4bq/dCBxdeG6oyDEkcaw4bujYyB0aOG7gyBoaeG7h24gbmjGsCBzYXU6DQoNCjEuICBDYW5kaWRhdGUgVGVybXM6IMSQw6J5IGzDoCB04bqtcCBo4bujcCBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgbcOgIG3DtCBow6xuaCBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgxJHhu4MgZOG7sSDEkW/DoW4gYmnhur9uIHBo4bulIHRodeG7mWMuDQoNCjIuICBWYXJpYWJsZXMgRW50ZXJlZC9SZW1vdmVkOiDEkMOieSBsw6AgZGFuaCBzw6FjaCBjw6FjIGJp4bq/biDEkcaw4bujYyB0aMOqbSB2w6BvIGhv4bq3YyBsb+G6oWkgYuG7jyBraOG7j2kgbcO0IGjDrG5oIHF1YSB04burbmcgYsaw4bubYyBj4bunYSBwaMawxqFuZyBwaMOhcCAiU3RlcHdpc2UgU2VsZWN0aW9uIi4gQ8OhYyBiaeG6v24gxJHGsOG7o2MgdGjDqm0gdsOgbyBtw7QgaMOsbmggbOG6p24gbMaw4bujdCBsw6AgJ2R1cmF0aW9uJywgJ3BvdXRjb21lJywgJ21vbnRoJywgJ2NvbnRhY3QnLCAnaG91c2luZycsICdsb2FuJywgJ2NhbXBhaWduJywgJ21hcml0YWwnLCAnZWR1Y2F0aW9uJyB2w6AgJ2FnZScuDQoNCjMuICBTdGVwd2lzZSBTdW1tYXJ5OiBC4bqjbmcgbsOgeSBjdW5nIGPhuqVwIHRow7RuZyB0aW4gY2hpIHRp4bq/dCB24buBIGPDoWMgYsaw4bubYyB0aMOqbSBiaeG6v24gdsOgIGdpw6EgdHLhu4sgQUlDLCBCSUMgdsOgIERldmlhbmNlIHTGsMahbmcg4bupbmcgc2F1IGtoaSB0aMOqbSB04burbmcgYmnhur9uLg0KDQpU4burIGvhur90IHF14bqjIHRyw6puLCBjaMO6bmcgdGEgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgbcO0IGjDrG5oIMSRw6MgY2jhu41uIHThu5VuZyBj4buZbmcgMTAgYmnhur9uIMSR4buZYyBs4bqtcCAoZHVyYXRpb24sIHBvdXRjb21lLCBtb250aCwgY29udGFjdCwgaG91c2luZywgbG9hbiwgY2FtcGFpZ24sIG1hcml0YWwsIGVkdWNhdGlvbiB2w6AgYWdlKSDEkeG7gyBk4buxIMSRb8OhbiBiaeG6v24gcGjhu6UgdGh14buZYyAneScuIEPDoWMgYmnhur9uIG7DoHkgxJHGsOG7o2MgY2jhu41uIGThu7FhIHRyw6puIHRpw6p1IGNow60gQUlDLCBCSUMgdsOgIERldmlhbmNlLCB0cm9uZyDEkcOzIEFJQyB2w6AgQklDIGPDoG5nIHRo4bqlcCB2w6AgRGV2aWFuY2UgY8OgbmcgZ+G6p24gZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgdGjDrCBtw7QgaMOsbmggY8OgbmcgdOG7kXQuDQoNCiMjIyMgVuG6vSBiaeG7g3UgxJHhu5MNCg0KYGBge3J9DQptb2RlbCAlPiUNCiAgYmxyX3N0ZXBfYWljX2JvdGgoKSAlPiUNCiAgcGxvdCgpDQpgYGANCg0KVOG7qyBiaeG7g3UgxJHhu5MgY2hvIHRhIHRo4bqleSBnaeG7r2EgY8OhYyBiaeG6v24gY8OzIGdpw6EgdHLhu4sgQUlDIHThuqFvIHRow6BuaCDEkcaw4budbmcgY29uZyB24bubaSBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSBiaeG6v24gZ2nhuqNtIGThuqduIGPDsyBEdXJhdGlvbiBs4bubbiBuaOG6pXQgdsOgIEFnZSBsw6AgYsOpIG5o4bqldC4NCg0KIyMjIMSQ4bqndSByYSBo4buTaSBxdXkuDQoNCiMjIyMgTW9kZWwNCg0KQ2jDum5nIHRhIGPDsyB0aOG7gyBz4butIGThu6VuZyBwaMOibiB0w61jaCBoYWkgYmnhur9uIHbDoCBxdXkgdHLDrG5oIGzhu7FhIGNo4buNbiB04burbmcgYsaw4bubYyDEkeG7gyDEkcawYSByYSBjw6FjIHnhur91IHThu5EgZOG7sSDEkW/DoW4gdHJvbmcgZGFuaCBzw6FjaCByw7p0IGfhu41uIHbDoCB4w6J5IGThu7FuZyBtw7QgaMOsbmggYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nICJnbG0oKSIuIEPDoWMgeeG6v3UgdOG7kSBk4buxIMSRb8OhbiDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBtw7QgaMOsbmggZMaw4bubaSDEkcOieSBuaOG6sW0gbeG7pWMgxJHDrWNoIG1pbmggaOG7jWEgdsOgIGtow7RuZyBuaOG6pXQgdGhp4bq/dCBwaOG6o2kgxJHGsOG7o2MgxJHGsGEgdsOgbyBkYW5oIHPDoWNoIHLDunQgZ+G7jW4gdOG7qyBxdXkgdHLDrG5oIHBow6JuIHTDrWNoIGhhaSBiaeG6v24gdsOgIGzhu7FhIGNo4buNbiBiaeG6v24uDQoNCmBgYHtyfQ0KbW9kZWwgPC0gZ2xtKHkgfiAgYWdlICsgZHVyYXRpb24gKyBwcmV2aW91cyArIGhvdXNpbmcgKyBkZWZhdWx0ICsNCiAgICAgICAgICAgICBsb2FuICsgcG91dGNvbWUgKyBqb2IgKyBtYXJpdGFsLCBkYXRhID0gYmFua19tYXJrZXRpbmcsIA0KICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSkNCmBgYA0KDQpT4butIGThu6VuZyAiYmxyX3JlZ3Jlc3MgKCkiIMSR4buDIHThuqFvIMSR4bqndSByYSBo4buTaSBxdXkgdG/DoG4gZGnhu4duLiBOw7MgY2jhuqVwIG5o4bqtbiBt4buZdCB0cm9uZyBuaOG7r25nIMSRaeG7gXUgc2F1IMSRw6J5DQoNCi0gICBNw7QgaMOsbmggxJHGsOG7o2MgeMOieSBk4buxbmcgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nICJnbG0oKSINCi0gICBjw7RuZyB0aOG7qWMgbcO0IGjDrG5oIHbDoCBk4buvIGxp4buHdQ0KDQojIyMjIFPhu60gZOG7pW5nIE1vZGVsDQoNCkNow7puZyB0YSBow6N5IG5ow6xuIHbDoG8gxJHhuqd1IHJhIMSRxrDhu6NjIHThuqFvIHJhIHThu6sgImJscl9yZWdyZXNzICgpIjoNCg0KYGBge3J9DQpibHJfcmVncmVzcyhtb2RlbCkNCmBgYA0KDQpO4bq/dSBi4bqhbiBtdeG7kW4ga2nhu4NtIHRyYSDGsOG7m2MgdMOtbmggdOG7tyBs4buHIGNow6puaCBs4buHY2gsIGjDo3kgxJHhurd0ICJvZGRfY29uZl9saW1pdCIgxJDhur5OICJUUlVFIi4gQ8OhYyDGsOG7m2MgdMOtbmggdOG7tyBs4buHIGNow6puaCBs4buHY2gga2jDtG5nIMSRxrDhu6NjIHTDrW5oIHRvw6FuIHLDtSByw6BuZyB2w6wgY2jDum5nIHTDtGkgxJHDoyBxdWFuIHPDoXQgdGjhuqV5IHPhu7EgZ2lhIHTEg25nIMSRw6FuZyBr4buDIHbhu4EgdGjhu51pIGdpYW4gdMOtbmggdG/DoW4ga2hpIHjhu60gbMO9IGPDoWMgdOG6rXAgZOG7ryBsaeG7h3UgbOG7m24uDQoNCi0gICBNb2RlbCBPdmVydmlldzogxJDDonkgbMOgIHThu5VuZyBxdWFuIHbhu4EgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyDEkcOjIHjDonkgZOG7sW5nLiBH4buTbSBjw6FjIHRow7RuZyB0aW4gbmjGsCB0w6puIGLhu5kgZOG7ryBsaeG7h3UgKCdkYXRhJyksIGJp4bq/biBwaOG7pSB0aHXhu5ljICgnUmVzcCBWYXInKSwgc+G7kSBxdWFuIHPDoXQgKCdPYnMuJyksIHPhu5EgYuG6rWMgdOG7sSBkbyBj4bunYSBtw7QgaMOsbmggKCdEZi4gTW9kZWwnKSwgc+G7kSBi4bqtYyB04buxIGRvIGPhu6dhIHBo4bqnbiBkxrAgKCdEZi4gUmVzaWR1YWwnKSB2w6AgdGjDtG5nIHRpbiB24buBIGjhu5lpIHThu6UgY+G7p2EgbcO0IGjDrG5oICgnQ29udmVyZ2VuY2UnKS4NCg0KLSAgIFJlc3BvbnNlIFN1bW1hcnk6IMSQw6J5IGzDoCB04buVbmcgcXVhbiB24buBIGJp4bq/biBwaOG7pSB0aHXhu5ljICgneScpIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIE7DsyBjaG8gYmnhur90IHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBt4buXaSBnacOhIHRy4buLIHRyb25nIGJp4bq/biBwaOG7pSB0aHXhu5ljLiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgZ2nDoSB0cuG7iyAwIHh14bqldCBoaeG7h24gNDAwNCBs4bqnbiB2w6AgZ2nDoSB0cuG7iyAxIHh14bqldCBoaeG7h24gNTE3IGzhuqduLg0KDQotICAgTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRlczogxJDDonkgbMOgIGPDoWMgxrDhu5tjIGzGsOG7o25nIHThu5FpIMSRYSBow7NhIGjDoG0gaOG7o3AgbMO9IChtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGVzKSBjaG8gY8OhYyBo4buHIHPhu5EgY+G7p2EgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYy4gVuG7m2kgbeG7l2kgYmnhur9uIMSR4buZYyBs4bqtcCwgdGEgY8OzIHRow7RuZyB0aW4gduG7gSBo4buHIHPhu5EgxrDhu5tjIGzGsOG7o25nICgnRXN0aW1hdGUnKSwgxJHhu5kgbOG7h2NoIGNodeG6qW4gKCdTdGQuIEVycm9yJyksIGdpw6EgdHLhu4sgdC10ZXN0ICgneiB2YWx1ZScpIHbDoCBnacOhIHRy4buLIHAtdmFsdWUgKCdQcihcPlx8elx8KScpLiBHacOhIHRy4buLIHAtdmFsdWUgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4Mga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgduG7gSBz4buxIGtow6FjIGJp4buHdCBj4bunYSBo4buHIHPhu5Egc28gduG7m2kgMCwgduG7m2kgbeG7qWMgw70gbmdoxKlhIChzaWduaWZpY2FuY2UgbGV2ZWwpIHRoxrDhu51uZyBsw6AgMC4wNS4gTuG6v3UgZ2nDoSB0cuG7iyBwLXZhbHVlIG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhLCB0YSBjw7MgY8SDbiBj4bupIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgaOG7hyBz4buRIMaw4bubYyBsxrDhu6NuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQotICAgQXNzb2NpYXRpb24gb2YgUHJlZGljdGVkIFByb2JhYmlsaXRpZXMgYW5kIE9ic2VydmVkIFJlc3BvbnNlczogxJDDonkgbMOgIHBow6JuIHTDrWNoIHbhu4Egc+G7sSB0xrDGoW5nIHF1YW4gZ2nhu69hIHjDoWMgc3XhuqV0IGThu7EgxJFvw6FuIChwcmVkaWN0ZWQgcHJvYmFiaWxpdGllcykgdsOgIGPDoWMgZ2nDoSB0cuG7iyBxdWFuIHPDoXQgdGjhu7FjIHThur8gKG9ic2VydmVkIHJlc3BvbnNlcykuIFBow6JuIHTDrWNoIG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSRw6FuaCBnacOhIGhp4buHdSBzdeG6pXQgZOG7sSDEkW/DoW4gY+G7p2EgbcO0IGjDrG5oLiBDw6FjIHRow7RuZyBz4buRIG5oxrAgJSBDb25jb3JkYW50LCAlIERpc2NvcmRhbnQsICUgVGllZCwgU29tZXJzJyBELCBHYW1tYSwgVGF1LWEsIGMgdsOgIHPhu5EgbMaw4bujbmcgY+G6t3AgKFBhaXJzKSDEkcaw4bujYyB0w61uaCB0b8OhbiDEkeG7gyDEkcOhbmggZ2nDoSBoaeG7h3Ugc3XhuqV0IGPhu6dhIG3DtCBow6xuaC4NCg0KVOG7lW5nIHF1YW4sIGvhur90IHF14bqjIHRyw6puIGNobyB0YSB0aMO0bmcgdGluIHbhu4EgY8OhYyBo4buHIHPhu5EgxrDhu5tjIGzGsOG7o25nIGPhu6dhIG3DtCBow6xuaCB2w6AgaGnhu4d1IHN14bqldCBk4buxIMSRb8OhbiBj4bunYSBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIHRyw6puIGThu68gbGnhu4d1ICdkYXRhJy4gVOG7qyDEkcOzLCB0YSBjw7MgdGjhu4MgaGnhu4N1IHPDonUgaMahbiB24buBIHPhu7Eg4bqjbmggaMaw4bufbmcgY+G7p2EgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIMSR4bq/biBiaeG6v24gcGjhu6UgdGh14buZYyB2w6Aga2jhuqMgbsSDbmcgZOG7sSDEkW/DoW4gY+G7p2EgbcO0IGjDrG5oLg0KDQojIyMjIFPhu60gZOG7pW5nIEZvcm11bGENCg0KSMOjeSDEkeG7gyBjaMO6bmcgdMO0aSBz4butIGThu6VuZyBjw7RuZyB0aOG7qWMgbcO0IGjDrG5oIHbDoCB04bqtcCBk4buvIGxp4buHdSDEkeG7gyB04bqhbyByYSBjw6FjIGvhur90IHF14bqjIHRyw6puLg0KDQpgYGB7cn0NCmJscl9yZWdyZXNzKHkgfiAgYWdlICsgZHVyYXRpb24gKyBwcmV2aW91cyArIGhvdXNpbmcgKyBkZWZhdWx0ICsNCiAgICAgICAgICAgICBsb2FuICsgcG91dGNvbWUgKyBqb2IgKyBtYXJpdGFsLCBkYXRhID0gYmFua19tYXJrZXRpbmcpDQpgYGANCg0KLSAgIE1vZGVsIE92ZXJ2aWV3OiDEkMOieSBsw6AgdOG7lW5nIHF1YW4gduG7gSBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIMSRw6MgeMOieSBk4buxbmcuIEfhu5NtIGPDoWMgdGjDtG5nIHRpbiBuaMawIHTDqm4gYuG7mSBk4buvIGxp4buHdSAoJ2RhdGEnKSwgYmnhur9uIHBo4bulIHRodeG7mWMgKCdSZXNwIFZhcicpLCBz4buRIHF1YW4gc8OhdCAoJ09icy4nKSwgc+G7kSBi4bqtYyB04buxIGRvIGPhu6dhIG3DtCBow6xuaCAoJ0RmLiBNb2RlbCcpLCBz4buRIGLhuq1jIHThu7EgZG8gY+G7p2EgcGjhuqduIGTGsCAoJ0RmLiBSZXNpZHVhbCcpIHbDoCB0aMO0bmcgdGluIHbhu4EgaOG7mWkgdOG7pSBj4bunYSBtw7QgaMOsbmggKCdDb252ZXJnZW5jZScpLg0KDQotICAgUmVzcG9uc2UgU3VtbWFyeTogxJDDonkgbMOgIHThu5VuZyBxdWFuIHbhu4EgYmnhur9uIHBo4bulIHRodeG7mWMgKCd5JykgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4gTsOzIGNobyBiaeG6v3Qgc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIG3hu5dpIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIHBo4bulIHRodeG7mWMuIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCBnacOhIHRy4buLIDAgeHXhuqV0IGhp4buHbiA0MDA0IGzhuqduIHbDoCBnacOhIHRy4buLIDEgeHXhuqV0IGhp4buHbiA1MTcgbOG6p24uDQoNCi0gICBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGVzOiDEkMOieSBsw6AgY8OhYyDGsOG7m2MgbMaw4bujbmcgdOG7kWkgxJFhIGjDs2EgaMOgbSBo4bujcCBsw70gKG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZXMpIGNobyBjw6FjIGjhu4cgc+G7kSBj4bunYSBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljLiBW4bubaSBt4buXaSBiaeG6v24gxJHhu5ljIGzhuq1wLCB0YSBjw7MgdGjDtG5nIHRpbiB24buBIGjhu4cgc+G7kSDGsOG7m2MgbMaw4bujbmcgKCdFc3RpbWF0ZScpLCDEkeG7mSBs4buHY2ggY2h14bqpbiAoJ1N0ZC4gRXJyb3InKSwgZ2nDoSB0cuG7iyB0LXRlc3QgKCd6IHZhbHVlJykgdsOgIGdpw6EgdHLhu4sgcC12YWx1ZSAoJ1ByKFw+XHx6XHwpJykuIEdpw6EgdHLhu4sgcC12YWx1ZSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB24buBIHPhu7Ega2jDoWMgYmnhu4d0IGPhu6dhIGjhu4cgc+G7kSBzbyB24bubaSAwLCB24bubaSBt4bupYyDDvSBuZ2jEqWEgKHNpZ25pZmljYW5jZSBsZXZlbCkgdGjGsOG7nW5nIGzDoCAwLjA1LiBO4bq/dSBnacOhIHRy4buLIHAtdmFsdWUgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEsIHRhIGPDsyBjxINuIGPhu6kgxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBo4buHIHPhu5EgxrDhu5tjIGzGsOG7o25nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCi0gICBBc3NvY2lhdGlvbiBvZiBQcmVkaWN0ZWQgUHJvYmFiaWxpdGllcyBhbmQgT2JzZXJ2ZWQgUmVzcG9uc2VzOiDEkMOieSBsw6AgcGjDom4gdMOtY2ggduG7gSBz4buxIHTGsMahbmcgcXVhbiBnaeG7r2EgeMOhYyBzdeG6pXQgZOG7sSDEkW/DoW4gKHByZWRpY3RlZCBwcm9iYWJpbGl0aWVzKSB2w6AgY8OhYyBnacOhIHRy4buLIHF1YW4gc8OhdCB0aOG7sWMgdOG6vyAob2JzZXJ2ZWQgcmVzcG9uc2VzKS4gUGjDom4gdMOtY2ggbsOgeSB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHDoW5oIGdpw6EgaGnhu4d1IHN14bqldCBk4buxIMSRb8OhbiBj4bunYSBtw7QgaMOsbmguIEPDoWMgdGjDtG5nIHPhu5EgbmjGsCAlIENvbmNvcmRhbnQsICUgRGlzY29yZGFudCwgJSBUaWVkLCBTb21lcnMnIEQsIEdhbW1hLCBUYXUtYSwgYyB2w6Agc+G7kSBsxrDhu6NuZyBj4bq3cCAoUGFpcnMpIMSRxrDhu6NjIHTDrW5oIHRvw6FuIMSR4buDIMSRw6FuaCBnacOhIGhp4buHdSBzdeG6pXQgY+G7p2EgbcO0IGjDrG5oLg0KDQpU4buVbmcgcXVhbiwga+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRhIHRow7RuZyB0aW4gduG7gSBjw6FjIGjhu4cgc+G7kSDGsOG7m2MgbMaw4bujbmcgY+G7p2EgbcO0IGjDrG5oIHbDoCBoaeG7h3Ugc3XhuqV0IGThu7EgxJFvw6FuIGPhu6dhIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgdHLDqm4gZOG7ryBsaeG7h3UgJ2JhbmtfbWFya2V0aW5nJyBraGkgc+G7rSBk4bulbmcgY8OhYyBiaeG6v24gJ2FnZScsICdkdXJhdGlvbicsICdwcmV2aW91cycsICdob3VzaW5nJywgJ2RlZmF1bHQnLCAnbG9hbicsICdwb3V0Y29tZScsICdqb2InIHbDoCAnbWFyaXRhbCcgxJHhu4MgZOG7sSDEkW/DoW4gYmnhur9uIHBo4bulIHRodeG7mWMgJ3knLg0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IGjDrG5oIHBow7kgaOG7o3ANCg0KU+G7kSBsaeG7h3UgdGjhu5FuZyBrw6ogduG7gSBt4bupYyDEkeG7mSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCBjw7Mgc+G6tW4gxJHhu4MgxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggduG7m2kgZOG7ryBsaeG7h3UgdsOgIMSR4buDIHNvIHPDoW5oIGhhaSBtw7QgaMOsbmgga2jDoWMgbmhhdS4gxJDhuqd1IHJhIGJhbyBn4buTbSBraeG7g20gdHJhIHThu7cgbOG7hyBraOG6oyBuxINuZywgQUlDLCBCSUMgdsOgIG3hu5l0IGxv4bqhdCBjw6FjIGJp4buHbiBwaMOhcCBnaeG6oyByIGLDrG5oIHBoxrDGoW5nLg0KDQojIyMjIFNpbmdsZSBNb2RlbA0KDQpgYGB7cn0NCmJscl9tb2RlbF9maXRfc3RhdHMobW9kZWwpDQpgYGANCg0KS+G6v3QgcXXhuqMgdHLDqm4gbMOgIGPDoWMgdGjhu5FuZyBrw6ogxJHDoW5oIGdpw6EgaGnhu4d1IHN14bqldCB2w6AgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIMSRw6MgxJHGsOG7o2MgeMOieSBk4buxbmcuIETGsOG7m2kgxJHDonkgbMOgIMO9IG5naMSpYSBj4bunYSBjw6FjIHRow7RuZyBz4buRIMSRw7M6DQoNCkxvZy1MaWsgSW50ZXJjZXB0IE9ubHk6IExvZy1MaWtlbGlob29kIGPhu6dhIG3DtCBow6xuaCBjaOG7iSBjw7MgbeG7mXQgaOG7hyBz4buRIGNo4bq3biAoaW50ZXJjZXB0KS4gxJDDonkgbMOgIGdpw6EgdHLhu4sgTG9nLUxpa2VsaWhvb2QgdMawxqFuZyDhu6luZyB24bubaSBtw7QgaMOsbmggbcOgIGtow7RuZyBjw7MgYmnhur9uIMSR4buZYyBs4bqtcCBuw6BvIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGThu7EgxJFvw6FuIGJp4bq/biBwaOG7pSB0aHXhu5ljLg0KDQpMb2ctTGlrIEZ1bGwgTW9kZWw6IExvZy1MaWtlbGlob29kIGPhu6dhIG3DtCBow6xuaCBob8OgbiBjaOG7iW5oLCBiYW8gZ+G7k20gdOG6pXQgY+G6oyBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgZOG7sSDEkW/DoW4gYmnhur9uIHBo4bulIHRodeG7mWMuDQoNCkRldmlhbmNlKDQ0OTgpOiBEZXZpYW5jZSBj4bunYSBtw7QgaMOsbmgsIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBzYWkga2jDoWMgZ2nhu69hIGThu68gbGnhu4d1IHF1YW4gc8OhdCB2w6AgZOG7sSDEkW/DoW4gY+G7p2EgbcO0IGjDrG5oLg0KDQpMUigyMik6IEdpw6EgdHLhu4sgY2hpLXNxdWFyZWQgKGxpa2VsaWhvb2QgcmF0aW8gY2hpLXNxdWFyZWQpIGPhu6dhIG3DtCBow6xuaCwgc28gc8OhbmggaGnhu4d1IHN14bqldCBnaeG7r2EgbcO0IGjDrG5oIGhvw6BuIGNo4buJbmggdsOgIG3DtCBow6xuaCBjaOG7iSBjw7MgaW50ZXJjZXB0LiBHacOhIHRy4buLIExSIGNhbyB2w6AgcC12YWx1ZSB0aOG6pXAgY2hvIHRo4bqleSBtw7QgaMOsbmggaG/DoG4gY2jhu4luaCBnaeG6o2kgdGjDrWNoIGThu68gbGnhu4d1IHThu5F0IGjGoW4gc28gduG7m2kgbcO0IGjDrG5oIGNo4buJIGPDsyBpbnRlcmNlcHQuDQoNClByb2IgXD4gTFI6IEdpw6EgdHLhu4sgcC12YWx1ZSBsacOqbiBxdWFuIMSR4bq/biBMUiB0ZXN0LiBOw7MgxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgxJHDoW5nIHRpbiBj4bqteSBj4bunYSBMUiB0ZXN0LiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgcC12YWx1ZSBy4bqldCBuaOG7jyAoMC4wMDApLCBjaG8gdGjhuqV5IG3DtCBow6xuaCBob8OgbiBjaOG7iW5oIGdp4bqjaSB0aMOtY2ggZOG7ryBsaeG7h3UgdOG7kXQgaMahbiBzbyB24bubaSBtw7QgaMOsbmggY2jhu4kgY8OzIGludGVyY2VwdC4NCg0KTUNGYWRkZW4ncyBSMjogSOG7hyBz4buRIFItc3F1YXJlIGThu7FhIHRyw6puIHBoxrDGoW5nIHBow6FwIGPhu6dhIE1DRmFkZGVuLiBOw7MgxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgZ2nhuqNpIHRow61jaCBj4bunYSBtw7QgaMOsbmggc28gduG7m2kgbcO0IGjDrG5oIGNo4buJIGPDsyBpbnRlcmNlcHQuIEdpw6EgdHLhu4sgY8OgbmcgY2FvIHRo4buDIGhp4buHbiBtw7QgaMOsbmggZ2nhuqNpIHRow61jaCB04buRdCBoxqFuLg0KDQpNY0ZhZGRlbidzIEFkaiBSMjogSOG7hyBz4buRIFItc3F1YXJlIMSRaeG7gXUgY2jhu4luaCBk4buxYSB0csOqbiBwaMawxqFuZyBwaMOhcCBj4bunYSBNQ0ZhZGRlbi4gxJBp4buBdSBjaOG7iW5oIGNobyBz4buRIGzGsOG7o25nIGJp4bq/biDEkeG7mWMgbOG6rXAgdHJvbmcgbcO0IGjDrG5oLiBHacOhIHRy4buLIG7DoHkgY8WpbmcgdGjhu4MgaGnhu4duIG3hu6ljIMSR4buZIGdp4bqjaSB0aMOtY2ggY+G7p2EgbcO0IGjDrG5oLg0KDQpNTCAoQ294LVNuZWxsKSBSMjogSOG7hyBz4buRIFItc3F1YXJlIGThu7FhIHRyw6puIHBoxrDGoW5nIHBow6FwIENveC1TbmVsbC4gTsOzIGPFqW5nIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBnaeG6o2kgdGjDrWNoIGPhu6dhIG3DtCBow6xuaCBzbyB24bubaSBtw7QgaMOsbmggY2jhu4kgY8OzIGludGVyY2VwdC4NCg0KQ3JhZ2ctVWhsZXIoTmFnZWxrZXJrZSkgUjI6IEjhu4cgc+G7kSBSLXNxdWFyZSBk4buxYSB0csOqbiBwaMawxqFuZyBwaMOhcCBDcmFnZy1VaGxlciAoaG/hurdjIE5hZ2Vsa2Vya2UpLiDEkG8gbMaw4budbmcgbeG7qWMgxJHhu5kgZ2nhuqNpIHRow61jaCBj4bunYSBtw7QgaMOsbmggc28gduG7m2kgbcO0IGjDrG5oIGNo4buJIGPDsyBpbnRlcmNlcHQuDQoNCk1jS2VsdmV5ICYgWmF2b2luYSdzIFIyOiBI4buHIHPhu5EgUi1zcXVhcmUgZOG7sWEgdHLDqm4gcGjGsMahbmcgcGjDoXAgY+G7p2EgTWNLZWx2ZXkgJiBaYXZvaW5hLiBOw7MgxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIGdp4bqjaSB0aMOtY2ggY+G7p2EgbcO0IGjDrG5oIHNvIHbhu5tpIG3DtCBow6xuaCBjaOG7iSBjw7MgaW50ZXJjZXB0Lg0KDQpFZnJvbidzIFIyOiBI4buHIHPhu5EgUi1zcXVhcmUgZOG7sWEgdHLDqm4gcGjGsMahbmcgcGjDoXAgY+G7p2EgRWZyb24uIE7DsyDEkW8gbMaw4budbmcgbeG7qWMgxJHhu5kgZ2nhuqNpIHRow61jaCBj4bunYSBtw7QgaMOsbmggc28gduG7m2kgbcO0IGjDrG5oIGNo4buJIGPDsyBpbnRlcmNlcHQuDQoNCkNvdW50IFIyOiBI4buHIHPhu5EgUi1zcXVhcmUgZOG7sWEgdHLDqm4gc+G7kSBs4bqnbiBk4buxIMSRb8OhbiDEkcO6bmcgKGNvdW50IGRhdGEpLiDEkG8gbMaw4budbmcgbeG7qWMgxJHhu5kgZ2nhuqNpIHRow61jaCBj4bunYSBtw7QgaMOsbmguDQoNCkFkaiBDb3VudCBSMjogSOG7hyBz4buRIFItc3F1YXJlIMSRaeG7gXUgY2jhu4luaCBk4buxYSB0csOqbiBz4buRIGzhuqduIGThu7EgxJFvw6FuIMSRw7puZyAoY291bnQgZGF0YSkuIMSQaeG7gXUgY2jhu4luaCBjaG8gc+G7kSBsxrDhu6NuZyBiaeG6v24gxJHhu5ljIGzhuq1wIHRyb25nIG3DtCBow6xuaC4NCg0KQklDOiBCSUMgKEJheWVzaWFuIEluZm9ybWF0aW9uIENyaXRlcmlvbikgY+G7p2EgbcO0IGjDrG5oLiBCSUMgbMOgIG3hu5l0IHRpw6p1IGNow60gxJHhu4Mgc28gc8OhbmggY8OhYyBtw7QgaMOsbmggdsOgIMSRw6FuaCBnacOhIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmguIE3DtCBow6xuaCBjw7MgQklDIHRo4bqlcCBoxqFuIHRo4buDLg0KDQojIyBYw6FjIHRo4buxYyBtw7QgaMOsbmgNCg0KIyMjIE1hIHRy4bqtbiBuaOG6p20gbOG6q24gKENvbmZ1c3Rpb24gTWF0cml4KQ0KDQpDb25mdXNpb24gTWF0cml4IChtYSB0cuG6rW4gbmjhuqdtIGzhuqtuKSBsw6AgbeG7mXQgY8O0bmcgY+G7pSBwaMOibiB0w61jaCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkcOhbmggZ2nDoSBoaeG7h3Ugc3XhuqV0IGPhu6dhIG3hu5l0IG3DtCBow6xuaCBwaMOibiBsb+G6oWkuIE7DsyBjdW5nIGPhuqVwIG3hu5l0IHThu5VuZyBxdWFuIHbhu4Egc+G7sSBwaMOibiBsb+G6oWkgxJHDum5nIHbDoCBuaOG6p20gY+G7p2EgbcO0IGjDrG5oIGLhurFuZyBjw6FjaCBzbyBzw6FuaCBk4buxIMSRb8OhbiBj4bunYSBtw7QgaMOsbmggduG7m2kgZ2nDoSB0cuG7iyB0aOG7sWMgdOG6vy4NCg0KQ29uZnVzaW9uIE1hdHJpeCB0aMaw4budbmcgY8OzIGThuqFuZyBt4buZdCBi4bqjbmcgdnXDtG5nIHbhu5tpIHPhu5EgbMaw4bujbmcgaMOgbmcgdsOgIGPhu5l0IHTGsMahbmcg4bupbmcgduG7m2kgc+G7kSBsxrDhu6NuZyBs4bubcCBj4bunYSBiw6BpIHRvw6FuIHBow6JuIGxv4bqhaS4gVHJvbmcgbeG7mXQgQ29uZnVzaW9uIE1hdHJpeCwgY8OhYyB0aMOgbmggcGjhuqduIGNow61uaCBiYW8gZ+G7k206DQoNCiAgVHJ1ZSBQb3NpdGl2ZXMgKFRQKTogU+G7kSBsxrDhu6NuZyBt4bqrdSDEkcaw4bujYyBk4buxIMSRb8OhbiDEkcO6bmcgbMOgIHRodeG7mWMgdsOgbyBs4bubcCBwb3NpdGl2ZSAoZMawxqFuZyB0w61uaCkNCg0KICBUcnVlIE5lZ2F0aXZlcyAoVE4pOiBT4buRIGzGsOG7o25nIG3huqt1IMSRxrDhu6NjIGThu7EgxJFvw6FuIMSRw7puZyBsw6AgdGh14buZYyB2w6BvIGzhu5twIG5lZ2F0aXZlICjDom0gdMOtbmgpLg0KDQogIEZhbHNlIFBvc2l0aXZlcyAoRlApOiBT4buRIGzGsOG7o25nIG3huqt1IMSRxrDhu6NjIGThu7EgxJFvw6FuIHNhaSBsw6AgdGh14buZYyB2w6BvIGzhu5twIHBvc2l0aXZlIChkxrDGoW5nIHTDrW5oKSB0cm9uZyBraGkgdGjhu7FjIHThur8gY2jDum5nIHRodeG7mWMgdsOgbyBs4bubcCBuZWdhdGl2ZSAow6JtIHTDrW5oKS4gQ8OybiDEkcaw4bujYyBn4buNaSBsw6AgbOG7l2kgbG/huqFpIDEgKFR5cGUgSSBlcnJvcikuDQoNCiAgRmFsc2UgTmVnYXRpdmVzIChGTik6IFPhu5EgbMaw4bujbmcgbeG6q3UgxJHGsOG7o2MgZOG7sSDEkW/DoW4gc2FpIGzDoCB0aHXhu5ljIHbDoG8gbOG7m3AgbmVnYXRpdmUgKMOibSB0w61uaCkgdHJvbmcga2hpIHRo4buxYyB04bq/IGNow7puZyB0aHXhu5ljIHbDoG8gbOG7m3AgcG9zaXRpdmUgKGTGsMahbmcgdMOtbmgpLiBDw7JuIMSRxrDhu6NjIGfhu41pIGzDoCBs4buXaSBsb+G6oWkgMiAoVHlwZSBJSSBlcnJvcikuDQoNCkNvbmZ1c2lvbiBNYXRyaXggZ2nDunAgdGEgY8OzIGPDoWkgbmjDrG4gdOG7lW5nIHF1YW4gduG7gSBoaeG7h3Ugc3XhuqV0IGPhu6dhIG3DtCBow6xuaCBwaMOibiBsb+G6oWksIHThu6sgxJHDsyBjw7MgdGjhu4MgdMOtbmggxJHGsOG7o2MgY8OhYyDEkeG7mSDEkW8gxJHDoW5oIGdpw6Ega2jDoWMgbmjGsCDEkeG7mSBjaMOtbmggeMOhYyAoYWNjdXJhY3kpLCDEkeG7mSBuaOG6oXkgKHNlbnNpdGl2aXR5KSwgxJHhu5kgxJHhurdjIGhp4buHdSAoc3BlY2lmaWNpdHkpLCB2w6AgRjEtc2NvcmUuIE7DsyBjxaluZyBo4buvdSDDrWNoIHRyb25nIHZp4buHYyBwaMOhdCBoaeG7h24gY8OhYyBt4bqrdSBk4buxIMSRb8OhbiBzYWkgdsOgIMSRw6FuaCBnacOhIGto4bqjIG7Eg25nIGPhu6dhIG3DtCBow6xuaCB0cm9uZyB2aeG7h2MgcGjDom4gbG/huqFpIGPDoWMgbOG7m3Aga2jDoWMgbmhhdS4NCg0KYGBge3J9DQpibHJfY29uZnVzaW9uX21hdHJpeChtb2RlbCwgY3V0b2ZmID0gMC41KQ0KYGBgDQoNClNwZWNpZmljaXR5IDogVOG7iSBs4buHIMaw4bubYyBsxrDhu6NuZyBjaMOtbmggeMOhYyBjaG8gZOG7ryBsaeG7h3UgbMOgIGThu68gbGnhu4d1IMSR4buRaSBjaOG7qW5nDQoNClNlbnNpdGl2aXR5OiBU4buJIGzhu4cgxrDhu5tjIGzGsOG7o25nIGNow61uaCB4w6FjIGNobyBk4buvIGxp4buHdSBsw6AgZOG7ryBsaeG7h3UgdGjhu7FjIG5naGnhu4dtDQoNClThu6sga+G6v3QgcXXhuqMgdHLDqm4gdHLDqm4sIHRhIMSR4buNYyBoaeG7g3Uga2nhu4NtIMSR4buLbmggbmjGsCBzYXU6IEtoaSBk4buvIGxp4buHdSB0aOG7sWMgbmdoaeG7h20gdGjDrCBjaMO6bmcgdGEgxrDhu5tjIGzGsOG7o25nIGNow61uaCB4w6FjIDMxLjkxJSwgQ8OybiBk4buvIGxp4buHdSDEkeG7kWkgY2jhu6luZyB0aMOsIGNow7puZyB0YSDGsOG7m2MgbMaw4bujbmcgY2jDrW5oIHjDoWMgOTcuOSUuICggS2hpIHBow6JuIHTDrWNoIGNow7puZyB0YSBuw6puIGNobyDEkeG7mSBjaMOtbmggeMOhYyBcPiA3MCUgxJHhu4MgxJHhuqNtIGLhuqNvIHRpbiBj4bqteSBjaG8ga+G6v3QgcXXhuqMgaOG7k2kgcXV5IGxvZ2lzdGljLikNCg0KVHJvbmcgbeG7mXQgbcO0IGjDrG5oIGxvZ2lzdGljIHRpw6p1IGNodeG6qW4sIGtoaSBuZ8aw4buhbmcgZ2nDoSB0cuG7iyBjw6BuZyBjYW8gdGjDrCDEkeG7mSBuaOG6oXkgc+G6vSBnaeG6o20gdsOgIMSR4buZIMSR4bq3YyBoaeG7h3Ugc+G6vSB0xINuZy4gS2hpIG5nxrDhu6FuZyBnacOhIHRy4buLIGdp4bqjbSB0aMOsIMSR4buZIG5o4bqheSBz4bq9IHTEg25nIHbDrCBuaGnhu4F1IHPhu7Ega2nhu4duIGjGoW4gc+G6vSDEkcaw4bujYyBwaMOhdCBoaeG7h24uIFR1eSBuaGnDqm4sIMSR4buZIMSR4bq3YyBoaeG7h3Ugc+G6vSBnaeG6o20gxJFpIHbDrCBuaGnhu4F1IHPhu7Ega2nhu4duIGtow7RuZyB44bqjeSByYSBz4bq9IGLhu4sgcGjDom4gbG/huqFpIG5o4bqnbSBsw6Agc+G7sSBraeG6v24uIERvIMSRw7MsIHZp4buHYyDEkeG6oXQgxJHGsOG7o2Mgc+G7sSBjw6JuIMSR4buRaSBk4buxYSB0csOqbiB5w6p1IGPhuqd1IGzDoCBj4bqnbiB0aGnhur90LiBWw60gZOG7pSwgbuG6v3UgY2jDum5nIHRhIG114buRbiBi4bqvdCDEkcaw4bujYyBuaGnhu4F1IHPhu7Ega2nhu4duIG5o4bqldCBjw7MgdGjhu4MgdsOgIGNo4bqlcCBuaOG6rW4gdmnhu4djIHBow6JuIGxv4bqhaSBzYWkgY8OhYyBz4buxIGtp4buHbiBraMO0bmcgeOG6o3kgcmEsIHRow6wgY2jDum5nIHRhIHPhur0gY2jhu41uIGdpw6EgdHLhu4sgbmfGsOG7oW5nIHRo4bqlcC4NCg0KIyMjIEtp4buDbSDEkeG7i25oIEhvc21lciBMZW1lc2hvdw0KDQpLaeG7g20gxJHhu4tuaCBIb3NtZXIgLS0gTGVtZXNob3cgbMOgIG3hu5l0IGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIHbhu4EgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCDEkeG7kWkgduG7m2kgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIC4gTsOzIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRoxrDhu51uZyB4dXnDqm4gdHJvbmcgY8OhYyBtw7QgaMOsbmggZOG7sSBiw6FvIHLhu6dpIHJvIC4gS2nhu4NtIHRyYSDEkcOhbmggZ2nDoSB4ZW0gbGnhu4d1IHThu7cgbOG7hyBk4buvIGxp4buHdSBxdWFuIHPDoXQgY8OzIGto4bubcCB24bubaSB04bu3IGzhu4cgc+G7sSBraeG7h24gZOG7sSBraeG6v24gdHJvbmcgY8OhYyBuaMOzbSBjb24gY+G7p2EgcXVhbiBzw6F0IGPhu6dhIG3DtCBow6xuaCBoYXkga2jDtG5nLg0KDQpCw6BpIGtp4buDbSB0cmEgSG9zbWVyIC0tIExlbWVzaG93IHjDoWMgxJHhu4tuaCBj4bulIHRo4buDIGPDoWMgbmjDs20gY29uIGTGsOG7m2kgZOG6oW5nIGPDoWMgcGjDom4gxJFv4bqhbiBj4bunYSBjw6FjIGdpw6EgdHLhu4sgcuG7p2kgcm8gcGjDuSBo4bujcC4gQ8OhYyBtw7QgaMOsbmggbcOgIHThu7cgbOG7hyBz4buxIGtp4buHbiDEkcaw4bujYyBtb25nIMSR4bujaSB2w6AgcXVhbiBzw6F0IMSRxrDhu6NjIHRyb25nIGPDoWMgbmjDs20gY29uIGzDoCB0xrDGoW5nIHThu7EgbmhhdSDEkcaw4bujYyBn4buNaSBsw6AgxJHDoyDEkcaw4bujYyBoaeG7h3UgY2jhu4luaCB04buRdC4NCg0KVMOzbSBs4bqhaSwgS2nhu4NtIMSR4buLbmggSG9zbWVyLUxlbWVzaG93IChraeG7g20gdHJhIEhMKSBsw6AgbeG7mXQga2nhu4NtIHRyYSBwaMO5IGjhu6NwIHThu5F0IGNobyBo4buTaSBxdXkgbG9naXN0aWMsIMSR4bq3YyBiaeG7h3QgbMOgIMSR4buRaSB24bubaSBjw6FjIG3DtCBow6xuaCBk4buxIGLDoW8gcuG7p2kgcm8uIEtp4buDbSB0cmEgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCBjaG8gYuG6oW4gYmnhur90IGThu68gbGnhu4d1IGPhu6dhIGLhuqFuIHBow7kgaOG7o3AgduG7m2kgbcO0IGjDrG5oIG5oxrAgdGjhur8gbsOgby4gQ+G7pSB0aOG7gywga2nhu4NtIHRyYSBITCB0w61uaCB0b8OhbiB4ZW0gdOG7tyBs4buHIHPhu7Ega2nhu4duIHF1YW4gc8OhdCDEkcaw4bujYyBjw7Mga2jhu5twIHbhu5tpIHThu7cgbOG7hyBz4buxIGtp4buHbiBk4buxIGtp4bq/biB0cm9uZyBjw6FjIHBow6JuIG5ow7NtIGTDom4gc+G7kSBoYXkga2jDtG5nLg0KDQpgYGB7cn0NCmJscl90ZXN0X2hvc21lcl9sZW1lc2hvdyhtb2RlbCkNCmBgYA0KDQpUYSBjw7MgUHZhbHVlIFw8IDAuMDUgPSBcPiBE4buvIGxp4buHdSBtw7QgaMOsbmgga2jDtG5nIHBow7kgaOG7o3AgduG7m2kgc+G7sSBraeG7h24NCg0KU29uZyBzb25nIHbhu5tpIGtp4buDbSDEkeG7i25oIEhvc21lci1MZW1lc2hvdywgdGjDrCBjxaluZyBjw7Mga2nhu4NtIMSR4buLbmggY+G7p2EgUGVhcnNvbiBDaGkyLCBraeG7g20gxJHhu4tuaCBuw6B5IGPFqW5nIGNobyBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB0xrDGoW5nIHThu7EgbmjGsG5nIGtow6FjIHTDrSB24buBIG7hu5lpIGR1bmcNCg0KIyMjIEdhaW5zIGNoYXJ0IHbDoCBMaWZ0IGNoYXJ0IA0KDQpHYWluIHbDoCBMaWZ0IGNoYXJ0IGzDoCBjw7RuZyBj4bulIHRy4buxYyBxdWFuIGjDs2EgxJHhu4MgxJHDoW5oIGdpw6EgdMOtbmggaGnhu4d1IHF14bqjIGPhu6dhIG3DtCBow6xuaCBi4bqxbmcgdmnhu4djIGNobyB0aOG6pXkgdOG7tyBs4buHIHBo4bqjbiBo4buVaSBj4bunYSBt4buZdCBuaMOzbSBuaOG6pXQgxJHhu4tuaCAoc+G7rSBk4bulbmcgbcO0IGjDrG5oKSBraMOhYyB0aOG6vyBuw6BvIHbhu5tpIG3hu5l0IG5ow7NtIMSRxrDhu6NjIGNo4buNbiBuZ+G6q3Ugbmhpw6puIChraMO0bmcgc+G7rSBk4bulbmcgbcO0IGjDrG5oKQ0KDQojIyMjIELhuqNuZyBHYWlucyANCg0KYGBge3J9DQpibHJfZ2FpbnNfdGFibGUobW9kZWwpDQpgYGANCg0KIyMjIyBCaeG7g3UgxJHhu5MgTGlmdCAgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm1vZGVsICU+JQ0KICAgIGJscl9nYWluc190YWJsZSgpICU+JQ0KICAgIHBsb3QoKQ0KYGBgDQoNCsSQ4buRaSB24bubaSAyNSUgxJHhuqd1IHRpw6puIG7hur91IHPhu60gZOG7pW5nIG3DtCBow6xuaCB0aMOsIHThu7cgbOG7hyBwaOG6o24gaOG7k2kgbMOgIDgxLjI1JSwgbmfGsOG7o2MgbOG6oWkga2hpIGtow7RuZyBz4butIGThu6VuZyBtw7QgaMOsbmggdGjDrCBsw6AgMjUlIA0KDQojIyMgxJDGsOG7nW5nIGNvbmcgUk9DDQoNCsSQxrDhu51uZyBjb25nIFJPQyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIMSR4buTIGjhu41hIGPhu6dhIHTDrW5oIGjhu6NwIGzhu4cgY+G7p2EgY8OhYyBnacOhIHRy4buLIGPhuq90IGNobyBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljLiDEkMaw4budbmcgY29uZyBST0MgxJHGsOG7o2MgduG6vSBi4bqxbmcgY8OhY2ggc+G7rSBk4bulbmcgxJHhu5kgbmjhuqF5IHbDoCDEkeG6t2MgaWZpY2l0eSBjaG8gdOG6pXQgY+G6oyBjw6FjIGdpw6EgdHLhu4sgY+G6r3QgY8OzIHRo4buDLCB04bupYyBsw6AgdOG6pXQgY+G6oyBjw6FjIMSRaeG7g20gc+G7kSB4w6FjIHN14bqldC4gQmnhu4N1IMSR4buTIMSRxrDhu6NjIHbhur0gYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIMSR4buZIG5o4bqheSB0csOqbiB0cuG7pWMgeSB2w6AgMS3EkeG6t2MgaWZpY2l0eSB0csOqbiB0cuG7pWMgeC4gQuG6pXQga+G7syDEkWnhu4NtIG7DoG8gdHLDqm4gxJHGsOG7nW5nIGNvbmcgUk9DIMSR4bqhaSBkaeG7h24gY2hvIG3hu5l0IMSRxqFuIHbhu4sgxJHhu5kgbmjhuqF5IFggKDEtxJHhurdjaWZpY2l0eSkgdMawxqFuZyDhu6luZyB24bubaSBt4buZdCBnacOhIHRy4buLIGPhuq90LiBEaeG7h24gdMOtY2ggZMaw4bubaSDEkcaw4budbmcgY29uZyBST0MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgbmjGsCBt4buZdCDEkcahbiB24buLIHjDoWMgbmjhuq1uIGNobyBtw7QgaMOsbmggLSBkaeG7h24gdMOtY2ggY8OgbmcgbOG7m24gdGjDrCBtw7QgaMOsbmggY8OgbmcgdOG7kXQuDQoNCmBgYHtyfQ0KbW9kZWwgJT4lDQogICAgYmxyX2dhaW5zX3RhYmxlKCkgJT4lDQogIGJscl9yb2NfY3VydmUoKQ0KYGBgDQoNCiMjIyBCaeG7g3UgxJHhu5MgS1MNCg0KVGjhu5FuZyBrw6ogS1MgbOG6oWkgbMOgIG3hu5l0IMSRxqFuIHbhu4sgxJFvIGto4bqjIG7Eg25nIGhp4buHdSBxdeG6oyBj4bunYSBtw7QgaMOsbmggdsOgIMSRxrDhu6NjIHThuqFvIHJhIGLhurFuZyBjw6FjaCBz4butIGThu6VuZyDEkcaw4budbmcgY29uZyBsaWZ0LiDEkMaw4budbmcgY29uZyBsaWZ0IMSRxrDhu6NjIHThuqFvIHJhIMSR4buDIHbhur0gJSBz4buxIGtp4buHbi4gTuG6v3UgY2jDum5nIHRhIGPFqW5nIHbhur0gJSBraMO0bmcgc+G7sSBraeG7h24gdHLDqm4gY8O5bmcgbeG7mXQgdOG7tyBs4buHLCB24bubaSAlIGTDom4gc+G7kSB0csOqbiB0cuG7pWMgeCwgY2jDum5nIHRhIHPhur0gY8OzIG3hu5l0IMSRxrDhu51uZyBjb25nIGtow6FjLiBLaG/huqNuZyBjw6FjaCBs4bubbiBuaOG6pXQgZ2nhu69hIMSRxrDhu51uZyBjb25nIGxpZnQgY2hvIHPhu7Ega2nhu4duIHbDoCDEkcaw4budbmcgY29uZyBjaG8ga2jDtG5nIHPhu7Ega2nhu4duIMSRxrDhu6NjIGfhu41pIGzDoCBLUy4gxJDhu5FpIHbhu5tpIG3hu5l0IG3DtCBow6xuaCB04buRdCwgS1MgbsOqbiBs4bubbiAoXD49MC4zKSB2w6AgbsOqbiB44bqjeSByYSBjw6BuZyBn4bqnbiB04bu3IGzhu4cgc+G7sSBraeG7h24gY8OgbmcgdOG7kXQuDQoNCmBgYHtyfQ0KbW9kZWwgJT4lDQogICAgYmxyX2dhaW5zX3RhYmxlKCkgJT4lDQogIGJscl9rc19jaGFydCgpDQpgYGANCg0KDQojIyMgxJDGsOG7nW5nIGNvbmcgTG9yZW56DQoNCsSQxrDhu51uZyBjb25nIExvcmVueiBsw6AgbeG7mXQgY8O0bmcgY+G7pSDEkeG7kyBo4buNYSDEkcahbiBnaeG6o24gY2hvIHRo4bqleSBt4bupYyDEkeG7mSBi4bqldCBiw6xuaCDEkeG6s25nIHRyb25nIHBow6JuIHBo4buRaSBiaeG6v24gY+G6p24gcXVhbiB0w6JtLiDEkMOieSBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIMSR4buTIGjhu41hIG3DtCB04bqjIHTDrW5oIGLhuqV0IGLDrG5oIMSR4bqzbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJFvIGto4bqjIG7Eg25nIHBow6JuIGxv4bqhaSBj4bunYSBtw7QgaMOsbmggZOG7sSDEkW/DoW4uDQoNCmBgYHtyfQ0KYmxyX2xvcmVuel9jdXJ2ZShtb2RlbCkNCmBgYA0KDQojICoqQ2jGsMahbmcgNDoqKiAqKkvhur5UIExV4bqsTioqDQoNCiMjIMOdIG5naMSpYSBj4bunYSBo4buVaSBxdXkgbG9naXN0aWMNCg0KSOG7k2kgcXV5IGxvZ2lzdGljIHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG6uyBoaeG7g3UgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBt4buZdCBiaeG6v24gcGjhu6UgdGh14buZYyB2w6AgbeG7mXQgaG/hurdjIG5oaeG7gXUgYmnhur9uIMSR4buZYyBs4bqtcC4gQ8OhYyB0csaw4budbmcgaOG7o3Agc+G7rSBk4bulbmcgxJFp4buDbiBow6xuaCBjaG8gaOG7k2kgcXV5IGxvZ2lzdGljIGPDsyBr4bq/dCBxdeG6oyBjw7Mva2jDtG5nIGhv4bq3YyDEkeG6oXQva2jDtG5nIMSR4bqhdC4NCg0KIyMgxq91IMSRaeG7g20gY+G7p2EgcGFja2FnZQ0KDQpI4buTaSBxdXkgbG9naXN0aWMgZOG7hSB0aOG7sWMgaGnhu4duLCBkaeG7hW4gZ2nhuqNpIHbDoCDEkcOgbyB04bqhby4gS+G7uSB0aHXhuq10IGjhu5NpIHF1eSBsb2dpc3RpYyDEkcOjIHh14bqldCBoaeG7h24gdOG7qyBuaOG7r25nIG7Eg20gMTk3MCwgdsOsIHbhuq15IGPDoWMgbmjDoCBraG9hIGjhu41jIGThu68gbGnhu4d1IGPDsyB0aOG7gyBk4buFIGTDoG5nIHPhu60gZOG7pW5nIGzhuqFpIG3hu5l0IHRyaeG7g24ga2hhaSBt4bqhbmggbeG6vSB04burIGPDoWMga2hvIGzGsHUgdHLhu68gbcOjIG5ndeG7k24gbeG7nyBob+G6t2MgYuG6pXQga+G7syBi4buZIGPDtG5nIGPhu6UgdGjGsMahbmcgbeG6oWkgbsOgby4NCg0KVsOsIG7DsyBsw6AgbeG7mXQgdHJvbmcgbmjhu69uZyB0aHXhuq10IHRvw6FuIMSRxrDhu6NjIHPhu60gZOG7pW5nIHLhu5luZyByw6NpIG5o4bqldCB0cm9uZyBo4buNYyBtw6F5LCBuw6puIHZp4buHYyBodeG6pW4gbHV54buHbiBk4buvIGxp4buHdSB24bubaSBuw7MgdsOgIHRo4buxYyBoaeG7h24gY8OhYyBjw7RuZyB2aeG7h2MgaOG7jWMgbcOheSBraMOhYyB0csOqbiDEkcOzIGPFqW5nIHLhuqV0IHRodeG6rW4gdGnhu4duLCBjaOG6s25nIGjhuqFuIG5oxrAgdHJp4buDbiBraGFpIG7DsywgdGhlbyBkw7VpIGhp4buHdSBzdeG6pXQgbcO0IGjDrG5oIHbDoCBs4bq3cCBs4bqhaSB0csOqbiBuw7MuDQoNCiMgKipUw6BpIGxp4buHdSB0aGFtIGto4bqjbyoqDQoNCltNb3JvIGV0IGFsLiwgMjAxNF0gUy4gTW9ybywgUC4gQ29ydGV6IGFuZCBQLiBSaXRhLiBBIERhdGEtRHJpdmVuIEFwcHJvYWNoIHRvIFByZWRpY3QgdGhlIFN1Y2Nlc3Mgb2YgQmFuayBUZWxlbWFya2V0aW5nLiBEZWNpc2lvbiBTdXBwb3J0IFN5c3RlbXMsIEVsc2V2aWVyLCA2MjoyMi0zMSwgSnVuZSAyMDE0DQo=