1 . TÓM TẮT TÀI LIỆU

Tóm tắt tài liệu: Các mô hình hồi quy tuyến tính tổng quát với các ví dụ trong R

Ngày: 26 tháng 10 năm 2023

Nguồn: Các trích đoạn từ “2019_Generalized Linear Models With Examples in R_9781441901170.pdf”

Mục tiêu:

Tài liệu này tóm tắt các chủ đề chính và các ý tưởng quan trọng được trình bày trong các chương đầu tiên và các phần được trích dẫn của cuốn sách “Generalized Linear Models With Examples in R”, tập trung vào các khái niệm về mô hình thống kê, hồi quy tuyến tính và các mô hình tuyến tính tổng quát, cũng như các phương pháp chẩn đoán và ước lượng liên quan.

Các chủ đề chính và ý tưởng quan trọng:

1.1 Mô hình Thống kê (Chương 1):

Giới thiệu: Chương này giới thiệu khái niệm cơ bản về mô hình thống kê như một cách để mô tả cả các đặc điểm ngẫu nhiên và có hệ thống của dữ liệu. Nó nhấn mạnh tầm quan trọng của việc sử dụng các mô hình để phân tích dữ liệu (“Data analysis: The need for models?” - Reese, 1986).

Mục đích của mô hình thống kê: Mục đích của một mô hình ảnh hưởng đến cách nó được phát triển (Mục 1.9). Các mục đích có thể bao gồm mô tả, dự đoán và hiểu mối quan hệ giữa các biến.

“Tất cả các mô hình đều sai, nhưng một số hữu ích”: Một ý tưởng quan trọng được trích dẫn từ một nguồn khác (không được cung cấp đầy đủ trong trích đoạn) là các mô hình là sự đơn giản hóa thực tế và do đó không bao giờ hoàn toàn chính xác, nhưng chúng có thể là công cụ có giá trị để hiểu dữ liệu (Mục 1.8).

Độ chính xác so với sự đơn giản: Có sự đánh đổi giữa độ chính xác của một mô hình (khả năng phù hợp chặt chẽ với dữ liệu) và sự đơn giản của nó (số lượng tham số). Việc lựa chọn mô hình thường liên quan đến việc cân bằng hai yếu tố này (Mục 1.10).

Thực nghiệm so với nghiên cứu quan sát: Cuốn sách phân biệt giữa thực nghiệm (nơi có thể suy luận nguyên nhân - kết quả) và nghiên cứu quan sát (nơi chỉ có thể thiết lập mối liên hệ) (Mục 1.11).

Thu thập dữ liệu và khả năng khái quát hóa: Chất lượng và phương pháp thu thập dữ liệu ảnh hưởng đến khả năng khái quát hóa các kết quả từ mô hình (Mục 1.12).

Sử dụng R để mô hình hóa thống kê: Cuốn sách sử dụng ngôn ngữ và môi trường R (R Development Core Team, 2017) để minh họa các kỹ thuật mô hình hóa (Mục 1.13).

1.2 Mô hình hồi quy tuyến tính (Chương 2):

Định nghĩa: Chương này định nghĩa các mô hình hồi quy tuyến tính (Mục 2.2).

Hồi quy tuyến tính đơn giản và bội: Bao gồm cả hồi quy tuyến tính đơn giản (một biến giải thích) và hồi quy bội (nhiều biến giải thích) (Mục 2.3, 2.4).

Ước lượng bình phương nhỏ nhất: Phương pháp ước lượng chính cho các hệ số trong hồi quy tuyến tính là ước lượng bình phương nhỏ nhất (Least-Squares Estimation) (Mục 2.3.1, 2.4.1).

Công thức ma trận: Các khái niệm hồi quy tuyến tính được trình bày bằng công thức ma trận, bao gồm ước lượng hệ số và ước lượng phương sai (Mục 2.5):

Ký hiệu ma trận: “Matrix Notation” (Mục 2.5.1)

Ước lượng hệ số: “Coefficient Estimates” (Mục 2.5.2)

Ước lượng phương sai σ²: “Estimating the Variance σ²” (Mục 2.5.3)

Ước lượng phương sai của β̂: “Estimating the Variance of β̂” (Mục 2.5.4)

Suy luận cho các mô hình hồi quy tuyến tính: Thảo luận về kiểm định t-test và khoảng tin cậy cho các hệ số hồi quy và giá trị phù hợp (Mục 2.8).

Phân tích phương sai cho các mô hình hồi quy: Sử dụng ANOVA để so sánh các mô hình lồng nhau (Mục 2.9, 2.10).

Lựa chọn mô hình: Các tiêu chí như AIC và BIC được giới thiệu để lựa chọn giữa các mô hình không lồng nhau (Mục 2.11). Các phương pháp tự động để lựa chọn mô hình cũng được thảo luận, cùng với các phản đối việc sử dụng các thủ tục từng bước (Mục 2.12).

Sử dụng R: Cách sử dụng R để phù hợp với các mô hình hồi quy tuyến tính được cung cấp (Mục 2.14).

1.3 Mô hình hồi quy tuyến tính: Chẩn đoán và xây dựng mô hình (Chương 3):

Các giả định: Chương này tập trung vào các giả định của mô hình hồi quy tuyến tính từ góc độ thực tế, bao gồm linear predictor, phương sai không đổi, tính độc lập và tính chuẩn (Mục 3.2).

Phần dư và Leverages: Giới thiệu các loại phần dư (residuals) và leverages (Mục 3.3, 3.4).

Biểu đồ phần dư: Biểu đồ phần dư là công cụ quan trọng để kiểm tra các giả định mô hình (Mục 3.5):

Biểu đồ phần dư chống lại xj: Kiểm tra tính tuyến tính (“Plot Residuals Against xj : Linearity”) (Mục 3.5.1).

Biểu đồ phần dư một phần: “Partial Residual Plots” (Mục 3.5.2).

Một ví dụ được cung cấp với mã R và kết quả (Fig. 3.3).

Biểu đồ phần dư chống lại μ̂: Kiểm tra phương sai không đổi (“Plot Residuals Against μ̂: Constant Variance”) (Mục 3.5.3).

Các ví dụ về biểu đồ lý tưởng và các vấn đề như phi tuyến tính và phương sai không đổi được minh họa (“Some example plots of the standardized residuals r′ plotted against the fitted values μ̂. The effects are exaggerated from what is usually seen in practice”) (Fig. 3.4).

Biểu đồ Q–Q: Kiểm tra tính chuẩn (“Q–Q Plots and Normality”) (Mục 3.5.4).

Biểu đồ Lag: Kiểm tra sự phụ thuộc theo thời gian (“Lag Plots and Dependence over Time”) (Mục 3.5.5). Các ví dụ về biểu đồ phần dư độc lập và tương quan âm được hiển thị (Fig. 3.5).

Các điểm ngoại lai và các quan sát có ảnh hưởng: Xác định các quan sát có vấn đề bằng cách sử dụng phần dư studentized và các chỉ số ảnh hưởng như Cook’s distance (Mục 3.6).

Khắc phục sự cố: Các phương pháp để giải quyết các vấn đề đã xác định, bao gồm biến đổi biến phản hồi và biến giải thích (Mục 3.8, 3.9, 3.10). Biểu đồ phần dư được sử dụng để minh họa hiệu quả của việc biến đổi (Fig. 3.6).

Đa cộng tuyến: Thảo luận về vấn đề đa cộng tuyến (collinearity) (Mục 3.14).

Nghiên cứu điển hình: Các ví dụ thực tế được trình bày để minh họa các khái niệm chẩn đoán (Mục 3.15).

1.4 Ý tưởng ước lượng khả năng xảy ra cực đại (Chương 4):

Khái quát hóa mô hình tuyến tính chuẩn: Chương này bắt đầu bằng cách khái quát hóa mô hình tuyến tính chuẩn (Mục 4.3).

Ước lượng khả năng xảy ra cực đại (Maximum Likelihood Estimation - MLE): Giới thiệu nguyên tắc của ước lượng khả năng xảy ra cực đại (Mục 4.4).

MLE cho một và nhiều tham số: Trình bày cách tính MLE cho trường hợp một tham số và nhiều tham số (Mục 4.5, 4.6).

Công thức ma trận cho MLE: MLE được trình bày bằng công thức ma trận, bao gồm phương trình Score, thông tin (quan sát và kỳ vọng) và sai số chuẩn của các tham số (Mục 4.7):

Ký hiệu: “Notation” (Mục 4.7.1)

Phương trình Score: “Score Equations” (Mục 4.7.2)

Thông tin: Quan sát và Kỳ vọng: “Information: Observed and Expected” (Mục 4.7.3)

Sai số chuẩn của các tham số: “Standard Errors of Parameters” (Mục 4.7.4)

Thuật toán Fisher Scoring: Phương pháp lặp để tính toán MLEs (Mục 4.8).

Các thuộc tính của MLEs: Thảo luận về các thuộc tính mong muốn của MLEs (Mục 4.9).

Kiểm định giả thuyết: Sử dụng các kết quả tiệm cận mẫu lớn cho kiểm định giả thuyết, bao gồm Wald tests, Likelihood Ratio Tests và Score Tests (Mục 4.10).

Sử dụng R: Cung cấp mã R để phù hợp với các mô hình (Mục 4.14).

1.5 Các mô hình tuyến tính tổng quát (GLMs): Cấu trúc (Chương 5):

Giới thiệu GLMs: Chương này giới thiệu các mô hình tuyến tính tổng quát (Generalized Linear Models) như một khung linh hoạt mở rộng mô hình hồi quy tuyến tính chuẩn (Mục 5.1).

Hai thành phần: GLMs bao gồm hai thành phần chính: thành phần ngẫu nhiên (phân phối xác suất của biến phản hồi) và thành phần có hệ thống (hàm tuyến tính của các biến giải thích) (Mục 5.2).

Thành phần ngẫu nhiên: Mô hình phân tán hàm mũ (Exponential Dispersion Models - EDMs) được sử dụng để mô tả thành phần ngẫu nhiên (Mục 5.3). Các ví dụ về EDMs và định nghĩa toán học được cung cấp.

Hàm phương sai: Khái niệm hàm phương sai được giới thiệu (Mục 5.3.6).

Dạng mô hình phân tán: EDMs có thể được biểu diễn dưới dạng mô hình phân tán, bao gồm deviance đơn vị (unit deviance) (Mục 5.4).

Thành phần có hệ thống: Bao gồm hàm liên kết (link function) kết nối giá trị trung bình của biến phản hồi với thành phần có hệ thống (Mục 5.5.1) và offsets (Mục 5.5.2).

Định nghĩa GLMs: Một định nghĩa chính thức về GLMs được trình bày (Mục 5.6).

Total Deviance: Khái niệm total deviance được giải thích (Mục 5.7).

Quan hệ với hồi quy tuyến tính: Thảo luận về cách biến đổi hồi quy ước tính GLMs (Mục 5.8).

1.6 Các mô hình tuyến tính tổng quát: Ước lượng (Chương 6):

Tính toán khả năng xảy ra: Trình bày cách tính toán khả năng xảy ra (likelihood) cho các hệ số β trong GLMs (Mục 6.2).

Phương trình Score và Thông tin: Giới thiệu phương trình Score và thông tin cho β (Mục 6.2.2).

Tính toán ước lượng của β: Trình bày các phương pháp để tính toán ước lượng của β (Mục 6.3).

Residual Deviance: Khái niệm residual deviance được giải thích (Mục 6.4).

Sai số chuẩn cho β̂: Cách ước tính sai số chuẩn cho các ước lượng hệ số (Mục 6.5).

Ước lượng β: Công thức ma trận: Công thức ma trận cho ước lượng β trong GLMs (Mục 6.6).

Ước lượng GLMs giống hồi quy tuyến tính cục bộ: Ý tưởng rằng việc ước lượng GLMs cục bộ giống như hồi quy tuyến tính (Mục 6.7).

Ước lượng φ: Các phương pháp khác nhau để ước lượng tham số phân tán φ, bao gồm MLE, Modified Profile Log-Likelihood Estimator, Mean Deviance Estimator và Pearson Estimator (Mục 6.8).

Sử dụng R: Cách sử dụng R để phù hợp với GLMs (Mục 6.9).

1.7 Các mô hình tuyến tính tổng quát: Suy luận (Chương 7):

Suy luận cho các hệ số khi φ đã biết: Trình bày cách thực hiện suy luận (kiểm định giả thuyết và khoảng tin cậy) cho các hệ số khi tham số phân tán φ đã biết (Mục 7.2). Bao gồm Wald Tests, khoảng tin cậy cho hệ số và giá trị trung bình, Likelihood Ratio Tests và Analysis of Deviance Tables.

Kiểm định Wald, Score và Likelihood Ratio: So sánh ba loại kiểm định giả thuyết này (Mục 7.7).

Lựa chọn giữa các GLMs không lồng nhau: Sử dụng AIC và BIC để lựa chọn mô hình (Mục 7.8).

Phương pháp tự động cho lựa chọn mô hình: (Mục 7.9).

Sử dụng R: Cách sử dụng R để thực hiện các kiểm định (Mục 7.10).

1.8 Các mô hình tuyến tính tổng quát: Chẩn đoán (Chương 8):

Các giả định của GLMs: Thảo luận về các giả định của GLMs (Mục 8.2).

Các loại phần dư cho GLMs: Giới thiệu các loại phần dư khác nhau phù hợp với GLMs, bao gồm Response Residuals (không đủ), Pearson Residuals, Deviance Residuals và Quantile Residuals (Mục 8.3).

Leverages trong GLMs: Khái niệm leverages và hat matrix trong bối cảnh GLMs (Mục 8.4).

Leverage Standardized Residuals: Giới thiệu leverage standardized residuals (Mục 8.5).

Khi nào sử dụng loại phần dư nào: Hướng dẫn về việc lựa chọn loại phần dư phù hợp (Mục 8.6).

Kiểm tra các giả định mô hình: Sử dụng các biểu đồ phần dư để kiểm tra các giả định về tính độc lập, thành phần có hệ thống và thành phần ngẫu nhiên (Mục 8.7). Các biểu đồ điển hình được minh họa, chẳng hạn như biểu đồ phần dư chống lại các giá trị phù hợp (Fig. 8.5, top panels).

Các điểm ngoại lai và các quan sát có ảnh hưởng: Xác định các quan sát có vấn đề trong GLMs (Mục 8.8).

Khắc phục sự cố: Các phương pháp để giải quyết các vấn đề đã xác định, tương tự như trong hồi quy tuyến tính, nhưng được điều chỉnh cho GLMs. Các biểu đồ được sử dụng để minh họa sự cải thiện sau khi áp dụng các biện pháp khắc phục (Fig. 8.9).

Quasi-Likelihood và Extended Quasi-Likelihood: Giới thiệu các khái niệm này để xử lý trường hợp phương sai không được xác định hoàn toàn bởi giá trị trung bình (Mục 8.10).

Đa cộng tuyến: Thảo luận về đa cộng tuyến trong GLMs (Mục 8.11).

Nghiên cứu điển hình: Các ví dụ thực tế minh họa việc chẩn đoán GLMs (Mục 8.12).

Sử dụng R: Cách sử dụng R để phân tích chẩn đoán của GLMs (Mục 8.13).

1.9 Mô hình cho tỷ lệ: Binomial GLMs (Chương 9):

Mô hình hóa tỷ lệ: Ứng dụng GLMs cho dữ liệu tỷ lệ, nơi biến phản hồi là số lần thành công trong một số lần thử cố định (Mục 9.2). Phân phối Binomial là thành phần ngẫu nhiên điển hình.

Hàm liên kết: Thảo luận về các hàm liên kết khác nhau phù hợp với Binomial GLMs, chẳng hạn như probit link (Mục 9.4), logit link (Mục 9.5) và complementary log-log link (Mục 9.7).

Tỷ lệ Odds và Logit Link: Giải thích khái niệm tỷ lệ odds và mối quan hệ của nó với logit link (Mục 9.5).

Overdispersion: Xử lý vấn đề overdispersion (khi phương sai lớn hơn giả định của phân phối Binomial) (Mục 9.8).

Khi Wald Tests thất bại: Thảo luận về các hạn chế của Wald Tests trong một số trường hợp (Mục 9.9).

Goodness-of-Fit cho binary responses: Lưu ý rằng goodness-of-fit cho binary responses (dữ liệu nhị phân) không có sẵn (Mục 9.10).

Sử dụng R: Cách sử dụng R để phù hợp với Binomial GLMs (Mục 9.12).

1.10 Mô hình cho số lượng: Poisson và Negative Binomial GLMs (Chương 10):

Poisson GLMs: Tóm tắt các đặc điểm của Poisson GLMs, phù hợp với dữ liệu đếm (count data) (Mục 10.2). Phân phối Poisson là thành phần ngẫu nhiên.

Mô hình hóa tỷ lệ (Rates): Sử dụng GLMs để mô hình hóa tỷ lệ (ví dụ: số sự kiện trên một đơn vị thời gian hoặc diện tích) bằng cách sử dụng offsets (Mục 10.3).

Bảng tương tác: Log-Linear Models: Áp dụng Poisson GLMs cho bảng tương tác để phân tích dữ liệu phân loại bằng cách sử dụng log-linear models (Mục 10.4). Bao gồm các bảng hai chiều và ba chiều.

Nghịch lý Simpson: Minh họa nghịch lý Simpson trong bối cảnh bảng tương tác (Mục 10.4.5).

Sự tương đương giữa Binomial và Poisson GLMs: Thảo luận về sự tương đương giữa hai loại mô hình này trong một số trường hợp (Mục 10.4.6).

Negative Binomial GLMs: Giới thiệu Negative Binomial GLMs như một cách để xử lý overdispersion trong dữ liệu đếm (Mục 10.5).

Nghiên cứu điển hình: Ví dụ về mô hình hóa số lượng vệ tinh trên cua móng ngựa cái, sử dụng các biến giải thích như trọng lượng, màu sắc, chiều rộng và tình trạng gai (Fig. 10.6). Các biểu đồ chẩn đoán, bao gồm deviance residuals chống lại căn bậc hai của giá trị phù hợp và Cook’s distance, được hiển thị (Fig. 10.7). So sánh các mô hình Quasi-poisson và Negative binomial được minh họa (Fig. 10.8).

Sử dụng R: Cách sử dụng R để phù hợp với Poisson và Negative Binomial GLMs (Mục 10.7).

1.11 Dữ liệu liên tục dương: Gamma và Inverse Gaussian GLMs (Chương 11):

Mô hình hóa dữ liệu liên tục dương: Giới thiệu các GLMs phù hợp cho dữ liệu liên tục chỉ nhận các giá trị dương (Mục 11.2).

Phân phối Gamma: Thảo luận về phân phối Gamma như một thành phần ngẫu nhiên phù hợp cho loại dữ liệu này (Mục 11.3).

Phân phối Inverse Gaussian: Thảo luận về phân phối Inverse Gaussian (Mục 11.4).

Hàm liên kết: Các hàm liên kết phù hợp cho Gamma và Inverse Gaussian GLMs (Mục 11.5). Các biểu đồ phần dư (quantile residuals) được sử dụng để đánh giá sự phù hợp của mô hình log-link (Fig. 11.7).

Ước lượng tham số phân tán: Cách ước lượng tham số phân tán φ cho phân phối Gamma và Inverse Gaussian (Mục 11.6).

Nghiên cứu điển hình: Các ví dụ thực tế về việc áp dụng các mô hình này (Mục 11.7).

Sử dụng R: Cách sử dụng R để phù hợp với Gamma và Inverse Gaussian GLMs (Mục 11.8).

1.12 Tweedie GLMs (Chương 12):

Tweedie EDMs: Giới thiệu các phân phối Tweedie, một lớp con của EDMs, phù hợp cho dữ liệu liên tục dương và dữ liệu với các giá trị không chính xác (Mục 12.2).

Cấu trúc Tweedie EDMs: Mô tả cấu trúc của Tweedie EDMs (Mục 12.2.2).

Dữ liệu liên tục dương và dữ liệu có giá trị không chính xác: Thảo luận về ứng dụng của Tweedie EDMs cho các loại dữ liệu này (Mục 12.2.3, 12.2.4).

Tweedie GLMs: Định nghĩa và cách ước lượng Tweedie GLMs (Mục 12.3). Bao gồm ước lượng tham số index ξ (Mục 12.3.2) và cách phù hợp với mô hình (Mục 12.3.3).

Nghiên cứu điển hình: Các ví dụ thực tế về việc áp dụng Tweedie GLMs (Mục 12.4).

Sử dụng R: Cách sử dụng R để phù hợp với Tweedie GLMs (Mục 12.5).

Các khía cạnh quan trọng khác:

Sử dụng R: Cuốn sách tích hợp chặt chẽ việc sử dụng R để minh họa và thực hiện các kỹ thuật mô hình hóa. Có một phần phụ lục dành riêng cho việc sử dụng R cho phân tích dữ liệu (Appendix A).

Các vấn đề và Tài liệu tham khảo: Mỗi chương đều có các vấn đề bài tập và tài liệu tham khảo liên quan.

Dữ liệu: Cuốn sách sử dụng gói GLMsData trong R, chứa các bộ dữ liệu được sử dụng trong các ví dụ (Appendix B).

=> Tóm lại, tài liệu này cung cấp một cái nhìn tổng quan chi tiết về các mô hình hồi quy tuyến tính và mô hình tuyến tính tổng quát, tập trung vào các khía cạnh lý thuyết, phương pháp ước lượng (đặc biệt là bình phương nhỏ nhất và khả năng xảy ra cực đại), suy luận thống kê và chẩn đoán mô hình. Việc sử dụng R được tích hợp xuyên suốt để hỗ trợ việc học và áp dụng các kỹ thuật này.

Xin lưu ý rằng bản tóm tắt này dựa trên mục lục và các đoạn trích được cung cấp. Để có hiểu biết đầy đủ, cần đọc toàn bộ cuốn sách.

2 . THỐNG KÊ MÔ TẢ CÁC BIẾN

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

variable_explain <- data.frame(
  Ten_Bien = c("Unnamed: 0", "PurchaseDate", "CustomerID", "Gender", "MaritalStatus", 
               "Homeowner", "Children", "AnnualIncome", "City", "StateorProvince", 
               "Country", "ProductFamily", "ProductDepartment", "ProductCategory", 
               "UnitsSold", "Revenue"),
  Y_Nghia = c("Chỉ số dòng (tự sinh, có thể bỏ qua)",
              "Ngày mua hàng",
              "Mã khách hàng",
              "Giới tính của khách hàng (M = Nam, F = Nữ)",
              "Tình trạng hôn nhân (S = Độc thân, M = Đã kết hôn)",
              "Có sở hữu nhà không (Y = Có, N = Không)",
              "Số lượng con của khách hàng",
              "Mức thu nhập hàng năm (ví dụ: $30K - $50K)",
              "Thành phố nơi khách hàng sống",
              "Bang hoặc tỉnh",
              "Quốc gia (trong file là USA)",
              "Nhóm sản phẩm chính (ví dụ: Food, Drink)",
              "Phòng ban sản phẩm (ví dụ: Snack Foods, Produce)",
              "Danh mục chi tiết sản phẩm (ví dụ: Candy, Vegetables)",
              "Số lượng sản phẩm đã bán",
              "Doanh thu từ đơn hàng (USD)")
)
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
kable(variable_explain, caption = " Giải thích các biến trong file dữ liệu")
Giải thích các biến trong file dữ liệu
Ten_Bien Y_Nghia
Unnamed: 0 Chỉ số dòng (tự sinh, có thể bỏ qua)
PurchaseDate Ngày mua hàng
CustomerID Mã khách hàng
Gender Giới tính của khách hàng (M = Nam, F = Nữ)
MaritalStatus Tình trạng hôn nhân (S = Độc thân, M = Đã kết hôn)
Homeowner Có sở hữu nhà không (Y = Có, N = Không)
Children Số lượng con của khách hàng
AnnualIncome Mức thu nhập hàng năm (ví dụ: $30K - $50K)
City Thành phố nơi khách hàng sống
StateorProvince Bang hoặc tỉnh
Country Quốc gia (trong file là USA)
ProductFamily Nhóm sản phẩm chính (ví dụ: Food, Drink)
ProductDepartment Phòng ban sản phẩm (ví dụ: Snack Foods, Produce)
ProductCategory Danh mục chi tiết sản phẩm (ví dụ: Candy, Vegetables)
UnitsSold Số lượng sản phẩm đã bán
Revenue Doanh thu từ đơn hàng (USD)

Kết quả thống kê mô tả

## Warning: package 'DT' was built under R version 4.3.3
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html
📊 Tổng quan dữ liệu
Mục Ý_nghĩa
Số dòng 14059 dòng dữ liệu (giao dịch tại siêu thị)
Số cột 16 cột biến
Biến dạng chuỗi (character) 11 biến dạng chuỗi
Biến dạng số (numeric) 5 biến dạng số
🔠 Biến dạng chuỗi (character)
Biến Số_giá_trị_khác_nhau Ý_nghĩa
PurchaseDate PurchaseDate 742 Ngày khách hàng thực hiện giao dịch mua
Gender Gender 2 2 giới tính (F, M)
MaritalStatus MaritalStatus 2 Tình trạng hôn nhân: Độc thân (S) hoặc Đã kết hôn (M)
Homeowner Homeowner 2 Có nhà (Y) hoặc không (N)
AnnualIncome AnnualIncome 8 Thu nhập hộ gia đình theo khoảng ($K)
City City 23 Thành phố nơi khách hàng sống (~23 thành phố)
StateorProvince StateorProvince 10 Tỉnh/bang nơi cư trú (~10 bang)
Country Country 3 Quốc gia (USA, Canada, Mexico…)
ProductFamily ProductFamily 3 Nhóm sản phẩm chính (Food, Drink, Non-Consumables)
ProductDepartment ProductDepartment 22 Phòng ban sản phẩm (22 loại: Snacks, Produce…)
ProductCategory ProductCategory 45 Danh mục sản phẩm chi tiết (45 loại: Candy, Vegetables…)
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
🔢 Biến dạng số (numeric - đầy đủ, sạch sẽ)
Biến Mean SD Giải_thích
CustomerID CustomerID 5116.90 2920.76 Mã khách hàng duy nhất
Gender Gender NaN NA Giới tính đã mã hoá (F = 0, M = 1)
MaritalStatus MaritalStatus NaN NA Tình trạng hôn nhân đã mã hoá (S = 0, M = 1)
Homeowner Homeowner NaN NA Sở hữu nhà đã mã hoá (N = 0, Y = 1)
Children Children 2.53 1.49 Trung bình mỗi khách có 2–3 con
AnnualIncome AnnualIncome NaN NA Thu nhập hộ gia đình (đã chuyển từ khoảng sang số trung bình)
UnitsSold UnitsSold 4.08 1.17 Mỗi giao dịch bán ~4 đơn vị sản phẩm
Revenue Revenue 13.00 8.22 Mỗi giao dịch tạo ra trung bình ~13 USD

Thống kê mô tả

  • Thực hiện tính toán các thống kê mô tả (bao gồm giá trị trung bình, độ lệch chuẩn, giá trị nhỏ nhất, lớn nhất và các phân vị) cho các biến định lượng trong tập dữ liệu.

  • Các biến cần phân tích bao gồm: CustomerID, Gender, MaritalStatus, Homeowner, Children, AnnualIncome, UnitsSold, Revenue, PurchaseDateDays, cùng với các biến phản ánh tần suất mua hàng.

## Warning: There were 8 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `across(...)`.
## Caused by warning in `min()`:
## ! no non-missing arguments to min; returning Inf
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 7 remaining warnings.
📊 Bảng thống kê mô tả các biến định lượng
Biến Mean StdDev Min Q1 Median Q3 Max
CustomerID 5116.902127 2920.755202 3.00 2549.00 5060.00 7633.00 10280.0
Children 2.530336 1.491852 0.00 1.00 3.00 4.00 5.0
UnitsSold 4.080589 1.174421 1.00 3.00 4.00 5.00 8.0
Revenue 13.004512 8.215543 0.53 6.84 11.25 17.37 56.7
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAxIg0KYXV0aG9yOiAiTmd1eeG7hW4gRGnhu4VtIFF14buzbmgiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJkZWZhdWx0Ig0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDINCiAgcGRmX2RvY3VtZW50OiANCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQoNCg0KIyAuIFTDk00gVOG6rlQgVMOASSBMSeG7hlUgDQoNCipUw7NtIHThuq90IHTDoGkgbGnhu4d1OiBDw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgduG7m2kgY8OhYyB2w60gZOG7pSB0cm9uZyBSKg0KDQoNCipOZ8OgeTogMjYgdGjDoW5nIDEwIG7Eg20gMjAyMyoNCg0KDQoqTmd14buTbjogQ8OhYyB0csOtY2ggxJFv4bqhbiB04burICIyMDE5X0dlbmVyYWxpemVkIExpbmVhciBNb2RlbHMgV2l0aCBFeGFtcGxlcyBpbiBSXzk3ODE0NDE5MDExNzAucGRmIioNCg0KDQoqKk3hu6VjIHRpw6p1Kio6IA0KDQpUw6BpIGxp4buHdSBuw6B5IHTDs20gdOG6r3QgY8OhYyBjaOG7pyDEkeG7gSBjaMOtbmggdsOgIGPDoWMgw70gdMaw4bufbmcgcXVhbiB0cuG7jW5nIMSRxrDhu6NjIHRyw6xuaCBiw6B5IHRyb25nIGPDoWMgY2jGsMahbmcgxJHhuqd1IHRpw6puIHbDoCBjw6FjIHBo4bqnbiDEkcaw4bujYyB0csOtY2ggZOG6q24gY+G7p2EgY3Xhu5FuIHPDoWNoICJHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWxzIFdpdGggRXhhbXBsZXMgaW4gUiIsIHThuq1wIHRydW5nIHbDoG8gY8OhYyBraMOhaSBuaeG7h20gduG7gSBtw7QgaMOsbmggdGjhu5FuZyBrw6osIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHbDoCBjw6FjIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCwgY8WpbmcgbmjGsCBjw6FjIHBoxrDGoW5nIHBow6FwIGNo4bqpbiDEkW/DoW4gdsOgIMaw4bubYyBsxrDhu6NuZyBsacOqbiBxdWFuLg0KDQoNCkPDoWMgY2jhu6cgxJHhu4EgY2jDrW5oIHbDoCDDvSB0xrDhu59uZyBxdWFuIHRy4buNbmc6DQoNCiMjIE3DtCBow6xuaCBUaOG7kW5nIGvDqiAoQ2jGsMahbmcgMSk6DQoNCioqR2nhu5tpIHRoaeG7h3UqKjogQ2jGsMahbmcgbsOgeSBnaeG7m2kgdGhp4buHdSBraMOhaSBuaeG7h20gY8ahIGLhuqNuIHbhu4EgbcO0IGjDrG5oIHRo4buRbmcga8OqIG5oxrAgbeG7mXQgY8OhY2ggxJHhu4MgbcO0IHThuqMgY+G6oyBjw6FjIMSR4bq3YyDEkWnhu4NtIG5n4bqrdSBuaGnDqm4gdsOgIGPDsyBo4buHIHRo4buRbmcgY+G7p2EgZOG7ryBsaeG7h3UuIE7DsyBuaOG6pW4gbeG6oW5oIHThuqdtIHF1YW4gdHLhu41uZyBj4bunYSB2aeG7h2Mgc+G7rSBk4bulbmcgY8OhYyBtw7QgaMOsbmggxJHhu4MgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgKCJEYXRhIGFuYWx5c2lzOiBUaGUgbmVlZCBmb3IgbW9kZWxzPyIgLSBSZWVzZSwgMTk4NikuDQoNCioqTeG7pWMgxJHDrWNoIGPhu6dhIG3DtCBow6xuaCB0aOG7kW5nIGvDqioqOiBN4bulYyDEkcOtY2ggY+G7p2EgbeG7mXQgbcO0IGjDrG5oIOG6o25oIGjGsOG7n25nIMSR4bq/biBjw6FjaCBuw7MgxJHGsOG7o2MgcGjDoXQgdHJp4buDbiAoTeG7pWMgMS45KS4gQ8OhYyBt4bulYyDEkcOtY2ggY8OzIHRo4buDIGJhbyBn4buTbSBtw7QgdOG6oywgZOG7sSDEkW/DoW4gdsOgIGhp4buDdSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uLg0KDQoqKiJU4bqldCBj4bqjIGPDoWMgbcO0IGjDrG5oIMSR4buBdSBzYWksIG5oxrBuZyBt4buZdCBz4buRIGjhu691IMOtY2giKio6IE3hu5l0IMO9IHTGsOG7n25nIHF1YW4gdHLhu41uZyDEkcaw4bujYyB0csOtY2ggZOG6q24gdOG7qyBt4buZdCBuZ3Xhu5NuIGtow6FjIChraMO0bmcgxJHGsOG7o2MgY3VuZyBj4bqlcCDEkeG6p3kgxJHhu6cgdHJvbmcgdHLDrWNoIMSRb+G6oW4pIGzDoCBjw6FjIG3DtCBow6xuaCBsw6Agc+G7sSDEkcahbiBnaeG6o24gaMOzYSB0aOG7sWMgdOG6vyB2w6AgZG8gxJHDsyBraMO0bmcgYmFvIGdp4budIGhvw6BuIHRvw6BuIGNow61uaCB4w6FjLCBuaMawbmcgY2jDum5nIGPDsyB0aOG7gyBsw6AgY8O0bmcgY+G7pSBjw7MgZ2nDoSB0cuG7iyDEkeG7gyBoaeG7g3UgZOG7ryBsaeG7h3UgKihN4bulYyAxLjgpKi4NCg0KKirEkOG7mSBjaMOtbmggeMOhYyBzbyB24bubaSBz4buxIMSRxqFuIGdp4bqjbioqOiBDw7Mgc+G7sSDEkcOhbmggxJHhu5VpIGdp4buvYSDEkeG7mSBjaMOtbmggeMOhYyBj4bunYSBt4buZdCBtw7QgaMOsbmggKGto4bqjIG7Eg25nIHBow7kgaOG7o3AgY2jhurd0IGNo4bq9IHbhu5tpIGThu68gbGnhu4d1KSB2w6Agc+G7sSDEkcahbiBnaeG6o24gY+G7p2EgbsOzIChz4buRIGzGsOG7o25nIHRoYW0gc+G7kSkuIFZp4buHYyBs4buxYSBjaOG7jW4gbcO0IGjDrG5oIHRoxrDhu51uZyBsacOqbiBxdWFuIMSR4bq/biB2aeG7h2MgY8OibiBi4bqxbmcgaGFpIHnhur91IHThu5EgbsOgeSAqKE3hu6VjIDEuMTApKi4NCg0KKipUaOG7sWMgbmdoaeG7h20gc28gduG7m2kgbmdoacOqbiBj4bupdSBxdWFuIHPDoXQqKjogQ3Xhu5FuIHPDoWNoIHBow6JuIGJp4buHdCBnaeG7r2EgdGjhu7FjIG5naGnhu4dtIChuxqFpIGPDsyB0aOG7gyBzdXkgbHXhuq1uIG5ndXnDqm4gbmjDom4gLSBr4bq/dCBxdeG6oykgdsOgIG5naGnDqm4gY+G7qXUgcXVhbiBzw6F0IChuxqFpIGNo4buJIGPDsyB0aOG7gyB0aGnhur90IGzhuq1wIG3hu5FpIGxpw6puIGjhu4cpICooTeG7pWMgMS4xMSkqLg0KDQoqKlRodSB0aOG6rXAgZOG7ryBsaeG7h3UgdsOgIGto4bqjIG7Eg25nIGtow6FpIHF1w6F0IGjDs2EqKjogQ2jhuqV0IGzGsOG7o25nIHbDoCBwaMawxqFuZyBwaMOhcCB0aHUgdGjhuq1wIGThu68gbGnhu4d1IOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyBraMOhaSBxdcOhdCBow7NhIGPDoWMga+G6v3QgcXXhuqMgdOG7qyBtw7QgaMOsbmggKihN4bulYyAxLjEyKSouDQoNClPhu60gZOG7pW5nIFIgxJHhu4MgbcO0IGjDrG5oIGjDs2EgdGjhu5FuZyBrw6o6IEN14buRbiBzw6FjaCBz4butIGThu6VuZyBuZ8O0biBuZ+G7ryB2w6AgbcO0aSB0csaw4budbmcgUiAoUiBEZXZlbG9wbWVudCBDb3JlIFRlYW0sIDIwMTcpIMSR4buDIG1pbmggaOG7jWEgY8OhYyBr4bu5IHRodeG6rXQgbcO0IGjDrG5oIGjDs2EgKihN4bulYyAxLjEzKSouDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCAoQ2jGsMahbmcgMik6DQoNCioqxJDhu4tuaCBuZ2jEqWEqKjogQ2jGsMahbmcgbsOgeSDEkeG7i25oIG5naMSpYSBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCAqKE3hu6VjIDIuMikqLg0KDQoqKkjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIMSRxqFuIGdp4bqjbiB2w6AgYuG7mWkqKjogQmFvIGfhu5NtIGPhuqMgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHGoW4gZ2nhuqNuICht4buZdCBiaeG6v24gZ2nhuqNpIHRow61jaCkgdsOgIGjhu5NpIHF1eSBi4buZaSAobmhp4buBdSBiaeG6v24gZ2nhuqNpIHRow61jaCkgKihN4bulYyAyLjMsIDIuNCkqLg0KDQoqKsav4bubYyBsxrDhu6NuZyBiw6xuaCBwaMawxqFuZyBuaOG7jyBuaOG6pXQqKjogUGjGsMahbmcgcGjDoXAgxrDhu5tjIGzGsOG7o25nIGNow61uaCBjaG8gY8OhYyBo4buHIHPhu5EgdHJvbmcgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggbMOgIMaw4bubYyBsxrDhu6NuZyBiw6xuaCBwaMawxqFuZyBuaOG7jyBuaOG6pXQgKExlYXN0LVNxdWFyZXMgRXN0aW1hdGlvbikgKihN4bulYyAyLjMuMSwgMi40LjEpKi4NCg0KKipDw7RuZyB0aOG7qWMgbWEgdHLhuq1uKio6IEPDoWMga2jDoWkgbmnhu4dtIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIMSRxrDhu6NjIHRyw6xuaCBiw6B5IGLhurFuZyBjw7RuZyB0aOG7qWMgbWEgdHLhuq1uLCBiYW8gZ+G7k20gxrDhu5tjIGzGsOG7o25nIGjhu4cgc+G7kSB2w6AgxrDhu5tjIGzGsOG7o25nIHBoxrDGoW5nIHNhaSAqKE3hu6VjIDIuNSkqOg0KDQoqKkvDvSBoaeG7h3UgbWEgdHLhuq1uKio6ICJNYXRyaXggTm90YXRpb24iICooTeG7pWMgMi41LjEpKg0KDQoqKsav4bubYyBsxrDhu6NuZyBo4buHIHPhu5EqKjogIkNvZWZmaWNpZW50IEVzdGltYXRlcyIgKihN4bulYyAyLjUuMikqDQoNCioqxq/hu5tjIGzGsOG7o25nIHBoxrDGoW5nIHNhaSDPg8KyKio6ICJFc3RpbWF0aW5nIHRoZSBWYXJpYW5jZSDPg8KyIiAqKE3hu6VjIDIuNS4zKSoNCg0KKirGr+G7m2MgbMaw4bujbmcgcGjGsMahbmcgc2FpIGPhu6dhIM6yzIIqKjogIkVzdGltYXRpbmcgdGhlIFZhcmlhbmNlIG9mIM6yzIIiICooTeG7pWMgMi41LjQpKg0KDQoqKlN1eSBsdeG6rW4gY2hvIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oKio6IFRo4bqjbyBsdeG6rW4gduG7gSBraeG7g20gxJHhu4tuaCB0LXRlc3QgdsOgIGtob+G6o25nIHRpbiBj4bqteSBjaG8gY8OhYyBo4buHIHPhu5EgaOG7k2kgcXV5IHbDoCBnacOhIHRy4buLIHBow7kgaOG7o3AgKihN4bulYyAyLjgpKi4NCg0KKipQaMOibiB0w61jaCBwaMawxqFuZyBzYWkgY2hvIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSoqOiBT4butIGThu6VuZyBBTk9WQSDEkeG7gyBzbyBzw6FuaCBjw6FjIG3DtCBow6xuaCBs4buTbmcgbmhhdSAqKE3hu6VjIDIuOSwgMi4xMCkqLg0KDQoqKkzhu7FhIGNo4buNbiBtw7QgaMOsbmgqKjogQ8OhYyB0acOqdSBjaMOtIG5oxrAgQUlDIHbDoCBCSUMgxJHGsOG7o2MgZ2nhu5tpIHRoaeG7h3UgxJHhu4MgbOG7sWEgY2jhu41uIGdp4buvYSBjw6FjIG3DtCBow6xuaCBraMO0bmcgbOG7k25nIG5oYXUgKihN4bulYyAyLjExKSouIEPDoWMgcGjGsMahbmcgcGjDoXAgdOG7sSDEkeG7mW5nIMSR4buDIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggY8WpbmcgxJHGsOG7o2MgdGjhuqNvIGx14bqtbiwgY8O5bmcgduG7m2kgY8OhYyBwaOG6o24gxJHhu5FpIHZp4buHYyBz4butIGThu6VuZyBjw6FjIHRo4bunIHThu6VjIHThu6tuZyBixrDhu5tjICooTeG7pWMgMi4xMikqLg0KDQoqKlPhu60gZOG7pW5nIFIqKjogQ8OhY2ggc+G7rSBk4bulbmcgUiDEkeG7gyBwaMO5IGjhu6NwIHbhu5tpIGPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIMSRxrDhu6NjIGN1bmcgY+G6pXAgKihN4bulYyAyLjE0KSouDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaDogQ2jhuqluIMSRb8OhbiB2w6AgeMOieSBk4buxbmcgbcO0IGjDrG5oIChDaMawxqFuZyAzKToNCg0KKkPDoWMgZ2nhuqMgxJHhu4tuaCo6IENoxrDGoW5nIG7DoHkgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIGdp4bqjIMSR4buLbmggY+G7p2EgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHThu6sgZ8OzYyDEkeG7mSB0aOG7sWMgdOG6vywgYmFvIGfhu5NtIGxpbmVhciBwcmVkaWN0b3IsIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpLCB0w61uaCDEkeG7mWMgbOG6rXAgdsOgIHTDrW5oIGNodeG6qW4gKihN4bulYyAzLjIpKi4NCg0KKipQaOG6p24gZMawIHbDoCBMZXZlcmFnZXMqKjogR2nhu5tpIHRoaeG7h3UgY8OhYyBsb+G6oWkgcGjhuqduIGTGsCAocmVzaWR1YWxzKSB2w6AgbGV2ZXJhZ2VzICooTeG7pWMgMy4zLCAzLjQpKi4NCg0KKipCaeG7g3UgxJHhu5MgcGjhuqduIGTGsCoqOiBCaeG7g3UgxJHhu5MgcGjhuqduIGTGsCBsw6AgY8O0bmcgY+G7pSBxdWFuIHRy4buNbmcgxJHhu4Mga2nhu4NtIHRyYSBjw6FjIGdp4bqjIMSR4buLbmggbcO0IGjDrG5oICooTeG7pWMgMy41KSo6DQoNCioqQmnhu4N1IMSR4buTIHBo4bqnbiBkxrAgY2jhu5FuZyBs4bqhaSB4aioqOiBLaeG7g20gdHJhIHTDrW5oIHR1eeG6v24gdMOtbmggKCJQbG90IFJlc2lkdWFscyBBZ2FpbnN0IHhqIDogTGluZWFyaXR5IikgKihN4bulYyAzLjUuMSkqLg0KDQoqKkJp4buDdSDEkeG7kyBwaOG6p24gZMawIG3hu5l0IHBo4bqnbioqOiAiUGFydGlhbCBSZXNpZHVhbCBQbG90cyIgKihN4bulYyAzLjUuMikqLg0KDQpN4buZdCB2w60gZOG7pSDEkcaw4bujYyBjdW5nIGPhuqVwIHbhu5tpIG3DoyBSIHbDoCBr4bq/dCBxdeG6oyAoRmlnLiAzLjMpLg0KDQoqKkJp4buDdSDEkeG7kyBwaOG6p24gZMawIGNo4buRbmcgbOG6oWkgzrzMgioqOiBLaeG7g20gdHJhIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpICgiUGxvdCBSZXNpZHVhbHMgQWdhaW5zdCDOvMyCOiBDb25zdGFudCBWYXJpYW5jZSIpICooTeG7pWMgMy41LjMpKi4gDQoNCkPDoWMgdsOtIGThu6UgduG7gSBiaeG7g3UgxJHhu5MgbMO9IHTGsOG7n25nIHbDoCBjw6FjIHbhuqVuIMSR4buBIG5oxrAgcGhpIHR1eeG6v24gdMOtbmggdsOgIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHhu5VpIMSRxrDhu6NjIG1pbmggaOG7jWEgKCJTb21lIGV4YW1wbGUgcGxvdHMgb2YgdGhlIHN0YW5kYXJkaXplZCByZXNpZHVhbHMgcuKAsiBwbG90dGVkIGFnYWluc3QgdGhlIGZpdHRlZCB2YWx1ZXMgzrzMgi4gVGhlIGVmZmVjdHMgYXJlIGV4YWdnZXJhdGVkIGZyb20gd2hhdCBpcyB1c3VhbGx5IHNlZW4gaW4gcHJhY3RpY2UiKSAoRmlnLiAzLjQpLg0KDQoqKkJp4buDdSDEkeG7kyBR4oCTUSoqOiBLaeG7g20gdHJhIHTDrW5oIGNodeG6qW4gKCJR4oCTUSBQbG90cyBhbmQgTm9ybWFsaXR5IikgKihN4bulYyAzLjUuNCkqLg0KDQoqKkJp4buDdSDEkeG7kyBMYWcqKjogS2nhu4NtIHRyYSBz4buxIHBo4bulIHRodeG7mWMgdGhlbyB0aOG7nWkgZ2lhbiAoIkxhZyBQbG90cyBhbmQgRGVwZW5kZW5jZSBvdmVyIFRpbWUiKSAqKE3hu6VjIDMuNS41KSouIEPDoWMgdsOtIGThu6UgduG7gSBiaeG7g3UgxJHhu5MgcGjhuqduIGTGsCDEkeG7mWMgbOG6rXAgdsOgIHTGsMahbmcgcXVhbiDDom0gxJHGsOG7o2MgaGnhu4NuIHRo4buLIChGaWcuIDMuNSkuDQoNCioqQ8OhYyDEkWnhu4NtIG5nb+G6oWkgbGFpIHbDoCBjw6FjIHF1YW4gc8OhdCBjw7Mg4bqjbmggaMaw4bufbmcqKjogWMOhYyDEkeG7i25oIGPDoWMgcXVhbiBzw6F0IGPDsyB24bqlbiDEkeG7gSBi4bqxbmcgY8OhY2ggc+G7rSBk4bulbmcgcGjhuqduIGTGsCBzdHVkZW50aXplZCB2w6AgY8OhYyBjaOG7iSBz4buRIOG6o25oIGjGsOG7n25nIG5oxrAgQ29vaydzIGRpc3RhbmNlICooTeG7pWMgMy42KSouDQoNCioqS2jhuq9jIHBo4bulYyBz4buxIGPhu5EqKjogQ8OhYyBwaMawxqFuZyBwaMOhcCDEkeG7gyBnaeG6o2kgcXV54bq/dCBjw6FjIHbhuqVuIMSR4buBIMSRw6MgeMOhYyDEkeG7i25oLCBiYW8gZ+G7k20gYmnhur9uIMSR4buVaSBiaeG6v24gcGjhuqNuIGjhu5NpIHbDoCBiaeG6v24gZ2nhuqNpIHRow61jaCAqKE3hu6VjIDMuOCwgMy45LCAzLjEwKSouIEJp4buDdSDEkeG7kyBwaOG6p24gZMawIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIG1pbmggaOG7jWEgaGnhu4d1IHF14bqjIGPhu6dhIHZp4buHYyBiaeG6v24gxJHhu5VpIChGaWcuIDMuNikuDQoNCioqxJBhIGPhu5luZyB0dXnhur9uKio6IFRo4bqjbyBsdeG6rW4gduG7gSB24bqlbiDEkeG7gSDEkWEgY+G7mW5nIHR1eeG6v24gKGNvbGxpbmVhcml0eSkgKihN4bulYyAzLjE0KSouDQoNCioqTmdoacOqbiBj4bupdSDEkWnhu4NuIGjDrG5oKio6IEPDoWMgdsOtIGThu6UgdGjhu7FjIHThur8gxJHGsOG7o2MgdHLDrG5oIGLDoHkgxJHhu4MgbWluaCBo4buNYSBjw6FjIGtow6FpIG5p4buHbSBjaOG6qW4gxJFvw6FuICooTeG7pWMgMy4xNSkqLg0KDQojIyDDnSB0xrDhu59uZyDGsOG7m2MgbMaw4bujbmcga2jhuqMgbsSDbmcgeOG6o3kgcmEgY+G7sWMgxJHhuqFpIChDaMawxqFuZyA0KToNCg0KKipLaMOhaSBxdcOhdCBow7NhIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIGNodeG6qW4qKjogQ2jGsMahbmcgbsOgeSBi4bqvdCDEkeG6p3UgYuG6sW5nIGPDoWNoIGtow6FpIHF1w6F0IGjDs2EgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggY2h14bqpbiAqKE3hu6VjIDQuMykqLg0KDQoqKsav4bubYyBsxrDhu6NuZyBraOG6oyBuxINuZyB44bqjeSByYSBj4buxYyDEkeG6oWkgKE1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0aW9uIC0gTUxFKSoqOiBHaeG7m2kgdGhp4buHdSBuZ3V5w6puIHThuq9jIGPhu6dhIMaw4bubYyBsxrDhu6NuZyBraOG6oyBuxINuZyB44bqjeSByYSBj4buxYyDEkeG6oWkgKE3hu6VjIDQuNCkuDQoNCioqTUxFIGNobyBt4buZdCB2w6Agbmhp4buBdSB0aGFtIHPhu5EqKjogVHLDrG5oIGLDoHkgY8OhY2ggdMOtbmggTUxFIGNobyB0csaw4budbmcgaOG7o3AgbeG7mXQgdGhhbSBz4buRIHbDoCBuaGnhu4F1IHRoYW0gc+G7kSAqKE3hu6VjIDQuNSwgNC42KSouDQoNCioqQ8O0bmcgdGjhu6ljIG1hIHRy4bqtbiBjaG8gTUxFKio6IE1MRSDEkcaw4bujYyB0csOsbmggYsOgeSBi4bqxbmcgY8O0bmcgdGjhu6ljIG1hIHRy4bqtbiwgYmFvIGfhu5NtIHBoxrDGoW5nIHRyw6xuaCBTY29yZSwgdGjDtG5nIHRpbiAocXVhbiBzw6F0IHbDoCBr4buzIHbhu41uZykgdsOgIHNhaSBz4buRIGNodeG6qW4gY+G7p2EgY8OhYyB0aGFtIHPhu5EgKihN4bulYyA0LjcpKjoNCg0KKipLw70gaGnhu4d1Kio6ICJOb3RhdGlvbiIgKihN4bulYyA0LjcuMSkqDQoNCioqUGjGsMahbmcgdHLDrG5oIFNjb3JlKio6ICJTY29yZSBFcXVhdGlvbnMiICooTeG7pWMgNC43LjIpKg0KDQoqKlRow7RuZyB0aW4qKjogUXVhbiBzw6F0IHbDoCBL4buzIHbhu41uZzogIkluZm9ybWF0aW9uOiBPYnNlcnZlZCBhbmQgRXhwZWN0ZWQiICooTeG7pWMgNC43LjMpKg0KDQoqKlNhaSBz4buRIGNodeG6qW4gY+G7p2EgY8OhYyB0aGFtIHPhu5EqKjogIlN0YW5kYXJkIEVycm9ycyBvZiBQYXJhbWV0ZXJzIiAqKE3hu6VjIDQuNy40KSoNCg0KKipUaHXhuq10IHRvw6FuIEZpc2hlciBTY29yaW5nKio6IFBoxrDGoW5nIHBow6FwIGzhurdwIMSR4buDIHTDrW5oIHRvw6FuIE1MRXMgKihN4bulYyA0LjgpKi4NCg0KKipDw6FjIHRodeG7mWMgdMOtbmggY+G7p2EgTUxFcyoqOiBUaOG6o28gbHXhuq1uIHbhu4EgY8OhYyB0aHXhu5ljIHTDrW5oIG1vbmcgbXXhu5FuIGPhu6dhIE1MRXMgKiooTeG7pWMgNC45KSoqLg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90Kio6IFPhu60gZOG7pW5nIGPDoWMga+G6v3QgcXXhuqMgdGnhu4dtIGPhuq1uIG3huqt1IGzhu5tuIGNobyBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCwgYmFvIGfhu5NtIFdhbGQgdGVzdHMsIExpa2VsaWhvb2QgUmF0aW8gVGVzdHMgdsOgIFNjb3JlIFRlc3RzICooTeG7pWMgNC4xMCkqLg0KDQoqKlPhu60gZOG7pW5nIFIqKjogQ3VuZyBj4bqlcCBtw6MgUiDEkeG7gyBwaMO5IGjhu6NwIHbhu5tpIGPDoWMgbcO0IGjDrG5oICooTeG7pWMgNC4xNCkqLg0KDQojIyBDw6FjIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCAoR0xNcyk6IEPhuqV1IHRyw7pjIChDaMawxqFuZyA1KToNCg0KKipHaeG7m2kgdGhp4buHdSBHTE1zKio6IENoxrDGoW5nIG7DoHkgZ2nhu5tpIHRoaeG7h3UgY8OhYyBtw7QgaMOsbmggdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgKEdlbmVyYWxpemVkIExpbmVhciBNb2RlbHMpIG5oxrAgbeG7mXQga2h1bmcgbGluaCBob+G6oXQgbeG7nyBy4buZbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGNodeG6qW4gKihN4bulYyA1LjEpKi4NCg0KKipIYWkgdGjDoG5oIHBo4bqnbioqOiBHTE1zIGJhbyBn4buTbSBoYWkgdGjDoG5oIHBo4bqnbiBjaMOtbmg6IHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAocGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IGPhu6dhIGJp4bq/biBwaOG6o24gaOG7k2kpIHbDoCB0aMOgbmggcGjhuqduIGPDsyBo4buHIHRo4buRbmcgKGjDoG0gdHV54bq/biB0w61uaCBj4bunYSBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoKSAqKihN4bulYyA1LjIpKiouDQoNCioqVGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puKio6IE3DtCBow6xuaCBwaMOibiB0w6FuIGjDoG0gbcWpIChFeHBvbmVudGlhbCBEaXNwZXJzaW9uIE1vZGVscyAtIEVETXMpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIG3DtCB04bqjIHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAqKE3hu6VjIDUuMykqLiBDw6FjIHbDrSBk4bulIHbhu4EgRURNcyB2w6AgxJHhu4tuaCBuZ2jEqWEgdG/DoW4gaOG7jWMgxJHGsOG7o2MgY3VuZyBj4bqlcC4NCg0KKipIw6BtIHBoxrDGoW5nIHNhaSoqOiBLaMOhaSBuaeG7h20gaMOgbSBwaMawxqFuZyBzYWkgxJHGsOG7o2MgZ2nhu5tpIHRoaeG7h3UgKihN4bulYyA1LjMuNikqLg0KDQoqKkThuqFuZyBtw7QgaMOsbmggcGjDom4gdMOhbioqOiBFRE1zIGPDsyB0aOG7gyDEkcaw4bujYyBiaeG7g3UgZGnhu4VuIGTGsOG7m2kgZOG6oW5nIG3DtCBow6xuaCBwaMOibiB0w6FuLCBiYW8gZ+G7k20gZGV2aWFuY2UgxJHGoW4gduG7iyAodW5pdCBkZXZpYW5jZSkgKihN4bulYyA1LjQpKi4NCg0KKipUaMOgbmggcGjhuqduIGPDsyBo4buHIHRo4buRbmcqKjogQmFvIGfhu5NtIGjDoG0gbGnDqm4ga+G6v3QgKGxpbmsgZnVuY3Rpb24pIGvhur90IG7hu5FpIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgYmnhur9uIHBo4bqjbiBo4buTaSB24bubaSB0aMOgbmggcGjhuqduIGPDsyBo4buHIHRo4buRbmcgKihN4bulYyA1LjUuMSkqIHbDoCBvZmZzZXRzICooTeG7pWMgNS41LjIpKi4NCg0KKirEkOG7i25oIG5naMSpYSBHTE1zKio6IE3hu5l0IMSR4buLbmggbmdoxKlhIGNow61uaCB0aOG7qWMgduG7gSBHTE1zIMSRxrDhu6NjIHRyw6xuaCBiw6B5ICooTeG7pWMgNS42KSouDQoNCioqVG90YWwgRGV2aWFuY2UqKjogS2jDoWkgbmnhu4dtIHRvdGFsIGRldmlhbmNlIMSRxrDhu6NjIGdp4bqjaSB0aMOtY2ggKihN4bulYyA1LjcpKi4NCg0KKipRdWFuIGjhu4cgduG7m2kgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgqKjogVGjhuqNvIGx14bqtbiB24buBIGPDoWNoIGJp4bq/biDEkeG7lWkgaOG7k2kgcXV5IMaw4bubYyB0w61uaCBHTE1zICooTeG7pWMgNS44KSouDQoNCiMjIEPDoWMgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0OiDGr+G7m2MgbMaw4bujbmcgKENoxrDGoW5nIDYpOg0KDQoqKlTDrW5oIHRvw6FuIGto4bqjIG7Eg25nIHjhuqN5IHJhKio6IFRyw6xuaCBiw6B5IGPDoWNoIHTDrW5oIHRvw6FuIGto4bqjIG7Eg25nIHjhuqN5IHJhIChsaWtlbGlob29kKSBjaG8gY8OhYyBo4buHIHPhu5EgzrIgdHJvbmcgR0xNcyAqKE3hu6VjIDYuMikqLg0KDQoqKlBoxrDGoW5nIHRyw6xuaCBTY29yZSB2w6AgVGjDtG5nIHRpbioqOiBHaeG7m2kgdGhp4buHdSBwaMawxqFuZyB0csOsbmggU2NvcmUgdsOgIHRow7RuZyB0aW4gY2hvIM6yICooTeG7pWMgNi4yLjIpKi4NCg0KKipUw61uaCB0b8OhbiDGsOG7m2MgbMaw4bujbmcgY+G7p2EgzrIqKjogVHLDrG5oIGLDoHkgY8OhYyBwaMawxqFuZyBwaMOhcCDEkeG7gyB0w61uaCB0b8OhbiDGsOG7m2MgbMaw4bujbmcgY+G7p2EgzrIgKihN4bulYyA2LjMpKi4NCg0KKipSZXNpZHVhbCBEZXZpYW5jZSoqOiBLaMOhaSBuaeG7h20gcmVzaWR1YWwgZGV2aWFuY2UgxJHGsOG7o2MgZ2nhuqNpIHRow61jaCAqKE3hu6VjIDYuNCkqLg0KDQoqKlNhaSBz4buRIGNodeG6qW4gY2hvIM6yzIIqKjogQ8OhY2ggxrDhu5tjIHTDrW5oIHNhaSBz4buRIGNodeG6qW4gY2hvIGPDoWMgxrDhu5tjIGzGsOG7o25nIGjhu4cgc+G7kSAqKE3hu6VjIDYuNSkqLg0KDQoqKsav4bubYyBsxrDhu6NuZyDOsioqOiBDw7RuZyB0aOG7qWMgbWEgdHLhuq1uOiBDw7RuZyB0aOG7qWMgbWEgdHLhuq1uIGNobyDGsOG7m2MgbMaw4bujbmcgzrIgdHJvbmcgR0xNcyAqKE3hu6VjIDYuNikqLg0KDQoqKsav4bubYyBsxrDhu6NuZyBHTE1zIGdp4buRbmcgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggY+G7pWMgYuG7mSoqOiDDnSB0xrDhu59uZyBy4bqxbmcgdmnhu4djIMaw4bubYyBsxrDhu6NuZyBHTE1zIGPhu6VjIGLhu5kgZ2nhu5FuZyBuaMawIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oICooTeG7pWMgNi43KSouDQoNCioqxq/hu5tjIGzGsOG7o25nIM+GKio6IEPDoWMgcGjGsMahbmcgcGjDoXAga2jDoWMgbmhhdSDEkeG7gyDGsOG7m2MgbMaw4bujbmcgdGhhbSBz4buRIHBow6JuIHTDoW4gz4YsIGJhbyBn4buTbSBNTEUsIE1vZGlmaWVkIFByb2ZpbGUgTG9nLUxpa2VsaWhvb2QgRXN0aW1hdG9yLCBNZWFuIERldmlhbmNlIEVzdGltYXRvciB2w6AgUGVhcnNvbiBFc3RpbWF0b3IgKihN4bulYyA2LjgpKi4NCg0KKipT4butIGThu6VuZyBSKio6IEPDoWNoIHPhu60gZOG7pW5nIFIgxJHhu4MgcGjDuSBo4bujcCB24bubaSBHTE1zICooTeG7pWMgNi45KSouDQoNCiMjIEPDoWMgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0OiBTdXkgbHXhuq1uIChDaMawxqFuZyA3KToNCg0KKipTdXkgbHXhuq1uIGNobyBjw6FjIGjhu4cgc+G7kSBraGkgz4YgxJHDoyBiaeG6v3QqKjogVHLDrG5oIGLDoHkgY8OhY2ggdGjhu7FjIGhp4buHbiBzdXkgbHXhuq1uIChraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCB2w6Aga2hv4bqjbmcgdGluIGPhuq15KSBjaG8gY8OhYyBo4buHIHPhu5Ega2hpIHRoYW0gc+G7kSBwaMOibiB0w6FuIM+GIMSRw6MgYmnhur90ICooTeG7pWMgNy4yKSouIEJhbyBn4buTbSBXYWxkIFRlc3RzLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIGjhu4cgc+G7kSB2w6AgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCwgTGlrZWxpaG9vZCBSYXRpbyBUZXN0cyB2w6AgQW5hbHlzaXMgb2YgRGV2aWFuY2UgVGFibGVzLg0KDQoqKktp4buDbSDEkeG7i25oIFdhbGQsIFNjb3JlIHbDoCBMaWtlbGlob29kIFJhdGlvKio6IFNvIHPDoW5oIGJhIGxv4bqhaSBraeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCBuw6B5ICooTeG7pWMgNy43KSouDQoNCioqTOG7sWEgY2jhu41uIGdp4buvYSBjw6FjIEdMTXMga2jDtG5nIGzhu5NuZyBuaGF1Kio6IFPhu60gZOG7pW5nIEFJQyB2w6AgQklDIMSR4buDIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggKihN4bulYyA3LjgpKi4NCg0KKipQaMawxqFuZyBwaMOhcCB04buxIMSR4buZbmcgY2hvIGzhu7FhIGNo4buNbiBtw7QgaMOsbmgqKjogKihN4bulYyA3LjkpKi4NCg0KKipT4butIGThu6VuZyBSKio6IEPDoWNoIHPhu60gZOG7pW5nIFIgxJHhu4MgdGjhu7FjIGhp4buHbiBjw6FjIGtp4buDbSDEkeG7i25oICooTeG7pWMgNy4xMCkqLg0KDQojIyBDw6FjIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdDogQ2jhuqluIMSRb8OhbiAoQ2jGsMahbmcgOCk6DQoNCioqQ8OhYyBnaeG6oyDEkeG7i25oIGPhu6dhIEdMTXMqKjogVGjhuqNvIGx14bqtbiB24buBIGPDoWMgZ2nhuqMgxJHhu4tuaCBj4bunYSBHTE1zICooTeG7pWMgOC4yKSouDQoNCioqQ8OhYyBsb+G6oWkgcGjhuqduIGTGsCBjaG8gR0xNcyoqOiBHaeG7m2kgdGhp4buHdSBjw6FjIGxv4bqhaSBwaOG6p24gZMawIGtow6FjIG5oYXUgcGjDuSBo4bujcCB24bubaSBHTE1zLCBiYW8gZ+G7k20gUmVzcG9uc2UgUmVzaWR1YWxzIChraMO0bmcgxJHhu6cpLCBQZWFyc29uIFJlc2lkdWFscywgRGV2aWFuY2UgUmVzaWR1YWxzIHbDoCBRdWFudGlsZSBSZXNpZHVhbHMgKihN4bulYyA4LjMpKi4NCg0KKipMZXZlcmFnZXMgdHJvbmcgR0xNcyoqOiBLaMOhaSBuaeG7h20gbGV2ZXJhZ2VzIHbDoCBoYXQgbWF0cml4IHRyb25nIGLhu5FpIGPhuqNuaCBHTE1zICooTeG7pWMgOC40KSouDQoNCioqTGV2ZXJhZ2UgU3RhbmRhcmRpemVkIFJlc2lkdWFscyoqOiBHaeG7m2kgdGhp4buHdSBsZXZlcmFnZSBzdGFuZGFyZGl6ZWQgcmVzaWR1YWxzICooTeG7pWMgOC41KSouDQoNCioqS2hpIG7DoG8gc+G7rSBk4bulbmcgbG/huqFpIHBo4bqnbiBkxrAgbsOgbyoqOiBIxrDhu5tuZyBk4bqrbiB24buBIHZp4buHYyBs4buxYSBjaOG7jW4gbG/huqFpIHBo4bqnbiBkxrAgcGjDuSBo4bujcCAqKE3hu6VjIDguNikqLg0KDQoqKktp4buDbSB0cmEgY8OhYyBnaeG6oyDEkeG7i25oIG3DtCBow6xuaCoqOiBT4butIGThu6VuZyBjw6FjIGJp4buDdSDEkeG7kyBwaOG6p24gZMawIMSR4buDIGtp4buDbSB0cmEgY8OhYyBnaeG6oyDEkeG7i25oIHbhu4EgdMOtbmggxJHhu5ljIGzhuq1wLCB0aMOgbmggcGjhuqduIGPDsyBo4buHIHRo4buRbmcgdsOgIHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiAqKE3hu6VjIDguNykqLiBDw6FjIGJp4buDdSDEkeG7kyDEkWnhu4NuIGjDrG5oIMSRxrDhu6NjIG1pbmggaOG7jWEsIGNo4bqzbmcgaOG6oW4gbmjGsCBiaeG7g3UgxJHhu5MgcGjhuqduIGTGsCBjaOG7kW5nIGzhuqFpIGPDoWMgZ2nDoSB0cuG7iyBwaMO5IGjhu6NwIChGaWcuIDguNSwgdG9wIHBhbmVscykuDQoNCioqQ8OhYyDEkWnhu4NtIG5nb+G6oWkgbGFpIHbDoCBjw6FjIHF1YW4gc8OhdCBjw7Mg4bqjbmggaMaw4bufbmcqKjogWMOhYyDEkeG7i25oIGPDoWMgcXVhbiBzw6F0IGPDsyB24bqlbiDEkeG7gSB0cm9uZyBHTE1zICooTeG7pWMgOC44KSouDQoNCioqS2jhuq9jIHBo4bulYyBz4buxIGPhu5EqKjogQ8OhYyBwaMawxqFuZyBwaMOhcCDEkeG7gyBnaeG6o2kgcXV54bq/dCBjw6FjIHbhuqVuIMSR4buBIMSRw6MgeMOhYyDEkeG7i25oLCB0xrDGoW5nIHThu7EgbmjGsCB0cm9uZyBo4buTaSBxdXkgdHV54bq/biB0w61uaCwgbmjGsG5nIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCBjaG8gR0xNcy4gQ8OhYyBiaeG7g3UgxJHhu5MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbWluaCBo4buNYSBz4buxIGPhuqNpIHRoaeG7h24gc2F1IGtoaSDDoXAgZOG7pW5nIGPDoWMgYmnhu4duIHBow6FwIGto4bqvYyBwaOG7pWMgKEZpZy4gOC45KS4NCg0KKipRdWFzaS1MaWtlbGlob29kIHbDoCBFeHRlbmRlZCBRdWFzaS1MaWtlbGlob29kKio6IEdp4bubaSB0aGnhu4d1IGPDoWMga2jDoWkgbmnhu4dtIG7DoHkgxJHhu4MgeOG7rSBsw70gdHLGsOG7nW5nIGjhu6NwIHBoxrDGoW5nIHNhaSBraMO0bmcgxJHGsOG7o2MgeMOhYyDEkeG7i25oIGhvw6BuIHRvw6BuIGLhu59pIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggKihN4bulYyA4LjEwKSouDQoNCioqxJBhIGPhu5luZyB0dXnhur9uKio6IFRo4bqjbyBsdeG6rW4gduG7gSDEkWEgY+G7mW5nIHR1eeG6v24gdHJvbmcgR0xNcyAqKE3hu6VjIDguMTEpKi4NCg0KKipOZ2hpw6puIGPhu6l1IMSRaeG7g24gaMOsbmgqKjogQ8OhYyB2w60gZOG7pSB0aOG7sWMgdOG6vyBtaW5oIGjhu41hIHZp4buHYyBjaOG6qW4gxJFvw6FuIEdMTXMgKihN4bulYyA4LjEyKSouDQoNCioqU+G7rSBk4bulbmcgUioqOiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIHBow6JuIHTDrWNoIGNo4bqpbiDEkW/DoW4gY+G7p2EgR0xNcyAqKE3hu6VjIDguMTMpKi4NCg0KIyMgTcO0IGjDrG5oIGNobyB04bu3IGzhu4c6IEJpbm9taWFsIEdMTXMgKENoxrDGoW5nIDkpOg0KDQoqKk3DtCBow6xuaCBow7NhIHThu7cgbOG7hyoqOiDhu6huZyBk4bulbmcgR0xNcyBjaG8gZOG7ryBsaeG7h3UgdOG7tyBs4buHLCBuxqFpIGJp4bq/biBwaOG6o24gaOG7k2kgbMOgIHPhu5EgbOG6p24gdGjDoG5oIGPDtG5nIHRyb25nIG3hu5l0IHPhu5EgbOG6p24gdGjhu60gY+G7kSDEkeG7i25oICooTeG7pWMgOS4yKSouIFBow6JuIHBo4buRaSBCaW5vbWlhbCBsw6AgdGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puIMSRaeG7g24gaMOsbmguDQoNCioqSMOgbSBsacOqbiBr4bq/dCoqOiBUaOG6o28gbHXhuq1uIHbhu4EgY8OhYyBow6BtIGxpw6puIGvhur90IGtow6FjIG5oYXUgcGjDuSBo4bujcCB24bubaSBCaW5vbWlhbCBHTE1zLCBjaOG6s25nIGjhuqFuIG5oxrAgcHJvYml0IGxpbmsgKihN4bulYyA5LjQpKiwgbG9naXQgbGluayAqKE3hu6VjIDkuNSkqIHbDoCBjb21wbGVtZW50YXJ5IGxvZy1sb2cgbGluayAqKE3hu6VjIDkuNykqLg0KDQoqKlThu7cgbOG7hyBPZGRzIHbDoCBMb2dpdCBMaW5rKio6IEdp4bqjaSB0aMOtY2gga2jDoWkgbmnhu4dtIHThu7cgbOG7hyBvZGRzIHbDoCBt4buRaSBxdWFuIGjhu4cgY+G7p2EgbsOzIHbhu5tpIGxvZ2l0IGxpbmsgKihN4bulYyA5LjUpKi4NCg0KKipPdmVyZGlzcGVyc2lvbioqOiBY4butIGzDvSB24bqlbiDEkeG7gSBvdmVyZGlzcGVyc2lvbiAoa2hpIHBoxrDGoW5nIHNhaSBs4bubbiBoxqFuIGdp4bqjIMSR4buLbmggY+G7p2EgcGjDom4gcGjhu5FpIEJpbm9taWFsKSAqKE3hu6VjIDkuOCkqLg0KDQoqKktoaSBXYWxkIFRlc3RzIHRo4bqldCBi4bqhaSoqOiBUaOG6o28gbHXhuq1uIHbhu4EgY8OhYyBo4bqhbiBjaOG6vyBj4bunYSBXYWxkIFRlc3RzIHRyb25nIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwICooTeG7pWMgOS45KSouDQoNCioqR29vZG5lc3Mtb2YtRml0IGNobyBiaW5hcnkgcmVzcG9uc2VzKio6IEzGsHUgw70gcuG6sW5nIGdvb2RuZXNzLW9mLWZpdCBjaG8gYmluYXJ5IHJlc3BvbnNlcyAoZOG7ryBsaeG7h3Ugbmjhu4sgcGjDom4pIGtow7RuZyBjw7Mgc+G6tW4gKihN4bulYyA5LjEwKSouDQoNCioqU+G7rSBk4bulbmcgUioqOiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIHBow7kgaOG7o3AgduG7m2kgQmlub21pYWwgR0xNcyAqKE3hu6VjIDkuMTIpKi4NCg0KIyMgTcO0IGjDrG5oIGNobyBz4buRIGzGsOG7o25nOiBQb2lzc29uIHbDoCBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1zIChDaMawxqFuZyAxMCk6DQoNCioqUG9pc3NvbiBHTE1zKio6IFTDs20gdOG6r3QgY8OhYyDEkeG6t2MgxJFp4buDbSBj4bunYSBQb2lzc29uIEdMTXMsIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UgxJHhur9tIChjb3VudCBkYXRhKSAqKE3hu6VjIDEwLjIpKi4gUGjDom4gcGjhu5FpIFBvaXNzb24gbMOgIHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbi4NCg0KKipNw7QgaMOsbmggaMOzYSB04bu3IGzhu4cgKFJhdGVzKSoqOiBT4butIGThu6VuZyBHTE1zIMSR4buDIG3DtCBow6xuaCBow7NhIHThu7cgbOG7hyAodsOtIGThu6U6IHPhu5Egc+G7sSBraeG7h24gdHLDqm4gbeG7mXQgxJHGoW4gduG7iyB0aOG7nWkgZ2lhbiBob+G6t2MgZGnhu4duIHTDrWNoKSBi4bqxbmcgY8OhY2ggc+G7rSBk4bulbmcgb2Zmc2V0cyAqKE3hu6VjIDEwLjMpKi4NCg0KKipC4bqjbmcgdMawxqFuZyB0w6FjKio6IExvZy1MaW5lYXIgTW9kZWxzOiDDgXAgZOG7pW5nIFBvaXNzb24gR0xNcyBjaG8gYuG6o25nIHTGsMahbmcgdMOhYyDEkeG7gyBwaMOibiB0w61jaCBk4buvIGxp4buHdSBwaMOibiBsb+G6oWkgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGxvZy1saW5lYXIgbW9kZWxzICooTeG7pWMgMTAuNCkqLiBCYW8gZ+G7k20gY8OhYyBi4bqjbmcgaGFpIGNoaeG7gXUgdsOgIGJhIGNoaeG7gXUuDQoNCioqTmdo4buLY2ggbMO9IFNpbXBzb24qKjogTWluaCBo4buNYSBuZ2jhu4tjaCBsw70gU2ltcHNvbiB0cm9uZyBi4buRaSBj4bqjbmggYuG6o25nIHTGsMahbmcgdMOhYyAqKE3hu6VjIDEwLjQuNSkqLg0KDQoqKlPhu7EgdMawxqFuZyDEkcawxqFuZyBnaeG7r2EgQmlub21pYWwgdsOgIFBvaXNzb24gR0xNcyoqOiBUaOG6o28gbHXhuq1uIHbhu4Egc+G7sSB0xrDGoW5nIMSRxrDGoW5nIGdp4buvYSBoYWkgbG/huqFpIG3DtCBow6xuaCBuw6B5IHRyb25nIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwICooTeG7pWMgMTAuNC42KSouDQoNCioqTmVnYXRpdmUgQmlub21pYWwgR0xNcyoqOiBHaeG7m2kgdGhp4buHdSBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1zIG5oxrAgbeG7mXQgY8OhY2ggxJHhu4MgeOG7rSBsw70gb3ZlcmRpc3BlcnNpb24gdHJvbmcgZOG7ryBsaeG7h3UgxJHhur9tICooTeG7pWMgMTAuNSkqLg0KDQoqKk5naGnDqm4gY+G7qXUgxJFp4buDbiBow6xuaCoqOiBWw60gZOG7pSB24buBIG3DtCBow6xuaCBow7NhIHPhu5EgbMaw4bujbmcgduG7hyB0aW5oIHRyw6puIGN1YSBtw7NuZyBuZ+G7sWEgY8OhaSwgc+G7rSBk4bulbmcgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBuaMawIHRy4buNbmcgbMaw4bujbmcsIG3DoHUgc+G6r2MsIGNoaeG7gXUgcuG7mW5nIHbDoCB0w6xuaCB0cuG6oW5nIGdhaSAoRmlnLiAxMC42KS4gQ8OhYyBiaeG7g3UgxJHhu5MgY2jhuqluIMSRb8OhbiwgYmFvIGfhu5NtIGRldmlhbmNlIHJlc2lkdWFscyBjaOG7kW5nIGzhuqFpIGPEg24gYuG6rWMgaGFpIGPhu6dhIGdpw6EgdHLhu4sgcGjDuSBo4bujcCB2w6AgQ29vaydzIGRpc3RhbmNlLCDEkcaw4bujYyBoaeG7g24gdGjhu4sgKEZpZy4gMTAuNykuIFNvIHPDoW5oIGPDoWMgbcO0IGjDrG5oIFF1YXNpLXBvaXNzb24gdsOgIE5lZ2F0aXZlIGJpbm9taWFsIMSRxrDhu6NjIG1pbmggaOG7jWEgKEZpZy4gMTAuOCkuDQoNCioqU+G7rSBk4bulbmcgUioqOiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIHBow7kgaOG7o3AgduG7m2kgUG9pc3NvbiB2w6AgTmVnYXRpdmUgQmlub21pYWwgR0xNcyAqKE3hu6VjIDEwLjcpKi4NCg0KIyMgROG7ryBsaeG7h3UgbGnDqm4gdOG7pWMgZMawxqFuZzogR2FtbWEgdsOgIEludmVyc2UgR2F1c3NpYW4gR0xNcyAoQ2jGsMahbmcgMTEpOg0KDQoqKk3DtCBow6xuaCBow7NhIGThu68gbGnhu4d1IGxpw6puIHThu6VjIGTGsMahbmcqKjogR2nhu5tpIHRoaeG7h3UgY8OhYyBHTE1zIHBow7kgaOG7o3AgY2hvIGThu68gbGnhu4d1IGxpw6puIHThu6VjIGNo4buJIG5o4bqtbiBjw6FjIGdpw6EgdHLhu4sgZMawxqFuZyAqKE3hu6VjIDExLjIpKi4NCg0KKipQaMOibiBwaOG7kWkgR2FtbWEqKjogVGjhuqNvIGx14bqtbiB24buBIHBow6JuIHBo4buRaSBHYW1tYSBuaMawIG3hu5l0IHRow6BuaCBwaOG6p24gbmfhuqt1IG5oacOqbiBwaMO5IGjhu6NwIGNobyBsb+G6oWkgZOG7ryBsaeG7h3UgbsOgeSAqKE3hu6VjIDExLjMpKi4NCg0KKipQaMOibiBwaOG7kWkgSW52ZXJzZSBHYXVzc2lhbioqOiBUaOG6o28gbHXhuq1uIHbhu4EgcGjDom4gcGjhu5FpIEludmVyc2UgR2F1c3NpYW4gKihN4bulYyAxMS40KSouDQoNCioqSMOgbSBsacOqbiBr4bq/dCoqOiBDw6FjIGjDoG0gbGnDqm4ga+G6v3QgcGjDuSBo4bujcCBjaG8gR2FtbWEgdsOgIEludmVyc2UgR2F1c3NpYW4gR0xNcyAqKE3hu6VjIDExLjUpKi4gQ8OhYyBiaeG7g3UgxJHhu5MgcGjhuqduIGTGsCAocXVhbnRpbGUgcmVzaWR1YWxzKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkcOhbmggZ2nDoSBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oIGxvZy1saW5rIChGaWcuIDExLjcpLg0KDQoqKsav4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgcGjDom4gdMOhbioqOiBDw6FjaCDGsOG7m2MgbMaw4bujbmcgdGhhbSBz4buRIHBow6JuIHTDoW4gz4YgY2hvIHBow6JuIHBo4buRaSBHYW1tYSB2w6AgSW52ZXJzZSBHYXVzc2lhbiAqKE3hu6VjIDExLjYpKi4NCg0KKipOZ2hpw6puIGPhu6l1IMSRaeG7g24gaMOsbmgqKjogQ8OhYyB2w60gZOG7pSB0aOG7sWMgdOG6vyB24buBIHZp4buHYyDDoXAgZOG7pW5nIGPDoWMgbcO0IGjDrG5oIG7DoHkgKihN4bulYyAxMS43KSouDQoNCioqU+G7rSBk4bulbmcgUioqOiBDw6FjaCBz4butIGThu6VuZyBSIMSR4buDIHBow7kgaOG7o3AgduG7m2kgR2FtbWEgdsOgIEludmVyc2UgR2F1c3NpYW4gR0xNcyAqKE3hu6VjIDExLjgpKi4NCg0KIyMgVHdlZWRpZSBHTE1zIChDaMawxqFuZyAxMik6DQoNCioqVHdlZWRpZSBFRE1zKio6IEdp4bubaSB0aGnhu4d1IGPDoWMgcGjDom4gcGjhu5FpIFR3ZWVkaWUsIG3hu5l0IGzhu5twIGNvbiBj4bunYSBFRE1zLCBwaMO5IGjhu6NwIGNobyBk4buvIGxp4buHdSBsacOqbiB04bulYyBkxrDGoW5nIHbDoCBk4buvIGxp4buHdSB24bubaSBjw6FjIGdpw6EgdHLhu4sga2jDtG5nIGNow61uaCB4w6FjICooTeG7pWMgMTIuMikqLg0KDQoqKkPhuqV1IHRyw7pjIFR3ZWVkaWUgRURNcyoqOiBNw7QgdOG6oyBj4bqldSB0csO6YyBj4bunYSBUd2VlZGllIEVETXMgKihN4bulYyAxMi4yLjIpKi4NCg0KKipE4buvIGxp4buHdSBsacOqbiB04bulYyBkxrDGoW5nIHbDoCBk4buvIGxp4buHdSBjw7MgZ2nDoSB0cuG7iyBraMO0bmcgY2jDrW5oIHjDoWMqKjogVGjhuqNvIGx14bqtbiB24buBIOG7qW5nIGThu6VuZyBj4bunYSBUd2VlZGllIEVETXMgY2hvIGPDoWMgbG/huqFpIGThu68gbGnhu4d1IG7DoHkgKihN4bulYyAxMi4yLjMsIDEyLjIuNCkqLg0KDQoqKlR3ZWVkaWUgR0xNcyoqOiDEkOG7i25oIG5naMSpYSB2w6AgY8OhY2ggxrDhu5tjIGzGsOG7o25nIFR3ZWVkaWUgR0xNcyAqKE3hu6VjIDEyLjMpKi4gQmFvIGfhu5NtIMaw4bubYyBsxrDhu6NuZyB0aGFtIHPhu5EgaW5kZXggzr4gKihN4bulYyAxMi4zLjIpKiB2w6AgY8OhY2ggcGjDuSBo4bujcCB24bubaSBtw7QgaMOsbmggKihN4bulYyAxMi4zLjMpKi4NCg0KKipOZ2hpw6puIGPhu6l1IMSRaeG7g24gaMOsbmgqKjogQ8OhYyB2w60gZOG7pSB0aOG7sWMgdOG6vyB24buBIHZp4buHYyDDoXAgZOG7pW5nIFR3ZWVkaWUgR0xNcyAqKE3hu6VjIDEyLjQpKi4NCg0KKipT4butIGThu6VuZyBSKio6IEPDoWNoIHPhu60gZOG7pW5nIFIgxJHhu4MgcGjDuSBo4bujcCB24bubaSBUd2VlZGllIEdMTXMgKihN4bulYyAxMi41KSouDQoNCkPDoWMga2jDrWEgY+G6oW5oIHF1YW4gdHLhu41uZyBraMOhYzoNCg0KDQoqU+G7rSBk4bulbmcgUjogQ3Xhu5FuIHPDoWNoIHTDrWNoIGjhu6NwIGNo4bq3dCBjaOG6vSB2aeG7h2Mgc+G7rSBk4bulbmcgUiDEkeG7gyBtaW5oIGjhu41hIHbDoCB0aOG7sWMgaGnhu4duIGPDoWMga+G7uSB0aHXhuq10IG3DtCBow6xuaCBow7NhLiBDw7MgbeG7mXQgcGjhuqduIHBo4bulIGzhu6VjIGTDoG5oIHJpw6puZyBjaG8gdmnhu4djIHPhu60gZOG7pW5nIFIgY2hvIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IChBcHBlbmRpeCBBKS4qDQoNCkPDoWMgduG6pW4gxJHhu4EgdsOgIFTDoGkgbGnhu4d1IHRoYW0ga2jhuqNvOiBN4buXaSBjaMawxqFuZyDEkeG7gXUgY8OzIGPDoWMgduG6pW4gxJHhu4EgYsOgaSB04bqtcCB2w6AgdMOgaSBsaeG7h3UgdGhhbSBraOG6o28gbGnDqm4gcXVhbi4NCg0KROG7ryBsaeG7h3U6IEN14buRbiBzw6FjaCBz4butIGThu6VuZyBnw7NpIEdMTXNEYXRhIHRyb25nIFIsIGNo4bupYSBjw6FjIGLhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgY8OhYyB2w60gZOG7pSAoQXBwZW5kaXggQikuDQoNCj0+IFTDs20gbOG6oWksIHTDoGkgbGnhu4d1IG7DoHkgY3VuZyBj4bqlcCBt4buZdCBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIGNoaSB0aeG6v3QgduG7gSBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB2w6AgbcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0LCB04bqtcCB0cnVuZyB2w6BvIGPDoWMga2jDrWEgY+G6oW5oIGzDvSB0aHV54bq/dCwgcGjGsMahbmcgcGjDoXAgxrDhu5tjIGzGsOG7o25nICjEkeG6t2MgYmnhu4d0IGzDoCBiw6xuaCBwaMawxqFuZyBuaOG7jyBuaOG6pXQgdsOgIGto4bqjIG7Eg25nIHjhuqN5IHJhIGPhu7FjIMSR4bqhaSksIHN1eSBsdeG6rW4gdGjhu5FuZyBrw6ogdsOgIGNo4bqpbiDEkW/DoW4gbcO0IGjDrG5oLiBWaeG7h2Mgc+G7rSBk4bulbmcgUiDEkcaw4bujYyB0w61jaCBo4bujcCB4dXnDqm4gc3Xhu5F0IMSR4buDIGjhu5cgdHLhu6Mgdmnhu4djIGjhu41jIHbDoCDDoXAgZOG7pW5nIGPDoWMga+G7uSB0aHXhuq10IG7DoHkuDQoNCioqX1hpbiBsxrB1IMO9IHLhurFuZyBi4bqjbiB0w7NtIHThuq90IG7DoHkgZOG7sWEgdHLDqm4gbeG7pWMgbOG7pWMgdsOgIGPDoWMgxJFv4bqhbiB0csOtY2ggxJHGsOG7o2MgY3VuZyBj4bqlcC4gxJDhu4MgY8OzIGhp4buDdSBiaeG6v3QgxJHhuqd5IMSR4bunLCBj4bqnbiDEkeG7jWMgdG/DoG4gYuG7mSBjdeG7kW4gc8OhY2guXyoqDQoNCiMgLiBUSOG7kE5HIEvDiiBNw5QgVOG6oiBDw4FDIEJJ4bq+Tg0KDQoqKkdp4bqjaSB0aMOtY2ggY8OhYyBiaeG6v24qKg0KDQpgYGB7cn0NCg0KdmFyaWFibGVfZXhwbGFpbiA8LSBkYXRhLmZyYW1lKA0KICBUZW5fQmllbiA9IGMoIlVubmFtZWQ6IDAiLCAiUHVyY2hhc2VEYXRlIiwgIkN1c3RvbWVySUQiLCAiR2VuZGVyIiwgIk1hcml0YWxTdGF0dXMiLCANCiAgICAgICAgICAgICAgICJIb21lb3duZXIiLCAiQ2hpbGRyZW4iLCAiQW5udWFsSW5jb21lIiwgIkNpdHkiLCAiU3RhdGVvclByb3ZpbmNlIiwgDQogICAgICAgICAgICAgICAiQ291bnRyeSIsICJQcm9kdWN0RmFtaWx5IiwgIlByb2R1Y3REZXBhcnRtZW50IiwgIlByb2R1Y3RDYXRlZ29yeSIsIA0KICAgICAgICAgICAgICAgIlVuaXRzU29sZCIsICJSZXZlbnVlIiksDQogIFlfTmdoaWEgPSBjKCJDaOG7iSBz4buRIGTDsm5nICh04buxIHNpbmgsIGPDsyB0aOG7gyBi4buPIHF1YSkiLA0KICAgICAgICAgICAgICAiTmfDoHkgbXVhIGjDoG5nIiwNCiAgICAgICAgICAgICAgIk3DoyBraMOhY2ggaMOgbmciLA0KICAgICAgICAgICAgICAiR2nhu5tpIHTDrW5oIGPhu6dhIGtow6FjaCBow6BuZyAoTSA9IE5hbSwgRiA9IE7hu68pIiwNCiAgICAgICAgICAgICAgIlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiAoUyA9IMSQ4buZYyB0aMOibiwgTSA9IMSQw6Mga+G6v3QgaMO0bikiLA0KICAgICAgICAgICAgICAiQ8OzIHPhu58gaOG7r3UgbmjDoCBraMO0bmcgKFkgPSBDw7MsIE4gPSBLaMO0bmcpIiwNCiAgICAgICAgICAgICAgIlPhu5EgbMaw4bujbmcgY29uIGPhu6dhIGtow6FjaCBow6BuZyIsDQogICAgICAgICAgICAgICJN4bupYyB0aHUgbmjhuq1wIGjDoG5nIG7Eg20gKHbDrSBk4bulOiAkMzBLIC0gJDUwSykiLA0KICAgICAgICAgICAgICAiVGjDoG5oIHBo4buRIG7GoWkga2jDoWNoIGjDoG5nIHPhu5FuZyIsDQogICAgICAgICAgICAgICJCYW5nIGhv4bq3YyB04buJbmgiLA0KICAgICAgICAgICAgICAiUXXhu5FjIGdpYSAodHJvbmcgZmlsZSBsw6AgVVNBKSIsDQogICAgICAgICAgICAgICJOaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oICh2w60gZOG7pTogRm9vZCwgRHJpbmspIiwNCiAgICAgICAgICAgICAgIlBow7JuZyBiYW4gc+G6o24gcGjhuqltICh2w60gZOG7pTogU25hY2sgRm9vZHMsIFByb2R1Y2UpIiwNCiAgICAgICAgICAgICAgIkRhbmggbeG7pWMgY2hpIHRp4bq/dCBz4bqjbiBwaOG6qW0gKHbDrSBk4bulOiBDYW5keSwgVmVnZXRhYmxlcykiLA0KICAgICAgICAgICAgICAiU+G7kSBsxrDhu6NuZyBz4bqjbiBwaOG6qW0gxJHDoyBiw6FuIiwNCiAgICAgICAgICAgICAgIkRvYW5oIHRodSB04burIMSRxqFuIGjDoG5nIChVU0QpIikNCikNCmxpYnJhcnkoa25pdHIpDQoNCmthYmxlKHZhcmlhYmxlX2V4cGxhaW4sIGNhcHRpb24gPSAiIEdp4bqjaSB0aMOtY2ggY8OhYyBiaeG6v24gdHJvbmcgZmlsZSBk4buvIGxp4buHdSIpDQoNCmBgYA0KDQoqKkvhur90IHF14bqjIHRo4buRbmcga8OqIG3DtCB04bqjKioNCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kb3B0aW9ucyhyZXBvcyA9IGMoQ1JBTiA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKSkNCg0KaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KaW5zdGFsbC5wYWNrYWdlcygicmVhZHIiKQ0KaW5zdGFsbC5wYWNrYWdlcygic3RyaW5nciIpDQppbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQppbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikNCiMjIyBO4bqhcCB0aMawIHZp4buHbg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIyMgxJDhu41jIGZpbGUgQ1NWIHbhu5tpIHTDqm4gJ2QnIChi4bqhbiDEkeG7lWkgxJHGsOG7nW5nIGThuqtuIG7hur91IGPhuqduKQ0KZCA8LSByZWFkLmNzdihmaWxlLmNob29zZSgpLCBoZWFkZXIgPSBUKQ0KcmVhZC5jc3YoZmlsZSA9ICcvVXNlcnMvVHV5ZXQgTmhpL0Rvd25sb2Fkcy9TdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMuY3N2JykNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShEVCkNCmRhdGF0YWJsZShkLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTApKQ0KDQoNCiMjIyDwn5OKIELhuqJORyAxOiBU4buVbmcgcXVhbg0KdG9uZ19xdWFuIDwtIGRhdGEuZnJhbWUoDQogIE3hu6VjID0gYygiU+G7kSBkw7JuZyIsICJT4buRIGPhu5l0IiwgDQogICAgICAgICAgIkJp4bq/biBk4bqhbmcgY2h14buXaSAoY2hhcmFjdGVyKSIsIA0KICAgICAgICAgICJCaeG6v24gZOG6oW5nIHPhu5EgKG51bWVyaWMpIiksDQogIMOdX25naMSpYSA9IGMoDQogICAgcGFzdGUwKG5yb3coZCksICIgZMOybmcgZOG7ryBsaeG7h3UgKGdpYW8gZOG7i2NoIHThuqFpIHNpw6p1IHRo4buLKSIpLA0KICAgIHBhc3RlMChuY29sKGQpLCAiIGPhu5l0IGJp4bq/biIpLA0KICAgIHBhc3RlMChuY29sKHNlbGVjdChkLCB3aGVyZShpcy5jaGFyYWN0ZXIpKSksICIgYmnhur9uIGThuqFuZyBjaHXhu5dpIiksDQogICAgcGFzdGUwKG5jb2woc2VsZWN0KGQsIHdoZXJlKGlzLm51bWVyaWMpKSksICIgYmnhur9uIGThuqFuZyBz4buRIikNCiAgKQ0KKQ0Ka2FibGUodG9uZ19xdWFuLCBjYXB0aW9uID0gIvCfk4ogVOG7lW5nIHF1YW4gZOG7ryBsaeG7h3UiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCiMjIyDwn5SgIELhuqJORyAyOiBCaeG6v24gZOG6oW5nIGNodeG7l2kNCg0KIyMjIELGsOG7m2MgMTogQ2jhu41uIGPDoWMgYmnhur9uIGThuqFuZyBjaHXhu5dpDQpjaGFyX3ZhcnMgPC0gc2VsZWN0KGQsIHdoZXJlKGlzLmNoYXJhY3RlcikpDQoNCiMjIyBCxrDhu5tjIDI6IFThuqFvIGLhuqNuZyBtw7QgdOG6oyB0aGVvIHTDqm4gYmnhur9uIChuYW1lZCB2ZWN0b3IpDQptb190YV9sb29rdXAgPC0gYygNCiAgUHVyY2hhc2VEYXRlID0gIk5nw6B5IGtow6FjaCBow6BuZyB0aOG7sWMgaGnhu4duIGdpYW8gZOG7i2NoIG11YSIsDQogIEdlbmRlciA9ICIyIGdp4bubaSB0w61uaCAoRiwgTSkiLA0KICBNYXJpdGFsU3RhdHVzID0gIlTDrG5oIHRy4bqhbmcgaMO0biBuaMOibjogxJDhu5ljIHRow6JuIChTKSBob+G6t2MgxJDDoyBr4bq/dCBow7RuIChNKSIsDQogIEhvbWVvd25lciA9ICJDw7MgbmjDoCAoWSkgaG/hurdjIGtow7RuZyAoTikiLA0KICBBbm51YWxJbmNvbWUgPSAiVGh1IG5o4bqtcCBo4buZIGdpYSDEkcOsbmggdGhlbyBraG/huqNuZyAoJEspIiwNCiAgQ2l0eSA9ICJUaMOgbmggcGjhu5EgbsahaSBraMOhY2ggaMOgbmcgc+G7kW5nICh+MjMgdGjDoG5oIHBo4buRKSIsDQogIFN0YXRlb3JQcm92aW5jZSA9ICJU4buJbmgvYmFuZyBuxqFpIGPGsCB0csO6ICh+MTAgYmFuZykiLA0KICBDb3VudHJ5ID0gIlF14buRYyBnaWEgKFVTQSwgQ2FuYWRhLCBNZXhpY28uLi4pIiwNCiAgUHJvZHVjdEZhbWlseSA9ICJOaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oIChGb29kLCBEcmluaywgTm9uLUNvbnN1bWFibGVzKSIsDQogIFByb2R1Y3REZXBhcnRtZW50ID0gIlBow7JuZyBiYW4gc+G6o24gcGjhuqltICgyMiBsb+G6oWk6IFNuYWNrcywgUHJvZHVjZS4uLikiLA0KICBQcm9kdWN0Q2F0ZWdvcnkgPSAiRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY2hpIHRp4bq/dCAoNDUgbG/huqFpOiBDYW5keSwgVmVnZXRhYmxlcy4uLikiDQopDQoNCiMjIyBCxrDhu5tjIDM6IFThuqFvIGLhuqNuZyB0aOG7kW5nIGvDqg0KY2hhcl9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIEJp4bq/biA9IG5hbWVzKGNoYXJfdmFycyksDQogIFPhu5FfZ2nDoV90cuG7i19raMOhY19uaGF1ID0gc2FwcGx5KGNoYXJfdmFycywgZnVuY3Rpb24oeCkgbGVuZ3RoKHVuaXF1ZSh4KSkpLA0KICDDnV9uZ2jEqWEgPSBtb190YV9sb29rdXBbbmFtZXMoY2hhcl92YXJzKV0NCikNCg0KIyMjIELGsOG7m2MgNDogR8OhbiBtw7QgdOG6oyBt4bq3YyDEkeG7i25oIG7hur91IHRoaeG6v3UNCmNoYXJfc3VtbWFyeSTDnV9uZ2jEqWFbaXMubmEoY2hhcl9zdW1tYXJ5JMOdX25naMSpYSldIDwtICLEkGFuZyBj4bqtcCBuaOG6rXQgbcO0IHThuqMuLi4iDQoNCiMjIyBCxrDhu5tjIDU6IEhp4buDbiB0aOG7iyBi4bqjbmcNCmthYmxlKGNoYXJfc3VtbWFyeSwgY2FwdGlvbiA9ICLwn5SgIEJp4bq/biBk4bqhbmcgY2h14buXaSAoY2hhcmFjdGVyKSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkNCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KIyMjIPCflKIgQuG6ok5HIDM6IEJp4bq/biBk4bqhbmcgc+G7kSAoc+G7rWEgxJHhuqd5IMSR4bunIGtow7RuZyB0aGnhur91IGJp4bq/biBuw6BvKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBCMTogRGFuaCBzw6FjaCBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGPhuqduIGdp4buvDQpxdWFudF92YXJzX2FsbCA8LSBjKA0KICAiQ3VzdG9tZXJJRCIsICJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiQ2hpbGRyZW4iLA0KICAiQW5udWFsSW5jb21lIiwgIlVuaXRzU29sZCIsICJSZXZlbnVlIiwgIlB1cmNoYXNlRGF0ZURheXMiLA0KICAiQ2l0eV9mcmVxIiwgIlN0YXRlb3JQcm92aW5jZV9mcmVxIiwgIkNvdW50cnlfZnJlcSIsDQogICJQcm9kdWN0RmFtaWx5X2ZyZXEiLCAiUHJvZHVjdERlcGFydG1lbnRfZnJlcSIsICJQcm9kdWN0Q2F0ZWdvcnlfZnJlcSINCikNCg0KIyBCMjogR2nhu68gbOG6oWkgbmjhu69uZyBiaeG6v24gY8OzIHRo4buxYyB0cm9uZyBkYXRhc2V0DQpxdWFudF92YXJzIDwtIGludGVyc2VjdChxdWFudF92YXJzX2FsbCwgY29sbmFtZXMoZCkpDQoNCiMgQjM6IMOJcCBs4bqhaSB0b8OgbiBi4buZIGPDoWMgYmnhur9uIHbhu4EgbnVtZXJpYw0KZFtxdWFudF92YXJzXSA8LSBsYXBwbHkoZFtxdWFudF92YXJzXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpKQ0KDQojIEI0OiBU4bqhbyBi4bqjbmcgdGjhu5FuZyBrw6oNCm51bV9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIEJp4bq/biA9IHF1YW50X3ZhcnMsDQogIE1lYW4gPSByb3VuZChzYXBwbHkoZFtxdWFudF92YXJzXSwgbWVhbiwgbmEucm0gPSBUUlVFKSwgMiksDQogIFNEICAgPSByb3VuZChzYXBwbHkoZFtxdWFudF92YXJzXSwgc2QsIG5hLnJtID0gVFJVRSksIDIpDQopDQoNCiMgQjU6IFRow6ptIG3DtCB04bqjIMO9IG5naMSpYQ0KbW9fdGFfbG9va3VwIDwtIGMoDQogIEN1c3RvbWVySUQgPSAiTcOjIGtow6FjaCBow6BuZyBkdXkgbmjhuqV0IiwNCiAgR2VuZGVyID0gIkdp4bubaSB0w61uaCDEkcOjIG3DoyBob8OhIChGID0gMCwgTSA9IDEpIiwNCiAgTWFyaXRhbFN0YXR1cyA9ICJUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gxJHDoyBtw6MgaG/DoSAoUyA9IDAsIE0gPSAxKSIsDQogIEhvbWVvd25lciA9ICJT4bufIGjhu691IG5ow6AgxJHDoyBtw6MgaG/DoSAoTiA9IDAsIFkgPSAxKSIsDQogIENoaWxkcmVuID0gIlRydW5nIGLDrG5oIG3hu5dpIGtow6FjaCBjw7MgMuKAkzMgY29uIiwNCiAgQW5udWFsSW5jb21lID0gIlRodSBuaOG6rXAgaOG7mSBnaWEgxJHDrG5oICjEkcOjIGNodXnhu4NuIHThu6sga2hv4bqjbmcgc2FuZyBz4buRIHRydW5nIGLDrG5oKSIsDQogIFVuaXRzU29sZCA9ICJN4buXaSBnaWFvIGThu4tjaCBiw6FuIH40IMSRxqFuIHbhu4sgc+G6o24gcGjhuqltIiwNCiAgUmV2ZW51ZSA9ICJN4buXaSBnaWFvIGThu4tjaCB04bqhbyByYSB0cnVuZyBiw6xuaCB+MTMgVVNEIiwNCiAgUHVyY2hhc2VEYXRlRGF5cyA9ICJT4buRIG5nw6B5IGvhu4MgdOG7qyBt4buRYyAxOC8xMi8yMDA3IiwNCiAgQ2l0eV9mcmVxID0gIlThuqduIHN14bqldCB0aMOgbmggcGjhu5EgeHXhuqV0IGhp4buHbiIsDQogIFN0YXRlb3JQcm92aW5jZV9mcmVxID0gIlThuqduIHN14bqldCB04buJbmgvYmFuZyB4deG6pXQgaGnhu4duIiwNCiAgQ291bnRyeV9mcmVxID0gIlThuqduIHN14bqldCBxdeG7kWMgZ2lhIHh14bqldCBoaeG7h24iLA0KICBQcm9kdWN0RmFtaWx5X2ZyZXEgPSAiVOG6p24gc3XhuqV0IG5ow7NtIHPhuqNuIHBo4bqpbSIsDQogIFByb2R1Y3REZXBhcnRtZW50X2ZyZXEgPSAiVOG6p24gc3XhuqV0IHBow7JuZyBiYW4gc+G6o24gcGjhuqltIiwNCiAgUHJvZHVjdENhdGVnb3J5X2ZyZXEgPSAiVOG6p24gc3XhuqV0IGxv4bqhaSBz4bqjbiBwaOG6qW0gY2hpIHRp4bq/dCINCikNCg0KIyBCNjogR+G6r24gbcO0IHThuqMNCm51bV9zdW1tYXJ5JEdp4bqjaV90aMOtY2ggPC0gbW9fdGFfbG9va3VwW251bV9zdW1tYXJ5JEJp4bq/bl0NCm51bV9zdW1tYXJ5JEdp4bqjaV90aMOtY2hbaXMubmEobnVtX3N1bW1hcnkkR2nhuqNpX3Row61jaCldIDwtICLEkGFuZyBj4bqtcCBuaOG6rXQgbcO0IHThuqMuLi4iDQoNCiMgQjc6IEhp4buDbiB0aOG7iyBi4bqjbmcgxJHhurlwDQprYWJsZShudW1fc3VtbWFyeSwgY2FwdGlvbiA9ICLwn5SiIEJp4bq/biBk4bqhbmcgc+G7kSAobnVtZXJpYyAtIMSR4bqneSDEkeG7pywgc+G6oWNoIHPhur0pIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkNCg0KYGBgDQoNCg0KDQoqKipUaOG7kW5nIGvDqiBtw7QgdOG6oyAqKioNCg0KLSBUaOG7sWMgaGnhu4duIHTDrW5oIHRvw6FuIGPDoWMgdGjhu5FuZyBrw6ogbcO0IHThuqMgKGJhbyBn4buTbSBnacOhIHRy4buLIHRydW5nIGLDrG5oLCDEkeG7mSBs4buHY2ggY2h14bqpbiwgZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQsIGzhu5tuIG5o4bqldCB2w6AgY8OhYyBwaMOibiB24buLKSBjaG8gY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4gDQoNCi0gQ8OhYyBiaeG6v24gY+G6p24gcGjDom4gdMOtY2ggYmFvIGfhu5NtOiBDdXN0b21lcklELCBHZW5kZXIsIE1hcml0YWxTdGF0dXMsIEhvbWVvd25lciwgQ2hpbGRyZW4sIEFubnVhbEluY29tZSwgVW5pdHNTb2xkLCBSZXZlbnVlLCBQdXJjaGFzZURhdGVEYXlzLCBjw7luZyB24bubaSBjw6FjIGJp4bq/biBwaOG6o24gw6FuaCB04bqnbiBzdeG6pXQgbXVhIGjDoG5nLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIyMgRGFuaCBzw6FjaCBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyAoZMO5IGPDsyB0aOG7gyBjaMawYSDEkeG7pyB0cm9uZyBkKQ0KcXVhbnRfdmFyc19hbGwgPC0gYygiQ3VzdG9tZXJJRCIsICJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiQ2hpbGRyZW4iLA0KICAgICAgICAgICAgICAgICAgICAiQW5udWFsSW5jb21lIiwgIlVuaXRzU29sZCIsICJSZXZlbnVlIiwgIlB1cmNoYXNlRGF0ZURheXMiLA0KICAgICAgICAgICAgICAgICAgICAiQ2l0eV9mcmVxIiwgIlN0YXRlb3JQcm92aW5jZV9mcmVxIiwgIkNvdW50cnlfZnJlcSIsDQogICAgICAgICAgICAgICAgICAgICJQcm9kdWN0RmFtaWx5X2ZyZXEiLCAiUHJvZHVjdERlcGFydG1lbnRfZnJlcSIsICJQcm9kdWN0Q2F0ZWdvcnlfZnJlcSIpDQoNCiMjIyBHaeG7ryBs4bqhaSBiaeG6v24gdGjhu7FjIHPhu7EgdOG7k24gdOG6oWkgdHJvbmcgZA0KcXVhbnRfdmFycyA8LSBpbnRlcnNlY3QocXVhbnRfdmFyc19hbGwsIGNvbG5hbWVzKGQpKQ0KDQojIyMgw4lwIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB0aMOgbmggbnVtZXJpYw0KZFtxdWFudF92YXJzXSA8LSBsYXBwbHkoZFtxdWFudF92YXJzXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpKQ0KDQojIyMgVMOtbmggdGjhu5FuZyBrw6ogbcO0IHThuqMsIHhvYXkgYuG6o25nLCBsb+G6oWkgZMOybmcgdG/DoG4gTkEgLyBOYU4gLyBJbmYNCnN1bW1hcnlfc3RhdHMgPC0gZCAlPiUNCiAgc2VsZWN0KGFsbF9vZihxdWFudF92YXJzKSkgJT4lDQogIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBsaXN0KA0KICAgIE1lYW4gICA9IH5tZWFuKC4sIG5hLnJtID0gVFJVRSksDQogICAgU3RkRGV2ID0gfnNkKC4sIG5hLnJtID0gVFJVRSksDQogICAgTWluICAgID0gfm1pbiguLCBuYS5ybSA9IFRSVUUpLA0KICAgIFExICAgICA9IH5xdWFudGlsZSguLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lZGlhbiA9IH5xdWFudGlsZSguLCAwLjUsIG5hLnJtID0gVFJVRSksDQogICAgUTMgICAgID0gfnF1YW50aWxlKC4sIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ICAgID0gfm1heCguLCBuYS5ybSA9IFRSVUUpDQogICksIC5uYW1lcyA9ICJ7LmNvbH1fey5mbn0iKSkgJT4lDQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gYygiQmnhur9uIiwgIi52YWx1ZSIpLCBuYW1lc19zZXAgPSAiXyIpICU+JQ0KICByZWxvY2F0ZShCaeG6v24pICU+JQ0KICByb3d3aXNlKCkgJT4lDQogIGZpbHRlcihhbnkoIWlzLm5hKGNfYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSkgJiBpcy5maW5pdGUoY19hY3Jvc3Mod2hlcmUoaXMubnVtZXJpYykpKSkpICU+JQ0KICB1bmdyb3VwKCkNCg0KIyMjIEhp4buDbiB0aOG7iyBi4bqjbmcgc+G6oWNoLCDEkeG6uXAsIGN14buZbiDEkcaw4bujYw0Ka2FibGUoc3VtbWFyeV9zdGF0cywgY2FwdGlvbiA9ICLwn5OKIELhuqNuZyB0aOG7kW5nIGvDqiBtw7QgdOG6oyBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lDQogIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICI0MDBweCIpDQoNCg0KYGBgDQoNCg0K