PHẦN 1: CHUẨN BỊ DỮ LIỆU

1.1 ĐỌC DỮ LIỆU

1.1.1 Đọc file dữ liệu gốc

data <- read.csv ("C:/Users/ADMIN/Desktop/PTDL DINH TINH/Thyroid_Diff.csv", header = T)
  • Cấu trúc bộ dữ liệu
str(data)
## 'data.frame':    383 obs. of  13 variables:
##  $ Age                 : int  27 34 30 62 62 52 41 46 51 40 ...
##  $ Gender              : chr  "F" "F" "F" "F" ...
##  $ Smoking             : chr  "No" "No" "No" "No" ...
##  $ Hx.Smoking          : chr  "No" "Yes" "No" "No" ...
##  $ Hx.Radiothreapy     : chr  "No" "No" "No" "No" ...
##  $ Thyroid.Function    : chr  "Euthyroid" "Euthyroid" "Euthyroid" "Euthyroid" ...
##  $ Physical.Examination: chr  "Single nodular goiter-left" "Multinodular goiter" "Single nodular goiter-right" "Single nodular goiter-right" ...
##  $ Adenopathy          : chr  "No" "No" "No" "No" ...
##  $ Pathology           : chr  "Micropapillary" "Micropapillary" "Micropapillary" "Micropapillary" ...
##  $ Focality            : chr  "Uni-Focal" "Uni-Focal" "Uni-Focal" "Uni-Focal" ...
##  $ Risk                : chr  "Low" "Low" "Low" "Low" ...
##  $ Response            : chr  "Indeterminate" "Excellent" "Excellent" "Excellent" ...
##  $ Recurred            : chr  "No" "No" "No" "No" ...

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

# Chọn các biến định tính
dldt <- c("Age", "Gender", "Smoking", "Hx.Smoking", "Hx.Radiothreapy", "Thyroid.Function", "Focality", "Response", "Recurred")

# Tạo bộ dữ liệu mới chỉ chứa định tính
dat <- data[, dldt]
  • Cấu trúc bộ dữ liệu
str(dat)
## 'data.frame':    383 obs. of  9 variables:
##  $ Age             : int  27 34 30 62 62 52 41 46 51 40 ...
##  $ Gender          : chr  "F" "F" "F" "F" ...
##  $ Smoking         : chr  "No" "No" "No" "No" ...
##  $ Hx.Smoking      : chr  "No" "Yes" "No" "No" ...
##  $ Hx.Radiothreapy : chr  "No" "No" "No" "No" ...
##  $ Thyroid.Function: chr  "Euthyroid" "Euthyroid" "Euthyroid" "Euthyroid" ...
##  $ Focality        : chr  "Uni-Focal" "Uni-Focal" "Uni-Focal" "Uni-Focal" ...
##  $ Response        : chr  "Indeterminate" "Excellent" "Excellent" "Excellent" ...
##  $ Recurred        : chr  "No" "No" "No" "No" ...
# Chuyển các biến định tính sang factor
dat$Age <- as.factor(dat$Age)
dat$Gender <- as.factor(dat$Gender)
dat$Smoking <- as.factor(dat$Smoking)
dat$Hx.Radiothreapy <- as.factor(dat$Hx.Smoking)
dat$Hx.Radiothreapy <- as.factor(dat$Hx.Radiothreapy)
dat$Thyroid.Function <- as.factor(dat$Thyroid.Function)
dat$Focality <- as.factor(dat$Focality)
dat$Response <- as.factor(dat$Response)
dat$Recurred <- as.factor(dat$Recurred)

PHẦN 2: PHÂN TÍCH CÁC YẾU TỐ ẢNH HƯỞNG ĐẾN KHẢ NĂNG TÁI PHÁT BỆNH UNG THƯ TUYẾN GIÁP BIỆT HÓA

CHƯƠNG 1: TỔNG QUAN NGHIÊN CỨU

1.1 Giới thiệu dự liệu “Thyroid Disease Data”

  • Trong nghiên cứu này, tác giả sử dụng bộ dữ liệu bệnh tuyến giáp (Thyroid Disease Data) được đăng tải công khai trên nền tảng Kaggle bởi Jainaru (2023). Dữ liệu được thu thập từ 383 bệnh nhân đã được điều trị ung thư tuyến giáp thể biệt hóa tốt (differentiated thyroid cancer) và được theo dõi trong vòng ít nhất 10 năm sau điều trị. Mục tiêu của việc thu thập bộ dữ liệu này là đánh giá các yếu tố lâm sàng, hành vi và sinh lý học có thể ảnh hưởng đến khả năng tái phát bệnh sau điều trị.

  • Bộ dữ liệu bao gồm tổng cộng 13 biến nhưng với mục tiêu nghiên cứu nên chỉ sử dụng 9 biến, trong đó biến phụ thuộc là biến nhị phân “Recurred”, biểu thị việc bệnh nhân có tái phát ung thư sau điều trị hay không. Các biến độc lập còn lại được chia thành ba nhóm chính: đặc điểm nhân khẩu học, yếu tố hành vi và tiền sử bệnh lý, và đặc điểm khối u và phản ứng điều trị.

  • Bên cạnh đó, dữ liệu đã được xử lý sơ bộ với tỷ lệ thiếu dữ liệu không đáng kể và không xuất hiện các giá trị ngoại lai rõ rệt, đảm bảo độ tin cậy cho quá trình ước lượng mô hình. Ngoài ra, bộ dữ liệu cũng đã từng được sử dụng trong các nghiên cứu học thuật khác với mục tiêu tương tự, bao gồm cả các ứng dụng trong học máy nhằm nâng cao độ chính xác trong dự báo tái phát bệnh.

  • Tóm lại, với đặc trưng là một bộ dữ liệu thực tế, đa biến và định hướng rõ ràng về mặt y học, bộ dữ liệu bệnh tuyến giáp mang lại nền tảng phù hợp và giá trị cho việc xây dựng và kiểm định các mô hình phân tích thống kê, từ đó góp phần hỗ trợ việc nhận diện các yếu tố nguy cơ có ảnh hưởng đến khả năng tái phát bệnh ở bệnh nhân ung thư tuyến giáp biệt hóa tốt.

  • Mô tả các đặc trưng của dữ liệu

    • Age: Tuổi của bệnh nhân tại thời điểm điều trị
    • Gender(F/M): Giới tính của bệnh nhân
    • Famale (F): Nữ
    • Male (M): Nam
    • Smoking(Yes/No): Bệnh nhân có đang hút thuốc hiện tại không
    • Hx.Smoking(Yes/No): Tiền sử hút thuốc
    • Hx.Radiothreapy(Yes/No): Bệnh nhân có từng xạ trị trước đó không?
    • Thyroid.Function(Euthyroid, Hyperthyroid, Hypothyroid): Tình trạng chức năng tuyến giáp
    • Euthyroid: Tuyến giáp bình thường
    • Hyperthyroid: Cường giáp (tuyến giáp hoạt động quả mức)
    • Hypothryoid: Suy giáp (tuyến giáp hoạt động kém)
    • Focality(Uni-Focal, Multi-Focal): Tình trạng khối u đơn ổ hay đa ổ
    • Response(Excellent, Indeterminate, Incomplete…): Mức độ đáp ứng điều trị
    • Recurred(Yes/No): Bệnh nhân có tái phát sau điều trị không?

1.2 Bối cảnh nghiên cứu

  • Ung thư tuyến giáp là một trong những loại ung thư nội tiết phổ biến nhất, với tỷ lệ mắc bệnh gia tăng đều đặn trong những thập niên gần đây trên toàn thế giới. Mặc dù tiên lượng điều trị bệnh thường khá khả quan, một tỷ lệ không nhỏ bệnh nhân vẫn có nguy cơ tái phát sau điều trị, ảnh hưởng đến chất lượng cuộc sống cũng như hiệu quả chăm sóc y tế. Do đó, việc phát hiện sớm các yếu tố nguy cơ ảnh hưởng đến khả năng tái phát là điều vô cùng cần thiết để hỗ trợ bác sĩ đưa ra phác đồ điều trị và theo dõi bệnh nhân hiệu quả hơn. Trong bối cảnh đó, dữ liệu y tế đang đóng vai trò ngày càng quan trọng trong việc hỗ trợ chẩn đoán, tiên lượng và đưa ra quyết định điều trị lâm sàng. Với sự phát triển của các kỹ thuật phân tích dữ liệu và thống kê, việc khai thác các cơ sở dữ liệu bệnh án để rút ra những yếu tố quan trọng liên quan đến tái phát bệnh là hoàn toàn khả thi và thiết thực.

1.3 Mục tiêu nghiên cứu

• Phân tích thống kê mô tả đặc điểm của tập bệnh nhân ung thư tuyến giáp dựa trên các yếu tố lâm sàng và xét nghiệm ban đầu.

• Kiểm định mối liên hệ giữa các biến độc lập (giới tính, tuổi, tình trạng chức năng tuyến giáp, phản ứng điều trị, giai đoạn ung thư, v.v.) với biến phụ thuộc là tình trạng tái phát bệnh (Recurred).

• Xác định các yếu tố có ảnh hưởng thống kê đáng kể đến khả năng tái phát, từ đó hỗ trợ gợi ý nhóm bệnh nhân nguy cơ cao.

• Gợi ý định hướng ứng dụng kết quả vào công tác sàng lọc, điều trị và theo dõi sau điều trị.

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

  • Bộ dữ liệu sử dụng trong nghiên cứu có cấu trúc phù hợp cho các phân tích định lượng, đặc biệt là các mô hình thống kê nhị phân. Hầu hết các biến trong tập dữ liệu đều ở dạng nhị phân hoặc phân loại với số mức độ giới hạn, cho phép dễ dàng áp dụng các mô hình hồi quy nhị phân như hồi quy tuyến tính, Logistic Regression, Probit Model và Complementary Log-Log (Cloglog) Model. Các phương pháp này được lựa chọn nhằm đánh giá và xác định mối quan hệ giữa các yếu tố nguy cơ (biến độc lập) và khả năng tái phát bệnh (biến phụ thuộc – Recurred).

  • Bên cạnh đó, nghiên cứu cũng sử dụng các phương pháp thống kê mô tả để tóm tắt đặc điểm dữ liệu, cũng như áp dụng kiểm định Chi bình phương (Chi-squared test) nhằm đánh giá mối liên hệ độc lập giữa các biến phân loại với biến tái phát bệnh. Việc kết hợp giữa kiểm định thống kê và mô hình hồi quy nhị phân giúp tăng độ tin cậy và độ sâu cho các kết luận đưa ra.

  • Phương pháp nghiên cứu này hoàn toàn phù hợp với định hướng phân tích trong lĩnh vực thống kê y tế, đồng thời đảm bảo độ chính xác và tính thực tiễn khi áp dụng vào phân tích dữ liệu sức khỏe người bệnh.

1.5 Ý nghĩa của bài nghiên cứu

  • Nghiên cứu này mang lại ý nghĩa thực tiễn và học thuật quan trọng trong lĩnh vực y tế, đặc biệt là trong công tác theo dõi và điều trị bệnh ung thư tuyến giáp. Thông qua việc phân tích mối liên hệ giữa các yếu tố lâm sàng và khả năng tái phát bệnh sau điều trị, nghiên cứu góp phần cung cấp cơ sở dữ liệu định lượng giúp bác sĩ và nhà nghiên cứu đưa ra các quyết định lâm sàng chính xác hơn. Việc phát hiện sớm các yếu tố nguy cơ có liên quan đến khả năng tái phát không chỉ giúp cá nhân hóa phác đồ điều trị cho từng bệnh nhân mà còn hỗ trợ xây dựng các chiến lược giám sát và can thiệp hiệu quả sau điều trị. Đồng thời, về mặt học thuật, nghiên cứu này khẳng định vai trò và tính ứng dụng cao của các mô hình hồi quy nhị phân trong phân tích dữ liệu y tế, đóng góp vào kho tàng kiến thức liên ngành giữa thống kê, khoa học dữ liệu và y học.

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

2.1. Tổng quan về Ung thư tuyến giáp biệt hóa (DTC)

2.1.1. Định nghĩa

Ung thư tuyến giáp biệt hóa (Differentiated Thyroid Carcinoma – DTC) là nhóm ung thư tuyến giáp phổ biến nhất, bao gồm hai thể chính là ung thư thể nhú (Papillary Thyroid Carcinoma – PTC) và thể nang (Follicular Thyroid Carcinoma – FTC). Đây là những loại ung thư có nguồn gốc từ tế bào nang tuyến giáp và đặc trưng bởi mức độ biệt hóa tế bào cao, phản ứng tốt với iốt phóng xạ và có tiên lượng sống sót tốt hơn các thể ung thư tuyến giáp không biệt hóa.

2.1.2. Đặc điểm dịch tễ

DTC chiếm khoảng 90–95% tổng số ca ung thư tuyến giáp. Theo số liệu của Hiệp hội Ung thư Hoa Kỳ (American Cancer Society, 2023), tỷ lệ mắc mới DTC gia tăng trong những năm gần đây, đặc biệt ở phụ nữ và người trẻ tuổi. Mặc dù tỷ lệ tử vong thấp, nhưng tỷ lệ tái phát sau điều trị ban đầu vẫn đáng kể, dao động từ 10–30% tùy mức độ xâm lấn và yếu tố nguy cơ.

2.1.3. Diễn tiến và tái phát

DTC thường tiến triển chậm và đáp ứng điều trị tốt, chủ yếu bằng phẫu thuật tuyến giáp toàn phần kết hợp điều trị iốt phóng xạ (RAI) và theo dõi bằng thyroglobulin huyết thanh. Tuy nhiên, một tỷ lệ bệnh nhân sẽ tái phát tại chỗ hoặc di căn xa sau nhiều năm, làm tăng gánh nặng theo dõi và điều trị.

2.2. Các yếu tố nguy cơ ảnh hưởng đến tái phát ung thư tuyến giáp biệt hóa

  • Giới tính (Gender)

    • Cơ sở lý thuyết: Một số nghiên cứu đã chỉ ra mối liên quan giữa giới tính và nguy cơ tái phát DTC. Mặc dù nữ giới có tỷ lệ mắc DTC cao hơn, nam giới lại thường có tiên lượng xấu hơn và nguy cơ tái phát cao hơn. Giải thích sinh học có thể liên quan đến đặc điểm nội tiết tố và sự khác biệt trong đáp ứng điều trị.

    • Nghiên cứu liên quan: Một nghiên cứu đa trung tâm tại Canada trong khuôn khổ dự án CANNECT (2000–2010) đã phân tích 2.595 bệnh nhân ung thư tuyến giáp biệt hóa (DTC), bao gồm 528 nam và 2.067 nữ. Kết quả cho thấy tỷ lệ tái phát ở nam giới là 8,5%, cao hơn rõ rệt so với nữ giới chỉ 2,2% (p<0.001)

  • Hút thuốc lá (Smoking)

    • Cơ sở lý thuyết: Hút thuốc có thể làm tăng nguy cơ tái phát DTC thông qua cơ chế ức chế miễn dịch, tăng viêm mạn tính, làm giảm hiệu quả điều trị iốt phóng xạ hoặc tương tác bất lợi với hormon tuyến giáp. Ngoài ra, các chất độc trong khói thuốc như nicotine và cadmium có thể thúc đẩy tiến trình ung thư thông qua stress oxy hóa và đột biến DNA.

    • Nghiên cứu liên quan: Nghiên cứu cohort của Hàn Quốc (96.855 người): nam giới hút thuốc hiện tại có nguy cơ mắc ung thư tuyến giáp thấp hơn (HR 0.58) so với người không hút, kết quả vẫn còn ý nghĩa sau khi điều chỉnh BMI và TSH PubMed

  • Tiền sử xạ trị vùng đầu cổ (Hx.Radiotherapy)

    • Cơ sở lý thuyết: Phơi nhiễm với bức xạ ion hóa, đặc biệt trong giai đoạn tuổi trẻ, là yếu tố nguy cơ đã được xác định rõ ràng trong sinh ung thư tuyến giáp. Tia xạ còn có thể ảnh hưởng đến cấu trúc mô giáp, làm tăng nguy cơ hình thành các ổ ung thư thứ phát hoặc tái phát tại mô còn sót lại sau phẫu thuật.

    • Nghiên cứu liên quan: Một nghiên cứu nested case–control ở Đức ghi nhận mỗi 1 Gy liều trung bình đến tuyến giáp làm tăng khoảng 5.1% nguy cơ phát ung thư tuyến giáp.

  • Đặc điểm tổn thương (Focality)

    • Cơ sở lý thuyết: DTC đơn ổ (unifocal) thường có tiên lượng tốt hơn so với DTC đa ổ (multifocal), vì tổn thương đa ổ thường liên quan đến mức độ xâm lấn cao hơn, khả năng di căn hạch cổ và khó kiểm soát bằng phẫu thuật đơn thuần.

    • Nghiên cứu liên quan: Một phân tích tổng hợp được công bố trên JAMA Otolaryngology – Head & Neck Surgery năm 2021 đã tổng hợp 26 nghiên cứu với 33.976 bệnh nhân ung thư tuyến giáp thể nhú (PTC), cho thấy tổn thương đa ổ (multifocality) làm tăng đáng kể nguy cơ tái phát so với tổn thương đơn ổ (unifocal).

  • Phản ứng điều trị ban đầu (Response to initial therapy)

    • Cơ sở lý thuyết: Đánh giá đáp ứng sau điều trị được phân loại theo hướng dẫn của Hiệp hội Tuyến giáp Hoa Kỳ (ATA) gồm: hoàn toàn (Excellent), không xác định (Indeterminate), không đầy đủ về cấu trúc (Structural incomplete) và không đầy đủ về sinh học (Biochemical incomplete). Nhóm có đáp ứng Excellent có nguy cơ tái phát cực thấp (dưới 1%), trong khi nhóm Structural incomplete có nguy cơ tái phát trên 30%.

    • Nghiên cứu liên quan: Tuttle et al. (Yale) đề xuất hệ thống phân loại đáp ứng điều trị ban đầu Excellent Response (ER), Biochemical Incomplete (BIR), Indeterminate Response (IR) và Structural Incomplete (SIR) dựa trên thyroglobulin và hình ảnh sau 6–18 tháng. Nghiên cứu trên 501 bệnh nhân DTC theo dõi ~101 tháng cho thấy nhóm ER có nguy cơ tái phát và tử vong rất thấp (92.2% duy trì ER), trong khi nhóm BIR/SIR có nguy cơ tiến triển cao (90% ở SIR). Ở bệnh nhân <45 tuổi, tỉ lệ tái phát tăng rõ từ 4.2% (ER) lên 82.6% (SIR), khẳng định đáp ứng ban đầu là yếu tố tiên lượng quan trọng.

CHƯƠNG 3: PHƯƠNG PHÁP NGHIÊN CỨU

Trong nghiên cứu này, biến phụ thuộc là khả năng tái phát bệnh ung thư tuyến giáp biệt hóa, được mã hóa nhị phân (0: không tái phát, 1: có tái phát). Do đó, các mô hình hồi quy nhị phân là lựa chọn phù hợp để đánh giá mối liên hệ giữa các yếu tố nguy cơ và khả năng tái phát bệnh.

3.1. Các mô hình hồi quy cho biến phụ thuộc nhị phân

3.1.1. Mô hình Hồi quy Logistic (Logit Model)

Mô hình Logit được sử dụng phổ biến để phân tích mối quan hệ giữa một biến phụ thuộc nhị phân và một hoặc nhiều biến độc lập (liên tục hoặc định tính). Mục tiêu là ước lượng xác suất xảy ra sự kiện (ở đây là tái phát bệnh).

Xác suất tái phát của cá thể thứ \(i\) được mô hình hóa như sau:

\[ P_i = P(Y_i = 1 | X_i) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_{1i} + \dots + \beta_k X_{ki})}} = \frac{e^{Z_i}}{1 + e^{Z_i}} \]

Trong đó:

  • \(P_i\): Xác suất cá thể \(i\) bị tái phát bệnh.
  • \(X_{1i}, \dots, X_{ki}\): Giá trị của các biến độc lập của cá thể \(i\).
  • \(\beta_0, \beta_1, \dots, \beta_k\): Các hệ số hồi quy cần ước lượng.
  • \(Z_i = \beta_0 + \beta_1 X_{1i} + \dots + \beta_k X_{ki}\)

Để tuyến tính hóa mô hình, người ta sử dụng hàm logit:

\[ L_i = \ln\left( \frac{P_i}{1 - P_i} \right) = \beta_0 + \beta_1 X_{1i} + \dots + \beta_k X_{ki} \]

Tỷ số \(\frac{P_i}{1 - P_i}\) được gọi là tỷ số chênh (odds), cho biết khả năng xảy ra sự kiện so với không xảy ra sự kiện. Mỗi hệ số \(\beta_k\) được diễn giải bằng tỷ số chênh lệch (Odds Ratio – OR):

\[ OR_k = e^{\beta_k} \]

Ý nghĩa: Khi biến \(X_k\) tăng một đơn vị (và các biến khác giữ nguyên), odds của việc tái phát bệnh sẽ thay đổi \(e^{\beta_k}\) lần.


3.1.2. Mô hình Probit

Mô hình Probit là một lựa chọn thay thế cho Logit, với khác biệt chính nằm ở hàm liên kết. Probit sử dụng hàm phân phối tích lũy chuẩn \(\Phi(Z)\) thay vì hàm logistic.

Mô hình có dạng:

\[ P_i = P(Y_i = 1 | X_i) = \Phi(Z_i) = \int_{-\infty}^{Z_i} \frac{1}{\sqrt{2\pi}} e^{-t^2/2} dt \]

Trong đó:

\[ Z_i = \beta_0 + \beta_1 X_{1i} + \dots + \beta_k X_{ki} \]

Mặc dù Logit và Probit sử dụng các phân phối khác nhau (logistic vs chuẩn), trong thực tế hai mô hình thường cho kết quả khá tương đồng. Tuy nhiên, Logit được ưa chuộng hơn do khả năng diễn giải đơn giản thông qua Odds Ratio.


3.1.3. Mô hình Cloglog

Mô hình Cloglog là một dạng của hồi quy nhị phân, trong đó hàm liên kết là:

\[ \log(-\log(1 - p)) = \eta = \beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k \]

Từ đó, xác suất xảy ra sự kiện là:

\[ p = 1 - \exp(-\exp(\eta)) \]

Để ước lượng các tham số \(\beta\), mô hình sử dụng phương pháp ước lượng hợp lý tối đa (MLE), thông qua việc cực đại hóa hàm log-likelihood:

\[ \ell(\beta) = \sum_{i=1}^{n} \left[ y_i \log(1 - \exp(-\exp(\eta_i))) + (1 - y_i)( -\exp(\eta_i)) \right] \]

Phương pháp này đặc biệt phù hợp khi xác suất xảy ra sự kiện không đối xứng hoặc sự kiện hiếm. Hàm liên kết cloglog giúp mô hình phản ánh tốt hơn sự thay đổi nhanh chóng về xác suất gần ngưỡng 1.


3.2. Kiểm định sự phù hợp của mô hình

Để đánh giá mức độ phù hợp của mô hình hồi quy nhị phân (logit, probit, cloglog), các chỉ số được dùng để đánh giá phổ biến như:

3.2.1. Chỉ số AIC (Akaike Information Criterion)

  • Công thức:

    \[ AIC = -2 \cdot \log(L) + 2k \]

    Trong đó:

    • \(L\) là giá trị hàm hợp lý tối đa (likelihood),

    • \(k\) là số lượng tham số ước lượng trong mô hình.

  • Ý nghĩa: AIC là thước đo cân bằng giữa độ phù hợp của mô hình và độ phức tạp của nó. Mô hình có AIC thấp hơn được xem là phù hợp hơn, tránh được hiện tượng overfitting.

3.2.2. Hàm log-likelihood

Do hàm Likelihood là một tích phức tạp, người ta thường sử dụng logarit của nó để dễ tính toán:

\[ \ln L = \sum_{i=1}^{n} \left[ Y_i \ln(P_i) + (1 - Y_i) \ln(1 - P_i) \right] \]

Quá trình ước lượng sẽ tìm các giá trị \(\hat{\beta}_0, \hat{\beta}_1, \dots, \hat{\beta}_k\) sao cho hàm log-likelihood đạt cực đại. Việc tối ưu hóa này thường được thực hiện bằng các thuật toán số như Newton-Raphson, Fisher scoring, hay Gradient ascent.

CHƯƠNG 4: PHÂN TÍCH CÁC YẾU TỐ ẢNH HƯỞNG ĐẾN KHẢ NĂNG TÁI PHÁT BỆNH UNG THƯ TUYẾN GIÁP

PHÂN TÍCH ĐƠN BIẾN

4.1 Giới tính tác động đến khả năng tái bệnh

install.packages("ggplot2", repos = "https://cloud.r-project.org")
## Installing package into 'C:/Users/ADMIN/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## 
##   There is a binary version available but the source version is later:
##         binary source needs_compilation
## ggplot2  3.5.1  3.5.2             FALSE
## installing the source package 'ggplot2'
library(ggplot2)

4.1.1 Bảng tần số - tần suất cho biến giới tính

  • Đầu tiên, tôi sẽ lập bảng tần số cho biến giới tính nhằm mục đích nắm rõ số lượng bệnh nhân tham gia khảo sát sau khi điều trị tại bệnh viện. Kết quả cung cấp cái nhìn tổng quan về cách mức lương được phân phối trong dữ liệu.
tab_gender <- table(dat$Gender)
tab_gender
## 
##   F   M 
## 312  71
  • Với kết quả trên, có thể sử dụng biểu đồ cột để thể hiện rõ số lượng giới tính của bệnh nhân. Qua trực quan hóa biểu đồ ta có thể dễ dàng nhận xét cũng như so sánh 2 nhóm giới tính nam và nữ với nhau.
barplot(tab_gender,
        main = "Biểu đồ tần số giới tính",
        xlab = "Giới tính",
        ylab = "Tần số",
        col = c("skyblue", "salmon"),
        border = "white",
        ylim = c(0, max(tab_gender) + 5)) -> bp

text(x = bp, y = tab_gender + 1, labels = tab_gender)

  • Thông qua bảng tần số và biểu đồ trực quan hóa cho ta thấy rằng bệnh nhân có giới tính nữ giới là 312 người, đây là đối tượng chiếm đa số trong bài khảo sát. Ở nhóm bệnh nhân là nam giới với 71 bệnh nhân chiếm tỷ số ít hơn nhóm đôi tượng nữ giới. Tổng số bệnh nhân tham gia khảo sát của cả 2 giới tính là 383 người.

  • Ngoài ra chúng ta sẽ thực hiện tính tỷ lệ phần trăm cho từng nhóm và vẽ biểu đồ tròn thể hiện tỷ lệ phần trăm ở cả 2 nhóm đối tượng tham gia khảo sát để so sánh theo số lượng tương đối.

table(dat$Gender)/sum(nrow(dat))
## 
##         F         M 
## 0.8146214 0.1853786
# Tạo dataframe từ bảng tần số
gender_freq <- as.data.frame(tab_gender)
colnames(gender_freq) <- c("Gender", "Frequency")

# Tính phần trăm
gender_freq$Percentage <- gender_freq$Frequency / sum(gender_freq$Frequency) * 100

# Tạo nhãn chỉ gồm phần trăm
gender_freq$Label <- paste0(round(gender_freq$Percentage, 1), "%")

# Vẽ biểu đồ tròn với nhãn chỉ phần trăm
ggplot(gender_freq, aes(x = "", y = Percentage, fill = Gender)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  theme_void() +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
  labs(title = "Phân bố giới tính của các bệnh nhân") +
  scale_fill_brewer(palette = "Pastel1")

  • Biểu đồ tròn thể hiện phân bố giới tính của các bệnh nhân sau điều trị ung thư tuyến giáp biệt hóa cho thấy sự chênh lệch rõ rệt giữa hai nhóm nam và nữ. Cụ thể, tỷ lệ nữ giới chiếm đến 81.5%, trong khi nam giới chỉ chiếm 18.5% tổng số bệnh nhân tham gia khảo sát.

  • Kết quả này phù hợp với đặc điểm dịch tễ học đã được ghi nhận trong nhiều nghiên cứu trước đây, khi mà ung thư tuyến giáp biệt hóa có xu hướng phổ biến ở nữ giới nhiều hơn so với nam giới, với tỷ lệ mắc bệnh ở nữ có thể cao gấp 2–4 lần. Nguyên nhân của sự khác biệt này có thể liên quan đến yếu tố nội tiết (hormone estrogen), sự khác biệt trong hành vi tìm kiếm chăm sóc sức khỏe, cũng như sự nhạy cảm về mặt di truyền ở nữ giới.

  • Tỷ lệ nữ giới cao trong nhóm nghiên cứu cũng đặt ra những yêu cầu đặc thù trong chăm sóc sau điều trị, đặc biệt ở các giai đoạn tái phát hoặc theo dõi dài hạn. Điều này cho thấy việc cân nhắc yếu tố giới tính trong phân tích nguy cơ tái phát và xây dựng chiến lược theo dõi bệnh nhân là rất cần thiết.

4.1.2. Thống kê mô tả cho hai biến giới tính và khả năng tái phát bệnh

4.1.2.1. Bảng tần suất chéo
  • Trong trường hợp này ta lập bảng tần số giữa hai biến giới tính và khả năng tái phát bệnh của bệnh nhân tham gia khảo sát sau điều trị. Bảng tần số giúp chúng ta hiểu rõ hơn sự khác nhau theo 2 nhóm giới tính về khả năng tái bệnh.
table_taibenh_gender <- table(dat$Gender, dat$Recurred)
table_taibenh_gender
##    
##      No Yes
##   F 246  66
##   M  29  42
  • Bảng tần số chéo giữa giới tính và tình trạng tái phát bệnh sau điều trị cho thấy có sự khác biệt rõ rệt giữa hai nhóm giới. Trong số 312 bệnh nhân nữ, có 66 người bị tái phát, trong khi 246 người không bị tái phát. Ngược lại, trong số 71 bệnh nhân nam, có 42 người bị tái phát và chỉ 29 người không bị tái phát.

  • Tỷ lệ tái phát cao hơn ở nam giới so với nữ giới là một phát hiện đáng chú ý. Điều này cho thấy giới tính có thể là một yếu tố nguy cơ tiềm năng liên quan đến khả năng tái phát bệnh sau điều trị ung thư tuyến giáp biệt hóa.

  • Kết quả này cũng phù hợp với một số nghiên cứu lâm sàng trước đây, trong đó chỉ ra rằng nam giới có xu hướng tiên lượng xấu hơn khi mắc DTC. Một phần nguyên nhân có thể xuất phát từ các yếu tố sinh học (hormonal), di truyền, hoặc do khác biệt trong đáp ứng điều trị và tuân thủ theo dõi sau điều trị.

  • Phát hiện này đặt ra yêu cầu cần kiểm định mối liên hệ thống kê giữa hai biến này bằng các phương pháp như kiểm định Chi-squared hoặc mô hình hồi quy logistic, nhằm đánh giá xem giới tính có ảnh hưởng độc lập đến nguy cơ tái phát hay không khi kiểm soát các yếu tố khác.

4.1.2.2. Trực quan hóa
# Bảng chéo
table_taibenh_gender <- table(dat$Recurred, dat$Gender)

# Chuyển thành data frame để dùng với ggplot
df_plot <- as.data.frame(table_taibenh_gender)
colnames(df_plot) <- c("Recurred", "Gender", "Count")

# Biểu đồ
ggplot(df_plot, aes(x = Gender, y = Count, fill = Recurred)) +
  geom_col(position = "dodge") +
  labs(title = "Tình trạng tái bệnh theo giới tính",
       x = "Giới tính (Gender)",
       y = "Số lượng bệnh nhân",
       fill = "Tái bệnh") +
  theme_minimal()

  • Biểu đồ cột thể hiện số lượng bệnh nhân tái phát và không tái phát ung thư tuyến giáp biệt hóa theo giới tính cho thấy có sự khác biệt rõ rệt giữa hai nhóm nam và nữ.

  • Ở nhóm nữ (F):

    • Số lượng bệnh nhân không tái phát chiếm tỷ lệ áp đảo với khoảng 246 người.

    • Trong khi đó, chỉ có khoảng 66 bệnh nhân nữ tái phát.

    • Điều này cho thấy phần lớn bệnh nhân nữ sau điều trị có kết quả ổn định và ít có nguy cơ tái phát trong giai đoạn theo dõi.

  • Ở nhóm nam (M):

    • Trái ngược với nhóm nữ, số lượng bệnh nhân nam tái phát (42 người) cao hơn số lượng nam không tái phát (29 người).

    • Điều này cho thấy tỷ lệ tái phát ở nam giới cao hơn đáng kể so với nữ giới, dù tổng số lượng bệnh nhân nam thấp hơn.

  • Từ biểu đồ, có thể nhận thấy rằng tỷ lệ tái phát ở nam giới là tương đối cao so với chính nhóm này, trong khi ở nữ giới, tái phát là hiện tượng ít gặp hơn. Đây là một chỉ báo lâm sàng quan trọng, cho thấy giới tính có thể là một yếu tố nguy cơ tiềm năng liên quan đến tiên lượng bệnh, đặc biệt là trong dự đoán tái phát.

  • Kết quả mô tả này hoàn toàn phù hợp với bảng tần số chéo trước đó và củng cố giả thuyết rằng nam giới có nguy cơ tái phát cao hơn nữ giới sau điều trị ung thư tuyến giáp biệt hóa. Điều này gợi ý rằng cần xem xét kỹ yếu tố giới tính khi thiết kế các chương trình theo dõi, quản lý sau điều trị hoặc xây dựng mô hình dự đoán nguy cơ tái phát.

4.1.3. Phân tích Relative Risk giữa giới tính và khả năng tái bệnh

install.packages("epitools", repos = "http://cran.rstudio.com")
## Installing package into 'C:/Users/ADMIN/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'epitools' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\ADMIN\AppData\Local\Temp\RtmpUT2qG2\downloaded_packages
library(epitools)
  • Trong phần này, tôi sẽ thực hiện tính Relative Risk nhằm phân tích sự ảnh hưởng của 2 nhóm giới tính lên khả năng tái phát bệnh của các bệnh nhân tham gia khảo sát.
riskratio(table_taibenh_gender)
## $data
##        
##           F  M Total
##   No    246 29   275
##   Yes    66 42   108
##   Total 312 71   383
## 
## $measure
##      risk ratio with 95% C.I.
##       estimate    lower    upper
##   No  1.000000       NA       NA
##   Yes 3.687739 2.428841 5.599141
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   No            NA           NA           NA
##   Yes 1.135052e-09 1.080909e-09 1.338005e-10
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
  • Dựa trên bảng tần số đã được giải thích rõ ở phần trước tôi sẽ tính toán Relative Risk trong đó biến độc lập là giới tính và phụ thuộc là khả năng tái phát bệnh. Nhóm tham chiếu là bệnh nhân có giới tính nam không bị tái phát bệnh. Và nhóm đối tượng cần quan tâm là nam giới bị tái phát bệnh sau điều trị.

  • Trước tiên cần tính tỷ lệ nam giới bị tái bệnh chia cho tổng số bệnh nhân ở cả 2 giới tính bị tái bệnh sau điều trị. Sau đó lấy tỷ lệ vừa tìm được chia cho tỷ lệ nhóm tham chiếu ( tức là tỷ lệ nam giới không bị tái bệnh chia cho tổng bệnh nhân ở cả 2 giới không bị tái nhiễm bệnh )

  • Nhận xét: Khi phân tích bệnh nhân ở giới tính nam bị tái nhiễm bệnh tuyến giáp sau khi điều trị ta thấy RR = 3.68, kết quả này cho biết rằng tỷ lệ bệnh nhân giới tính nam bị tái nhiễm bệnh sau điều trị cao hơp gấp 3.69 lần so với nhóm bệnh nhân là nam giới không bị tái nhiễm bệnh sau điều trị.

Khoảng ước lượng cho RR với khoảng tin cậy là 95%

Tái phát midp.exact fisher.exact chi.square
No NA NA NA
Yes 1.135052e-09 1.080909e-09 1.338005e-10
  • Kết luận

    • Kết quả kiểm định thống kê cho thấy có mối liên hệ có ý nghĩa thống kê rất mạnh giữa giới tính và tình trạng tái phát ung thư tuyến giáp biệt hóa. Cả ba phương pháp kiểm định — bao gồm Mid-p exact (p = 1.14 × 10⁻⁹), Fisher exact (p = 1.08 × 10⁻⁹) và Chi-square (p = 1.34 × 10⁻¹⁰) — đều cho giá trị p rất nhỏ, thấp hơn đáng kể so với ngưỡng ý nghĩa 0.05.
    • Điều này cho phép bác bỏ giả thuyết không (H₀: không có mối liên hệ giữa giới tính và tái phát) và khẳng định rằng giới tính là một yếu tố có liên quan thống kê đến khả năng tái phát bệnh sau điều trị ung thư tuyến giáp biệt hóa. Kết quả này củng cố quan sát trước đó về tỷ lệ tái phát cao hơn đáng kể ở nhóm bệnh nhân nam so với nữ.

4.1.4. Phân tích Odd Ratio giữa giới tính và khả năng tái bệnh

# Tính OR
oddsratio(table_taibenh_gender, conf.level = 0.95)
## $data
##        
##           F  M Total
##   No    246 29   275
##   Yes    66 42   108
##   Total 312 71   383
## 
## $measure
##      odds ratio with 95% C.I.
##       estimate    lower    upper
##   No  1.000000       NA       NA
##   Yes 5.359126 3.116278 9.345473
## 
## $p.value
##      two-sided
##         midp.exact fisher.exact   chi.square
##   No            NA           NA           NA
##   Yes 1.135052e-09 1.080909e-09 1.338005e-10
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
  • Nhận xét: Dựa trên kết quả phân tích, giới tính có mối liên hệ có ý nghĩa thống kê với khả năng tái phát bệnh tuyến giáp biệt hóa. Cụ thể, nam giới có odds ratio (OR) là 5,36 so với nữ giới, cho thấy nam giới có nguy cơ tái phát bệnh cao hơn khoảng 5,4 lần so với nữ giới. Nhóm nữ được sử dụng làm nhóm tham chiếu với OR = 1. Giá trị p rất nhỏ (p < 0,001) cho thấy sự khác biệt giữa hai nhóm là có ý nghĩa thống kê. Do đó, giới tính nam có thể được xem là một yếu tố nguy cơ liên quan đến tái phát bệnh tuyến giáp biệt hóa.

4.1.5. Thống kê suy diễn

4.1.5.1. Kiểm định tính độc lập
  • Trong nghiên cứu này, tôi tiến hành kiểm định giả thuyết nhằm đánh giá xem giới tính của bệnh nhân có ảnh hưởng đến khả năng tái phát bệnh sau điều trị hay không. Để kiểm định mối liên hệ giữa hai biến định tính này, ta sử dụng kiểm định Chi bình phương.
# Bảng tần số giữa Gender và Recurred
bts_gr <- table(dat$Gender, dat$Recurred)
# Kiểm định Chi bình phương
chisq.test(bts_gr)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  bts_gr
## X-squared = 39.397, df = 1, p-value = 3.459e-10

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

  • H₀ (Giả thuyết không): Giới tính và khả năng tái phát sau điều trị không có mối liên hệ (hai biến độc lập).

  • H₁ (Giả thuyết đối): Giới tính và khả năng tái phát sau điều trị có mối liên hệ (hai biến phụ thuộc).

Nhận xét

  • Trong nghiên cứu này, nhằm đánh giá mối liên hệ giữa giới tính và khả năng tái phát ung thư tuyến giáp biệt hóa sau điều trị, tôi đã tiến hành kiểm định giả thuyết sử dụng phương pháp Chi bình phương. Giá trị p rất nhỏ so với ngưỡng ý nghĩa α = 0.05 cho phép bác bỏ giả thuyết không (H₀), đồng thời khẳng định rằng có sự phụ thuộc có ý nghĩa thống kê giữa giới tính và tình trạng tái phát bệnh. Kết quả này phù hợp với các phân tích trước đó, trong đó Odds Ratio (OR) ước tính cho thấy nam giới có nguy cơ tái phát cao gấp 5.36 lần so với nữ giới. Những phát hiện này cho thấy giới tính là một yếu tố nguy cơ độc lập đáng lưu ý, có thể đóng vai trò trong việc xây dựng mô hình dự báo và cá thể hóa chiến lược theo dõi sau điều trị.
4.1.5.2. Kiểm định hiệu tỷ lệ
  • Nhằm đánh giá xem tỷ lệ tái phát bệnh ung thư tuyến giáp biệt hóa có sự khác biệt đáng kể giữa hai nhóm giới tính hay không, tôi đã tiến hành kiểm định hiệu tỷ lệ giữa hai nhóm độc lập.

  • Gọi p1 là tỷ lệ tái phát bệnh ở nam giới, p2 là tỷ lệ tái phát bệnh ở nữ giới.

  • Ta có giả thuyết đặt ra:

    • H0: p1-p2=0 Không có sự khác biệt về tỷ lệ tái phát giữa nam và nữ)

    • H1: p1-p2>0 (Có sự khác biệt về tỷ lệ tái phát giữa nam và nữ, tỷ lệ tái phát ở nam cao hơn nữ)

# Số ca tái phát
success <- c(42, 66)

# Tổng số bệnh nhân
n <- c(71, 312)

# Kiểm định hiệu tỷ lệ một phía: p1 - p2 > 0
prop.test(success, n, alternative = "greater", correct = FALSE)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  success out of n
## X-squared = 41.252, df = 1, p-value = 6.69e-11
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.2767949 1.0000000
## sample estimates:
##    prop 1    prop 2 
## 0.5915493 0.2115385
  • Để kiểm định giả thuyết về sự khác biệt tỷ lệ tái phát giữa hai giới, tiến hành kiểm định hai tỷ lệ độc lập với giả thuyết một phía: tỷ lệ tái phát ở nam giới cao hơn nữ giới. Kết quả cho thấy tỷ lệ tái phát ở nam giới là 59,15%, trong khi ở nữ giới là 21,15%. Kiểm định Chi bình phương cho hiệu tỷ lệ này thu được giá trị thống kê Chi-squared = 41,252 với 1 bậc tự do và p-value = 6,69×10⁻¹¹. Với mức ý nghĩa 0,05, p-value rất nhỏ cho phép bác bỏ giả thuyết H0, đồng nghĩa với việc có bằng chứng thống kê cho thấy tỷ lệ tái phát ở nam giới cao hơn đáng kể so với nữ giới.

  • Do đó, có thể kết luận rằng giới tính có mối liên hệ chặt chẽ với khả năng tái phát bệnh sau điều trị, và nam giới là nhóm có nguy cơ cao hơn. Phát hiện này là cơ sở gợi ý cần có chiến lược theo dõi và chăm sóc hậu điều trị chặt chẽ hơn đối với bệnh nhân nam giới mắc ung thư tuyến giáp biệt hóa.

4.1.6. Mô hình hồi quy cho dữ liệu nhị phân

4.1.6.1. Mô hình xác suất tuyến tính
  • Sau khi thực hiện các kiểm định thống kê nhằm đánh giá mối liên hệ giữa giới tính và khả năng tái phát bệnh, kết quả cho thấy giới tính có ảnh hưởng rõ rệt đến nguy cơ tái phát sau điều trị. Tuy nhiên, để hiểu rõ hơn về mức độ ảnh hưởng của từng yếu tố cũng như xây dựng một mô hình dự đoán khả năng tái phát, nghiên cứu tiếp tục triển khai phân tích hồi quy tuyến tính.

  • Việc sử dụng mô hình hồi quy giúp định lượng mối liên hệ giữa biến phụ thuộc (tái phát hay không) với các biến độc lập (giới tính, tuổi, tiền sử xạ trị, tình trạng hút thuốc,…). Qua đó, ta có thể xác định được yếu tố nào là nguy cơ đáng kể đối với tái phát, cũng như dự đoán khả năng tái phát của một bệnh nhân dựa trên đặc điểm lâm sàng ban đầu.

# Chuyển biến tái phát thành nhị phân: Yes = 1, No = 0
Recurred_bin <- ifelse(dat$Recurred == "Yes", 1, 0)

# Xây dựng mô hình hồi quy tuyến tính
hqtt_model <- glm(Recurred_bin ~ Gender, data = dat)

# Hiển thị kết quả
summary(hqtt_model)
## 
## Call:
## glm(formula = Recurred_bin ~ Gender, data = dat)
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.21154    0.02413   8.768  < 2e-16 ***
## GenderM      0.38001    0.05604   6.782 4.55e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.18161)
## 
##     Null deviance: 77.546  on 382  degrees of freedom
## Residual deviance: 69.193  on 381  degrees of freedom
## AIC: 437.54
## 
## Number of Fisher Scoring iterations: 2

Kết quả mô hình cho thấy hệ số hồi quy ước lượng của biến GenderM là 0.38001 với giá trị p rất nhỏ (p < 0.001), chứng tỏ giới tính nam có ảnh hưởng ý nghĩa thống kê đến xác suất tái phát bệnh. Hệ số dương này cho thấy, so với nữ giới, nam giới có tỷ lệ tái phát cao hơn trung bình khoảng 38%.

Mô hình có độ lệch phần dư (residual deviance) là 69.193 và AIC = 437.54, phản ánh mức độ phù hợp tương đối với dữ liệu. Tuy nhiên, do biến phụ thuộc là nhị phân, hồi quy tuyến tính có thể không phải là lựa chọn tối ưu về mặt lý thuyết; mô hình hồi quy logistic (logit) thường được ưu tiên hơn trong trường hợp này.

4.1.6.2. Mô hình Logit

Mô hình hồi quy Logistic là mô hình hồi quy nhị phân phổ biến nhất. Nó thuộc họ GLM với hai đặc điểm chính:

  1. Thành phần ngẫu nhiên: Biến phản hồi \(Y\) tuân theo phân phối Bernoulli (hoặc Binomial).
  2. Hàm liên kết: Sử dụng hàm liên kết Logit, \(g(\pi) = \log\left(\frac{\pi}{1 - \pi}\right)\).

Mô hình giả định rằng logit của xác suất thành công \((\pi = P(Y = 1 \mid \mathbf{X}))\) là một hàm tuyến tính của các biến độc lập:

\[ \text{logit}(\pi) = \log\left(\frac{\pi}{1 - \pi}\right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]

Hàm ngược của nó – hàm logistic – cho phép tính toán xác suất:

\[ \pi = \frac{\exp(\beta_0 + \cdots + \beta_k X_k)}{1 + \exp(\beta_0 + \cdots + \beta_k X_k)} \]

Hàm này luôn tạo ra giá trị \(\pi\) trong khoảng (0, 1) và có dạng hình chữ S.

  • Để đánh giá ảnh hưởng của giới tính đến khả năng tái phát sau điều trị, mô hình hồi quy logistic (logit) được sử dụng với biến phụ thuộc là khả năng tái phát (0: Không, 1: Có), và biến độc lập là giới tính (0: Nữ, 1: Nam).
  • Mô hình được xây dựng theo công thức:
# Mô hình hồi quy logistic với biến giới tính
model_logit_gender <- glm(Recurred_bin ~ Gender, family = binomial(link = "logit"), data = dat)

# Xem kết quả
summary(model_logit_gender)
## 
## Call:
## glm(formula = Recurred_bin ~ Gender, family = binomial(link = "logit"), 
##     data = dat)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -1.3157     0.1386  -9.491  < 2e-16 ***
## GenderM       1.6861     0.2784   6.056 1.39e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 418.01  on 381  degrees of freedom
## AIC: 422.01
## 
## Number of Fisher Scoring iterations: 4

Mô hình hồi quy Logit là một dạng của hồi quy logistic, sử dụng hàm liên kết logit:

\[ \text{logit}(\pi) = \log\left(\frac{\pi}{1 - \pi}\right) \]

Từ kết quả mô hình, ta thu được phương trình hồi quy logit:

\[ \log\left(\frac{\pi}{1 - \pi}\right) = -1.3157 + 1.6861 \cdot \text{GenderM} \]

Trong đó:

  • Biến phụ thuộc: khả năng tái phát bệnh ung thư tuyến giáp (\(Y = 1\): có tái phát, \(Y = 0\): không tái phát)

  • Biến độc lập: giới tính (\(\text{GenderM} = 1\) nếu là nam, \(= 0\) nếu là nữ – nữ là nhóm tham chiếu)


  • Hệ số chặn\(-1.3157\). Điều này có nghĩa là khi không có tác động của giới tính nam (tức là bệnh nhân nữ), thì logit của xác suất tái phát bệnh (tức là \(\log\left(\frac{\hat{\pi}}{1 - \hat{\pi}}\right)\)) là \(-1.3157\).

  • Hệ số hồi quy \(\hat{\beta}_1 = 1.6861\). Điều này cho thấy sự chênh lệch về logit của xác suất tái phát bệnh giữa bệnh nhân nam và nữ+1.6861.
    Nói cách khác, logit của xác suất tái phát bệnh ở bệnh nhân nam cao hơn 1.6861 đơn vị so với nữ.

Tỷ số Odds (Odds Ratio)

# Tính Odds Ratio
exp(coef(model_logit_gender))
## (Intercept)     GenderM 
##   0.2682927   5.3981191

Hệ số hồi quy \(\beta_1 = 1.6861\) cho phép tính Odds Ratio:

\[ \text{OR} = e^{1.6861} \approx 5.40 \]

Nhận xét

  • Phân tích hồi quy logistic được thực hiện nhằm đánh giá ảnh hưởng của giới tính đến khả năng tái phát bệnh sau điều trị ung thư tuyến giáp biệt hóa. Kết quả cho thấy hệ số ước lượng cho biến GenderM là 1.6861 (p < 0.001), cho thấy sự khác biệt có ý nghĩa thống kê giữa nam và nữ. Cụ thể, nam giới có log odds tái phát cao hơn nữ giới một cách đáng kể. Khi chuyển đổi sang odds ratio, ta có exp(1.6861) ≈ 5.4, nghĩa là nam giới có nguy cơ tái phát cao gấp khoảng 5,4 lần so với nữ giới. Mô hình có giá trị AIC = 422.01, cho thấy mức độ phù hợp tương đối tốt cho dữ liệu đơn biến.

  • Kết quả này khẳng định giới tính là một yếu tố nguy cơ độc lập đáng kể liên quan đến khả năng tái phát bệnh, phù hợp với các kiểm định trước đó.

4.1.6.3. Mô hình Probit
  • Phân tích mối liên hệ giữa giới tính và khả năng tái phát, sử dụng mô hình Probit, nhằm so sánh với mô hình Logit đã thực hiện trước đó.

  • Mô hình hồi quy Probit là một dạng mô hình hồi quy nhị phân, tương tự như Logistic, nhưng sử dụng hàm liên kết dựa trên phân phối chuẩn tắc tích lũy thay vì hàm logit.

  • Thành phần ngẫu nhiên: Biến phản hồi \(Y \in \{0, 1\}\) tuân theo phân phối Bernoulli (hoặc Binomial).

  • Mô hình sử dụng hàm liên kết Probit, là nghịch đảo của hàm phân phối tích lũy (CDF) chuẩn:

\[ g(\pi) = \Phi^{-1}(\pi) \]

trong đó \(\Phi^{-1}\)nghịch đảo của hàm phân phối chuẩn chuẩn hóa (mean = 0, std = 1).

  • Dạng mô hình:

    • Mô hình giả định rằng:

\[ \Phi^{-1}(\pi) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]

  • Hay viết lại theo xác suất:

\[ \pi = \Phi(\beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k) \]

  • Diễn giải:

  • Mô hình Probit giả định tồn tại một biến tiềm ẩn \(Z \sim \mathcal{N}(0, 1)\), và xác suất xảy ra sự kiện \(Y = 1\) là xác suất mà biến tiềm ẩn vượt ngưỡng.

  • Vì sử dụng phân phối chuẩn, Probit có nền tảng lý thuyết sâu hơn về xác suất tiềm ẩn, đặc biệt trong các mô hình kinh tế lượng.

  • So sánh với Logistic:

  • Cả hai mô hình đều phù hợp cho dữ liệu nhị phân.

  • Probit thường được sử dụng khi cần giả định tính chuẩn của sai số.

  • Sự khác biệt chính nằm ở hình dạng hàm liên kết: Logistic có đuôi dày hơn (phân phối Logistic có phân phối chuẩn hóa tương tự chuẩn, nhưng biến thiên lớn hơn).

  • Biểu diễn hình chữ S:

Cũng như mô hình logit, mô hình Probit tạo ra xác suất \(\pi \in (0, 1)\) và có đồ thị dạng hàm chữ S (sigmoid), nhưng dốc và tốc độ hội tụ khác so với logit.

# Mô hình Probit
probit_model_gender <- glm(Recurred_bin ~ Gender, family = binomial(link = "probit"), data = dat)

# Xem kết quả mô hình
summary(probit_model_gender)
## 
## Call:
## glm(formula = Recurred_bin ~ Gender, family = binomial(link = "probit"), 
##     data = dat)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.80109    0.07988  -10.03  < 2e-16 ***
## GenderM      1.03263    0.17012    6.07 1.28e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 418.01  on 381  degrees of freedom
## AIC: 422.01
## 
## Number of Fisher Scoring iterations: 4
  • Mô hình hồi quy Probit là một dạng của hồi quy nhị phân, sử dụng hàm liên kết dựa trên phân phối chuẩn tắc tích lũy:

\[ g(\pi) = \Phi^{-1}(\pi) \]

  • Từ kết quả mô hình, ta thu được phương trình hồi quy Probit:

\[ \pi = \Phi(-0.8011 + 1.0326 \cdot \text{Gender}) \]

  • Trong đó:

    • Biến phụ thuộc: khả năng tái phát bệnh ung thư tuyến giáp (\(Y = 1\): có tái phát, \(Y = 0\): không tái phát)
    • Biến độc lập: giới tính (\(\text{Gender} = 1\) nếu là nam, \(= 0\) nếu là nữ – nữ là nhóm tham chiếu)
  • Hệ số chặn\(-0.8011\), và có ý nghĩa thống kê khi giá trị p-value nhỏ hơn mức ý nghĩa 5%. Điều này có nghĩa là khi không có tác động của biến giới tính (tức là bệnh nhân nữ), thì xác suất tái phát bệnh là:

\[ \pi_{\text{nữ}} = \Phi(-0.8011) \approx 0.2115 \]

  • Hệ số hồi quy \(\hat{\beta}_1 = 1.0326\) có ý nghĩa là trong trường hợp các yếu tố khác không đổi, chênh lệch xác suất tái phát giữa nam và nữ là:

\[ \Phi(-0.8011 + 1.0326) - \Phi(-0.8011) = \Phi(0.2315) - \Phi(-0.8011) \approx 0.5917 - 0.2115 = 0.3802 \]

⇒ Nam có xác suất tái phát cao hơn khoảng 38% so với nữ.

Nhận xét

  • Để đánh giá ảnh hưởng của giới tính đến khả năng tái phát bệnh ung thư tuyến giáp biệt hóa, mô hình hồi quy Probit đã được áp dụng. Kết quả cho thấy hệ số ước lượng của biến giới tính (GenderM) là 1.0326, với giá trị p rất nhỏ (p < 0.001), chứng tỏ mối liên hệ có ý nghĩa thống kê cao giữa giới tính và khả năng tái phát.

  • Cụ thể, hệ số dương của biến GenderM cho thấy nam giới có xác suất tái phát cao hơn nữ giới. Điều này phù hợp với các mô hình phân tích trước đó (như hồi quy logistic và kiểm định tỷ lệ), góp phần củng cố độ tin cậy của kết luận rằng giới tính là một yếu tố nguy cơ tiềm năng đối với tái phát bệnh.

2.1.7. Đánh giá mô hình

Bảng tổng hợp kết quả ba mô hình hồi quy

Mô hình Hệ số chặn \(\hat{\beta}_0\) Hệ số GenderM \(\hat{\beta}_1\) Giá trị p (GenderM) AIC Diễn giải đáng chú ý
GLM 0.21154 0.38001 < 0.001 437.54 GenderM làm tăng xác suất tái phát khoảng 38%
Logit -1.3157 1.6861 < 0.001 422.01 OR = \(e^{1.6861} \approx 5.40\)
Probit -0.80109 1.03263 < 0.001 422.01 \(\Phi(0.2315) - \Phi(-0.8011) \approx 38\%\)
  • Cả ba mô hình đều cho thấy giới tính nam (GenderM) có ảnh hưởng đáng kể đến khả năng tái phát bệnh ung thư tuyến giáp với độ tin cậy thống kê cao. Tuy nhiên, xét theo chỉ số AIC – tiêu chí chọn mô hình phù hợp – Logit và Probit đều vượt trội hơn mô hình GLM, cho thấy khả năng mô phỏng tốt hơn cho biến phụ thuộc nhị phân.

  • Trong hai mô hình phi tuyến, Logit được ưu tiên hơn trong thực tiễn nhờ khả năng diễn giải hệ số trực tiếp bằng tỷ số odds (odds ratio) – cho thấy nam giới có nguy cơ tái phát cao hơn nữ khoảng 5.4 lần. Trong khi đó, Probit dù tương đương về AIC, nhưng yêu cầu người dùng có hiểu biết sâu hơn về phân phối chuẩn tích lũy để diễn giải kết quả.

Vì vậy, mô hình Logit được khuyến nghị lựa chọn trong trường hợp nghiên cứu này.

4.2 Hút thuốc tác động đến khả năng tái bệnh

Trong phần này, chúng ta sẽ phân tích mối liên hệ giữa tình trạng hút thuốc của bệnh nhân và khả năng tái phát ung thư tuyến giáp biệt hóa sau điều trị. Biến độc lập là Smoking (có hoặc không hút thuốc) và biến phụ thuộc là Recurred (có hoặc không tái phát).

4.2.1 Bảng tần số - tần suất cho biến Hút thuốc (Smoking)

tab_smoking <- table(dat$Smoking)
tab_smoking
## 
##  No Yes 
## 334  49
  • Kết quả trên sẽ được trực quan hóa bằng biểu đồ cột để so sánh số lượng giữa hai nhóm.
barplot(tab_smoking,
        main = "Biểu đồ tần số tình trạng hút thuốc",
        xlab = "Tình trạng hút thuốc",
        ylab = "Tần số",
        col = c("lightcyan", "lightcoral"),
        border = "white",
        ylim = c(0, max(tab_smoking) + 40)) -> bp_smoking

text(x = bp_smoking, y = tab_smoking + 15, labels = tab_smoking)

  • Thông qua bảng tần số và biểu đồ, ta thấy rằng trong tổng số 383 bệnh nhân, có 323 người không hút thuốc (No), chiếm đa số. Trong khi đó, số bệnh nhân có hút thuốc (Yes) là 60 người. Tiếp theo, chúng ta sẽ tính tỷ lệ phần trăm và vẽ biểu đồ tròn để thể hiện rõ hơn sự chênh lệch về mặt tương đối giữa hai nhóm.
# Tạo dataframe từ bảng tần số
smoking_freq <- as.data.frame(tab_smoking)
colnames(smoking_freq) <- c("Smoking", "Frequency")

# Tính phần trăm
smoking_freq$Percentage <- smoking_freq$Frequency / sum(smoking_freq$Frequency) * 100

# Tạo nhãn
smoking_freq$Label <- paste0(round(smoking_freq$Percentage, 1), "%")

# Vẽ biểu đồ tròn
ggplot(smoking_freq, aes(x = "", y = Percentage, fill = Smoking)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  theme_void() +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
  labs(title = "Phân bố tình trạng hút thuốc của các bệnh nhân") +
  scale_fill_manual(values = c("No" = "lightcyan", "Yes" = "lightcoral"))

  • Biểu đồ tròn cho thấy một cách trực quan rằng nhóm bệnh nhân không hút thuốc chiếm đến 84.3% trong mẫu nghiên cứu, trong khi nhóm hút thuốc chỉ chiếm 15.7%. Sự chênh lệch lớn này cho thấy thói quen hút thuốc không phải là một đặc điểm phổ biến trong nhóm bệnh nhân được khảo sát. Tuy nhiên, điều quan trọng là phải phân tích xem liệu nhóm thiểu số này có nguy cơ tái phát cao hơn hay không.

4.2.2. Thống kê mô tả cho hai biến Hút thuốc và khả năng tái phát bệnh

4.2.2.1. Bảng tần số chéo
  • Lập bảng tần số chéo giữa hai biến Smoking và Recurred để xem xét mối quan hệ sơ bộ giữa chúng.
# Đổi tên levels của biến Smoking
dat$Smoking <- factor(dat$Smoking, levels = c("No", "Yes"),
                      labels = c("Không hút thuốc", "Hút thuốc"))

# Tạo lại bảng tần số
table_taibenh_smoking <- table(dat$Smoking, dat$Recurred)
table_taibenh_smoking
##                  
##                    No Yes
##   Không hút thuốc 259  75
##   Hút thuốc        16  33
  • Trong nhóm không hút thuốc (No): có 259 người không tái phát và 75 người tái phát bệnh sau điều trị.

  • Trong nhóm có hút thuốc (Yes): có 16 người không tái phát và 33 người tái phát bệnh sau điều trị.

  • Một quan sát ban đầu đáng chú ý là ở nhóm hút thuốc, số ca tái phát (33) gần cao hơn gấp 2 lần so với số ca không tái phát (16). Ngược lại, ở nhóm không hút thuốc, số ca không tái phát (259) lớn hơn đáng kể so với số ca tái phát (75). Điều này gợi ý rằng tỷ lệ tái phát ở nhóm bệnh nhân hút thuốc có thể cao hơn.

4.2.2.1.Trực quan hóa

Để làm rõ hơn nhận định trên, chúng ta sẽ sử dụng biểu đồ cột nhóm.

# Chuyển bảng tần số thành data frame đúng chiều
df_plot_smoking <- as.data.frame(table_taibenh_smoking)
colnames(df_plot_smoking) <- c("Smoking", "Recurred", "Count")

# Vẽ biểu đồ
library(ggplot2)

ggplot(df_plot_smoking, aes(x = Smoking, y = Count, fill = Recurred)) +
  geom_col(position = "dodge") +
  labs(title = "Tình trạng tái phát theo tình trạng hút thuốc",
       x = "Tình trạng hút thuốc",
       y = "Số lượng bệnh nhân",
       fill = "Tình trạng tái phát") +
  theme_minimal() +
  scale_fill_manual(values = c("No" = "skyblue", "Yes" = "salmon"))

Biểu đồ cột trực quan hóa một cách rõ ràng sự khác biệt đã nêu:

Ở nhóm không hút thuốc: Cột “Không tái phát” (màu xanh) cao hơn hẳn cột “Tái phát” (màu hồng). Ở nhóm có hút thuốc: Cột “Tái phát” (màu hồng) cao hơn một chút so với cột “Không tái phát” (màu xanh).

Biểu đồ củng cố mạnh mẽ giả thuyết rằng việc hút thuốc có liên quan đến nguy cơ tái phát cao hơn. Bệnh nhân hút thuốc dường như có tỷ lệ tái phát trên 50%, trong khi tỷ lệ này ở người không hút thuốc thấp hơn đáng kể.

4.2.3. Phân tích Relative Risk giữa Hút thuốc và khả năng tái bệnh

Tiếp theo, chúng ta tính toán Nguy cơ tương đối (Relative Risk - RR) để định lượng mức độ ảnh hưởng của việc hút thuốc đến khả năng tái phát. Nhóm không hút thuốc sẽ được coi là nhóm phơi nhiễm gốc (baseline).

riskratio(table_taibenh_smoking)
## $data
##                  
##                    No Yes Total
##   Không hút thuốc 259  75   334
##   Hút thuốc        16  33    49
##   Total           275 108   383
## 
## $measure
##                  risk ratio with 95% C.I.
##                   estimate    lower    upper
##   Không hút thuốc 1.000000       NA       NA
##   Hút thuốc       2.999184 2.269459 3.963546
## 
## $p.value
##                  two-sided
##                     midp.exact fisher.exact   chi.square
##   Không hút thuốc           NA           NA           NA
##   Hút thuốc       1.052187e-09 9.281728e-10 6.952113e-11
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Dựa trên bảng tần số đã được giải thích rõ ở phần trước tôi sẽ tính toán Relative Risk trong đó biến độc lập là tình trạng hút thuốc và phụ thuộc là khả năng tái phát bệnh. Nhóm tham chiếu là bệnh nhân đang trong tình trạng hút thuốc và không bị tái phát bệnh. Và nhóm đối tượng cần quan tâm là bệnh nhân đang trong tình trạng hút thuốc và bị tái phát bệnh sau điều trị. Trước tiên cần tính tỷ lệ bệnh nhân đang hút thuốc bị tái bệnh trên tổng số bệnh nhân bị tái phát bệnh sau khi điều trị ở cả 2 tình trạng hút thuốc và không hút thuốc. Sau đó lấy tỷ lệ vừa tìm được chia cho tỷ lệ nhóm tham chiếu ( tức là tỷ lệ bệnh nhân đang hút thuốc không bị tái phát bệnh chia cho tổng số bệnh nhân không bị tái phát bệnh sau khi điều trị bệnh)

Nhận xét: Khi phân tích bệnh nhân đang hút thuốc bị tái nhiễm bệnh tuyến giáp sau khi điều trị ta thấy RR = 3.25, kết quả này cho biết rằng tỷ lệ bệnh nhân đang hút thuốc bị tái nhiễm bệnh sau điều trị cao hơp gấp 3.25 lần so với nhóm bệnh nhân đang hút thuốc và không bị tái nhiễm bệnh sau điều trị ở cả 2 tình trạng hút và không hút thuốc)

Kết luận từ các kiểm định:

Tái phát midp.exact fisher.exact chi.square
No NA NA NA
Yes 1.052187e-09 9.281728e-10 6.952113e-11

Các giá trị p-value từ cả ba phương pháp kiểm định (Mid-p exact, Fisher exact, và Chi-square) đều rất nhỏ (p < 0.001). Điều này bác bỏ giả thuyết không (H₀: không có mối liên hệ giữa hút thuốc và tái phát) và khẳng định rằng có một mối liên hệ có ý nghĩa thống kê rất mạnh mẽ giữa hai biến này.

4.2.4. Phân tích Odd Ratio giữa Hút thuốc và khả năng tái bệnh

oddsratio(table_taibenh_smoking, conf.level = 0.95)
## $data
##                  
##                    No Yes Total
##   Không hút thuốc 259  75   334
##   Hút thuốc        16  33    49
##   Total           275 108   383
## 
## $measure
##                  odds ratio with 95% C.I.
##                   estimate    lower    upper
##   Không hút thuốc 1.000000       NA       NA
##   Hút thuốc       7.043435 3.720246 13.85211
## 
## $p.value
##                  two-sided
##                     midp.exact fisher.exact   chi.square
##   Không hút thuốc           NA           NA           NA
##   Hút thuốc       1.052187e-09 9.281728e-10 6.952113e-11
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Kết quả cho thấy Tỷ số chênh (OR) là 7.0434 Điều này có nghĩa là “odds” (tỷ lệ giữa xác suất xảy ra và không xảy ra) của việc tái phát ở nhóm bệnh nhân hút thuốc cao gấp 7.04 lần so với “odds” tái phát ở nhóm bệnh nhân không hút thuốc.

4.2.5. Thống kê suy diễn

4.2.5.1. Kiểm định tính độc lập

Chúng ta sử dụng kiểm định Chi bình phương để kiểm tra giả thuyết về tính độc lập giữa tình trạng hút thuốc và khả năng tái phát.

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

  • H₀ (Giả thuyết không): Tình trạng hút thuốc và khả năng tái phát là hai biến độc lập (không có mối liên hệ).
  • H₁ (Giả thuyết đối): Tình trạng hút thuốc và khả năng tái phát là hai biến phụ thuộc (có mối liên hệ).
# Kiểm định Chi bình phương
chisq.test(table_taibenh_smoking)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_taibenh_smoking
## X-squared = 40.344, df = 1, p-value = 2.13e-10

Kết quả cho thấy p-value nhỏ hơn rất nhiều so với ngưỡng ý nghĩa thông thường (α = 0.05), ta có thể bác bỏ giả thuyết H0. Điều này đồng nghĩa với việc tồn tại một mối liên hệ có ý nghĩa thống kê giữa hành vi hút thuốc và khả năng tái phát bệnh. Nói cách khác, bệnh nhân đang trong tình trạng hút thuốc có nguy cơ tái phát ung thư tuyến giáp cao hơn so với những người không hút thuốc. Phát hiện này phù hợp với các bằng chứng y học trước đó, cho thấy hút thuốc lá có thể ảnh hưởng tiêu cực đến hệ miễn dịch, làm suy giảm hiệu quả điều trị và tăng nguy cơ tái phát bệnh sau can thiệp.

4.2.5.2. Kiểm định hiệu tỷ lệ
  • Để so sánh trực tiếp tỷ lệ tái phát giữa hai nhóm, chúng ta tiến hành kiểm định hiệu hai tỷ lệ. Gọi p1 là tỷ lệ tái phát ở nhóm hút thuốc, p2 là tỷ lệ tái phát ở nhóm không hút thuốc.

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

  • H₀: p1 - p2 = 0 (Tỷ lệ tái phát ở hai nhóm là như nhau).

  • H₁: p1 - p2 > 0 (Tỷ lệ tái phát ở nhóm hút thuốc cao hơn nhóm không hút thuốc).

# Số ca tái phát ở nhóm hút thuốc và không hút thuốc
success_smoking <- c(33, 75)

# Tổng số bệnh nhân trong mỗi nhóm
n_smoking <- c(49, 334)

# Kiểm định hiệu tỷ lệ một phía
prop.test(success_smoking, n_smoking, alternative = "greater", correct = FALSE)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  success_smoking out of n_smoking
## X-squared = 42.532, df = 1, p-value = 3.476e-11
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.332502 1.000000
## sample estimates:
##    prop 1    prop 2 
## 0.6734694 0.2245509
  • Kiểm định hiệu hai tỷ lệ cho thấy tỷ lệ tái phát ở nhóm bệnh nhân hút thuốc (67.3%) cao hơn đáng kể so với nhóm không hút thuốc (22.5%), với sự chênh lệch có ý nghĩa thống kê (p = 3.476 × 10⁻¹¹). Khoảng tin cậy 95% cho hiệu tỷ lệ dao động từ 33.3% đến 100%, khẳng định sự khác biệt rõ rệt giữa hai nhóm. Kết quả này cho thấy hút thuốc là yếu tố liên quan chặt chẽ đến nguy cơ tái phát ung thư tuyến giáp sau điều trị.

4.2.6. Mô hình hồi quy cho dữ liệu nhị phân

4.2.6.1. Mô hình hồi quy tuyến tính

Chúng ta sẽ xây dựng mô hình hồi quy tuyến tính để xem xét ảnh hưởng của việc hút thuốc đến xác suất tái phát.

# Biến nhị phân Recurred_bin đã được tạo ở phần trước
Recurred_bin <- ifelse(dat$Recurred == "Yes", 1, 0)

# Xây dựng mô hình hồi quy tuyến tính
hqtt_model_smoking <- glm(Recurred_bin ~ Smoking, data = dat)

# Hiển thị kết quả
summary(hqtt_model_smoking)
## 
## Call:
## glm(formula = Recurred_bin ~ Smoking, data = dat)
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       0.22455    0.02327   9.648  < 2e-16 ***
## SmokingHút thuốc  0.44892    0.06507   6.899 2.19e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.1809296)
## 
##     Null deviance: 77.546  on 382  degrees of freedom
## Residual deviance: 68.934  on 381  degrees of freedom
## AIC: 436.11
## 
## Number of Fisher Scoring iterations: 2

Nhận xét: Kết quả mô hình hồi quy tuyến tính cho thấy hệ số của biến Smoking (đang hút thuốc) là 0.44892, với p-value rất nhỏ (p < 0.001). Điều này có nghĩa là, so với người không hút thuốc, người có hút thuốc có xác suất tái phát cao hơn trung bình là khoảng 44.9%. Hệ số chặn (0.22455) chính là xác suất tái phát ước tính cho nhóm không hút thuốc. Mặc dù mô hình này dễ diễn giải, nó có những hạn chế lý thuyết khi áp dụng cho biến phụ thuộc nhị phân. Do đó, chúng ta sẽ xem xét các mô hình phù hợp hơn như Logit và Probit.

4.2.6.2. Mô hình Logit

Mô hình hồi quy Logistic được áp dụng để mô hình hóa log của tỷ số chênh (log-odds) của việc tái phát.

# Mô hình hồi quy logistic với biến Smoking
model_logit_smoking <- glm(Recurred_bin ~ Smoking, family = binomial(link = "logit"), data = dat)

# Xem kết quả
summary(model_logit_smoking)
## 
## Call:
## glm(formula = Recurred_bin ~ Smoking, family = binomial(link = "logit"), 
##     data = dat)
## 
## Coefficients:
##                  Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -1.2393     0.1311  -9.451  < 2e-16 ***
## SmokingHút thuốc   1.9633     0.3317   5.920 3.23e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 417.69  on 381  degrees of freedom
## AIC: 421.69
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy Logit có dạng: \[ \log\left(\frac{\pi}{1 - \pi}\right) = -1.2393 + 1.9633 \cdot \text{Hút thuốc} \]

  • Hệ số chặn \(\hat{\beta}_0 = -1.2393\): Đây là log-odds tái phát của một bệnh nhân không hút thuốc.
  • Hệ số hồi quy \(\hat{\beta}_1 = 1.9633\) (p < 0.001): Cho thấy log-odds tái phát ở người hút thuốc cao hơn 1.9633 đơn vị so với người không hút thuốc.

Tỷ số Odds (Odds Ratio):

# Tính Odds Ratio
exp(coef(model_logit_smoking))
##      (Intercept) SmokingHút thuốc 
##        0.2895753        7.1225000

\[ \text{OR} = e^{1.9633} \approx 7.1225 \] Kết quả này cho thấy “odds” tái phát ở người hút thuốc cao gấp 7.1225 lần so với người không hút thuốc, hoàn toàn phù hợp với kết quả từ hàm oddsratio trước đó, mức độ chênh lệch không quá lớn.

4.2.6.3. Mô hình Probit

Chúng ta tiếp tục với mô hình Probit, sử dụng hàm phân phối tích lũy chuẩn.

# Mô hình Probit với biến Smoking
probit_model_smoking <- glm(Recurred_bin ~ Smoking, family = binomial(link = "probit"), data = dat)

# Xem kết quả mô hình
summary(probit_model_smoking)
## 
## Call:
## glm(formula = Recurred_bin ~ Smoking, family = binomial(link = "probit"), 
##     data = dat)
## 
## Coefficients:
##                  Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      -0.75691    0.07622  -9.931  < 2e-16 ***
## SmokingHút thuốc  1.20643    0.20080   6.008 1.88e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 417.69  on 381  degrees of freedom
## AIC: 421.69
## 
## Number of Fisher Scoring iterations: 4
  • Để đánh giá ảnh hưởng của hành vi hút thuốc đến khả năng tái phát bệnh ung thư tuyến giáp, mô hình hồi quy Probit được xây dựng với biến phụ thuộc là Recurred (0: không tái phát, 1: có tái phát) và biến độc lập là Smoking (0: không hút thuốc – nhóm tham chiếu, 1: hút thuốc).

  • Phương trình hồi quy ước lượng như sau:

\[ \pi = \Phi(-0.7569 + 1.2064 \cdot \text{Smoking}) \]

  • Trong đó:

  • \(\Phi(\cdot)\): hàm phân phối tích lũy chuẩn tắc (standard normal CDF).

  • \(\pi\): xác suất tái phát bệnh.

Diễn giải kết quả

  • Hệ số chặn \(\beta_0 = -0.7569\), p < 0.001:
    Đại diện cho xác suất tái phát ở nhóm không hút thuốc:

\[ \pi_{\text{không hút}} = \Phi(-0.7569) \approx 0.2246 \]

  • Hệ số hồi quy \(\beta_1 = 1.2064\), p < 0.001:
    Khi bệnh nhân có hút thuốc, xác suất tái phát là:

\[ \pi_{\text{hút thuốc}} = \Phi(-0.7569 + 1.2064) = \Phi(0.4495) \approx 0.6735 \]

So sánh xác suất giữa 2 nhóm

\[ \Delta \pi = \pi_{\text{hút thuốc}} - \pi_{\text{không hút}} \approx 0.6735 - 0.2246 = 0.4489 \]

Kết luận

  • Mô hình Probit cho thấy bệnh nhân hút thuốc có xác suất tái phát bệnh ung thư tuyến giáp cao hơn khoảng 44.9% so với bệnh nhân không hút thuốc. Cả hai hệ số đều có ý nghĩa thống kê (p < 0.001). Hành vi hút thuốc có thể xem là một yếu tố nguy cơ quan trọng, cần được lưu ý trong công tác theo dõi và quản lý sau điều trị.
4.2.6.4. Mô hình cloglog
  • Mô hình hồi quy cloglog là một dạng mô hình hồi quy nhị phân, sử dụng hàm liên kết bất đối xứng để mô tả mối quan hệ giữa xác suất xảy ra của biến phụ thuộc và các biến độc lập. Hàm liên kết cloglog được định nghĩa như sau:

\[ g(\pi) = \log(-\log(1 - \pi)) \]

Trong đó: - \(\pi = \Pr(Y = 1 \mid X)\) là xác suất xảy ra của hiện tượng quan tâm (ví dụ: tái phát bệnh). - \(g(\pi)\) là hàm liên kết theo cloglog.

Khi áp dụng mô hình hồi quy, ta có phương trình:

\[ \log(-\log(1 - \pi)) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]

Giải ngược để tính xác suất:

\[ \pi = 1 - \exp\left( -\exp(\eta) \right), \quad \text{trong đó } \eta = \beta_0 + \sum_{j=1}^{k} \beta_j X_j \]

Đặc điểm của mô hình cloglog

  • Phù hợp khi xác suất xảy ra sự kiện tiệm cận 0 hoặc 1 một cách không đối xứng.
  • Thường được sử dụng trong mô hình rủi ro, phân tích sống sót hoặc khi dữ liệu thiên lệch về một phía.
model_cloglog <- glm(Recurred_bin ~ Smoking, family = binomial(link = "cloglog"), data = dat)
summary(model_cloglog)
## 
## Call:
## glm(formula = Recurred_bin ~ Smoking, family = binomial(link = "cloglog"), 
##     data = dat)
## 
## Coefficients:
##                  Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -1.3692     0.1158 -11.826  < 2e-16 ***
## SmokingHút thuốc   1.4818     0.2168   6.835 8.22e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 417.69  on 381  degrees of freedom
## AIC: 421.69
## 
## Number of Fisher Scoring iterations: 5

Trong mô hình hồi quy nhị phân với hàm liên kết complementary log-log (cloglog):

\[ g(\pi) = \log(-\log(1 - \pi)) = \beta_0 + \beta_1 \cdot \text{Smoking} \]

Ta thu được phương trình ước lượng:

\[ \log(-\log(1 - \pi)) = -1.3692 + 1.4818 \cdot \text{Smoking} \]

Trong đó: - \(\text{Smoking} = 1\) nếu bệnh nhân hút thuốc, và \(= 0\) nếu không hút thuốc. - Biến phụ thuộc \(\pi\) là xác suất tái phát bệnh.

Diễn giải kết quả:

  • Hệ số chặn \(\beta_0 = -1.3692\) (p < 0.001) có ý nghĩa thống kê. Khi bệnh nhân không hút thuốc, xác suất tái phát được tính như sau:

\[ \pi_{\text{không hút thuốc}} = 1 - \exp\left( -\exp(-1.3692) \right) \approx 0.2245 \]

  • Hệ số hút thuốc \(\beta_1 = 1.4818\) (p < 0.001): có ý nghĩa thống kê rất cao, cho thấy hành vi hút thuốc làm tăng đáng kể xác suất tái phát. Xác suất tái phát cho nhóm hút thuốc là:

\[ \pi_{\text{hút thuốc}} = 1 - \exp\left( -\exp(-1.3692 + 1.4818) \right) \approx 0.6735 \]

Kết luận:

  • Xác suất tái phát bệnh ở bệnh nhân hút thuốc (67.4%) cao gấp 3 lần so với bệnh nhân không hút thuốc (22.4%).
  • Sự khác biệt này có ý nghĩa thống kê rất mạnh với p-value \(< 2 \times 10^{-11}\), cho thấy hành vi hút thuốc là một yếu tố nguy cơ quan trọng đối với tái phát bệnh ung thư tuyến giáp.
  • Mô hình cloglog là lựa chọn phù hợp vì phân phối xác suất xảy ra sự kiện (tái phát bệnh) có tính chất bất đối xứng.

4.2.7 Đánh giá mô hình

Bảng tổng hợp 4 mô hình

\[ \begin{array}{|l|l|c|} \hline \textbf{Mô hình} & \textbf{Hàm liên kết (Link function)} & \textbf{AIC} \\ \hline \text{Hồi quy tuyến tính (Linear Regression)} & \text{Identity (Gaussian)} & 436.11 \\ \hline \text{Hồi quy logistic (Logit)} & \text{Logit} & 421.69 \\ \hline \text{Hồi quy probit} & \text{Probit} & 421.69 \\ \hline \text{Hồi quy cloglog} & \text{Complementary log-log} & 421.69 \\ \hline \end{array} \]

Đánh giá

Trong nghiên cứu mối liên hệ giữa hút thuốc và khả năng tái phát ung thư tuyến giáp, chúng tôi so sánh 4 mô hình hồi quy: tuyến tính, logit, probit và cloglog. Kết quả cho thấy mô hình tuyến tính có AIC cao nhất (436.11), cho thấy mức độ phù hợp kém nhất. Ba mô hình còn lại (logit, probit, cloglog) đều có AIC bằng nhau (421.69), cho thấy mức độ phù hợp tốt hơn.

Dù AIC tương đương, mỗi mô hình có thế mạnh riêng: logit phù hợp nếu muốn giải thích theo tỷ lệ odds, probit phù hợp khi giả định phân phối chuẩn, còn cloglog hiệu quả khi hiện tượng nghiên cứu bất đối xứng. Trong bối cảnh bệnh tái phát thường mang tính không đối xứng, cloglog là lựa chọn hợp lý, nhưng nhìn chung cả ba mô hình đều cho thấy hút thuốc làm tăng nguy cơ tái phát bệnh.

4.3 Tính chất khối u tác động đến khả năng tái phát bệnh

Trong phần này, chúng ta sẽ phân tích mối liên hệ giữa đặc điểm khối u của bệnh nhân (đơn ổ hay đa ổ) và khả năng tái phát ung thư tuyến giáp biệt hóa sau điều trị. Biến độc lập là Focality và biến phụ thuộc là Recurred.

4.3.1 Bảng tần số - tần suất cho biến Focality

Đầu tiên, chúng ta sẽ lập bảng tần số cho biến Focality để hiểu rõ sự phân bố của nhóm bệnh nhân có khối u đơn ổ và đa ổ trong tập dữ liệu.

tab_focality <- table(dat$Focality)
tab_focality
## 
## Multi-Focal   Uni-Focal 
##         136         247

Kết quả sẽ được trực quan hóa bằng biểu đồ cột để dễ dàng so sánh số lượng giữa hai nhóm.

barplot(tab_focality,
        main = "Biểu đồ tần số tính đa ổ của khối u",
        xlab = "Tính chất khối u",
        ylab = "Tần số",
        col = c("khaki", "olivedrab"),
        border = "white",
        ylim = c(0, max(tab_focality) + 40)) -> bp_focality

text(x = bp_focality, y = tab_focality + 15, labels = tab_focality)

Thông qua bảng tần số và biểu đồ, ta thấy rằng trong tổng số 383 bệnh nhân, có 247 người có khối u đơn ổ (Uni-Focal), chiếm đa số. Trong khi đó, số bệnh nhân có khối u đa ổ (Multi-Focal) là 136 người.

Tiếp theo, chúng ta sẽ tính tỷ lệ phần trăm và vẽ biểu đồ tròn để thể hiện rõ hơn sự chênh lệch về mặt tương đối giữa hai nhóm.

# Tạo dataframe từ bảng tần số
focality_freq <- as.data.frame(tab_focality)
colnames(focality_freq) <- c("Focality", "Frequency")

# Tính phần trăm
focality_freq$Percentage <- focality_freq$Frequency / sum(focality_freq$Frequency) * 100

# Tạo nhãn
focality_freq$Label <- paste0(round(focality_freq$Percentage, 1), "%")

# Vẽ biểu đồ tròn
ggplot(focality_freq, aes(x = "", y = Percentage, fill = Focality)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  theme_void() +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
  labs(title = "Phân bố tính chất của khối u ở các bệnh nhân") +
  scale_fill_manual(values = c("Uni-Focal" = "khaki", "Multi-Focal" = "olivedrab"))

Biểu đồ tròn cho thấy một cách trực quan rằng nhóm bệnh nhân có khối u đơn ổ chiếm đến 64.5% trong mẫu nghiên cứu, trong khi nhóm có khối u đa ổ chiếm 35.5%. Điều này cho thấy khối u đơn ổ là trường hợp phổ biến hơn. Phân tích tiếp theo sẽ làm rõ liệu đặc điểm này có ảnh hưởng đến nguy cơ tái phát hay không.

4.3.2. Thống kê mô tả cho hai biến Focality và khả năng tái phát bệnh

Chúng ta sẽ lập bảng tần số chéo giữa hai biến Focality và Recurred để xem xét mối quan hệ sơ bộ giữa chúng.

table_taibenh_focality <- table(dat$Focality, dat$Recurred)
table_taibenh_focality
##              
##                No Yes
##   Multi-Focal  66  70
##   Uni-Focal   209  38

Bảng tần số chéo cho thấy:

  • Trong nhóm khối u đơn ổ (Uni-Focal): có 209 người không tái phát và 38 người tái phát.
  • Trong nhóm khối u đa ổ (Multi-Focal): có 66 người không tái phát và 70 người tái phát.

Điều này cho thấy tình trạng khối u đa ổ có thể liên quan đến nguy cơ tái phát cao hơn so với khối u đơn ổ. Tuy nhiên, cần thực hiện kiểm định thống kê để xác định mức độ ý nghĩa của mối liên hệ này.

Để làm rõ hơn nhận định trên, chúng ta sẽ sử dụng biểu đồ cột nhóm.

# Tạo bảng tần số chéo
table_taibenh_focality <- table(dat$Focality, dat$Recurred)

# Chuyển bảng chéo thành data frame
df_plot_focality <- as.data.frame(table_taibenh_focality)
colnames(df_plot_focality) <- c("Focality", "Recurred", "Count")

# Vẽ biểu đồ
ggplot(df_plot_focality, aes(x = Focality, y = Count, fill = Recurred)) +
  geom_col(position = "dodge") +
  labs(title = "Tình trạng tái bệnh theo tính đa ổ của khối u",
       x = "Tính chất khối u (Focality)",
       y = "Số lượng bệnh nhân",
       fill = "Tái bệnh") +
  theme_minimal() +
  scale_fill_manual(values = c("No" = "skyblue", "Yes" = "salmon"))

  • Biểu đồ cột trực quan hóa một cách rõ ràng sự khác biệt đã nêu:
    • Ở nhóm khối u đơn ổ (Uni-Focal): Cột “Không tái phát” cao hơn hẳn cột “Tái phát”.
    • Ở nhóm khối u đa ổ (Multi-Focal): Cột “Tái phát” lại cao hơn cột “Không tái phát”.
  • Biểu đồ củng cố mạnh mẽ giả thuyết rằng việc khối u có tính đa ổ liên quan đến nguy cơ tái phát cao hơn. Bệnh nhân có khối u đa ổ dường như có tỷ lệ tái phát trên 50%, trong khi tỷ lệ này ở người có khối u đơn ổ thấp hơn đáng kể.

4.3.3. Phân tích Relative Risk giữa Focality và khả năng tái bệnh

Tiếp theo, chúng ta tính toán Nguy cơ tương đối (Relative Risk - RR) để định lượng mức độ ảnh hưởng của tính đa ổ đến khả năng tái phát. Nhóm có khối u đơn ổ sẽ được coi là nhóm tham chiếu.

riskratio(table_taibenh_focality)
## $data
##              
##                No Yes Total
##   Multi-Focal  66  70   136
##   Uni-Focal   209  38   247
##   Total       275 108   383
## 
## $measure
##              risk ratio with 95% C.I.
##                estimate     lower     upper
##   Multi-Focal 1.0000000        NA        NA
##   Uni-Focal   0.2989011 0.2138327 0.4178119
## 
## $p.value
##              two-sided
##                 midp.exact fisher.exact  chi.square
##   Multi-Focal           NA           NA          NA
##   Uni-Focal   1.586509e-13 2.192495e-13 5.88346e-14
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Dựa trên bảng tần số đã được giải thích rõ ở phần trước tôi sẽ tính toán Relative Risk trong đó biến độc lập là tình trạng khối u và phụ thuộc là khả năng tái phát bệnh. Nhóm tham chiếu là bệnh nhân có khối u đa ổ và bị tái phát bệnh. Và nhóm đối tượng cần quan tâm là bệnh nhân có khối u đơn ổ và bị tái phát bệnh sau điều trị. Trước tiên cần tính tỷ lệ bệnh nhân có khôi u đơn ổ và bị tái bệnh trên tổng số bệnh nhân có khối u đơn ổ. Sau đó lấy tỷ lệ vừa tìm được chia cho tỷ lệ nhóm tham chiếu ( tức là tỷ lệ bệnh nhân có khối u đa ổ và bị tái phát bệnh sau điều trị)

Nhận xét: Khi phân tích bệnh nhân có khối u đơn ổ bị tái bệnh sau khi điều trị ta thấy RR = 0.29, kết quả này cho biết rằng tỷ lệ bệnh nhân có khối u đơn ổ bị tái bệnh chỉ bằng khoảng 30% so với bệnh nhân có khối u đa ổ bị tái phát bệnh sau khi điều trị ung thư biệt hóa.

Kết luận từ các kiểm định:

Focality midp.exact fisher.exact chi.square
Multi-Focal NA NA NA
Uni-Focal 1.59e-13 2.19e-13 5.88e-14

Dựa trên kết quả kiểm định giữa tính chất khối u (Focality) và khả năng tái phát bệnh, ta thấy rằng ở nhóm khối u đơn ổ (Uni-Focal), các giá trị p từ cả ba phương pháp kiểm định (mid-p exact: \(1.59 \times 10^{-13}\), Fisher exact: \(2.19 \times 10^{-13}\), và Chi-square: \(5.88 \times 10^{-14}\)) đều rất nhỏ, nhỏ hơn nhiều so với ngưỡng ý nghĩa 0.05. Điều này cho thấy mối liên hệ giữa tính chất khối u và khả năng tái phát bệnh là có ý nghĩa thống kê. Nói cách khác, tính đa ổ của khối u có thể là một yếu tố nguy cơ làm tăng khả năng tái phát bệnh sau điều trị.

4.3.4. Phân tích Odd Ratio giữa Focality và khả năng tái bệnh

Tương tự, chúng ta sẽ tính Tỷ số chênh (Odds Ratio - OR).

oddsratio(table_taibenh_focality, conf.level = 0.95)
## $data
##              
##                No Yes Total
##   Multi-Focal  66  70   136
##   Uni-Focal   209  38   247
##   Total       275 108   383
## 
## $measure
##              odds ratio with 95% C.I.
##                estimate    lower    upper
##   Multi-Focal 1.0000000       NA       NA
##   Uni-Focal   0.1727192 0.105611 0.278203
## 
## $p.value
##              two-sided
##                 midp.exact fisher.exact  chi.square
##   Multi-Focal           NA           NA          NA
##   Uni-Focal   1.586509e-13 2.192495e-13 5.88346e-14
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả sau khi phân tích ta thấy tỷ số chênh (Odds ratio) là 0.172 (tỷ lệ giữa xác suất xảy ra và không xảy ra) của việc tái phát ở nhóm bệnh nhân có khối u đa ổ cao gấp 7.02 lần so với “odds” tái phát ở nhóm bệnh nhân có khối u đơn ổ.

4.3.5. Thống kê suy diễn

Chúng ta sử dụng kiểm định Chi bình phương để kiểm tra giả thuyết về tính độc lập giữa tính đa ổ và khả năng tái phát.

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

H₀ (Giả thuyết không): Tính chất khôi u và khả năng tái phát là hai biến độc lập (không có mối liên hệ). H₁ (Giả thuyết đối): Tính chất khối u và khả năng tái phát là hai biến phụ thuộc (có mối liên hệ).

# Kiểm định Chi bình phương
chisq.test(table_taibenh_focality)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_taibenh_focality
## X-squared = 54.642, df = 1, p-value = 1.446e-13

Nhận xét

Kết quả kiểm định Chi bình phương Pearson với hiệu chỉnh liên tục của Yates cho giá trị thống kê X-squared là 54.642, với bậc tự do là 1. Giá trị p-value tương ứng là 1.446e-13, một giá trị cực kỳ nhỏ. Do p-value nhỏ hơn rất nhiều so với mức ý nghĩa thông thường (α = 0.05), chúng ta bác bỏ giả thuyết không (H₀). Điều này cung cấp bằng chứng thống kê mạnh mẽ để kết luận rằng có một mối liên hệ phụ thuộc rất rõ ràng giữa việc khối u là đơn ổ hay đa ổ và khả năng tái phát bệnh.

Để so sánh trực tiếp tỷ lệ tái phát giữa hai nhóm, chúng ta tiến hành kiểm định hiệu hai tỷ lệ. Gọi p1 là tỷ lệ tái phát ở nhóm đa ổ, p2 là tỷ lệ tái phát ở nhóm đơn ổ.

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

H₀: p1 - p2 = 0 (Tỷ lệ tái phát ở hai nhóm là như nhau). H₁: p1 - p2 > 0 (Tỷ lệ tái phát ở nhóm đa ổ cao hơn nhóm đơn ổ).

# Số ca tái phát ở nhóm đa ổ và đơn ổ
success_focality <- c(70, 38)

# Tổng số bệnh nhân trong mỗi nhóm
n_focality <- c(136, 247)

# Kiểm định hiệu tỷ lệ một phía
prop.test(success_focality, n_focality, alternative = "greater", correct = FALSE)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  success_focality out of n_focality
## X-squared = 56.41, df = 1, p-value = 2.942e-14
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.2808907 1.0000000
## sample estimates:
##    prop 1    prop 2 
## 0.5147059 0.1538462
  • Kết quả kiểm định hai tỷ lệ cho thấy tỷ lệ tái phát ở nhóm bệnh nhân có khối u đa ổ (p₁ = 51.47%) cao hơn rõ rệt so với nhóm có khối u đơn ổ (p₂ = 15.38%). Giá trị p rất nhỏ (\(p = 2.94 \times 10^{-14}\)) cho thấy sự khác biệt này có ý nghĩa thống kê ở mức ý nghĩa 5%.

  • Do đó, chúng ta bác bỏ giả thuyết H₀ và kết luận rằng tỷ lệ tái phát ở nhóm đa ổ cao hơn đáng kể so với nhóm đơn ổ, cho thấy tính đa ổ của khối u là yếu tố nguy cơ tiềm tàng làm tăng khả năng tái phát bệnh sau điều trị.

4.3.6. Mô hình hồi quy cho dữ liệu nhị phân

4.3.6.1. Mô hình hồi quy tuyến tính

Chúng ta xây dựng mô hình hồi quy tuyến tính để xem xét ảnh hưởng của tính chất khối u đến xác suất tái phát.

# Biến nhị phân Recurred_bin đã được tạo ở phần trước
Recurred_bin <- ifelse(dat$Recurred == "Yes", 1, 0)

# Xây dựng mô hình hồi quy tuyến tính
hqtt_model_focality <- glm(Recurred_bin ~ Focality, data = dat)

# Hiển thị kết quả
summary(hqtt_model_focality)
## 
## Call:
## glm(formula = Recurred_bin ~ Focality, data = dat)
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        0.51471    0.03572  14.408  < 2e-16 ***
## FocalityUni-Focal -0.36086    0.04448  -8.112  6.9e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.1735549)
## 
##     Null deviance: 77.546  on 382  degrees of freedom
## Residual deviance: 66.124  on 381  degrees of freedom
## AIC: 420.17
## 
## Number of Fisher Scoring iterations: 2

Kết quả mô hình hồi quy tuyến tính cho thấy biến Focality có ảnh hưởng đáng kể đến khả năng tái phát bệnh. Hệ số ước lượng của nhóm khối u đơn ổ (Uni-Focal)\(-0.36086\), với giá trị p rất nhỏ < 5%, cho thấy sự khác biệt có ý nghĩa thống kê ở mức 0.05. Điều này có nghĩa là bệnh nhân có khối u đơn ổ có khả năng tái phát bệnh thấp hơn so với bệnh nhân có khối u đa ổ, khi giữ các yếu tố khác không đổi.

Hệ số âm cho thấy xu hướng giảm của biến phụ thuộc (Recurred_bin, dạng nhị phân) ở nhóm Uni-Focal. Giá trị AIC của mô hình là 420.17, cho thấy độ phù hợp khá tốt với dữ liệu nhị phân.

Tóm lại, Focality là một yếu tố dự báo quan trọng trong mô hình, và bệnh nhân có khối u đa ổ (Multi-Focal) có nguy cơ tái phát bệnh cao hơn đáng kể so với bệnh nhân có khối u đơn ổ.

4.3.6.2. Mô hình Logit

Mô hình hồi quy Logistic được áp dụng để mô hình hóa log của tỷ số chênh (log-odds) của việc tái phát.

# Mô hình hồi quy logistic với biến Focality
model_logit_focality <- glm(Recurred_bin ~ Focality, family = binomial(link = "logit"), data = dat)

# Xem kết quả
summary(model_logit_focality)
## 
## Call:
## glm(formula = Recurred_bin ~ Focality, family = binomial(link = "logit"), 
##     data = dat)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        0.05884    0.17157   0.343    0.732    
## FocalityUni-Focal -1.76359    0.24604  -7.168 7.61e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 400.50  on 381  degrees of freedom
## AIC: 404.5
## 
## Number of Fisher Scoring iterations: 3
exp(coef(model_logit_focality))
##       (Intercept) FocalityUni-Focal 
##         1.0606061         0.1714286

Dựa trên kết quả, phương trình hồi quy logistic ước lượng khả năng tái phát bệnh (Recurred_bin) theo đặc điểm khối u (Focality) như sau:

\[ \log\left( \frac{P(\text{Tái phát})}{1 - P(\text{Tái phát})} \right) = 0.05884 - 1.76359 \times \text{Focality}_{\text{Uni-Focal}} \]

Nhận xét:

Hệ số hồi quy \(-1.76359\) cho nhóm khối u đơn ổ (Uni-Focal) có ý nghĩa thống kê rất cao (p-value ≈ \(7.61 \times 10^{-13}\)), cho thấy sự khác biệt có ý nghĩa giữa hai nhóm. Cụ thể, khả năng tái phát bệnh ở bệnh nhân có khối u đơn ổ thấp hơn đáng kể so với bệnh nhân có khối u đa ổ.

Giá trị AIC = 404.5 cho thấy mô hình có độ phù hợp tốt.

Ngoài ra, hệ số âm của biến Uni-Focal cho biết tình trạng đơn ổ giúp giảm log-odds của việc tái phát, tương đương với việc giảm xác suất tái bệnh. Khi lấy \(e^{-1.76359} ≈ 0.172\), ta có thể hiểu rằng khối u đơn ổ làm giảm khoảng 82.8% odds tái bệnh so với khối u đa ổ.

4.3.6.3. Mô hình Probit
# Mô hình Probit với biến Focality
probit_model_focality <- glm(Recurred_bin ~ Focality, family = binomial(link = "probit"), data = dat)

# Xem kết quả mô hình
summary(probit_model_focality)
## 
## Call:
## glm(formula = Recurred_bin ~ Focality, family = binomial(link = "probit"), 
##     data = dat)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        0.03687    0.10750   0.343    0.732    
## FocalityUni-Focal -1.05695    0.14467  -7.306 2.75e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 400.50  on 381  degrees of freedom
## AIC: 404.5
## 
## Number of Fisher Scoring iterations: 3

Phương trình hồi quy Probit ước lượng xác suất tái phát bệnh tuyến giáp theo đặc điểm khối u như sau:

\[ \Phi^{-1}(P(\text{Tái phát})) = 0.03687 - 1.05695 \times \text{Focality}_{\text{Uni-Focal}} \]

Nhận xét:

Kết quả cho thấy biến FocalityUni-Focal có hệ số âm lớn (-1.05695) và có ý nghĩa thống kê rất cao (p-value ≈ \(2.75 \times 10^{-13}\)). Điều này chỉ ra rằng:

  • Bệnh nhân có khối u đơn ổ có xác suất tái phát bệnh thấp hơn đáng kể so với bệnh nhân có khối u đa ổ.
  • Mặc dù hệ số trong mô hình Probit không diễn giải trực tiếp như mô hình logistic, nhưng dấu âm và độ lớn của hệ số cũng phản ánh mối quan hệ nghịch chiều và mạnh.

Giá trị AIC = 404.5 tương đương với mô hình logistic, cho thấy mức độ phù hợp mô hình là tương đương và tốt.

4.3.6.4. Mô hình cloglog
# Mô hình cloglog với biến Focality
cloglog_model_focality <- glm(Recurred_bin ~ Focality, family = binomial(link = "cloglog"), data = dat)

# Xem kết quả mô hình
summary(cloglog_model_focality)
## 
## Call:
## glm(formula = Recurred_bin ~ Focality, family = binomial(link = "cloglog"), 
##     data = dat)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -0.3243     0.1221  -2.655  0.00792 ** 
## FocalityUni-Focal  -1.4651     0.2032  -7.210 5.61e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 400.50  on 381  degrees of freedom
## AIC: 404.5
## 
## Number of Fisher Scoring iterations: 5

Phương trình hồi quy Cloglog được ước lượng như sau:

\[ \log(-\log(1 - P(\text{Tái phát}))) = -0.3243 - 1.4651 \times \text{Focality}_{\text{Uni-Focal}} \]

Nhận xét

  • Biến FocalityUni-Focal có hệ số âm lớn (-1.4651) và rất có ý nghĩa thống kê (p < 0.001), cho thấy bệnh nhân có khối u đơn ổ có xác suất tái phát bệnh thấp hơn đáng kể so với bệnh nhân có khối u đa ổ.
  • Giá trị AIC = 404.5, tương đương với mô hình logisticprobit, cho thấy mức độ phù hợp mô hình là tương đương.
  • Mô hình Cloglog đặc biệt phù hợp khi xác suất xảy ra biến phụ thuộc là thấp hoặc rất cao, vì vậy có thể hữu ích nếu tái phát là hiện tượng hiếm.

4.3.7. Đánh giá mô hình

Bảng tổng hợp 4 mô hình

Bảng tổng hợp 4 mô hình

Mô hình Hệ số (Estimate) P-value AIC Diễn giải
Hồi quy tuyến tính (Linear) -0.361 6.9e-15 *** 420.17 Sai số bình phương nhỏ nhất, không phù hợp với biến phụ thuộc nhị phân
Logistic regression (logit) -1.764 7.61e-13 *** 404.5 Phù hợp với dữ liệu nhị phân, dễ diễn giải
Probit regression -1.057 2.75e-13 *** 404.5 Giả định phân phối chuẩn, tương tự logit
Complementary log-log (cloglog) -1.465 5.61e-13 *** 404.5 Thích hợp cho dữ liệu hiếm gặp (skewed), rủi ro thấp

Nhận xét

  • Tất cả các mô hình (Linear, Logit, Probit, Cloglog) đều cho thấy biến FocalityUni-Focal có ảnh hưởng âm và có ý nghĩa thống kê cao (p < 0.001) đến khả năng tái phát bệnh.

    • Linear: Hệ số âm, có ý nghĩa thống kê nhưng không phù hợp vì biến phụ thuộc là nhị phân.

    • Logit: Hệ số -1.76, phù hợp nhất cho dữ liệu nhị phân, AIC thấp → là lựa chọn tối ưu.

    • Probit: Kết quả tương tự logit, AIC bằng nhau → có thể thay thế logit.

    • Cloglog: Phù hợp nếu tái phát là sự kiện hiếm, cũng cho kết quả mạnh mẽ.

4.4. Kết quả đáp ứng sau điều trị tác động đến khả năng tái phát bệnh

Trong phần này, chúng ta sẽ phân tích mối liên hệ giữa mức độ đáp ứng của bệnh nhân sau điều trị và khả năng tái phát ung thư tuyến giáp biệt hóa. Biến độc lập là Response (với 4 mức độ: Excellent, Indeterminate, Biochemical Incomplete, Structural Incomplete) và biến phụ thuộc là Recurred (có hoặc không tái phát).

4.4.1 Bảng tần số - tần suất cho biến Response

Đầu tiên, chúng ta sẽ lập bảng tần số cho biến Response để hiểu rõ sự phân bố của các nhóm bệnh nhân theo mức độ đáp ứng điều trị.

tab_response <- table(dat$Response)
tab_response
## 
## Biochemical Incomplete              Excellent          Indeterminate 
##                     23                    208                     61 
##  Structural Incomplete 
##                     91

Kết quả trên sẽ được trực quan hóa bằng biểu đồ cột để so sánh số lượng giữa các nhóm.

barplot(tab_response,
        main = "Biểu đồ tần số đáp ứng sau điều trị",
        xlab = "Mức độ đáp ứng",
        ylab = "Tần số",
        col = c("skyblue", "lightgreen", "lightcoral", "plum"),
        border = "white",
        ylim = c(0, max(tab_response) + 40)) -> bp_response

text(x = bp_response, y = tab_response + 15, labels = tab_response)

Bảng dịch thuật

Mức độ đáp ứng (tiếng Anh) Tiếng Việt tương ứng
Excellent Đáp ứng xuất sắc
Biochemical Incomplete Không hoàn toàn sinh hóa
Structural Incomplete Không hoàn toàn cấu trúc
Indeterminate Không xác định

Nhận xét

  • Thông qua bảng tần số và biểu đồ, ta thấy rằng trong tổng số 383 bệnh nhân:

    • Excellent (Đáp ứng xuất sắc): 208 bệnh nhân, chiếm đa số.
    • Indeterminate (Đáp ứng không xác định): 61 bệnh nhân.
    • Biochemical Incomplete (Không hoàn toàn về mặt sinh hóa): 23 bệnh nhân.
    • Structural Incomplete (Không hoàn toàn về mặt cấu trúc): 91 bệnh nhân.

Tiếp theo, chúng ta sẽ tính tỷ lệ phần trăm và vẽ biểu đồ tròn để thể hiện rõ hơn sự phân bố tương đối giữa các nhóm.

# Tạo dataframe từ bảng tần số
response_freq <- as.data.frame(tab_response)
colnames(response_freq) <- c("Response", "Frequency")

# Tính phần trăm
response_freq$Percentage <- response_freq$Frequency / sum(response_freq$Frequency) * 100

# Tạo nhãn
response_freq$Label <- paste0(round(response_freq$Percentage, 1), "%")

# Vẽ biểu đồ tròn
ggplot(response_freq, aes(x = "", y = Percentage, fill = Response)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  theme_void() +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 4) +
  labs(title = "Phân bố các mức độ đáp ứng điều trị của bệnh nhân") +
  scale_fill_brewer(palette = "Pastel1")

Biểu đồ hình tròn thể hiện rõ sự phân bố các mức độ đáp ứng điều trị sau điều trị của bệnh nhân ung thư tuyến giáp. Trong đó:

  • Đáp ứng xuất sắc (Excellent) chiếm tỷ lệ cao nhất với 54.3%, cho thấy hơn một nửa số bệnh nhân có phản ứng điều trị rất tốt.

  • Không hoàn toàn cấu trúc (Structural Incomplete) chiếm 23.8%, là nhóm có tiên lượng kém hơn do còn tổn thương trên hình ảnh học.

  • Không xác định (Indeterminate) chiếm 15.9%, là nhóm cần theo dõi thêm để xác định rõ xu hướng bệnh.

  • Không hoàn toàn sinh hóa (Biochemical Incomplete) chiếm tỷ lệ thấp nhất với 6%, cho thấy chỉ một số ít bệnh nhân có bất thường về chỉ số sinh hóa sau điều trị.

Nhìn chung, đa số bệnh nhân có đáp ứng tích cực, tuy nhiên vẫn còn khoảng 45.7% bệnh nhân chưa đạt mức đáp ứng hoàn toàn, trong đó một phần đáng kể là có tổn thương cấu trúc. Điều này cho thấy cần tiếp tục theo dõi sát và điều trị bổ sung đối với nhóm chưa đáp ứng tốt.

4.4.2. Thống kê mô tả cho hai biến Response và khả năng tái phát bệnh

Chúng ta sẽ lập bảng tần số chéo giữa hai biến Response và Recurred để xem xét mối quan hệ sơ bộ giữa chúng.

# Bảng tần số chéo giữa mức độ đáp ứng và tái phát
table_taibenh_response <- table(dat$Response, dat$Recurred)

# Thêm hàng và cột tổng
addmargins(table_taibenh_response)
##                         
##                           No Yes Sum
##   Biochemical Incomplete  12  11  23
##   Excellent              207   1 208
##   Indeterminate           54   7  61
##   Structural Incomplete    2  89  91
##   Sum                    275 108 383
  • Excellent: 208 bệnh nhân, chỉ 1 ca tái phát → nguy cơ thấp.

  • Biochemical Incomplete: 23 bệnh nhân, 11 ca tái phát → nguy cơ cao.

  • Indeterminate: 61 bệnh nhân, 7 ca tái phát → nguy cơ trung bình.

  • Structural Incomplete: 91 bệnh nhân, 89 ca tái phát → nguy cơ rất cao.

Kết luận: Mức độ đáp ứng điều trị liên quan rõ rệt đến khả năng tái phát. Đáp ứng càng kém, nguy cơ tái phát càng cao.

Để làm rõ hơn nhận định trên, chúng ta sẽ sử dụng biểu đồ cột nhóm.

# Chuyển bảng chéo thành data frame
df_plot_response <- as.data.frame(table_taibenh_response)
colnames(df_plot_response) <- c("Response", "Recurred", "Count")

# Đảm bảo thứ tự mức độ đáp ứng theo lâm sàng
df_plot_response$Response <- factor(df_plot_response$Response,
                                    levels = c("Excellent", "Biochemical Incomplete", 
                                               "Indeterminate", "Structural Incomplete"))

# Vẽ biểu đồ cột tỷ lệ
library(ggplot2)
ggplot(df_plot_response, aes(x = Response, y = Count, fill = Recurred)) +
  geom_col(position = "fill") +  # tỷ lệ phần trăm theo cột
  scale_y_continuous(labels = scales::percent_format()) +
  scale_fill_manual(values = c("No" = "lightblue", "Yes" = "pink"),
                    labels = c("Không tái phát", "Tái phát")) +
  labs(title = "Tỷ lệ tái phát theo mức độ đáp ứng điều trị",
       x = "Mức độ đáp ứng điều trị",
       y = "Tỷ lệ (%)",
       fill = "Tình trạng tái phát") +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 25, hjust = 1))

  • Biểu đồ cho thấy tỷ lệ tái phát bệnh tăng dần theo mức độ đáp ứng điều trị. Cụ thể:

    • Nhóm Excellent gần như không tái phát (gần 100% không tái phát).

    • Nhóm Biochemical Incomplete có tỷ lệ tái phát khoảng 50%.

    • Nhóm Indeterminate có tỷ lệ tái phát khoảng 10–15%.

  • Đáng chú ý, nhóm Structural Incomplete có tỷ lệ tái phát gần như tuyệt đối.

Điều này cho thấy mức độ đáp ứng điều trị có liên quan rõ rệt đến nguy cơ tái phát bệnh, trong đó đáp ứng không hoàn toàn về mặt cấu trúc là yếu tố nguy cơ cao nhất.

4.4.3. Phân tích Relative Risk giữa Response và khả năng tái bệnh

Chúng ta sẽ tính toán Nguy cơ tương đối (RR), lấy nhóm Excellent làm nhóm tham chiếu.

install.packages("epitools")
## Warning: package 'epitools' is in use and will not be installed
library(epitools)
riskratio(table_taibenh_response)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##                         
##                           No Yes Total
##   Biochemical Incomplete  12  11    23
##   Excellent              207   1   208
##   Indeterminate           54   7    61
##   Structural Incomplete    2  89    91
##   Total                  275 108   383
## 
## $measure
##                         risk ratio with 95% C.I.
##                            estimate       lower      upper
##   Biochemical Incomplete 1.00000000          NA         NA
##   Excellent              0.01005245 0.001358686 0.07437458
##   Indeterminate          0.23994039 0.105961151 0.54332544
##   Structural Incomplete  2.04495504 1.332974552 3.13722503
## 
## $p.value
##                         two-sided
##                            midp.exact fisher.exact   chi.square
##   Biochemical Incomplete           NA           NA           NA
##   Excellent              7.877921e-12 7.840382e-12 2.765512e-22
##   Indeterminate          7.934210e-04 7.068514e-04 2.939944e-04
##   Structural Incomplete  1.838155e-08 1.804592e-08 6.830919e-11
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Trong nghiên cứu này, nhóm Biochemical Incomplete được chọn làm nhóm tham chiếu để đánh giá nguy cơ tái phát bệnh ở các nhóm đáp ứng điều trị khác nhau. Việc phân tích tỉ số nguy cơ (Relative Risk – RR) cho phép so sánh khả năng tái phát giữa các nhóm một cách trực quan và có ý nghĩa thống kê.

Nhóm Excellent

Kết quả cho thấy, nhóm Excellent có nguy cơ tái phát bệnh thấp hơn rõ rệt so với nhóm Biochemical Incomplete, với RR = 0,01. Điều này đồng nghĩa với việc những bệnh nhân đạt mức đáp ứng điều trị xuất sắc có nguy cơ tái phát thấp hơn đến 99% so với nhóm không đáp ứng hoàn toàn về sinh hóa. Đây là mức khác biệt có ý nghĩa thống kê rất cao, khẳng định hiệu quả điều trị tích cực và tiên lượng tốt cho nhóm bệnh nhân này. Kết quả cũng phản ánh vai trò quan trọng của việc đạt được đáp ứng điều trị tối ưu trong việc giảm thiểu nguy cơ tái phát.

Nhóm Indeterminate

Đối với nhóm Indeterminate, nguy cơ tái phát bệnh cũng thấp hơn so với nhóm Biochemical Incomplete, với RR = 0,24. Mặc dù mức độ đáp ứng điều trị ở nhóm này chưa thể xác định rõ ràng về mặt lâm sàng, nhưng kết quả cho thấy khả năng tái phát vẫn thấp hơn đáng kể. Điều này cho thấy nhóm Indeterminate có thể bao gồm một phần bệnh nhân đáp ứng tốt nhưng chưa được phân loại chính xác, hoặc có yếu tố tiên lượng trung gian. Do đó, cần theo dõi chặt chẽ nhóm này trong các nghiên cứu tiếp theo để đánh giá rõ hơn về tiên lượng và hướng điều trị.

Nhóm Structural Incomplete

Ngược lại, nhóm Structural Incomplete lại có nguy cơ tái phát cao hơn so với nhóm tham chiếu, với RR = 2,04. Điều này cho thấy những bệnh nhân có dấu hiệu không đáp ứng về mặt cấu trúc sau điều trị có nguy cơ tái phát cao gấp đôi so với nhóm Biochemical Incomplete. Mức tăng nguy cơ này có ý nghĩa thống kê rõ rệt, cho thấy nhóm Structural Incomplete là nhóm nguy cơ cao cần được theo dõi sát sao và can thiệp kịp thời nhằm hạn chế biến chứng hoặc tái phát.

Tổng thể, các kết quả phân tích cho thấy mức độ đáp ứng điều trị có mối liên hệ chặt chẽ với nguy cơ tái phát bệnh. Nhóm Excellent có tiên lượng rất tốt, nhóm Indeterminate có nguy cơ trung gian, trong khi nhóm Structural Incomplete là nhóm có nguy cơ tái phát cao nhất. Những thông tin này rất hữu ích trong thực hành lâm sàng để phân tầng nguy cơ và xây dựng chiến lược theo dõi, điều trị phù hợp cho từng nhóm bệnh nhân sau điều trị ung thư tuyến giáp.

4.4.4. Phân tích Odd Ratio giữa Response và khả năng tái bệnh

oddsratio(table_taibenh_response)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##                         
##                           No Yes Total
##   Biochemical Incomplete  12  11    23
##   Excellent              207   1   208
##   Indeterminate           54   7    61
##   Structural Incomplete    2  89    91
##   Total                  275 108   383
## 
## $measure
##                         odds ratio with 95% C.I.
##                              estimate        lower        upper
##   Biochemical Incomplete  1.000000000           NA           NA
##   Excellent               0.006338862 2.443608e-04   0.03672695
##   Indeterminate           0.147014684 4.427450e-02   0.45293613
##   Structural Incomplete  43.194417949 1.000775e+01 332.56177782
## 
## $p.value
##                         two-sided
##                            midp.exact fisher.exact   chi.square
##   Biochemical Incomplete           NA           NA           NA
##   Excellent              7.877921e-12 7.840382e-12 2.765512e-22
##   Indeterminate          7.934210e-04 7.068514e-04 2.939944e-04
##   Structural Incomplete  1.838155e-08 1.804592e-08 6.830919e-11
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Phân tích Odds Ratio (OR) nhằm so sánh khả năng tái phát bệnh giữa các nhóm mức độ đáp ứng điều trị, với nhóm Biochemical Incomplete được chọn làm nhóm tham chiếu.

Nhóm Excellent so với Biochemical Incomplete

Nhóm có mức độ đáp ứng Excellent cho thấy odds tái phát bệnh thấp hơn đáng kể so với nhóm Biochemical Incomplete, với OR = 0,0063. Điều này đồng nghĩa rằng, trong nhóm có đáp ứng xuất sắc, tỷ lệ odds tái phát so với không tái phát chỉ bằng khoảng 0,6% so với nhóm tham chiếu.

Nhóm Indeterminate so với Biochemical Incomplete

Đối với nhóm Indeterminate, odds tái phát thấp hơn nhóm Biochemical Incomplete, với OR = 0,1470. Mặc dù vẫn có nguy cơ tái phát, nhóm này có tỷ lệ odds tái phát chỉ bằng khoảng 14,7% so với nhóm tham chiếu.

Nhóm Structural Incomplete so với Biochemical Incomplete

Ngược lại, nhóm có đáp ứng Structural Incomplete lại có odds tái phát cao gấp hơn 43 lần so với nhóm Biochemical Incomplete, với OR = 43,19. Điều này cho thấy mức độ đáp ứng kém trên hình ảnh học có liên quan chặt chẽ với khả năng tái phát bệnh.

Tóm tắt

  • Kết quả phân tích Odds Ratio chỉ ra rằng:

    • Excellent là nhóm an toàn nhất, odds tái phát rất thấp.

    • Indeterminate có nguy cơ tái phát trung bình, nhưng thấp hơn Biochemical Incomplete.

    • Structural Incomplete là nhóm nguy cơ cao nhất, có liên quan mạnh với khả năng tái phát.

  • Kết quả này giúp phân tầng nguy cơ tái phát sau điều trị, từ đó hỗ trợ trong việc theo dõi và đưa ra các chiến lược can thiệp phù hợp.

4.4.5. Thống kê suy diễn

Chúng ta sử dụng kiểm định Chi bình phương để kiểm tra giả thuyết về tính độc lập giữa mức độ đáp ứng và khả năng tái phát.

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

H₀ (Giả thuyết không): Mức độ đáp ứng và khả năng tái phát là hai biến độc lập. H₁ (Giả thuyết đối): Mức độ đáp ứng và khả năng tái phát là hai biến phụ thuộc.

# Kiểm định Chi bình phương
chisq.test(table_taibenh_response)
## 
##  Pearson's Chi-squared test
## 
## data:  table_taibenh_response
## X-squared = 309.47, df = 3, p-value < 2.2e-16

Kết quả kiểm định

\[ \chi^2 = 309.47,\quad df = 3,\quad p\text{-value} < 2.2 \times 10^{-16} \]

Diễn giải

Giá trị p rất nhỏ (gần bằng 0), cho thấy có đủ bằng chứng để bác bỏ giả thuyết \(H_0\) với mức ý nghĩa 5%. Điều này chứng tỏ rằng mức độ đáp ứng điều trị có mối liên hệ có ý nghĩa thống kê với khả năng tái phát.

Nói cách khác, khả năng tái phát bệnh tuyến giáp biệt hóa phụ thuộc đáng kể vào phản ứng điều trị ban đầu, từ đó củng cố vai trò của việc theo dõi sát và phân tầng nguy cơ dựa trên mức độ đáp ứng.

4.4.6. Mô hình hồi quy cho dữ liệu nhị phân

4.4.6.1. Hồi quy tuyến tính

Để xây dựng mô hình, chúng ta sẽ đặt nhóm Excellent làm mức tham chiếu để các hệ số có thể được diễn giải một cách hợp lý.

# Đặt lại nhóm tham chiếu
dat$Response <- relevel(dat$Response, ref = "Biochemical Incomplete")

# Chạy lại mô hình hồi quy
model_ref_bio <- glm(Recurred_bin ~ Response, data = dat)
summary(model_ref_bio)
## 
## Call:
## glm(formula = Recurred_bin ~ Response, data = dat)
## 
## Coefficients:
##                               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                    0.47826    0.04133  11.573  < 2e-16 ***
## ResponseExcellent             -0.47345    0.04355 -10.871  < 2e-16 ***
## ResponseIndeterminate         -0.36351    0.04849  -7.496 4.71e-13 ***
## ResponseStructural Incomplete  0.49976    0.04625  10.805  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.03927992)
## 
##     Null deviance: 77.546  on 382  degrees of freedom
## Residual deviance: 14.887  on 379  degrees of freedom
## AIC: -146.9
## 
## Number of Fisher Scoring iterations: 2

Phương trình hồi quy tuyến tính

\[ \hat{Y} = 0.47826 - 0.47345 \cdot \text{Excellent} - 0.36351 \cdot \text{Indeterminate} + 0.49976 \cdot \text{Structural Incomplete} \]

Trong đó:

  • \(\hat{Y}\) là xác suất tái phát bệnh.
  • Các biến là dummy variables so với nhóm tham chiếu là Biochemical Incomplete.

Giải thích hệ số hồi quy

Biểu hiện Hệ số Giải thích
\(\text{(Intercept)}\) 0.47826 Nhóm Biochemical Incomplete có xác suất tái phát bệnh là khoảng 47.8%.
\(\text{Excellent}\) -0.47345 Nhóm Excellent có xác suất tái phát giảm 47.3 điểm % so với nhóm tham chiếu (p < 0.001), tức còn khoảng 0.48%.
\(\text{Indeterminate}\) -0.36351 Nhóm Indeterminate có xác suất tái phát giảm 36.4 điểm % so với nhóm tham chiếu (p < 0.001), tương đương xác suất khoảng 11.5%.
\(\text{Structural Incomplete}\) +0.49976 Nhóm Structural Incomplete có xác suất tái phát tăng 49.9 điểm % so với nhóm tham chiếu (p < 0.001), tức xác suất có thể lên đến 97.8%.
4.4.6.2. Hồi quy logit

Xét mô hình hồi quy logistic với biến phụ thuộc là khả năng tái phát bệnh và biến độc lập là mức độ đáp ứng sau điều trị (Response), với nhóm tham chiếu là Biochemical Incomplete.

# Mô hình hồi quy logistic với biến Response
model_logit_response <- glm(Recurred_bin ~ Response, family = binomial(link = "logit"), data = dat)
summary(model_logit_response)
## 
## Call:
## glm(formula = Recurred_bin ~ Response, family = binomial(link = "logit"), 
##     data = dat)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -0.08701    0.41742  -0.208 0.834879    
## ResponseExcellent             -5.24571    1.08585  -4.831 1.36e-06 ***
## ResponseIndeterminate         -1.95606    0.57933  -3.376 0.000734 ***
## ResponseStructural Incomplete  3.88250    0.82794   4.689 2.74e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 107.21  on 379  degrees of freedom
## AIC: 115.21
## 
## Number of Fisher Scoring iterations: 8
exp(coef(model_logit_response))
##                   (Intercept)             ResponseExcellent 
##                   0.916666667                   0.005270092 
##         ResponseIndeterminate ResponseStructural Incomplete 
##                   0.141414141                  48.545454545

Tỷ số Odds (Odds Ratio)

\[ \log\left( \frac{\hat{p}}{1 - \hat{p}} \right) = -0.08701 - 5.24571 \cdot \text{Excellent} - 1.95606 \cdot \text{Indeterminate} + 3.88250 \cdot \text{Structural Incomplete} \]

Diễn giải hệ số hồi quy

Biểu hiện Hệ số (log-odds) Giải thích
(Intercept) -0.08701 Đây là log-odds tái phát ở nhóm Biochemical Incomplete (tham chiếu). Tương ứng xác suất khoảng 47.8%.
Excellent -5.24571 Nhóm Excellent có log-odds tái phát thấp hơn rất nhiều so với nhóm tham chiếu (p < 0.001). Odds giảm khoảng \(e^{-5.24571} \approx 0.005\), tức xác suất tái phát cực thấp.
Indeterminate -1.95606 Nhóm Indeterminate có log-odds tái phát thấp hơn nhóm tham chiếu (p < 0.001), với odds giảm khoảng \(e^{-1.95606} \approx 0.14\), tương đương xác suất khoảng 12%.
Structural Incomplete +3.88250 Nhóm Structural Incomplete có log-odds tái phát cao hơn đáng kể (p < 0.001), odds tăng gấp \(e^{3.8825} \approx 48.6\) lần, tương đương xác suất tái phát > 97%.

Nhận xét

  • Mô hình cho thấy mức độ đáp ứng sau điều trị là yếu tố dự báo mạnh mẽ cho khả năng tái phát bệnh.

  • Nhóm Excellent có nguy cơ tái phát rất thấp, trong khi nhóm Structural Incomplete có nguy cơ rất cao.

  • Sự khác biệt này đều có ý nghĩa thống kê (p < 0.001) đối với mọi nhóm so với tham chiếu (Biochemical Incomplete).

4.4.6.3. Hồi quy probit

Áp dụng mô hình hồi quy Probit để phân tích mối quan hệ giữa mức độ đáp ứng sau điều trị (Response) và khả năng tái phát bệnh (Recurred_bin), trong đó nhóm tham chiếu là Biochemical Incomplete.

# Mô hình Probit với biến Response
probit_model_response <- glm(Recurred_bin ~ Response, family = binomial(link = "probit"), data = dat)
summary(probit_model_response)
## 
## Call:
## glm(formula = Recurred_bin ~ Response, family = binomial(link = "probit"), 
##     data = dat)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -0.05452    0.26148  -0.209 0.834835    
## ResponseExcellent             -2.53484    0.43166  -5.872 4.30e-09 ***
## ResponseIndeterminate         -1.14711    0.33572  -3.417 0.000633 ***
## ResponseStructural Incomplete  2.06903    0.39276   5.268 1.38e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 107.21  on 379  degrees of freedom
## AIC: 115.21
## 
## Number of Fisher Scoring iterations: 7

\[ \Phi^{-1}(\hat{p}) = -0.05452 - 2.53484 \cdot \text{Excellent} - 1.14711 \cdot \text{Indeterminate} + 2.06903 \cdot \text{Structural Incomplete} \]

Trong đó:

\[\Phi^{-1}(\hat{p})\] là hàm nghịch đảo phân phối chuẩn tích lũy của xác suất tái phát bệnh.

Các biến là biến giả (dummy) tương ứng với các nhóm so với nhóm tham chiếu là Biochemical Incomplete.

Diễn giải hệ số hồi quy

Biểu hiện Hệ số (Probit) Giải thích
(Intercept) -0.05452 Là giá trị ngưỡng chuẩn hoá của xác suất tái phát trong nhóm Biochemical Incomplete.
Excellent -2.53484 Nhóm Excellent có xác suất tái phát thấp hơn rõ rệt so với nhóm tham chiếu (p < 0.001).
Indeterminate -1.14711 Nhóm Indeterminate cũng có xác suất tái phát thấp hơn đáng kể so với nhóm Biochemical Incomplete (p < 0.001).
Structural Incomplete +2.06903 Nhóm Structural Incomplete có xác suất tái phát cao hơn rất nhiều, với hệ số dương lớn (p < 0.001).

Nhận xét

  • Mô hình probit xác nhận rõ ràng rằng mức độ đáp ứng sau điều trị là một yếu tố dự đoán mạnh mẽ cho khả năng tái phát bệnh.

  • Nhóm Excellent và Indeterminate đều có nguy cơ tái phát thấp hơn đáng kể, trong khi nhóm Structural Incomplete có nguy cơ rất cao.

  • Kết quả hoàn toàn nhất quán với mô hình logistic, cho thấy độ tin cậy cao trong việc khẳng định mối liên hệ giữa mức độ đáp ứng và tái phát bệnh.

4.4.6.4. Hồi quy cloglog

Mô hình hồi quy Cloglog được sử dụng để dự đoán xác suất tái phát bệnh (Recurred_bin) dựa trên mức độ đáp ứng (Response) sau điều trị. Mô hình đặc biệt phù hợp trong trường hợp biến phụ thuộc có phân phối bất cân xứng (tức là xác suất sự kiện xảy ra gần 0 hoặc gần 1).

# Mô hình cloglog với biến Response
cloglog_model_response <- glm(Recurred_bin ~ Response, family = binomial(link = "cloglog"), data = dat)
summary(cloglog_model_response)
## 
## Call:
## glm(formula = Recurred_bin ~ Response, family = binomial(link = "cloglog"), 
##     data = dat)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                    -0.4299     0.3069  -1.401 0.161241    
## ResponseExcellent              -4.9053     1.0460  -4.689 2.74e-06 ***
## ResponseIndeterminate          -1.6748     0.4870  -3.439 0.000584 ***
## ResponseStructural Incomplete   1.7695     0.3574   4.952 7.36e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 107.21  on 379  degrees of freedom
## AIC: 115.21
## 
## Number of Fisher Scoring iterations: 8

\[ \log(-\log(1 - \hat{p})) = -0.4299 - 4.9053 \cdot \text{Excellent} - 1.6748 \cdot \text{Indeterminate} + 1.7695 \cdot \text{Structural Incomplete} \]

Diễn giải hệ số hồi quy

Biểu hiện Hệ số (Cloglog) Giải thích
(Intercept) -0.4299 Là giá trị log(-log(1 - p)) của xác suất tái phát trong nhóm Biochemical Incomplete. Không có ý nghĩa thống kê (p = 0.161).
Excellent -4.9053 Nhóm Excellent có xác suất tái phát giảm mạnh so với nhóm tham chiếu (p < 0.001).
Indeterminate -1.6748 Nhóm Indeterminate có xác suất tái phát thấp hơn rõ rệt (p < 0.001).
Structural Incomplete +1.7695 Nhóm Structural Incomplete có xác suất tái phát cao hơn đáng kể (p < 0.001).

Nhận xét

  • Tương tự như các mô hình hồi quy nhị phân khác (logistic và probit), mô hình cloglog xác nhận rằng mức độ đáp ứng sau điều trị là yếu tố ảnh hưởng mạnh đến nguy cơ tái phát bệnh.

  • Nhóm Excellent có xác suất tái phát rất thấp, trong khi nhóm Structural Incomplete có xác suất tái phát rất cao.

  • Dù hàm liên kết khác, kết quả nhất quán với các mô hình trước, cho thấy tính ổn định và đáng tin cậy của biến Response trong tiên lượng bệnh.

4.4.7. Đánh giá các mô hình

Bảng tổng hợp chỉ số AIC của 4 mô hình hồi quy

Mô hình Hàm liên kết (Link function) AIC Phù hợp với dữ liệu nhị phân?
Linear Probability Model (LPM) Không có (mô hình tuyến tính thông thường) -146.9 Không phù hợp
Logit \(\log\left(\frac{p}{1 - p}\right)\) 115.21 Phù hợp
Probit \(\Phi^{-1}(p)\) 115.21 Phù hợp
Cloglog \(\log(-\log(1 - p))\) 115.21 Phù hợp
  • Trong việc phân tích mối liên hệ giữa đáp ứng điều trị và khả năng tái phát, cả bốn mô hình đều đưa ra một kết luận đồng nhất: mức độ đáp ứng sau điều trị là một yếu tố dự báo cực kỳ mạnh mẽ cho nguy cơ tái phát.

  • Khi so sánh các mô hình dựa trên chỉ số AIC, mô hình hồi quy tuyến tính có AIC thấp nhất (-146.9), nhưng vì đang xét biến nhị phân nên mô hình này không phù hợp. Ba còn lại là Logit, Probit, và Cloglog đều có chỉ số AIC bằng nhau và phù hợp với biến nhị phân (115.21), cho thấy chúng mô tả mối quan hệ này tốt hơn một cách vượt trội.

  • Mặc dù có AIC tương đương, mô hình Logit là lựa chọn ưu việt nhất trong bối cảnh lâm sàng vì khả năng diễn giải kết quả một cách trực quan và mạnh mẽ thông qua Tỷ số chênh (Odds Ratio). Việc kết luận rằng bệnh nhân có đáp ứng Structural Incomplete có “odds” tái phát cao gấp gần 4 lần so với người có đáp ứng Biochemical Incomplete. Đây là một phát hiện có giá trị thực tiễn rất lớn, giúp phân tầng nguy cơ và lên kế hoạch theo dõi cho bệnh nhân.

  • Do đó, mô hình Logit được khuyến nghị là lựa chọn tối ưu để phân tích và báo cáo kết quả trong nghiên cứu này.

PHÂN TÍCH ĐA BIẾN

Sau khi đã thực hiện các phân tích đơn biến và nhận thấy rằng các yếu tố Gender, Smoking, Hx.Radiothreapy, Focality, và Response đều có mối liên hệ với khả năng tái phát (Recurred), bước tiếp theo là xây dựng một mô hình hồi quy đa biến.

Mục tiêu:

  • Mục tiêu của phân tích đa biến là để đánh giá tác động đồng thời của nhiều biến độc lập lên một biến phụ thuộc. Điều này cho phép chúng ta:

    • Xác định các yếu tố dự báo mạnh nhất cho khả năng tái phát.
    • Đánh giá ảnh hưởng của một biến sau khi đã “kiểm soát” hoặc “điều chỉnh” cho các biến khác trong mô hình. Điều này giúp loại bỏ các yếutoos gây nhiễu (confounders).
    • Xây dựng một mô hình dự báo toàn diện hơn.

\[ \hat{\pi} = 0.469 + 0.056 \cdot \text{Gender}_\text{M} - 0.006 \cdot \text{Smoking}_\text{Yes} + 0.065 \cdot \text{Hx.Radiothreapy}_\text{Yes} - 0.008 \cdot \text{Focality}_\text{Uni-Focal} \\ - 0.463 \cdot \text{Response}_\text{Excellent} - 0.359 \cdot \text{Response}_\text{Indeterminate} + 0.488 \cdot \text{Response}_\text{Structural Incomplete} \]

4.6 Mô hình Logit

# Logit
model_logit <- glm(Recurred_bin ~ Gender + Smoking + Hx.Radiothreapy + Focality + Response,
                   family = binomial(link = "logit"), data = dat)
summary(model_logit)
## 
## Call:
## glm(formula = Recurred_bin ~ Gender + Smoking + Hx.Radiothreapy + 
##     Focality + Response, family = binomial(link = "logit"), data = dat)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                    -0.1718     0.5476  -0.314  0.75368    
## GenderM                         1.2533     0.7778   1.611  0.10710    
## SmokingHút thuốc               -0.3194     0.9229  -0.346  0.72928    
## Hx.RadiothreapyYes              0.4566     1.0321   0.442  0.65817    
## FocalityUni-Focal              -0.3407     0.5502  -0.619  0.53579    
## ResponseExcellent              -5.0999     1.1053  -4.614 3.95e-06 ***
## ResponseIndeterminate          -1.9625     0.6195  -3.168  0.00154 ** 
## ResponseStructural Incomplete   3.7915     0.8458   4.483 7.37e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 103.07  on 375  degrees of freedom
## AIC: 119.07
## 
## Number of Fisher Scoring iterations: 8

4.6.1. Đánh giá tổng quan mô hình logit

Mô hình hồi quy logistic (logit) được sử dụng nhằm dự đoán xác suất tái phát \(\pi\) của bệnh nhân tuyến giáp biệt hóa, với biến phụ thuộc nhị phân Recurred_bin (0: không tái phát, 1: tái phát).

Các biến độc lập được đưa vào mô hình gồm:

  • Gender (giới tính),
  • Smoking (hút thuốc),
  • Hx.Radiothreapy (tiền sử xạ trị),
  • Focality (tình trạng khối u),
  • Response (đáp ứng điều trị).

4.6.2. Chất lượng mô hình

  • Sai số chuẩn (Dispersion): 1
  • Độ lệch dư (Residual deviance): 102.43 trên 375 bậc tự do
  • Độ lệch gốc (Null deviance): 455.63 trên 382 bậc tự do
  • Chênh lệch deviance: \(\Delta D = 455.63 - 102.43 = 353.2\) cho 7 bậc tự do
  • AIC = 118.43

Mô hình logit cho thấy sự cải thiện rất đáng kể so với mô hình rỗng (null model), thể hiện qua độ lệch dư giảm mạnh. AIC thấp cũng cho thấy mô hình phù hợp tốt.

4.6.3. Phương trình mô hình

Mô hình logit có dạng:

\[ \log\left(\frac{\pi}{1 - \pi}\right) = \beta_0 + \sum_{i=1}^{k} \beta_i X_i \]

Thay hệ số ước lượng từ kết quả, ta có:

\[ \log\left(\frac{\pi}{1 - \pi}\right) = -0.1551 - 5.1327 \cdot \text{Response}_{Excellent} - 1.9529 \cdot \text{Response}_{Indeterminate} + 3.7878 \cdot \text{Response}_{Structural\ Incomplete} \]

4.6.4. Nhận xét

Biến Hệ số \(\beta\) OR (odds ratio) Giá trị p Ý nghĩa thống kê Diễn giải ý nghĩa
Response: Excellent -5.1327 0.0059 3.85e-06 Đáp ứng điều trị tốt giúp nguy cơ tái phát gần bằng 0
Response: Indeterminate -1.9529 0.1420 0.00141 Đáp ứng không xác định làm giảm odds tái phát
Response: Structural Incomplete 3.7878 44.1513 6.86e-06 Tổn thương cấu trúc chưa hoàn toàn làm tăng mạnh odds tái phát

Ghi chú:
- \(\text{OR} = e^{\beta}\)
- Giá trị p < 0.05 được đánh dấu là Có ý nghĩa thống kê

4.6.5. Kết luận

  • Mô hình logit phù hợp để dự đoán khả năng tái phát bệnh tuyến giáp biệt hóa.
  • Kết quả cho thấy yếu tố liên quan đến đáp ứng điều trị có ảnh hưởng mạnh nhất đến khả năng tái phát.
  • Cần so sánh với mô hình probitcloglog để xác định mô hình tối ưu nhất.

4.7 Mô hình Probit

# Probit
model_probit <- glm(Recurred_bin ~ Gender + Smoking + Hx.Radiothreapy + Focality + Response,
                    family = binomial(link = "probit"), data = dat)
summary(model_probit)
## 
## Call:
## glm(formula = Recurred_bin ~ Gender + Smoking + Hx.Radiothreapy + 
##     Focality + Response, family = binomial(link = "probit"), 
##     data = dat)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                    -0.1212     0.3223  -0.376  0.70685    
## GenderM                         0.6728     0.3959   1.700  0.08922 .  
## SmokingHút thuốc               -0.2340     0.4741  -0.494  0.62162    
## Hx.RadiothreapyYes              0.2732     0.5376   0.508  0.61139    
## FocalityUni-Focal              -0.1289     0.2844  -0.453  0.65048    
## ResponseExcellent              -2.4644     0.4430  -5.563 2.65e-08 ***
## ResponseIndeterminate          -1.1382     0.3502  -3.250  0.00115 ** 
## ResponseStructural Incomplete   2.0599     0.4116   5.005 5.59e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 103.33  on 375  degrees of freedom
## AIC: 119.33
## 
## Number of Fisher Scoring iterations: 8

4.7.1. Phương trình mô hình:

\[ \Phi^{-1}(\pi) = -0.1128 + 0.6659 \cdot \text{GenderM} - 0.2260 \cdot \text{SmokingYes} + 1.2632 \cdot \text{Hx.Radiothreapy: Đã từng xạ trị} - 0.1265 \cdot \text{Focality: Uni-Focal} - 2.4768 \cdot \text{Response: Excellent} - 1.1381 \cdot \text{Response: Indeterminate} + 2.0574 \cdot \text{Response: Structural Incomplete} \]

Trong đó: - \(\Phi^{-1}(\pi)\) là hàm nghịch đảo của phân phối chuẩn tích lũy chuẩn — tương ứng với hàm link probit.


4.7.2. Bảng: Nhận xét về mô hình hồi quy Probit

Biến Hệ số \(\beta\) Giá trị p Ý nghĩa thống kê Diễn giải ý nghĩa
(Intercept) -0.1128 0.725 Không Không có ý nghĩa
GenderM 0.6659 0.0919 Gần có Nam có xác suất tái phát cao hơn nữ, gần mức ý nghĩa 10%
SmokingYes -0.2260 0.6221 Không Không đáng kể
Hx.Radiothreapy: Đã từng xạ trị 1.2632 0.3488 Không Chưa đủ bằng chứng để khẳng định mối liên hệ
Focality: Uni-Focal -0.1265 0.6529 Không Không đáng kể
Response: Excellent -2.4768 2.36e-08 Giảm mạnh xác suất tái phát nếu đáp ứng điều trị tốt
Response: Indeterminate -1.1381 0.00105 Giảm xác suất tái phát với đáp ứng không xác định
Response: Structural Incomplete 2.0574 5.19e-07 Tăng mạnh xác suất tái phát với tổn thương chưa hoàn toàn

4.7.3. Kết luận:

Mô hình Probit cho thấy các biến về Response (đặc biệt là “Excellent” và “Structural Incomplete”) có ảnh hưởng rất mạnh và có ý nghĩa thống kê đến khả năng tái phát ung thư. Các biến khác như giới tính (Gender) có xu hướng ảnh hưởng nhưng chưa đủ ý nghĩa thống kê ở mức 5%.

4.8 Mô hình Cloglog

# Cloglog
model_cloglog <- glm(Recurred_bin ~ Gender + Smoking + Hx.Radiothreapy + Focality + Response,
                     family = binomial(link = "cloglog"), data = dat)
summary(model_cloglog)
## 
## Call:
## glm(formula = Recurred_bin ~ Gender + Smoking + Hx.Radiothreapy + 
##     Focality + Response, family = binomial(link = "cloglog"), 
##     data = dat)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -0.62457    0.39514  -1.581 0.113963    
## GenderM                        1.10386    0.55161   2.001 0.045375 *  
## SmokingHút thuốc              -0.47062    0.49442  -0.952 0.341166    
## Hx.RadiothreapyYes             0.32586    0.64752   0.503 0.614792    
## FocalityUni-Focal             -0.01446    0.33797  -0.043 0.965873    
## ResponseExcellent             -4.84713    1.05594  -4.590 4.42e-06 ***
## ResponseIndeterminate         -1.71289    0.50745  -3.375 0.000737 ***
## ResponseStructural Incomplete  1.91913    0.41293   4.648 3.36e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 455.63  on 382  degrees of freedom
## Residual deviance: 101.32  on 375  degrees of freedom
## AIC: 117.32
## 
## Number of Fisher Scoring iterations: 9

4.8.1. Phương trình mô hình:

\[ \log\left(-\log(1 - \pi)\right) = -0.6246 + 1.1020 \cdot \text{GenderM} - 0.4436 \cdot \text{SmokingYes} + 1.6728 \cdot \text{Hx.Radiothreapy: Đã từng xạ trị} + 0.0025 \cdot \text{Focality: Uni-Focal} - 4.8623 \cdot \text{Response: Excellent} - 1.7112 \cdot \text{Response: Indeterminate} + 1.9205 \cdot \text{Response: Structural Incomplete} \]


4.8.2. Bảng: Nhận xét về mô hình hồi quy Cloglog

Biến Hệ số \(\beta\) Giá trị p Ý nghĩa thống kê Diễn giải ý nghĩa
(Intercept) -0.6246 0.1139 Không Không đáng kể
GenderM 1.1020 0.0465 Nam có xác suất tái phát cao hơn có ý nghĩa ở mức 5%
SmokingYes -0.4436 0.3485 Không Không đáng kể
Hx.Radiothreapy: Đã từng xạ trị 1.6728 0.5314 Không Không đáng kể
Focality: Uni-Focal 0.0025 0.9940 Không Không đáng kể
Response: Excellent -4.8623 4.07e-06 Giảm mạnh xác suất tái phát khi điều trị rất tốt
Response: Indeterminate -1.7112 0.0007 Giảm xác suất tái phát nếu đáp ứng không xác định
Response: Structural Incomplete 1.9205 2.79e-06 Tăng xác suất tái phát nếu tổn thương chưa hồi phục hoàn toàn

4.8.3.Kết luận:

Mô hình cloglog cho thấy rằng các yếu tố giới tính (nam)đáp ứng điều trị có ảnh hưởng rõ rệt và có ý nghĩa thống kê đến khả năng tái phát bệnh. Cụ thể: - Nam giới có nguy cơ tái phát cao hơn. - Bệnh nhân có đáp ứng “Excellent” hoặc “Indeterminate” sau điều trị có nguy cơ tái phát thấp hơn. - Ngược lại, nếu tổn thương chưa hồi phục hoàn toàn (“Structural Incomplete”), nguy cơ tái phát tăng cao.

Mô hình phù hợp khi phân phối xác suất tái phát không đối xứng hoặc nghiêng về giá trị nhỏ, phù hợp với đặc điểm dịch tễ học của bệnh ung thư tuyến giáp tái phát.

4.9 So sánh và đánh giá các mô hình

# So sánh AIC
aic_values <- data.frame(
  Mô_hình = c("Logit", "Probit", "Cloglog"),
  AIC = c(AIC(model_logit), AIC(model_probit), AIC(model_cloglog))
)
print(aic_values)
##   Mô_hình      AIC
## 1   Logit 119.0711
## 2  Probit 119.3278
## 3 Cloglog 117.3249

Bảng AIC của các mô hình

Mô hình AIC Nhận xét về độ phù hợp
Logit 118.43 Phù hợp tương đối
Probit 118.75 Phù hợp tương tự Logit
Cloglog 116.79 Tốt nhất (AIC thấp nhất trong các mô hình nhị phân)

Lưu ý: Mô hình LPM (Linear Probability Model) là mô hình hồi quy tuyến tính, không thuộc họ phân phối nhị thức nên AIC có thể âm và không trực tiếp so sánh được với các mô hình logit, probit, cloglog.


Kết luận:

  • Trong ba mô hình nhị phân (Logit, Probit, Cloglog):
    • Cloglog có AIC thấp nhất (116.79) → mô hình có độ phù hợp tốt nhất.
    • Logit và Probit có AIC xấp xỉ nhau → mức độ phù hợp tương đương.
  • LPM có AIC âm (−144.34) do tính chất của mô hình tuyến tính, không nên dùng AIC để đánh giá hoặc so sánh với các mô hình nhị phân.
  • Với biến phụ thuộc dạng nhị phân, Cloglog là lựa chọn ưu tiên nếu mục tiêu là phân tích chính xác xác suất tái phát bệnh.

CHƯƠNG 5: KẾT LUẬN, HẠN CHẾ VÀ KIẾN NGHỊ

5.1. Kết luận

  • Nghiên cứu “Phân tích các yếu tố ảnh hưởng đến khả năng tái phát bệnh ung thư tuyến giáp biệt hóa” đã sử dụng dữ liệu thực tế nhằm xác định các yếu tố nguy cơ ảnh hưởng đến khả năng tái phát của bệnh. Thông qua phân tích hồi quy nhị phân với ba mô hình phổ biến là Logit, Probit và Complementary Log-log, kết quả cho thấy có hai yếu tố chính có ảnh hưởng đáng kể đến khả năng tái phát bệnh, bao gồm: đặc tính khối u (focality) và mức độ đáp ứng điều trị (response).

  • Cụ thể, bệnh nhân có khối u đa ổ (multi-focal) có nguy cơ tái phát cao gấp khoảng 2,5 lần so với bệnh nhân có khối u đơn ổ (uni-focal). Đây là yếu tố có ý nghĩa thống kê trong hầu hết các mô hình hồi quy và phù hợp với các nghiên cứu y văn trước đây khi cho rằng tổn thương lan tỏa thường liên quan đến tiên lượng xấu hơn. Đặc biệt, yếu tố “response” thể hiện vai trò tiên lượng rất mạnh, khi nhóm bệnh nhân không đáp ứng hoàn toàn với điều trị có khả năng tái phát cao hơn khoảng 7 lần so với nhóm đáp ứng tốt. Trong khi đó, các biến như giới tính, tiền sử xạ trị và thói quen hút thuốc không cho thấy ảnh hưởng rõ rệt và không đạt mức ý nghĩa thống kê trong mô hình phân tích đa biến.

  • So sánh giữa ba mô hình Logit, Probit và Cloglog cho thấy sự tương đồng rõ rệt về hiệu năng phân loại. Cả ba mô hình đều đạt chỉ số AUC cao (trên 0.98), cho thấy khả năng phân biệt tái phát và không tái phát rất tốt. Tuy nhiên, mô hình hồi quy Logistic chỉ số AIC cũng gần như chênh lệch không quá lớn Cloglog và cũng dễ dàng diễn giải thông qua odds ratio và được sử dụng phổ biến trong lĩnh vực y học nên mô hình Logit là khá phù hợp trong phần tích này. Việc lựa chọn mô hình phù hợp góp phần hỗ trợ tốt hơn cho việc tiên lượng và đưa ra các quyết định lâm sàng trong thực hành điều trị bệnh nhân ung thư tuyến giáp biệt hóa.

5.2. Hạn chế của nghiên cứu

  • Mặc dù nghiên cứu đã cung cấp nhiều phát hiện có giá trị, vẫn tồn tại một số hạn chế.

  • Đầu tiên, một số yếu tố lâm sàng có giá trị tiên lượng tái phát trong thực tiễn như nồng độ thyroglobulin (Tg), thời gian nhân đôi Tg (TgDT), hoặc các đột biến gen như BRAF và RET vẫn chưa được đưa vào mô hình do hạn chế về dữ liệu. Đây là những yếu tố đã được chứng minh có vai trò quan trọng trong tiên lượng ung thư tuyến giáp biệt hóa ở nhiều nghiên cứu trước.

  • Kế tiếp, kích thước mẫu và phạm vi thu thập dữ liệu vẫn còn hạn chế. Dữ liệu chưa mang tính đại diện toàn quốc hoặc đa trung tâm, do đó tính khái quát của kết quả nghiên cứu vẫn còn khiêm tốn. Ngoài ra, nghiên cứu cũng chưa phân tích riêng biệt đối với từng thể mô học của ung thư tuyến giáp biệt hóa như thể nhú, thể nang hoặc thể tế bào Hurthle, trong khi đây là những thể bệnh có đặc điểm tiến triển và tiên lượng khác nhau.

5.3. Kiến nghị

  • Dựa trên những kết quả và hạn chế nêu trên, nghiên cứu đề xuất một số hướng phát triển và ứng dụng thực tiễn. Trước hết, cần tiến hành các nghiên cứu quy mô lớn hơn, có thiết kế tiến cứu và theo dõi dài hạn, nhằm kiểm định độ chính xác và độ ổn định của các mô hình hồi quy trong điều kiện thực tế. Việc thu thập bổ sung các chỉ số sinh học và di truyền như Tg, TgDT, BRAF, RET là cần thiết để tăng cường khả năng dự báo tái phát.

  • Về mặt ứng dụng lâm sàng, nên chú trọng đánh giá và theo dõi chặt chẽ các bệnh nhân có khối u đa ổ hoặc đáp ứng điều trị không hoàn toàn, vì đây là hai nhóm có nguy cơ tái phát cao nhất. Việc thiết lập các phác đồ theo dõi cá nhân hóa dựa trên nguy cơ tái phát là cần thiết để tối ưu hóa hiệu quả điều trị và cải thiện chất lượng sống cho bệnh nhân.

  • Bên cạnh đó, cần tăng cường truyền thông y tế về các triệu chứng tái phát như nổi hạch cổ, khàn tiếng kéo dài, khó thở, sụt cân… để bệnh nhân có thể nhận biết sớm và đến khám kịp thời. Các chương trình giáo dục về lối sống lành mạnh, không hút thuốc, duy trì chế độ dinh dưỡng hợp lý và tinh thần tích cực cũng nên được lồng ghép trong kế hoạch điều trị tổng thể.

LS0tDQp0aXRsZTogIlRJ4buCVSBMVeG6rE4gUFRETERUIg0KYXV0aG9yOiAiVOG6oCBDw5RORyDEkOG6oFQiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgcGRmX2RvY3VtZW50Og0KICAgIGV4dHJhX2RlcGVuZGVuY2llczoNCiAgICAgIHZpZXRuYW06IHV0ZjgNCiAgICB0b2M6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KZ2VvbWV0cnk6DQogICAgICAtIGlubmVyPTNjbQ0KICAgICAgLSBvdXRlcj00Y20NCiAgICAgIC0gdG9wPTNjbQ0KICAgICAgLSBib3R0b209NGNtDQogICAgICAtIGhlYWRzZXA9MjJwdA0KICAgICAgLSBoZWFkaGVpZ2h0PTExcHQNCiAgICAgIC0gZm9vdHNraXA9MzNwdA0KICAgICAgLSBpZ25vcmVoZWFkDQogICAgICAtIGlnbm9yZWZvb3QNCiAgICAgIC0gaGVpZ2h0cm91bmRlZA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgKipQSOG6pk4gMTogQ0hV4bqoTiBC4buKIEThu64gTEnhu4ZVKioNCg0KIyMgKioxLjEgxJDhu4xDIEThu64gTEnhu4ZVKioNCg0KIyMjICoqMS4xLjEgxJDhu41jIGZpbGUgZOG7ryBsaeG7h3UgZ+G7kWMqKg0KDQpgYGB7cn0NCmRhdGEgPC0gcmVhZC5jc3YgKCJDOi9Vc2Vycy9BRE1JTi9EZXNrdG9wL1BUREwgRElOSCBUSU5IL1RoeXJvaWRfRGlmZi5jc3YiLCBoZWFkZXIgPSBUKQ0KYGBgDQoNCi0gKipD4bqldSB0csO6YyBi4buZIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQpzdHIoZGF0YSkNCmBgYA0KDQojIyMgKioxLjEuMiBM4buxYSBjaOG7jW4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBj4bqnbiB0aGnhur90KioNCg0KDQpgYGB7cn0NCiMgQ2jhu41uIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgNCmRsZHQgPC0gYygiQWdlIiwgIkdlbmRlciIsICJTbW9raW5nIiwgIkh4LlNtb2tpbmciLCAiSHguUmFkaW90aHJlYXB5IiwgIlRoeXJvaWQuRnVuY3Rpb24iLCAiRm9jYWxpdHkiLCAiUmVzcG9uc2UiLCAiUmVjdXJyZWQiKQ0KDQojIFThuqFvIGLhu5kgZOG7ryBsaeG7h3UgbeG7m2kgY2jhu4kgY2jhu6lhIMSR4buLbmggdMOtbmgNCmRhdCA8LSBkYXRhWywgZGxkdF0NCmBgYA0KDQotICoqQ+G6pXUgdHLDumMgYuG7mSBk4buvIGxp4buHdSoqDQoNCmBgYHtyfQ0Kc3RyKGRhdCkNCmBgYA0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBzYW5nIGZhY3Rvcg0KZGF0JEFnZSA8LSBhcy5mYWN0b3IoZGF0JEFnZSkNCmRhdCRHZW5kZXIgPC0gYXMuZmFjdG9yKGRhdCRHZW5kZXIpDQpkYXQkU21va2luZyA8LSBhcy5mYWN0b3IoZGF0JFNtb2tpbmcpDQpkYXQkSHguUmFkaW90aHJlYXB5IDwtIGFzLmZhY3RvcihkYXQkSHguU21va2luZykNCmRhdCRIeC5SYWRpb3RocmVhcHkgPC0gYXMuZmFjdG9yKGRhdCRIeC5SYWRpb3RocmVhcHkpDQpkYXQkVGh5cm9pZC5GdW5jdGlvbiA8LSBhcy5mYWN0b3IoZGF0JFRoeXJvaWQuRnVuY3Rpb24pDQpkYXQkRm9jYWxpdHkgPC0gYXMuZmFjdG9yKGRhdCRGb2NhbGl0eSkNCmRhdCRSZXNwb25zZSA8LSBhcy5mYWN0b3IoZGF0JFJlc3BvbnNlKQ0KZGF0JFJlY3VycmVkIDwtIGFzLmZhY3RvcihkYXQkUmVjdXJyZWQpDQpgYGANCg0KDQoNCiMgKipQSOG6pk4gMjogUEjDgk4gVMONQ0ggQ8OBQyBZ4bq+VSBU4buQIOG6ok5IIEjGr+G7nk5HIMSQ4bq+TiBLSOG6oiBOxIJORyBUw4FJIFBIw4FUIELhu4ZOSCBVTkcgVEjGryBUVVnhur5OIEdJw4FQIEJJ4buGVCBIw5NBKioNCg0KIyMgKipDSMavxqBORyAxOiBU4buUTkcgUVVBTiBOR0hJw4pOIEPhu6hVKioNCg0KIyMjICoqMS4xIEdp4bubaSB0aGnhu4d1IGThu7EgbGnhu4d1IOKAnFRoeXJvaWQgRGlzZWFzZSBEYXRh4oCdKioNCg0KLSBUcm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIHTDoWMgZ2nhuqMgc+G7rSBk4bulbmcgYuG7mSBk4buvIGxp4buHdSBi4buHbmggdHV54bq/biBnacOhcCAoVGh5cm9pZCBEaXNlYXNlIERhdGEpIMSRxrDhu6NjIMSRxINuZyB04bqjaSBjw7RuZyBraGFpIHRyw6puIG7hu4FuIHThuqNuZyBLYWdnbGUgYuG7n2kgSmFpbmFydSAoMjAyMykuIEThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAgdOG7qyAzODMgYuG7h25oIG5ow6JuIMSRw6MgxJHGsOG7o2MgxJFp4buBdSB0cuG7iyB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIHRo4buDIGJp4buHdCBow7NhIHThu5F0IChkaWZmZXJlbnRpYXRlZCB0aHlyb2lkIGNhbmNlcikgdsOgIMSRxrDhu6NjIHRoZW8gZMO1aSB0cm9uZyB2w7JuZyDDrXQgbmjhuqV0IDEwIG7Eg20gc2F1IMSRaeG7gXUgdHLhu4suIE3hu6VjIHRpw6p1IGPhu6dhIHZp4buHYyB0aHUgdGjhuq1wIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBsw6AgxJHDoW5oIGdpw6EgY8OhYyB54bq/dSB04buRIGzDom0gc8OgbmcsIGjDoG5oIHZpIHbDoCBzaW5oIGzDvSBo4buNYyBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLLg0KDQotIELhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtIHThu5VuZyBj4buZbmcgMTMgYmnhur9uIG5oxrBuZyB24bubaSBt4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1IG7Dqm4gY2jhu4kgc+G7rSBk4bulbmcgOSBiaeG6v24sIHRyb25nIMSRw7MgYmnhur9uIHBo4bulIHRodeG7mWMgbMOgIGJp4bq/biBuaOG7iyBwaMOibiAiUmVjdXJyZWQiLCBiaeG7g3UgdGjhu4sgdmnhu4djIGLhu4duaCBuaMOibiBjw7MgdMOhaSBwaMOhdCB1bmcgdGjGsCBzYXUgxJFp4buBdSB0cuG7iyBoYXkga2jDtG5nLiBDw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgY8OybiBs4bqhaSDEkcaw4bujYyBjaGlhIHRow6BuaCBiYSBuaMOzbSBjaMOtbmg6IMSR4bq3YyDEkWnhu4NtIG5ow6JuIGto4bqpdSBo4buNYywgeeG6v3UgdOG7kSBow6BuaCB2aSB2w6AgdGnhu4FuIHPhu60gYuG7h25oIGzDvSwgdsOgIMSR4bq3YyDEkWnhu4NtIGto4buRaSB1IHbDoCBwaOG6o24g4bupbmcgxJFp4buBdSB0cuG7iy4gDQoNCi0gQsOqbiBj4bqhbmggxJHDsywgZOG7ryBsaeG7h3UgxJHDoyDEkcaw4bujYyB44butIGzDvSBzxqEgYuG7mSB24bubaSB04bu3IGzhu4cgdGhp4bq/dSBk4buvIGxp4buHdSBraMO0bmcgxJHDoW5nIGvhu4MgdsOgIGtow7RuZyB4deG6pXQgaGnhu4duIGPDoWMgZ2nDoSB0cuG7iyBuZ2/huqFpIGxhaSByw7UgcuG7h3QsIMSR4bqjbSBi4bqjbyDEkeG7mSB0aW4gY+G6rXkgY2hvIHF1w6EgdHLDrG5oIMaw4bubYyBsxrDhu6NuZyBtw7QgaMOsbmguIE5nb8OgaSByYSwgYuG7mSBk4buvIGxp4buHdSBjxaluZyDEkcOjIHThu6tuZyDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBjw6FjIG5naGnDqm4gY+G7qXUgaOG7jWMgdGh14bqtdCBraMOhYyB24bubaSBt4bulYyB0acOqdSB0xrDGoW5nIHThu7EsIGJhbyBn4buTbSBj4bqjIGPDoWMg4bupbmcgZOG7pW5nIHRyb25nIGjhu41jIG3DoXkgbmjhurFtIG7Dom5nIGNhbyDEkeG7mSBjaMOtbmggeMOhYyB0cm9uZyBk4buxIGLDoW8gdMOhaSBwaMOhdCBi4buHbmguDQoNCi0gVMOzbSBs4bqhaSwgduG7m2kgxJHhurdjIHRyxrBuZyBsw6AgbeG7mXQgYuG7mSBk4buvIGxp4buHdSB0aOG7sWMgdOG6vywgxJFhIGJp4bq/biB2w6AgxJHhu4tuaCBoxrDhu5tuZyByw7UgcsOgbmcgduG7gSBt4bq3dCB5IGjhu41jLCBi4buZIGThu68gbGnhu4d1IGLhu4duaCB0dXnhur9uIGdpw6FwIG1hbmcgbOG6oWkgbuG7gW4gdOG6o25nIHBow7kgaOG7o3AgdsOgIGdpw6EgdHLhu4sgY2hvIHZp4buHYyB4w6J5IGThu7FuZyB2w6Aga2nhu4NtIMSR4buLbmggY8OhYyBtw7QgaMOsbmggcGjDom4gdMOtY2ggdGjhu5FuZyBrw6osIHThu6sgxJHDsyBnw7NwIHBo4bqnbiBo4buXIHRy4bujIHZp4buHYyBuaOG6rW4gZGnhu4duIGPDoWMgeeG6v3UgdOG7kSBuZ3V5IGPGoSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIOG7nyBi4buHbmggbmjDom4gdW5nIHRoxrAgdHV54bq/biBnacOhcCBiaeG7h3QgaMOzYSB04buRdC4NCg0KLSBNw7QgdOG6oyBjw6FjIMSR4bq3YyB0csawbmcgY+G7p2EgZOG7ryBsaeG7h3UNCg0KICAtCUFnZTogVHXhu5VpIGPhu6dhIGLhu4duaCBuaMOibiB04bqhaSB0aOG7nWkgxJFp4buDbSDEkWnhu4F1IHRy4buLDQogIC0JR2VuZGVyKEYvTSk6IEdp4bubaSB0w61uaCBj4bunYSBi4buHbmggbmjDom4NCiAgLQlGYW1hbGUgKEYpOiBO4buvDQogIC0JTWFsZSAoTSk6IE5hbQ0KICAtCVNtb2tpbmcoWWVzL05vKTogQuG7h25oIG5ow6JuIGPDsyDEkWFuZyBow7p0IHRodeG7kWMgaGnhu4duIHThuqFpIGtow7RuZw0KICAtCUh4LlNtb2tpbmcoWWVzL05vKTogVGnhu4FuIHPhu60gaMO6dCB0aHXhu5FjDQogIC0JSHguUmFkaW90aHJlYXB5KFllcy9Obyk6IELhu4duaCBuaMOibiBjw7MgdOG7q25nIHjhuqEgdHLhu4sgdHLGsOG7m2MgxJHDsyBraMO0bmc/DQogIC0JVGh5cm9pZC5GdW5jdGlvbihFdXRoeXJvaWQsIEh5cGVydGh5cm9pZCwgSHlwb3RoeXJvaWQpOiBUw6xuaCB0cuG6oW5nIGNo4bupYyBuxINuZyB0dXnhur9uIGdpw6FwDQogIC0JRXV0aHlyb2lkOiBUdXnhur9uIGdpw6FwIGLDrG5oIHRoxrDhu51uZw0KICAtCUh5cGVydGh5cm9pZDogQ8aw4budbmcgZ2nDoXAgKHR1eeG6v24gZ2nDoXAgaG/huqF0IMSR4buZbmcgcXXhuqMgbeG7qWMpDQogIC0JSHlwb3RocnlvaWQ6IFN1eSBnacOhcCAodHV54bq/biBnacOhcCBob+G6oXQgxJHhu5luZyBrw6ltKQ0KICAtCUZvY2FsaXR5KFVuaS1Gb2NhbCwgTXVsdGktRm9jYWwpOiBUw6xuaCB0cuG6oW5nIGto4buRaSB1IMSRxqFuIOG7lSBoYXkgxJFhIOG7lQ0KICAtCVJlc3BvbnNlKEV4Y2VsbGVudCwgSW5kZXRlcm1pbmF0ZSwgSW5jb21wbGV0ZeKApik6IE3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4sNCiAgLQlSZWN1cnJlZChZZXMvTm8pOiBC4buHbmggbmjDom4gY8OzIHTDoWkgcGjDoXQgc2F1IMSRaeG7gXUgdHLhu4sga2jDtG5nPw0KDQojIyMgKioxLjIgQuG7kWkgY+G6o25oIG5naGnDqm4gY+G7qXUqKg0KDQotIFVuZyB0aMawIHR1eeG6v24gZ2nDoXAgbMOgIG3hu5l0IHRyb25nIG5o4buvbmcgbG/huqFpIHVuZyB0aMawIG7hu5lpIHRp4bq/dCBwaOG7lSBiaeG6v24gbmjhuqV0LCB24bubaSB04bu3IGzhu4cgbeG6r2MgYuG7h25oIGdpYSB0xINuZyDEkeG7gXUgxJHhurduIHRyb25nIG5o4buvbmcgdGjhuq1wIG5pw6puIGfhuqduIMSRw6J5IHRyw6puIHRvw6BuIHRo4bq/IGdp4bubaS4gTeG6t2MgZMO5IHRpw6puIGzGsOG7o25nIMSRaeG7gXUgdHLhu4sgYuG7h25oIHRoxrDhu51uZyBraMOhIGto4bqjIHF1YW4sIG3hu5l0IHThu7cgbOG7hyBraMO0bmcgbmjhu48gYuG7h25oIG5ow6JuIHbhuqtuIGPDsyBuZ3V5IGPGoSB0w6FpIHBow6F0IHNhdSDEkWnhu4F1IHRy4buLLCDhuqNuaCBoxrDhu59uZyDEkeG6v24gY2jhuqV0IGzGsOG7o25nIGN14buZYyBz4buRbmcgY8WpbmcgbmjGsCBoaeG7h3UgcXXhuqMgY2jEg20gc8OzYyB5IHThur8uIERvIMSRw7MsIHZp4buHYyBwaMOhdCBoaeG7h24gc+G7m20gY8OhYyB54bq/dSB04buRIG5ndXkgY8ahIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0IGzDoCDEkWnhu4F1IHbDtCBjw7luZyBj4bqnbiB0aGnhur90IMSR4buDIGjhu5cgdHLhu6MgYsOhYyBzxKkgxJHGsGEgcmEgcGjDoWMgxJHhu5MgxJFp4buBdSB0cuG7iyB2w6AgdGhlbyBkw7VpIGLhu4duaCBuaMOibiBoaeG7h3UgcXXhuqMgaMahbi4NCiBUcm9uZyBi4buRaSBj4bqjbmggxJHDsywgZOG7ryBsaeG7h3UgeSB04bq/IMSRYW5nIMSRw7NuZyB2YWkgdHLDsiBuZ8OgeSBjw6BuZyBxdWFuIHRy4buNbmcgdHJvbmcgdmnhu4djIGjhu5cgdHLhu6MgY2jhuqluIMSRb8OhbiwgdGnDqm4gbMaw4bujbmcgdsOgIMSRxrBhIHJhIHF1eeG6v3QgxJHhu4tuaCDEkWnhu4F1IHRy4buLIGzDom0gc8OgbmcuIFbhu5tpIHPhu7EgcGjDoXQgdHJp4buDbiBj4bunYSBjw6FjIGvhu7kgdGh14bqtdCBwaMOibiB0w61jaCBk4buvIGxp4buHdSB2w6AgdGjhu5FuZyBrw6osIHZp4buHYyBraGFpIHRow6FjIGPDoWMgY8ahIHPhu58gZOG7ryBsaeG7h3UgYuG7h25oIMOhbiDEkeG7gyByw7p0IHJhIG5o4buvbmcgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcgbGnDqm4gcXVhbiDEkeG6v24gdMOhaSBwaMOhdCBi4buHbmggbMOgIGhvw6BuIHRvw6BuIGto4bqjIHRoaSB2w6AgdGhp4bq/dCB0aOG7sWMuDQoNCiMjIyAqKjEuMyBN4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1KioNCuKAoglQaMOibiB0w61jaCB0aOG7kW5nIGvDqiBtw7QgdOG6oyDEkeG6t2MgxJFp4buDbSBj4bunYSB04bqtcCBi4buHbmggbmjDom4gdW5nIHRoxrAgdHV54bq/biBnacOhcCBk4buxYSB0csOqbiBjw6FjIHnhur91IHThu5EgbMOibSBzw6BuZyB2w6AgeMOpdCBuZ2hp4buHbSBiYW4gxJHhuqd1Lg0KDQrigKIJS2nhu4NtIMSR4buLbmggbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIChnaeG7m2kgdMOtbmgsIHR14buVaSwgdMOsbmggdHLhuqFuZyBjaOG7qWMgbsSDbmcgdHV54bq/biBnacOhcCwgcGjhuqNuIOG7qW5nIMSRaeG7gXUgdHLhu4ssIGdpYWkgxJFv4bqhbiB1bmcgdGjGsCwgdi52LikgduG7m2kgYmnhur9uIHBo4bulIHRodeG7mWMgbMOgIHTDrG5oIHRy4bqhbmcgdMOhaSBwaMOhdCBi4buHbmggKFJlY3VycmVkKS4NCg0K4oCiCVjDoWMgxJHhu4tuaCBjw6FjIHnhur91IHThu5EgY8OzIOG6o25oIGjGsOG7n25nIHRo4buRbmcga8OqIMSRw6FuZyBr4buDIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0LCB04burIMSRw7MgaOG7lyB0cuG7oyBn4bujaSDDvSBuaMOzbSBi4buHbmggbmjDom4gbmd1eSBjxqEgY2FvLg0KDQrigKIJR+G7o2kgw70gxJHhu4tuaCBoxrDhu5tuZyDhu6luZyBk4bulbmcga+G6v3QgcXXhuqMgdsOgbyBjw7RuZyB0w6FjIHPDoG5nIGzhu41jLCDEkWnhu4F1IHRy4buLIHbDoCB0aGVvIGTDtWkgc2F1IMSRaeG7gXUgdHLhu4suDQoNCiMjIyAqKjEuNCBQaMawxqFuZyBwaMOhcCBuZ2hpw6puIGPhu6l1KioNCg0KLSBC4buZIGThu68gbGnhu4d1IHPhu60gZOG7pW5nIHRyb25nIG5naGnDqm4gY+G7qXUgY8OzIGPhuqV1IHRyw7pjIHBow7kgaOG7o3AgY2hvIGPDoWMgcGjDom4gdMOtY2ggxJHhu4tuaCBsxrDhu6NuZywgxJHhurdjIGJp4buHdCBsw6AgY8OhYyBtw7QgaMOsbmggdGjhu5FuZyBrw6ogbmjhu4sgcGjDom4uIEjhuqd1IGjhur90IGPDoWMgYmnhur9uIHRyb25nIHThuq1wIGThu68gbGnhu4d1IMSR4buBdSDhu58gZOG6oW5nIG5o4buLIHBow6JuIGhv4bq3YyBwaMOibiBsb+G6oWkgduG7m2kgc+G7kSBt4bupYyDEkeG7mSBnaeG7m2kgaOG6oW4sIGNobyBwaMOpcCBk4buFIGTDoG5nIMOhcCBk4bulbmcgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIG5oxrAgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgsIExvZ2lzdGljIFJlZ3Jlc3Npb24sIFByb2JpdCBNb2RlbCB2w6AgQ29tcGxlbWVudGFyeSBMb2ctTG9nIChDbG9nbG9nKSBNb2RlbC4gQ8OhYyBwaMawxqFuZyBwaMOhcCBuw6B5IMSRxrDhu6NjIGzhu7FhIGNo4buNbiBuaOG6sW0gxJHDoW5oIGdpw6EgdsOgIHjDoWMgxJHhu4tuaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgeeG6v3UgdOG7kSBuZ3V5IGPGoSAoYmnhur9uIMSR4buZYyBs4bqtcCkgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIChiaeG6v24gcGjhu6UgdGh14buZYyDigJMgUmVjdXJyZWQpLg0KDQotIELDqm4gY+G6oW5oIMSRw7MsIG5naGnDqm4gY+G7qXUgY8Wpbmcgc+G7rSBk4bulbmcgY8OhYyBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiBtw7QgdOG6oyDEkeG7gyB0w7NtIHThuq90IMSR4bq3YyDEkWnhu4NtIGThu68gbGnhu4d1LCBjxaluZyBuaMawIMOhcCBk4bulbmcga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIChDaGktc3F1YXJlZCB0ZXN0KSBuaOG6sW0gxJHDoW5oIGdpw6EgbeG7kWkgbGnDqm4gaOG7hyDEkeG7mWMgbOG6rXAgZ2nhu69hIGPDoWMgYmnhur9uIHBow6JuIGxv4bqhaSB24bubaSBiaeG6v24gdMOhaSBwaMOhdCBi4buHbmguIFZp4buHYyBr4bq/dCBo4bujcCBnaeG7r2Ega2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogdsOgIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4gZ2nDunAgdMSDbmcgxJHhu5kgdGluIGPhuq15IHbDoCDEkeG7mSBzw6J1IGNobyBjw6FjIGvhur90IGx14bqtbiDEkcawYSByYS4NCg0KLSBQaMawxqFuZyBwaMOhcCBuZ2hpw6puIGPhu6l1IG7DoHkgaG/DoG4gdG/DoG4gcGjDuSBo4bujcCB24bubaSDEkeG7i25oIGjGsOG7m25nIHBow6JuIHTDrWNoIHRyb25nIGzEqW5oIHbhu7FjIHRo4buRbmcga8OqIHkgdOG6vywgxJHhu5NuZyB0aOG7nWkgxJHhuqNtIGLhuqNvIMSR4buZIGNow61uaCB4w6FjIHbDoCB0w61uaCB0aOG7sWMgdGnhu4VuIGtoaSDDoXAgZOG7pW5nIHbDoG8gcGjDom4gdMOtY2ggZOG7ryBsaeG7h3Ugc+G7qWMga2jhu49lIG5nxrDhu51pIGLhu4duaC4NCg0KIyMjICoqMS41IMOdIG5naMSpYSBj4bunYSBiw6BpIG5naGnDqm4gY+G7qXUqKg0KDQotIE5naGnDqm4gY+G7qXUgbsOgeSBtYW5nIGzhuqFpIMO9IG5naMSpYSB0aOG7sWMgdGnhu4VuIHbDoCBo4buNYyB0aHXhuq10IHF1YW4gdHLhu41uZyB0cm9uZyBsxKluaCB24buxYyB5IHThur8sIMSR4bq3YyBiaeG7h3QgbMOgIHRyb25nIGPDtG5nIHTDoWMgdGhlbyBkw7VpIHbDoCDEkWnhu4F1IHRy4buLIGLhu4duaCB1bmcgdGjGsCB0dXnhur9uIGdpw6FwLiBUaMO0bmcgcXVhIHZp4buHYyBwaMOibiB0w61jaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBjw6FjIHnhur91IHThu5EgbMOibSBzw6BuZyB2w6Aga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBi4buHbmggc2F1IMSRaeG7gXUgdHLhu4ssIG5naGnDqm4gY+G7qXUgZ8OzcCBwaOG6p24gY3VuZyBj4bqlcCBjxqEgc+G7nyBk4buvIGxp4buHdSDEkeG7i25oIGzGsOG7o25nIGdpw7pwIGLDoWMgc8SpIHbDoCBuaMOgIG5naGnDqm4gY+G7qXUgxJHGsGEgcmEgY8OhYyBxdXnhur90IMSR4buLbmggbMOibSBzw6BuZyBjaMOtbmggeMOhYyBoxqFuLiBWaeG7h2MgcGjDoXQgaGnhu4duIHPhu5ttIGPDoWMgeeG6v3UgdOG7kSBuZ3V5IGPGoSBjw7MgbGnDqm4gcXVhbiDEkeG6v24ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBraMO0bmcgY2jhu4kgZ2nDunAgY8OhIG5ow6JuIGjDs2EgcGjDoWMgxJHhu5MgxJFp4buBdSB0cuG7iyBjaG8gdOG7q25nIGLhu4duaCBuaMOibiBtw6AgY8OybiBo4buXIHRy4bujIHjDonkgZOG7sW5nIGPDoWMgY2hp4bq/biBsxrDhu6NjIGdpw6FtIHPDoXQgdsOgIGNhbiB0aGnhu4dwIGhp4buHdSBxdeG6oyBzYXUgxJFp4buBdSB0cuG7iy4gxJDhu5NuZyB0aOG7nWksIHbhu4EgbeG6t3QgaOG7jWMgdGh14bqtdCwgbmdoacOqbiBj4bupdSBuw6B5IGto4bqzbmcgxJHhu4tuaCB2YWkgdHLDsiB2w6AgdMOtbmgg4bupbmcgZOG7pW5nIGNhbyBj4bunYSBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4gdHJvbmcgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgeSB04bq/LCDEkcOzbmcgZ8OzcCB2w6BvIGtobyB0w6BuZyBraeG6v24gdGjhu6ljIGxpw6puIG5nw6BuaCBnaeG7r2EgdGjhu5FuZyBrw6osIGtob2EgaOG7jWMgZOG7ryBsaeG7h3UgdsOgIHkgaOG7jWMuDQoNCg0KIyMgKipDSMavxqBORyAyOiBDxqAgU+G7niBMw50gVEhVWeG6vlQqKg0KDQojIyMgKioyLjEuIFThu5VuZyBxdWFuIHbhu4EgVW5nIHRoxrAgdHV54bq/biBnacOhcCBiaeG7h3QgaMOzYSAoRFRDKSoqDQoNCiMjIyMgKioyLjEuMS4gxJDhu4tuaCBuZ2jEqWEqKiANCg0KVW5nIHRoxrAgdHV54bq/biBnacOhcCBiaeG7h3QgaMOzYSAoRGlmZmVyZW50aWF0ZWQgVGh5cm9pZCBDYXJjaW5vbWEg4oCTIERUQykgbMOgIG5ow7NtIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgcGjhu5UgYmnhur9uIG5o4bqldCwgYmFvIGfhu5NtIGhhaSB0aOG7gyBjaMOtbmggbMOgIHVuZyB0aMawIHRo4buDIG5ow7ogKFBhcGlsbGFyeSBUaHlyb2lkIENhcmNpbm9tYSDigJMgUFRDKSB2w6AgdGjhu4MgbmFuZyAoRm9sbGljdWxhciBUaHlyb2lkIENhcmNpbm9tYSDigJMgRlRDKS4gxJDDonkgbMOgIG5o4buvbmcgbG/huqFpIHVuZyB0aMawIGPDsyBuZ3Xhu5NuIGfhu5FjIHThu6sgdOG6vyBiw6BvIG5hbmcgdHV54bq/biBnacOhcCB2w6AgxJHhurdjIHRyxrBuZyBi4bufaSBt4bupYyDEkeG7mSBiaeG7h3QgaMOzYSB04bq/IGLDoG8gY2FvLCBwaOG6o24g4bupbmcgdOG7kXQgduG7m2kgaeG7kXQgcGjDs25nIHjhuqEgdsOgIGPDsyB0acOqbiBsxrDhu6NuZyBz4buRbmcgc8OzdCB04buRdCBoxqFuIGPDoWMgdGjhu4MgdW5nIHRoxrAgdHV54bq/biBnacOhcCBraMO0bmcgYmnhu4d0IGjDs2EuDQoNCiMjIyMgKioyLjEuMi4gxJDhurdjIMSRaeG7g20gZOG7i2NoIHThu4UqKg0KDQpEVEMgY2hp4bq/bSBraG/huqNuZyA5MOKAkzk1JSB04buVbmcgc+G7kSBjYSB1bmcgdGjGsCB0dXnhur9uIGdpw6FwLiBUaGVvIHPhu5EgbGnhu4d1IGPhu6dhIEhp4buHcCBo4buZaSBVbmcgdGjGsCBIb2EgS+G7syAoQW1lcmljYW4gQ2FuY2VyIFNvY2lldHksIDIwMjMpLCB04bu3IGzhu4cgbeG6r2MgbeG7m2kgRFRDIGdpYSB0xINuZyB0cm9uZyBuaOG7r25nIG7Eg20gZ+G6p24gxJHDonksIMSR4bq3YyBiaeG7h3Qg4bufIHBo4bulIG7hu68gdsOgIG5nxrDhu51pIHRy4bq7IHR14buVaS4gTeG6t2MgZMO5IHThu7cgbOG7hyB04butIHZvbmcgdGjhuqVwLCBuaMawbmcgdOG7tyBs4buHIHTDoWkgcGjDoXQgc2F1IMSRaeG7gXUgdHLhu4sgYmFuIMSR4bqndSB24bqrbiDEkcOhbmcga+G7gywgZGFvIMSR4buZbmcgdOG7qyAxMOKAkzMwJSB0w7l5IG3hu6ljIMSR4buZIHjDom0gbOG6pW4gdsOgIHnhur91IHThu5Egbmd1eSBjxqEuDQoNCiMjIyMgKioyLjEuMy4gRGnhu4VuIHRp4bq/biB2w6AgdMOhaSBwaMOhdCoqDQoNCkRUQyB0aMaw4budbmcgdGnhur9uIHRyaeG7g24gY2jhuq1tIHbDoCDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLIHThu5F0LCBjaOG7pyB54bq/dSBi4bqxbmcgcGjhuqt1IHRodeG6rXQgdHV54bq/biBnacOhcCB0b8OgbiBwaOG6p24ga+G6v3QgaOG7o3AgxJFp4buBdSB0cuG7iyBp4buRdCBwaMOzbmcgeOG6oSAoUkFJKSB2w6AgdGhlbyBkw7VpIGLhurFuZyB0aHlyb2dsb2J1bGluIGh1eeG6v3QgdGhhbmguIFR1eSBuaGnDqm4sIG3hu5l0IHThu7cgbOG7hyBi4buHbmggbmjDom4gc+G6vSB0w6FpIHBow6F0IHThuqFpIGNo4buXIGhv4bq3YyBkaSBjxINuIHhhIHNhdSBuaGnhu4F1IG7Eg20sIGzDoG0gdMSDbmcgZ8OhbmggbuG6t25nIHRoZW8gZMO1aSB2w6AgxJFp4buBdSB0cuG7iy4NCg0KIyMjICoqMi4yLiBDw6FjIHnhur91IHThu5Egbmd1eSBjxqEg4bqjbmggaMaw4bufbmcgxJHhur9uIHTDoWkgcGjDoXQgdW5nIHRoxrAgdHV54bq/biBnacOhcCBiaeG7h3QgaMOzYSoqDQoNCi0gKipHaeG7m2kgdMOtbmggKEdlbmRlcikqKg0KDQogIC0gQ8ahIHPhu58gbMO9IHRodXnhur90OiBN4buZdCBz4buRIG5naGnDqm4gY+G7qXUgxJHDoyBjaOG7iSByYSBt4buRaSBsacOqbiBxdWFuIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIG5ndXkgY8ahIHTDoWkgcGjDoXQgRFRDLiBN4bq3YyBkw7kgbuG7ryBnaeG7m2kgY8OzIHThu7cgbOG7hyBt4bqvYyBEVEMgY2FvIGjGoW4sIG5hbSBnaeG7m2kgbOG6oWkgdGjGsOG7nW5nIGPDsyB0acOqbiBsxrDhu6NuZyB44bqldSBoxqFuIHbDoCBuZ3V5IGPGoSB0w6FpIHBow6F0IGNhbyBoxqFuLiBHaeG6o2kgdGjDrWNoIHNpbmggaOG7jWMgY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uIMSR4bq3YyDEkWnhu4NtIG7hu5lpIHRp4bq/dCB04buRIHbDoCBz4buxIGtow6FjIGJp4buHdCB0cm9uZyDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLLg0KDQogIC0gTmdoacOqbiBj4bupdSBsacOqbiBxdWFuOiBN4buZdCBuZ2hpw6puIGPhu6l1IMSRYSB0cnVuZyB0w6JtIHThuqFpIENhbmFkYSB0cm9uZyBraHXDtG4ga2jhu5UgZOG7sSDDoW4gQ0FOTkVDVCAoMjAwMOKAkzIwMTApIMSRw6MgcGjDom4gdMOtY2ggMi41OTUgYuG7h25oIG5ow6JuIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EgKERUQyksIGJhbyBn4buTbSA1MjggbmFtIHbDoCAyLjA2NyBu4buvLiBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHThu7cgbOG7hyB0w6FpIHBow6F0IOG7nyBuYW0gZ2nhu5tpIGzDoCA4LDUlLCBjYW8gaMahbiByw7UgcuG7h3Qgc28gduG7m2kgbuG7ryBnaeG7m2kgY2jhu4kgMiwyJSAocDwwLjAwMSkNCg0KLSAqKkjDunQgdGh14buRYyBsw6EgKFNtb2tpbmcpKioNCg0KICAtIEPGoSBz4bufIGzDvSB0aHV54bq/dDogSMO6dCB0aHXhu5FjIGPDsyB0aOG7gyBsw6BtIHTEg25nIG5ndXkgY8ahIHTDoWkgcGjDoXQgRFRDIHRow7RuZyBxdWEgY8ahIGNo4bq/IOG7qWMgY2jhur8gbWnhu4VuIGThu4tjaCwgdMSDbmcgdmnDqm0gbeG6oW4gdMOtbmgsIGzDoG0gZ2nhuqNtIGhp4buHdSBxdeG6oyDEkWnhu4F1IHRy4buLIGnhu5F0IHBow7NuZyB44bqhIGhv4bq3YyB0xrDGoW5nIHTDoWMgYuG6pXQgbOG7o2kgduG7m2kgaG9ybW9uIHR1eeG6v24gZ2nDoXAuIE5nb8OgaSByYSwgY8OhYyBjaOG6pXQgxJHhu5ljIHRyb25nIGtow7NpIHRodeG7kWMgbmjGsCBuaWNvdGluZSB2w6AgY2FkbWl1bSBjw7MgdGjhu4MgdGjDumMgxJHhuql5IHRp4bq/biB0csOsbmggdW5nIHRoxrAgdGjDtG5nIHF1YSBzdHJlc3Mgb3h5IGjDs2EgdsOgIMSR4buZdCBiaeG6v24gRE5BLg0KDQogIC0gTmdoacOqbiBj4bupdSBsacOqbiBxdWFuOiBOZ2hpw6puIGPhu6l1IGNvaG9ydCBj4bunYSBIw6BuIFF14buRYyAoOTYuODU1IG5nxrDhu51pKTogbmFtIGdp4bubaSBow7p0IHRodeG7kWMgaGnhu4duIHThuqFpIGPDsyBuZ3V5IGPGoSBt4bqvYyB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIHRo4bqlcCBoxqFuIChIUiAwLjU4KSBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgaMO6dCwga+G6v3QgcXXhuqMgduG6q24gY8OybiDDvSBuZ2jEqWEgc2F1IGtoaSDEkWnhu4F1IGNo4buJbmggQk1JIHbDoCBUU0ggDQpQdWJNZWQNCg0KLSAqKlRp4buBbiBz4butIHjhuqEgdHLhu4sgdsO5bmcgxJHhuqd1IGPhu5UgKEh4LlJhZGlvdGhlcmFweSkqKg0KDQogIC0gQ8ahIHPhu58gbMO9IHRodXnhur90OiBQaMahaSBuaGnhu4VtIHbhu5tpIGLhu6ljIHjhuqEgaW9uIGjDs2EsIMSR4bq3YyBiaeG7h3QgdHJvbmcgZ2lhaSDEkW/huqFuIHR14buVaSB0cuG6uywgbMOgIHnhur91IHThu5Egbmd1eSBjxqEgxJHDoyDEkcaw4bujYyB4w6FjIMSR4buLbmggcsO1IHLDoG5nIHRyb25nIHNpbmggdW5nIHRoxrAgdHV54bq/biBnacOhcC4gVGlhIHjhuqEgY8OybiBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGPhuqV1IHRyw7pjIG3DtCBnacOhcCwgbMOgbSB0xINuZyBuZ3V5IGPGoSBow6xuaCB0aMOgbmggY8OhYyDhu5UgdW5nIHRoxrAgdGjhu6kgcGjDoXQgaG/hurdjIHTDoWkgcGjDoXQgdOG6oWkgbcO0IGPDsm4gc8OzdCBs4bqhaSBzYXUgcGjhuqt1IHRodeG6rXQuDQoNCiAgLSBOZ2hpw6puIGPhu6l1IGxpw6puIHF1YW46IE3hu5l0IG5naGnDqm4gY+G7qXUgbmVzdGVkIGNhc2XigJNjb250cm9sIOG7nyDEkOG7qWMgZ2hpIG5o4bqtbiBt4buXaSAxIEd5IGxp4buBdSB0cnVuZyBiw6xuaCDEkeG6v24gdHV54bq/biBnacOhcCBsw6BtIHTEg25nIGtob+G6o25nIDUuMSUgbmd1eSBjxqEgcGjDoXQgdW5nIHRoxrAgdHV54bq/biBnacOhcC4NCg0KLSAqKsSQ4bq3YyDEkWnhu4NtIHThu5VuIHRoxrDGoW5nIChGb2NhbGl0eSkqKg0KDQogIC0gQ8ahIHPhu58gbMO9IHRodXnhur90OiBEVEMgxJHGoW4g4buVICh1bmlmb2NhbCkgdGjGsOG7nW5nIGPDsyB0acOqbiBsxrDhu6NuZyB04buRdCBoxqFuIHNvIHbhu5tpIERUQyDEkWEg4buVIChtdWx0aWZvY2FsKSwgdsOsIHThu5VuIHRoxrDGoW5nIMSRYSDhu5UgdGjGsOG7nW5nIGxpw6puIHF1YW4gxJHhur9uIG3hu6ljIMSR4buZIHjDom0gbOG6pW4gY2FvIGjGoW4sIGto4bqjIG7Eg25nIGRpIGPEg24gaOG6oWNoIGPhu5UgdsOgIGtow7Mga2nhu4NtIHNvw6F0IGLhurFuZyBwaOG6q3UgdGh14bqtdCDEkcahbiB0aHXhuqduLg0KDQogIC0gTmdoacOqbiBj4bupdSBsacOqbiBxdWFuOiBN4buZdCBwaMOibiB0w61jaCB04buVbmcgaOG7o3AgxJHGsOG7o2MgY8O0bmcgYuG7kSB0csOqbiBKQU1BIE90b2xhcnluZ29sb2d5IOKAkyBIZWFkICYgTmVjayBTdXJnZXJ5IG7Eg20gMjAyMSDEkcOjIHThu5VuZyBo4bujcCAyNiBuZ2hpw6puIGPhu6l1IHbhu5tpIDMzLjk3NiBi4buHbmggbmjDom4gdW5nIHRoxrAgdHV54bq/biBnacOhcCB0aOG7gyBuaMO6IChQVEMpLCBjaG8gdGjhuqV5IHThu5VuIHRoxrDGoW5nIMSRYSDhu5UgKG11bHRpZm9jYWxpdHkpIGzDoG0gdMSDbmcgxJHDoW5nIGvhu4Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBzbyB24bubaSB04buVbiB0aMawxqFuZyDEkcahbiDhu5UgKHVuaWZvY2FsKS4NCg0KLSAqKlBo4bqjbiDhu6luZyDEkWnhu4F1IHRy4buLIGJhbiDEkeG6p3UgKFJlc3BvbnNlIHRvIGluaXRpYWwgdGhlcmFweSkqKg0KDQogIC0gQ8ahIHPhu58gbMO9IHRodXnhur90OiDEkMOhbmggZ2nDoSDEkcOhcCDhu6luZyBzYXUgxJFp4buBdSB0cuG7iyDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGhlbyBoxrDhu5tuZyBk4bqrbiBj4bunYSBIaeG7h3AgaOG7mWkgVHV54bq/biBnacOhcCBIb2EgS+G7syAoQVRBKSBn4buTbTogaG/DoG4gdG/DoG4gKEV4Y2VsbGVudCksIGtow7RuZyB4w6FjIMSR4buLbmggKEluZGV0ZXJtaW5hdGUpLCBraMO0bmcgxJHhuqd5IMSR4bunIHbhu4EgY+G6pXUgdHLDumMgKFN0cnVjdHVyYWwgaW5jb21wbGV0ZSkgdsOgIGtow7RuZyDEkeG6p3kgxJHhu6cgduG7gSBzaW5oIGjhu41jIChCaW9jaGVtaWNhbCBpbmNvbXBsZXRlKS4gTmjDs20gY8OzIMSRw6FwIOG7qW5nIEV4Y2VsbGVudCBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBj4buxYyB0aOG6pXAgKGTGsOG7m2kgMSUpLCB0cm9uZyBraGkgbmjDs20gU3RydWN0dXJhbCBpbmNvbXBsZXRlIGPDsyBuZ3V5IGPGoSB0w6FpIHBow6F0IHRyw6puIDMwJS4NCg0KICAtIE5naGnDqm4gY+G7qXUgbGnDqm4gcXVhbjogVHV0dGxlIGV0IGFsLiAoWWFsZSkgxJHhu4EgeHXhuqV0IGjhu4cgdGjhu5FuZyBwaMOibiBsb+G6oWkgxJHDoXAg4bupbmcgxJFp4buBdSB0cuG7iyBiYW4gxJHhuqd1IEV4Y2VsbGVudCBSZXNwb25zZSAoRVIpLCBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlIChCSVIpLCBJbmRldGVybWluYXRlIFJlc3BvbnNlIChJUikgdsOgIFN0cnVjdHVyYWwgSW5jb21wbGV0ZSAoU0lSKSBk4buxYSB0csOqbiB0aHlyb2dsb2J1bGluIHbDoCBow6xuaCDhuqNuaCBzYXUgNuKAkzE4IHRow6FuZy4gTmdoacOqbiBj4bupdSB0csOqbiA1MDEgYuG7h25oIG5ow6JuIERUQyB0aGVvIGTDtWkgfjEwMSB0aMOhbmcgY2hvIHRo4bqleSBuaMOzbSBFUiBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCB2w6AgdOG7rSB2b25nIHLhuqV0IHRo4bqlcCAoOTIuMiUgZHV5IHRyw6wgRVIpLCB0cm9uZyBraGkgbmjDs20gQklSL1NJUiBjw7Mgbmd1eSBjxqEgdGnhur9uIHRyaeG7g24gY2FvICg5MCUg4bufIFNJUikuIOG7niBi4buHbmggbmjDom4gPDQ1IHR14buVaSwgdOG7iSBs4buHIHTDoWkgcGjDoXQgdMSDbmcgcsO1IHThu6sgNC4yJSAoRVIpIGzDqm4gODIuNiUgKFNJUiksIGto4bqzbmcgxJHhu4tuaCDEkcOhcCDhu6luZyBiYW4gxJHhuqd1IGzDoCB54bq/dSB04buRIHRpw6puIGzGsOG7o25nIHF1YW4gdHLhu41uZy4NCg0KIyMgKipDSMavxqBORyAzOiBQSMavxqBORyBQSMOBUCBOR0hJw4pOIEPhu6hVKioNCg0KVHJvbmcgbmdoacOqbiBj4bupdSBuw6B5LCBiaeG6v24gcGjhu6UgdGh14buZYyBsw6AgKipraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhKiosIMSRxrDhu6NjIG3DoyBow7NhIG5o4buLIHBow6JuICgwOiBraMO0bmcgdMOhaSBwaMOhdCwgMTogY8OzIHTDoWkgcGjDoXQpLiBEbyDEkcOzLCBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4gbMOgIGzhu7FhIGNo4buNbiBwaMO5IGjhu6NwIMSR4buDIMSRw6FuaCBnacOhIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGPDoWMgeeG6v3UgdOG7kSBuZ3V5IGPGoSB2w6Aga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBi4buHbmguDQoNCiMjIyAqKjMuMS4gQ8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IGNobyBiaeG6v24gcGjhu6UgdGh14buZYyBuaOG7iyBwaMOibioqDQoNCiMjIyMgKiozLjEuMS4gTcO0IGjDrG5oIEjhu5NpIHF1eSBMb2dpc3RpYyAoTG9naXQgTW9kZWwpKioNCg0KTcO0IGjDrG5oIExvZ2l0IMSRxrDhu6NjIHPhu60gZOG7pW5nIHBo4buVIGJp4bq/biDEkeG7gyBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3hu5l0IGJp4bq/biBwaOG7pSB0aHXhu5ljIG5o4buLIHBow6JuIHbDoCBt4buZdCBob+G6t2Mgbmhp4buBdSBiaeG6v24gxJHhu5ljIGzhuq1wIChsacOqbiB04bulYyBob+G6t2MgxJHhu4tuaCB0w61uaCkuIE3hu6VjIHRpw6p1IGzDoCDGsOG7m2MgbMaw4bujbmcgeMOhYyBzdeG6pXQgeOG6o3kgcmEgc+G7sSBraeG7h24gKOG7nyDEkcOieSBsw6AgdMOhaSBwaMOhdCBi4buHbmgpLg0KDQpYw6FjIHN14bqldCB0w6FpIHBow6F0IGPhu6dhIGPDoSB0aOG7gyB0aOG7qSBcKCBpIFwpIMSRxrDhu6NjIG3DtCBow6xuaCBow7NhIG5oxrAgc2F1Og0KDQpcWw0KUF9pID0gUChZX2kgPSAxIHwgWF9pKSA9IFxmcmFjezF9ezEgKyBlXnstKFxiZXRhXzAgKyBcYmV0YV8xIFhfezFpfSArIFxkb3RzICsgXGJldGFfayBYX3traX0pfX0gPSBcZnJhY3tlXntaX2l9fXsxICsgZV57Wl9pfX0NClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXCggUF9pIFwpOiBYw6FjIHN14bqldCBjw6EgdGjhu4MgXCggaSBcKSBi4buLIHTDoWkgcGjDoXQgYuG7h25oLg0KLSBcKCBYX3sxaX0sIFxkb3RzLCBYX3traX0gXCk6IEdpw6EgdHLhu4sgY+G7p2EgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIGPhu6dhIGPDoSB0aOG7gyBcKCBpIFwpLg0KLSBcKCBcYmV0YV8wLCBcYmV0YV8xLCBcZG90cywgXGJldGFfayBcKTogQ8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5IGPhuqduIMaw4bubYyBsxrDhu6NuZy4NCi0gXCggWl9pID0gXGJldGFfMCArIFxiZXRhXzEgWF97MWl9ICsgXGRvdHMgKyBcYmV0YV9rIFhfe2tpfSBcKQ0KDQrEkOG7gyB0dXnhur9uIHTDrW5oIGjDs2EgbcO0IGjDrG5oLCBuZ8aw4budaSB0YSBz4butIGThu6VuZyAqKmjDoG0gbG9naXQqKjoNCg0KXFsNCkxfaSA9IFxsblxsZWZ0KCBcZnJhY3tQX2l9ezEgLSBQX2l9IFxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBYX3sxaX0gKyBcZG90cyArIFxiZXRhX2sgWF97a2l9DQpcXQ0KDQpU4bu3IHPhu5EgXChcZnJhY3tQX2l9ezEgLSBQX2l9XCkgxJHGsOG7o2MgZ+G7jWkgbMOgICoqdOG7tyBz4buRIGNow6puaCAob2RkcykqKiwgY2hvIGJp4bq/dCBraOG6oyBuxINuZyB44bqjeSByYSBz4buxIGtp4buHbiBzbyB24bubaSBraMO0bmcgeOG6o3kgcmEgc+G7sSBraeG7h24uIE3hu5dpIGjhu4cgc+G7kSBcKCBcYmV0YV9rIFwpIMSRxrDhu6NjIGRp4buFbiBnaeG6o2kgYuG6sW5nICoqdOG7tyBz4buRIGNow6puaCBs4buHY2ggKE9kZHMgUmF0aW8g4oCTIE9SKSoqOg0KDQpcWw0KT1JfayA9IGVee1xiZXRhX2t9DQpcXQ0KDQrDnSBuZ2jEqWE6IEtoaSBiaeG6v24gXCggWF9rIFwpIHTEg25nIG3hu5l0IMSRxqFuIHbhu4sgKHbDoCBjw6FjIGJp4bq/biBraMOhYyBnaeG7ryBuZ3V5w6puKSwgb2RkcyBj4bunYSB2aeG7h2MgdMOhaSBwaMOhdCBi4buHbmggc+G6vSB0aGF5IMSR4buVaSBcKCBlXntcYmV0YV9rfSBcKSBs4bqnbi4NCg0KLS0tDQoNCiMjIyMgKiozLjEuMi4gTcO0IGjDrG5oIFByb2JpdCoqDQoNCk3DtCBow6xuaCBQcm9iaXQgbMOgIG3hu5l0IGzhu7FhIGNo4buNbiB0aGF5IHRo4bq/IGNobyBMb2dpdCwgduG7m2kga2jDoWMgYmnhu4d0IGNow61uaCBu4bqxbSDhu58gaMOgbSBsacOqbiBr4bq/dC4gUHJvYml0IHPhu60gZOG7pW5nICoqaMOgbSBwaMOibiBwaOG7kWkgdMOtY2ggbMWpeSBjaHXhuqluKiogXCggXFBoaShaKSBcKSB0aGF5IHbDrCBow6BtIGxvZ2lzdGljLg0KDQpNw7QgaMOsbmggY8OzIGThuqFuZzoNCg0KXFsNClBfaSA9IFAoWV9pID0gMSB8IFhfaSkgPSBcUGhpKFpfaSkgPSBcaW50X3stXGluZnR5fV57Wl9pfSBcZnJhY3sxfXtcc3FydHsyXHBpfX0gZV57LXReMi8yfSBkdA0KXF0NCg0KVHJvbmcgxJHDszoNCg0KXFsNClpfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIFhfezFpfSArIFxkb3RzICsgXGJldGFfayBYX3traX0NClxdDQoNCk3hurdjIGTDuSBMb2dpdCB2w6AgUHJvYml0IHPhu60gZOG7pW5nIGPDoWMgcGjDom4gcGjhu5FpIGtow6FjIG5oYXUgKGxvZ2lzdGljIHZzIGNodeG6qW4pLCB0cm9uZyB0aOG7sWMgdOG6vyBoYWkgbcO0IGjDrG5oIHRoxrDhu51uZyBjaG8ga+G6v3QgcXXhuqMga2jDoSB0xrDGoW5nIMSR4buTbmcuIFR1eSBuaGnDqm4sIExvZ2l0IMSRxrDhu6NjIMawYSBjaHXhu5luZyBoxqFuIGRvIGto4bqjIG7Eg25nIGRp4buFbiBnaeG6o2kgxJHGoW4gZ2nhuqNuIHRow7RuZyBxdWEgT2RkcyBSYXRpby4NCg0KLS0tDQoNCiMjIyMgKiozLjEuMy4gTcO0IGjDrG5oIENsb2dsb2cqKg0KDQpNw7QgaMOsbmggQ2xvZ2xvZyBsw6AgbeG7mXQgZOG6oW5nIGPhu6dhIGjhu5NpIHF1eSBuaOG7iyBwaMOibiwgdHJvbmcgxJHDsyBow6BtIGxpw6puIGvhur90IGzDoDoNCg0KJCQNClxsb2coLVxsb2coMSAtIHApKSA9IFxldGEgPSBcYmV0YV8wICsgXGJldGFfMSB4XzEgKyBcY2RvdHMgKyBcYmV0YV9rIHhfaw0KJCQNCg0KVOG7qyDEkcOzLCB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiBsw6A6DQoNCiQkDQpwID0gMSAtIFxleHAoLVxleHAoXGV0YSkpDQokJA0KDQrEkOG7gyDGsOG7m2MgbMaw4bujbmcgY8OhYyB0aGFtIHPhu5EgXCggXGJldGEgXCksIG3DtCBow6xuaCBz4butIGThu6VuZyAqKnBoxrDGoW5nIHBow6FwIMaw4bubYyBsxrDhu6NuZyBo4bujcCBsw70gdOG7kWkgxJFhIChNTEUpKiosIHRow7RuZyBxdWEgdmnhu4djIGPhu7FjIMSR4bqhaSBow7NhIGjDoG0gbG9nLWxpa2VsaWhvb2Q6DQoNCiQkDQpcZWxsKFxiZXRhKSA9IFxzdW1fe2k9MX1ee259IFxsZWZ0WyB5X2kgXGxvZygxIC0gXGV4cCgtXGV4cChcZXRhX2kpKSkgKyAoMSAtIHlfaSkoIC1cZXhwKFxldGFfaSkpIFxyaWdodF0NCiQkDQoNClBoxrDGoW5nIHBow6FwIG7DoHkgxJHhurdjIGJp4buHdCBwaMO5IGjhu6NwIGtoaSB4w6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiBraMO0bmcgxJHhu5FpIHjhu6luZyBob+G6t2Mgc+G7sSBraeG7h24gaGnhur9tLiBIw6BtIGxpw6puIGvhur90IGNsb2dsb2cgZ2nDunAgbcO0IGjDrG5oIHBo4bqjbiDDoW5oIHThu5F0IGjGoW4gc+G7sSB0aGF5IMSR4buVaSBuaGFuaCBjaMOzbmcgduG7gSB4w6FjIHN14bqldCBn4bqnbiBuZ8aw4buhbmcgMS4NCg0KLS0tDQoNCiMjIyAqKjMuMi4gS2nhu4NtIMSR4buLbmggc+G7sSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCoqDQoNCsSQ4buDIMSRw6FuaCBnacOhIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIGjhu5NpIHF1eSBuaOG7iyBwaMOibiAobG9naXQsIHByb2JpdCwgY2xvZ2xvZyksIGPDoWMgY2jhu4kgc+G7kSDEkcaw4bujYyBkw7luZyDEkeG7gyDEkcOhbmggZ2nDoSBwaOG7lSBiaeG6v24gbmjGsDoNCg0KIyMjIyAqKjMuMi4xLiBDaOG7iSBz4buRIEFJQyAoQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbikqKg0KDQotICoqQ8O0bmcgdGjhu6ljKio6DQoNCiAgJCQNCiAgQUlDID0gLTIgXGNkb3QgXGxvZyhMKSArIDJrDQogICQkDQogIA0KICBUcm9uZyDEkcOzOg0KICANCiAgLSBcKCBMIFwpIGzDoCBnacOhIHRy4buLIGjDoG0gaOG7o3AgbMO9IHThu5FpIMSRYSAobGlrZWxpaG9vZCksDQogIA0KICAtIFwoIGsgXCkgbMOgIHPhu5EgbMaw4bujbmcgdGhhbSBz4buRIMaw4bubYyBsxrDhu6NuZyB0cm9uZyBtw7QgaMOsbmguDQoNCi0gKirDnSBuZ2jEqWEqKjogQUlDIGzDoCB0aMaw4bubYyDEkW8gY8OibiBi4bqxbmcgZ2nhu69hIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIHbDoCDEkeG7mSBwaOG7qWMgdOG6oXAgY+G7p2EgbsOzLiBNw7QgaMOsbmggY8OzIEFJQyAqKnRo4bqlcCBoxqFuKiogxJHGsOG7o2MgeGVtIGzDoCAqKnBow7kgaOG7o3AgaMahbioqLCB0csOhbmggxJHGsOG7o2MgaGnhu4duIHTGsOG7o25nIG92ZXJmaXR0aW5nLg0KDQojIyMjICoqMy4yLjIuIEjDoG0gbG9nLWxpa2VsaWhvb2QqKg0KDQpEbyBow6BtIExpa2VsaWhvb2QgbMOgIG3hu5l0IHTDrWNoIHBo4bupYyB04bqhcCwgbmfGsOG7nWkgdGEgdGjGsOG7nW5nIHPhu60gZOG7pW5nIGxvZ2FyaXQgY+G7p2EgbsOzIMSR4buDIGThu4UgdMOtbmggdG/DoW46DQoNClxbDQpcbG4gTCA9IFxzdW1fe2k9MX1ee259IFxsZWZ0WyBZX2kgXGxuKFBfaSkgKyAoMSAtIFlfaSkgXGxuKDEgLSBQX2kpIFxyaWdodF0NClxdDQoNClF1w6EgdHLDrG5oIMaw4bubYyBsxrDhu6NuZyBz4bq9IHTDrG0gY8OhYyBnacOhIHRy4buLIFwoIFxoYXR7XGJldGF9XzAsIFxoYXR7XGJldGF9XzEsIFxkb3RzLCBcaGF0e1xiZXRhfV9rIFwpIHNhbyBjaG8gaMOgbSBsb2ctbGlrZWxpaG9vZCDEkeG6oXQgY+G7sWMgxJHhuqFpLiBWaeG7h2MgdOG7kWkgxrB1IGjDs2EgbsOgeSB0aMaw4budbmcgxJHGsOG7o2MgdGjhu7FjIGhp4buHbiBi4bqxbmcgY8OhYyB0aHXhuq10IHRvw6FuIHPhu5EgbmjGsCBOZXd0b24tUmFwaHNvbiwgRmlzaGVyIHNjb3JpbmcsIGhheSBHcmFkaWVudCBhc2NlbnQuDQoNCg0KIyMgKipDSMavxqBORyA0OiBQSMOCTiBUw41DSCBDw4FDIFnhur5VIFThu5Ag4bqiTkggSMav4bueTkcgxJDhur5OIEtI4bqiIE7Egk5HIFTDgUkgUEjDgVQgQuG7hk5IIFVORyBUSMavIFRVWeG6vk4gR0nDgVAqKg0KDQojIyAqKlBIw4JOIFTDjUNIIMSQxqBOIEJJ4bq+TioqDQoNCiMjIyAqKjQuMSBHaeG7m2kgdMOtbmggdMOhYyDEkeG7mW5nIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIGLhu4duaCoqDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KIyMjIyAqKjQuMS4xIELhuqNuZyB04bqnbiBz4buRIC0gdOG6p24gc3XhuqV0IGNobyBiaeG6v24gZ2nhu5tpIHTDrW5oKioNCg0KLSDEkOG6p3UgdGnDqm4sIHTDtGkgc+G6vSBs4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaG8gYmnhur9uIGdp4bubaSB0w61uaCBuaOG6sW0gbeG7pWMgxJHDrWNoIG7huq9tIHLDtSBz4buRIGzGsOG7o25nIGLhu4duaCBuaMOibiB0aGFtIGdpYSBraOG6o28gc8OhdCBzYXUga2hpIMSRaeG7gXUgdHLhu4sgdOG6oWkgYuG7h25oIHZp4buHbi4gS+G6v3QgcXXhuqMgY3VuZyBj4bqlcCBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbhu4EgY8OhY2ggbeG7qWMgbMawxqFuZyDEkcaw4bujYyBwaMOibiBwaOG7kWkgdHJvbmcgZOG7ryBsaeG7h3UuDQpgYGB7cn0NCnRhYl9nZW5kZXIgPC0gdGFibGUoZGF0JEdlbmRlcikNCnRhYl9nZW5kZXINCmBgYA0KDQotIFbhu5tpIGvhur90IHF14bqjIHRyw6puLCBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgYmnhu4N1IMSR4buTIGPhu5l0IMSR4buDIHRo4buDIGhp4buHbiByw7Ugc+G7kSBsxrDhu6NuZyBnaeG7m2kgdMOtbmggY+G7p2EgYuG7h25oIG5ow6JuLiBRdWEgdHLhu7FjIHF1YW4gaMOzYSBiaeG7g3UgxJHhu5MgdGEgY8OzIHRo4buDIGThu4UgZMOgbmcgbmjhuq1uIHjDqXQgY8WpbmcgbmjGsCBzbyBzw6FuaCAyIG5ow7NtIGdp4bubaSB0w61uaCBuYW0gdsOgIG7hu68gduG7m2kgbmhhdS4NCg0KDQpgYGB7cn0NCmJhcnBsb3QodGFiX2dlbmRlciwNCiAgICAgICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBnaeG7m2kgdMOtbmgiLA0KICAgICAgICB4bGFiID0gIkdp4bubaSB0w61uaCIsDQogICAgICAgIHlsYWIgPSAiVOG6p24gc+G7kSIsDQogICAgICAgIGNvbCA9IGMoInNreWJsdWUiLCAic2FsbW9uIiksDQogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsDQogICAgICAgIHlsaW0gPSBjKDAsIG1heCh0YWJfZ2VuZGVyKSArIDUpKSAtPiBicA0KDQp0ZXh0KHggPSBicCwgeSA9IHRhYl9nZW5kZXIgKyAxLCBsYWJlbHMgPSB0YWJfZ2VuZGVyKQ0KYGBgDQoNCi0gVGjDtG5nIHF1YSBi4bqjbmcgdOG6p24gc+G7kSB2w6AgYmnhu4N1IMSR4buTIHRy4buxYyBxdWFuIGjDs2EgY2hvIHRhIHRo4bqleSBy4bqxbmcgYuG7h25oIG5ow6JuIGPDsyBnaeG7m2kgdMOtbmggbuG7ryBnaeG7m2kgbMOgIDMxMiBuZ8aw4budaSwgxJHDonkgbMOgIMSR4buRaSB0xrDhu6NuZyBjaGnhur9tIMSRYSBz4buRIHRyb25nIGLDoGkga2jhuqNvIHPDoXQuIOG7niBuaMOzbSBi4buHbmggbmjDom4gbMOgIG5hbSBnaeG7m2kgduG7m2kgNzEgYuG7h25oIG5ow6JuIGNoaeG6v20gdOG7tyBz4buRIMOtdCBoxqFuIG5ow7NtIMSRw7RpIHTGsOG7o25nIG7hu68gZ2nhu5tpLiBU4buVbmcgc+G7kSBi4buHbmggbmjDom4gdGhhbSBnaWEga2jhuqNvIHPDoXQgY+G7p2EgY+G6oyAyIGdp4bubaSB0w61uaCBsw6AgMzgzIG5nxrDhu51pLg0KDQotIE5nb8OgaSByYSBjaMO6bmcgdGEgc+G6vSB0aOG7sWMgaGnhu4duIHTDrW5oIHThu7cgbOG7hyBwaOG6p24gdHLEg20gY2hvIHThu6tuZyBuaMOzbSB2w6AgduG6vSBiaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIHThu7cgbOG7hyBwaOG6p24gdHLEg20g4bufIGPhuqMgMiBuaMOzbSDEkeG7kWkgdMaw4bujbmcgdGhhbSBnaWEga2jhuqNvIHPDoXQgxJHhu4Mgc28gc8OhbmggdGhlbyBz4buRIGzGsOG7o25nIHTGsMahbmcgxJHhu5FpLg0KDQpgYGB7cn0NCnRhYmxlKGRhdCRHZW5kZXIpL3N1bShucm93KGRhdCkpDQpgYGANCg0KYGBge3J9DQojIFThuqFvIGRhdGFmcmFtZSB04burIGLhuqNuZyB04bqnbiBz4buRDQpnZW5kZXJfZnJlcSA8LSBhcy5kYXRhLmZyYW1lKHRhYl9nZW5kZXIpDQpjb2xuYW1lcyhnZW5kZXJfZnJlcSkgPC0gYygiR2VuZGVyIiwgIkZyZXF1ZW5jeSIpDQoNCiMgVMOtbmggcGjhuqduIHRyxINtDQpnZW5kZXJfZnJlcSRQZXJjZW50YWdlIDwtIGdlbmRlcl9mcmVxJEZyZXF1ZW5jeSAvIHN1bShnZW5kZXJfZnJlcSRGcmVxdWVuY3kpICogMTAwDQoNCiMgVOG6oW8gbmjDo24gY2jhu4kgZ+G7k20gcGjhuqduIHRyxINtDQpnZW5kZXJfZnJlcSRMYWJlbCA8LSBwYXN0ZTAocm91bmQoZ2VuZGVyX2ZyZXEkUGVyY2VudGFnZSwgMSksICIlIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybiB24bubaSBuaMOjbiBjaOG7iSBwaOG6p24gdHLEg20NCmdncGxvdChnZW5kZXJfZnJlcSwgYWVzKHggPSAiIiwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBHZW5kZXIpKSArDQogIGdlb21fY29sKHdpZHRoID0gMSwgY29sb3IgPSAid2hpdGUiKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBMYWJlbCksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gNSkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oIGPhu6dhIGPDoWMgYuG7h25oIG5ow6JuIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhc3RlbDEiKQ0KDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIHBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oIGPhu6dhIGPDoWMgYuG7h25oIG5ow6JuIHNhdSDEkWnhu4F1IHRy4buLIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EgY2hvIHRo4bqleSBz4buxIGNow6puaCBs4buHY2ggcsO1IHLhu4d0IGdp4buvYSBoYWkgbmjDs20gbmFtIHbDoCBu4buvLiBD4bulIHRo4buDLCB04bu3IGzhu4cgbuG7ryBnaeG7m2kgY2hp4bq/bSDEkeG6v24gODEuNSUsIHRyb25nIGtoaSBuYW0gZ2nhu5tpIGNo4buJIGNoaeG6v20gMTguNSUgdOG7lW5nIHPhu5EgYuG7h25oIG5ow6JuIHRoYW0gZ2lhIGto4bqjbyBzw6F0Lg0KDQotIEvhur90IHF14bqjIG7DoHkgcGjDuSBo4bujcCB24bubaSDEkeG6t2MgxJFp4buDbSBk4buLY2ggdOG7hSBo4buNYyDEkcOjIMSRxrDhu6NjIGdoaSBuaOG6rW4gdHJvbmcgbmhp4buBdSBuZ2hpw6puIGPhu6l1IHRyxrDhu5tjIMSRw6J5LCBraGkgbcOgIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EgY8OzIHh1IGjGsOG7m25nIHBo4buVIGJp4bq/biDhu58gbuG7ryBnaeG7m2kgbmhp4buBdSBoxqFuIHNvIHbhu5tpIG5hbSBnaeG7m2ksIHbhu5tpIHThu7cgbOG7hyBt4bqvYyBi4buHbmgg4bufIG7hu68gY8OzIHRo4buDIGNhbyBn4bqlcCAy4oCTNCBs4bqnbi4gTmd1ecOqbiBuaMOibiBj4bunYSBz4buxIGtow6FjIGJp4buHdCBuw6B5IGPDsyB0aOG7gyBsacOqbiBxdWFuIMSR4bq/biB54bq/dSB04buRIG7hu5lpIHRp4bq/dCAoaG9ybW9uZSBlc3Ryb2dlbiksIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIGjDoG5oIHZpIHTDrG0ga2nhur9tIGNoxINtIHPDs2Mgc+G7qWMga2jhu49lLCBjxaluZyBuaMawIHPhu7EgbmjhuqF5IGPhuqNtIHbhu4EgbeG6t3QgZGkgdHJ1eeG7gW4g4bufIG7hu68gZ2nhu5tpLg0KDQotIFThu7cgbOG7hyBu4buvIGdp4bubaSBjYW8gdHJvbmcgbmjDs20gbmdoacOqbiBj4bupdSBjxaluZyDEkeG6t3QgcmEgbmjhu69uZyB5w6p1IGPhuqd1IMSR4bq3YyB0aMO5IHRyb25nIGNoxINtIHPDs2Mgc2F1IMSRaeG7gXUgdHLhu4ssIMSR4bq3YyBiaeG7h3Qg4bufIGPDoWMgZ2lhaSDEkW/huqFuIHTDoWkgcGjDoXQgaG/hurdjIHRoZW8gZMO1aSBkw6BpIGjhuqFuLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB2aeG7h2MgY8OibiBuaOG6r2MgeeG6v3UgdOG7kSBnaeG7m2kgdMOtbmggdHJvbmcgcGjDom4gdMOtY2ggbmd1eSBjxqEgdMOhaSBwaMOhdCB2w6AgeMOieSBk4buxbmcgY2hp4bq/biBsxrDhu6NjIHRoZW8gZMO1aSBi4buHbmggbmjDom4gbMOgIHLhuqV0IGPhuqduIHRoaeG6v3QuDQoNCiMjIyMgKio0LjEuMi4gVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGhhaSBiaeG6v24gZ2nhu5tpIHTDrW5oIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCoqDQoNCiMjIyMjICoqNC4xLjIuMS4gQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoqDQoNCi0gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHkgdGEgbOG6rXAgYuG6o25nIHThuqduIHPhu5EgZ2nhu69hIGhhaSBiaeG6v24gZ2nhu5tpIHTDrW5oIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCBj4bunYSBi4buHbmggbmjDom4gdGhhbSBnaWEga2jhuqNvIHPDoXQgc2F1IMSRaeG7gXUgdHLhu4suIELhuqNuZyB04bqnbiBz4buRIGdpw7pwIGNow7puZyB0YSBoaeG7g3UgcsO1IGjGoW4gc+G7sSBraMOhYyBuaGF1IHRoZW8gMiBuaMOzbSBnaeG7m2kgdMOtbmggduG7gSBraOG6oyBuxINuZyB0w6FpIGLhu4duaC4NCg0KYGBge3J9DQp0YWJsZV90YWliZW5oX2dlbmRlciA8LSB0YWJsZShkYXQkR2VuZGVyLCBkYXQkUmVjdXJyZWQpDQp0YWJsZV90YWliZW5oX2dlbmRlcg0KYGBgDQogIA0KLSBC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCB0w6xuaCB0cuG6oW5nIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLIGNobyB0aOG6pXkgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2EgaGFpIG5ow7NtIGdp4bubaS4gVHJvbmcgc+G7kSAzMTIgYuG7h25oIG5ow6JuIG7hu68sIGPDsyA2NiBuZ8aw4budaSBi4buLIHTDoWkgcGjDoXQsIHRyb25nIGtoaSAyNDYgbmfGsOG7nWkga2jDtG5nIGLhu4sgdMOhaSBwaMOhdC4gTmfGsOG7o2MgbOG6oWksIHRyb25nIHPhu5EgNzEgYuG7h25oIG5ow6JuIG5hbSwgY8OzIDQyIG5nxrDhu51pIGLhu4sgdMOhaSBwaMOhdCB2w6AgY2jhu4kgMjkgbmfGsOG7nWkga2jDtG5nIGLhu4sgdMOhaSBwaMOhdC4NCg0KLSBU4bu3IGzhu4cgdMOhaSBwaMOhdCBjYW8gaMahbiDhu58gbmFtIGdp4bubaSBzbyB24bubaSBu4buvIGdp4bubaSBsw6AgbeG7mXQgcGjDoXQgaGnhu4duIMSRw6FuZyBjaMO6IMO9LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBnaeG7m2kgdMOtbmggY8OzIHRo4buDIGzDoCBt4buZdCB54bq/dSB04buRIG5ndXkgY8ahIHRp4buBbSBuxINuZyBsacOqbiBxdWFuIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCBzYXUgxJFp4buBdSB0cuG7iyB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhLg0KDQotIEvhur90IHF14bqjIG7DoHkgY8WpbmcgcGjDuSBo4bujcCB24bubaSBt4buZdCBz4buRIG5naGnDqm4gY+G7qXUgbMOibSBzw6BuZyB0csaw4bubYyDEkcOieSwgdHJvbmcgxJHDsyBjaOG7iSByYSBy4bqxbmcgbmFtIGdp4bubaSBjw7MgeHUgaMaw4bubbmcgdGnDqm4gbMaw4bujbmcgeOG6pXUgaMahbiBraGkgbeG6r2MgRFRDLiBN4buZdCBwaOG6p24gbmd1ecOqbiBuaMOibiBjw7MgdGjhu4MgeHXhuqV0IHBow6F0IHThu6sgY8OhYyB54bq/dSB04buRIHNpbmggaOG7jWMgKGhvcm1vbmFsKSwgZGkgdHJ1eeG7gW4sIGhv4bq3YyBkbyBraMOhYyBiaeG7h3QgdHJvbmcgxJHDoXAg4bupbmcgxJFp4buBdSB0cuG7iyB2w6AgdHXDom4gdGjhu6cgdGhlbyBkw7VpIHNhdSDEkWnhu4F1IHRy4buLLg0KDQotIFBow6F0IGhp4buHbiBuw6B5IMSR4bq3dCByYSB5w6p1IGPhuqd1IGPhuqduIGtp4buDbSDEkeG7i25oIG3hu5FpIGxpw6puIGjhu4cgdGjhu5FuZyBrw6ogZ2nhu69hIGhhaSBiaeG6v24gbsOgeSBi4bqxbmcgY8OhYyBwaMawxqFuZyBwaMOhcCBuaMawIGtp4buDbSDEkeG7i25oIENoaS1zcXVhcmVkIGhv4bq3YyBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljLCBuaOG6sW0gxJHDoW5oIGdpw6EgeGVtIGdp4bubaSB0w61uaCBjw7Mg4bqjbmggaMaw4bufbmcgxJHhu5ljIGzhuq1wIMSR4bq/biBuZ3V5IGPGoSB0w6FpIHBow6F0IGhheSBraMO0bmcga2hpIGtp4buDbSBzb8OhdCBjw6FjIHnhur91IHThu5Ega2jDoWMuDQogDQojIyMjIyAqKjQuMS4yLjIuIFRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCiMgQuG6o25nIGNow6lvDQp0YWJsZV90YWliZW5oX2dlbmRlciA8LSB0YWJsZShkYXQkUmVjdXJyZWQsIGRhdCRHZW5kZXIpDQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUgxJHhu4MgZMO5bmcgduG7m2kgZ2dwbG90DQpkZl9wbG90IDwtIGFzLmRhdGEuZnJhbWUodGFibGVfdGFpYmVuaF9nZW5kZXIpDQpjb2xuYW1lcyhkZl9wbG90KSA8LSBjKCJSZWN1cnJlZCIsICJHZW5kZXIiLCAiQ291bnQiKQ0KDQojIEJp4buDdSDEkeG7kw0KZ2dwbG90KGRmX3Bsb3QsIGFlcyh4ID0gR2VuZGVyLCB5ID0gQ291bnQsIGZpbGwgPSBSZWN1cnJlZCkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiVMOsbmggdHLhuqFuZyB0w6FpIGLhu4duaCB0aGVvIGdp4bubaSB0w61uaCIsDQogICAgICAgeCA9ICJHaeG7m2kgdMOtbmggKEdlbmRlcikiLA0KICAgICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBi4buHbmggbmjDom4iLA0KICAgICAgIGZpbGwgPSAiVMOhaSBi4buHbmgiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KLSBCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgYuG7h25oIG5ow6JuIHTDoWkgcGjDoXQgdsOgIGtow7RuZyB0w6FpIHBow6F0IHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EgdGhlbyBnaeG7m2kgdMOtbmggY2hvIHRo4bqleSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IGdp4buvYSBoYWkgbmjDs20gbmFtIHbDoCBu4buvLg0KDQotIOG7niBuaMOzbSBu4buvIChGKToNCg0KICAtIFPhu5EgbMaw4bujbmcgYuG7h25oIG5ow6JuIGtow7RuZyB0w6FpIHBow6F0IGNoaeG6v20gdOG7tyBs4buHIMOhcCDEkeG6o28gduG7m2kga2hv4bqjbmcgMjQ2IG5nxrDhu51pLg0KDQogIC0gVHJvbmcga2hpIMSRw7MsIGNo4buJIGPDsyBraG/huqNuZyA2NiBi4buHbmggbmjDom4gbuG7ryB0w6FpIHBow6F0Lg0KDQogIC0gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIGLhu4duaCBuaMOibiBu4buvIHNhdSDEkWnhu4F1IHRy4buLIGPDsyBr4bq/dCBxdeG6oyDhu5VuIMSR4buLbmggdsOgIMOtdCBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCB0cm9uZyBnaWFpIMSRb+G6oW4gdGhlbyBkw7VpLg0KDQotIOG7niBuaMOzbSBuYW0gKE0pOg0KDQogIC0gVHLDoWkgbmfGsOG7o2MgduG7m2kgbmjDs20gbuG7rywgc+G7kSBsxrDhu6NuZyBi4buHbmggbmjDom4gbmFtIHTDoWkgcGjDoXQgKDQyIG5nxrDhu51pKSBjYW8gaMahbiBz4buRIGzGsOG7o25nIG5hbSBraMO0bmcgdMOhaSBwaMOhdCAoMjkgbmfGsOG7nWkpLg0KDQogIC0gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgdOG7tyBs4buHIHTDoWkgcGjDoXQg4bufIG5hbSBnaeG7m2kgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbuG7ryBnaeG7m2ksIGTDuSB04buVbmcgc+G7kSBsxrDhu6NuZyBi4buHbmggbmjDom4gbmFtIHRo4bqlcCBoxqFuLg0KDQotIFThu6sgYmnhu4N1IMSR4buTLCBjw7MgdGjhu4Mgbmjhuq1uIHRo4bqleSBy4bqxbmcgdOG7tyBs4buHIHTDoWkgcGjDoXQg4bufIG5hbSBnaeG7m2kgbMOgIHTGsMahbmcgxJHhu5FpIGNhbyBzbyB24bubaSBjaMOtbmggbmjDs20gbsOgeSwgdHJvbmcga2hpIOG7nyBu4buvIGdp4bubaSwgdMOhaSBwaMOhdCBsw6AgaGnhu4duIHTGsOG7o25nIMOtdCBn4bq3cCBoxqFuLiDEkMOieSBsw6AgbeG7mXQgY2jhu4kgYsOhbyBsw6JtIHPDoG5nIHF1YW4gdHLhu41uZywgY2hvIHRo4bqleSBnaeG7m2kgdMOtbmggY8OzIHRo4buDIGzDoCBt4buZdCB54bq/dSB04buRIG5ndXkgY8ahIHRp4buBbSBuxINuZyBsacOqbiBxdWFuIMSR4bq/biB0acOqbiBsxrDhu6NuZyBi4buHbmgsIMSR4bq3YyBiaeG7h3QgbMOgIHRyb25nIGThu7EgxJFvw6FuIHTDoWkgcGjDoXQuDQoNCi0gS+G6v3QgcXXhuqMgbcO0IHThuqMgbsOgeSBob8OgbiB0b8OgbiBwaMO5IGjhu6NwIHbhu5tpIGLhuqNuZyB04bqnbiBz4buRIGNow6lvIHRyxrDhu5tjIMSRw7MgdsOgIGPhu6duZyBj4buRIGdp4bqjIHRodXnhur90IHLhurFuZyBuYW0gZ2nhu5tpIGPDsyBuZ3V5IGPGoSB0w6FpIHBow6F0IGNhbyBoxqFuIG7hu68gZ2nhu5tpIHNhdSDEkWnhu4F1IHRy4buLIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EuIMSQaeG7gXUgbsOgeSBn4bujaSDDvSBy4bqxbmcgY+G6p24geGVtIHjDqXQga+G7uSB54bq/dSB04buRIGdp4bubaSB0w61uaCBraGkgdGhp4bq/dCBr4bq/IGPDoWMgY2jGsMahbmcgdHLDrG5oIHRoZW8gZMO1aSwgcXXhuqNuIGzDvSBzYXUgxJFp4buBdSB0cuG7iyBob+G6t2MgeMOieSBk4buxbmcgbcO0IGjDrG5oIGThu7EgxJFvw6FuIG5ndXkgY8ahIHTDoWkgcGjDoXQuDQoNCiMjIyMgKio0LjEuMy4gUGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzayBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBraOG6oyBuxINuZyB0w6FpIGLhu4duaCoqDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygiZXBpdG9vbHMiLCByZXBvcyA9ICJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbSIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KYGBgDQoNCi0gVHJvbmcgcGjhuqduIG7DoHksIHTDtGkgc+G6vSB0aOG7sWMgaGnhu4duIHTDrW5oIFJlbGF0aXZlIFJpc2sgbmjhurFtIHBow6JuIHTDrWNoIHPhu7Eg4bqjbmggaMaw4bufbmcgY+G7p2EgMiBuaMOzbSBnaeG7m2kgdMOtbmggbMOqbiBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCBj4bunYSBjw6FjIGLhu4duaCBuaMOibiB0aGFtIGdpYSBraOG6o28gc8OhdC4NCiANCmBgYHtyfQ0Kcmlza3JhdGlvKHRhYmxlX3RhaWJlbmhfZ2VuZGVyKQ0KYGBgDQoNCi0gROG7sWEgdHLDqm4gYuG6o25nIHThuqduIHPhu5EgxJHDoyDEkcaw4bujYyBnaeG6o2kgdGjDrWNoIHLDtSDhu58gcGjhuqduIHRyxrDhu5tjIHTDtGkgc+G6vSB0w61uaCB0b8OhbiBSZWxhdGl2ZSBSaXNrIHRyb25nIMSRw7MgYmnhur9uIMSR4buZYyBs4bqtcCBsw6AgZ2nhu5tpIHTDrW5oIHbDoCBwaOG7pSB0aHXhu5ljIGzDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaC4gTmjDs20gdGhhbSBjaGnhur91IGzDoCBi4buHbmggbmjDom4gY8OzIGdp4bubaSB0w61uaCBuYW0ga2jDtG5nIGLhu4sgdMOhaSBwaMOhdCBi4buHbmguIFbDoCBuaMOzbSDEkeG7kWkgdMaw4bujbmcgY+G6p24gcXVhbiB0w6JtIGzDoCBuYW0gZ2nhu5tpIGLhu4sgdMOhaSBwaMOhdCBi4buHbmggc2F1IMSRaeG7gXUgdHLhu4suDQoNCi0gVHLGsOG7m2MgdGnDqm4gY+G6p24gdMOtbmggdOG7tyBs4buHIG5hbSBnaeG7m2kgYuG7iyB0w6FpIGLhu4duaCBjaGlhIGNobyB04buVbmcgc+G7kSBi4buHbmggbmjDom4g4bufIGPhuqMgMiBnaeG7m2kgdMOtbmggYuG7iyB0w6FpIGLhu4duaCBzYXUgxJFp4buBdSB0cuG7iy4gU2F1IMSRw7MgbOG6pXkgdOG7tyBs4buHIHbhu6thIHTDrG0gxJHGsOG7o2MgY2hpYSBjaG8gdOG7tyBs4buHIG5ow7NtIHRoYW0gY2hp4bq/dSAoIHThu6ljIGzDoCB04bu3IGzhu4cgbmFtIGdp4bubaSBraMO0bmcgYuG7iyB0w6FpIGLhu4duaCBjaGlhIGNobyB04buVbmcgYuG7h25oIG5ow6JuIOG7nyBj4bqjIDIgZ2nhu5tpIGtow7RuZyBi4buLIHTDoWkgbmhp4buFbSBi4buHbmggKQ0KDQotICoqTmjhuq1uIHjDqXQ6KiogS2hpIHBow6JuIHTDrWNoIGLhu4duaCBuaMOibiDhu58gZ2nhu5tpIHTDrW5oIG5hbSBi4buLIHTDoWkgbmhp4buFbSBi4buHbmggdHV54bq/biBnacOhcCBzYXUga2hpIMSRaeG7gXUgdHLhu4sgdGEgdGjhuqV5IFJSID0gMy42OCwga+G6v3QgcXXhuqMgbsOgeSBjaG8gYmnhur90IHLhurFuZyB04bu3IGzhu4cgYuG7h25oIG5ow6JuIGdp4bubaSB0w61uaCBuYW0gYuG7iyB0w6FpIG5oaeG7hW0gYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLIGNhbyBoxqFwIGfhuqVwIDMuNjkgbOG6p24gc28gduG7m2kgbmjDs20gYuG7h25oIG5ow6JuIGzDoCBuYW0gZ2nhu5tpIGtow7RuZyBi4buLIHTDoWkgbmhp4buFbSBi4buHbmggc2F1IMSRaeG7gXUgdHLhu4suIA0KDQogS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyBSUiB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgbMOgIDk1JQ0KDQp8ICAgICAgICBUw6FpIHBow6F0ICAgICAgICB8IG1pZHAuZXhhY3QgICAgICB8IGZpc2hlci5leGFjdCAgICB8IGNoaS5zcXVhcmUgICAgIHwNCnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tOnwNCnwgTm8gICAgICAgICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgIHwNCnwgWWVzICAgICAgICAgICAgICAgICAgICB8IDEuMTM1MDUyZS0wOSAgICB8IDEuMDgwOTA5ZS0wOSAgICB8IDEuMzM4MDA1ZS0xMCAgIHwNCg0KDQotIEvhur90IGx14bqtbg0KDQogIC0gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IG3huqFuaCBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCB0w6xuaCB0cuG6oW5nIHTDoWkgcGjDoXQgdW5nIHRoxrAgdHV54bq/biBnacOhcCBiaeG7h3QgaMOzYS4gQ+G6oyBiYSBwaMawxqFuZyBwaMOhcCBraeG7g20gxJHhu4tuaCDigJQgYmFvIGfhu5NtIE1pZC1wIGV4YWN0IChwID0gMS4xNCDDlyAxMOKBu+KBuSksIEZpc2hlciBleGFjdCAocCA9IDEuMDggw5cgMTDigbvigbkpIHbDoCBDaGktc3F1YXJlIChwID0gMS4zNCDDlyAxMOKBu8K54oGwKSDigJQgxJHhu4F1IGNobyBnacOhIHRy4buLIHAgcuG6pXQgbmjhu48sIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5nxrDhu6FuZyDDvSBuZ2jEqWEgMC4wNS4NCiAgLSDEkGnhu4F1IG7DoHkgY2hvIHBow6lwIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEjigoA6IGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCB0w6FpIHBow6F0KSB2w6Aga2jhurNuZyDEkeG7i25oIHLhurFuZyBnaeG7m2kgdMOtbmggbMOgIG3hu5l0IHnhur91IHThu5EgY8OzIGxpw6puIHF1YW4gdGjhu5FuZyBrw6ogxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EuIEvhur90IHF14bqjIG7DoHkgY+G7p25nIGPhu5EgcXVhbiBzw6F0IHRyxrDhu5tjIMSRw7MgduG7gSB04bu3IGzhu4cgdMOhaSBwaMOhdCBjYW8gaMahbiDEkcOhbmcga+G7gyDhu58gbmjDs20gYuG7h25oIG5ow6JuIG5hbSBzbyB24bubaSBu4buvLg0KDQojIyMjICoqNC4xLjQuIFBow6JuIHTDrWNoIE9kZCBSYXRpbyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBraOG6oyBuxINuZyB0w6FpIGLhu4duaCoqDQoNCmBgYHtyfQ0KIyBUw61uaCBPUg0Kb2Rkc3JhdGlvKHRhYmxlX3RhaWJlbmhfZ2VuZGVyLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQotICoqTmjhuq1uIHjDqXQ6KiogROG7sWEgdHLDqm4ga+G6v3QgcXXhuqMgcGjDom4gdMOtY2gsIGdp4bubaSB0w61uaCBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbhu5tpIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EuIEPhu6UgdGjhu4MsIG5hbSBnaeG7m2kgY8OzIG9kZHMgcmF0aW8gKE9SKSBsw6AgNSwzNiBzbyB24bubaSBu4buvIGdp4bubaSwgY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGPDsyBuZ3V5IGPGoSB0w6FpIHBow6F0IGLhu4duaCBjYW8gaMahbiBraG/huqNuZyA1LDQgbOG6p24gc28gduG7m2kgbuG7ryBnaeG7m2kuIE5ow7NtIG7hu68gxJHGsOG7o2Mgc+G7rSBk4bulbmcgbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UgduG7m2kgT1IgPSAxLiBHacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKHAgPCAwLDAwMSkgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgaGFpIG5ow7NtIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBEbyDEkcOzLCBnaeG7m2kgdMOtbmggbmFtIGPDsyB0aOG7gyDEkcaw4bujYyB4ZW0gbMOgIG3hu5l0IHnhur91IHThu5Egbmd1eSBjxqEgbGnDqm4gcXVhbiDEkeG6v24gdMOhaSBwaMOhdCBi4buHbmggdHV54bq/biBnacOhcCBiaeG7h3QgaMOzYS4NCg0KDQojIyMjICoqNC4xLjUuIFRo4buRbmcga8OqIHN1eSBkaeG7hW4qKg0KDQojIyMjIyAqKjQuMS41LjEuIEtp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCoqDQoNCi0gVHJvbmcgbmdoacOqbiBj4bupdSBuw6B5LCB0w7RpIHRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCBuaOG6sW0gxJHDoW5oIGdpw6EgeGVtIGdp4bubaSB0w61uaCBj4bunYSBi4buHbmggbmjDom4gY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCBzYXUgxJFp4buBdSB0cuG7iyBoYXkga2jDtG5nLiDEkOG7gyBraeG7g20gxJHhu4tuaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIMSR4buLbmggdMOtbmggbsOgeSwgdGEgc+G7rSBk4bulbmcga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nLg0KDQpgYGB7cn0NCiMgQuG6o25nIHThuqduIHPhu5EgZ2nhu69hIEdlbmRlciB2w6AgUmVjdXJyZWQNCmJ0c19nciA8LSB0YWJsZShkYXQkR2VuZGVyLCBkYXQkUmVjdXJyZWQpDQojIEtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZw0KY2hpc3EudGVzdChidHNfZ3IpDQpgYGANCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotIEjigoAgKEdp4bqjIHRodXnhur90IGtow7RuZyk6IEdp4bubaSB0w61uaCB2w6Aga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBzYXUgxJFp4buBdSB0cuG7iyBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgKGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wKS4NCg0KLSBI4oKBIChHaeG6oyB0aHV54bq/dCDEkeG7kWkpOiBHaeG7m2kgdMOtbmggdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgc2F1IMSRaeG7gXUgdHLhu4sgY8OzIG3hu5FpIGxpw6puIGjhu4cgKGhhaSBiaeG6v24gcGjhu6UgdGh14buZYykuDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIFRyb25nIG5naGnDqm4gY+G7qXUgbsOgeSwgbmjhurFtIMSRw6FuaCBnacOhIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCB2w6Aga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhIHNhdSDEkWnhu4F1IHRy4buLLCB0w7RpIMSRw6MgdGnhur9uIGjDoG5oIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IHPhu60gZOG7pW5nIHBoxrDGoW5nIHBow6FwIENoaSBiw6xuaCBwaMawxqFuZy4gR2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIHNvIHbhu5tpIG5nxrDhu6FuZyDDvSBuZ2jEqWEgzrEgPSAwLjA1IGNobyBwaMOpcCBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIChI4oKAKSwgxJHhu5NuZyB0aOG7nWkga2jhurNuZyDEkeG7i25oIHLhurFuZyBjw7Mgc+G7sSBwaOG7pSB0aHXhu5ljIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgdMOsbmggdHLhuqFuZyB0w6FpIHBow6F0IGLhu4duaC4gS+G6v3QgcXXhuqMgbsOgeSBwaMO5IGjhu6NwIHbhu5tpIGPDoWMgcGjDom4gdMOtY2ggdHLGsOG7m2MgxJHDsywgdHJvbmcgxJHDsyBPZGRzIFJhdGlvIChPUikgxrDhu5tjIHTDrW5oIGNobyB0aOG6pXkgbmFtIGdp4bubaSBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBjYW8gZ+G6pXAgNS4zNiBs4bqnbiBzbyB24bubaSBu4buvIGdp4bubaS4gTmjhu69uZyBwaMOhdCBoaeG7h24gbsOgeSBjaG8gdGjhuqV5IGdp4bubaSB0w61uaCBsw6AgbeG7mXQgeeG6v3UgdOG7kSBuZ3V5IGPGoSDEkeG7mWMgbOG6rXAgxJHDoW5nIGzGsHUgw70sIGPDsyB0aOG7gyDEkcOzbmcgdmFpIHRyw7IgdHJvbmcgdmnhu4djIHjDonkgZOG7sW5nIG3DtCBow6xuaCBk4buxIGLDoW8gdsOgIGPDoSB0aOG7gyBow7NhIGNoaeG6v24gbMaw4bujYyB0aGVvIGTDtWkgc2F1IMSRaeG7gXUgdHLhu4suDQoNCg0KIyMjIyMgKio0LjEuNS4yLiBLaeG7g20gxJHhu4tuaCBoaeG7h3UgdOG7tyBs4buHKioNCg0KLSBOaOG6sW0gxJHDoW5oIGdpw6EgeGVtIHThu7cgbOG7hyB0w6FpIHBow6F0IGLhu4duaCB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyBnaeG7r2EgaGFpIG5ow7NtIGdp4bubaSB0w61uaCBoYXkga2jDtG5nLCB0w7RpIMSRw6MgdGnhur9uIGjDoG5oIGtp4buDbSDEkeG7i25oIGhp4buHdSB04bu3IGzhu4cgZ2nhu69hIGhhaSBuaMOzbSDEkeG7mWMgbOG6rXAuDQoNCi0gR+G7jWkgcDEgbMOgIHThu7cgbOG7hyB0w6FpIHBow6F0IGLhu4duaCDhu58gbmFtIGdp4bubaSwgcDIgbMOgIHThu7cgbOG7hyB0w6FpIHBow6F0IGLhu4duaCDhu58gbuG7ryBnaeG7m2kuDQoNCi0gVGEgY8OzIGdp4bqjIHRodXnhur90IMSR4bq3dCByYToNCg0KICAtIEgwOiBwMS1wMj0wIEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgdMOhaSBwaMOhdCBnaeG7r2EgbmFtIHbDoCBu4buvKQ0KICANCiAgLSBIMTogcDEtcDI+MCAoQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIHTDoWkgcGjDoXQgZ2nhu69hIG5hbSB2w6AgbuG7rywgdOG7tyBs4buHIHTDoWkgcGjDoXQg4bufIG5hbSBjYW8gaMahbiBu4buvKQ0KIA0KYGBge3J9DQojIFPhu5EgY2EgdMOhaSBwaMOhdA0Kc3VjY2VzcyA8LSBjKDQyLCA2NikNCg0KIyBU4buVbmcgc+G7kSBi4buHbmggbmjDom4NCm4gPC0gYyg3MSwgMzEyKQ0KDQojIEtp4buDbSDEkeG7i25oIGhp4buHdSB04bu3IGzhu4cgbeG7mXQgcGjDrWE6IHAxIC0gcDIgPiAwDQpwcm9wLnRlc3Qoc3VjY2VzcywgbiwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIGNvcnJlY3QgPSBGQUxTRSkNCmBgYA0KDQotIMSQ4buDIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IHbhu4Egc+G7sSBraMOhYyBiaeG7h3QgdOG7tyBs4buHIHTDoWkgcGjDoXQgZ2nhu69hIGhhaSBnaeG7m2ksIHRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCBoYWkgdOG7tyBs4buHIMSR4buZYyBs4bqtcCB24bubaSBnaeG6oyB0aHV54bq/dCBt4buZdCBwaMOtYTogdOG7tyBs4buHIHTDoWkgcGjDoXQg4bufIG5hbSBnaeG7m2kgY2FvIGjGoW4gbuG7ryBnaeG7m2kuIEvhur90IHF14bqjIGNobyB0aOG6pXkgdOG7tyBs4buHIHTDoWkgcGjDoXQg4bufIG5hbSBnaeG7m2kgbMOgIDU5LDE1JSwgdHJvbmcga2hpIOG7nyBu4buvIGdp4bubaSBsw6AgMjEsMTUlLiBLaeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcgY2hvIGhp4buHdSB04bu3IGzhu4cgbsOgeSB0aHUgxJHGsOG7o2MgZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZCA9IDQxLDI1MiB24bubaSAxIGLhuq1jIHThu7EgZG8gdsOgIHAtdmFsdWUgPSA2LDY5w5cxMOKBu8K5wrkuIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAwLDA1LCBwLXZhbHVlIHLhuqV0IG5o4buPIGNobyBwaMOpcCBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAsIMSR4buTbmcgbmdoxKlhIHbhu5tpIHZp4buHYyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogY2hvIHRo4bqleSB04bu3IGzhu4cgdMOhaSBwaMOhdCDhu58gbmFtIGdp4bubaSBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBu4buvIGdp4bubaS4NCiANCi0gRG8gxJHDsywgY8OzIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgZ2nhu5tpIHTDrW5oIGPDsyBt4buRaSBsacOqbiBo4buHIGNo4bq3dCBjaOG6vSB24bubaSBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCBzYXUgxJFp4buBdSB0cuG7iywgdsOgIG5hbSBnaeG7m2kgbMOgIG5ow7NtIGPDsyBuZ3V5IGPGoSBjYW8gaMahbi4gUGjDoXQgaGnhu4duIG7DoHkgbMOgIGPGoSBz4bufIGfhu6NpIMO9IGPhuqduIGPDsyBjaGnhur9uIGzGsOG7o2MgdGhlbyBkw7VpIHbDoCBjaMSDbSBzw7NjIGjhuq11IMSRaeG7gXUgdHLhu4sgY2jhurd0IGNo4bq9IGjGoW4gxJHhu5FpIHbhu5tpIGLhu4duaCBuaMOibiBuYW0gZ2nhu5tpIG3huq9jIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EuDQoNCiMjIyMgKio0LjEuNi4gTcO0IGjDrG5oIGjhu5NpIHF1eSBjaG8gZOG7ryBsaeG7h3Ugbmjhu4sgcGjDom4qKg0KDQojIyMjIyAqKjQuMS42LjEuIE3DtCBow6xuaCB4w6FjIHN14bqldCB0dXnhur9uIHTDrW5oKioNCg0KLSBTYXUga2hpIHRo4buxYyBoaeG7h24gY8OhYyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiBuaOG6sW0gxJHDoW5oIGdpw6EgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCwga+G6v3QgcXXhuqMgY2hvIHRo4bqleSBnaeG7m2kgdMOtbmggY8OzIOG6o25oIGjGsOG7n25nIHLDtSBy4buHdCDEkeG6v24gbmd1eSBjxqEgdMOhaSBwaMOhdCBzYXUgxJFp4buBdSB0cuG7iy4gVHV5IG5oacOqbiwgxJHhu4MgaGnhu4N1IHLDtSBoxqFuIHbhu4EgbeG7qWMgxJHhu5kg4bqjbmggaMaw4bufbmcgY+G7p2EgdOG7q25nIHnhur91IHThu5EgY8WpbmcgbmjGsCB4w6J5IGThu7FuZyBt4buZdCBtw7QgaMOsbmggZOG7sSDEkW/DoW4ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCwgbmdoacOqbiBj4bupdSB0aeG6v3AgdOG7pWMgdHJp4buDbiBraGFpIHBow6JuIHTDrWNoIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oLg0KDQotIFZp4buHYyBz4butIGThu6VuZyBtw7QgaMOsbmggaOG7k2kgcXV5IGdpw7pwIMSR4buLbmggbMaw4bujbmcgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgYmnhur9uIHBo4bulIHRodeG7mWMgKHTDoWkgcGjDoXQgaGF5IGtow7RuZykgduG7m2kgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIChnaeG7m2kgdMOtbmgsIHR14buVaSwgdGnhu4FuIHPhu60geOG6oSB0cuG7iywgdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMsLi4uKS4gUXVhIMSRw7MsIHRhIGPDsyB0aOG7gyB4w6FjIMSR4buLbmggxJHGsOG7o2MgeeG6v3UgdOG7kSBuw6BvIGzDoCBuZ3V5IGPGoSDEkcOhbmcga+G7gyDEkeG7kWkgduG7m2kgdMOhaSBwaMOhdCwgY8WpbmcgbmjGsCBk4buxIMSRb8OhbiBraOG6oyBuxINuZyB0w6FpIHBow6F0IGPhu6dhIG3hu5l0IGLhu4duaCBuaMOibiBk4buxYSB0csOqbiDEkeG6t2MgxJFp4buDbSBsw6JtIHPDoG5nIGJhbiDEkeG6p3UuDQoNCmBgYHtyfQ0KIyBDaHV54buDbiBiaeG6v24gdMOhaSBwaMOhdCB0aMOgbmggbmjhu4sgcGjDom46IFllcyA9IDEsIE5vID0gMA0KUmVjdXJyZWRfYmluIDwtIGlmZWxzZShkYXQkUmVjdXJyZWQgPT0gIlllcyIsIDEsIDApDQoNCiMgWMOieSBk4buxbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oDQpocXR0X21vZGVsIDwtIGdsbShSZWN1cnJlZF9iaW4gfiBHZW5kZXIsIGRhdGEgPSBkYXQpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQpzdW1tYXJ5KGhxdHRfbW9kZWwpDQpgYGANCg0KIEvhur90IHF14bqjIG3DtCBow6xuaCBjaG8gdGjhuqV5IGjhu4cgc+G7kSBo4buTaSBxdXkgxrDhu5tjIGzGsOG7o25nIGPhu6dhIGJp4bq/biBHZW5kZXJNIGzDoCAwLjM4MDAxIHbhu5tpIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDAxKSwgY2jhu6luZyB04buPIGdp4bubaSB0w61uaCBuYW0gY8OzIOG6o25oIGjGsOG7n25nIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDEkeG6v24geMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmguIEjhu4cgc+G7kSBkxrDGoW5nIG7DoHkgY2hvIHRo4bqleSwgc28gduG7m2kgbuG7ryBnaeG7m2ksIG5hbSBnaeG7m2kgY8OzIHThu7cgbOG7hyB0w6FpIHBow6F0IGNhbyBoxqFuIHRydW5nIGLDrG5oIGtob+G6o25nIDM4JS4NCg0KIE3DtCBow6xuaCBjw7MgxJHhu5kgbOG7h2NoIHBo4bqnbiBkxrAgKHJlc2lkdWFsIGRldmlhbmNlKSBsw6AgNjkuMTkzIHbDoCBBSUMgPSA0MzcuNTQsIHBo4bqjbiDDoW5oIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgdMawxqFuZyDEkeG7kWkgduG7m2kgZOG7ryBsaeG7h3UuIFR1eSBuaGnDqm4sIGRvIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBuaOG7iyBwaMOibiwgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggY8OzIHRo4buDIGtow7RuZyBwaOG6o2kgbMOgIGzhu7FhIGNo4buNbiB04buRaSDGsHUgduG7gSBt4bq3dCBsw70gdGh1eeG6v3Q7IG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgKGxvZ2l0KSB0aMaw4budbmcgxJHGsOG7o2MgxrB1IHRpw6puIGjGoW4gdHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHkuDQoNCiMjIyMjICoqNC4xLjYuMi4gTcO0IGjDrG5oIExvZ2l0KioNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSBMb2dpc3RpYyBsw6AgbcO0IGjDrG5oIGjhu5NpIHF1eSBuaOG7iyBwaMOibiBwaOG7lSBiaeG6v24gbmjhuqV0LiBOw7MgdGh14buZYyBo4buNICoqR0xNKiogduG7m2kgaGFpIMSR4bq3YyDEkWnhu4NtIGNow61uaDoNCg0KMS4gKipUaMOgbmggcGjhuqduIG5n4bqrdSBuaGnDqm4qKjogQmnhur9uIHBo4bqjbiBo4buTaSBcKCBZIFwpIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIEJlcm5vdWxsaSAoaG/hurdjIEJpbm9taWFsKS4gIA0KMi4gKipIw6BtIGxpw6puIGvhur90Kio6IFPhu60gZOG7pW5nIGjDoG0gbGnDqm4ga+G6v3QgKipMb2dpdCoqLCBcKCBnKFxwaSkgPSBcbG9nXGxlZnQoXGZyYWN7XHBpfXsxIC0gXHBpfVxyaWdodCkgXCkuDQoNCk3DtCBow6xuaCBnaeG6oyDEkeG7i25oIHLhurFuZyAqKmxvZ2l0IGPhu6dhIHjDoWMgc3XhuqV0IHRow6BuaCBjw7RuZyoqIFwoIChccGkgPSBQKFkgPSAxIFxtaWQgXG1hdGhiZntYfSkpIFwpIGzDoCBt4buZdCBow6BtIHR1eeG6v24gdMOtbmggY+G7p2EgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wOg0KDQpcWw0KXHRleHR7bG9naXR9KFxwaSkgPSBcbG9nXGxlZnQoXGZyYWN7XHBpfXsxIC0gXHBpfVxyaWdodCkgPSBcYmV0YV8wICsgXGJldGFfMSBYXzEgKyBcY2RvdHMgKyBcYmV0YV9rIFhfaw0KXF0NCg0KSMOgbSBuZ8aw4bujYyBj4bunYSBuw7Mg4oCTICoqaMOgbSBsb2dpc3RpYyoqIOKAkyBjaG8gcGjDqXAgdMOtbmggdG/DoW4geMOhYyBzdeG6pXQ6DQoNClxbDQpccGkgPSBcZnJhY3tcZXhwKFxiZXRhXzAgKyBcY2RvdHMgKyBcYmV0YV9rIFhfayl9ezEgKyBcZXhwKFxiZXRhXzAgKyBcY2RvdHMgKyBcYmV0YV9rIFhfayl9DQpcXQ0KDQpIw6BtIG7DoHkgbHXDtG4gdOG6oW8gcmEgZ2nDoSB0cuG7iyBcKCBccGkgXCkgdHJvbmcga2hv4bqjbmcgKDAsIDEpIHbDoCBjw7MgZOG6oW5nIGjDrG5oIGNo4buvIFMuDQoNCi0gxJDhu4MgxJHDoW5oIGdpw6Eg4bqjbmggaMaw4bufbmcgY+G7p2EgZ2nhu5tpIHTDrW5oIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0IHNhdSDEkWnhu4F1IHRy4buLLCBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIChsb2dpdCkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgduG7m2kgYmnhur9uIHBo4bulIHRodeG7mWMgbMOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgKDA6IEtow7RuZywgMTogQ8OzKSwgdsOgIGJp4bq/biDEkeG7mWMgbOG6rXAgbMOgIGdp4bubaSB0w61uaCAoMDogTuG7rywgMTogTmFtKS4gDQotIE3DtCBow6xuaCDEkcaw4bujYyB4w6J5IGThu7FuZyB0aGVvIGPDtG5nIHRo4bupYzoNCg0KDQpgYGB7cn0NCiMgTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyB24bubaSBiaeG6v24gZ2nhu5tpIHTDrW5oDQptb2RlbF9sb2dpdF9nZW5kZXIgPC0gZ2xtKFJlY3VycmVkX2JpbiB+IEdlbmRlciwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpLCBkYXRhID0gZGF0KQ0KDQojIFhlbSBr4bq/dCBxdeG6ow0Kc3VtbWFyeShtb2RlbF9sb2dpdF9nZW5kZXIpDQoNCmBgYA0KDQpNw7QgaMOsbmggaOG7k2kgcXV5ICoqTG9naXQqKiBsw6AgbeG7mXQgZOG6oW5nIGPhu6dhIGjhu5NpIHF1eSBsb2dpc3RpYywgc+G7rSBk4bulbmcgaMOgbSBsacOqbiBr4bq/dCBsb2dpdDoNCg0KXFsNClx0ZXh0e2xvZ2l0fShccGkpID0gXGxvZ1xsZWZ0KFxmcmFje1xwaX17MSAtIFxwaX1ccmlnaHQpDQpcXQ0KDQpU4burIGvhur90IHF14bqjIG3DtCBow6xuaCwgdGEgdGh1IMSRxrDhu6NjIHBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgbG9naXQ6DQoNClxbDQpcbG9nXGxlZnQoXGZyYWN7XHBpfXsxIC0gXHBpfVxyaWdodCkgPSAtMS4zMTU3ICsgMS42ODYxIFxjZG90IFx0ZXh0e0dlbmRlck19DQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIEJp4bq/biBwaOG7pSB0aHXhu5ljOiBraOG6oyBuxINuZyAqKnTDoWkgcGjDoXQgYuG7h25oIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAqKiAoXCggWSA9IDEgXCk6IGPDsyB0w6FpIHBow6F0LCBcKCBZID0gMCBcKToga2jDtG5nIHTDoWkgcGjDoXQpDQoNCi0gQmnhur9uIMSR4buZYyBs4bqtcDogKipnaeG7m2kgdMOtbmgqKiAoXCggXHRleHR7R2VuZGVyTX0gPSAxIFwpIG7hur91IGzDoCBuYW0sIFwoID0gMCBcKSBu4bq/dSBsw6AgbuG7ryDigJMgbuG7ryBsw6AgbmjDs20gdGhhbSBjaGnhur91KQ0KDQotLS0NCg0KLSAqKkjhu4cgc+G7kSBjaOG6t24qKiBsw6AgXCggLTEuMzE1NyBcKS4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGtoaSAqKmtow7RuZyBjw7MgdMOhYyDEkeG7mW5nIGPhu6dhIGdp4bubaSB0w61uaCBuYW0qKiAodOG7qWMgbMOgIGLhu4duaCBuaMOibiBu4buvKSwgdGjDrCBsb2dpdCBj4bunYSB4w6FjIHN14bqldCB0w6FpIHBow6F0IGLhu4duaCAodOG7qWMgbMOgIFwoIFxsb2dcbGVmdChcZnJhY3tcaGF0e1xwaX19ezEgLSBcaGF0e1xwaX19XHJpZ2h0KSBcKSkgbMOgIFwoIC0xLjMxNTcgXCkuDQoNCi0gKipI4buHIHPhu5EgaOG7k2kgcXV5KiogXCggXGhhdHtcYmV0YX1fMSA9IDEuNjg2MSBcKS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgKipz4buxIGNow6puaCBs4buHY2ggduG7gSBsb2dpdCoqIGPhu6dhIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgYuG7h25oIGdp4buvYSAqKmLhu4duaCBuaMOibiBuYW0gdsOgIG7hu68qKiBsw6AgKiorMS42ODYxKiouICANCiAgTsOzaSBjw6FjaCBraMOhYywgbG9naXQgY+G7p2EgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmgg4bufIGLhu4duaCBuaMOibiAqKm5hbSBjYW8gaMahbiAxLjY4NjEgxJHGoW4gduG7iyoqIHNvIHbhu5tpIG7hu68uDQoNCioqVOG7tyBz4buRIE9kZHMgKE9kZHMgUmF0aW8pKioNCg0KYGBge3J9DQojIFTDrW5oIE9kZHMgUmF0aW8NCmV4cChjb2VmKG1vZGVsX2xvZ2l0X2dlbmRlcikpDQpgYGANCg0KSOG7hyBz4buRIGjhu5NpIHF1eSBcKCBcYmV0YV8xID0gMS42ODYxIFwpIGNobyBwaMOpcCB0w61uaCAqKk9kZHMgUmF0aW8qKjoNCg0KXFsNClx0ZXh0e09SfSA9IGVeezEuNjg2MX0gXGFwcHJveCA1LjQwDQpcXQ0KDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIFBow6JuIHTDrWNoIGjhu5NpIHF1eSBsb2dpc3RpYyDEkcaw4bujYyB0aOG7sWMgaGnhu4duIG5o4bqxbSDEkcOhbmggZ2nDoSDhuqNuaCBoxrDhu59uZyBj4bunYSBnaeG7m2kgdMOtbmggxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2EuIEvhur90IHF14bqjIGNobyB0aOG6pXkgaOG7hyBz4buRIMaw4bubYyBsxrDhu6NuZyBjaG8gYmnhur9uIEdlbmRlck0gbMOgIDEuNjg2MSAocCA8IDAuMDAxKSwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBuYW0gdsOgIG7hu68uIEPhu6UgdGjhu4MsIG5hbSBnaeG7m2kgY8OzIGxvZyBvZGRzIHTDoWkgcGjDoXQgY2FvIGjGoW4gbuG7ryBnaeG7m2kgbeG7mXQgY8OhY2ggxJHDoW5nIGvhu4MuIEtoaSBjaHV54buDbiDEkeG7lWkgc2FuZyBvZGRzIHJhdGlvLCB0YSBjw7MgZXhwKDEuNjg2MSkg4omIIDUuNCwgbmdoxKlhIGzDoCBuYW0gZ2nhu5tpIGPDsyBuZ3V5IGPGoSB0w6FpIHBow6F0IGNhbyBn4bqlcCBraG/huqNuZyA1LDQgbOG6p24gc28gduG7m2kgbuG7ryBnaeG7m2kuIE3DtCBow6xuaCBjw7MgZ2nDoSB0cuG7iyBBSUMgPSA0MjIuMDEsIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCB0xrDGoW5nIMSR4buRaSB04buRdCBjaG8gZOG7ryBsaeG7h3UgxJHGoW4gYmnhur9uLg0KDQotIEvhur90IHF14bqjIG7DoHkga2jhurNuZyDEkeG7i25oIGdp4bubaSB0w61uaCBsw6AgbeG7mXQgeeG6v3UgdOG7kSBuZ3V5IGPGoSDEkeG7mWMgbOG6rXAgxJHDoW5nIGvhu4MgbGnDqm4gcXVhbiDEkeG6v24ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBi4buHbmgsIHBow7kgaOG7o3AgduG7m2kgY8OhYyBraeG7g20gxJHhu4tuaCB0csaw4bubYyDEkcOzLg0KIA0KIyMjIyMgKio0LjEuNi4zLiBNw7QgaMOsbmggUHJvYml0KioNCg0KLSBQaMOibiB0w61jaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQsIHPhu60gZOG7pW5nIG3DtCBow6xuaCBQcm9iaXQsIG5o4bqxbSBzbyBzw6FuaCB24bubaSBtw7QgaMOsbmggTG9naXQgxJHDoyB0aOG7sWMgaGnhu4duIHRyxrDhu5tjIMSRw7MuDQoNCi0gTcO0IGjDrG5oIGjhu5NpIHF1eSAqKlByb2JpdCoqIGzDoCBt4buZdCBk4bqhbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSBuaOG7iyBwaMOibiwgdMawxqFuZyB04buxIG5oxrAgTG9naXN0aWMsIG5oxrBuZyBz4butIGThu6VuZyBow6BtIGxpw6puIGvhur90IGThu7FhIHRyw6puIHBow6JuIHBo4buRaSBjaHXhuqluIHThuq9jIHTDrWNoIGzFqXkgdGhheSB2w6wgaMOgbSBsb2dpdC4NCg0KLSAqKlRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbjoqKg0KQmnhur9uIHBo4bqjbiBo4buTaSBcKCBZIFxpbiBcezAsIDFcfSBcKSB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBCZXJub3VsbGkgKGhv4bq3YyBCaW5vbWlhbCkuDQoNCg0KLSBNw7QgaMOsbmggc+G7rSBk4bulbmcgKipow6BtIGxpw6puIGvhur90IFByb2JpdCoqLCBsw6Agbmdo4buLY2ggxJHhuqNvIGPhu6dhIGjDoG0gcGjDom4gcGjhu5FpIHTDrWNoIGzFqXkgKENERikgY2h14bqpbjoNCg0KXFsNCmcoXHBpKSA9IFxQaGleey0xfShccGkpDQpcXQ0KDQp0cm9uZyDEkcOzIFwoIFxQaGleey0xfSBcKSBsw6AgKipuZ2jhu4tjaCDEkeG6o28qKiBj4bunYSBow6BtIHBow6JuIHBo4buRaSBjaHXhuqluIGNodeG6qW4gaMOzYSAobWVhbiA9IDAsIHN0ZCA9IDEpLg0KDQotICoqROG6oW5nIG3DtCBow6xuaDoqKg0KDQogIC0gTcO0IGjDrG5oIGdp4bqjIMSR4buLbmggcuG6sW5nOg0KDQpcWw0KXFBoaV57LTF9KFxwaSkgPSBcYmV0YV8wICsgXGJldGFfMSBYXzEgKyBcY2RvdHMgKyBcYmV0YV9rIFhfaw0KXF0NCg0KICAtIEhheSB2aeG6v3QgbOG6oWkgdGhlbyB4w6FjIHN14bqldDoNCg0KXFsNClxwaSA9IFxQaGkoXGJldGFfMCArIFxiZXRhXzEgWF8xICsgXGNkb3RzICsgXGJldGFfayBYX2spDQpcXQ0KDQotICoqRGnhu4VuIGdp4bqjaToqKg0KDQotIE3DtCBow6xuaCBQcm9iaXQgZ2nhuqMgxJHhu4tuaCB04buTbiB04bqhaSBt4buZdCAqKmJp4bq/biB0aeG7gW0g4bqpbioqIFwoIFogXHNpbSBcbWF0aGNhbHtOfSgwLCAxKSBcKSwgdsOgIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhu7Ega2nhu4duIFwoIFkgPSAxIFwpIGzDoCB4w6FjIHN14bqldCBtw6AgYmnhur9uIHRp4buBbSDhuqluIHbGsOG7o3QgbmfGsOG7oW5nLg0KLSBWw6wgc+G7rSBk4bulbmcgcGjDom4gcGjhu5FpIGNodeG6qW4sIFByb2JpdCBjw7MgbuG7gW4gdOG6o25nIGzDvSB0aHV54bq/dCBzw6J1IGjGoW4gduG7gSAqKnjDoWMgc3XhuqV0IHRp4buBbSDhuqluKiosIMSR4bq3YyBiaeG7h3QgdHJvbmcgY8OhYyBtw7QgaMOsbmgga2luaCB04bq/IGzGsOG7o25nLg0KDQotICoqU28gc8OhbmggduG7m2kgTG9naXN0aWM6KioNCg0KLSBD4bqjIGhhaSBtw7QgaMOsbmggxJHhu4F1IHBow7kgaOG7o3AgY2hvIGThu68gbGnhu4d1IG5o4buLIHBow6JuLg0KLSBQcm9iaXQgdGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIGtoaSBj4bqnbiBnaeG6oyDEkeG7i25oIHTDrW5oIGNodeG6qW4gY+G7p2Egc2FpIHPhu5EuDQotIFPhu7Ega2jDoWMgYmnhu4d0IGNow61uaCBu4bqxbSDhu58gaMOsbmggZOG6oW5nIGjDoG0gbGnDqm4ga+G6v3Q6IExvZ2lzdGljIGPDsyAqKsSRdcO0aSBkw6B5IGjGoW4qKiAocGjDom4gcGjhu5FpIExvZ2lzdGljIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbiBow7NhIHTGsMahbmcgdOG7sSBjaHXhuqluLCBuaMawbmcgYmnhur9uIHRoacOqbiBs4bubbiBoxqFuKS4NCg0KLSAqKkJp4buDdSBkaeG7hW4gaMOsbmggY2jhu68gUzoqKg0KDQpDxaluZyBuaMawIG3DtCBow6xuaCBsb2dpdCwgbcO0IGjDrG5oIFByb2JpdCB04bqhbyByYSB4w6FjIHN14bqldCBcKCBccGkgXGluICgwLCAxKSBcKSB2w6AgY8OzIMSR4buTIHRo4buLIGThuqFuZyAqKmjDoG0gY2jhu68gUyoqIChzaWdtb2lkKSwgbmjGsG5nIGThu5FjIHbDoCB04buRYyDEkeG7mSBo4buZaSB04bulIGtow6FjIHNvIHbhu5tpIGxvZ2l0Lg0KDQpgYGB7cn0NCiMgTcO0IGjDrG5oIFByb2JpdA0KcHJvYml0X21vZGVsX2dlbmRlciA8LSBnbG0oUmVjdXJyZWRfYmluIH4gR2VuZGVyLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpLCBkYXRhID0gZGF0KQ0KDQojIFhlbSBr4bq/dCBxdeG6oyBtw7QgaMOsbmgNCnN1bW1hcnkocHJvYml0X21vZGVsX2dlbmRlcikNCmBgYA0KDQotIE3DtCBow6xuaCBo4buTaSBxdXkgKipQcm9iaXQqKiBsw6AgbeG7mXQgZOG6oW5nIGPhu6dhIGjhu5NpIHF1eSBuaOG7iyBwaMOibiwgc+G7rSBk4bulbmcgaMOgbSBsacOqbiBr4bq/dCBk4buxYSB0csOqbiBwaMOibiBwaOG7kWkgY2h14bqpbiB04bqvYyB0w61jaCBsxal5Og0KDQpcWw0KZyhccGkpID0gXFBoaV57LTF9KFxwaSkNClxdDQoNCi0gVOG7qyBr4bq/dCBxdeG6oyBtw7QgaMOsbmgsIHRhIHRodSDEkcaw4bujYyBwaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IFByb2JpdDoNCg0KXFsNClxwaSA9IFxQaGkoLTAuODAxMSArIDEuMDMyNiBcY2RvdCBcdGV4dHtHZW5kZXJ9KQ0KXF0NCg0KLSBUcm9uZyDEkcOzOg0KDQogIC0gQmnhur9uIHBo4bulIHRodeG7mWM6IGto4bqjIG7Eg25nICoqdMOhaSBwaMOhdCBi4buHbmggdW5nIHRoxrAgdHV54bq/biBnacOhcCoqIChcKCBZID0gMSBcKTogY8OzIHTDoWkgcGjDoXQsIFwoIFkgPSAwIFwpOiBraMO0bmcgdMOhaSBwaMOhdCkNCiAgLSBCaeG6v24gxJHhu5ljIGzhuq1wOiAqKmdp4bubaSB0w61uaCoqIChcKCBcdGV4dHtHZW5kZXJ9ID0gMSBcKSBu4bq/dSBsw6AgbmFtLCBcKCA9IDAgXCkgbuG6v3UgbMOgIG7hu68g4oCTIG7hu68gbMOgIG5ow7NtIHRoYW0gY2hp4bq/dSkNCg0KDQogLSAqKkjhu4cgc+G7kSBjaOG6t24qKiBsw6AgXCggLTAuODAxMSBcKSwgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oga2hpIGdpw6EgdHLhu4sgcC12YWx1ZSBuaOG7jyBoxqFuIG3hu6ljIMO9IG5naMSpYSA1JS4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGtoaSBraMO0bmcgY8OzIHTDoWMgxJHhu5luZyBj4bunYSBiaeG6v24gZ2nhu5tpIHTDrW5oICh04bupYyBsw6AgYuG7h25oIG5ow6JuIG7hu68pLCB0aMOsICoqeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmgqKiBsw6A6DQoNClxbDQpccGlfe1x0ZXh0e27hu699fSA9IFxQaGkoLTAuODAxMSkgXGFwcHJveCAwLjIxMTUNClxdDQoNCiAtICoqSOG7hyBz4buRIGjhu5NpIHF1eSoqIFwoIFxoYXR7XGJldGF9XzEgPSAxLjAzMjYgXCkgY8OzIMO9IG5naMSpYSBsw6AgdHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCAqKmNow6puaCBs4buHY2ggeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBnaeG7r2EgbmFtIHbDoCBu4buvKiogbMOgOg0KDQpcWw0KXFBoaSgtMC44MDExICsgMS4wMzI2KSAtIFxQaGkoLTAuODAxMSkgPSBcUGhpKDAuMjMxNSkgLSBcUGhpKC0wLjgwMTEpIFxhcHByb3ggMC41OTE3IC0gMC4yMTE1ID0gMC4zODAyDQpcXQ0KDQrih5IgTmFtIGPDsyAqKnjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgY2FvIGjGoW4ga2hv4bqjbmcgMzglKiogc28gduG7m2kgbuG7ry4NCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gxJDhu4MgxJHDoW5oIGdpw6Eg4bqjbmggaMaw4bufbmcgY+G7p2EgZ2nhu5tpIHTDrW5oIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhLCBtw7QgaMOsbmggaOG7k2kgcXV5IFByb2JpdCDEkcOjIMSRxrDhu6NjIMOhcCBk4bulbmcuIEvhur90IHF14bqjIGNobyB0aOG6pXkgaOG7hyBz4buRIMaw4bubYyBsxrDhu6NuZyBj4bunYSBiaeG6v24gZ2nhu5tpIHTDrW5oIChHZW5kZXJNKSBsw6AgMS4wMzI2LCB24bubaSBnacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKHAgPCAwLjAwMSksIGNo4bupbmcgdOG7jyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogY2FvIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQuDQoNCi0gQ+G7pSB0aOG7gywgaOG7hyBz4buRIGTGsMahbmcgY+G7p2EgYmnhur9uIEdlbmRlck0gY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGPDsyB4w6FjIHN14bqldCB0w6FpIHBow6F0IGNhbyBoxqFuIG7hu68gZ2nhu5tpLiDEkGnhu4F1IG7DoHkgcGjDuSBo4bujcCB24bubaSBjw6FjIG3DtCBow6xuaCBwaMOibiB0w61jaCB0csaw4bubYyDEkcOzIChuaMawIGjhu5NpIHF1eSBsb2dpc3RpYyB2w6Aga2nhu4NtIMSR4buLbmggdOG7tyBs4buHKSwgZ8OzcCBwaOG6p24gY+G7p25nIGPhu5EgxJHhu5kgdGluIGPhuq15IGPhu6dhIGvhur90IGx14bqtbiBy4bqxbmcgZ2nhu5tpIHTDrW5oIGzDoCBt4buZdCB54bq/dSB04buRIG5ndXkgY8ahIHRp4buBbSBuxINuZyDEkeG7kWkgduG7m2kgdMOhaSBwaMOhdCBi4buHbmguDQoNCiMjIyMgKioyLjEuNy4gxJDDoW5oIGdpw6EgbcO0IGjDrG5oKioNCg0KKipC4bqjbmcgdOG7lW5nIGjhu6NwIGvhur90IHF14bqjIGJhIG3DtCBow6xuaCBo4buTaSBxdXkqKg0KDQp8IE3DtCBow6xuaCAgIHwgSOG7hyBz4buRIGNo4bq3biBcKCBcaGF0e1xiZXRhfV8wIFwpIHwgSOG7hyBz4buRIEdlbmRlck0gXCggXGhhdHtcYmV0YX1fMSBcKSB8IEdpw6EgdHLhu4sgcCAoR2VuZGVyTSkgfCBBSUMgICAgfCBEaeG7hW4gZ2nhuqNpIMSRw6FuZyBjaMO6IMO9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBHTE0gICAgICAgfCAwLjIxMTU0ICAgICAgICAgICAgICAgICAgICAgICB8IDAuMzgwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDwgMC4wMDEgICAgICAgICAgICAgIHwgNDM3LjU0IHwgR2VuZGVyTSBsw6BtIHTEg25nIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQga2hv4bqjbmcgMzglICAgIHwNCnwgTG9naXQgICAgIHwgLTEuMzE1NyAgICAgICAgICAgICAgICAgICAgICAgfCAxLjY4NjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA8IDAuMDAxICAgICAgICAgICAgICB8IDQyMi4wMSB8IE9SID0gXCggZV57MS42ODYxfSBcYXBwcm94IDUuNDAgXCkgICAgICAgICAgICAgICB8DQp8IFByb2JpdCAgICB8IC0wLjgwMTA5ICAgICAgICAgICAgICAgICAgICAgIHwgMS4wMzI2MyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPCAwLjAwMSAgICAgICAgICAgICAgfCA0MjIuMDEgfCBcKCBcUGhpKDAuMjMxNSkgLSBcUGhpKC0wLjgwMTEpIFxhcHByb3ggMzhcJSBcKSAgfA0KDQoNCi0gQ+G6oyBiYSBtw7QgaMOsbmggxJHhu4F1IGNobyB0aOG6pXkgZ2nhu5tpIHTDrW5oIG5hbSAoR2VuZGVyTSkgY8OzIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIHbhu5tpIMSR4buZIHRpbiBj4bqteSB0aOG7kW5nIGvDqiBjYW8uIFR1eSBuaGnDqm4sIHjDqXQgdGhlbyBjaOG7iSBz4buRIEFJQyDigJMgdGnDqnUgY2jDrSBjaOG7jW4gbcO0IGjDrG5oIHBow7kgaOG7o3Ag4oCTIExvZ2l0IHbDoCBQcm9iaXQgxJHhu4F1IHbGsOG7o3QgdHLhu5lpIGjGoW4gbcO0IGjDrG5oIEdMTSwgY2hvIHRo4bqleSBraOG6oyBuxINuZyBtw7QgcGjhu49uZyB04buRdCBoxqFuIGNobyBiaeG6v24gcGjhu6UgdGh14buZYyBuaOG7iyBwaMOibi4NCg0KLSBUcm9uZyBoYWkgbcO0IGjDrG5oIHBoaSB0dXnhur9uLCBMb2dpdCDEkcaw4bujYyDGsHUgdGnDqm4gaMahbiB0cm9uZyB0aOG7sWMgdGnhu4VuIG5o4budIGto4bqjIG7Eg25nIGRp4buFbiBnaeG6o2kgaOG7hyBz4buRIHRy4buxYyB0aeG6v3AgYuG6sW5nIHThu7cgc+G7kSBvZGRzIChvZGRzIHJhdGlvKSDigJMgY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGPDsyBuZ3V5IGPGoSB0w6FpIHBow6F0IGNhbyBoxqFuIG7hu68ga2hv4bqjbmcgNS40IGzhuqduLiBUcm9uZyBraGkgxJHDsywgUHJvYml0IGTDuSB0xrDGoW5nIMSRxrDGoW5nIHbhu4EgQUlDLCBuaMawbmcgecOqdSBj4bqndSBuZ8aw4budaSBkw7luZyBjw7MgaGnhu4N1IGJp4bq/dCBzw6J1IGjGoW4gduG7gSBwaMOibiBwaOG7kWkgY2h14bqpbiB0w61jaCBsxal5IMSR4buDIGRp4buFbiBnaeG6o2kga+G6v3QgcXXhuqMuDQoNCiBWw6wgduG6rXksIG3DtCBow6xuaCBMb2dpdCDEkcaw4bujYyBraHV54bq/biBuZ2jhu4sgbOG7sWEgY2jhu41uIHRyb25nIHRyxrDhu51uZyBo4bujcCBuZ2hpw6puIGPhu6l1IG7DoHkuDQogDQogDQojIyMgKio0LjIgSMO6dCB0aHXhu5FjIHTDoWMgxJHhu5luZyDEkeG6v24ga2jhuqMgbsSDbmcgdMOhaSBi4buHbmgqKg0KDQpUcm9uZyBwaOG6p24gbsOgeSwgY2jDum5nIHRhIHPhur0gcGjDom4gdMOtY2ggbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMgY+G7p2EgYuG7h25oIG5ow6JuIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2Egc2F1IMSRaeG7gXUgdHLhu4suIEJp4bq/biDEkeG7mWMgbOG6rXAgbMOgIFNtb2tpbmcgKGPDsyBob+G6t2Mga2jDtG5nIGjDunQgdGh14buRYykgdsOgIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBSZWN1cnJlZCAoY8OzIGhv4bq3YyBraMO0bmcgdMOhaSBwaMOhdCkuDQoNCiMjIyMgKio0LjIuMSBC4bqjbmcgdOG6p24gc+G7kSAtIHThuqduIHN14bqldCBjaG8gYmnhur9uIEjDunQgdGh14buRYyAoU21va2luZykqKg0KDQpgYGB7cn0NCnRhYl9zbW9raW5nIDwtIHRhYmxlKGRhdCRTbW9raW5nKQ0KdGFiX3Ntb2tpbmcNCmBgYA0KDQotIEvhur90IHF14bqjIHRyw6puIHPhur0gxJHGsOG7o2MgdHLhu7FjIHF1YW4gaMOzYSBi4bqxbmcgYmnhu4N1IMSR4buTIGPhu5l0IMSR4buDIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcgZ2nhu69hIGhhaSBuaMOzbS4NCg0KYGBge3J9DQpiYXJwbG90KHRhYl9zbW9raW5nLA0KICAgICAgICBtYWluID0gIkJp4buDdSDEkeG7kyB04bqnbiBz4buRIHTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIiwNCiAgICAgICAgeGxhYiA9ICJUw6xuaCB0cuG6oW5nIGjDunQgdGh14buRYyIsDQogICAgICAgIHlsYWIgPSAiVOG6p24gc+G7kSIsDQogICAgICAgIGNvbCA9IGMoImxpZ2h0Y3lhbiIsICJsaWdodGNvcmFsIiksDQogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsDQogICAgICAgIHlsaW0gPSBjKDAsIG1heCh0YWJfc21va2luZykgKyA0MCkpIC0+IGJwX3Ntb2tpbmcNCg0KdGV4dCh4ID0gYnBfc21va2luZywgeSA9IHRhYl9zbW9raW5nICsgMTUsIGxhYmVscyA9IHRhYl9zbW9raW5nKQ0KYGBgDQoNCi0gVGjDtG5nIHF1YSBi4bqjbmcgdOG6p24gc+G7kSB2w6AgYmnhu4N1IMSR4buTLCB0YSB0aOG6pXkgcuG6sW5nIHRyb25nIHThu5VuZyBz4buRIDM4MyBi4buHbmggbmjDom4sIGPDsyAzMjMgbmfGsOG7nWkga2jDtG5nIGjDunQgdGh14buRYyAoTm8pLCBjaGnhur9tIMSRYSBz4buRLiBUcm9uZyBraGkgxJHDsywgc+G7kSBi4buHbmggbmjDom4gY8OzIGjDunQgdGh14buRYyAoWWVzKSBsw6AgNjAgbmfGsOG7nWkuDQpUaeG6v3AgdGhlbywgY2jDum5nIHRhIHPhur0gdMOtbmggdOG7tyBs4buHIHBo4bqnbiB0csSDbSB2w6AgduG6vSBiaeG7g3UgxJHhu5MgdHLDsm4gxJHhu4MgdGjhu4MgaGnhu4duIHLDtSBoxqFuIHPhu7EgY2jDqm5oIGzhu4djaCB24buBIG3hurd0IHTGsMahbmcgxJHhu5FpIGdp4buvYSBoYWkgbmjDs20uDQoNCmBgYHtyfQ0KIyBU4bqhbyBkYXRhZnJhbWUgdOG7qyBi4bqjbmcgdOG6p24gc+G7kQ0Kc21va2luZ19mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFiX3Ntb2tpbmcpDQpjb2xuYW1lcyhzbW9raW5nX2ZyZXEpIDwtIGMoIlNtb2tpbmciLCAiRnJlcXVlbmN5IikNCg0KIyBUw61uaCBwaOG6p24gdHLEg20NCnNtb2tpbmdfZnJlcSRQZXJjZW50YWdlIDwtIHNtb2tpbmdfZnJlcSRGcmVxdWVuY3kgLyBzdW0oc21va2luZ19mcmVxJEZyZXF1ZW5jeSkgKiAxMDANCg0KIyBU4bqhbyBuaMOjbg0Kc21va2luZ19mcmVxJExhYmVsIDwtIHBhc3RlMChyb3VuZChzbW9raW5nX2ZyZXEkUGVyY2VudGFnZSwgMSksICIlIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KZ2dwbG90KHNtb2tpbmdfZnJlcSwgYWVzKHggPSAiIiwgeSA9IFBlcmNlbnRhZ2UsIGZpbGwgPSBTbW9raW5nKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDEsIGNvbG9yID0gIndoaXRlIikgKw0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKw0KICB0aGVtZV92b2lkKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gTGFiZWwpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZSA9IDUpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIHTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIGPhu6dhIGPDoWMgYuG7h25oIG5ow6JuIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJObyIgPSAibGlnaHRjeWFuIiwgIlllcyIgPSAibGlnaHRjb3JhbCIpKQ0KYGBgDQoNCg0KLSBCaeG7g3UgxJHhu5MgdHLDsm4gY2hvIHRo4bqleSBt4buZdCBjw6FjaCB0cuG7sWMgcXVhbiBy4bqxbmcgbmjDs20gYuG7h25oIG5ow6JuIGtow7RuZyBow7p0IHRodeG7kWMgY2hp4bq/bSDEkeG6v24gODQuMyUgdHJvbmcgbeG6q3UgbmdoacOqbiBj4bupdSwgdHJvbmcga2hpIG5ow7NtIGjDunQgdGh14buRYyBjaOG7iSBjaGnhur9tIDE1LjclLiBT4buxIGNow6puaCBs4buHY2ggbOG7m24gbsOgeSBjaG8gdGjhuqV5IHRow7NpIHF1ZW4gaMO6dCB0aHXhu5FjIGtow7RuZyBwaOG6o2kgbMOgIG3hu5l0IMSR4bq3YyDEkWnhu4NtIHBo4buVIGJp4bq/biB0cm9uZyBuaMOzbSBi4buHbmggbmjDom4gxJHGsOG7o2Mga2jhuqNvIHPDoXQuIFR1eSBuaGnDqm4sIMSRaeG7gXUgcXVhbiB0cuG7jW5nIGzDoCBwaOG6o2kgcGjDom4gdMOtY2ggeGVtIGxp4buHdSBuaMOzbSB0aGnhu4N1IHPhu5EgbsOgeSBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBjYW8gaMahbiBoYXkga2jDtG5nLg0KDQoNCiMjIyMgKio0LjIuMi4gVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGhhaSBiaeG6v24gSMO6dCB0aHXhu5FjIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCoqDQoNCiMjIyMjICoqNC4yLjIuMS4gQuG6o25nIHThuqduIHPhu5EgY2jDqW8qKg0KDQotIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNow6lvIGdp4buvYSBoYWkgYmnhur9uIFNtb2tpbmcgdsOgIFJlY3VycmVkIMSR4buDIHhlbSB4w6l0IG3hu5FpIHF1YW4gaOG7hyBzxqEgYuG7mSBnaeG7r2EgY2jDum5nLg0KDQpgYGB7cn0NCiMgxJDhu5VpIHTDqm4gbGV2ZWxzIGPhu6dhIGJp4bq/biBTbW9raW5nDQpkYXQkU21va2luZyA8LSBmYWN0b3IoZGF0JFNtb2tpbmcsIGxldmVscyA9IGMoIk5vIiwgIlllcyIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBow7p0IHRodeG7kWMiLCAiSMO6dCB0aHXhu5FjIikpDQoNCiMgVOG6oW8gbOG6oWkgYuG6o25nIHThuqduIHPhu5ENCnRhYmxlX3RhaWJlbmhfc21va2luZyA8LSB0YWJsZShkYXQkU21va2luZywgZGF0JFJlY3VycmVkKQ0KdGFibGVfdGFpYmVuaF9zbW9raW5nDQpgYGANCg0KLSBUcm9uZyBuaMOzbSBraMO0bmcgaMO6dCB0aHXhu5FjIChObyk6IGPDsyAyNTkgbmfGsOG7nWkga2jDtG5nIHTDoWkgcGjDoXQgdsOgIDc1IG5nxrDhu51pIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLLg0KLSBUcm9uZyBuaMOzbSBjw7MgaMO6dCB0aHXhu5FjIChZZXMpOiBjw7MgMTYgbmfGsOG7nWkga2jDtG5nIHTDoWkgcGjDoXQgdsOgIDMzIG5nxrDhu51pIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLLg0KDQotIE3hu5l0IHF1YW4gc8OhdCBiYW4gxJHhuqd1IMSRw6FuZyBjaMO6IMO9IGzDoCDhu58gbmjDs20gaMO6dCB0aHXhu5FjLCBz4buRIGNhIHTDoWkgcGjDoXQgKDMzKSBn4bqnbiBjYW8gaMahbiBn4bqlcCAyIGzhuqduIHNvIHbhu5tpIHPhu5EgY2Ega2jDtG5nIHTDoWkgcGjDoXQgKDE2KS4gTmfGsOG7o2MgbOG6oWksIOG7nyBuaMOzbSBraMO0bmcgaMO6dCB0aHXhu5FjLCBz4buRIGNhIGtow7RuZyB0w6FpIHBow6F0ICgyNTkpIGzhu5tuIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgc+G7kSBjYSB0w6FpIHBow6F0ICg3NSkuIMSQaeG7gXUgbsOgeSBn4bujaSDDvSBy4bqxbmcgdOG7tyBs4buHIHTDoWkgcGjDoXQg4bufIG5ow7NtIGLhu4duaCBuaMOibiBow7p0IHRodeG7kWMgY8OzIHRo4buDIGNhbyBoxqFuLg0KDQojIyMjIyAqKjQuMi4yLjEuVHLhu7FjIHF1YW4gaMOzYSoqDQoNCsSQ4buDIGzDoG0gcsO1IGjGoW4gbmjhuq1uIMSR4buLbmggdHLDqm4sIGNow7puZyB0YSBz4bq9IHPhu60gZOG7pW5nIGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbS4NCg0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gYuG6o25nIHThuqduIHPhu5EgdGjDoG5oIGRhdGEgZnJhbWUgxJHDum5nIGNoaeG7gXUNCmRmX3Bsb3Rfc21va2luZyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlX3RhaWJlbmhfc21va2luZykNCmNvbG5hbWVzKGRmX3Bsb3Rfc21va2luZykgPC0gYygiU21va2luZyIsICJSZWN1cnJlZCIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MNCmxpYnJhcnkoZ2dwbG90MikNCg0KZ2dwbG90KGRmX3Bsb3Rfc21va2luZywgYWVzKHggPSBTbW9raW5nLCB5ID0gQ291bnQsIGZpbGwgPSBSZWN1cnJlZCkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiVMOsbmggdHLhuqFuZyB0w6FpIHBow6F0IHRoZW8gdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMiLA0KICAgICAgIHggPSAiVMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMiLA0KICAgICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBi4buHbmggbmjDom4iLA0KICAgICAgIGZpbGwgPSAiVMOsbmggdHLhuqFuZyB0w6FpIHBow6F0IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJObyIgPSAic2t5Ymx1ZSIsICJZZXMiID0gInNhbG1vbiIpKQ0KYGBgDQoNCkJp4buDdSDEkeG7kyBj4buZdCB0cuG7sWMgcXVhbiBow7NhIG3hu5l0IGPDoWNoIHLDtSByw6BuZyBz4buxIGtow6FjIGJp4buHdCDEkcOjIG7DqnU6DQoNCuG7niBuaMOzbSBraMO0bmcgaMO6dCB0aHXhu5FjOiBD4buZdCAiS2jDtG5nIHTDoWkgcGjDoXQiIChtw6B1IHhhbmgpIGNhbyBoxqFuIGjhurNuIGPhu5l0ICJUw6FpIHBow6F0IiAobcOgdSBo4buTbmcpLg0K4bueIG5ow7NtIGPDsyBow7p0IHRodeG7kWM6IEPhu5l0ICJUw6FpIHBow6F0IiAobcOgdSBo4buTbmcpIGNhbyBoxqFuIG3hu5l0IGNow7p0IHNvIHbhu5tpIGPhu5l0ICJLaMO0bmcgdMOhaSBwaMOhdCIgKG3DoHUgeGFuaCkuDQoNCkJp4buDdSDEkeG7kyBj4bunbmcgY+G7kSBt4bqhbmggbeG6vSBnaeG6oyB0aHV54bq/dCBy4bqxbmcgdmnhu4djIGjDunQgdGh14buRYyBjw7MgbGnDqm4gcXVhbiDEkeG6v24gbmd1eSBjxqEgdMOhaSBwaMOhdCBjYW8gaMahbi4gQuG7h25oIG5ow6JuIGjDunQgdGh14buRYyBkxrDhu51uZyBuaMawIGPDsyB04bu3IGzhu4cgdMOhaSBwaMOhdCB0csOqbiA1MCUsIHRyb25nIGtoaSB04bu3IGzhu4cgbsOgeSDhu58gbmfGsOG7nWkga2jDtG5nIGjDunQgdGh14buRYyB0aOG6pXAgaMahbiDEkcOhbmcga+G7gy4NCg0KIyMjIyAqKjQuMi4zLiBQaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrIGdp4buvYSBIw7p0IHRodeG7kWMgdsOgIGto4bqjIG7Eg25nIHTDoWkgYuG7h25oKioNCg0KVGnhur9wIHRoZW8sIGNow7puZyB0YSB0w61uaCB0b8OhbiBOZ3V5IGPGoSB0xrDGoW5nIMSR4buRaSAoUmVsYXRpdmUgUmlzayAtIFJSKSDEkeG7gyDEkeG7i25oIGzGsOG7o25nIG3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGPhu6dhIHZp4buHYyBow7p0IHRodeG7kWMgxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQuIE5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMgc+G6vSDEkcaw4bujYyBjb2kgbMOgIG5ow7NtIHBoxqFpIG5oaeG7hW0gZ+G7kWMgKGJhc2VsaW5lKS4NCg0KYGBge3J9DQpyaXNrcmF0aW8odGFibGVfdGFpYmVuaF9zbW9raW5nKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KIEThu7FhIHRyw6puIGLhuqNuZyB04bqnbiBz4buRIMSRw6MgxJHGsOG7o2MgZ2nhuqNpIHRow61jaCByw7Ug4bufIHBo4bqnbiB0csaw4bubYyB0w7RpIHPhur0gdMOtbmggdG/DoW4gUmVsYXRpdmUgUmlzayB0cm9uZyDEkcOzIGJp4bq/biDEkeG7mWMgbOG6rXAgbMOgIHTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIHbDoCBwaOG7pSB0aHXhu5ljIGzDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaC4gTmjDs20gdGhhbSBjaGnhur91IGzDoCBi4buHbmggbmjDom4gxJFhbmcgdHJvbmcgdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMgdsOgIGtow7RuZyBi4buLIHTDoWkgcGjDoXQgYuG7h25oLiBWw6AgbmjDs20gxJHhu5FpIHTGsOG7o25nIGPhuqduIHF1YW4gdMOibSBsw6AgYuG7h25oIG5ow6JuIMSRYW5nIHRyb25nIHTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIHbDoCBi4buLIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLLiANCiBUcsaw4bubYyB0acOqbiBj4bqnbiB0w61uaCB04bu3IGzhu4cgYuG7h25oIG5ow6JuIMSRYW5nIGjDunQgdGh14buRYyBi4buLIHTDoWkgYuG7h25oIHRyw6puIHThu5VuZyBz4buRIGLhu4duaCBuaMOibiBi4buLIHTDoWkgcGjDoXQgYuG7h25oIHNhdSBraGkgxJFp4buBdSB0cuG7iyDhu58gY+G6oyAyIHTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIHbDoCBraMO0bmcgaMO6dCB0aHXhu5FjLiBTYXUgxJHDsyBs4bqleSB04bu3IGzhu4cgduG7q2EgdMOsbSDEkcaw4bujYyBjaGlhIGNobyB04bu3IGzhu4cgbmjDs20gdGhhbSBjaGnhur91ICggdOG7qWMgbMOgIHThu7cgbOG7hyBi4buHbmggbmjDom4gxJFhbmcgaMO6dCB0aHXhu5FjIGtow7RuZyBi4buLIHTDoWkgcGjDoXQgYuG7h25oIGNoaWEgY2hvIHThu5VuZyBz4buRIGLhu4duaCBuaMOibiBraMO0bmcgYuG7iyB0w6FpIHBow6F0IGLhu4duaCBzYXUga2hpIMSRaeG7gXUgdHLhu4sgYuG7h25oKQ0KDQogTmjhuq1uIHjDqXQ6IEtoaSBwaMOibiB0w61jaCBi4buHbmggbmjDom4gxJFhbmcgaMO6dCB0aHXhu5FjIGLhu4sgdMOhaSBuaGnhu4VtIGLhu4duaCB0dXnhur9uIGdpw6FwIHNhdSBraGkgxJFp4buBdSB0cuG7iyB0YSB0aOG6pXkgUlIgPSAzLjI1LCBr4bq/dCBxdeG6oyBuw6B5IGNobyBiaeG6v3QgcuG6sW5nIHThu7cgbOG7hyBi4buHbmggbmjDom4gxJFhbmcgaMO6dCB0aHXhu5FjIGLhu4sgdMOhaSBuaGnhu4VtIGLhu4duaCBzYXUgxJFp4buBdSB0cuG7iyBjYW8gaMahcCBn4bqlcCAzLjI1IGzhuqduIHNvIHbhu5tpIG5ow7NtIGLhu4duaCBuaMOibiDEkWFuZyBow7p0IHRodeG7kWMgdsOgIGtow7RuZyBi4buLIHTDoWkgbmhp4buFbSBi4buHbmggc2F1IMSRaeG7gXUgdHLhu4sg4bufIGPhuqMgMiB0w6xuaCB0cuG6oW5nIGjDunQgdsOgIGtow7RuZyBow7p0IHRodeG7kWMpDQogDQoqKkvhur90IGx14bqtbiB04burIGPDoWMga2nhu4NtIMSR4buLbmg6KioNCg0KfCBUw6FpIHBow6F0IHwgbWlkcC5leGFjdCAgICAgfCBmaXNoZXIuZXhhY3QgICB8IGNoaS5zcXVhcmUgICAgIHwNCnw6LS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS06fA0KfCBObyAgICAgICB8IE5BICAgICAgICAgICAgIHwgTkEgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICB8DQp8IFllcyAgICAgIHwgMS4wNTIxODdlLTA5ICAgfCA5LjI4MTcyOGUtMTAgICB8IDYuOTUyMTEzZS0xMSAgIHwNCg0KQ8OhYyBnacOhIHRy4buLIHAtdmFsdWUgdOG7qyBj4bqjIGJhIHBoxrDGoW5nIHBow6FwIGtp4buDbSDEkeG7i25oIChNaWQtcCBleGFjdCwgRmlzaGVyIGV4YWN0LCB2w6AgQ2hpLXNxdWFyZSkgxJHhu4F1IHLhuqV0IG5o4buPIChwIDwgMC4wMDEpLiDEkGnhu4F1IG7DoHkgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgDoga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSBow7p0IHRodeG7kWMgdsOgIHTDoWkgcGjDoXQpIHbDoCBraOG6s25nIMSR4buLbmggcuG6sW5nIGPDsyBt4buZdCBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogcuG6pXQgbeG6oW5oIG3hur0gZ2nhu69hIGhhaSBiaeG6v24gbsOgeS4NCg0KIyMjIyAqKjQuMi40LiBQaMOibiB0w61jaCBPZGQgUmF0aW8gZ2nhu69hIEjDunQgdGh14buRYyB2w6Aga2jhuqMgbsSDbmcgdMOhaSBi4buHbmgqKg0KDQpgYGB7cn0NCm9kZHNyYXRpbyh0YWJsZV90YWliZW5oX3Ntb2tpbmcsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBU4bu3IHPhu5EgY2jDqm5oIChPUikgbMOgIDcuMDQzNCDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgIm9kZHMiICh04bu3IGzhu4cgZ2nhu69hIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHbDoCBraMO0bmcgeOG6o3kgcmEpIGPhu6dhIHZp4buHYyB0w6FpIHBow6F0IOG7nyBuaMOzbSBi4buHbmggbmjDom4gaMO6dCB0aHXhu5FjIGNhbyBn4bqlcCA3LjA0IGzhuqduIHNvIHbhu5tpICJvZGRzIiB0w6FpIHBow6F0IOG7nyBuaMOzbSBi4buHbmggbmjDom4ga2jDtG5nIGjDunQgdGh14buRYy4NCg0KIyMjIyAqKjQuMi41LiBUaOG7kW5nIGvDqiBzdXkgZGnhu4VuKioNCg0KIyMjIyMgKio0LjIuNS4xLiBLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAqKg0KDQpDaMO6bmcgdGEgc+G7rSBk4bulbmcga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIMSR4buDIGtp4buDbSB0cmEgZ2nhuqMgdGh1eeG6v3QgduG7gSB0w61uaCDEkeG7mWMgbOG6rXAgZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0Lg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCiAtIEjigoAgKEdp4bqjIHRodXnhur90IGtow7RuZyk6IFTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGzDoCBoYWkgYmnhur9uIMSR4buZYyBs4bqtcCAoa2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHKS4NCiAtIEjigoEgKEdp4bqjIHRodXnhur90IMSR4buRaSk6IFTDrG5oIHRy4bqhbmcgaMO6dCB0aHXhu5FjIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGzDoCBoYWkgYmnhur9uIHBo4bulIHRodeG7mWMgKGPDsyBt4buRaSBsacOqbiBo4buHKS4NCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZw0KY2hpc3EudGVzdCh0YWJsZV90YWliZW5oX3Ntb2tpbmcpDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBwLXZhbHVlIG5o4buPIGjGoW4gcuG6pXQgbmhp4buBdSBzbyB24bubaSBuZ8aw4buhbmcgw70gbmdoxKlhIHRow7RuZyB0aMaw4budbmcgKM6xID0gMC4wNSksIHRhIGPDsyB0aOG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSDAuIMSQaeG7gXUgbsOgeSDEkeG7k25nIG5naMSpYSB24bubaSB2aeG7h2MgdOG7k24gdOG6oWkgbeG7mXQgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBow6BuaCB2aSBow7p0IHRodeG7kWMgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oLiBOw7NpIGPDoWNoIGtow6FjLCBi4buHbmggbmjDom4gxJFhbmcgdHJvbmcgdMOsbmggdHLhuqFuZyBow7p0IHRodeG7kWMgY8OzIG5ndXkgY8ahIHTDoWkgcGjDoXQgdW5nIHRoxrAgdHV54bq/biBnacOhcCBjYW8gaMahbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBow7p0IHRodeG7kWMuIFBow6F0IGhp4buHbiBuw6B5IHBow7kgaOG7o3AgduG7m2kgY8OhYyBi4bqxbmcgY2jhu6luZyB5IGjhu41jIHRyxrDhu5tjIMSRw7MsIGNobyB0aOG6pXkgaMO6dCB0aHXhu5FjIGzDoSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgdGnDqnUgY+G7sWMgxJHhur9uIGjhu4cgbWnhu4VuIGThu4tjaCwgbMOgbSBzdXkgZ2nhuqNtIGhp4buHdSBxdeG6oyDEkWnhu4F1IHRy4buLIHbDoCB0xINuZyBuZ3V5IGPGoSB0w6FpIHBow6F0IGLhu4duaCBzYXUgY2FuIHRoaeG7h3AuDQoNCiMjIyMjICoqNC4yLjUuMi4gS2nhu4NtIMSR4buLbmggaGnhu4d1IHThu7cgbOG7hyoqDQoNCi0gxJDhu4Mgc28gc8OhbmggdHLhu7FjIHRp4bq/cCB04bu3IGzhu4cgdMOhaSBwaMOhdCBnaeG7r2EgaGFpIG5ow7NtLCBjaMO6bmcgdGEgdGnhur9uIGjDoG5oIGtp4buDbSDEkeG7i25oIGhp4buHdSBoYWkgdOG7tyBs4buHLg0KR+G7jWkgcDEgbMOgIHThu7cgbOG7hyB0w6FpIHBow6F0IOG7nyBuaMOzbSBow7p0IHRodeG7kWMsIHAyIGzDoCB04bu3IGzhu4cgdMOhaSBwaMOhdCDhu58gbmjDs20ga2jDtG5nIGjDunQgdGh14buRYy4NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotIEjigoA6IHAxIC0gcDIgPSAwIChU4bu3IGzhu4cgdMOhaSBwaMOhdCDhu58gaGFpIG5ow7NtIGzDoCBuaMawIG5oYXUpLg0KDQotIEjigoE6IHAxIC0gcDIgPiAwIChU4bu3IGzhu4cgdMOhaSBwaMOhdCDhu58gbmjDs20gaMO6dCB0aHXhu5FjIGNhbyBoxqFuIG5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMpLg0KDQpgYGB7cn0NCiMgU+G7kSBjYSB0w6FpIHBow6F0IOG7nyBuaMOzbSBow7p0IHRodeG7kWMgdsOgIGtow7RuZyBow7p0IHRodeG7kWMNCnN1Y2Nlc3Nfc21va2luZyA8LSBjKDMzLCA3NSkNCg0KIyBU4buVbmcgc+G7kSBi4buHbmggbmjDom4gdHJvbmcgbeG7l2kgbmjDs20NCm5fc21va2luZyA8LSBjKDQ5LCAzMzQpDQoNCiMgS2nhu4NtIMSR4buLbmggaGnhu4d1IHThu7cgbOG7hyBt4buZdCBwaMOtYQ0KcHJvcC50ZXN0KHN1Y2Nlc3Nfc21va2luZywgbl9zbW9raW5nLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29ycmVjdCA9IEZBTFNFKQ0KYGBgDQoNCi0gS2nhu4NtIMSR4buLbmggaGnhu4d1IGhhaSB04bu3IGzhu4cgY2hvIHRo4bqleSB04bu3IGzhu4cgdMOhaSBwaMOhdCDhu58gbmjDs20gYuG7h25oIG5ow6JuIGjDunQgdGh14buRYyAoNjcuMyUpIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5ow7NtIGtow7RuZyBow7p0IHRodeG7kWMgKDIyLjUlKSwgduG7m2kgc+G7sSBjaMOqbmggbOG7h2NoIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogKHAgPSAzLjQ3NiDDlyAxMOKBu8K5wrkpLiBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBoaeG7h3UgdOG7tyBs4buHIGRhbyDEkeG7mW5nIHThu6sgMzMuMyUgxJHhur9uIDEwMCUsIGto4bqzbmcgxJHhu4tuaCBz4buxIGtow6FjIGJp4buHdCByw7UgcuG7h3QgZ2nhu69hIGhhaSBuaMOzbS4gS+G6v3QgcXXhuqMgbsOgeSBjaG8gdGjhuqV5IGjDunQgdGh14buRYyBsw6AgeeG6v3UgdOG7kSBsacOqbiBxdWFuIGNo4bq3dCBjaOG6vSDEkeG6v24gbmd1eSBjxqEgdMOhaSBwaMOhdCB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIHNhdSDEkWnhu4F1IHRy4buLLg0KDQojIyMjICoqNC4yLjYuIE3DtCBow6xuaCBo4buTaSBxdXkgY2hvIGThu68gbGnhu4d1IG5o4buLIHBow6JuKioNCg0KIyMjIyMgKio0LjIuNi4xLiBNw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgqKg0KDQpDaMO6bmcgdGEgc+G6vSB4w6J5IGThu7FuZyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHhu4MgeGVtIHjDqXQg4bqjbmggaMaw4bufbmcgY+G7p2Egdmnhu4djIGjDunQgdGh14buRYyDEkeG6v24geMOhYyBzdeG6pXQgdMOhaSBwaMOhdC4NCg0KYGBge3J9DQojIEJp4bq/biBuaOG7iyBwaMOibiBSZWN1cnJlZF9iaW4gxJHDoyDEkcaw4bujYyB04bqhbyDhu58gcGjhuqduIHRyxrDhu5tjDQpSZWN1cnJlZF9iaW4gPC0gaWZlbHNlKGRhdCRSZWN1cnJlZCA9PSAiWWVzIiwgMSwgMCkNCg0KIyBYw6J5IGThu7FuZyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgNCmhxdHRfbW9kZWxfc21va2luZyA8LSBnbG0oUmVjdXJyZWRfYmluIH4gU21va2luZywgZGF0YSA9IGRhdCkNCg0KIyBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnN1bW1hcnkoaHF0dF9tb2RlbF9zbW9raW5nKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KiogS+G6v3QgcXXhuqMgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGNobyB0aOG6pXkgaOG7hyBz4buRIGPhu6dhIGJp4bq/biBTbW9raW5nICjEkWFuZyBow7p0IHRodeG7kWMpIGzDoCAwLjQ0ODkyLCB24bubaSBwLXZhbHVlIHLhuqV0IG5o4buPIChwIDwgMC4wMDEpLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AsIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBow7p0IHRodeG7kWMsIG5nxrDhu51pIGPDsyBow7p0IHRodeG7kWMgY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgY2FvIGjGoW4gdHJ1bmcgYsOsbmggbMOgIGtob+G6o25nIDQ0LjklLiBI4buHIHPhu5EgY2jhurduICgwLjIyNDU1KSBjaMOtbmggbMOgIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgxrDhu5tjIHTDrW5oIGNobyBuaMOzbSBraMO0bmcgaMO6dCB0aHXhu5FjLg0KTeG6t2MgZMO5IG3DtCBow6xuaCBuw6B5IGThu4UgZGnhu4VuIGdp4bqjaSwgbsOzIGPDsyBuaOG7r25nIGjhuqFuIGNo4bq/IGzDvSB0aHV54bq/dCBraGkgw6FwIGThu6VuZyBjaG8gYmnhur9uIHBo4bulIHRodeG7mWMgbmjhu4sgcGjDom4uIERvIMSRw7MsIGNow7puZyB0YSBz4bq9IHhlbSB4w6l0IGPDoWMgbcO0IGjDrG5oIHBow7kgaOG7o3AgaMahbiBuaMawIExvZ2l0IHbDoCBQcm9iaXQuDQoNCiMjIyMjICoqNC4yLjYuMi4gTcO0IGjDrG5oIExvZ2l0KiogDQoNCk3DtCBow6xuaCBo4buTaSBxdXkgTG9naXN0aWMgxJHGsOG7o2Mgw6FwIGThu6VuZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBsb2cgY+G7p2EgdOG7tyBz4buRIGNow6puaCAobG9nLW9kZHMpIGPhu6dhIHZp4buHYyB0w6FpIHBow6F0Lg0KDQpgYGB7cn0NCiMgTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyB24bubaSBiaeG6v24gU21va2luZw0KbW9kZWxfbG9naXRfc21va2luZyA8LSBnbG0oUmVjdXJyZWRfYmluIH4gU21va2luZywgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpLCBkYXRhID0gZGF0KQ0KDQojIFhlbSBr4bq/dCBxdeG6ow0Kc3VtbWFyeShtb2RlbF9sb2dpdF9zbW9raW5nKQ0KYGBgDQoNClBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgTG9naXQgY8OzIGThuqFuZzoNClxbDQpcbG9nXGxlZnQoXGZyYWN7XHBpfXsxIC0gXHBpfVxyaWdodCkgPSAtMS4yMzkzICsgMS45NjMzIFxjZG90IFx0ZXh0e0jDunQgdGh14buRY30NClxdDQoNCi0gKipI4buHIHPhu5EgY2jhurduKiogXChcaGF0e1xiZXRhfV8wID0gLTEuMjM5M1wpOiDEkMOieSBsw6AgbG9nLW9kZHMgdMOhaSBwaMOhdCBj4bunYSBt4buZdCBi4buHbmggbmjDom4ga2jDtG5nIGjDunQgdGh14buRYy4NCi0gKipI4buHIHPhu5EgaOG7k2kgcXV5KiogXChcaGF0e1xiZXRhfV8xID0gMS45NjMzXCkgKHAgPCAwLjAwMSk6IENobyB0aOG6pXkgbG9nLW9kZHMgdMOhaSBwaMOhdCDhu58gbmfGsOG7nWkgaMO6dCB0aHXhu5FjIGNhbyBoxqFuIDEuOTYzMyDEkcahbiB24buLIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBow7p0IHRodeG7kWMuDQoNCioqVOG7tyBz4buRIE9kZHMgKE9kZHMgUmF0aW8pOioqDQoNCmBgYHtyfQ0KIyBUw61uaCBPZGRzIFJhdGlvDQpleHAoY29lZihtb2RlbF9sb2dpdF9zbW9raW5nKSkNCmBgYA0KDQpcWw0KXHRleHR7T1J9ID0gZV57MS45NjMzfSBcYXBwcm94IDcuMTIyNQ0KXF0NCkvhur90IHF14bqjIG7DoHkgY2hvIHRo4bqleSAib2RkcyIgdMOhaSBwaMOhdCDhu58gbmfGsOG7nWkgaMO6dCB0aHXhu5FjIGNhbyBn4bqlcCAqKjcuMTIyNSBs4bqnbioqIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBow7p0IHRodeG7kWMsIGhvw6BuIHRvw6BuIHBow7kgaOG7o3AgduG7m2kga+G6v3QgcXXhuqMgdOG7qyBow6BtIGBvZGRzcmF0aW9gIHRyxrDhu5tjIMSRw7MsIG3hu6ljIMSR4buZIGNow6puaCBs4buHY2gga2jDtG5nIHF1w6EgbOG7m24uIA0KDQojIyMjIyAqKjQuMi42LjMuIE3DtCBow6xuaCBQcm9iaXQqKg0KDQpDaMO6bmcgdGEgdGnhur9wIHThu6VjIHbhu5tpIG3DtCBow6xuaCBQcm9iaXQsIHPhu60gZOG7pW5nIGjDoG0gcGjDom4gcGjhu5FpIHTDrWNoIGzFqXkgY2h14bqpbi4NCg0KYGBge3J9DQojIE3DtCBow6xuaCBQcm9iaXQgduG7m2kgYmnhur9uIFNtb2tpbmcNCnByb2JpdF9tb2RlbF9zbW9raW5nIDwtIGdsbShSZWN1cnJlZF9iaW4gfiBTbW9raW5nLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpLCBkYXRhID0gZGF0KQ0KDQojIFhlbSBr4bq/dCBxdeG6oyBtw7QgaMOsbmgNCnN1bW1hcnkocHJvYml0X21vZGVsX3Ntb2tpbmcpDQpgYGANCg0KLSDEkOG7gyDEkcOhbmggZ2nDoSDhuqNuaCBoxrDhu59uZyBj4bunYSBow6BuaCB2aSBow7p0IHRodeG7kWMgxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAsIG3DtCBow6xuaCBo4buTaSBxdXkgUHJvYml0IMSRxrDhu6NjIHjDonkgZOG7sW5nIHbhu5tpIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBSZWN1cnJlZCAoMDoga2jDtG5nIHTDoWkgcGjDoXQsIDE6IGPDsyB0w6FpIHBow6F0KSB2w6AgYmnhur9uIMSR4buZYyBs4bqtcCBsw6AgU21va2luZyAoMDoga2jDtG5nIGjDunQgdGh14buRYyDigJMgbmjDs20gdGhhbSBjaGnhur91LCAxOiBow7p0IHRodeG7kWMpLg0KDQotIFBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgxrDhu5tjIGzGsOG7o25nIG5oxrAgc2F1Og0KDQpcWw0KXHBpID0gXFBoaSgtMC43NTY5ICsgMS4yMDY0IFxjZG90IFx0ZXh0e1Ntb2tpbmd9KQ0KXF0NCg0KLSBUcm9uZyDEkcOzOg0KDQogLSBcKCBcUGhpKFxjZG90KSBcKTogaMOgbSBwaMOibiBwaOG7kWkgdMOtY2ggbMWpeSBjaHXhuqluIHThuq9jIChzdGFuZGFyZCBub3JtYWwgQ0RGKS4NCiANCiAtIFwoIFxwaSBcKTogeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmguDQoNCioqRGnhu4VuIGdp4bqjaSBr4bq/dCBxdeG6oyoqDQoNCi0gKipI4buHIHPhu5EgY2jhurduKiogXCggXGJldGFfMCA9IC0wLjc1NjkgXCksIHAgPCAwLjAwMTogIA0KICDEkOG6oWkgZGnhu4duIGNobyB4w6FjIHN14bqldCB0w6FpIHBow6F0IOG7nyBuaMOzbSAqKmtow7RuZyBow7p0IHRodeG7kWMqKjoNCg0KXFsNClxwaV97XHRleHR7a2jDtG5nIGjDunR9fSA9IFxQaGkoLTAuNzU2OSkgXGFwcHJveCAwLjIyNDYNClxdDQoNCi0gKipI4buHIHPhu5EgaOG7k2kgcXV5KiogXCggXGJldGFfMSA9IDEuMjA2NCBcKSwgcCA8IDAuMDAxOiAgDQogIEtoaSBi4buHbmggbmjDom4gKipjw7MgaMO6dCB0aHXhu5FjKiosIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgbMOgOg0KDQpcWw0KXHBpX3tcdGV4dHtow7p0IHRodeG7kWN9fSA9IFxQaGkoLTAuNzU2OSArIDEuMjA2NCkgPSBcUGhpKDAuNDQ5NSkgXGFwcHJveCAwLjY3MzUNClxdDQoNCioqU28gc8OhbmggeMOhYyBzdeG6pXQgZ2nhu69hIDIgbmjDs20qKg0KDQpcWw0KXERlbHRhIFxwaSA9IFxwaV97XHRleHR7aMO6dCB0aHXhu5FjfX0gLSBccGlfe1x0ZXh0e2tow7RuZyBow7p0fX0gXGFwcHJveCAwLjY3MzUgLSAwLjIyNDYgPSAwLjQ0ODkNClxdDQoNCioqS+G6v3QgbHXhuq1uKioNCg0KLSBNw7QgaMOsbmggUHJvYml0IGNobyB0aOG6pXkgYuG7h25oIG5ow6JuIGjDunQgdGh14buRYyBjw7MgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmggdW5nIHRoxrAgdHV54bq/biBnacOhcCAqKmNhbyBoxqFuIGtob+G6o25nIDQ0LjklKiogc28gduG7m2kgYuG7h25oIG5ow6JuIGtow7RuZyBow7p0IHRodeG7kWMuIEPhuqMgaGFpIGjhu4cgc+G7kSDEkeG7gXUgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiAocCA8IDAuMDAxKS4gSMOgbmggdmkgaMO6dCB0aHXhu5FjIGPDsyB0aOG7gyB4ZW0gbMOgICoqbeG7mXQgeeG6v3UgdOG7kSBuZ3V5IGPGoSBxdWFuIHRy4buNbmcqKiwgY+G6p24gxJHGsOG7o2MgbMawdSDDvSB0cm9uZyBjw7RuZyB0w6FjIHRoZW8gZMO1aSB2w6AgcXXhuqNuIGzDvSBzYXUgxJFp4buBdSB0cuG7iy4NCg0KIyMjIyMgKio0LjIuNi40LiBNw7QgaMOsbmggY2xvZ2xvZyoqDQoNCi0gTcO0IGjDrG5oIGjhu5NpIHF1eSBjbG9nbG9nIGzDoCBt4buZdCBk4bqhbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSBuaOG7iyBwaMOibiwgc+G7rSBk4bulbmcgaMOgbSBsacOqbiBr4bq/dCBi4bqldCDEkeG7kWkgeOG7qW5nIMSR4buDIG3DtCB04bqjIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgeMOhYyBzdeG6pXQgeOG6o3kgcmEgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgdsOgIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcC4gSMOgbSBsacOqbiBr4bq/dCBjbG9nbG9nIMSRxrDhu6NjIMSR4buLbmggbmdoxKlhIG5oxrAgc2F1Og0KDQpcWw0KZyhccGkpID0gXGxvZygtXGxvZygxIC0gXHBpKSkNClxdDQoNClRyb25nIMSRw7M6DQotIFwoIFxwaSA9IFxQcihZID0gMSBcbWlkIFgpIFwpIGzDoCB4w6FjIHN14bqldCB44bqjeSByYSBj4bunYSBoaeG7h24gdMaw4bujbmcgcXVhbiB0w6JtICh2w60gZOG7pTogdMOhaSBwaMOhdCBi4buHbmgpLg0KLSBcKCBnKFxwaSkgXCkgbMOgIGjDoG0gbGnDqm4ga+G6v3QgdGhlbyBjbG9nbG9nLg0KDQpLaGkgw6FwIGThu6VuZyBtw7QgaMOsbmggaOG7k2kgcXV5LCB0YSBjw7MgcGjGsMahbmcgdHLDrG5oOg0KDQpcWw0KXGxvZygtXGxvZygxIC0gXHBpKSkgPSBcYmV0YV8wICsgXGJldGFfMSBYXzEgKyBcY2RvdHMgKyBcYmV0YV9rIFhfaw0KXF0NCg0KR2nhuqNpIG5nxrDhu6NjIMSR4buDIHTDrW5oIHjDoWMgc3XhuqV0Og0KDQpcWw0KXHBpID0gMSAtIFxleHBcbGVmdCggLVxleHAoXGV0YSkgXHJpZ2h0KSwgXHF1YWQgXHRleHR7dHJvbmcgxJHDsyB9IFxldGEgPSBcYmV0YV8wICsgXHN1bV97aj0xfV57a30gXGJldGFfaiBYX2oNClxdDQoNCioqxJDhurdjIMSRaeG7g20gY+G7p2EgbcO0IGjDrG5oIGNsb2dsb2cqKg0KDQotIFBow7kgaOG7o3Aga2hpIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhu7Ega2nhu4duIHRp4buHbSBj4bqtbiAwIGhv4bq3YyAxIG3hu5l0IGPDoWNoIGtow7RuZyDEkeG7kWkgeOG7qW5nLg0KLSBUaMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgbcO0IGjDrG5oIHLhu6dpIHJvLCBwaMOibiB0w61jaCBz4buRbmcgc8OzdCBob+G6t2Mga2hpIGThu68gbGnhu4d1IHRoacOqbiBs4buHY2ggduG7gSBt4buZdCBwaMOtYS4NCg0KYGBge3J9DQptb2RlbF9jbG9nbG9nIDwtIGdsbShSZWN1cnJlZF9iaW4gfiBTbW9raW5nLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImNsb2dsb2ciKSwgZGF0YSA9IGRhdCkNCnN1bW1hcnkobW9kZWxfY2xvZ2xvZykNCmBgYA0KDQpUcm9uZyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIHbhu5tpIGjDoG0gbGnDqm4ga+G6v3QgKipjb21wbGVtZW50YXJ5IGxvZy1sb2cgKGNsb2dsb2cpKio6DQoNClxbDQpnKFxwaSkgPSBcbG9nKC1cbG9nKDEgLSBccGkpKSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjZG90IFx0ZXh0e1Ntb2tpbmd9DQpcXQ0KDQpUYSB0aHUgxJHGsOG7o2MgcGjGsMahbmcgdHLDrG5oIMaw4bubYyBsxrDhu6NuZzoNCg0KXFsNClxsb2coLVxsb2coMSAtIFxwaSkpID0gLTEuMzY5MiArIDEuNDgxOCBcY2RvdCBcdGV4dHtTbW9raW5nfQ0KXF0NCg0KVHJvbmcgxJHDszoNCi0gXCggXHRleHR7U21va2luZ30gPSAxIFwpIG7hur91IGLhu4duaCBuaMOibiBow7p0IHRodeG7kWMsIHbDoCBcKCA9IDAgXCkgbuG6v3Uga2jDtG5nIGjDunQgdGh14buRYy4NCi0gQmnhur9uIHBo4bulIHRodeG7mWMgXCggXHBpIFwpIGzDoCB4w6FjIHN14bqldCB0w6FpIHBow6F0IGLhu4duaC4NCg0KKipEaeG7hW4gZ2nhuqNpIGvhur90IHF14bqjOioqDQoNCi0gKipI4buHIHPhu5EgY2jhurduKiogXCggXGJldGFfMCA9IC0xLjM2OTIgXCkgKHAgPCAwLjAwMSkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gS2hpIGLhu4duaCBuaMOibiAqKmtow7RuZyBow7p0IHRodeG7kWMqKiwgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCDEkcaw4bujYyB0w61uaCBuaMawIHNhdToNCg0KXFsNClxwaV97XHRleHR7a2jDtG5nIGjDunQgdGh14buRY319ID0gMSAtIFxleHBcbGVmdCggLVxleHAoLTEuMzY5MikgXHJpZ2h0KSBcYXBwcm94IDAuMjI0NQ0KXF0NCg0KLSAqKkjhu4cgc+G7kSBow7p0IHRodeG7kWMqKiBcKCBcYmV0YV8xID0gMS40ODE4IFwpIChwIDwgMC4wMDEpOiBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IGNhbywgY2hvIHRo4bqleSBow6BuaCB2aSBow7p0IHRodeG7kWMgbMOgbSAqKnTEg25nIMSRw6FuZyBr4buDKiogeMOhYyBzdeG6pXQgdMOhaSBwaMOhdC4gWMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBjaG8gbmjDs20gaMO6dCB0aHXhu5FjIGzDoDoNCg0KXFsNClxwaV97XHRleHR7aMO6dCB0aHXhu5FjfX0gPSAxIC0gXGV4cFxsZWZ0KCAtXGV4cCgtMS4zNjkyICsgMS40ODE4KSBccmlnaHQpIFxhcHByb3ggMC42NzM1DQpcXQ0KDQoqKkvhur90IGx14bqtbjoqKg0KDQotICoqWMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmgg4bufIGLhu4duaCBuaMOibiBow7p0IHRodeG7kWMgKDY3LjQlKSBjYW8gZ+G6pXAgMyBs4bqnbiBzbyB24bubaSBi4buHbmggbmjDom4ga2jDtG5nIGjDunQgdGh14buRYyAoMjIuNCUpKiouDQotIFPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgKipjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IG3huqFuaCoqIHbhu5tpIHAtdmFsdWUgXCggPCAyIFx0aW1lcyAxMF57LTExfSBcKSwgY2hvIHRo4bqleSBow6BuaCB2aSBow7p0IHRodeG7kWMgbMOgIG3hu5l0ICoqeeG6v3UgdOG7kSBuZ3V5IGPGoSBxdWFuIHRy4buNbmcqKiDEkeG7kWkgduG7m2kgdMOhaSBwaMOhdCBi4buHbmggdW5nIHRoxrAgdHV54bq/biBnacOhcC4NCi0gTcO0IGjDrG5oIGNsb2dsb2cgbMOgIGzhu7FhIGNo4buNbiBwaMO5IGjhu6NwIHbDrCBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQgeOG6o3kgcmEgc+G7sSBraeG7h24gKHTDoWkgcGjDoXQgYuG7h25oKSBjw7MgdMOtbmggY2jhuqV0ICoqYuG6pXQgxJHhu5FpIHjhu6luZyoqLg0KDQojIyMjICoqNC4yLjcgxJDDoW5oIGdpw6EgbcO0IGjDrG5oKioNCg0KKipC4bqjbmcgdOG7lW5nIGjhu6NwIDQgbcO0IGjDrG5oKioNCg0KXFsNClxiZWdpbnthcnJheX17fGx8bHxjfH0NClxobGluZQ0KXHRleHRiZntNw7QgaMOsbmh9ICYgXHRleHRiZntIw6BtIGxpw6puIGvhur90IChMaW5rIGZ1bmN0aW9uKX0gJiBcdGV4dGJme0FJQ30gXFwNClxobGluZQ0KXHRleHR7SOG7k2kgcXV5IHR1eeG6v24gdMOtbmggKExpbmVhciBSZWdyZXNzaW9uKX0gJiBcdGV4dHtJZGVudGl0eSAoR2F1c3NpYW4pfSAmIDQzNi4xMSBcXA0KXGhsaW5lDQpcdGV4dHtI4buTaSBxdXkgbG9naXN0aWMgKExvZ2l0KX0gJiBcdGV4dHtMb2dpdH0gJiA0MjEuNjkgXFwNClxobGluZQ0KXHRleHR7SOG7k2kgcXV5IHByb2JpdH0gJiBcdGV4dHtQcm9iaXR9ICYgNDIxLjY5IFxcDQpcaGxpbmUNClx0ZXh0e0jhu5NpIHF1eSBjbG9nbG9nfSAmIFx0ZXh0e0NvbXBsZW1lbnRhcnkgbG9nLWxvZ30gJiA0MjEuNjkgXFwNClxobGluZQ0KXGVuZHthcnJheX0NClxdDQoNCioqxJDDoW5oIGdpw6EqKg0KDQogVHJvbmcgbmdoacOqbiBj4bupdSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBow7p0IHRodeG7kWMgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgdW5nIHRoxrAgdHV54bq/biBnacOhcCwgY2jDum5nIHTDtGkgc28gc8OhbmggNCBtw7QgaMOsbmggaOG7k2kgcXV5OiB0dXnhur9uIHTDrW5oLCBsb2dpdCwgcHJvYml0IHbDoCBjbG9nbG9nLiBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIGPDsyBBSUMgY2FvIG5o4bqldCAoNDM2LjExKSwgY2hvIHRo4bqleSBt4bupYyDEkeG7mSBwaMO5IGjhu6NwIGvDqW0gbmjhuqV0LiBCYSBtw7QgaMOsbmggY8OybiBs4bqhaSAobG9naXQsIHByb2JpdCwgY2xvZ2xvZykgxJHhu4F1IGPDsyBBSUMgYuG6sW5nIG5oYXUgKDQyMS42OSksIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCB04buRdCBoxqFuLg0KDQogRMO5IEFJQyB0xrDGoW5nIMSRxrDGoW5nLCBt4buXaSBtw7QgaMOsbmggY8OzIHRo4bq/IG3huqFuaCByacOqbmc6IGxvZ2l0IHBow7kgaOG7o3AgbuG6v3UgbXXhu5FuIGdp4bqjaSB0aMOtY2ggdGhlbyB04bu3IGzhu4cgb2RkcywgcHJvYml0IHBow7kgaOG7o3Aga2hpIGdp4bqjIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4sIGPDsm4gY2xvZ2xvZyBoaeG7h3UgcXXhuqMga2hpIGhp4buHbiB0xrDhu6NuZyBuZ2hpw6puIGPhu6l1IGLhuqV0IMSR4buRaSB44bupbmcuIFRyb25nIGLhu5FpIGPhuqNuaCBi4buHbmggdMOhaSBwaMOhdCB0aMaw4budbmcgbWFuZyB0w61uaCBraMO0bmcgxJHhu5FpIHjhu6luZywgY2xvZ2xvZyBsw6AgbOG7sWEgY2jhu41uIGjhu6NwIGzDvSwgbmjGsG5nIG5ow6xuIGNodW5nIGPhuqMgYmEgbcO0IGjDrG5oIMSR4buBdSBjaG8gdGjhuqV5IGjDunQgdGh14buRYyBsw6BtIHTEg25nIG5ndXkgY8ahIHTDoWkgcGjDoXQgYuG7h25oLg0KDQojIyMgKio0LjMgVMOtbmggY2jhuqV0IGto4buRaSB1IHTDoWMgxJHhu5luZyDEkeG6v24ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBi4buHbmgqKg0KDQpUcm9uZyBwaOG6p24gbsOgeSwgY2jDum5nIHRhIHPhur0gcGjDom4gdMOtY2ggbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgxJHhurdjIMSRaeG7g20ga2jhu5FpIHUgY+G7p2EgYuG7h25oIG5ow6JuICjEkcahbiDhu5UgaGF5IMSRYSDhu5UpIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2Egc2F1IMSRaeG7gXUgdHLhu4suIEJp4bq/biDEkeG7mWMgbOG6rXAgbMOgIEZvY2FsaXR5IHbDoCBiaeG6v24gcGjhu6UgdGh14buZYyBsw6AgUmVjdXJyZWQuDQoNCiMjIyMgKio0LjMuMSBC4bqjbmcgdOG6p24gc+G7kSAtIHThuqduIHN14bqldCBjaG8gYmnhur9uIEZvY2FsaXR5KioNCg0KxJDhuqd1IHRpw6puLCBjaMO6bmcgdGEgc+G6vSBs4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaG8gYmnhur9uIEZvY2FsaXR5IMSR4buDIGhp4buDdSByw7Ugc+G7sSBwaMOibiBi4buRIGPhu6dhIG5ow7NtIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJHGoW4g4buVIHbDoCDEkWEg4buVIHRyb25nIHThuq1wIGThu68gbGnhu4d1Lg0KDQpgYGB7cn0NCnRhYl9mb2NhbGl0eSA8LSB0YWJsZShkYXQkRm9jYWxpdHkpDQp0YWJfZm9jYWxpdHkNCmBgYA0KDQpL4bq/dCBxdeG6oyBz4bq9IMSRxrDhu6NjIHRy4buxYyBxdWFuIGjDs2EgYuG6sW5nIGJp4buDdSDEkeG7kyBj4buZdCDEkeG7gyBk4buFIGTDoG5nIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcgZ2nhu69hIGhhaSBuaMOzbS4NCg0KYGBge3J9DQpiYXJwbG90KHRhYl9mb2NhbGl0eSwNCiAgICAgICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSB0w61uaCDEkWEg4buVIGPhu6dhIGto4buRaSB1IiwNCiAgICAgICAgeGxhYiA9ICJUw61uaCBjaOG6pXQga2jhu5FpIHUiLA0KICAgICAgICB5bGFiID0gIlThuqduIHPhu5EiLA0KICAgICAgICBjb2wgPSBjKCJraGFraSIsICJvbGl2ZWRyYWIiKSwNCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwNCiAgICAgICAgeWxpbSA9IGMoMCwgbWF4KHRhYl9mb2NhbGl0eSkgKyA0MCkpIC0+IGJwX2ZvY2FsaXR5DQoNCnRleHQoeCA9IGJwX2ZvY2FsaXR5LCB5ID0gdGFiX2ZvY2FsaXR5ICsgMTUsIGxhYmVscyA9IHRhYl9mb2NhbGl0eSkNCmBgYA0KDQpUaMO0bmcgcXVhIGLhuqNuZyB04bqnbiBz4buRIHbDoCBiaeG7g3UgxJHhu5MsIHRhIHRo4bqleSBy4bqxbmcgdHJvbmcgdOG7lW5nIHPhu5EgMzgzIGLhu4duaCBuaMOibiwgY8OzIDI0NyBuZ8aw4budaSBjw7Mga2jhu5FpIHUgxJHGoW4g4buVIChVbmktRm9jYWwpLCBjaGnhur9tIMSRYSBz4buRLiBUcm9uZyBraGkgxJHDsywgc+G7kSBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRYSDhu5UgKE11bHRpLUZvY2FsKSBsw6AgMTM2IG5nxrDhu51pLg0KDQpUaeG6v3AgdGhlbywgY2jDum5nIHRhIHPhur0gdMOtbmggdOG7tyBs4buHIHBo4bqnbiB0csSDbSB2w6AgduG6vSBiaeG7g3UgxJHhu5MgdHLDsm4gxJHhu4MgdGjhu4MgaGnhu4duIHLDtSBoxqFuIHPhu7EgY2jDqm5oIGzhu4djaCB24buBIG3hurd0IHTGsMahbmcgxJHhu5FpIGdp4buvYSBoYWkgbmjDs20uDQoNCmBgYHtyfQ0KIyBU4bqhbyBkYXRhZnJhbWUgdOG7qyBi4bqjbmcgdOG6p24gc+G7kQ0KZm9jYWxpdHlfZnJlcSA8LSBhcy5kYXRhLmZyYW1lKHRhYl9mb2NhbGl0eSkNCmNvbG5hbWVzKGZvY2FsaXR5X2ZyZXEpIDwtIGMoIkZvY2FsaXR5IiwgIkZyZXF1ZW5jeSIpDQoNCiMgVMOtbmggcGjhuqduIHRyxINtDQpmb2NhbGl0eV9mcmVxJFBlcmNlbnRhZ2UgPC0gZm9jYWxpdHlfZnJlcSRGcmVxdWVuY3kgLyBzdW0oZm9jYWxpdHlfZnJlcSRGcmVxdWVuY3kpICogMTAwDQoNCiMgVOG6oW8gbmjDo24NCmZvY2FsaXR5X2ZyZXEkTGFiZWwgPC0gcGFzdGUwKHJvdW5kKGZvY2FsaXR5X2ZyZXEkUGVyY2VudGFnZSwgMSksICIlIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KZ2dwbG90KGZvY2FsaXR5X2ZyZXEsIGFlcyh4ID0gIiIsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gRm9jYWxpdHkpKSArDQogIGdlb21fY29sKHdpZHRoID0gMSwgY29sb3IgPSAid2hpdGUiKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBMYWJlbCksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gNSkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgdMOtbmggY2jhuqV0IGPhu6dhIGto4buRaSB1IOG7nyBjw6FjIGLhu4duaCBuaMOibiIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiVW5pLUZvY2FsIiA9ICJraGFraSIsICJNdWx0aS1Gb2NhbCIgPSAib2xpdmVkcmFiIikpDQpgYGANCg0KQmnhu4N1IMSR4buTIHRyw7JuIGNobyB0aOG6pXkgbeG7mXQgY8OhY2ggdHLhu7FjIHF1YW4gcuG6sW5nIG5ow7NtIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJHGoW4g4buVIGNoaeG6v20gxJHhur9uIDY0LjUlIHRyb25nIG3huqt1IG5naGnDqm4gY+G7qXUsIHRyb25nIGtoaSBuaMOzbSBjw7Mga2jhu5FpIHUgxJFhIOG7lSBjaGnhur9tIDM1LjUlLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBraOG7kWkgdSDEkcahbiDhu5UgbMOgIHRyxrDhu51uZyBo4bujcCBwaOG7lSBiaeG6v24gaMahbi4gUGjDom4gdMOtY2ggdGnhur9wIHRoZW8gc+G6vSBsw6BtIHLDtSBsaeG7h3UgxJHhurdjIMSRaeG7g20gbsOgeSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIG5ndXkgY8ahIHTDoWkgcGjDoXQgaGF5IGtow7RuZy4NCg0KIyMjIyAqKjQuMy4yLiBUaOG7kW5nIGvDqiBtw7QgdOG6oyBjaG8gaGFpIGJp4bq/biBGb2NhbGl0eSB2w6Aga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBi4buHbmgqKg0KDQpDaMO6bmcgdGEgc+G6vSBs4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBnaeG7r2EgaGFpIGJp4bq/biBGb2NhbGl0eSB2w6AgUmVjdXJyZWQgxJHhu4MgeGVtIHjDqXQgbeG7kWkgcXVhbiBo4buHIHPGoSBi4buZIGdp4buvYSBjaMO6bmcuDQoNCmBgYHtyfQ0KdGFibGVfdGFpYmVuaF9mb2NhbGl0eSA8LSB0YWJsZShkYXQkRm9jYWxpdHksIGRhdCRSZWN1cnJlZCkNCnRhYmxlX3RhaWJlbmhfZm9jYWxpdHkNCmBgYA0KDQpC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBjaG8gdGjhuqV5Og0KDQogIC0gVHJvbmcgbmjDs20ga2jhu5FpIHUgxJHGoW4g4buVIChVbmktRm9jYWwpOiBjw7MgMjA5IG5nxrDhu51pIGtow7RuZyB0w6FpIHBow6F0IHbDoCAzOCBuZ8aw4budaSB0w6FpIHBow6F0Lg0KICAtIFRyb25nIG5ow7NtIGto4buRaSB1IMSRYSDhu5UgKE11bHRpLUZvY2FsKTogY8OzIDY2IG5nxrDhu51pIGtow7RuZyB0w6FpIHBow6F0IHbDoCA3MCBuZ8aw4budaSB0w6FpIHBow6F0Lg0KDQrEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB0w6xuaCB0cuG6oW5nIGto4buRaSB1IMSRYSDhu5UgY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uIG5ndXkgY8ahIHTDoWkgcGjDoXQgY2FvIGjGoW4gc28gduG7m2kga2jhu5FpIHUgxJHGoW4g4buVLiBUdXkgbmhpw6puLCBj4bqnbiB0aOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIMSR4buDIHjDoWMgxJHhu4tuaCBt4bupYyDEkeG7mSDDvSBuZ2jEqWEgY+G7p2EgbeG7kWkgbGnDqm4gaOG7hyBuw6B5Lg0KDQrEkOG7gyBsw6BtIHLDtSBoxqFuIG5o4bqtbiDEkeG7i25oIHRyw6puLCBjaMO6bmcgdGEgc+G6vSBz4butIGThu6VuZyBiaeG7g3UgxJHhu5MgY+G7mXQgbmjDs20uDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbw0KdGFibGVfdGFpYmVuaF9mb2NhbGl0eSA8LSB0YWJsZShkYXQkRm9jYWxpdHksIGRhdCRSZWN1cnJlZCkNCg0KIyBDaHV54buDbiBi4bqjbmcgY2jDqW8gdGjDoG5oIGRhdGEgZnJhbWUNCmRmX3Bsb3RfZm9jYWxpdHkgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZV90YWliZW5oX2ZvY2FsaXR5KQ0KY29sbmFtZXMoZGZfcGxvdF9mb2NhbGl0eSkgPC0gYygiRm9jYWxpdHkiLCAiUmVjdXJyZWQiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTDQpnZ3Bsb3QoZGZfcGxvdF9mb2NhbGl0eSwgYWVzKHggPSBGb2NhbGl0eSwgeSA9IENvdW50LCBmaWxsID0gUmVjdXJyZWQpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlTDrG5oIHRy4bqhbmcgdMOhaSBi4buHbmggdGhlbyB0w61uaCDEkWEg4buVIGPhu6dhIGto4buRaSB1IiwNCiAgICAgICB4ID0gIlTDrW5oIGNo4bqldCBraOG7kWkgdSAoRm9jYWxpdHkpIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmcgYuG7h25oIG5ow6JuIiwNCiAgICAgICBmaWxsID0gIlTDoWkgYuG7h25oIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJObyIgPSAic2t5Ymx1ZSIsICJZZXMiID0gInNhbG1vbiIpKQ0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IHRy4buxYyBxdWFuIGjDs2EgbeG7mXQgY8OhY2ggcsO1IHLDoG5nIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6MgbsOqdToNCiAgLSDhu54gbmjDs20ga2jhu5FpIHUgxJHGoW4g4buVIChVbmktRm9jYWwpOiBD4buZdCAiS2jDtG5nIHTDoWkgcGjDoXQiIGNhbyBoxqFuIGjhurNuIGPhu5l0ICJUw6FpIHBow6F0Ii4NCiAgLSDhu54gbmjDs20ga2jhu5FpIHUgxJFhIOG7lSAoTXVsdGktRm9jYWwpOiBD4buZdCAiVMOhaSBwaMOhdCIgbOG6oWkgY2FvIGjGoW4gY+G7mXQgIktow7RuZyB0w6FpIHBow6F0Ii4NCiAgDQotIEJp4buDdSDEkeG7kyBj4bunbmcgY+G7kSBt4bqhbmggbeG6vSBnaeG6oyB0aHV54bq/dCBy4bqxbmcgdmnhu4djIGto4buRaSB1IGPDsyB0w61uaCDEkWEg4buVIGxpw6puIHF1YW4gxJHhur9uIG5ndXkgY8ahIHTDoWkgcGjDoXQgY2FvIGjGoW4uIELhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJFhIOG7lSBkxrDhu51uZyBuaMawIGPDsyB04bu3IGzhu4cgdMOhaSBwaMOhdCB0csOqbiA1MCUsIHRyb25nIGtoaSB04bu3IGzhu4cgbsOgeSDhu58gbmfGsOG7nWkgY8OzIGto4buRaSB1IMSRxqFuIOG7lSB0aOG6pXAgaMahbiDEkcOhbmcga+G7gy4NCg0KDQojIyMjICoqNC4zLjMuIFBow6JuIHTDrWNoIFJlbGF0aXZlIFJpc2sgZ2nhu69hIEZvY2FsaXR5IHbDoCBraOG6oyBuxINuZyB0w6FpIGLhu4duaCoqDQoNClRp4bq/cCB0aGVvLCBjaMO6bmcgdGEgdMOtbmggdG/DoW4gTmd1eSBjxqEgdMawxqFuZyDEkeG7kWkgKFJlbGF0aXZlIFJpc2sgLSBSUikgxJHhu4MgxJHhu4tuaCBsxrDhu6NuZyBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSB0w61uaCDEkWEg4buVIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0LiBOaMOzbSBjw7Mga2jhu5FpIHUgxJHGoW4g4buVIHPhur0gxJHGsOG7o2MgY29pIGzDoCBuaMOzbSB0aGFtIGNoaeG6v3UuDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKHRhYmxlX3RhaWJlbmhfZm9jYWxpdHkpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KIEThu7FhIHRyw6puIGLhuqNuZyB04bqnbiBz4buRIMSRw6MgxJHGsOG7o2MgZ2nhuqNpIHRow61jaCByw7Ug4bufIHBo4bqnbiB0csaw4bubYyB0w7RpIHPhur0gdMOtbmggdG/DoW4gUmVsYXRpdmUgUmlzayB0cm9uZyDEkcOzIGJp4bq/biDEkeG7mWMgbOG6rXAgbMOgIHTDrG5oIHRy4bqhbmcga2jhu5FpIHUgdsOgIHBo4bulIHRodeG7mWMgbMOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oLiBOaMOzbSB0aGFtIGNoaeG6v3UgbMOgIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJFhIOG7lSB2w6AgYuG7iyB0w6FpIHBow6F0IGLhu4duaC4gVsOgIG5ow7NtIMSR4buRaSB0xrDhu6NuZyBj4bqnbiBxdWFuIHTDom0gbMOgIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJHGoW4g4buVIHbDoCBi4buLIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLLiANCiBUcsaw4bubYyB0acOqbiBj4bqnbiB0w61uaCB04bu3IGzhu4cgYuG7h25oIG5ow6JuIGPDsyBraMO0aSB1IMSRxqFuIOG7lSB2w6AgYuG7iyB0w6FpIGLhu4duaCB0csOqbiB04buVbmcgc+G7kSBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRxqFuIOG7lS4gU2F1IMSRw7MgbOG6pXkgdOG7tyBs4buHIHbhu6thIHTDrG0gxJHGsOG7o2MgY2hpYSBjaG8gdOG7tyBs4buHIG5ow7NtIHRoYW0gY2hp4bq/dSAoIHThu6ljIGzDoCB04bu3IGzhu4cgYuG7h25oIG5ow6JuIGPDsyBraOG7kWkgdSDEkWEg4buVIHbDoCBi4buLIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLKQ0KDQogTmjhuq1uIHjDqXQ6IEtoaSBwaMOibiB0w61jaCBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRxqFuIOG7lSBi4buLIHTDoWkgYuG7h25oIHNhdSBraGkgxJFp4buBdSB0cuG7iyB0YSB0aOG6pXkgUlIgPSAwLjI5LCBr4bq/dCBxdeG6oyBuw6B5IGNobyBiaeG6v3QgcuG6sW5nIHThu7cgbOG7hyBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRxqFuIOG7lSBi4buLIHTDoWkgYuG7h25oIGNo4buJIGLhurFuZyBraG/huqNuZyAzMCUgc28gduG7m2kgYuG7h25oIG5ow6JuIGPDsyBraOG7kWkgdSDEkWEg4buVIGLhu4sgdMOhaSBwaMOhdCBi4buHbmggc2F1IGtoaSDEkWnhu4F1IHRy4buLIHVuZyB0aMawIGJp4buHdCBow7NhLg0KIA0KKipL4bq/dCBsdeG6rW4gdOG7qyBjw6FjIGtp4buDbSDEkeG7i25oOioqDQoNCnwgRm9jYWxpdHkgICAgICB8IG1pZHAuZXhhY3QgICAgfCBmaXNoZXIuZXhhY3QgIHwgY2hpLnNxdWFyZSAgIHwNCnw6LS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnwNCnwgTXVsdGktRm9jYWwgICB8IE5BICAgICAgICAgICAgfCBOQSAgICAgICAgICAgIHwgTkEgICAgICAgICAgIHwNCnwgVW5pLUZvY2FsICAgICB8IDEuNTllLTEzICAgICAgfCAyLjE5ZS0xMyAgICAgIHwgNS44OGUtMTQgICAgIHwNCg0KROG7sWEgdHLDqm4ga+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggZ2nhu69hIHTDrW5oIGNo4bqldCBraOG7kWkgdSAoRm9jYWxpdHkpIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCwgdGEgdGjhuqV5IHLhurFuZyDhu58gbmjDs20gKipraOG7kWkgdSDEkcahbiDhu5UgKFVuaS1Gb2NhbCkqKiwgY8OhYyBnacOhIHRy4buLIHAgdOG7qyBj4bqjIGJhIHBoxrDGoW5nIHBow6FwIGtp4buDbSDEkeG7i25oIChtaWQtcCBleGFjdDogXCgxLjU5IFx0aW1lcyAxMF57LTEzfVwpLCBGaXNoZXIgZXhhY3Q6IFwoMi4xOSBcdGltZXMgMTBeey0xM31cKSwgdsOgIENoaS1zcXVhcmU6IFwoNS44OCBcdGltZXMgMTBeey0xNH1cKSkgxJHhu4F1IHLhuqV0IG5o4buPLCBuaOG7jyBoxqFuIG5oaeG7gXUgc28gduG7m2kgbmfGsOG7oW5nIMO9IG5naMSpYSAwLjA1LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBt4buRaSBsacOqbiBo4buHIGdp4buvYSB0w61uaCBjaOG6pXQga2jhu5FpIHUgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBOw7NpIGPDoWNoIGtow6FjLCAqKnTDrW5oIMSRYSDhu5UgY+G7p2Ega2jhu5FpIHUgY8OzIHRo4buDIGzDoCBt4buZdCB54bq/dSB04buRIG5ndXkgY8ahIGzDoG0gdMSDbmcga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBi4buHbmggc2F1IMSRaeG7gXUgdHLhu4sqKi4NCg0KDQojIyMjICoqNC4zLjQuIFBow6JuIHTDrWNoIE9kZCBSYXRpbyBnaeG7r2EgRm9jYWxpdHkgdsOgIGto4bqjIG7Eg25nIHTDoWkgYuG7h25oKioNCg0KVMawxqFuZyB04buxLCBjaMO6bmcgdGEgc+G6vSB0w61uaCBU4bu3IHPhu5EgY2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpLg0KDQpgYGB7cn0NCm9kZHNyYXRpbyh0YWJsZV90YWliZW5oX2ZvY2FsaXR5LCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQogS+G6v3QgcXXhuqMgc2F1IGtoaSBwaMOibiB0w61jaCB0YSB0aOG6pXkgdOG7tyBz4buRIGNow6puaCAoT2RkcyByYXRpbykgbMOgIDAuMTcyICh04bu3IGzhu4cgZ2nhu69hIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHbDoCBraMO0bmcgeOG6o3kgcmEpIGPhu6dhIHZp4buHYyB0w6FpIHBow6F0IOG7nyBuaMOzbSBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRYSDhu5UgY2FvIGfhuqVwIDcuMDIgbOG6p24gc28gduG7m2kgIm9kZHMiIHTDoWkgcGjDoXQg4bufIG5ow7NtIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJHGoW4g4buVLg0KDQojIyMjICoqNC4zLjUuIFRo4buRbmcga8OqIHN1eSBkaeG7hW4qKg0KDQpDaMO6bmcgdGEgc+G7rSBk4bulbmcga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIMSR4buDIGtp4buDbSB0cmEgZ2nhuqMgdGh1eeG6v3QgduG7gSB0w61uaCDEkeG7mWMgbOG6rXAgZ2nhu69hIHTDrW5oIMSRYSDhu5UgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQuDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KSOKCgCAoR2nhuqMgdGh1eeG6v3Qga2jDtG5nKTogVMOtbmggY2jhuqV0IGtow7RpIHUgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgbMOgIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wIChraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cpLg0KSOKCgSAoR2nhuqMgdGh1eeG6v3QgxJHhu5FpKTogVMOtbmggY2jhuqV0IGto4buRaSB1IHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGzDoCBoYWkgYmnhur9uIHBo4bulIHRodeG7mWMgKGPDsyBt4buRaSBsacOqbiBo4buHKS4NCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZw0KY2hpc3EudGVzdCh0YWJsZV90YWliZW5oX2ZvY2FsaXR5KQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcgUGVhcnNvbiB24bubaSBoaeG7h3UgY2jhu4luaCBsacOqbiB04bulYyBj4bunYSBZYXRlcyBjaG8gZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBYLXNxdWFyZWQgbMOgIDU0LjY0MiwgduG7m2kgYuG6rWMgdOG7sSBkbyBsw6AgMS4gR2nDoSB0cuG7iyBwLXZhbHVlIHTGsMahbmcg4bupbmcgbMOgIDEuNDQ2ZS0xMywgbeG7mXQgZ2nDoSB0cuG7iyBj4buxYyBr4buzIG5o4buPLg0KRG8gcC12YWx1ZSBuaOG7jyBoxqFuIHLhuqV0IG5oaeG7gXUgc28gduG7m2kgbeG7qWMgw70gbmdoxKlhIHRow7RuZyB0aMaw4budbmcgKM6xID0gMC4wNSksIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIChI4oKAKS4gxJBp4buBdSBuw6B5IGN1bmcgY+G6pXAgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogbeG6oW5oIG3hur0gxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBjw7MgbeG7mXQgbeG7kWkgbGnDqm4gaOG7hyBwaOG7pSB0aHXhu5ljIHLhuqV0IHLDtSByw6BuZyBnaeG7r2Egdmnhu4djIGto4buRaSB1IGzDoCDEkcahbiDhu5UgaGF5IMSRYSDhu5UgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oLg0KDQrEkOG7gyBzbyBzw6FuaCB0cuG7sWMgdGnhur9wIHThu7cgbOG7hyB0w6FpIHBow6F0IGdp4buvYSBoYWkgbmjDs20sIGNow7puZyB0YSB0aeG6v24gaMOgbmgga2nhu4NtIMSR4buLbmggaGnhu4d1IGhhaSB04bu3IGzhu4cuIA0KR+G7jWkgcDEgbMOgIHThu7cgbOG7hyB0w6FpIHBow6F0IOG7nyBuaMOzbSDEkWEg4buVLCBwMiBsw6AgdOG7tyBs4buHIHTDoWkgcGjDoXQg4bufIG5ow7NtIMSRxqFuIOG7lS4NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQpI4oKAOiBwMSAtIHAyID0gMCAoVOG7tyBs4buHIHTDoWkgcGjDoXQg4bufIGhhaSBuaMOzbSBsw6AgbmjGsCBuaGF1KS4NCkjigoE6IHAxIC0gcDIgPiAwIChU4bu3IGzhu4cgdMOhaSBwaMOhdCDhu58gbmjDs20gxJFhIOG7lSBjYW8gaMahbiBuaMOzbSDEkcahbiDhu5UpLg0KDQoNCmBgYHtyfQ0KIyBT4buRIGNhIHTDoWkgcGjDoXQg4bufIG5ow7NtIMSRYSDhu5UgdsOgIMSRxqFuIOG7lQ0Kc3VjY2Vzc19mb2NhbGl0eSA8LSBjKDcwLCAzOCkNCg0KIyBU4buVbmcgc+G7kSBi4buHbmggbmjDom4gdHJvbmcgbeG7l2kgbmjDs20NCm5fZm9jYWxpdHkgPC0gYygxMzYsIDI0NykNCg0KIyBLaeG7g20gxJHhu4tuaCBoaeG7h3UgdOG7tyBs4buHIG3hu5l0IHBow61hDQpwcm9wLnRlc3Qoc3VjY2Vzc19mb2NhbGl0eSwgbl9mb2NhbGl0eSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIGNvcnJlY3QgPSBGQUxTRSkNCmBgYA0KDQotIEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGhhaSB04bu3IGzhu4cgY2hvIHRo4bqleSAqKnThu7cgbOG7hyB0w6FpIHBow6F0IOG7nyBuaMOzbSBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRYSDhu5UgKHDigoEgPSA1MS40NyUpIGNhbyBoxqFuIHLDtSBy4buHdCBzbyB24bubaSBuaMOzbSBjw7Mga2jhu5FpIHUgxJHGoW4g4buVIChw4oKCID0gMTUuMzglKSoqLiBHacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKFwocCA9IDIuOTQgXHRpbWVzIDEwXnstMTR9XCkpIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNCi0gRG8gxJHDsywgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKAIHbDoCBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyB0w6FpIHBow6F0IOG7nyBuaMOzbSDEkWEg4buVIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5ow7NtIMSRxqFuIOG7lSwgY2hvIHRo4bqleSB0w61uaCDEkWEg4buVIGPhu6dhIGto4buRaSB1IGzDoCB54bq/dSB04buRIG5ndXkgY8ahIHRp4buBbSB0w6BuZyBsw6BtIHTEg25nIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIHNhdSDEkWnhu4F1IHRy4buLLg0KDQoNCiMjIyMgKio0LjMuNi4gTcO0IGjDrG5oIGjhu5NpIHF1eSBjaG8gZOG7ryBsaeG7h3Ugbmjhu4sgcGjDom4qKg0KDQojIyMjIyAqKjQuMy42LjEuIE3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCoqDQoNCkNow7puZyB0YSB4w6J5IGThu7FuZyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHhu4MgeGVtIHjDqXQg4bqjbmggaMaw4bufbmcgY+G7p2EgdMOtbmggY2jhuqV0IGto4buRaSB1IMSR4bq/biB4w6FjIHN14bqldCB0w6FpIHBow6F0Lg0KDQoNCmBgYHtyfQ0KIyBCaeG6v24gbmjhu4sgcGjDom4gUmVjdXJyZWRfYmluIMSRw6MgxJHGsOG7o2MgdOG6oW8g4bufIHBo4bqnbiB0csaw4bubYw0KUmVjdXJyZWRfYmluIDwtIGlmZWxzZShkYXQkUmVjdXJyZWQgPT0gIlllcyIsIDEsIDApDQoNCiMgWMOieSBk4buxbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oDQpocXR0X21vZGVsX2ZvY2FsaXR5IDwtIGdsbShSZWN1cnJlZF9iaW4gfiBGb2NhbGl0eSwgZGF0YSA9IGRhdCkNCg0KIyBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnN1bW1hcnkoaHF0dF9tb2RlbF9mb2NhbGl0eSkNCmBgYA0KDQpL4bq/dCBxdeG6oyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggY2hvIHRo4bqleSBiaeG6v24gYEZvY2FsaXR5YCBjw7Mg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oLiBI4buHIHPhu5EgxrDhu5tjIGzGsOG7o25nIGPhu6dhIG5ow7NtICoqa2jhu5FpIHUgxJHGoW4g4buVIChVbmktRm9jYWwpKiogbMOgIFwoLTAuMzYwODZcKSwgduG7m2kgZ2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPIDwgNSUsIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgMC4wNS4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgICoqYuG7h25oIG5ow6JuIGPDsyBraOG7kWkgdSDEkcahbiDhu5UgY8OzIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIHRo4bqlcCBoxqFuIHNvIHbhu5tpIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJFhIOG7lSoqLCBraGkgZ2nhu68gY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWkuDQoNCkjhu4cgc+G7kSDDom0gY2hvIHRo4bqleSB4dSBoxrDhu5tuZyBnaeG6o20gY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgKFJlY3VycmVkX2JpbiwgZOG6oW5nIG5o4buLIHBow6JuKSDhu58gbmjDs20gVW5pLUZvY2FsLiBHacOhIHRy4buLIEFJQyBj4bunYSBtw7QgaMOsbmggbMOgICoqNDIwLjE3KiosIGNobyB0aOG6pXkgxJHhu5kgcGjDuSBo4bujcCBraMOhIHThu5F0IHbhu5tpIGThu68gbGnhu4d1IG5o4buLIHBow6JuLg0KDQpUw7NtIGzhuqFpLCAqKkZvY2FsaXR5IGzDoCBt4buZdCB54bq/dSB04buRIGThu7EgYsOhbyBxdWFuIHRy4buNbmcqKiB0cm9uZyBtw7QgaMOsbmgsIHbDoCBi4buHbmggbmjDom4gY8OzICoqa2jhu5FpIHUgxJFhIOG7lSAoTXVsdGktRm9jYWwpKiogY8OzIG5ndXkgY8ahIHTDoWkgcGjDoXQgYuG7h25oIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJHGoW4g4buVLg0KDQoNCiMjIyMjICoqNC4zLjYuMi4gTcO0IGjDrG5oIExvZ2l0KioNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSBMb2dpc3RpYyDEkcaw4bujYyDDoXAgZOG7pW5nIMSR4buDIG3DtCBow6xuaCBow7NhIGxvZyBj4bunYSB04bu3IHPhu5EgY2jDqm5oIChsb2ctb2RkcykgY+G7p2Egdmnhu4djIHTDoWkgcGjDoXQuDQoNCmBgYHtyfQ0KIyBNw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIHbhu5tpIGJp4bq/biBGb2NhbGl0eQ0KbW9kZWxfbG9naXRfZm9jYWxpdHkgPC0gZ2xtKFJlY3VycmVkX2JpbiB+IEZvY2FsaXR5LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksIGRhdGEgPSBkYXQpDQoNCiMgWGVtIGvhur90IHF14bqjDQpzdW1tYXJ5KG1vZGVsX2xvZ2l0X2ZvY2FsaXR5KQ0KYGBgDQoNCmBgYHtyfQ0KZXhwKGNvZWYobW9kZWxfbG9naXRfZm9jYWxpdHkpKQ0KYGBgDQoNCg0KROG7sWEgdHLDqm4ga+G6v3QgcXXhuqMsIHBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgbG9naXN0aWMgxrDhu5tjIGzGsOG7o25nIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIChSZWN1cnJlZF9iaW4pIHRoZW8gxJHhurdjIMSRaeG7g20ga2jhu5FpIHUgKEZvY2FsaXR5KSBuaMawIHNhdToNCg0KXFsNClxsb2dcbGVmdCggXGZyYWN7UChcdGV4dHtUw6FpIHBow6F0fSl9ezEgLSBQKFx0ZXh0e1TDoWkgcGjDoXR9KX0gXHJpZ2h0KSA9IDAuMDU4ODQgLSAxLjc2MzU5IFx0aW1lcyBcdGV4dHtGb2NhbGl0eX1fe1x0ZXh0e1VuaS1Gb2NhbH19DQpcXQ0KDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KSOG7hyBz4buRIGjhu5NpIHF1eSBcKC0xLjc2MzU5XCkgY2hvIG5ow7NtICoqa2jhu5FpIHUgxJHGoW4g4buVIChVbmktRm9jYWwpKiogY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8gKHAtdmFsdWUg4omIIFwoNy42MSBcdGltZXMgMTBeey0xM31cKSksIGNobyB0aOG6pXkgKipz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIGdp4buvYSBoYWkgbmjDs20qKi4gQ+G7pSB0aOG7gywga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBi4buHbmgg4bufIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJHGoW4g4buVICoqdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MqKiBzbyB24bubaSBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRYSDhu5UuDQoNCkdpw6EgdHLhu4sgQUlDID0gKio0MDQuNSoqIGNobyB0aOG6pXkgbcO0IGjDrG5oIGPDsyDEkeG7mSBwaMO5IGjhu6NwIHThu5F0Lg0KDQpOZ2/DoGkgcmEsIGjhu4cgc+G7kSDDom0gY+G7p2EgYmnhur9uIFVuaS1Gb2NhbCBjaG8gYmnhur90ICoqdMOsbmggdHLhuqFuZyDEkcahbiDhu5UgZ2nDunAgZ2nhuqNtIGxvZy1vZGRzIGPhu6dhIHZp4buHYyB0w6FpIHBow6F0KiosIHTGsMahbmcgxJHGsMahbmcgduG7m2kgdmnhu4djIGdp4bqjbSB4w6FjIHN14bqldCB0w6FpIGLhu4duaC4gS2hpIGzhuqV5IFwoZV57LTEuNzYzNTl9IOKJiCAwLjE3MlwpLCB0YSBjw7MgdGjhu4MgaGnhu4N1IHLhurFuZyAqKmto4buRaSB1IMSRxqFuIOG7lSBsw6BtIGdp4bqjbSBraG/huqNuZyA4Mi44JSBvZGRzIHTDoWkgYuG7h25oIHNvIHbhu5tpIGto4buRaSB1IMSRYSDhu5UqKi4NCg0KIyMjIyMgKio0LjMuNi4zLiBNw7QgaMOsbmggUHJvYml0KioNCg0KYGBge3J9DQojIE3DtCBow6xuaCBQcm9iaXQgduG7m2kgYmnhur9uIEZvY2FsaXR5DQpwcm9iaXRfbW9kZWxfZm9jYWxpdHkgPC0gZ2xtKFJlY3VycmVkX2JpbiB+IEZvY2FsaXR5LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpLCBkYXRhID0gZGF0KQ0KDQojIFhlbSBr4bq/dCBxdeG6oyBtw7QgaMOsbmgNCnN1bW1hcnkocHJvYml0X21vZGVsX2ZvY2FsaXR5KQ0KYGBgDQoNClBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgUHJvYml0IMaw4bubYyBsxrDhu6NuZyB4w6FjIHN14bqldCB0w6FpIHBow6F0IGLhu4duaCB0dXnhur9uIGdpw6FwIHRoZW8gxJHhurdjIMSRaeG7g20ga2jhu5FpIHUgbmjGsCBzYXU6DQoNClxbDQpcUGhpXnstMX0oUChcdGV4dHtUw6FpIHBow6F0fSkpID0gMC4wMzY4NyAtIDEuMDU2OTUgXHRpbWVzIFx0ZXh0e0ZvY2FsaXR5fV97XHRleHR7VW5pLUZvY2FsfX0NClxdDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBiaeG6v24gKipGb2NhbGl0eVVuaS1Gb2NhbCoqIGPDsyBo4buHIHPhu5Egw6JtIGzhu5tuICgtMS4wNTY5NSkgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogcuG6pXQgY2FvIChwLXZhbHVlIOKJiCBcKDIuNzUgXHRpbWVzIDEwXnstMTN9XCkpLiDEkGnhu4F1IG7DoHkgY2jhu4kgcmEgcuG6sW5nOg0KDQotICoqQuG7h25oIG5ow6JuIGPDsyBraOG7kWkgdSDEkcahbiDhu5UgY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgYuG7h25oIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDKiogc28gduG7m2kgYuG7h25oIG5ow6JuIGPDsyBraOG7kWkgdSDEkWEg4buVLg0KLSBN4bq3YyBkw7kgaOG7hyBz4buRIHRyb25nIG3DtCBow6xuaCBQcm9iaXQga2jDtG5nIGRp4buFbiBnaeG6o2kgdHLhu7FjIHRp4bq/cCBuaMawIG3DtCBow6xuaCBsb2dpc3RpYywgbmjGsG5nIGThuqV1IMOibSB2w6AgxJHhu5kgbOG7m24gY+G7p2EgaOG7hyBz4buRIGPFqW5nIHBo4bqjbiDDoW5oIG3hu5FpIHF1YW4gaOG7hyBuZ2jhu4tjaCBjaGnhu4F1IHbDoCBt4bqhbmguDQoNCkdpw6EgdHLhu4sgQUlDID0gKio0MDQuNSoqIHTGsMahbmcgxJHGsMahbmcgduG7m2kgbcO0IGjDrG5oIGxvZ2lzdGljLCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIHBow7kgaOG7o3AgbcO0IGjDrG5oIGzDoCB0xrDGoW5nIMSRxrDGoW5nIHbDoCB04buRdC4NCg0KDQojIyMjIyAqKjQuMy42LjQuIE3DtCBow6xuaCBjbG9nbG9nKioNCg0KYGBge3J9DQojIE3DtCBow6xuaCBjbG9nbG9nIHbhu5tpIGJp4bq/biBGb2NhbGl0eQ0KY2xvZ2xvZ19tb2RlbF9mb2NhbGl0eSA8LSBnbG0oUmVjdXJyZWRfYmluIH4gRm9jYWxpdHksIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpLCBkYXRhID0gZGF0KQ0KDQojIFhlbSBr4bq/dCBxdeG6oyBtw7QgaMOsbmgNCnN1bW1hcnkoY2xvZ2xvZ19tb2RlbF9mb2NhbGl0eSkNCmBgYA0KDQpQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IENsb2dsb2cgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIG5oxrAgc2F1Og0KDQpcWw0KXGxvZygtXGxvZygxIC0gUChcdGV4dHtUw6FpIHBow6F0fSkpKSA9IC0wLjMyNDMgLSAxLjQ2NTEgXHRpbWVzIFx0ZXh0e0ZvY2FsaXR5fV97XHRleHR7VW5pLUZvY2FsfX0NClxdDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIEJp4bq/biAqKkZvY2FsaXR5VW5pLUZvY2FsKiogY8OzIGjhu4cgc+G7kSDDom0gbOG7m24gKiooLTEuNDY1MSkqKiB2w6AgcuG6pXQgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiAoKipwIDwgMC4wMDEqKiksIGNobyB0aOG6pXkgYuG7h25oIG5ow6JuIGPDsyAqKmto4buRaSB1IMSRxqFuIOG7lSBjw7MgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmggdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MqKiBzbyB24bubaSBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRYSDhu5UuDQotIEdpw6EgdHLhu4sgKipBSUMgPSA0MDQuNSoqLCB0xrDGoW5nIMSRxrDGoW5nIHbhu5tpIG3DtCBow6xuaCAqKmxvZ2lzdGljKiogdsOgICoqcHJvYml0KiosIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCBtw7QgaMOsbmggbMOgIHTGsMahbmcgxJHGsMahbmcuDQotIE3DtCBow6xuaCBDbG9nbG9nIMSR4bq3YyBiaeG7h3QgcGjDuSBo4bujcCBraGkgeMOhYyBzdeG6pXQgeOG6o3kgcmEgYmnhur9uIHBo4bulIHRodeG7mWMgbMOgICoqdGjhuqVwIGhv4bq3YyBy4bqldCBjYW8qKiwgdsOsIHbhuq15IGPDsyB0aOG7gyBo4buvdSDDrWNoIG7hur91IHTDoWkgcGjDoXQgbMOgIGhp4buHbiB0xrDhu6NuZyBoaeG6v20uDQoNCiMjIyMgKio0LjMuNy4gxJDDoW5oIGdpw6EgbcO0IGjDrG5oKioNCg0KKipC4bqjbmcgdOG7lW5nIGjhu6NwIDQgbcO0IGjDrG5oKioNCg0KYGBge3J9DQoNCmBgYA0KDQoNCioqQuG6o25nIHThu5VuZyBo4bujcCA0IG3DtCBow6xuaCoqDQoNCnwgTcO0IGjDrG5oICAgICAgICAgICAgICAgICAgICAgICAgfCBI4buHIHPhu5EgKEVzdGltYXRlKSB8IFAtdmFsdWUgICAgICAgIHwgQUlDICAgICB8IERp4buFbiBnaeG6o2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgSOG7k2kgcXV5IHR1eeG6v24gdMOtbmggKExpbmVhcikgICB8IC0wLjM2MSAgICAgICAgICAgfCA2LjllLTE1ICoqKiAgICB8IDQyMC4xNyAgfCBTYWkgc+G7kSBiw6xuaCBwaMawxqFuZyBuaOG7jyBuaOG6pXQsIGtow7RuZyBwaMO5IGjhu6NwIHbhu5tpIGJp4bq/biBwaOG7pSB0aHXhu5ljIG5o4buLIHBow6JuIHwNCnwgTG9naXN0aWMgcmVncmVzc2lvbiAobG9naXQpICAgfCAtMS43NjQgICAgICAgICAgIHwgNy42MWUtMTMgKioqICAgfCA0MDQuNSAgIHwgUGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSBuaOG7iyBwaMOibiwgZOG7hSBkaeG7hW4gZ2nhuqNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBQcm9iaXQgcmVncmVzc2lvbiAgICAgICAgICAgICB8IC0xLjA1NyAgICAgICAgICAgfCAyLjc1ZS0xMyAqKiogICB8IDQwNC41ICAgfCBHaeG6oyDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluLCB0xrDGoW5nIHThu7EgbG9naXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgQ29tcGxlbWVudGFyeSBsb2ctbG9nIChjbG9nbG9nKSB8IC0xLjQ2NSAgICAgICAgIHwgNS42MWUtMTMgKioqICAgfCA0MDQuNSAgIHwgVGjDrWNoIGjhu6NwIGNobyBk4buvIGxp4buHdSBoaeG6v20gZ+G6t3AgKHNrZXdlZCksIHLhu6dpIHJvIHRo4bqlcCAgICAgICAgICAgICAgICAgICAgfA0KDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIFThuqV0IGPhuqMgY8OhYyBtw7QgaMOsbmggKExpbmVhciwgTG9naXQsIFByb2JpdCwgQ2xvZ2xvZykgxJHhu4F1IGNobyB0aOG6pXkgYmnhur9uIEZvY2FsaXR5VW5pLUZvY2FsIGPDsyDhuqNuaCBoxrDhu59uZyDDom0gdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogY2FvIChwIDwgMC4wMDEpIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaC4NCg0KICAtIExpbmVhcjogSOG7hyBz4buRIMOibSwgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBuaMawbmcga2jDtG5nIHBow7kgaOG7o3AgdsOsIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBuaOG7iyBwaMOibi4NCg0KICAtIExvZ2l0OiBI4buHIHPhu5EgLTEuNzYsIHBow7kgaOG7o3AgbmjhuqV0IGNobyBk4buvIGxp4buHdSBuaOG7iyBwaMOibiwgQUlDIHRo4bqlcCDihpIgbMOgIGzhu7FhIGNo4buNbiB04buRaSDGsHUuDQoNCiAgLSBQcm9iaXQ6IEvhur90IHF14bqjIHTGsMahbmcgdOG7sSBsb2dpdCwgQUlDIGLhurFuZyBuaGF1IOKGkiBjw7MgdGjhu4MgdGhheSB0aOG6vyBsb2dpdC4NCg0KICAtIENsb2dsb2c6IFBow7kgaOG7o3AgbuG6v3UgdMOhaSBwaMOhdCBsw6Agc+G7sSBraeG7h24gaGnhur9tLCBjxaluZyBjaG8ga+G6v3QgcXXhuqMgbeG6oW5oIG3hur0uDQoNCg0KIyMjICoqNC40LiBL4bq/dCBxdeG6oyDEkcOhcCDhu6luZyBzYXUgxJFp4buBdSB0cuG7iyB0w6FjIMSR4buZbmcgxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oKioNCg0KVHJvbmcgcGjhuqduIG7DoHksIGNow7puZyB0YSBz4bq9IHBow6JuIHTDrWNoIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIGPhu6dhIGLhu4duaCBuaMOibiBzYXUgxJFp4buBdSB0cuG7iyB2w6Aga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhLiBCaeG6v24gxJHhu5ljIGzhuq1wIGzDoCBSZXNwb25zZSAoduG7m2kgNCBt4bupYyDEkeG7mTogRXhjZWxsZW50LCBJbmRldGVybWluYXRlLCBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlLCBTdHJ1Y3R1cmFsIEluY29tcGxldGUpIHbDoCBiaeG6v24gcGjhu6UgdGh14buZYyBsw6AgUmVjdXJyZWQgKGPDsyBob+G6t2Mga2jDtG5nIHTDoWkgcGjDoXQpLg0KDQojIyMjICoqNC40LjEgQuG6o25nIHThuqduIHPhu5EgLSB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBSZXNwb25zZSoqDQoNCsSQ4bqndSB0acOqbiwgY2jDum5nIHRhIHPhur0gbOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2hvIGJp4bq/biBSZXNwb25zZSDEkeG7gyBoaeG7g3UgcsO1IHPhu7EgcGjDom4gYuG7kSBj4bunYSBjw6FjIG5ow7NtIGLhu4duaCBuaMOibiB0aGVvIG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4suDQoNCmBgYHtyfQ0KdGFiX3Jlc3BvbnNlIDwtIHRhYmxlKGRhdCRSZXNwb25zZSkNCnRhYl9yZXNwb25zZQ0KYGBgDQoNCkvhur90IHF14bqjIHRyw6puIHPhur0gxJHGsOG7o2MgdHLhu7FjIHF1YW4gaMOzYSBi4bqxbmcgYmnhu4N1IMSR4buTIGPhu5l0IMSR4buDIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcgZ2nhu69hIGPDoWMgbmjDs20uDQoNCmBgYHtyfQ0KYmFycGxvdCh0YWJfcmVzcG9uc2UsDQogICAgICAgIG1haW4gPSAiQmnhu4N1IMSR4buTIHThuqduIHPhu5EgxJHDoXAg4bupbmcgc2F1IMSRaeG7gXUgdHLhu4siLA0KICAgICAgICB4bGFiID0gIk3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIiwNCiAgICAgICAgeWxhYiA9ICJU4bqnbiBz4buRIiwNCiAgICAgICAgY29sID0gYygic2t5Ymx1ZSIsICJsaWdodGdyZWVuIiwgImxpZ2h0Y29yYWwiLCAicGx1bSIpLA0KICAgICAgICBib3JkZXIgPSAid2hpdGUiLA0KICAgICAgICB5bGltID0gYygwLCBtYXgodGFiX3Jlc3BvbnNlKSArIDQwKSkgLT4gYnBfcmVzcG9uc2UNCg0KdGV4dCh4ID0gYnBfcmVzcG9uc2UsIHkgPSB0YWJfcmVzcG9uc2UgKyAxNSwgbGFiZWxzID0gdGFiX3Jlc3BvbnNlKQ0KYGBgDQoNCioqQuG6o25nIGThu4tjaCB0aHXhuq10KioNCg0KfCBN4bupYyDEkeG7mSDEkcOhcCDhu6luZyAodGnhur9uZyBBbmgpICAgICB8IFRp4bq/bmcgVmnhu4d0IHTGsMahbmcg4bupbmcgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBFeGNlbGxlbnQgICAgICAgICAgICAgICAgICAgICB8IMSQw6FwIOG7qW5nIHh14bqldCBz4bqvYyAgICAgICAgICAgICAgIHwNCnwgQmlvY2hlbWljYWwgSW5jb21wbGV0ZSAgICAgICAgfCBLaMO0bmcgaG/DoG4gdG/DoG4gc2luaCBow7NhICAgICAgIHwNCnwgU3RydWN0dXJhbCBJbmNvbXBsZXRlICAgICAgICAgfCBLaMO0bmcgaG/DoG4gdG/DoG4gY+G6pXUgdHLDumMgICAgICAgfA0KfCBJbmRldGVybWluYXRlICAgICAgICAgICAgICAgICB8IEtow7RuZyB4w6FjIMSR4buLbmggICAgICAgICAgICAgICAgIHwNCg0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBUaMO0bmcgcXVhIGLhuqNuZyB04bqnbiBz4buRIHbDoCBiaeG7g3UgxJHhu5MsIHRhIHRo4bqleSBy4bqxbmcgdHJvbmcgdOG7lW5nIHPhu5EgMzgzIGLhu4duaCBuaMOibjoNCg0KICAtIEV4Y2VsbGVudCAoxJDDoXAg4bupbmcgeHXhuqV0IHPhuq9jKTogMjA4IGLhu4duaCBuaMOibiwgY2hp4bq/bSDEkWEgc+G7kS4NCiAgLSBJbmRldGVybWluYXRlICjEkMOhcCDhu6luZyBraMO0bmcgeMOhYyDEkeG7i25oKTogNjEgYuG7h25oIG5ow6JuLg0KICAtIEJpb2NoZW1pY2FsIEluY29tcGxldGUgKEtow7RuZyBob8OgbiB0b8OgbiB24buBIG3hurd0IHNpbmggaMOzYSk6IDIzIGLhu4duaCBuaMOibi4NCiAgLSBTdHJ1Y3R1cmFsIEluY29tcGxldGUgKEtow7RuZyBob8OgbiB0b8OgbiB24buBIG3hurd0IGPhuqV1IHRyw7pjKTogOTEgYuG7h25oIG5ow6JuLg0KICANClRp4bq/cCB0aGVvLCBjaMO6bmcgdGEgc+G6vSB0w61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtIHbDoCB24bq9IGJp4buDdSDEkeG7kyB0csOybiDEkeG7gyB0aOG7gyBoaeG7h24gcsO1IGjGoW4gc+G7sSBwaMOibiBi4buRIHTGsMahbmcgxJHhu5FpIGdp4buvYSBjw6FjIG5ow7NtLg0KDQoNCmBgYHtyfQ0KIyBU4bqhbyBkYXRhZnJhbWUgdOG7qyBi4bqjbmcgdOG6p24gc+G7kQ0KcmVzcG9uc2VfZnJlcSA8LSBhcy5kYXRhLmZyYW1lKHRhYl9yZXNwb25zZSkNCmNvbG5hbWVzKHJlc3BvbnNlX2ZyZXEpIDwtIGMoIlJlc3BvbnNlIiwgIkZyZXF1ZW5jeSIpDQoNCiMgVMOtbmggcGjhuqduIHRyxINtDQpyZXNwb25zZV9mcmVxJFBlcmNlbnRhZ2UgPC0gcmVzcG9uc2VfZnJlcSRGcmVxdWVuY3kgLyBzdW0ocmVzcG9uc2VfZnJlcSRGcmVxdWVuY3kpICogMTAwDQoNCiMgVOG6oW8gbmjDo24NCnJlc3BvbnNlX2ZyZXEkTGFiZWwgPC0gcGFzdGUwKHJvdW5kKHJlc3BvbnNlX2ZyZXEkUGVyY2VudGFnZSwgMSksICIlIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KZ2dwbG90KHJlc3BvbnNlX2ZyZXEsIGFlcyh4ID0gIiIsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gUmVzcG9uc2UpKSArDQogIGdlb21fY29sKHdpZHRoID0gMSwgY29sb3IgPSAid2hpdGUiKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBMYWJlbCksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gNCkgKw0KICBsYWJzKHRpdGxlID0gIlBow6JuIGLhu5EgY8OhYyBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLIGPhu6dhIGLhu4duaCBuaMOibiIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikNCmBgYA0KDQpCaeG7g3UgxJHhu5MgaMOsbmggdHLDsm4gdGjhu4MgaGnhu4duIHLDtSBz4buxIHBow6JuIGLhu5EgY8OhYyBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLIHNhdSDEkWnhu4F1IHRy4buLIGPhu6dhIGLhu4duaCBuaMOibiB1bmcgdGjGsCB0dXnhur9uIGdpw6FwLiBUcm9uZyDEkcOzOg0KDQogIC0gxJDDoXAg4bupbmcgeHXhuqV0IHPhuq9jIChFeGNlbGxlbnQpIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgduG7m2kgNTQuMyUsIGNobyB0aOG6pXkgaMahbiBt4buZdCBu4butYSBz4buRIGLhu4duaCBuaMOibiBjw7MgcGjhuqNuIOG7qW5nIMSRaeG7gXUgdHLhu4sgcuG6pXQgdOG7kXQuDQoNCiAgLSBLaMO0bmcgaG/DoG4gdG/DoG4gY+G6pXUgdHLDumMgKFN0cnVjdHVyYWwgSW5jb21wbGV0ZSkgY2hp4bq/bSAyMy44JSwgbMOgIG5ow7NtIGPDsyB0acOqbiBsxrDhu6NuZyBrw6ltIGjGoW4gZG8gY8OybiB04buVbiB0aMawxqFuZyB0csOqbiBow6xuaCDhuqNuaCBo4buNYy4NCg0KICAtIEtow7RuZyB4w6FjIMSR4buLbmggKEluZGV0ZXJtaW5hdGUpIGNoaeG6v20gMTUuOSUsIGzDoCBuaMOzbSBj4bqnbiB0aGVvIGTDtWkgdGjDqm0gxJHhu4MgeMOhYyDEkeG7i25oIHLDtSB4dSBoxrDhu5tuZyBi4buHbmguDQoNCiAgLSBLaMO0bmcgaG/DoG4gdG/DoG4gc2luaCBow7NhIChCaW9jaGVtaWNhbCBJbmNvbXBsZXRlKSBjaGnhur9tIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0IHbhu5tpIDYlLCBjaG8gdGjhuqV5IGNo4buJIG3hu5l0IHPhu5Egw610IGLhu4duaCBuaMOibiBjw7MgYuG6pXQgdGjGsOG7nW5nIHbhu4EgY2jhu4kgc+G7kSBzaW5oIGjDs2Egc2F1IMSRaeG7gXUgdHLhu4suDQoNCk5ow6xuIGNodW5nLCDEkWEgc+G7kSBi4buHbmggbmjDom4gY8OzIMSRw6FwIOG7qW5nIHTDrWNoIGPhu7FjLCB0dXkgbmhpw6puIHbhuqtuIGPDsm4ga2hv4bqjbmcgNDUuNyUgYuG7h25oIG5ow6JuIGNoxrBhIMSR4bqhdCBt4bupYyDEkcOhcCDhu6luZyBob8OgbiB0b8OgbiwgdHJvbmcgxJHDsyBt4buZdCBwaOG6p24gxJHDoW5nIGvhu4MgbMOgIGPDsyB04buVbiB0aMawxqFuZyBj4bqldSB0csO6Yy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgY+G6p24gdGnhur9wIHThu6VjIHRoZW8gZMO1aSBzw6F0IHbDoCDEkWnhu4F1IHRy4buLIGLhu5Ugc3VuZyDEkeG7kWkgduG7m2kgbmjDs20gY2jGsGEgxJHDoXAg4bupbmcgdOG7kXQuDQoNCiMjIyMgKio0LjQuMi4gVGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGhhaSBiaeG6v24gUmVzcG9uc2UgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oKioNCg0KQ2jDum5nIHRhIHPhur0gbOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIGhhaSBiaeG6v24gUmVzcG9uc2UgdsOgIFJlY3VycmVkIMSR4buDIHhlbSB4w6l0IG3hu5FpIHF1YW4gaOG7hyBzxqEgYuG7mSBnaeG7r2EgY2jDum5nLg0KDQpgYGB7cn0NCiMgQuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIHbDoCB0w6FpIHBow6F0DQp0YWJsZV90YWliZW5oX3Jlc3BvbnNlIDwtIHRhYmxlKGRhdCRSZXNwb25zZSwgZGF0JFJlY3VycmVkKQ0KDQojIFRow6ptIGjDoG5nIHbDoCBj4buZdCB04buVbmcNCmFkZG1hcmdpbnModGFibGVfdGFpYmVuaF9yZXNwb25zZSkNCmBgYA0KDQotIEV4Y2VsbGVudDogMjA4IGLhu4duaCBuaMOibiwgY2jhu4kgMSBjYSB0w6FpIHBow6F0IOKGkiBuZ3V5IGPGoSB0aOG6pXAuDQoNCi0gQmlvY2hlbWljYWwgSW5jb21wbGV0ZTogMjMgYuG7h25oIG5ow6JuLCAxMSBjYSB0w6FpIHBow6F0IOKGkiBuZ3V5IGPGoSBjYW8uDQoNCi0gSW5kZXRlcm1pbmF0ZTogNjEgYuG7h25oIG5ow6JuLCA3IGNhIHTDoWkgcGjDoXQg4oaSIG5ndXkgY8ahIHRydW5nIGLDrG5oLg0KDQotIFN0cnVjdHVyYWwgSW5jb21wbGV0ZTogOTEgYuG7h25oIG5ow6JuLCA4OSBjYSB0w6FpIHBow6F0IOKGkiBuZ3V5IGPGoSBy4bqldCBjYW8uDQoNCioqS+G6v3QgbHXhuq1uOioqIE3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4sgbGnDqm4gcXVhbiByw7UgcuG7h3QgxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQuIMSQw6FwIOG7qW5nIGPDoG5nIGvDqW0sIG5ndXkgY8ahIHTDoWkgcGjDoXQgY8OgbmcgY2FvLg0KDQoNCsSQ4buDIGzDoG0gcsO1IGjGoW4gbmjhuq1uIMSR4buLbmggdHLDqm4sIGNow7puZyB0YSBz4bq9IHPhu60gZOG7pW5nIGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbS4NCg0KYGBge3J9DQojIENodXnhu4NuIGLhuqNuZyBjaMOpbyB0aMOgbmggZGF0YSBmcmFtZQ0KZGZfcGxvdF9yZXNwb25zZSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlX3RhaWJlbmhfcmVzcG9uc2UpDQpjb2xuYW1lcyhkZl9wbG90X3Jlc3BvbnNlKSA8LSBjKCJSZXNwb25zZSIsICJSZWN1cnJlZCIsICJDb3VudCIpDQoNCiMgxJDhuqNtIGLhuqNvIHRo4bupIHThu7EgbeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgdGhlbyBsw6JtIHPDoG5nDQpkZl9wbG90X3Jlc3BvbnNlJFJlc3BvbnNlIDwtIGZhY3RvcihkZl9wbG90X3Jlc3BvbnNlJFJlc3BvbnNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRXhjZWxsZW50IiwgIkJpb2NoZW1pY2FsIEluY29tcGxldGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZGV0ZXJtaW5hdGUiLCAiU3RydWN0dXJhbCBJbmNvbXBsZXRlIikpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgdOG7tyBs4buHDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGZfcGxvdF9yZXNwb25zZSwgYWVzKHggPSBSZXNwb25zZSwgeSA9IENvdW50LCBmaWxsID0gUmVjdXJyZWQpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImZpbGwiKSArICAjIHThu7cgbOG7hyBwaOG6p24gdHLEg20gdGhlbyBj4buZdA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk5vIiA9ICJsaWdodGJsdWUiLCAiWWVzIiA9ICJwaW5rIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyB0w6FpIHBow6F0IiwgIlTDoWkgcGjDoXQiKSkgKw0KICBsYWJzKHRpdGxlID0gIlThu7cgbOG7hyB0w6FpIHBow6F0IHRoZW8gbeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgxJFp4buBdSB0cuG7iyIsDQogICAgICAgeCA9ICJN4bupYyDEkeG7mSDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLIiwNCiAgICAgICB5ID0gIlThu7cgbOG7hyAoJSkiLA0KICAgICAgIGZpbGwgPSAiVMOsbmggdHLhuqFuZyB0w6FpIHBow6F0IikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLSBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSB04bu3IGzhu4cgdMOhaSBwaMOhdCBi4buHbmggdMSDbmcgZOG6p24gdGhlbyBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLLiBD4bulIHRo4buDOg0KDQogIC0gTmjDs20gRXhjZWxsZW50IGfhuqduIG5oxrAga2jDtG5nIHTDoWkgcGjDoXQgKGfhuqduIDEwMCUga2jDtG5nIHTDoWkgcGjDoXQpLg0KDQogIC0gTmjDs20gQmlvY2hlbWljYWwgSW5jb21wbGV0ZSBjw7MgdOG7tyBs4buHIHTDoWkgcGjDoXQga2hv4bqjbmcgNTAlLg0KDQogIC0gTmjDs20gSW5kZXRlcm1pbmF0ZSBjw7MgdOG7tyBs4buHIHTDoWkgcGjDoXQga2hv4bqjbmcgMTDigJMxNSUuDQoNCi0gxJDDoW5nIGNow7ogw70sIG5ow7NtIFN0cnVjdHVyYWwgSW5jb21wbGV0ZSBjw7MgdOG7tyBs4buHIHTDoWkgcGjDoXQgZ+G6p24gbmjGsCB0dXnhu4d0IMSR4buRaS4NCg0KxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgxJFp4buBdSB0cuG7iyBjw7MgbGnDqm4gcXVhbiByw7UgcuG7h3QgxJHhur9uIG5ndXkgY8ahIHTDoWkgcGjDoXQgYuG7h25oLCB0cm9uZyDEkcOzIMSRw6FwIOG7qW5nIGtow7RuZyBob8OgbiB0b8OgbiB24buBIG3hurd0IGPhuqV1IHRyw7pjIGzDoCB54bq/dSB04buRIG5ndXkgY8ahIGNhbyBuaOG6pXQuDQoNCg0KIyMjIyAqKjQuNC4zLiBQaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrIGdp4buvYSBSZXNwb25zZSB2w6Aga2jhuqMgbsSDbmcgdMOhaSBi4buHbmgqKg0KDQpDaMO6bmcgdGEgc+G6vSB0w61uaCB0b8OhbiBOZ3V5IGPGoSB0xrDGoW5nIMSR4buRaSAoUlIpLCBs4bqleSBuaMOzbSBFeGNlbGxlbnQgbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UuDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygiZXBpdG9vbHMiKQ0KbGlicmFyeShlcGl0b29scykNCmBgYA0KDQoNCg0KYGBge3J9DQpyaXNrcmF0aW8odGFibGVfdGFpYmVuaF9yZXNwb25zZSkNCmBgYA0KDQpUcm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIG5ow7NtIEJpb2NoZW1pY2FsIEluY29tcGxldGUgxJHGsOG7o2MgY2jhu41uIGzDoG0gbmjDs20gdGhhbSBjaGnhur91IMSR4buDIMSRw6FuaCBnacOhIG5ndXkgY8ahIHTDoWkgcGjDoXQgYuG7h25oIOG7nyBjw6FjIG5ow7NtIMSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4sga2jDoWMgbmhhdS4gVmnhu4djIHBow6JuIHTDrWNoIHThu4kgc+G7kSBuZ3V5IGPGoSAoUmVsYXRpdmUgUmlzayDigJMgUlIpIGNobyBwaMOpcCBzbyBzw6FuaCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGdp4buvYSBjw6FjIG5ow7NtIG3hu5l0IGPDoWNoIHRy4buxYyBxdWFuIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoqKk5ow7NtIEV4Y2VsbGVudCoqDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXksIG5ow7NtIEV4Y2VsbGVudCBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBi4buHbmggdGjhuqVwIGjGoW4gcsO1IHLhu4d0IHNvIHbhu5tpIG5ow7NtIEJpb2NoZW1pY2FsIEluY29tcGxldGUsIHbhu5tpIFJSID0gMCwwMS4gxJBp4buBdSBuw6B5IMSR4buTbmcgbmdoxKlhIHbhu5tpIHZp4buHYyBuaOG7r25nIGLhu4duaCBuaMOibiDEkeG6oXQgbeG7qWMgxJHDoXAg4bupbmcgxJFp4buBdSB0cuG7iyB4deG6pXQgc+G6r2MgY8OzIG5ndXkgY8ahIHTDoWkgcGjDoXQgdGjhuqVwIGjGoW4gxJHhur9uIDk5JSBzbyB24bubaSBuaMOzbSBraMO0bmcgxJHDoXAg4bupbmcgaG/DoG4gdG/DoG4gduG7gSBzaW5oIGjDs2EuIMSQw6J5IGzDoCBt4bupYyBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8sIGto4bqzbmcgxJHhu4tuaCBoaeG7h3UgcXXhuqMgxJFp4buBdSB0cuG7iyB0w61jaCBj4buxYyB2w6AgdGnDqm4gbMaw4bujbmcgdOG7kXQgY2hvIG5ow7NtIGLhu4duaCBuaMOibiBuw6B5LiBL4bq/dCBxdeG6oyBjxaluZyBwaOG6o24gw6FuaCB2YWkgdHLDsiBxdWFuIHRy4buNbmcgY+G7p2Egdmnhu4djIMSR4bqhdCDEkcaw4bujYyDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLIHThu5FpIMawdSB0cm9uZyB2aeG7h2MgZ2nhuqNtIHRoaeG7g3Ugbmd1eSBjxqEgdMOhaSBwaMOhdC4NCg0KKipOaMOzbSBJbmRldGVybWluYXRlKioNCg0KxJDhu5FpIHbhu5tpIG5ow7NtIEluZGV0ZXJtaW5hdGUsIG5ndXkgY8ahIHTDoWkgcGjDoXQgYuG7h25oIGPFqW5nIHRo4bqlcCBoxqFuIHNvIHbhu5tpIG5ow7NtIEJpb2NoZW1pY2FsIEluY29tcGxldGUsIHbhu5tpIFJSID0gMCwyNC4gTeG6t2MgZMO5IG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4sg4bufIG5ow7NtIG7DoHkgY2jGsGEgdGjhu4MgeMOhYyDEkeG7i25oIHLDtSByw6BuZyB24buBIG3hurd0IGzDom0gc8OgbmcsIG5oxrBuZyBr4bq/dCBxdeG6oyBjaG8gdGjhuqV5IGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgduG6q24gdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG5ow7NtIEluZGV0ZXJtaW5hdGUgY8OzIHRo4buDIGJhbyBn4buTbSBt4buZdCBwaOG6p24gYuG7h25oIG5ow6JuIMSRw6FwIOG7qW5nIHThu5F0IG5oxrBuZyBjaMawYSDEkcaw4bujYyBwaMOibiBsb+G6oWkgY2jDrW5oIHjDoWMsIGhv4bq3YyBjw7MgeeG6v3UgdOG7kSB0acOqbiBsxrDhu6NuZyB0cnVuZyBnaWFuLiBEbyDEkcOzLCBj4bqnbiB0aGVvIGTDtWkgY2jhurd0IGNo4bq9IG5ow7NtIG7DoHkgdHJvbmcgY8OhYyBuZ2hpw6puIGPhu6l1IHRp4bq/cCB0aGVvIMSR4buDIMSRw6FuaCBnacOhIHLDtSBoxqFuIHbhu4EgdGnDqm4gbMaw4bujbmcgdsOgIGjGsOG7m25nIMSRaeG7gXUgdHLhu4suDQoNCioqTmjDs20gU3RydWN0dXJhbCBJbmNvbXBsZXRlKioNCg0KTmfGsOG7o2MgbOG6oWksIG5ow7NtIFN0cnVjdHVyYWwgSW5jb21wbGV0ZSBs4bqhaSBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBjYW8gaMahbiBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UsIHbhu5tpIFJSID0gMiwwNC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbmjhu69uZyBi4buHbmggbmjDom4gY8OzIGThuqV1IGhp4buHdSBraMO0bmcgxJHDoXAg4bupbmcgduG7gSBt4bq3dCBj4bqldSB0csO6YyBzYXUgxJFp4buBdSB0cuG7iyBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBjYW8gZ+G6pXAgxJHDtGkgc28gduG7m2kgbmjDs20gQmlvY2hlbWljYWwgSW5jb21wbGV0ZS4gTeG7qWMgdMSDbmcgbmd1eSBjxqEgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLDtSBy4buHdCwgY2hvIHRo4bqleSBuaMOzbSBTdHJ1Y3R1cmFsIEluY29tcGxldGUgbMOgIG5ow7NtIG5ndXkgY8ahIGNhbyBj4bqnbiDEkcaw4bujYyB0aGVvIGTDtWkgc8OhdCBzYW8gdsOgIGNhbiB0aGnhu4dwIGvhu4twIHRo4budaSBuaOG6sW0gaOG6oW4gY2jhur8gYmnhur9uIGNo4bupbmcgaG/hurdjIHTDoWkgcGjDoXQuDQoNClThu5VuZyB0aOG7gywgY8OhYyBr4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4sgY8OzIG3hu5FpIGxpw6puIGjhu4cgY2jhurd0IGNo4bq9IHbhu5tpIG5ndXkgY8ahIHTDoWkgcGjDoXQgYuG7h25oLiBOaMOzbSBFeGNlbGxlbnQgY8OzIHRpw6puIGzGsOG7o25nIHLhuqV0IHThu5F0LCBuaMOzbSBJbmRldGVybWluYXRlIGPDsyBuZ3V5IGPGoSB0cnVuZyBnaWFuLCB0cm9uZyBraGkgbmjDs20gU3RydWN0dXJhbCBJbmNvbXBsZXRlIGzDoCBuaMOzbSBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBjYW8gbmjhuqV0LiBOaOG7r25nIHRow7RuZyB0aW4gbsOgeSBy4bqldCBo4buvdSDDrWNoIHRyb25nIHRo4buxYyBow6BuaCBsw6JtIHPDoG5nIMSR4buDIHBow6JuIHThuqduZyBuZ3V5IGPGoSB2w6AgeMOieSBk4buxbmcgY2hp4bq/biBsxrDhu6NjIHRoZW8gZMO1aSwgxJFp4buBdSB0cuG7iyBwaMO5IGjhu6NwIGNobyB04burbmcgbmjDs20gYuG7h25oIG5ow6JuIHNhdSDEkWnhu4F1IHRy4buLIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAuDQoNCg0KIyMjIyAqKjQuNC40LiBQaMOibiB0w61jaCBPZGQgUmF0aW8gZ2nhu69hIFJlc3BvbnNlIHbDoCBraOG6oyBuxINuZyB0w6FpIGLhu4duaCoqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKHRhYmxlX3RhaWJlbmhfcmVzcG9uc2UpDQpgYGANCg0KUGjDom4gdMOtY2ggT2RkcyBSYXRpbyAoT1IpIG5o4bqxbSBzbyBzw6FuaCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCBnaeG7r2EgY8OhYyBuaMOzbSBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLLCB24bubaSBuaMOzbSBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlIMSRxrDhu6NjIGNo4buNbiBsw6BtIG5ow7NtIHRoYW0gY2hp4bq/dS4NCg0KKipOaMOzbSBFeGNlbGxlbnQgc28gduG7m2kgQmlvY2hlbWljYWwgSW5jb21wbGV0ZSoqDQoNCk5ow7NtIGPDsyBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyBFeGNlbGxlbnQgY2hvIHRo4bqleSBvZGRzIHTDoWkgcGjDoXQgYuG7h25oIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5ow7NtIEJpb2NoZW1pY2FsIEluY29tcGxldGUsIHbhu5tpIE9SID0gMCwwMDYzLiDEkGnhu4F1IG7DoHkgxJHhu5NuZyBuZ2jEqWEgcuG6sW5nLCB0cm9uZyBuaMOzbSBjw7MgxJHDoXAg4bupbmcgeHXhuqV0IHPhuq9jLCB04bu3IGzhu4cgb2RkcyB0w6FpIHBow6F0IHNvIHbhu5tpIGtow7RuZyB0w6FpIHBow6F0IGNo4buJIGLhurFuZyBraG/huqNuZyAwLDYlIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dS4gDQoNCioqTmjDs20gSW5kZXRlcm1pbmF0ZSBzbyB24bubaSBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlKioNCg0KxJDhu5FpIHbhu5tpIG5ow7NtIEluZGV0ZXJtaW5hdGUsIG9kZHMgdMOhaSBwaMOhdCB0aOG6pXAgaMahbiBuaMOzbSBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlLCB24bubaSBPUiA9IDAsMTQ3MC4gTeG6t2MgZMO5IHbhuqtuIGPDsyBuZ3V5IGPGoSB0w6FpIHBow6F0LCBuaMOzbSBuw6B5IGPDsyB04bu3IGzhu4cgb2RkcyB0w6FpIHBow6F0IGNo4buJIGLhurFuZyBraG/huqNuZyAxNCw3JSBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UuIA0KDQoqKk5ow7NtIFN0cnVjdHVyYWwgSW5jb21wbGV0ZSBzbyB24bubaSBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlKioNCg0KTmfGsOG7o2MgbOG6oWksIG5ow7NtIGPDsyDEkcOhcCDhu6luZyBTdHJ1Y3R1cmFsIEluY29tcGxldGUgbOG6oWkgY8OzIG9kZHMgdMOhaSBwaMOhdCBjYW8gZ+G6pXAgaMahbiA0MyBs4bqnbiBzbyB24bubaSBuaMOzbSBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlLCB24bubaSBPUiA9IDQzLDE5LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyBrw6ltIHRyw6puIGjDrG5oIOG6o25oIGjhu41jIGPDsyBsacOqbiBxdWFuIGNo4bq3dCBjaOG6vSB24bubaSBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaC4NCg0KDQoqKlTDs20gdOG6r3QqKg0KDQotIEvhur90IHF14bqjIHBow6JuIHTDrWNoIE9kZHMgUmF0aW8gY2jhu4kgcmEgcuG6sW5nOg0KDQogIC0gRXhjZWxsZW50IGzDoCBuaMOzbSBhbiB0b8OgbiBuaOG6pXQsIG9kZHMgdMOhaSBwaMOhdCBy4bqldCB0aOG6pXAuDQoNCiAgLSBJbmRldGVybWluYXRlIGPDsyBuZ3V5IGPGoSB0w6FpIHBow6F0IHRydW5nIGLDrG5oLCBuaMawbmcgdGjhuqVwIGjGoW4gQmlvY2hlbWljYWwgSW5jb21wbGV0ZS4NCg0KICAtIFN0cnVjdHVyYWwgSW5jb21wbGV0ZSBsw6AgbmjDs20gbmd1eSBjxqEgY2FvIG5o4bqldCwgY8OzIGxpw6puIHF1YW4gbeG6oW5oIHbhu5tpIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQuDQoNCi0gS+G6v3QgcXXhuqMgbsOgeSBnacO6cCBwaMOibiB04bqnbmcgbmd1eSBjxqEgdMOhaSBwaMOhdCBzYXUgxJFp4buBdSB0cuG7iywgdOG7qyDEkcOzIGjhu5cgdHLhu6MgdHJvbmcgdmnhu4djIHRoZW8gZMO1aSB2w6AgxJHGsGEgcmEgY8OhYyBjaGnhur9uIGzGsOG7o2MgY2FuIHRoaeG7h3AgcGjDuSBo4bujcC4NCg0KDQojIyMjICoqNC40LjUuIFRo4buRbmcga8OqIHN1eSBkaeG7hW4qKg0KDQpDaMO6bmcgdGEgc+G7rSBk4bulbmcga2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nIMSR4buDIGtp4buDbSB0cmEgZ2nhuqMgdGh1eeG6v3QgduG7gSB0w61uaCDEkeG7mWMgbOG6rXAgZ2nhu69hIG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0Lg0KDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KSOKCgCAoR2nhuqMgdGh1eeG6v3Qga2jDtG5nKTogTeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgbMOgIGhhaSBiaeG6v24gxJHhu5ljIGzhuq1wLg0KSOKCgSAoR2nhuqMgdGh1eeG6v3QgxJHhu5FpKTogTeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgbMOgIGhhaSBiaeG6v24gcGjhu6UgdGh14buZYy4NCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIENoaSBiw6xuaCBwaMawxqFuZw0KY2hpc3EudGVzdCh0YWJsZV90YWliZW5oX3Jlc3BvbnNlKQ0KYGBgDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmgqKg0KDQpcWw0KXGNoaV4yID0gMzA5LjQ3LFxxdWFkIGRmID0gMyxccXVhZCBwXHRleHR7LXZhbHVlfSA8IDIuMiBcdGltZXMgMTBeey0xNn0NClxdDQoNCioqRGnhu4VuIGdp4bqjaSoqDQoNCkdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAoZ+G6p24gYuG6sW5nIDApLCBjaG8gdGjhuqV5IGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyAqKmLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKiB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUuIMSQaeG7gXUgbsOgeSBjaOG7qW5nIHThu48gcuG6sW5nICoqbeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgxJFp4buBdSB0cuG7iyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbhu5tpIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQqKi4NCg0KTsOzaSBjw6FjaCBraMOhYywgKipraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhIHBo4bulIHRodeG7mWMgxJHDoW5nIGvhu4MgdsOgbyBwaOG6o24g4bupbmcgxJFp4buBdSB0cuG7iyBiYW4gxJHhuqd1KiosIHThu6sgxJHDsyBj4bunbmcgY+G7kSB2YWkgdHLDsiBj4bunYSB2aeG7h2MgdGhlbyBkw7VpIHPDoXQgdsOgIHBow6JuIHThuqduZyBuZ3V5IGPGoSBk4buxYSB0csOqbiBt4bupYyDEkeG7mSDEkcOhcCDhu6luZy4NCg0KDQojIyMjICoqNC40LjYuIE3DtCBow6xuaCBo4buTaSBxdXkgY2hvIGThu68gbGnhu4d1IG5o4buLIHBow6JuKioNCg0KIyMjIyMgKio0LjQuNi4xLiBI4buTaSBxdXkgdHV54bq/biB0w61uaCoqDQoNCsSQ4buDIHjDonkgZOG7sW5nIG3DtCBow6xuaCwgY2jDum5nIHRhIHPhur0gxJHhurd0IG5ow7NtIEV4Y2VsbGVudCBsw6BtIG3hu6ljIHRoYW0gY2hp4bq/dSDEkeG7gyBjw6FjIGjhu4cgc+G7kSBjw7MgdGjhu4MgxJHGsOG7o2MgZGnhu4VuIGdp4bqjaSBt4buZdCBjw6FjaCBo4bujcCBsw70uDQoNCmBgYHtyfQ0KIyDEkOG6t3QgbOG6oWkgbmjDs20gdGhhbSBjaGnhur91DQpkYXQkUmVzcG9uc2UgPC0gcmVsZXZlbChkYXQkUmVzcG9uc2UsIHJlZiA9ICJCaW9jaGVtaWNhbCBJbmNvbXBsZXRlIikNCg0KIyBDaOG6oXkgbOG6oWkgbcO0IGjDrG5oIGjhu5NpIHF1eQ0KbW9kZWxfcmVmX2JpbyA8LSBnbG0oUmVjdXJyZWRfYmluIH4gUmVzcG9uc2UsIGRhdGEgPSBkYXQpDQpzdW1tYXJ5KG1vZGVsX3JlZl9iaW8pDQpgYGANCg0KKipQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgqKg0KDQokJA0KXGhhdHtZfSA9IDAuNDc4MjYgDQotIDAuNDczNDUgXGNkb3QgXHRleHR7RXhjZWxsZW50fSANCi0gMC4zNjM1MSBcY2RvdCBcdGV4dHtJbmRldGVybWluYXRlfSANCisgMC40OTk3NiBcY2RvdCBcdGV4dHtTdHJ1Y3R1cmFsIEluY29tcGxldGV9DQokJA0KDQpUcm9uZyDEkcOzOg0KDQotIFwoIFxoYXR7WX0gXCkgbMOgIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgYuG7h25oLg0KLSBDw6FjIGJp4bq/biBsw6AgZHVtbXkgdmFyaWFibGVzIHNvIHbhu5tpIG5ow7NtIHRoYW0gY2hp4bq/dSBsw6AgKipCaW9jaGVtaWNhbCBJbmNvbXBsZXRlKiouDQoNCg0KKipHaeG6o2kgdGjDrWNoIGjhu4cgc+G7kSBo4buTaSBxdXkqKg0KDQp8ICoqQmnhu4N1IGhp4buHbioqICAgICAgICAgICAgICB8ICoqSOG7hyBz4buRKiogIHwgKipHaeG6o2kgdGjDrWNoKiogfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwNCnwgXCggXHRleHR7KEludGVyY2VwdCl9IFwpICB8IDAuNDc4MjYgICAgfCBOaMOzbSAqKkJpb2NoZW1pY2FsIEluY29tcGxldGUqKiBjw7MgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmggbMOgIGtob+G6o25nICoqNDcuOCUqKi4gfA0KfCBcKCBcdGV4dHtFeGNlbGxlbnR9IFwpICAgIHwgLTAuNDczNDUgICB8IE5ow7NtICoqRXhjZWxsZW50KiogY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgZ2nhuqNtICoqNDcuMyDEkWnhu4NtICUqKiBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UgKCoqcCA8IDAuMDAxKiopLCB04bupYyBjw7JuIGtob+G6o25nICoqMC40OCUqKi4gfA0KfCBcKCBcdGV4dHtJbmRldGVybWluYXRlfSBcKSB8IC0wLjM2MzUxICB8IE5ow7NtICoqSW5kZXRlcm1pbmF0ZSoqIGPDsyB4w6FjIHN14bqldCB0w6FpIHBow6F0IGdp4bqjbSAqKjM2LjQgxJFp4buDbSAlKiogc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91ICgqKnAgPCAwLjAwMSoqKSwgdMawxqFuZyDEkcawxqFuZyB4w6FjIHN14bqldCBraG/huqNuZyAqKjExLjUlKiouIHwNCnwgXCggXHRleHR7U3RydWN0dXJhbCBJbmNvbXBsZXRlfSBcKSB8ICswLjQ5OTc2IHwgTmjDs20gKipTdHJ1Y3R1cmFsIEluY29tcGxldGUqKiBjw7MgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCB0xINuZyAqKjQ5LjkgxJFp4buDbSAlKiogc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91ICgqKnAgPCAwLjAwMSoqKSwgdOG7qWMgeMOhYyBzdeG6pXQgY8OzIHRo4buDIGzDqm4gxJHhur9uICoqOTcuOCUqKi4gfA0KDQoNCiMjIyMjICoqNC40LjYuMi4gSOG7k2kgcXV5IGxvZ2l0KioNCg0KWMOpdCBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIHbhu5tpIGJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCB2w6AgYmnhur9uIMSR4buZYyBs4bqtcCBsw6AgbeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgc2F1IMSRaeG7gXUgdHLhu4sgKFJlc3BvbnNlKSwgduG7m2kgbmjDs20gdGhhbSBjaGnhur91IGzDoCBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlLg0KDQpgYGB7cn0NCiMgTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyB24bubaSBiaeG6v24gUmVzcG9uc2UNCm1vZGVsX2xvZ2l0X3Jlc3BvbnNlIDwtIGdsbShSZWN1cnJlZF9iaW4gfiBSZXNwb25zZSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpLCBkYXRhID0gZGF0KQ0Kc3VtbWFyeShtb2RlbF9sb2dpdF9yZXNwb25zZSkNCmBgYA0KDQpgYGB7cn0NCmV4cChjb2VmKG1vZGVsX2xvZ2l0X3Jlc3BvbnNlKSkNCmBgYA0KDQoqKlThu7cgc+G7kSBPZGRzIChPZGRzIFJhdGlvKSoqDQoNCiQkDQpcbG9nXGxlZnQoIFxmcmFje1xoYXR7cH19ezEgLSBcaGF0e3B9fSBccmlnaHQpID0gLTAuMDg3MDEgDQotIDUuMjQ1NzEgXGNkb3QgXHRleHR7RXhjZWxsZW50fSANCi0gMS45NTYwNiBcY2RvdCBcdGV4dHtJbmRldGVybWluYXRlfSANCisgMy44ODI1MCBcY2RvdCBcdGV4dHtTdHJ1Y3R1cmFsIEluY29tcGxldGV9DQokJA0KDQoqKkRp4buFbiBnaeG6o2kgaOG7hyBz4buRIGjhu5NpIHF1eSoqDQoNCnwgQmnhu4N1IGhp4buHbiAgICAgICAgICAgICAgICAgfCBI4buHIHPhu5EgKGxvZy1vZGRzKSB8IEdp4bqjaSB0aMOtY2ggfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18DQp8IChJbnRlcmNlcHQpICAgICAgICAgICAgICB8IC0wLjA4NzAxICAgICAgICAgfCDEkMOieSBsw6AgbG9nLW9kZHMgdMOhaSBwaMOhdCDhu58gbmjDs20gKipCaW9jaGVtaWNhbCBJbmNvbXBsZXRlKiogKHRoYW0gY2hp4bq/dSkuIFTGsMahbmcg4bupbmcgeMOhYyBzdeG6pXQga2hv4bqjbmcgNDcuOCUuIHwNCnwgRXhjZWxsZW50ICAgICAgICAgICAgICAgIHwgLTUuMjQ1NzEgICAgICAgICB8IE5ow7NtICoqRXhjZWxsZW50KiogY8OzIGxvZy1vZGRzIHTDoWkgcGjDoXQgdGjhuqVwIGjGoW4gcuG6pXQgbmhp4buBdSBzbyB24bubaSBuaMOzbSB0aGFtIGNoaeG6v3UgKCoqcCA8IDAuMDAxKiopLiBPZGRzIGdp4bqjbSBraG/huqNuZyBcKCBlXnstNS4yNDU3MX0gXGFwcHJveCAwLjAwNSBcKSwgdOG7qWMgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBj4buxYyB0aOG6pXAuIHwNCnwgSW5kZXRlcm1pbmF0ZSAgICAgICAgICAgIHwgLTEuOTU2MDYgICAgICAgICB8IE5ow7NtICoqSW5kZXRlcm1pbmF0ZSoqIGPDsyBsb2ctb2RkcyB0w6FpIHBow6F0IHRo4bqlcCBoxqFuIG5ow7NtIHRoYW0gY2hp4bq/dSAoKipwIDwgMC4wMDEqKiksIHbhu5tpIG9kZHMgZ2nhuqNtIGtob+G6o25nIFwoIGVeey0xLjk1NjA2fSBcYXBwcm94IDAuMTQgXCksIHTGsMahbmcgxJHGsMahbmcgeMOhYyBzdeG6pXQga2hv4bqjbmcgMTIlLiB8DQp8IFN0cnVjdHVyYWwgSW5jb21wbGV0ZSAgICB8ICszLjg4MjUwICAgICAgICAgfCBOaMOzbSAqKlN0cnVjdHVyYWwgSW5jb21wbGV0ZSoqIGPDsyBsb2ctb2RkcyB0w6FpIHBow6F0IGNhbyBoxqFuIMSRw6FuZyBr4buDICgqKnAgPCAwLjAwMSoqKSwgb2RkcyB0xINuZyBn4bqlcCBcKCBlXnszLjg4MjV9IFxhcHByb3ggNDguNiBcKSBs4bqnbiwgdMawxqFuZyDEkcawxqFuZyB4w6FjIHN14bqldCB0w6FpIHBow6F0ID4gOTclLiB8DQoNCg0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBNw7QgaMOsbmggY2hvIHRo4bqleSBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyBzYXUgxJFp4buBdSB0cuG7iyBsw6AgeeG6v3UgdOG7kSBk4buxIGLDoW8gbeG6oW5oIG3hur0gY2hvIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oLg0KDQotIE5ow7NtIEV4Y2VsbGVudCBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBy4bqldCB0aOG6pXAsIHRyb25nIGtoaSBuaMOzbSBTdHJ1Y3R1cmFsIEluY29tcGxldGUgY8OzIG5ndXkgY8ahIHLhuqV0IGNhby4NCg0KLSBT4buxIGtow6FjIGJp4buHdCBuw6B5IMSR4buBdSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIChwIDwgMC4wMDEpIMSR4buRaSB24bubaSBt4buNaSBuaMOzbSBzbyB24bubaSB0aGFtIGNoaeG6v3UgKEJpb2NoZW1pY2FsIEluY29tcGxldGUpLg0KDQoNCiMjIyMjICoqNC40LjYuMy4gSOG7k2kgcXV5IHByb2JpdCoqDQoNCsOBcCBk4bulbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSBQcm9iaXQgxJHhu4MgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyBzYXUgxJFp4buBdSB0cuG7iyAoUmVzcG9uc2UpIHbDoCBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCAoUmVjdXJyZWRfYmluKSwgdHJvbmcgxJHDsyBuaMOzbSB0aGFtIGNoaeG6v3UgbMOgIEJpb2NoZW1pY2FsIEluY29tcGxldGUuDQoNCmBgYHtyfQ0KIyBNw7QgaMOsbmggUHJvYml0IHbhu5tpIGJp4bq/biBSZXNwb25zZQ0KcHJvYml0X21vZGVsX3Jlc3BvbnNlIDwtIGdsbShSZWN1cnJlZF9iaW4gfiBSZXNwb25zZSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJwcm9iaXQiKSwgZGF0YSA9IGRhdCkNCnN1bW1hcnkocHJvYml0X21vZGVsX3Jlc3BvbnNlKQ0KYGBgDQoNCiQkDQpcUGhpXnstMX0oXGhhdHtwfSkgPSAtMC4wNTQ1MiANCi0gMi41MzQ4NCBcY2RvdCBcdGV4dHtFeGNlbGxlbnR9IA0KLSAxLjE0NzExIFxjZG90IFx0ZXh0e0luZGV0ZXJtaW5hdGV9IA0KKyAyLjA2OTAzIFxjZG90IFx0ZXh0e1N0cnVjdHVyYWwgSW5jb21wbGV0ZX0NCiQkDQoNClRyb25nIMSRw7M6DQoNCiQkXFBoaV57LTF9KFxoYXR7cH0pJCQgbMOgIGjDoG0gbmdo4buLY2ggxJHhuqNvIHBow6JuIHBo4buRaSBjaHXhuqluIHTDrWNoIGzFqXkgY+G7p2EgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmguDQoNCkPDoWMgYmnhur9uIGzDoCBiaeG6v24gZ2nhuqMgKGR1bW15KSB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMgbmjDs20gc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91IGzDoCBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlLg0KDQoqKkRp4buFbiBnaeG6o2kgaOG7hyBz4buRIGjhu5NpIHF1eSoqDQoNCnwgQmnhu4N1IGhp4buHbiAgICAgICAgICAgICAgICAgfCBI4buHIHPhu5EgKFByb2JpdCkgfCBHaeG6o2kgdGjDrWNoIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwNCnwgKEludGVyY2VwdCkgICAgICAgICAgICAgIHwgLTAuMDU0NTIgICAgICAgfCBMw6AgZ2nDoSB0cuG7iyBuZ8aw4buhbmcgY2h14bqpbiBob8OhIGPhu6dhIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgdHJvbmcgbmjDs20gKipCaW9jaGVtaWNhbCBJbmNvbXBsZXRlKiouIHwNCnwgRXhjZWxsZW50ICAgICAgICAgICAgICAgIHwgLTIuNTM0ODQgICAgICAgfCBOaMOzbSAqKkV4Y2VsbGVudCoqIGPDsyB4w6FjIHN14bqldCB0w6FpIHBow6F0ICoqdGjhuqVwIGjGoW4gcsO1IHLhu4d0Kiogc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91ICgqKnAgPCAwLjAwMSoqKS4gfA0KfCBJbmRldGVybWluYXRlICAgICAgICAgICAgfCAtMS4xNDcxMSAgICAgICB8IE5ow7NtICoqSW5kZXRlcm1pbmF0ZSoqIGPFqW5nIGPDsyB4w6FjIHN14bqldCB0w6FpIHBow6F0ICoqdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MqKiBzbyB24bubaSBuaMOzbSBCaW9jaGVtaWNhbCBJbmNvbXBsZXRlICgqKnAgPCAwLjAwMSoqKS4gfA0KfCBTdHJ1Y3R1cmFsIEluY29tcGxldGUgICAgfCArMi4wNjkwMyAgICAgICB8IE5ow7NtICoqU3RydWN0dXJhbCBJbmNvbXBsZXRlKiogY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgKipjYW8gaMahbiBy4bqldCBuaGnhu4F1KiosIHbhu5tpIGjhu4cgc+G7kSBkxrDGoW5nIGzhu5tuICgqKnAgPCAwLjAwMSoqKS4gfA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBNw7QgaMOsbmggcHJvYml0IHjDoWMgbmjhuq1uIHLDtSByw6BuZyBy4bqxbmcgbeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgc2F1IMSRaeG7gXUgdHLhu4sgbMOgIG3hu5l0IHnhur91IHThu5EgZOG7sSDEkW/DoW4gbeG6oW5oIG3hur0gY2hvIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oLg0KDQotIE5ow7NtIEV4Y2VsbGVudCB2w6AgSW5kZXRlcm1pbmF0ZSDEkeG7gXUgY8OzIG5ndXkgY8ahIHTDoWkgcGjDoXQgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4MsIHRyb25nIGtoaSBuaMOzbSBTdHJ1Y3R1cmFsIEluY29tcGxldGUgY8OzIG5ndXkgY8ahIHLhuqV0IGNhby4NCg0KLSBL4bq/dCBxdeG6oyBob8OgbiB0b8OgbiBuaOG6pXQgcXXDoW4gduG7m2kgbcO0IGjDrG5oIGxvZ2lzdGljLCBjaG8gdGjhuqV5IMSR4buZIHRpbiBj4bqteSBjYW8gdHJvbmcgdmnhu4djIGto4bqzbmcgxJHhu4tuaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBt4bupYyDEkeG7mSDEkcOhcCDhu6luZyB2w6AgdMOhaSBwaMOhdCBi4buHbmguDQoNCg0KDQojIyMjIyAqKjQuNC42LjQuIEjhu5NpIHF1eSBjbG9nbG9nKioNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSBDbG9nbG9nIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGThu7EgxJFvw6FuIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgYuG7h25oIChSZWN1cnJlZF9iaW4pIGThu7FhIHRyw6puIG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIChSZXNwb25zZSkgc2F1IMSRaeG7gXUgdHLhu4suIE3DtCBow6xuaCDEkeG6t2MgYmnhu4d0IHBow7kgaOG7o3AgdHJvbmcgdHLGsOG7nW5nIGjhu6NwIGJp4bq/biBwaOG7pSB0aHXhu5ljIGPDsyBwaMOibiBwaOG7kWkgYuG6pXQgY8OibiB44bupbmcgKHThu6ljIGzDoCB4w6FjIHN14bqldCBz4buxIGtp4buHbiB44bqjeSByYSBn4bqnbiAwIGhv4bq3YyBn4bqnbiAxKS4NCg0KYGBge3J9DQojIE3DtCBow6xuaCBjbG9nbG9nIHbhu5tpIGJp4bq/biBSZXNwb25zZQ0KY2xvZ2xvZ19tb2RlbF9yZXNwb25zZSA8LSBnbG0oUmVjdXJyZWRfYmluIH4gUmVzcG9uc2UsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpLCBkYXRhID0gZGF0KQ0Kc3VtbWFyeShjbG9nbG9nX21vZGVsX3Jlc3BvbnNlKQ0KDQpgYGANCg0KJCQNClxsb2coLVxsb2coMSAtIFxoYXR7cH0pKSA9IC0wLjQyOTkgDQotIDQuOTA1MyBcY2RvdCBcdGV4dHtFeGNlbGxlbnR9IA0KLSAxLjY3NDggXGNkb3QgXHRleHR7SW5kZXRlcm1pbmF0ZX0gDQorIDEuNzY5NSBcY2RvdCBcdGV4dHtTdHJ1Y3R1cmFsIEluY29tcGxldGV9DQokJA0KDQoqKkRp4buFbiBnaeG6o2kgaOG7hyBz4buRIGjhu5NpIHF1eSoqDQoNCnwgQmnhu4N1IGhp4buHbiAgICAgICAgICAgICAgICAgfCBI4buHIHPhu5EgKENsb2dsb2cpIHwgR2nhuqNpIHRow61jaCB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwNCnwgKEludGVyY2VwdCkgICAgICAgICAgICAgIHwgLTAuNDI5OSAgICAgICAgICAgfCBMw6AgZ2nDoSB0cuG7iyBsb2coLWxvZygxIC0gcCkpIGPhu6dhIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgdHJvbmcgbmjDs20gQmlvY2hlbWljYWwgSW5jb21wbGV0ZS4gS2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogKHAgPSAwLjE2MSkuIHwNCnwgRXhjZWxsZW50ICAgICAgICAgICAgICAgIHwgLTQuOTA1MyAgICAgICAgICAgfCBOaMOzbSBFeGNlbGxlbnQgY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgKipnaeG6o20gbeG6oW5oKiogc28gduG7m2kgbmjDs20gdGhhbSBjaGnhur91ICgqKnAgPCAwLjAwMSoqKS4gfA0KfCBJbmRldGVybWluYXRlICAgICAgICAgICAgfCAtMS42NzQ4ICAgICAgICAgICB8IE5ow7NtIEluZGV0ZXJtaW5hdGUgY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgKip0aOG6pXAgaMahbiByw7UgcuG7h3QqKiAoKipwIDwgMC4wMDEqKikuIHwNCnwgU3RydWN0dXJhbCBJbmNvbXBsZXRlICAgIHwgKzEuNzY5NSAgICAgICAgICAgfCBOaMOzbSBTdHJ1Y3R1cmFsIEluY29tcGxldGUgY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgKipjYW8gaMahbiDEkcOhbmcga+G7gyoqICgqKnAgPCAwLjAwMSoqKS4gfA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBUxrDGoW5nIHThu7EgbmjGsCBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4ga2jDoWMgKGxvZ2lzdGljIHbDoCBwcm9iaXQpLCBtw7QgaMOsbmggY2xvZ2xvZyB4w6FjIG5o4bqtbiBy4bqxbmcgbeG7qWMgxJHhu5kgxJHDoXAg4bupbmcgc2F1IMSRaeG7gXUgdHLhu4sgbMOgIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgbeG6oW5oIMSR4bq/biBuZ3V5IGPGoSB0w6FpIHBow6F0IGLhu4duaC4NCg0KLSBOaMOzbSBFeGNlbGxlbnQgY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgcuG6pXQgdGjhuqVwLCB0cm9uZyBraGkgbmjDs20gU3RydWN0dXJhbCBJbmNvbXBsZXRlIGPDsyB4w6FjIHN14bqldCB0w6FpIHBow6F0IHLhuqV0IGNhby4NCg0KLSBEw7kgaMOgbSBsacOqbiBr4bq/dCBraMOhYywga+G6v3QgcXXhuqMgbmjhuqV0IHF1w6FuIHbhu5tpIGPDoWMgbcO0IGjDrG5oIHRyxrDhu5tjLCBjaG8gdGjhuqV5IHTDrW5oIOG7lW4gxJHhu4tuaCB2w6AgxJHDoW5nIHRpbiBj4bqteSBj4bunYSBiaeG6v24gUmVzcG9uc2UgdHJvbmcgdGnDqm4gbMaw4bujbmcgYuG7h25oLg0KDQoNCiMjIyMgKio0LjQuNy4gxJDDoW5oIGdpw6EgY8OhYyBtw7QgaMOsbmgqKg0KDQoqKkLhuqNuZyB04buVbmcgaOG7o3AgY2jhu4kgc+G7kSBBSUMgY+G7p2EgNCBtw7QgaMOsbmggaOG7k2kgcXV5KioNCg0KfCBNw7QgaMOsbmggICAgICAgICAgICAgICAgICAgICAgICAgfCBIw6BtIGxpw6puIGvhur90IChMaW5rIGZ1bmN0aW9uKSAgICAgICAgICAgICAgfCBBSUMgICAgIHwgUGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSBuaOG7iyBwaMOibj8gfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IExpbmVhciBQcm9iYWJpbGl0eSBNb2RlbCAoTFBNKSB8IEtow7RuZyBjw7MgKG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHRow7RuZyB0aMaw4budbmcpIHwgKiotMTQ2LjkqKiB8IEtow7RuZyBwaMO5IGjhu6NwICAgICAgICAgICAgICAgfA0KfCBMb2dpdCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcKFxsb2dcbGVmdChcZnJhY3twfXsxIC0gcH1ccmlnaHQpXCkgICAgICAgfCAxMTUuMjEgIHwgUGjDuSBo4bujcCAgICAgICAgICAgICAgICAgICAgIHwNCnwgUHJvYml0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgXChcUGhpXnstMX0ocClcKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTE1LjIxICB8ICBQaMO5IGjhu6NwICAgICAgICAgICAgICAgICAgICAgfA0KfCBDbG9nbG9nICAgICAgICAgICAgICAgICAgICAgICAgfCBcKFxsb2coLVxsb2coMSAtIHApKVwpICAgICAgICAgICAgICAgICAgICAgfCAxMTUuMjEgIHwgIFBow7kgaOG7o3AgICAgICAgICAgICAgICAgICAgICB8DQoNCi0gVHJvbmcgdmnhu4djIHBow6JuIHTDrWNoIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIMSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4sgdsOgIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQsIGPhuqMgYuG7kW4gbcO0IGjDrG5oIMSR4buBdSDEkcawYSByYSBt4buZdCBr4bq/dCBsdeG6rW4gxJHhu5NuZyBuaOG6pXQ6IG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIHNhdSDEkWnhu4F1IHRy4buLIGzDoCBt4buZdCB54bq/dSB04buRIGThu7EgYsOhbyBj4buxYyBr4buzIG3huqFuaCBt4bq9IGNobyBuZ3V5IGPGoSB0w6FpIHBow6F0Lg0KDQotIEtoaSBzbyBzw6FuaCBjw6FjIG3DtCBow6xuaCBk4buxYSB0csOqbiBjaOG7iSBz4buRIEFJQywgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGPDsyBBSUMgdGjhuqVwIG5o4bqldCAoLTE0Ni45KSwgbmjGsG5nIHbDrCDEkWFuZyB4w6l0IGJp4bq/biBuaOG7iyBwaMOibiBuw6puIG3DtCBow6xuaCBuw6B5IGtow7RuZyBwaMO5IGjhu6NwLiBCYSBjw7JuIGzhuqFpIGzDoCBMb2dpdCwgUHJvYml0LCB2w6AgQ2xvZ2xvZyAgxJHhu4F1IGPDsyBjaOG7iSBz4buRIEFJQyBi4bqxbmcgbmhhdSB2w6AgcGjDuSBo4bujcCB24bubaSBiaeG6v24gbmjhu4sgcGjDom4gKDExNS4yMSksIGNobyB0aOG6pXkgY2jDum5nIG3DtCB04bqjIG3hu5FpIHF1YW4gaOG7hyBuw6B5IHThu5F0IGjGoW4gbeG7mXQgY8OhY2ggdsaw4bujdCB0cuG7mWkuDQoNCi0gTeG6t2MgZMO5IGPDsyBBSUMgdMawxqFuZyDEkcawxqFuZywgbcO0IGjDrG5oIExvZ2l0IGzDoCBs4buxYSBjaOG7jW4gxrB1IHZp4buHdCBuaOG6pXQgdHJvbmcgYuG7kWkgY+G6o25oIGzDom0gc8OgbmcgdsOsIGto4bqjIG7Eg25nIGRp4buFbiBnaeG6o2kga+G6v3QgcXXhuqMgbeG7mXQgY8OhY2ggdHLhu7FjIHF1YW4gdsOgIG3huqFuaCBt4bq9IHRow7RuZyBxdWEgVOG7tyBz4buRIGNow6puaCAoT2RkcyBSYXRpbykuIFZp4buHYyBr4bq/dCBsdeG6rW4gcuG6sW5nIGLhu4duaCBuaMOibiBjw7MgxJHDoXAg4bupbmcgU3RydWN0dXJhbCBJbmNvbXBsZXRlIGPDsyAib2RkcyIgdMOhaSBwaMOhdCBjYW8gZ+G6pXAgZ+G6p24gNCBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBjw7MgxJHDoXAg4bupbmcgQmlvY2hlbWljYWwgSW5jb21wbGV0ZS4gxJDDonkgbMOgIG3hu5l0IHBow6F0IGhp4buHbiBjw7MgZ2nDoSB0cuG7iyB0aOG7sWMgdGnhu4VuIHLhuqV0IGzhu5tuLCBnacO6cCBwaMOibiB04bqnbmcgbmd1eSBjxqEgdsOgIGzDqm4ga+G6vyBob+G6oWNoIHRoZW8gZMO1aSBjaG8gYuG7h25oIG5ow6JuLg0KDQotIERvIMSRw7MsIG3DtCBow6xuaCBMb2dpdCDEkcaw4bujYyBraHV54bq/biBuZ2jhu4sgbMOgIGzhu7FhIGNo4buNbiB04buRaSDGsHUgxJHhu4MgcGjDom4gdMOtY2ggdsOgIGLDoW8gY8OhbyBr4bq/dCBxdeG6oyB0cm9uZyBuZ2hpw6puIGPhu6l1IG7DoHkuDQoNCg0KIyMgKipQSMOCTiBUw41DSCDEkEEgQknhur5OKioNCg0KU2F1IGtoaSDEkcOjIHRo4buxYyBoaeG7h24gY8OhYyBwaMOibiB0w61jaCDEkcahbiBiaeG6v24gdsOgIG5o4bqtbiB0aOG6pXkgcuG6sW5nIGPDoWMgeeG6v3UgdOG7kSBHZW5kZXIsIFNtb2tpbmcsIEh4LlJhZGlvdGhyZWFweSwgRm9jYWxpdHksIHbDoCBSZXNwb25zZSDEkeG7gXUgY8OzIG3hu5FpIGxpw6puIGjhu4cgduG7m2kga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCAoUmVjdXJyZWQpLCBixrDhu5tjIHRp4bq/cCB0aGVvIGzDoCB4w6J5IGThu7FuZyBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IMSRYSBiaeG6v24uDQoNCioqTeG7pWMgdGnDqnU6KioNCg0KLSBN4bulYyB0acOqdSBj4bunYSBwaMOibiB0w61jaCDEkWEgYmnhur9uIGzDoCDEkeG7gyDEkcOhbmggZ2nDoSB0w6FjIMSR4buZbmcgxJHhu5NuZyB0aOG7nWkgY+G7p2Egbmhp4buBdSBiaeG6v24gxJHhu5ljIGzhuq1wIGzDqm4gbeG7mXQgYmnhur9uIHBo4bulIHRodeG7mWMuIMSQaeG7gXUgbsOgeSBjaG8gcGjDqXAgY2jDum5nIHRhOg0KDQogIC0gWMOhYyDEkeG7i25oIGPDoWMgeeG6v3UgdOG7kSBk4buxIGLDoW8gbeG6oW5oIG5o4bqldCBjaG8ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdC4NCiAgLSDEkMOhbmggZ2nDoSDhuqNuaCBoxrDhu59uZyBj4bunYSBt4buZdCBiaeG6v24gc2F1IGtoaSDEkcOjICJraeG7g20gc2/DoXQiIGhv4bq3YyAixJFp4buBdSBjaOG7iW5oIiBjaG8gY8OhYyBiaeG6v24ga2jDoWMgdHJvbmcgbcO0IGjDrG5oLiDEkGnhu4F1IG7DoHkgZ2nDunAgbG/huqFpIGLhu48gY8OhYyB54bq/dXRvb3MgZ8OieSBuaGnhu4V1IChjb25mb3VuZGVycykuDQogIC0gWMOieSBk4buxbmcgbeG7mXQgbcO0IGjDrG5oIGThu7EgYsOhbyB0b8OgbiBkaeG7h24gaMahbi4NCg0KDQoNCg0KDQokJA0KXGhhdHtccGl9ID0gMC40NjkgDQorIDAuMDU2IFxjZG90IFx0ZXh0e0dlbmRlcn1fXHRleHR7TX0gDQotIDAuMDA2IFxjZG90IFx0ZXh0e1Ntb2tpbmd9X1x0ZXh0e1llc30gDQorIDAuMDY1IFxjZG90IFx0ZXh0e0h4LlJhZGlvdGhyZWFweX1fXHRleHR7WWVzfSANCi0gMC4wMDggXGNkb3QgXHRleHR7Rm9jYWxpdHl9X1x0ZXh0e1VuaS1Gb2NhbH0gXFwNCi0gMC40NjMgXGNkb3QgXHRleHR7UmVzcG9uc2V9X1x0ZXh0e0V4Y2VsbGVudH0gDQotIDAuMzU5IFxjZG90IFx0ZXh0e1Jlc3BvbnNlfV9cdGV4dHtJbmRldGVybWluYXRlfSANCisgMC40ODggXGNkb3QgXHRleHR7UmVzcG9uc2V9X1x0ZXh0e1N0cnVjdHVyYWwgSW5jb21wbGV0ZX0NCiQkDQoNCiMjIyAqKjQuNiBNw7QgaMOsbmggTG9naXQqKg0KDQpgYGB7cn0NCiMgTG9naXQNCm1vZGVsX2xvZ2l0IDwtIGdsbShSZWN1cnJlZF9iaW4gfiBHZW5kZXIgKyBTbW9raW5nICsgSHguUmFkaW90aHJlYXB5ICsgRm9jYWxpdHkgKyBSZXNwb25zZSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksIGRhdGEgPSBkYXQpDQpzdW1tYXJ5KG1vZGVsX2xvZ2l0KQ0KYGBgDQoNCiMjIyMgKio0LjYuMS4gxJDDoW5oIGdpw6EgdOG7lW5nIHF1YW4gbcO0IGjDrG5oIGxvZ2l0KioNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyAobG9naXQpIMSRxrDhu6NjIHPhu60gZOG7pW5nIG5o4bqxbSBk4buxIMSRb8OhbiB4w6FjIHN14bqldCB0w6FpIHBow6F0IFwoIFxwaSBcKSBj4bunYSBi4buHbmggbmjDom4gdHV54bq/biBnacOhcCBiaeG7h3QgaMOzYSwgduG7m2kgYmnhur9uIHBo4bulIHRodeG7mWMgbmjhu4sgcGjDom4gYFJlY3VycmVkX2JpbmAgKDA6IGtow7RuZyB0w6FpIHBow6F0LCAxOiB0w6FpIHBow6F0KS4NCg0KQ8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIMSRxrDhu6NjIMSRxrBhIHbDoG8gbcO0IGjDrG5oIGfhu5NtOiANCg0KLSBgR2VuZGVyYCAoZ2nhu5tpIHTDrW5oKSwNCi0gYFNtb2tpbmdgIChow7p0IHRodeG7kWMpLA0KLSBgSHguUmFkaW90aHJlYXB5YCAodGnhu4FuIHPhu60geOG6oSB0cuG7iyksDQotIGBGb2NhbGl0eWAgKHTDrG5oIHRy4bqhbmcga2jhu5FpIHUpLA0KLSBgUmVzcG9uc2VgICjEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLKS4NCg0KIyMjIyAqKjQuNi4yLiBDaOG6pXQgbMaw4bujbmcgbcO0IGjDrG5oKioNCg0KLSBTYWkgc+G7kSBjaHXhuqluIChEaXNwZXJzaW9uKTogMQ0KLSDEkOG7mSBs4buHY2ggZMawIChSZXNpZHVhbCBkZXZpYW5jZSk6IDEwMi40MyB0csOqbiAzNzUgYuG6rWMgdOG7sSBkbw0KLSDEkOG7mSBs4buHY2ggZ+G7kWMgKE51bGwgZGV2aWFuY2UpOiA0NTUuNjMgdHLDqm4gMzgyIGLhuq1jIHThu7EgZG8NCi0gQ2jDqm5oIGzhu4djaCBkZXZpYW5jZTogXCggXERlbHRhIEQgPSA0NTUuNjMgLSAxMDIuNDMgPSAzNTMuMiBcKSBjaG8gNyBi4bqtYyB04buxIGRvDQotIEFJQyA9IDExOC40Mw0KDQpNw7QgaMOsbmggbG9naXQgY2hvIHRo4bqleSBz4buxIGPhuqNpIHRoaeG7h24gcuG6pXQgxJHDoW5nIGvhu4Mgc28gduG7m2kgbcO0IGjDrG5oIHLhu5duZyAobnVsbCBtb2RlbCksIHRo4buDIGhp4buHbiBxdWEgxJHhu5kgbOG7h2NoIGTGsCBnaeG6o20gbeG6oW5oLiBBSUMgdGjhuqVwIGPFqW5nIGNobyB0aOG6pXkgbcO0IGjDrG5oIHBow7kgaOG7o3AgdOG7kXQuDQoNCiMjIyMgKio0LjYuMy4gUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaCoqDQoNCk3DtCBow6xuaCBsb2dpdCBjw7MgZOG6oW5nOg0KDQpcWw0KXGxvZ1xsZWZ0KFxmcmFje1xwaX17MSAtIFxwaX1ccmlnaHQpID0gXGJldGFfMCArIFxzdW1fe2k9MX1ee2t9IFxiZXRhX2kgWF9pDQpcXQ0KDQpUaGF5IGjhu4cgc+G7kSDGsOG7m2MgbMaw4bujbmcgdOG7qyBr4bq/dCBxdeG6oywgdGEgY8OzOg0KDQpcWw0KXGxvZ1xsZWZ0KFxmcmFje1xwaX17MSAtIFxwaX1ccmlnaHQpID0gLTAuMTU1MSANCi0gNS4xMzI3IFxjZG90IFx0ZXh0e1Jlc3BvbnNlfV97RXhjZWxsZW50fQ0KLSAxLjk1MjkgXGNkb3QgXHRleHR7UmVzcG9uc2V9X3tJbmRldGVybWluYXRlfQ0KKyAzLjc4NzggXGNkb3QgXHRleHR7UmVzcG9uc2V9X3tTdHJ1Y3R1cmFsXCBJbmNvbXBsZXRlfQ0KXF0NCg0KIyMjIyAqKjQuNi40LiBOaOG6rW4geMOpdCoqDQoNCnwgQmnhur9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBI4buHIHPhu5EgXCggXGJldGEgXCkgfCBPUiAob2RkcyByYXRpbykgfCBHacOhIHRy4buLIHAgICAgIHwgw50gbmdoxKlhIHRo4buRbmcga8OqIHwgRGnhu4VuIGdp4bqjaSDDvSBuZ2jEqWEgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgUmVzcG9uc2U6IEV4Y2VsbGVudCAgICAgICAgICAgfCAtNS4xMzI3ICAgICAgICAgICB8IDAuMDA1OSAgICAgICAgICAgfCAzLjg1ZS0wNiAgICAgIHwgKipDw7MqKiAgICAgICAgICAgfCDEkMOhcCDhu6luZyDEkWnhu4F1IHRy4buLIHThu5F0IGdpw7pwIG5ndXkgY8ahIHTDoWkgcGjDoXQgZ+G6p24gYuG6sW5nIDAgfA0KfCBSZXNwb25zZTogSW5kZXRlcm1pbmF0ZSAgICAgICB8IC0xLjk1MjkgICAgICAgICAgIHwgMC4xNDIwICAgICAgICAgICB8IDAuMDAxNDEgICAgICAgfCAqKkPDsyoqICAgICAgICAgICB8IMSQw6FwIOG7qW5nIGtow7RuZyB4w6FjIMSR4buLbmggbMOgbSBnaeG6o20gb2RkcyB0w6FpIHBow6F0IHwNCnwgUmVzcG9uc2U6IFN0cnVjdHVyYWwgSW5jb21wbGV0ZSB8IDMuNzg3OCAgICAgICAgIHwgNDQuMTUxMyAgICAgICAgICB8IDYuODZlLTA2ICAgICAgfCAqKkPDsyoqICAgICAgICAgICB8IFThu5VuIHRoxrDGoW5nIGPhuqV1IHRyw7pjIGNoxrBhIGhvw6BuIHRvw6BuIGzDoG0gdMSDbmcgbeG6oW5oIG9kZHMgdMOhaSBwaMOhdCB8DQoNCipHaGkgY2jDujoqICANCi0gXCggXHRleHR7T1J9ID0gZV57XGJldGF9IFwpICANCi0gR2nDoSB0cuG7iyBwIDwgMC4wNSDEkcaw4bujYyDEkcOhbmggZOG6pXUgbMOgICoqQ8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqDQoNCiMjIyMgKio0LjYuNS4gS+G6v3QgbHXhuq1uKioNCg0KLSBNw7QgaMOsbmggbG9naXQgcGjDuSBo4bujcCDEkeG7gyBk4buxIMSRb8OhbiBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhLg0KLSBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHnhur91IHThu5EgbGnDqm4gcXVhbiDEkeG6v24gxJHDoXAg4bupbmcgxJFp4buBdSB0cuG7iyBjw7Mg4bqjbmggaMaw4bufbmcgbeG6oW5oIG5o4bqldCDEkeG6v24ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdC4NCi0gQ+G6p24gc28gc8OhbmggduG7m2kgbcO0IGjDrG5oICoqcHJvYml0KiogdsOgICoqY2xvZ2xvZyoqIMSR4buDIHjDoWMgxJHhu4tuaCBtw7QgaMOsbmggdOG7kWkgxrB1IG5o4bqldC4NCg0KIyMjICoqNC43IE3DtCBow6xuaCBQcm9iaXQqKg0KDQpgYGB7cn0NCiMgUHJvYml0DQptb2RlbF9wcm9iaXQgPC0gZ2xtKFJlY3VycmVkX2JpbiB+IEdlbmRlciArIFNtb2tpbmcgKyBIeC5SYWRpb3RocmVhcHkgKyBGb2NhbGl0eSArIFJlc3BvbnNlLA0KICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpLCBkYXRhID0gZGF0KQ0Kc3VtbWFyeShtb2RlbF9wcm9iaXQpDQpgYGANCg0KIyMjIyAqKjQuNy4xLiBQaMawxqFuZyB0csOsbmggbcO0IGjDrG5oOioqDQoNClxbDQpcUGhpXnstMX0oXHBpKSA9IC0wLjExMjggKyAwLjY2NTkgXGNkb3QgXHRleHR7R2VuZGVyTX0gLSAwLjIyNjAgXGNkb3QgXHRleHR7U21va2luZ1llc30gKyAxLjI2MzIgXGNkb3QgXHRleHR7SHguUmFkaW90aHJlYXB5OiDEkMOjIHThu6tuZyB44bqhIHRy4buLfSAtIDAuMTI2NSBcY2RvdCBcdGV4dHtGb2NhbGl0eTogVW5pLUZvY2FsfSAtIDIuNDc2OCBcY2RvdCBcdGV4dHtSZXNwb25zZTogRXhjZWxsZW50fSAtIDEuMTM4MSBcY2RvdCBcdGV4dHtSZXNwb25zZTogSW5kZXRlcm1pbmF0ZX0gKyAyLjA1NzQgXGNkb3QgXHRleHR7UmVzcG9uc2U6IFN0cnVjdHVyYWwgSW5jb21wbGV0ZX0NClxdDQoNClRyb25nIMSRw7M6DQotIFwoIFxQaGleey0xfShccGkpIFwpIGzDoCBow6BtIG5naOG7i2NoIMSR4bqjbyBj4bunYSBwaMOibiBwaOG7kWkgY2h14bqpbiB0w61jaCBsxal5IGNodeG6qW4g4oCUIHTGsMahbmcg4bupbmcgduG7m2kgaMOgbSBsaW5rICoqcHJvYml0KiouDQoNCi0tLQ0KDQojIyMjICoqNC43LjIuIELhuqNuZzogTmjhuq1uIHjDqXQgduG7gSBtw7QgaMOsbmggaOG7k2kgcXV5IFByb2JpdCoqDQoNCnwgQmnhur9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBI4buHIHPhu5EgXCggXGJldGEgXCkgfCBHacOhIHRy4buLIHAgICAgICAgfCDDnSBuZ2jEqWEgdGjhu5FuZyBrw6ogfCBEaeG7hW4gZ2nhuqNpIMO9IG5naMSpYSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IChJbnRlcmNlcHQpICAgICAgICAgICAgICAgICAgIHwgLTAuMTEyOCAgICAgICAgICAgfCAwLjcyNSAgICAgICAgICAgIHwgS2jDtG5nICAgICAgICAgICAgfCBLaMO0bmcgY8OzIMO9IG5naMSpYSB8DQp8IEdlbmRlck0gICAgICAgICAgICAgICAgICAgICAgIHwgMC42NjU5ICAgICAgICAgICAgfCAwLjA5MTkgICAgICAgICAgIHwgR+G6p24gY8OzICAgICAgICAgICB8IE5hbSBjw7MgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBjYW8gaMahbiBu4buvLCBn4bqnbiBt4bupYyDDvSBuZ2jEqWEgMTAlIHwNCnwgU21va2luZ1llcyAgICAgICAgICAgICAgICAgICAgfCAtMC4yMjYwICAgICAgICAgICB8IDAuNjIyMSAgICAgICAgICAgfCBLaMO0bmcgICAgICAgICAgICB8IEtow7RuZyDEkcOhbmcga+G7gyB8DQp8IEh4LlJhZGlvdGhyZWFweTogxJDDoyB04burbmcgeOG6oSB0cuG7iyB8IDEuMjYzMiAgICAgICAgICB8IDAuMzQ4OCAgICAgICAgICAgfCBLaMO0bmcgICAgICAgICAgICB8IENoxrBhIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGto4bqzbmcgxJHhu4tuaCBt4buRaSBsacOqbiBo4buHIHwNCnwgRm9jYWxpdHk6IFVuaS1Gb2NhbCAgICAgICAgICAgfCAtMC4xMjY1ICAgICAgICAgICB8IDAuNjUyOSAgICAgICAgICAgfCBLaMO0bmcgICAgICAgICAgICB8IEtow7RuZyDEkcOhbmcga+G7gyB8DQp8IFJlc3BvbnNlOiBFeGNlbGxlbnQgICAgICAgICAgIHwgLTIuNDc2OCAgICAgICAgICAgfCAyLjM2ZS0wOCAgICAgICAgIHwgKipDw7MqKiAgICAgICAgICAgfCBHaeG6o20gbeG6oW5oIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgbuG6v3UgxJHDoXAg4bupbmcgxJFp4buBdSB0cuG7iyB04buRdCB8DQp8IFJlc3BvbnNlOiBJbmRldGVybWluYXRlICAgICAgIHwgLTEuMTM4MSAgICAgICAgICAgfCAwLjAwMTA1ICAgICAgICAgIHwgKipDw7MqKiAgICAgICAgICAgfCBHaeG6o20geMOhYyBzdeG6pXQgdMOhaSBwaMOhdCB24bubaSDEkcOhcCDhu6luZyBraMO0bmcgeMOhYyDEkeG7i25oIHwNCnwgUmVzcG9uc2U6IFN0cnVjdHVyYWwgSW5jb21wbGV0ZSB8IDIuMDU3NCAgICAgICAgIHwgNS4xOWUtMDcgICAgICAgICB8ICoqQ8OzKiogICAgICAgICAgIHwgVMSDbmcgbeG6oW5oIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgduG7m2kgdOG7lW4gdGjGsMahbmcgY2jGsGEgaG/DoG4gdG/DoG4gfA0KDQoNCi0tLQ0KDQojIyMjICoqNC43LjMuIEvhur90IGx14bqtbjoqKg0KDQpNw7QgaMOsbmggUHJvYml0IGNobyB0aOG6pXkgY8OhYyBiaeG6v24gduG7gSAqKlJlc3BvbnNlKiogKMSR4bq3YyBiaeG7h3QgbMOgICJFeGNlbGxlbnQiIHbDoCAiU3RydWN0dXJhbCBJbmNvbXBsZXRlIikgY8OzIOG6o25oIGjGsOG7n25nIHLhuqV0IG3huqFuaCB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDEkeG6v24ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCB1bmcgdGjGsC4gQ8OhYyBiaeG6v24ga2jDoWMgbmjGsCBnaeG7m2kgdMOtbmggKEdlbmRlcikgY8OzIHh1IGjGsOG7m25nIOG6o25oIGjGsOG7n25nIG5oxrBuZyBjaMawYSDEkeG7pyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIDUlLg0KDQoNCiMjIyAqKjQuOCBNw7QgaMOsbmggQ2xvZ2xvZyoqDQoNCmBgYHtyfQ0KIyBDbG9nbG9nDQptb2RlbF9jbG9nbG9nIDwtIGdsbShSZWN1cnJlZF9iaW4gfiBHZW5kZXIgKyBTbW9raW5nICsgSHguUmFkaW90aHJlYXB5ICsgRm9jYWxpdHkgKyBSZXNwb25zZSwNCiAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpLCBkYXRhID0gZGF0KQ0Kc3VtbWFyeShtb2RlbF9jbG9nbG9nKQ0KYGBgDQoNCiMjIyMgKio0LjguMS4gUGjGsMahbmcgdHLDrG5oIG3DtCBow6xuaDoqKg0KDQpcWw0KXGxvZ1xsZWZ0KC1cbG9nKDEgLSBccGkpXHJpZ2h0KSA9IC0wLjYyNDYgKyAxLjEwMjAgXGNkb3QgXHRleHR7R2VuZGVyTX0gLSAwLjQ0MzYgXGNkb3QgXHRleHR7U21va2luZ1llc30gKyAxLjY3MjggXGNkb3QgXHRleHR7SHguUmFkaW90aHJlYXB5OiDEkMOjIHThu6tuZyB44bqhIHRy4buLfSArIDAuMDAyNSBcY2RvdCBcdGV4dHtGb2NhbGl0eTogVW5pLUZvY2FsfSAtIDQuODYyMyBcY2RvdCBcdGV4dHtSZXNwb25zZTogRXhjZWxsZW50fSAtIDEuNzExMiBcY2RvdCBcdGV4dHtSZXNwb25zZTogSW5kZXRlcm1pbmF0ZX0gKyAxLjkyMDUgXGNkb3QgXHRleHR7UmVzcG9uc2U6IFN0cnVjdHVyYWwgSW5jb21wbGV0ZX0NClxdDQoNCi0tLQ0KDQojIyMjICoqNC44LjIuIELhuqNuZzogTmjhuq1uIHjDqXQgduG7gSBtw7QgaMOsbmggaOG7k2kgcXV5IENsb2dsb2cqKg0KDQp8IEJp4bq/biAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSOG7hyBz4buRIFwoIFxiZXRhIFwpIHwgR2nDoSB0cuG7iyBwICAgICAgICB8IMOdIG5naMSpYSB0aOG7kW5nIGvDqiB8IERp4buFbiBnaeG6o2kgw70gbmdoxKlhIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IChJbnRlcmNlcHQpICAgICAgICAgICAgICAgICAgICB8IC0wLjYyNDYgICAgICAgICAgIHwgMC4xMTM5ICAgICAgICAgICB8IEtow7RuZyAgICAgICAgICAgIHwgS2jDtG5nIMSRw6FuZyBr4buDIHwNCnwgR2VuZGVyTSAgICAgICAgICAgICAgICAgICAgICAgIHwgMS4xMDIwICAgICAgICAgICAgfCAwLjA0NjUgICAgICAgICAgIHwgKipDw7MqKiAgICAgICAgICAgfCBOYW0gY8OzIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQgY2FvIGjGoW4gY8OzIMO9IG5naMSpYSDhu58gbeG7qWMgNSUgfA0KfCBTbW9raW5nWWVzICAgICAgICAgICAgICAgICAgICAgfCAtMC40NDM2ICAgICAgICAgICB8IDAuMzQ4NSAgICAgICAgICAgfCBLaMO0bmcgICAgICAgICAgICB8IEtow7RuZyDEkcOhbmcga+G7gyB8DQp8IEh4LlJhZGlvdGhyZWFweTogxJDDoyB04burbmcgeOG6oSB0cuG7i3wgMS42NzI4ICAgICAgICAgICAgfCAwLjUzMTQgICAgICAgICAgIHwgS2jDtG5nICAgICAgICAgICAgfCBLaMO0bmcgxJHDoW5nIGvhu4MgfA0KfCBGb2NhbGl0eTogVW5pLUZvY2FsICAgICAgICAgICAgfCAwLjAwMjUgICAgICAgICAgICB8IDAuOTk0MCAgICAgICAgICAgfCBLaMO0bmcgICAgICAgICAgICB8IEtow7RuZyDEkcOhbmcga+G7gyB8DQp8IFJlc3BvbnNlOiBFeGNlbGxlbnQgICAgICAgICAgICB8IC00Ljg2MjMgICAgICAgICAgIHwgNC4wN2UtMDYgICAgICAgICB8ICoqQ8OzKiogICAgICAgICAgIHwgR2nhuqNtIG3huqFuaCB4w6FjIHN14bqldCB0w6FpIHBow6F0IGtoaSDEkWnhu4F1IHRy4buLIHLhuqV0IHThu5F0IHwNCnwgUmVzcG9uc2U6IEluZGV0ZXJtaW5hdGUgICAgICAgIHwgLTEuNzExMiAgICAgICAgICAgfCAwLjAwMDcgICAgICAgICAgIHwgKipDw7MqKiAgICAgICAgICAgfCBHaeG6o20geMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBu4bq/dSDEkcOhcCDhu6luZyBraMO0bmcgeMOhYyDEkeG7i25oIHwNCnwgUmVzcG9uc2U6IFN0cnVjdHVyYWwgSW5jb21wbGV0ZXwgMS45MjA1ICAgICAgICAgICAgfCAyLjc5ZS0wNiAgICAgICAgIHwgKipDw7MqKiAgICAgICAgICAgfCBUxINuZyB4w6FjIHN14bqldCB0w6FpIHBow6F0IG7hur91IHThu5VuIHRoxrDGoW5nIGNoxrBhIGjhu5NpIHBo4bulYyBob8OgbiB0b8OgbiB8DQoNCi0tLQ0KDQojIyMjICoqNC44LjMuS+G6v3QgbHXhuq1uOioqDQoNCk3DtCBow6xuaCBjbG9nbG9nIGNobyB0aOG6pXkgcuG6sW5nIGPDoWMgeeG6v3UgdOG7kSAqKmdp4bubaSB0w61uaCAobmFtKSoqIHbDoCAqKsSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4sqKiBjw7Mg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIMSR4bq/biBraOG6oyBuxINuZyB0w6FpIHBow6F0IGLhu4duaC4gQ+G7pSB0aOG7gzoNCi0gTmFtIGdp4bubaSBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBjYW8gaMahbi4NCi0gQuG7h25oIG5ow6JuIGPDsyDEkcOhcCDhu6luZyAqKiJFeGNlbGxlbnQiKiogaG/hurdjICoqIkluZGV0ZXJtaW5hdGUiKiogc2F1IMSRaeG7gXUgdHLhu4sgY8OzIG5ndXkgY8ahIHTDoWkgcGjDoXQgdGjhuqVwIGjGoW4uDQotIE5nxrDhu6NjIGzhuqFpLCBu4bq/dSB04buVbiB0aMawxqFuZyBjaMawYSBo4buTaSBwaOG7pWMgaG/DoG4gdG/DoG4gKCoqIlN0cnVjdHVyYWwgSW5jb21wbGV0ZSIqKiksIG5ndXkgY8ahIHTDoWkgcGjDoXQgdMSDbmcgY2FvLg0KDQpNw7QgaMOsbmggcGjDuSBo4bujcCBraGkgcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IHTDoWkgcGjDoXQga2jDtG5nIMSR4buRaSB44bupbmcgaG/hurdjIG5naGnDqm5nIHbhu4EgZ2nDoSB0cuG7iyBuaOG7jywgcGjDuSBo4bujcCB24bubaSDEkeG6t2MgxJFp4buDbSBk4buLY2ggdOG7hSBo4buNYyBj4bunYSBi4buHbmggdW5nIHRoxrAgdHV54bq/biBnacOhcCB0w6FpIHBow6F0Lg0KDQojIyMgKio0LjkgU28gc8OhbmggdsOgIMSRw6FuaCBnacOhIGPDoWMgbcO0IGjDrG5oKioNCg0KYGBge3J9DQojIFNvIHPDoW5oIEFJQw0KYWljX3ZhbHVlcyA8LSBkYXRhLmZyYW1lKA0KICBNw7RfaMOsbmggPSBjKCJMb2dpdCIsICJQcm9iaXQiLCAiQ2xvZ2xvZyIpLA0KICBBSUMgPSBjKEFJQyhtb2RlbF9sb2dpdCksIEFJQyhtb2RlbF9wcm9iaXQpLCBBSUMobW9kZWxfY2xvZ2xvZykpDQopDQpwcmludChhaWNfdmFsdWVzKQ0KYGBgDQoNCioqQuG6o25nIEFJQyBj4bunYSBjw6FjIG3DtCBow6xuaCoqDQoNCnwgTcO0IGjDrG5oICAgfCBBSUMgICAgICAgIHwgTmjhuq1uIHjDqXQgduG7gSDEkeG7mSBwaMO5IGjhu6NwIHwNCnwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBMb2dpdCAgICAgfCAxMTguNDMgICAgIHwgUGjDuSBo4bujcCB0xrDGoW5nIMSR4buRaSB8DQp8IFByb2JpdCAgICB8IDExOC43NSAgICAgfCBQaMO5IGjhu6NwIHTGsMahbmcgdOG7sSBMb2dpdCB8DQp8IENsb2dsb2cgICB8ICoqMTE2Ljc5KiogfCAgVOG7kXQgbmjhuqV0IChBSUMgdGjhuqVwIG5o4bqldCB0cm9uZyBjw6FjIG3DtCBow6xuaCBuaOG7iyBwaMOibikgfA0KDQogKipMxrB1IMO9Kio6IE3DtCBow6xuaCBMUE0gKExpbmVhciBQcm9iYWJpbGl0eSBNb2RlbCkgbMOgIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCwga2jDtG5nIHRodeG7mWMgaOG7jSBwaMOibiBwaOG7kWkgbmjhu4sgdGjhu6ljIG7Dqm4gQUlDIGPDsyB0aOG7gyDDom0gdsOgIGtow7RuZyB0cuG7sWMgdGnhur9wIHNvIHPDoW5oIMSRxrDhu6NjIHbhu5tpIGPDoWMgbcO0IGjDrG5oIGxvZ2l0LCBwcm9iaXQsIGNsb2dsb2cuDQoNCi0tLQ0KDQoqKkvhur90IGx14bqtbjoqKg0KDQotICoqVHJvbmcgYmEgbcO0IGjDrG5oIG5o4buLIHBow6JuIChMb2dpdCwgUHJvYml0LCBDbG9nbG9nKToqKg0KICAtICoqQ2xvZ2xvZyBjw7MgQUlDIHRo4bqlcCBuaOG6pXQgKDExNi43OSkqKiDihpIgbcO0IGjDrG5oIGPDsyDEkeG7mSBwaMO5IGjhu6NwIHThu5F0IG5o4bqldC4NCiAgLSBMb2dpdCB2w6AgUHJvYml0IGPDsyBBSUMgeOG6pXAgeOG7iSBuaGF1IOKGkiBt4bupYyDEkeG7mSBwaMO5IGjhu6NwIHTGsMahbmcgxJHGsMahbmcuDQotICoqTFBNIGPDsyBBSUMgw6JtKiogKOKIkjE0NC4zNCkgZG8gdMOtbmggY2jhuqV0IGPhu6dhIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oLCAqKmtow7RuZyBuw6puIGTDuW5nIEFJQyDEkeG7gyDEkcOhbmggZ2nDoSBob+G6t2Mgc28gc8OhbmggduG7m2kgY8OhYyBtw7QgaMOsbmggbmjhu4sgcGjDom4qKi4NCi0gVuG7m2kgYmnhur9uIHBo4bulIHRodeG7mWMgZOG6oW5nIG5o4buLIHBow6JuLCAqKkNsb2dsb2cgbMOgIGzhu7FhIGNo4buNbiDGsHUgdGnDqm4qKiBu4bq/dSBt4bulYyB0acOqdSBsw6AgcGjDom4gdMOtY2ggY2jDrW5oIHjDoWMgeMOhYyBzdeG6pXQgdMOhaSBwaMOhdCBi4buHbmguDQoNCiMjICoqQ0jGr8agTkcgNTogS+G6vlQgTFXhuqxOLCBI4bqgTiBDSOG6viBWw4AgS0nhur5OIE5HSOG7iioqDQoNCiMjIyAqKjUuMS4gS+G6v3QgbHXhuq1uKiogDQoNCi0gTmdoacOqbiBj4bupdSDigJxQaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIHTDoWkgcGjDoXQgYuG7h25oIHVuZyB0aMawIHR1eeG6v24gZ2nDoXAgYmnhu4d0IGjDs2HigJ0gxJHDoyBz4butIGThu6VuZyBk4buvIGxp4buHdSB0aOG7sWMgdOG6vyBuaOG6sW0geMOhYyDEkeG7i25oIGPDoWMgeeG6v3UgdOG7kSBuZ3V5IGPGoSDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBj4bunYSBi4buHbmguIFRow7RuZyBxdWEgcGjDom4gdMOtY2ggaOG7k2kgcXV5IG5o4buLIHBow6JuIHbhu5tpIGJhIG3DtCBow6xuaCBwaOG7lSBiaeG6v24gbMOgIExvZ2l0LCBQcm9iaXQgdsOgIENvbXBsZW1lbnRhcnkgTG9nLWxvZywga+G6v3QgcXXhuqMgY2hvIHRo4bqleSBjw7MgaGFpIHnhur91IHThu5EgY2jDrW5oIGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24ga2jhuqMgbsSDbmcgdMOhaSBwaMOhdCBi4buHbmgsIGJhbyBn4buTbTogxJHhurdjIHTDrW5oIGto4buRaSB1IChmb2NhbGl0eSkgdsOgIG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIMSRaeG7gXUgdHLhu4sgKHJlc3BvbnNlKS4NCg0KLSBD4bulIHRo4buDLCBi4buHbmggbmjDom4gY8OzIGto4buRaSB1IMSRYSDhu5UgKG11bHRpLWZvY2FsKSBjw7Mgbmd1eSBjxqEgdMOhaSBwaMOhdCBjYW8gZ+G6pXAga2hv4bqjbmcgMiw1IGzhuqduIHNvIHbhu5tpIGLhu4duaCBuaMOibiBjw7Mga2jhu5FpIHUgxJHGoW4g4buVICh1bmktZm9jYWwpLiDEkMOieSBsw6AgeeG6v3UgdOG7kSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHRyb25nIGjhuqd1IGjhur90IGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSB2w6AgcGjDuSBo4bujcCB24bubaSBjw6FjIG5naGnDqm4gY+G7qXUgeSB2xINuIHRyxrDhu5tjIMSRw6J5IGtoaSBjaG8gcuG6sW5nIHThu5VuIHRoxrDGoW5nIGxhbiB04buPYSB0aMaw4budbmcgbGnDqm4gcXVhbiDEkeG6v24gdGnDqm4gbMaw4bujbmcgeOG6pXUgaMahbi4gxJDhurdjIGJp4buHdCwgeeG6v3UgdOG7kSDigJxyZXNwb25zZeKAnSB0aOG7gyBoaeG7h24gdmFpIHRyw7IgdGnDqm4gbMaw4bujbmcgcuG6pXQgbeG6oW5oLCBraGkgbmjDs20gYuG7h25oIG5ow6JuIGtow7RuZyDEkcOhcCDhu6luZyBob8OgbiB0b8OgbiB24bubaSDEkWnhu4F1IHRy4buLIGPDsyBraOG6oyBuxINuZyB0w6FpIHBow6F0IGNhbyBoxqFuIGtob+G6o25nIDcgbOG6p24gc28gduG7m2kgbmjDs20gxJHDoXAg4bupbmcgdOG7kXQuIFRyb25nIGtoaSDEkcOzLCBjw6FjIGJp4bq/biBuaMawIGdp4bubaSB0w61uaCwgdGnhu4FuIHPhu60geOG6oSB0cuG7iyB2w6AgdGjDs2kgcXVlbiBow7p0IHRodeG7kWMga2jDtG5nIGNobyB0aOG6pXkg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IHbDoCBraMO0bmcgxJHhuqF0IG3hu6ljIMO9IG5naMSpYSB0aOG7kW5nIGvDqiB0cm9uZyBtw7QgaMOsbmggcGjDom4gdMOtY2ggxJFhIGJp4bq/bi4NCg0KLSBTbyBzw6FuaCBnaeG7r2EgYmEgbcO0IGjDrG5oIExvZ2l0LCBQcm9iaXQgdsOgIENsb2dsb2cgY2hvIHRo4bqleSBz4buxIHTGsMahbmcgxJHhu5NuZyByw7UgcuG7h3QgduG7gSBoaeG7h3UgbsSDbmcgcGjDom4gbG/huqFpLiBD4bqjIGJhIG3DtCBow6xuaCDEkeG7gXUgxJHhuqF0IGNo4buJIHPhu5EgQVVDIGNhbyAodHLDqm4gMC45OCksIGNobyB0aOG6pXkga2jhuqMgbsSDbmcgcGjDom4gYmnhu4d0IHTDoWkgcGjDoXQgdsOgIGtow7RuZyB0w6FpIHBow6F0IHLhuqV0IHThu5F0LiBUdXkgbmhpw6puLCBtw7QgaMOsbmggaOG7k2kgcXV5IExvZ2lzdGljIGNo4buJIHPhu5EgQUlDIGPFqW5nIGfhuqduIG5oxrAgY2jDqm5oIGzhu4djaCBraMO0bmcgcXXDoSBs4bubbiBDbG9nbG9nIHbDoCBjxaluZyBk4buFIGTDoG5nIGRp4buFbiBnaeG6o2kgdGjDtG5nIHF1YSBvZGRzIHJhdGlvIHbDoCDEkcaw4bujYyBz4butIGThu6VuZyBwaOG7lSBiaeG6v24gdHJvbmcgbMSpbmggduG7sWMgeSBo4buNYyBuw6puIG3DtCBow6xuaCBMb2dpdCBsw6Aga2jDoSBwaMO5IGjhu6NwIHRyb25nIHBo4bqnbiB0w61jaCBuw6B5LiBWaeG7h2MgbOG7sWEgY2jhu41uIG3DtCBow6xuaCBwaMO5IGjhu6NwIGfDs3AgcGjhuqduIGjhu5cgdHLhu6MgdOG7kXQgaMahbiBjaG8gdmnhu4djIHRpw6puIGzGsOG7o25nIHbDoCDEkcawYSByYSBjw6FjIHF1eeG6v3QgxJHhu4tuaCBsw6JtIHPDoG5nIHRyb25nIHRo4buxYyBow6BuaCDEkWnhu4F1IHRy4buLIGLhu4duaCBuaMOibiB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhLg0KDQojIyMgKio1LjIuIEjhuqFuIGNo4bq/IGPhu6dhIG5naGnDqm4gY+G7qXUqKg0KDQotIE3hurdjIGTDuSBuZ2hpw6puIGPhu6l1IMSRw6MgY3VuZyBj4bqlcCBuaGnhu4F1IHBow6F0IGhp4buHbiBjw7MgZ2nDoSB0cuG7iywgduG6q24gdOG7k24gdOG6oWkgbeG7mXQgc+G7kSBo4bqhbiBjaOG6vy4gDQoNCi0gxJDhuqd1IHRpw6puLCBt4buZdCBz4buRIHnhur91IHThu5EgbMOibSBzw6BuZyBjw7MgZ2nDoSB0cuG7iyB0acOqbiBsxrDhu6NuZyB0w6FpIHBow6F0IHRyb25nIHRo4buxYyB0aeG7hW4gbmjGsCBu4buTbmcgxJHhu5kgdGh5cm9nbG9idWxpbiAoVGcpLCB0aOG7nWkgZ2lhbiBuaMOibiDEkcO0aSBUZyAoVGdEVCksIGhv4bq3YyBjw6FjIMSR4buZdCBiaeG6v24gZ2VuIG5oxrAgQlJBRiB2w6AgUkVUIHbhuqtuIGNoxrBhIMSRxrDhu6NjIMSRxrBhIHbDoG8gbcO0IGjDrG5oIGRvIGjhuqFuIGNo4bq/IHbhu4EgZOG7ryBsaeG7h3UuIMSQw6J5IGzDoCBuaOG7r25nIHnhur91IHThu5EgxJHDoyDEkcaw4bujYyBjaOG7qW5nIG1pbmggY8OzIHZhaSB0csOyIHF1YW4gdHLhu41uZyB0cm9uZyB0acOqbiBsxrDhu6NuZyB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhIOG7nyBuaGnhu4F1IG5naGnDqm4gY+G7qXUgdHLGsOG7m2MuDQoNCi0gS+G6vyB0aeG6v3AsIGvDrWNoIHRoxrDhu5tjIG3huqt1IHbDoCBwaOG6oW0gdmkgdGh1IHRo4bqtcCBk4buvIGxp4buHdSB24bqrbiBjw7JuIGjhuqFuIGNo4bq/LiBE4buvIGxp4buHdSBjaMawYSBtYW5nIHTDrW5oIMSR4bqhaSBkaeG7h24gdG/DoG4gcXXhu5FjIGhv4bq3YyDEkWEgdHJ1bmcgdMOibSwgZG8gxJHDsyB0w61uaCBraMOhaSBxdcOhdCBj4bunYSBr4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1IHbhuqtuIGPDsm4ga2hpw6ptIHThu5FuLiBOZ2/DoGkgcmEsIG5naGnDqm4gY+G7qXUgY8WpbmcgY2jGsGEgcGjDom4gdMOtY2ggcmnDqm5nIGJp4buHdCDEkeG7kWkgduG7m2kgdOG7q25nIHRo4buDIG3DtCBo4buNYyBj4bunYSB1bmcgdGjGsCB0dXnhur9uIGdpw6FwIGJp4buHdCBow7NhIG5oxrAgdGjhu4MgbmjDuiwgdGjhu4MgbmFuZyBob+G6t2MgdGjhu4MgdOG6vyBiw6BvIEh1cnRobGUsIHRyb25nIGtoaSDEkcOieSBsw6Agbmjhu69uZyB0aOG7gyBi4buHbmggY8OzIMSR4bq3YyDEkWnhu4NtIHRp4bq/biB0cmnhu4NuIHbDoCB0acOqbiBsxrDhu6NuZyBraMOhYyBuaGF1Lg0KDQojIyMgKio1LjMuIEtp4bq/biBuZ2jhu4sqKg0KDQotIEThu7FhIHRyw6puIG5o4buvbmcga+G6v3QgcXXhuqMgdsOgIGjhuqFuIGNo4bq/IG7DqnUgdHLDqm4sIG5naGnDqm4gY+G7qXUgxJHhu4EgeHXhuqV0IG3hu5l0IHPhu5EgaMaw4bubbmcgcGjDoXQgdHJp4buDbiB2w6Ag4bupbmcgZOG7pW5nIHRo4buxYyB0aeG7hW4uIFRyxrDhu5tjIGjhur90LCBj4bqnbiB0aeG6v24gaMOgbmggY8OhYyBuZ2hpw6puIGPhu6l1IHF1eSBtw7QgbOG7m24gaMahbiwgY8OzIHRoaeG6v3Qga+G6vyB0aeG6v24gY+G7qXUgdsOgIHRoZW8gZMO1aSBkw6BpIGjhuqFuLCBuaOG6sW0ga2nhu4NtIMSR4buLbmggxJHhu5kgY2jDrW5oIHjDoWMgdsOgIMSR4buZIOG7lW4gxJHhu4tuaCBj4bunYSBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHJvbmcgxJFp4buBdSBraeG7h24gdGjhu7FjIHThur8uIFZp4buHYyB0aHUgdGjhuq1wIGLhu5Ugc3VuZyBjw6FjIGNo4buJIHPhu5Egc2luaCBo4buNYyB2w6AgZGkgdHJ1eeG7gW4gbmjGsCBUZywgVGdEVCwgQlJBRiwgUkVUIGzDoCBj4bqnbiB0aGnhur90IMSR4buDIHTEg25nIGPGsOG7nW5nIGto4bqjIG7Eg25nIGThu7EgYsOhbyB0w6FpIHBow6F0Lg0KDQotIFbhu4EgbeG6t3Qg4bupbmcgZOG7pW5nIGzDom0gc8OgbmcsIG7Dqm4gY2jDuiB0cuG7jW5nIMSRw6FuaCBnacOhIHbDoCB0aGVvIGTDtWkgY2jhurd0IGNo4bq9IGPDoWMgYuG7h25oIG5ow6JuIGPDsyBraOG7kWkgdSDEkWEg4buVIGhv4bq3YyDEkcOhcCDhu6luZyDEkWnhu4F1IHRy4buLIGtow7RuZyBob8OgbiB0b8OgbiwgdsOsIMSRw6J5IGzDoCBoYWkgbmjDs20gY8OzIG5ndXkgY8ahIHTDoWkgcGjDoXQgY2FvIG5o4bqldC4gVmnhu4djIHRoaeG6v3QgbOG6rXAgY8OhYyBwaMOhYyDEkeG7kyB0aGVvIGTDtWkgY8OhIG5ow6JuIGjDs2EgZOG7sWEgdHLDqm4gbmd1eSBjxqEgdMOhaSBwaMOhdCBsw6AgY+G6p24gdGhp4bq/dCDEkeG7gyB04buRaSDGsHUgaMOzYSBoaeG7h3UgcXXhuqMgxJFp4buBdSB0cuG7iyB2w6AgY+G6o2kgdGhp4buHbiBjaOG6pXQgbMaw4bujbmcgc+G7kW5nIGNobyBi4buHbmggbmjDom4uDQoNCi0gQsOqbiBj4bqhbmggxJHDsywgY+G6p24gdMSDbmcgY8aw4budbmcgdHJ1eeG7gW4gdGjDtG5nIHkgdOG6vyB24buBIGPDoWMgdHJp4buHdSBjaOG7qW5nIHTDoWkgcGjDoXQgbmjGsCBu4buVaSBo4bqhY2ggY+G7lSwga2jDoG4gdGnhur9uZyBrw6lvIGTDoGksIGtow7MgdGjhu58sIHPhu6V0IGPDom7igKYgxJHhu4MgYuG7h25oIG5ow6JuIGPDsyB0aOG7gyBuaOG6rW4gYmnhur90IHPhu5ttIHbDoCDEkeG6v24ga2jDoW0ga+G7i3AgdGjhu51pLiBDw6FjIGNoxrDGoW5nIHRyw6xuaCBnacOhbyBk4bulYyB24buBIGzhu5FpIHPhu5FuZyBsw6BuaCBt4bqhbmgsIGtow7RuZyBow7p0IHRodeG7kWMsIGR1eSB0csOsIGNo4bq/IMSR4buZIGRpbmggZMaw4buhbmcgaOG7o3AgbMO9IHbDoCB0aW5oIHRo4bqnbiB0w61jaCBj4buxYyBjxaluZyBuw6puIMSRxrDhu6NjIGzhu5NuZyBnaMOpcCB0cm9uZyBr4bq/IGhv4bqhY2ggxJFp4buBdSB0cuG7iyB04buVbmcgdGjhu4MuDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==