library("tidyverse")
library("DT")
library("ggplot2")
library("scales")
library("rvest")
library("netstat")
library("stringr")
library("epitools")
library("caret")
library("DescTools")

ĐỀ TÀI: PHÂN TÍCH CÁC YẾU TỐ ẢNH HƯỞNG ĐẾN GIÁ BÁN CỦA NGÔI NHÀ

Tên thành viên: Nguyễn Minh Khang - 2121011757

1 LỜI CẢM ƠN

Lời nói đầu tiên tôi xin gửi lời cảm ơn đến Trường Đại học Tài chính - Marketing, đặc biệt là các thầy cô khoa Kinh tế - Luật đã đưa học phần Phân tích dữ liệu định tính vào chương trình đào tạo để tôi có kiến thức mới để chuẩn bị hành trang sau này. Bên cạnh đó, tôi xin gửi lời cảm ơn chân thành và sâu sắc nhất khi được giảng viên hướng dẫn là thầy ThS.Trần Mạnh Tường đã chỉ dẫn hỗ trợ để tôi có thể hoàn thành bài kết thúc học phần được chỉnh chu nhất.Thầy đã giúp tôi tích lũy được thêm nhiều kiến thức liên quan đến môn học. Tuy nhiên, trong quá trình học tập cũng như là trong quá trình làm bài tiểu luận khó tránh khỏi những thiếu sót rất mong thầy bỏ qua. Tôi rất mong nhận được những ý kiến đóng góp của thầy để bản thân có thể học hỏi thêm nhiều kinh nghiệm và hoàn thành tốt hơn trong những bài cáo sắp tới

Tôi xin chân thành cảm ơn!

2 PHẦN MỞ ĐẦU

2.1 Đặt vấn đề

Trong thị trường bất động sản, việc hiểu rõ được các yếu tố ảnh hưởng đến giá của từng ngôi nhà là yếu tố quan trọng đối với các nhà hoạch định chính sách, nhà đầu tư và cả người mua nhà. Giá nhà không chỉ phản ánh giá trị của bất động sản mà còn chịu tác động bởi nhiều yếu tố như diện tích, vị trí, các tiện nghi và môi trường xung quanh của ngôi nhà đó. Nghiên cứu giá nhà tại một thời điểm cụ thể giúp hiểu rõ hơn về xu hướng thị trường. Trong bối cảnh đô thị hóa nhanh chóng, dân số tăng cao và nhu cầu nhà ở ngày càng lớn, việc xác định các yếu tố ảnh hưởng đến giá bán nhà trở nên vô cùng quan trọng.

Trong những năng gần đây, thị trường bất động sản chứng kiến nhiều biến động về giá cả, gây khó khăn cho cả người mua và người bán. Đối với người mua, việc đánh giá đúng giá cả của một ngôi nhà giúp họ đưa ra quyết định hợp lý, tránh bị thiệt thòi khi mua nhà với giá quá cao so với giá bán thực. Đối với người bán, việc định giá chính xác giúp họ không bỏ lỡ cơ hội bán nhà với giá tốt hoặc không bị ép giá. Các nhà đầu tư bất động sản cần có cái nhìn tổng quan về thị trường và các yếu tố ảnh hưởng để đưa ra các chiến lược đầu tư hiệu quả. Chính phủ và các nhà hoạch định chính sách cũng cần hiểu rõ động lực của thị trường bất động sản để phát triển các chính sách phù hợp, điều tiết thị trường và hỗ trợ người dân trong việc tiếp cận nhà ở. Việc hiểu rõ và dự đoán được các biến động giá cả trong thị trường này không chỉ giúp cho các bên tham gia thị trường đưa ra các quyết định sáng suốt mà còn hỗ trợ cho các nhà hoạch định chính sách trong việc ổn định và phát triển nền kinh tế. Đặc biệt, giá bán của ngôi nhà là một trong những yếu tố chính ảnh hưởng đến quyết định mua bán và đầu tư trong lĩnh vực bất động sản.

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

Mục tiêu của nghiên cứu này là phân tích và xác định các yếu tố ảnh hưởng đến giá bán nhà tại Windsor, Canada, trong giai đoạn từ tháng 7 đến tháng 9 năm 1987, sử dụng dữ liệu từ bộ dữ liệu “HousePrices” của gói AER.

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

Đối tượng nghiên cứu: Các yếu tố ảnh hưởng đến giá bán của các ngôi nhà.

Phạm vi nghiên cứu: 546 ngôi nhà ở thành phố Windsor, Canada trong tháng 7,8,9 năm 1987.

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

Phương pháp xử lý số liệu bằng thống kê toán học: Để nắm vững thông tin và số liệu liên quan đến thị trường bất động sản, tác giả sẽ tiến hành một quá trình phân tích số liệu bằng phương pháp thống kê toán học. Các thông số liên quan đến tần suất, phân bố, độ tương quan và độ tương tác giữa các biến sẽ được tính toán. Phần mềm R - một công cụ mạnh mẽ và phổ biến trong lĩnh vực thống kê và xử lý dữ liệu - sẽ hỗ trợ quá trình này. Việc sử dụng phần mềm R sẽ đảm bảo tính chính xác và đáng tin cậy trong việc phân tích số liệu.

2.5 Kết cấu đề tài

PHẦN MỞ ĐẦU

Chương 1 Tổng quan lý thuyết

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

Chương 3 Thống kê mổ tả các biến

Chương 4 Phân tích dữ liệu và kết quả nghiên cứu

3 CHƯƠNG 1: TỔNG QUAN LÝ THUYẾT

3.1 Khái niệm về thị trường bất động sản

Thị trường bất động sản là lĩnh vực rộng lớn liên quan đến nhiều ngành, nhiều lĩnh vực như đất đai, xây dựng, kiến trúc, môi trường, thuế, giao dịch đảm bảo,… Bên cạnh đó, bất động sản là một loại hàng hóa có tính đặc thù kinh doanh loại hình này sẽ tác động đến hành vi kinh doanh, đầu tư, tái đầu tư, tài chính, tiền tệ, đầu cơ, quỹ dự trữ, dự phòng,… Bất động sản có quan hệ mật thiết tới xây dựng, quản lí nhà nước về đất đai, quy hoạch và kế hoạch sử dụng đất. Thị trường bất động sản là một phần quan trọng của nền kinh tế, nơi diễn ra các mối quan hệ của con người về giao dịch quyền sử dụng đất, tài sản trên đất tại một khu vực địa lí nhất định, trong một khoảng thời gian cụ thể.

3.2 Khái niệm về giá nhà

Giá nhà là một trong những yếu tố quan trọng nhất trong thị trường bất động sản, ảnh hưởng đến cả người mua và người bán. Giá nhà được xác định bởi nhiều yếu tố, bao gồm:

  • Vị trí: Vị trí là yếu tố quan trọng nhất ảnh hưởng đến giá nhà. Nhà ở khu vực trung tâm thành phố hoặc gần các tiện ích như trường học, bệnh viện và trung tâm thương mại thường có giá cao hơn.
  • Diện tích: Diện tích đất và diện tích sàn của ngôi nhà cũng là yếu tố quan trọng. Những ngôi nhà có diện tích lớn hơn thường có giá cao hơn.
  • Tình trạng và tuổi của ngôi nhà: Nhà mới xây hoặc được bảo trì tốt thường có giá trị cao hơn so với nhà cũ hoặc cần sửa chữa.
  • Các tiện nghi: Sự hiện diện của các tiện nghi như garage, điều hòa không khí, hệ thống sưởi, bể bơi, và sân vườn có thể tăng giá trị của ngôi nhà.
  • Yếu tố kinh tế và tài chính: Tình hình kinh tế, lãi suất và các chính sách tài chính của chính phủ cũng ảnh hưởng đến giá nhà.

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

4.1 Mô hình nghiên cứu

4.1.1 Mô hình logit

\(logit(π) = log (π/1-π) = β_0+ β_1X_1+ β_2X_2+...+ B_kX_k\)

Với π là xác suất để biến phụ thuộc nhận giá trị “thành công”. Đối với hàm glm phạm trù thứ hai của biến nhị phân thể hiện cho “thành công” (chúng ta sử dụng hàm levels() để kiểm tra thứ tự của các phạm trù của một biến định tính.

4.1.2 Mô hình probit

Hồi quy Probit hay còn được gọi là mô hình Probit, được sử dụng để ước lượng mô hình có biến phụ thuộc dạng nhị phân. Trong hồi quy Probit, xem hàm xác suất \(\pi(x)\) hoặc $ 1-(x)$ là hàm phân phối xác suất của một biến ngẫu nhiên X có phân phối chuẩn tức là xác suất thành công có dạng

\[\pi(x)=\phi(\alpha+\beta(x))\]

Trong đó : \[\phi(x)=(\frac1{\sqrt2\phi}\int_\infty^x \mathrm{e}^{-1/2}\,t^2\]

Kí hiệu:

\[Probit(\pi(x))=\phi^-1(\pi(x))\]

Mô hình Probit được viết dưới dạng

\[Probit(\pi(x))=\alpha + betax\]

4.1.3 Các tiêu chí đánh giá mô hình

Để đánh giá các mô hình hồi cổ điển chúng ta thường dựa vào hệ số xác định mô hình \((R^2)\), nhưng đối với mô các mô hình hồi quy tuyến tính tổng quát chúng ta sử dụng các tiêu chí sau:

AIC - Akaike Information Criterion

AIC được đề xuất bởi Akaike Hirotugu, một nhà thống kê học người Nhật. AIC là một tiêu chí được sử dụng một cách phổ biến để đánh giá một mô hình hồi quy được ước lượng bởi phương pháp Maximum Likekihood (ML). Một cách chung chung giá trị của AIC càng nhỏ thì mô hình càng tốt. AIC được tính bằng công thức sau: \(AIC= -2ln(L)+2k\) Với L là giá trị cực đại của hàm hợp lý (likelihood function) và k là số tham số của mô hình.

Khi thực hiện việc ước lượng mô hình hồi quy bằng lệnh glm thì chỉ số AIC đã được tính toán và thể hiện trên bảng kết quả ( bằng lệnh summary).

Deviance

Deviance cũng là một tiêu chí rất phổ biến được sử dụng để đánh giá một mô hình hồi quy được ước lượng bởi phương pháp Hợp lý cực đại (ML). Một cách tổng quá, cũng giống như chỉ tiêu AIC, giá trị của Deviance càng nhỏ thì mô hình càng tốt.

Lưu ý: Khi thực hiện việc ước lượng mô hình hồi quy bằng lệnh glm thì chỉ số AIC và Deviance đã được tính toán và thể hiện trên bảng kết quả ( bằng lệnh summary).

Brier Score Là chỉ tiêu dùng để đánh giá mô hình hồi quy logistic, Brier Score được tính như sau: \(B= 1/n \sum_{i=1}^{n}(p_i-o_i)\)

Trong đó: pi,oi lần lượt là giá trị xác suất quan sát được, và giá trị xác suất tính ra từ mô hình.

4.2 Dữ liệu nghiên cứu

4.2.1 Giới thiệu bộ dữ liệu

Bộ dữ liệu “HousePrices” được lấy từ gói AER. Trong bộ dữ trên liên quan đến giá bán của 546 căn nhà ở thành phố Windsor, Canada trong tháng 7,8,9 của năm 1987. Bộ dữ liệu được sử dụng để phân tích các yếu tố ảnh hưởng đến giá bán của ngôi nhà, cho phép các nhà phân tích hiểu rõ hơn về các yếu tố ảnh hưởng đến giá bán của ngôi nhà và xây dựng được các mô hình dự báo.

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

Dữ liệu trên bao gồm 12 biến: 6 biến định lượng và 6 biến định tính.

6 biến định lượng

  • Price: Giá bán của ngôi nhà (USD)

  • Lotsize: Diện tích căn nhà

  • Bedrooms: Số lượng phòng ngủ

  • Bathrooms: Số lượng phòng tắm

  • Stories: Số tầng của ngôi nhà không tính tầng hầm

  • Garage: Số gara trong nhà

6 biến định tính

  • Driveway: Ngôi nhà có khu vực riêng để đậu xe không (yes/no)?

  • Recreation: Nhà có phòng giải trí không (yes/no)?

  • Fullbase: Nhà có được trang bị tầng hầm hoàn thiện hay không (yes/no)? ( tầng hầm hoàn thiện bao gồm các phòng như phòng tập thể dục, trò chơi điện tử, …)

  • Gasheat: Nhà có sử dụng gas để đun nước nóng không (yes/no)?

  • Aircon: Nhà có máy điều hoà trung tâm không (yes/no)?

  • Prefer: Nhà có nằm trong khu trung tâm của thành phố không (yes/no)?

4.2.3 Bộ dữ liệu

nmk <- read.csv("C:/Users/VIP/Downloads/HousePrices.csv")
datatable(nmk)

4.2.4 Bộ dữ liệu sau khi mã hóa

Mã hóa biến định lượng Price thành biến định tính. Nếu giá bán nhà nhỏ hơn hoặc bằng 100000 USD ta quy ước là 0. Nếu giá bán nhà lớn hơn 100000 USD ta quy ước là 1.

Pmahoa<-subset(nmk, price < 190000)
dim(Pmahoa)
## [1] 545  13
Pmahoa$price[Pmahoa$price <= 100000] <- 0
Pmahoa$price[Pmahoa$price > 100000] <- 1
datatable(Pmahoa)

4.2.5 Xác định biến phụ thuộc

Với mục đích phân tích các yếu tố ảnh hưởng đến giá bán của ngôi nhà, sử dụng biến định tính làm biến phụ thuộc:

Price: Giá bán của ngôi nhà

Biến phụ thuộc trong nghiên cứu này là biến giá nhà (Price), một trong những yếu tố quan trọng trong lĩnh vực bất động sản, phản ánh giá trị mà người mua sẵn sàng trả để sở hữu được một ngôi nhà. Giá nhà chịu ảnh hưởng bởi nhiều yếu tố như diện tích của ngôi nhà, số phòng ngủ, phòng tắm và các tiện nghi khác như ngôi nhà có tầng hầm đã được hoàn thiện hay chưa, vị trí ngôi nhà có nằm ở vị trí trung tâm hay không,… Diện tích lớn và nhiều tiện nghi thường dẫn đến giá nhà cao hơn. vị trí ngôi nhà là yếu tố quan trọng nhất, với các khu vực có cơ sở hạ tầng tốt, an ninh và gần trung tâm thường dẫn đến giá nhà cao hơn. Trong bộ dữ liệu HousePrices, biến Price là một biến quan trọng vì nó ảnh hưởng nhiều đến nhà đầu tư, người mua nhà và nhà hoạch định chính sách. Việc có mặt của biến này giúp nhà đầu tư đưa ra quyết định thông minh, tối ưu hóa lợi nhuận và phát triển bền vững thị trường bất động sản.

5 CHƯƠNG 3: THỐNG KÊ MÔ TẢ CÁC BIẾN

summary(Pmahoa)
##     rownames         price           lotsize         bedrooms    
##  Min.   :  1.0   Min.   :0.0000   Min.   : 1650   Min.   :1.000  
##  1st Qu.:137.0   1st Qu.:0.0000   1st Qu.: 3600   1st Qu.:2.000  
##  Median :273.0   Median :0.0000   Median : 4600   Median :3.000  
##  Mean   :273.3   Mean   :0.1156   Mean   : 5146   Mean   :2.963  
##  3rd Qu.:410.0   3rd Qu.:0.0000   3rd Qu.: 6360   3rd Qu.:3.000  
##  Max.   :546.0   Max.   :1.0000   Max.   :16200   Max.   :6.000  
##    bathrooms        stories        driveway          recreation       
##  Min.   :1.000   Min.   :1.000   Length:545         Length:545        
##  1st Qu.:1.000   1st Qu.:1.000   Class :character   Class :character  
##  Median :1.000   Median :2.000   Mode  :character   Mode  :character  
##  Mean   :1.284   Mean   :1.806                                        
##  3rd Qu.:2.000   3rd Qu.:2.000                                        
##  Max.   :4.000   Max.   :4.000                                        
##    fullbase           gasheat             aircon              garage      
##  Length:545         Length:545         Length:545         Min.   :0.0000  
##  Class :character   Class :character   Class :character   1st Qu.:0.0000  
##  Mode  :character   Mode  :character   Mode  :character   Median :0.0000  
##                                                           Mean   :0.6899  
##                                                           3rd Qu.:1.0000  
##                                                           Max.   :3.0000  
##     prefer         
##  Length:545        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

5.1 Thống kê mô tả từng biến

5.1.1 Biến phụ thuộc (Price)

Biến Price: Giá bán của ngôi nhà

  • Bảng tần số - bảng tần suất
table(Pmahoa$price)
## 
##   0   1 
## 482  63
table(Pmahoa$price)/sum(table(Pmahoa$price))
## 
##         0         1 
## 0.8844037 0.1155963
  • Đồ thị
Pmahoa |> ggplot(aes( x = price, y = after_stat(count))) +
  geom_bar(fill = 'blue') +
  geom_text(aes(label = scales::percent( after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = 1.5) +
  theme_classic() + 
  labs(x = 'Giá bán', y = 'Số ngôi nhà')

Nhận xét: Kết quả cho thấy trong 546 ngôi nhà có 482 ngôi nhà có giá bán dưới 100000 USD chiếm 88% số ngôi nhà trong cuộc khảo sát và 63 ngôi nhà có mức giá bán trên 100000 USD chiếm 12% số ngôi nhà trong cuộc khảo sát.

5.1.2 Biến độc lập

Biến Bedrooms: Số phòng ngủ trong ngôi nhà.

summary(Pmahoa$bedrooms)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   2.963   3.000   6.000
  • Bảng tần số
table(Pmahoa$bedrooms)
## 
##   1   2   3   4   5   6 
##   2 136 301  94  10   2
  • Bảng tần suất
table(Pmahoa$bedrooms)/sum(table(Pmahoa$bedrooms))*100
## 
##          1          2          3          4          5          6 
##  0.3669725 24.9541284 55.2293578 17.2477064  1.8348624  0.3669725
  • Đồ thị
Pmahoa |> ggplot( aes( x = bedrooms, y= after_stat(count))) + geom_bar(fill='orange') + geom_text(aes(label= scales :: percent(after_stat(count/sum(count)),accuracy=.01)), stat = 'count', color= 'black', vjust= -.5) + theme_classic() + xlab('Số phòng ngủ') + ylab('Số ngôi nhà')

Nhận xét: Kết quả trên cho thấy

  • Những ngôi nhà có 3 phòng ngủ chiếm tỷ lệ cao nhất 55,23% (có 301 ngôi nhà)

  • Những ngôi nhà có 1 phòng ngủ và nhà có 6 phòng ngủ chiếm tỉ lệ thấp nhất 0,37% (có 2 ngôi nhà)

  • Những ngôi nhà có 2 phòng ngủ chiếm tỷ lệ 24,91% (có 136 ngôi nhà)

  • Những ngôi nhà có 4 phòng ngủ chiếm tỷ lệ 17,4% (có 94 ngôi nhà)

  • Những ngôi nhà có 5 phòng ngủ chiếm tỷ lệ 1,83% (có 10 ngôi nhà)

Biến Driveway: Nhà có khu vực riêng để đậu xe không?

  • Bảng tần số
table(Pmahoa$driveway)
## 
##  no yes 
##  77 468
  • Bảng tần suất
table(Pmahoa$driveway)/sum(table(Pmahoa$driveway))
## 
##        no       yes 
## 0.1412844 0.8587156
  • Đồ thị
Pmahoa |> ggplot(aes( x = driveway, y = after_stat(count))) +
  geom_bar(fill = 'Salmon') +
  geom_text(aes(label = scales::percent( after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = 1.5) +
  theme_classic() + 
  labs(x = 'Chỗ đậu xe', y = 'Số ngôi nhà')

Nhận xét: Kết quả trên cho thấy trong tổng số 546 ngôi nhà thì có 77 ngôi nhà trong cuộc khảo sát không có khu vực riêng để đậu xe (chiếm 14%) và có 468 ngôi nhà trong cuộc khảo sát có nhà có khu vực riêng để đậu xe (chiếm 86%).

Biến Prefer: Nhà có nằm trong khu trung tâm của thành phố không?

  • Bảng tần số
table(Pmahoa$prefer)
## 
##  no yes 
## 418 127
  • Bảng tần suất
table(Pmahoa$prefer)/sum(table(Pmahoa$prefer))
## 
##        no       yes 
## 0.7669725 0.2330275
  • Đồ thị
Pmahoa |> ggplot(aes( x = prefer, y = after_stat(count))) +
  geom_bar(fill = 'green') +
  geom_text(aes(label = scales::percent( after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = 1.5) +
  theme_classic() + 
  labs(x = 'Vị trí', y = 'Số ngôi nhà')

Nhận xét: Kết quả trên cho thấy trong tổng số 545 ngôi nhà thì có 127 ngôi nhà trong cuộc khảo sát có vị trí ngôi nhà nằm trong khu vực trung tâm thành phố (chiếm 23%) và có 418 ngôi nhà trong cuộc khảo sát có vị trí nằm cách xa trung tâm thành phố (chiếm 77%).

Biến Recreation: Nhà có phòng giải trí không?

  • Bảng tần số
table(Pmahoa$recreation)
## 
##  no yes 
## 448  97
  • Bảng tần suất
table(Pmahoa$recreation)/sum(table(Pmahoa$recreation))
## 
##        no       yes 
## 0.8220183 0.1779817
  • Đồ thị
table(Pmahoa$recreation)
## 
##  no yes 
## 448  97
table(Pmahoa$recreation)/sum(table(Pmahoa$recreation))*100
## 
##       no      yes 
## 82.20183 17.79817
Pmahoa |> ggplot(aes( x = recreation, y = after_stat(count))) +
  geom_bar(fill = 'brown') +
  geom_text(aes(label = scales::percent( after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = 1.5) +
  theme_classic() + 
  labs(x = 'Phòng giải trí', y = 'Số ngôi nhà')

thht <- Pmahoa %>% group_by(recreation) %>% summarise( n=n()) %>% mutate( percent =n/sum(n)) 
thht |> ggplot(aes(x='', y=percent, fill= recreation)) + geom_bar(stat='identity', width = 1) + geom_text(aes(label = paste0(round(percent*100), "%")), position = position_stack(vjust = 0.5))+
  coord_polar("y", start = 0) +
  scale_fill_manual(values = c("brown", "moccasin"), name = "recreation") +
    labs(title = "recreation") +
  theme_minimal()

Nhận xét: Kết quả trên cho thấy có 18% số ngôi nhà trong cuộc khảo sát nhà có phòng giải trí và 82% số ngôi nhà trong cuộc khảo sát nhà không có phòng giải trí.

5.2 Thống kê mô tả cho các cặp biến

5.2.1 Thống kê mô tả giữa biến Price và biến Bedrooms

Giải thích: Lập bảng tần số giữa hai biến trên cho chúng ta biết số lượng phòng ngủ thì có mức giá bán như thế nào.

  • Bảng tần số
nmk$phongngu <- cut( nmk$bedrooms, breaks = c(0,2,7), labels = c('ít', 'nhiều'))
nmk$gia <- cut( nmk$price, breaks = c(0,70000,191000), labels = c('thấp', 'cao'))
table(nmk$gia)
## 
## thấp  cao 
##  345  201

Tôi chia biến price (giá bán nhà) thành 2 mức giá cao và thấp. Trong cuộc khảo sát có 345 người bán nhà với mức giá thấp và 201 người bán nhà với mức giá cao.

m <- table(nmk$phongngu, nmk$gia)
addmargins(m)
##        
##         thấp cao Sum
##   ít     127  11 138
##   nhiều  218 190 408
##   Sum    345 201 546

Nhận xét:

Có 127 người trong cuộc khảo sát có ít phòng ngủ có mức giá bán thấp.

Có 11 người trong cuộc khảo sát có ít phòng ngủ có mức giá bán cao.

Có 218 người trong cuộc khảo sát có nhiều phòng ngủ có mức giá bán thấp.

Có 190 người trong cuộc khảo sát có nhiều phòng ngủ có mức giá bán cao.

  • Đồ thị
nmk |> count(phongngu, gia) |>
  group_by(phongngu) |>
  mutate(pH = n/sum(n)) |>
  ggplot(aes(x = phongngu, y = n, fill = gia)) +
  geom_col() +
  geom_text(aes(label = percent(pH, accuracy = .01)), position = position_stack(vjust = 0.5), size = 4) +
  ylab('Số ngôi nhà') +
  xlab('Số phòng ngủ')

Từ kết quả trên cho thấy:

  • Trong số những ngôi nhà có ít phòng ngủ thì có 7,97% là nhà có mức giá bán cao, 92,03% là nhà có mức giá bán thấp.

  • Trong số những ngôi nhà có nhiều phòng ngủ thì có 46,57% là nhà có mức giá bán cao, 53,43% là nhà có mức giá bán thấp.

5.2.2 Thống kê mô tả giữa biến Price và biến Driveway

Giải thích: Lập bảng tần số giữa hai biến trên cho chúng ta biết những ngôi nhà có chỗ để xe thì có mức giá bán như thế nào.

  • Bảng tần số
mk <- table(Pmahoa$price, Pmahoa$driveway)
addmargins(mk)
##      
##        no yes Sum
##   0    77 405 482
##   1     0  63  63
##   Sum  77 468 545
  • Bảng tần suất
prop.table(mk)
##    
##            no       yes
##   0 0.1412844 0.7431193
##   1 0.0000000 0.1155963
  • Đồ thị
ggplot(Pmahoa, aes(price,  fill = driveway)) + geom_bar(position = position_dodge(width = 0.8), binwidth = 25) + xlab("Giá bán") + ylab("Số ngôi nhà")
## Warning in geom_bar(position = position_dodge(width = 0.8), binwidth = 25):
## Ignoring unknown parameters: `binwidth`

Từ kết quả trên cho thấy:

  • Những ngôi nhà có mức giá bán dưới 100000 USD thì có 77 ngôi nhà không có chỗ đậu xe (chiếm 14,13%) và có 405 ngôi nhà có chỗ đậu xe (chiếm 74,31%)

  • Những ngôi nhà có mức giá bán cao hơn 100000 USD thì có 0 ngôi nhà không có chỗ đậu xe (chiếm 0,00%) và có 63 ngôi nhà có chỗ đậu xe (chiếm 11,56%)

5.2.3 Thống kê mô tả giữa biến Price và biến Prefer

Giải thích: Lập bảng tần số giữa hai biến trên cho chúng ta biết những ngôi nhà ở vị trí trung tâm thì có mức giá bán như thế nào.

  • Bảng tần số
mk1 <- table(Pmahoa$price, Pmahoa$prefer)
addmargins(mk1)
##      
##        no yes Sum
##   0   379 103 482
##   1    39  24  63
##   Sum 418 127 545
  • Bảng tần suất
prop.table(mk1)
##    
##             no        yes
##   0 0.69541284 0.18899083
##   1 0.07155963 0.04403670
  • Biểu đồ
ggplot(Pmahoa, aes(price,  fill = prefer)) + geom_bar(position = position_dodge(width = 0.8), binwidth = 25) + xlab("Giá bán") + ylab("Số ngôi nhà")
## Warning in geom_bar(position = position_dodge(width = 0.8), binwidth = 25):
## Ignoring unknown parameters: `binwidth`

Từ kết quả trên cho thấy:

  • Những ngôi nhà có mức giá bán dưới 100000 USD thì có 379 ngôi nhà cách xa trung tâm thành phố (chiếm 69,5%) và có 103 ngôi nhà có chỗ đậu xe (chiếm 18,9%)

  • Những ngôi nhà có mức giá bán cao hơn 100000 USD thì có 39 ngôi nhà các xa trung tâm thành phố (chiếm 7,16%) và có 24 ngôi nhà có chỗ đậu xe (chiếm 4,4%)

5.2.4 Thống kê mô tả giữa biến Price và biến Recreation

Giải thích: Lập bảng tần số giữa hai biến trên cho chúng ta biết những ngôi nhà có phòng giải trí thì có mức giá bán như thế nào.

mk2 <- table(Pmahoa$price, Pmahoa$recreation)
addmargins(mk2)
##      
##        no yes Sum
##   0   406  76 482
##   1    42  21  63
##   Sum 448  97 545
  • Bảng tần suất
prop.table(mk2)
##    
##             no        yes
##   0 0.74495413 0.13944954
##   1 0.07706422 0.03853211
  • Đồ thị
ggplot(Pmahoa, aes(price,  fill = recreation)) + geom_bar(position = position_dodge(width = 0.8), binwidth = 25) + xlab("Giá bán") + ylab("Số ngôi nhà")
## Warning in geom_bar(position = position_dodge(width = 0.8), binwidth = 25):
## Ignoring unknown parameters: `binwidth`

Từ kết quả trên cho thấy:

  • Những ngôi nhà có mức giá bán dưới 100000 USD thì có 406 ngôi nhà không có phòng giải trí (chiếm 74,5%) và có 76 ngôi nhà có chỗ đậu xe (chiếm 13,94%)

  • Những ngôi nhà có mức giá bán cao hơn 100000 USD thì có 42 ngôi nhà không có phòng giải trí (chiếm 7,7%) và có 21 ngôi nhà có phòng giải trí (chiếm 3,85%)

6 CHƯƠNG 4: PHÂN TÍCH DỮ LIỆU

6.1 Phân tích Relative Risk, Riskradio, Oddsradio giữa biến Price và biến Bedrooms

  • Price: Giá bán của ngôi nhà

  • Bedrooms: Số lượng phòng ngủ có trong ngôi nhà

RelRisk(m)
## [1] 1.722377
riskratio(m)
## $data
##        
##         thấp cao Total
##   ít     127  11   138
##   nhiều  218 190   408
##   Total  345 201   546
## 
## $measure
##        risk ratio with 95% C.I.
##         estimate    lower    upper
##   ít    1.000000       NA       NA
##   nhiều 5.842246 3.282996 10.39655
## 
## $p.value
##        two-sided
##         midp.exact fisher.exact   chi.square
##   ít            NA           NA           NA
##   nhiều          0 2.243681e-18 4.408231e-16
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Tỷ lệ những nhà có nhiều phòng ngủ được bán với mức giá thấp nhiều hơn 72,24% so với tỷ lệ những nhà có ít phòng ngủ được bán với mức giá cao.

Tỷ lệ những nhà có nhiều phòng ngủ được bán với mức giá thấp gấp 5,84 lần so với tỷ lệ những nhà có ít phòng ngủ được bán với mức giá cao.

oddsratio(m)
## $data
##        
##         thấp cao Total
##   ít     127  11   138
##   nhiều  218 190   408
##   Total  345 201   546
## 
## $measure
##        odds ratio with 95% C.I.
##         estimate   lower    upper
##   ít    1.000000      NA       NA
##   nhiều 9.905394 5.41057 20.04372
## 
## $p.value
##        two-sided
##         midp.exact fisher.exact   chi.square
##   ít            NA           NA           NA
##   nhiều          0 2.243681e-18 4.408231e-16
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Tỷ lệ những ngôi nhà có giá bán thấp trên những ngôi nhà có giá bán cao trong số những ngôi nhà có nhiều phòng ngủ cao gấp 9,9 lần so với tỷ lệ những ngôi nhà có giá bán thấp trên những ngôi nhà có giá bán cao trong số những ngôi nhà có ít phòng ngủ.

6.2 Phân tích Relative Risk, Riskradio, Oddsradio giữa biến Price và biến Prefer

  • Price: Giá bán của ngôi nhà

  • Prefer: Nhà có nằm trong khu vực trung tâm thành phố hay không?

RelRisk(mk1)
## [1] 1.270188
riskratio(mk1)
## $data
##        
##          no yes Total
##   0     379 103   482
##   1      39  24    63
##   Total 418 127   545
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate    lower    upper
##   0 1.000000       NA       NA
##   1 1.782709 1.245814 2.550984
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact  chi.square
##   0         NA           NA          NA
##   1  0.0051007  0.006412255 0.003144995
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Theo kết quả trên ta thấy

Tỷ lệ những ngôi nhà không nằm ở vị trí trung tâm được bán với mức giá thấp (dưới 100,000 USD) cao hơn tỷ lệ những ngôi nhà nằm ở vị trí trung tâm được bán với mức giá thấp (dưới 100,000 USD) 27,02%.

Tỷ lệ những ngôi nhà nằm ở vị trí trung tâm được bán với mức giá cao (trên 100,000 USD) gấp 1,78 lần so với tỷ lệ những ngôi nhà không nằm ở vị trí trung tâm được bán với mức giá cao (trên 100,000 USD).

oddsratio(mk1)
## $data
##        
##          no yes Total
##   0     379 103   482
##   1      39  24    63
##   Total 418 127   545
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate    lower    upper
##   0 1.000000       NA       NA
##   1 2.265048 1.285963 3.924222
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact  chi.square
##   0         NA           NA          NA
##   1  0.0051007  0.006412255 0.003144995
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Tỷ lệ những ngôi nhà nằm ở vị trí trung tâm thành phố so với những ngôi nhà nằm ở vị trí cách xa trung tâm thành phố trong số những ngôi nhà có mức giá bán cao (hơn 100,000 USD) cao gấp 2,26 lần tỷ lệ những ngôi nhà nằm ở vị trí trung tâm thành phố so với những ngôi nhà nằm ở vị trí cách xa trung tâm thành phố trong số những ngôi nhà có mức giá bán thấp (dưới 100,000 USD).

6.3 Phân tích Relative Risk, Riskradio, Oddsradio giữa biến Price và biến Recreation

  • Price: Giá bán của ngôi nhà

  • Recreation: Nhà có phòng giải trí hay không?

RelRisk(mk2)
## [1] 1.263485
riskratio(mk2)
## $data
##        
##          no yes Total
##   0     406  76   482
##   1      42  21    63
##   Total 448  97   545
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate   lower    upper
##   0 1.000000      NA       NA
##   1 2.114035 1.40914 3.171541
## 
## $p.value
##    two-sided
##      midp.exact fisher.exact   chi.square
##   0          NA           NA           NA
##   1 0.001505483  0.001378597 0.0006081908
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét: Kết quả trên cho ta thấy

Tỷ lệ những ngôi nhà không không có phòng giải trí được bán với mức giá bán thấp (dưới 100000 USD) nhiều hơn 26,3% so với tỷ lệ những ngôi nhà có phòng giải trí được bán với mức giá bán thấp (dưới 100000 USD).

Tỷ lệ những ngôi nhà có phòng giải trí có mức giá bán cao (lớn hơn 100000 USD) gấp 2,11 lần so với tỷ lệ những ngôi nhà không có phòng giải trí được bán với mức giá cao (hơn 100000 USD).

oddsratio(mk2)
## $data
##        
##          no yes Total
##   0     406  76   482
##   1      42  21    63
##   Total 448  97   545
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate    lower   upper
##   0 1.000000       NA      NA
##   1 2.672743 1.473829 4.73474
## 
## $p.value
##    two-sided
##      midp.exact fisher.exact   chi.square
##   0          NA           NA           NA
##   1 0.001505483  0.001378597 0.0006081908
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét: Tỷ lệ những ngôi nhà có phòng giải trí trên những ngôi nhà không có phòng giải trí trong số những ngôi nhà có mức giá bán thấp (dưới 100000 USD) cao gấp 2,67 lần tỷ lệ những ngôi nhà có phòng giải trí trên những ngôi nhà không có phòng giải trí trong số những ngôi nhà có mức giá bán cao (hơn 100000 USD)

6.4 Ước lượng tỷ lệ

6.4.1 Ước lượng tỷ lệ biến Price

mkk <- Pmahoa[ Pmahoa$price == '1',]
prop.test( length(mkk$price), length( Pmahoa$price))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkk$price) out of length(Pmahoa$price), null probability 0.5
## X-squared = 320.59, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.09058243 0.14617362
## sample estimates:
##         p 
## 0.1155963
mkk <-  Pmahoa[ Pmahoa$price == '0',]
prop.test( length(mkk$price), length( Pmahoa$price))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkk$price) out of length(Pmahoa$price), null probability 0.5
## X-squared = 320.59, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.8538264 0.9094176
## sample estimates:
##         p 
## 0.8844037

Nhận xét: Với độ tin cậy 95% ta có tỷ lệ những ngôi nhà có giá bán cao hơn 100000 USD trong cuộc khảo sát nằm trong khoảng từ 9,06% đến 14,61%. Mặc khác, tỷ lệ những ngôi nhà có giá bán thấp hơn 100000 USD trong cuộc khảo sát nằm trong khoảng từ 85,3% đến 90,9%.

6.4.2 Ước lượng tỷ lệ biến Bedrooms

bed <- Pmahoa[Pmahoa$bedrooms > 2,]
prop.test( length(bed$bedrooms), length(Pmahoa$bedrooms))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(bed$bedrooms) out of length(Pmahoa$bedrooms), null probability 0.5
## X-squared = 131.79, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7076864 0.7823505
## sample estimates:
##        p 
## 0.746789

Nhận xét: Với độ tin cậy 95% ta có tỷ lệ người bán nhà có nhiều hơn 2 phòng ngủ trong cuộc khảo sát nằm trong khoảng từ 70,77% đến 78,23%.

6.4.3 Ước lượng tỷ lệ biến Prerfer

mkkk <- Pmahoa[Pmahoa$prefer =='yes',]
prop.test( length(mkkk$prefer), length(Pmahoa$prefer))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkkk$prefer) out of length(Pmahoa$prefer), null probability 0.5
## X-squared = 154.31, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.1986153 0.2712730
## sample estimates:
##         p 
## 0.2330275
mkkk <- Pmahoa[Pmahoa$prefer =='no',]
prop.test( length(mkkk$prefer), length(Pmahoa$prefer))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkkk$prefer) out of length(Pmahoa$prefer), null probability 0.5
## X-squared = 154.31, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7287270 0.8013847
## sample estimates:
##         p 
## 0.7669725

Nhận xét: Với độ tin cậy 95% ta có tỷ lệ những ngôi nhà đó nằm trong khu vực trung tâm thành phố trong cuộc khảo sát nằm trong khoảng từ 19,8% đến 27,1%. Mặc khác, tỷ lệ những ngôi nhà không nằm trong khu vực trung tâm thành phố trong cuộc khảo sát từ 72,8% đến 80,13%.

6.4.4 Ước lượng tỷ lệ biến Driveway

mkkk <- Pmahoa[Pmahoa$driveway == 'yes',]
prop.test( length(mkkk$driveway), length(Pmahoa$driveway))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkkk$driveway) out of length(Pmahoa$driveway), null probability 0.5
## X-squared = 279.08, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.8259674 0.8862859
## sample estimates:
##         p 
## 0.8587156

Nhận xét: Với độ tin cậy 95% ta có tỷ lệ những ngôi nhà có khu vực đậu xe riêng trong cuộc khảo sát nằm trong khoảng từ 82,6% đến 88,6%.

6.4.5 Ước lượng tỷ lệ biến Recreation

mkkkk <- Pmahoa[Pmahoa$recreation == 'no',]
prop.test( length(mkkkk$recreation), length(Pmahoa$recreation))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkkkk$recreation) out of length(Pmahoa$recreation), null probability 0.5
## X-squared = 224.77, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7867101 0.8526908
## sample estimates:
##         p 
## 0.8220183
mkkkk <- Pmahoa[Pmahoa$recreation == 'yes',]
prop.test( length(mkkkk$recreation), length(Pmahoa$recreation))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(mkkkk$recreation) out of length(Pmahoa$recreation), null probability 0.5
## X-squared = 224.77, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.1473092 0.2132899
## sample estimates:
##         p 
## 0.1779817

Nhận xét: Với độ tin cậy 95% ta có tỷ lệ những ngôi nhà có phòng giải trí trong cuộc khảo sát nằm trong khoảng từ 14,73% đến 21,32%. Mặc khác, tỷ lệ những ngôi nhà không có phòng giải trí trong cuộc khảo sát từ 78,67% đến 85,26%.

6.5 Thống kê suy diễn

6.5.1 Kiểm định giữa 2 biến Price và biến Bedrooms

  • Price: Giá bán nhà

  • Bedrooms: Số lượng phòng ngủ có trong ngôi nhà

Giả thuyết:

\(H_0\): Price và Bedrooms độc lập.

\(H_1\): Price và Bedrooms không độc lập.

chisq.test(m)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  m
## X-squared = 64.396, df = 1, p-value = 1.018e-15

Nhận xét: Kết quả cho chúng ta thấy rằng p-value = 1.018e-15 < 0.05. Đây cũng là bằng chứng để ta bác bỏ giả thuyết H0. Vậy với mức ý nghĩa 5%, biến số lượng phòng ngủ và biến giá bán của ngôi nhà không độc lập với nhau

6.5.2 Kiểm định giữa 2 biến Price và biến Prefer

  • Price: Giá bán nhà

  • Prefer: Ngôi nhà có nằm trong khu vực trung tâm thành phố hay không?

Giả thuyết:

\(H_0\): Price và Prefer độc lập.

\(H_1\): Price và Prefer không độc lập.

chisq.test(mk1)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  mk1
## X-squared = 7.8106, df = 1, p-value = 0.005194

Nhận xét: Kết quả cho chúng ta thấy rằng p-value = 0.005194 < 0.05. Đây cũng là bằng chứng để ta bác bỏ giả thuyết H0. Vậy với mức ý nghĩa 5%, những ngôi nhà có tầng hầm hay không và giá nhà không độc lập với nhau.

6.5.3 Kiểm định giữa 2 biến Price và biến Driveway

  • Price: Giá bán nhà

  • Driveway: Ngôi nhà có khu vực đậu xe riêng hay không?

Giả thuyết:

\(H_0\): Price và Driveway độc lập.

\(H_1\): Price và Driveway không độc lập.

chisq.test(mk)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  mk
## X-squared = 10.44, df = 1, p-value = 0.001233

Nhận xét: Kết quả cho chúng ta thấy rằng p-value = 0.001233 < 0.05. Đây cũng là bằng chứng để ta bác bỏ giả thuyết H0. Vậy với mức ý nghĩa 5%, những ngôi nhà có khu vực đậu xe và giá bán của ngôi nhà không độc lập với nhau.

6.5.4 Kiểm định giữa 2 biến Price và biến Receation

  • Price: Giá bán nhà

  • Recreation: Ngôi nhà có phòng giải trí hay không?

Giả thuyết:

\(H_0\): Price và Recreation độc lập.

\(H_1\): Price và Recreation không độc lập.

chisq.test(mk2)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  mk2
## X-squared = 10.581, df = 1, p-value = 0.001143

Nhận xét: Kết quả cho chúng ta thấy rằng p-value = 0.001143 < 0.05. Đây cũng là bằng chứng để ta bác bỏ giả thuyết H0. Vậy với mức ý nghĩa 5%, những ngôi nhà có phòng giải trí và giá bán của ngôi nhà không độc lập với nhau.

6.6 Mô hình hồi quy

6.6.1 Mô hình hồi quy logit

Dạng tổng quát:

\[logit(π)=log(π/(1−π)=β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]

logit <- glm( price ~ prefer + bedrooms + recreation , family= binomial( link = 'logit'), data=Pmahoa)
summary(logit)
## 
## Call:
## glm(formula = price ~ prefer + bedrooms + recreation, family = binomial(link = "logit"), 
##     data = Pmahoa)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.5542  -0.5304  -0.3789  -0.2358   2.6820  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -5.5108     0.6727  -8.192 2.57e-16 ***
## preferyes       0.7078     0.2997   2.362   0.0182 *  
## bedrooms        0.9709     0.1899   5.112 3.19e-07 ***
## recreationyes   0.8011     0.3126   2.562   0.0104 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 390.28  on 544  degrees of freedom
## Residual deviance: 347.49  on 541  degrees of freedom
## AIC: 355.49
## 
## Number of Fisher Scoring iterations: 5

Vậy nên mô hình logit được xác định như sau:

\(log(\frac{\pi}{1-\pi}) = -5.5108 + 0.7078prefer + 0.9709bedrooms + 0.8011recreation\)

Giải thích kết quả

  • Hệ số chặn là -5,5108 điều này có nghĩa là khi không có sự tác động của các yếu tố ảnh hưởng thì mức giá bán của ngôi nhà là -5,5108.

  • Trong trường hợp các yếu tố khác không đổi, giá trị β1=0.7078 cho thấy rằng những ngôi nhà nằm ở trung tâm thành phố có odds cao hơn so với những ngôi nhà ở vị trí cách xa trung tâm thành phố. Odds của vị trí ngôi nhà ở trung tâm thành phố cao hơn 2,029521397 lần những ngôi ở cách xa trung tâm thành phố.

  • Trong trường hợp các yếu tố khác không đổi, giá trị β2=0.9709 thể hiện với mỗi ngôi nhà có thêm một phòng ngủ thì odds của xác suất xảy ra sẽ tăng. Odds của những ngôi nhà có thêm một phòng ngủ cao hơn 2,64 lần so với so với những ngôi nhà có ít hơn một phòng ngủ

  • Trong trường hợp các yếu tố khác không đổi, giá trị β3=0.8011 cho thấy rằng những ngôi nhà có khu giải trí có odds cao hơn những ngôi nhà không có khu giải trí. Odds của những ngôi nhà có khu giải trí cao hơn 2,229 lần so với những ngôi nhà không có khu giải trí

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

Cặp giả thuyết/ đối thuyết

\(H_0\): Mô hình không phù hợp

\(H_1\): Mô hình phù hợp

lr_test <- anova(logit, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 0.004920511

Kết quả cho thấy P-value < 0,05 ta bác bỏ giả thuyết \(H_0\) nên mô hình Logit là phù hợp với dữ liệu.

6.6.2 Mô hình hồi quy cloglog

Dạng tổng quát:

\[cloglog(π)=log(−log(1−π))=β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]

cloglog <- glm( price ~ prefer + bedrooms + recreation  , family= binomial( link = 'cloglog'), data=Pmahoa)
summary(cloglog)
## 
## Call:
## glm(formula = price ~ prefer + bedrooms + recreation, family = binomial(link = "cloglog"), 
##     data = Pmahoa)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.6871  -0.5274  -0.3852  -0.2564   2.6198  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -5.0437     0.5761  -8.755  < 2e-16 ***
## preferyes       0.6283     0.2693   2.333   0.0196 *  
## bedrooms        0.8142     0.1592   5.113 3.17e-07 ***
## recreationyes   0.6975     0.2774   2.515   0.0119 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 390.28  on 544  degrees of freedom
## Residual deviance: 349.08  on 541  degrees of freedom
## AIC: 357.08
## 
## Number of Fisher Scoring iterations: 6

Vậy nên mô hình cloglog được xác định như sau:

\(cloglog(\pi) = -5.0437 + 0.6283prefer + 0.8142bedrooms + 0.6975recreation\)

Giải thích kết quả

  • Hệ số β1 = 0,6283 cho thấy rằng nếu ngôi nhà được nằm trong vị trí trung tâm thành phố thì giá bán ngôi nhà sẽ cao hơn những ngôi nhà ở vị trí cách xa thành phố.

  • Hệ số β2 = 0.8142 cho thấy rằng khi những ngôi nhà có nhiều phòng ngủ thì mức giá bán ngôi nhà sẽ cao hơn những ngôi nhà có số lượng ít phòng ngủ có mức giá bán thấp. Điều này có nghĩa là những ngôi nhà có nhiều phòng ngủ thì có giá bán cao.

  • Hệ số β3 = 0.6975 cho thấy rằng những ngôi nhà có phòng giải trí thì giá bán ngôi nhà sẽ có mức giá bán cao hơn những ngôi nhà không có phòng giải trí sẽ có mức giá bán thấp

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

Cặp giả thuyết/ đối thuyết

\(H_0\): Mô hình không phù hợp

\(H_1\): Mô hình phù hợp

lr_test <- anova(cloglog, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 0.004920511

Kết quả cho thấy P-value < 0,05 ta bác bỏ giả thuyết \(H_0\) nên mô hình Clogdog là phù hợp với dữ liệu.

6.6.3 Mô hình hồi quy probit

Dạng tổng quát:

\[probit(π)=Φ(1−π))=β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]

probit <- glm( price ~ prefer + bedrooms + recreation , family= binomial( link = 'probit'), data=Pmahoa)
summary(probit)
## 
## Call:
## glm(formula = price ~ prefer + bedrooms + recreation, family = binomial(link = "probit"), 
##     data = Pmahoa)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.4756  -0.5343  -0.3766  -0.2066   2.7778  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -3.1194     0.3525  -8.848  < 2e-16 ***
## preferyes       0.3752     0.1636   2.293   0.0218 *  
## bedrooms        0.5440     0.1036   5.252 1.51e-07 ***
## recreationyes   0.4456     0.1739   2.563   0.0104 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 390.28  on 544  degrees of freedom
## Residual deviance: 345.94  on 541  degrees of freedom
## AIC: 353.94
## 
## Number of Fisher Scoring iterations: 6

Vậy nên mô hình probit được xác định như sau:

\(probit(\pi) = -3.1194 + 0.3752prefer + 0.5440bedrooms + 0.4456recreation\)

Hệ số β0 = -3.1194 cho biết rằng, chênh lêch tỷ lệ những ngôi nhà có giá bán cao so với những ngôi nhà có giá thấp là Φ(-3,1194)

Hệ số β1 = 0.3752 có ý nghĩa là trong trường hợp các yếu tố khác không đổi thì chênh lệch tỷ lệ những ngôi nhà được nằm ở vị trí trung tâm với những ngôi nhà ở vị trí cách xa trung tâm thành phố thì xác suất những ngôi nhà được nằm ở trung tâm có mức giá bán cao cao hơn những ngôi nhà ở cách xa thành phố có mức giá bán thấp

Hệ số β2 = 0.5440 có ý nghĩa là trong trường hợp các yếu tố khác không đổi thì chênh lệch tỷ lệ những ngôi nhà có số lượng phòng ngủ nhiều với những ngôi nhà có số lượng phòng ngủ ít thì xác suất những ngôi nhà có nhiều phòng ngủ có mức giá bán cao cao hơn những ngôi nhà có ít phòng ngủ có mức giá bán thấp

Hệ số β3 = 0.4456 có ý nghĩa là trong trường hợp các yếu tố khác không đổi thì chênh lệch tỷ lệ những ngôi nhà có phòng giải trí với những ngôi nhà không có phòng giải trí thì xác suất những ngôi nhà có phòng giải trí có mức giá bán cao cao hơn những ngôi nhà không có phòng giải trí có mức giá bán thấp

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

Cặp giả thuyết/ đối thuyết

\(H_0\): Mô hình không phù hợp

\(H_1\): Mô hình phù hợp

lr_test <- anova(probit, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 0.004920511

Kết quả cho thấy P-value < 0,05 ta bác bỏ giả thuyết \(H_0\) nên mô hình Probit là phù hợp với dữ liệu.

6.6.4 Ma trận nhầm lẫn

Ma trận nhầm lẫn của mô hình Logit

predictlogit <- predict.glm(logit, type="response")

predictedlogit <- ifelse(predictlogit >  0.5, "1", "0")

# Tạo confusion matrix để đánh giá hiệu suất
confusionMatrix(table(Predicted = factor(predictedlogit, levels = c("1","0")), Actual = factor(Pmahoa$price, levels = c("1","0"))))
## Confusion Matrix and Statistics
## 
##          Actual
## Predicted   1   0
##         1   1   3
##         0  62 479
##                                           
##                Accuracy : 0.8807          
##                  95% CI : (0.8505, 0.9067)
##     No Information Rate : 0.8844          
##     P-Value [Acc > NIR] : 0.6369          
##                                           
##                   Kappa : 0.0163          
##                                           
##  Mcnemar's Test P-Value : 6.291e-13       
##                                           
##             Sensitivity : 0.015873        
##             Specificity : 0.993776        
##          Pos Pred Value : 0.250000        
##          Neg Pred Value : 0.885397        
##              Prevalence : 0.115596        
##          Detection Rate : 0.001835        
##    Detection Prevalence : 0.007339        
##       Balanced Accuracy : 0.504824        
##                                           
##        'Positive' Class : 1               
## 

Ma trận nhầm lẫn của mô hình Probit

predictprobit <- predict.glm(probit, type="response")

predictedprobit <- ifelse(predictprobit >  0.5, "1", "0")

# Tạo confusion matrix để đánh giá hiệu suất
confusionMatrix(table(Predicted = factor(predictedprobit, levels = c("1","0")), Actual = factor(Pmahoa$price, levels = c("1","0"))))
## Confusion Matrix and Statistics
## 
##          Actual
## Predicted   1   0
##         1   1   3
##         0  62 479
##                                           
##                Accuracy : 0.8807          
##                  95% CI : (0.8505, 0.9067)
##     No Information Rate : 0.8844          
##     P-Value [Acc > NIR] : 0.6369          
##                                           
##                   Kappa : 0.0163          
##                                           
##  Mcnemar's Test P-Value : 6.291e-13       
##                                           
##             Sensitivity : 0.015873        
##             Specificity : 0.993776        
##          Pos Pred Value : 0.250000        
##          Neg Pred Value : 0.885397        
##              Prevalence : 0.115596        
##          Detection Rate : 0.001835        
##    Detection Prevalence : 0.007339        
##       Balanced Accuracy : 0.504824        
##                                           
##        'Positive' Class : 1               
## 

Ma trận nhầm lẫn của mô hình Clogdog

predictcloglog <- predict.glm(cloglog, type="response")

predictedcloglog <- ifelse(predictcloglog >  0.5, "1", "0")

# Tạo confusion matrix để đánh giá hiệu suất
confusionMatrix(table(Predicted = factor(predictedcloglog, levels = c("1","0")), Actual = factor(Pmahoa$price, levels = c("1","0"))))
## Confusion Matrix and Statistics
## 
##          Actual
## Predicted   1   0
##         1   1   3
##         0  62 479
##                                           
##                Accuracy : 0.8807          
##                  95% CI : (0.8505, 0.9067)
##     No Information Rate : 0.8844          
##     P-Value [Acc > NIR] : 0.6369          
##                                           
##                   Kappa : 0.0163          
##                                           
##  Mcnemar's Test P-Value : 6.291e-13       
##                                           
##             Sensitivity : 0.015873        
##             Specificity : 0.993776        
##          Pos Pred Value : 0.250000        
##          Neg Pred Value : 0.885397        
##              Prevalence : 0.115596        
##          Detection Rate : 0.001835        
##    Detection Prevalence : 0.007339        
##       Balanced Accuracy : 0.504824        
##                                           
##        'Positive' Class : 1               
## 

Qua kết quả ma trận nhầm lẫn của ba mô hình logit, probit và clogdog, tôi nhận thấy kết quả của ba mô hình tương đồng với nhau. Cả ba ma trận nhầm lẫn điều chỉ ra có 479 số lần mô hình dự đoán đúng là giá bán nhà. Mặt khác, có 62 lần mô hình dự đoán sai đối với mức giá bán nhà từ 100000 trở lên và khoảng 3 lần mô hình dự đoán sai giá bán dưới 100000. Số lần mô hình dự đoán đúng ở mức lương trung là 1 lần. Kết quả cũng chỉ ra tỷ lệ mô hình dự đoán đúng là 88,07%.

6.6.5 Các chỉ tiêu đánh giá mô hình

  • AIC - Akaike Information Criterion:
AIC(logit)
## [1] 355.4897
AIC(probit)
## [1] 353.9445
AIC(cloglog)
## [1] 357.0829

Từ chỉ số AIC của 3 mô hình trên ta thấy mô hình probit có chỉ số AIC thấp nhất (353.9445). Vì thế đối với tiêu chí đánh giá AIC thì mô hình probit là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc Price hơn mô hình logit và cloglog.

  • Deviance
deviance(logit)
## [1] 347.4897
deviance(probit)
## [1] 345.9445
deviance(cloglog)
## [1] 349.0829

Từ chỉ số deviance của 3 mô hình trên ta thấy mô hình probit có chỉ số deviance thấp nhất (345.9445). Vì thế đối với tiêu chí đánh giá devience thì mô hình probit là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc Price hơn mô hình logit và cloglog.

  • Brier Score
BrierScore(logit)
## [1] 0.09452986
BrierScore(probit)
## [1] 0.09432254
BrierScore(cloglog)
## [1] 0.09479722

Từ chỉ số BrierScore của 3 mô hình trên ta thấy mô hình probit có chỉ số BrierScore thấp nhất (0.09432254). Vì thế đối với tiêu chí đánh giá BrierScore thì mô hình probit là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc Price hơn mô hình Logit và Cloglog.

Thông qua các tiêu chí đánh giá mô hình AIC, Deviance và BrierScore thì mô hình phù hợp nhất để xem xét tác động của các yếu tố Prefer, Bedrooms, Recreation tới biến phụ thuộc Price là mô hình hồi quy Probit

6.6.6 Kết quả mô hình sau khi lựa chọn

summary(probit)
## 
## Call:
## glm(formula = price ~ prefer + bedrooms + recreation, family = binomial(link = "probit"), 
##     data = Pmahoa)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.4756  -0.5343  -0.3766  -0.2066   2.7778  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -3.1194     0.3525  -8.848  < 2e-16 ***
## preferyes       0.3752     0.1636   2.293   0.0218 *  
## bedrooms        0.5440     0.1036   5.252 1.51e-07 ***
## recreationyes   0.4456     0.1739   2.563   0.0104 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 390.28  on 544  degrees of freedom
## Residual deviance: 345.94  on 541  degrees of freedom
## AIC: 353.94
## 
## Number of Fisher Scoring iterations: 6

Giải thích kết quả của mô hình Probit

  • Những ngôi nhà được nằm ở vị trí trung tâm thành phố có tác động đến mức giá bán của ngôi nhà với hệ số β = 0.3752. Với mức ý nghĩa 5%, những ngôi nhà được nằm ở vị trí trung tâm thành phố có tác động cùng chiều đến mức giá bán của ngôi nhà.

  • Số lượng phòng ngủ của ngôi nhà có tác động đến mức giá bán của ngôi nhà với hệ số β = 0.5440. Với mức ý nghĩa 5%, số lượng phòng ngủ của ngôi nhà có tác động cùng chiều đến mức giá bán của ngôi nhà.

  • Những ngôi nhà có phòng giải trí có tác động đến mức giá bán của ngôi nhà với hệ số β = 0.4456. Với mức ý nghĩa 5%, những ngôi nhà có phòng giải trí có tác động cùng chiều đến mức giá bán của ngôi nhà.

7 KẾT LUẬN

Nghiên cứu đã xác định các yếu tố ảnh hưởng đến giá nhà tại Windor, Canada trong năm 1987 thông qua phân tích số liệu bằng phương pháp thống kê toán học, sử dụng phần mềm Rstudio, phân tích dữ liệu định tính. Các kết quả chính cho thấy các biến đều có tác động tích cực đến giá nhà. Ngoài ra, vị trí của nhà cũng là một yếu tố quan trọng đối với các nhà nằm trong khu vực ưu tiên có giá cao hơn. Tuy nhiên, nghiên cứu còn một số hạn chế như dữ liệu chỉ dựa trên năm 1987 tại Windsor, Canada và phương pháp hồi quy tuyến tính.

Với mục tiêu phân tích các yếu tố ảnh hưởng đến giá của ngôi nhà, nghiên cứu sử dụng dữ liệu quá khứ được trích xuất từ . Sau khi thưc hiện hồi quy và lựa chọn mô hình phù hợp nhất trong 3 mô hình. Kết quả cho thấy mô hình phù hợp nhất là mô hình hồi quy hàm probit.

Kết quả phân tích cho thấy mức giá bán nhà chịu nhiều sự tác động của các yếu tố gồm: Số lượng phòng ngủ, Vị trí của ngôi nhà và Tiện nghi của ngôi nhà đó.

Qua kết quả hồi quy ta càng thấy rõ được tầm quan trọng của các yếu tố ảnh hưởng đến quyết định mua nhà đối với các nhà đầu tư, điều này giúp cho thị trường bất động sản có các định hướng cụ thể trong tương lai.

8 KIẾN NGHỊ

Các nhà đầu tư nên tập trung vào các khu vực ưu tiên và các nhà có diện tích lớn, nhiều phòng ngủ, phòng tắm và các tiện nghi cần thiết để tối ưu hóa lợi nhuận đầu tư. Người mua nhà nên xem xét kỹ lưỡng các tiện nghi và vị trí của nhà để đảm bảo chất lượng sống tốt hơn và giá trị bất động sản trong tương lai. Đối với nhà hoạch định chính sách, chính phủ nên đầu tư vào cơ sở hạ tầng và tiện ích công cộng, cũng như hỗ trợ phát triển các ngôi nhà trong các khu vực ưu tiên để ổn định và tăng giá trị thị trường bất động sản. Những kết quả và kiến nghị chính sách trong việc đưa ra các quyết định sáng suốt, mà còn đóng góp vào việc ổn định và phát triển thị trường bất động sản, đảm bảo chất lượng cuộc sống cho cộng đồng.

9 TÀI LIỆU THAM KHẢO

  1. Trần Kim Thanh, Trần Mạnh Tường, Vũ Anh Linh Duy: “Giáo trình Phân tích dữ liệu định tính”, trường Đại học Tài chính - Marketing, Thành phố Hồ Chí Minh.
LS0tDQp0aXRsZTogIlRJ4buCVSBMVeG6rE4gUEjDgk4gVMONQ0ggROG7riBMSeG7hlUgxJDhu4pOSCBUw41OSCINCmF1dGhvcjogIk5ndXnhu4VuIE1pbmggS2hhbmciDQpkYXRlOiAiMjAyNC0wNi0xNCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogdW5pdGVkDQoNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgYm9keSB7DQogICAgZm9udC1zaXplOiAyMnB4O30NCjwvc3R5bGU+DQpgYGANCmBgYHtjc3MsZWNobyA9IEZBTFNFfQ0KaDEgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgZm9udC1zaXplOiAzMnB4Ow0KICBmb250LXdlaWdodDogYm9sZA0KICB9DQoNCmgyIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMjhweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogDQp9DQoNCmgzIHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc3R5bGU6IGl0YWxpYzsNCn0NCg0KaDQge2ZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDIwcHg7DQogIGZvbnQtc3R5bGU6IGl0YWxpY30NCg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBmb250LXNpemU6IDE4cHg7DQogIA0KfQ0KcDpub3QoaDEpOm5vdChoMik6bm90KGgzKTpub3QoaDQpOm5vdChoNSkgew0KICB0ZXh0LWluZGVudDogMmVtO30NCnAgew0KICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICB9DQoudG9jaWZ5LWhlYWRlciB7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KDQpgYGANCg0KYGBge3IsbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KCJEVCIpDQpsaWJyYXJ5KCJnZ3Bsb3QyIikNCmxpYnJhcnkoInNjYWxlcyIpDQpsaWJyYXJ5KCJydmVzdCIpDQpsaWJyYXJ5KCJuZXRzdGF0IikNCmxpYnJhcnkoInN0cmluZ3IiKQ0KbGlicmFyeSgiZXBpdG9vbHMiKQ0KbGlicmFyeSgiY2FyZXQiKQ0KbGlicmFyeSgiRGVzY1Rvb2xzIikNCmBgYA0KDQoqKsSQ4buAIFTDgEk6IFBIw4JOIFTDjUNIIEPDgUMgWeG6vlUgVOG7kCDhuqJOSCBIxq/hu55ORyDEkOG6vk4gR0nDgSBCw4FOIEPhu6ZBIE5Hw5RJIE5Iw4AqKg0KDQpUw6puIHRow6BuaCB2acOqbjogTmd1eeG7hW4gTWluaCBLaGFuZyAtIDIxMjEwMTE3NTcNCg0KIyBM4bucSSBD4bqiTSDGoE4NCg0KTOG7nWkgbsOzaSDEkeG6p3UgdGnDqm4gdMO0aSB4aW4gZ+G7rWkgbOG7nWkgY+G6o20gxqFuIMSR4bq/biBUcsaw4budbmcgxJDhuqFpIGjhu41jIFTDoGkgY2jDrW5oIC0gTWFya2V0aW5nLCDEkeG6t2MgYmnhu4d0IGzDoCBjw6FjIHRo4bqneSBjw7Qga2hvYSBLaW5oIHThur8gLSBMdeG6rXQgxJHDoyDEkcawYSBo4buNYyBwaOG6p24gUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCB2w6BvIGNoxrDGoW5nIHRyw6xuaCDEkcOgbyB04bqhbyDEkeG7gyB0w7RpIGPDsyBraeG6v24gdGjhu6ljIG3hu5tpIMSR4buDIGNodeG6qW4gYuG7iyBow6BuaCB0cmFuZyBzYXUgbsOgeS4gQsOqbiBj4bqhbmggxJHDsywgdMO0aSB4aW4gZ+G7rWkgbOG7nWkgY+G6o20gxqFuIGNow6JuIHRow6BuaCB2w6Agc8OidSBz4bqvYyBuaOG6pXQga2hpIMSRxrDhu6NjIGdp4bqjbmcgdmnDqm4gaMaw4bubbmcgZOG6q24gbMOgIHRo4bqneSBUaFMuVHLhuqduIE3huqFuaCBUxrDhu51uZyDEkcOjIGNo4buJIGThuqtuIGjhu5cgdHLhu6MgxJHhu4MgdMO0aSBjw7MgdGjhu4MgaG/DoG4gdGjDoG5oIGLDoGkga+G6v3QgdGjDumMgaOG7jWMgcGjhuqduIMSRxrDhu6NjIGNo4buJbmggY2h1IG5o4bqldC5UaOG6p3kgxJHDoyBnacO6cCB0w7RpIHTDrWNoIGzFqXkgxJHGsOG7o2MgdGjDqm0gbmhp4buBdSBraeG6v24gdGjhu6ljIGxpw6puIHF1YW4gxJHhur9uIG3DtG4gaOG7jWMuIFR1eSBuaGnDqm4sIHRyb25nIHF1w6EgdHLDrG5oIGjhu41jIHThuq1wIGPFqW5nIG5oxrAgbMOgIHRyb25nIHF1w6EgdHLDrG5oIGzDoG0gYsOgaSB0aeG7g3UgbHXhuq1uIGtow7MgdHLDoW5oIGto4buPaSBuaOG7r25nIHRoaeG6v3Ugc8OzdCBy4bqldCBtb25nIHRo4bqneSBi4buPIHF1YS4gVMO0aSBy4bqldCBtb25nIG5o4bqtbiDEkcaw4bujYyBuaOG7r25nIMO9IGtp4bq/biDEkcOzbmcgZ8OzcCBj4bunYSB0aOG6p3kgxJHhu4MgYuG6o24gdGjDom4gY8OzIHRo4buDIGjhu41jIGjhu49pIHRow6ptIG5oaeG7gXUga2luaCBuZ2hp4buHbSB2w6AgaG/DoG4gdGjDoG5oIHThu5F0IGjGoW4gdHJvbmcgbmjhu69uZyBiw6BpIGPDoW8gc+G6r3AgdOG7m2kNCg0KVMO0aSB4aW4gY2jDom4gdGjDoG5oIGPhuqNtIMahbiENCg0KIyBQSOG6pk4gTeG7niDEkOG6plUNCg0KIyMgxJDhurd0IHbhuqVuIMSR4buBDQoNClRyb25nIHRo4buLIHRyxrDhu51uZyBi4bqldCDEkeG7mW5nIHPhuqNuLCB2aeG7h2MgaGnhu4N1IHLDtSDEkcaw4bujYyBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgY+G7p2EgdOG7q25nIG5nw7RpIG5ow6AgbMOgIHnhur91IHThu5EgcXVhbiB0cuG7jW5nIMSR4buRaSB24bubaSBjw6FjIG5ow6AgaG/huqFjaCDEkeG7i25oIGNow61uaCBzw6FjaCwgbmjDoCDEkeG6p3UgdMawIHbDoCBj4bqjIG5nxrDhu51pIG11YSBuaMOgLiBHacOhIG5ow6Aga2jDtG5nIGNo4buJIHBo4bqjbiDDoW5oIGdpw6EgdHLhu4sgY+G7p2EgYuG6pXQgxJHhu5luZyBz4bqjbiBtw6AgY8OybiBjaOG7i3UgdMOhYyDEkeG7mW5nIGLhu59pIG5oaeG7gXUgeeG6v3UgdOG7kSBuaMawIGRp4buHbiB0w61jaCwgduG7iyB0csOtLCBjw6FjIHRp4buHbiBuZ2hpIHbDoCBtw7RpIHRyxrDhu51uZyB4dW5nIHF1YW5oIGPhu6dhIG5nw7RpIG5ow6AgxJHDsy4gTmdoacOqbiBj4bupdSBnacOhIG5ow6AgdOG6oWkgbeG7mXQgdGjhu51pIMSRaeG7g20gY+G7pSB0aOG7gyBnacO6cCBoaeG7g3UgcsO1IGjGoW4gduG7gSB4dSBoxrDhu5tuZyB0aOG7iyB0csaw4budbmcuIFRyb25nIGLhu5FpIGPhuqNuaCDEkcO0IHRo4buLIGjDs2EgbmhhbmggY2jDs25nLCBkw6JuIHPhu5EgdMSDbmcgY2FvIHbDoCBuaHUgY+G6p3UgbmjDoCDhu58gbmfDoHkgY8OgbmcgbOG7m24sIHZp4buHYyB4w6FjIMSR4buLbmggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBnacOhIGLDoW4gbmjDoCB0cuG7nyBuw6puIHbDtCBjw7luZyBxdWFuIHRy4buNbmcuDQoNClRyb25nIG5o4buvbmcgbsSDbmcgZ+G6p24gxJHDonksIHRo4buLIHRyxrDhu51uZyBi4bqldCDEkeG7mW5nIHPhuqNuIGNo4bupbmcga2nhur9uIG5oaeG7gXUgYmnhur9uIMSR4buZbmcgduG7gSBnacOhIGPhuqMsIGfDonkga2jDsyBraMSDbiBjaG8gY+G6oyBuZ8aw4budaSBtdWEgdsOgIG5nxrDhu51pIGLDoW4uIMSQ4buRaSB24bubaSBuZ8aw4budaSBtdWEsIHZp4buHYyDEkcOhbmggZ2nDoSDEkcO6bmcgZ2nDoSBj4bqjIGPhu6dhIG3hu5l0IG5nw7RpIG5ow6AgZ2nDunAgaOG7jSDEkcawYSByYSBxdXnhur90IMSR4buLbmggaOG7o3AgbMO9LCB0csOhbmggYuG7iyB0aGnhu4d0IHRow7JpIGtoaSBtdWEgbmjDoCB24bubaSBnacOhIHF1w6EgY2FvIHNvIHbhu5tpIGdpw6EgYsOhbiB0aOG7sWMuIMSQ4buRaSB24bubaSBuZ8aw4budaSBiw6FuLCB2aeG7h2MgxJHhu4tuaCBnacOhIGNow61uaCB4w6FjIGdpw7pwIGjhu40ga2jDtG5nIGLhu48gbOG7oSBjxqEgaOG7mWkgYsOhbiBuaMOgIHbhu5tpIGdpw6EgdOG7kXQgaG/hurdjIGtow7RuZyBi4buLIMOpcCBnacOhLiBDw6FjIG5ow6AgxJHhuqd1IHTGsCBi4bqldCDEkeG7mW5nIHPhuqNuIGPhuqduIGPDsyBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbhu4EgdGjhu4sgdHLGsOG7nW5nIHbDoCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhu4MgxJHGsGEgcmEgY8OhYyBjaGnhur9uIGzGsOG7o2MgxJHhuqd1IHTGsCBoaeG7h3UgcXXhuqMuIENow61uaCBwaOG7pyB2w6AgY8OhYyBuaMOgIGhv4bqhY2ggxJHhu4tuaCBjaMOtbmggc8OhY2ggY8WpbmcgY+G6p24gaGnhu4N1IHLDtSDEkeG7mW5nIGzhu7FjIGPhu6dhIHRo4buLIHRyxrDhu51uZyBi4bqldCDEkeG7mW5nIHPhuqNuIMSR4buDIHBow6F0IHRyaeG7g24gY8OhYyBjaMOtbmggc8OhY2ggcGjDuSBo4bujcCwgxJFp4buBdSB0aeG6v3QgdGjhu4sgdHLGsOG7nW5nIHbDoCBo4buXIHRy4bujIG5nxrDhu51pIGTDom4gdHJvbmcgdmnhu4djIHRp4bq/cCBj4bqtbiBuaMOgIOG7ny4gVmnhu4djIGhp4buDdSByw7UgdsOgIGThu7EgxJFvw6FuIMSRxrDhu6NjIGPDoWMgYmnhur9uIMSR4buZbmcgZ2nDoSBj4bqjIHRyb25nIHRo4buLIHRyxrDhu51uZyBuw6B5IGtow7RuZyBjaOG7iSBnacO6cCBjaG8gY8OhYyBiw6puIHRoYW0gZ2lhIHRo4buLIHRyxrDhu51uZyDEkcawYSByYSBjw6FjIHF1eeG6v3QgxJHhu4tuaCBzw6FuZyBzdeG7kXQgbcOgIGPDsm4gaOG7lyB0cuG7oyBjaG8gY8OhYyBuaMOgIGhv4bqhY2ggxJHhu4tuaCBjaMOtbmggc8OhY2ggdHJvbmcgdmnhu4djIOG7lW4gxJHhu4tuaCB2w6AgcGjDoXQgdHJp4buDbiBu4buBbiBraW5oIHThur8uIMSQ4bq3YyBiaeG7h3QsIGdpw6EgYsOhbiBj4bunYSBuZ8O0aSBuaMOgIGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIHnhur91IHThu5EgY2jDrW5oIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggbXVhIGLDoW4gdsOgIMSR4bqndSB0xrAgdHJvbmcgbMSpbmggduG7sWMgYuG6pXQgxJHhu5luZyBz4bqjbi4NCg0KIyMgTeG7pWMgdGnDqnUgbmdoacOqbiBj4bupdQ0KDQpN4bulYyB0acOqdSBj4bunYSBuZ2hpw6puIGPhu6l1IG7DoHkgbMOgIHBow6JuIHTDrWNoIHbDoCB4w6FjIMSR4buLbmggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBnacOhIGLDoW4gbmjDoCB04bqhaSBXaW5kc29yLCBDYW5hZGEsIHRyb25nIGdpYWkgxJFv4bqhbiB04burIHRow6FuZyA3IMSR4bq/biB0aMOhbmcgOSBuxINtIDE5ODcsIHPhu60gZOG7pW5nIGThu68gbGnhu4d1IHThu6sgYuG7mSBk4buvIGxp4buHdSAiSG91c2VQcmljZXMiIGPhu6dhIGfDs2kgQUVSLg0KDQojIyDEkOG7kWkgdMaw4bujbmcgdsOgIHBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1DQoNCsSQ4buRaSB0xrDhu6NuZyBuZ2hpw6puIGPhu6l1OiBDw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgYsOhbiBj4bunYSBjw6FjIG5nw7RpIG5ow6AuDQoNClBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1OiA1NDYgbmfDtGkgbmjDoCDhu58gdGjDoG5oIHBo4buRIFdpbmRzb3IsIENhbmFkYSB0cm9uZyB0aMOhbmcgNyw4LDkgbsSDbSAxOTg3Lg0KDQojIyBQaMawxqFuZyBwaMOhcCBuZ2hpw6puIGPhu6l1DQoNClBoxrDGoW5nIHBow6FwIHjhu60gbMO9IHPhu5EgbGnhu4d1IGLhurFuZyB0aOG7kW5nIGvDqiB0b8OhbiBo4buNYzogxJDhu4MgbuG6r20gduG7r25nIHRow7RuZyB0aW4gdsOgIHPhu5EgbGnhu4d1IGxpw6puIHF1YW4gxJHhur9uIHRo4buLIHRyxrDhu51uZyBi4bqldCDEkeG7mW5nIHPhuqNuLCB0w6FjIGdp4bqjIHPhur0gdGnhur9uIGjDoG5oIG3hu5l0IHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoIHPhu5EgbGnhu4d1IGLhurFuZyBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiB0b8OhbiBo4buNYy4gQ8OhYyB0aMO0bmcgc+G7kSBsacOqbiBxdWFuIMSR4bq/biB04bqnbiBzdeG6pXQsIHBow6JuIGLhu5EsIMSR4buZIHTGsMahbmcgcXVhbiB2w6AgxJHhu5kgdMawxqFuZyB0w6FjIGdp4buvYSBjw6FjIGJp4bq/biBz4bq9IMSRxrDhu6NjIHTDrW5oIHRvw6FuLiBQaOG6p24gbeG7gW0gUiAtIG3hu5l0IGPDtG5nIGPhu6UgbeG6oW5oIG3hur0gdsOgIHBo4buVIGJp4bq/biB0cm9uZyBsxKluaCB24buxYyB0aOG7kW5nIGvDqiB2w6AgeOG7rSBsw70gZOG7ryBsaeG7h3UgLSBz4bq9IGjhu5cgdHLhu6MgcXXDoSB0csOsbmggbsOgeS4gVmnhu4djIHPhu60gZOG7pW5nIHBo4bqnbiBt4buBbSBSIHPhur0gxJHhuqNtIGLhuqNvIHTDrW5oIGNow61uaCB4w6FjIHbDoCDEkcOhbmcgdGluIGPhuq15IHRyb25nIHZp4buHYyBwaMOibiB0w61jaCBz4buRIGxp4buHdS4NCg0KIyMgS+G6v3QgY+G6pXUgxJHhu4EgdMOgaQ0KDQpQSOG6pk4gTeG7niDEkOG6plUNCg0KQ2jGsMahbmcgMSBU4buVbmcgcXVhbiBsw70gdGh1eeG6v3QNCg0KQ2jGsMahbmcgMiBQaMawxqFuZyBwaMOhcCBuZ2hpw6puIGPhu6l1DQoNCkNoxrDGoW5nIDMgVGjhu5FuZyBrw6ogbeG7lSB04bqjIGPDoWMgYmnhur9uDQoNCkNoxrDGoW5nIDQgUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdsOgIGvhur90IHF14bqjIG5naGnDqm4gY+G7qXUNCg0KIyBDSMavxqBORyAxOiBU4buUTkcgUVVBTiBMw50gVEhVWeG6vlQNCg0KIyMgS2jDoWkgbmnhu4dtIHbhu4EgdGjhu4sgdHLGsOG7nW5nIGLhuqV0IMSR4buZbmcgc+G6o24NCg0KVGjhu4sgdHLGsOG7nW5nIGLhuqV0IMSR4buZbmcgc+G6o24gbMOgIGzEqW5oIHbhu7FjIHLhu5luZyBs4bubbiBsacOqbiBxdWFuIMSR4bq/biBuaGnhu4F1IG5nw6BuaCwgbmhp4buBdSBsxKluaCB24buxYyBuaMawIMSR4bqldCDEkWFpLCB4w6J5IGThu7FuZywga2nhur9uIHRyw7pjLCBtw7RpIHRyxrDhu51uZywgdGh14bq/LCBnaWFvIGThu4tjaCDEkeG6o20gYuG6o28sLi4uIELDqm4gY+G6oW5oIMSRw7MsIGLhuqV0IMSR4buZbmcgc+G6o24gbMOgIG3hu5l0IGxv4bqhaSBow6BuZyBow7NhIGPDsyB0w61uaCDEkeG6t2MgdGjDuSBraW5oIGRvYW5oIGxv4bqhaSBow6xuaCBuw6B5IHPhur0gdMOhYyDEkeG7mW5nIMSR4bq/biBow6BuaCB2aSBraW5oIGRvYW5oLCDEkeG6p3UgdMawLCB0w6FpIMSR4bqndSB0xrAsIHTDoGkgY2jDrW5oLCB0aeG7gW4gdOG7hywgxJHhuqd1IGPGoSwgcXXhu7kgZOG7sSB0cuG7rywgZOG7sSBwaMOybmcsLi4uIELhuqV0IMSR4buZbmcgc+G6o24gY8OzIHF1YW4gaOG7hyBt4bqtdCB0aGnhur90IHThu5tpIHjDonkgZOG7sW5nLCBxdeG6o24gbMOtIG5ow6Agbsaw4bubYyB24buBIMSR4bqldCDEkWFpLCBxdXkgaG/huqFjaCB2w6Aga+G6vyBob+G6oWNoIHPhu60gZOG7pW5nIMSR4bqldC4gVGjhu4sgdHLGsOG7nW5nIGLhuqV0IMSR4buZbmcgc+G6o24gbMOgIG3hu5l0IHBo4bqnbiBxdWFuIHRy4buNbmcgY+G7p2EgbuG7gW4ga2luaCB04bq/LCBuxqFpIGRp4buFbiByYSBjw6FjIG3hu5FpIHF1YW4gaOG7hyBj4bunYSBjb24gbmfGsOG7nWkgduG7gSBnaWFvIGThu4tjaCBxdXnhu4FuIHPhu60gZOG7pW5nIMSR4bqldCwgdMOgaSBz4bqjbiB0csOqbiDEkeG6pXQgdOG6oWkgbeG7mXQga2h1IHbhu7FjIMSR4buLYSBsw60gbmjhuqV0IMSR4buLbmgsIHRyb25nIG3hu5l0IGtob+G6o25nIHRo4budaSBnaWFuIGPhu6UgdGjhu4MuDQoNCiMjIEtow6FpIG5p4buHbSB24buBIGdpw6EgbmjDoA0KDQpHacOhIG5ow6AgbMOgIG3hu5l0IHRyb25nIG5o4buvbmcgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcgbmjhuqV0IHRyb25nIHRo4buLIHRyxrDhu51uZyBi4bqldCDEkeG7mW5nIHPhuqNuLCDhuqNuaCBoxrDhu59uZyDEkeG6v24gY+G6oyBuZ8aw4budaSBtdWEgdsOgIG5nxrDhu51pIGLDoW4uIEdpw6EgbmjDoCDEkcaw4bujYyB4w6FjIMSR4buLbmggYuG7n2kgbmhp4buBdSB54bq/dSB04buRLCBiYW8gZ+G7k206DQoNCi0gICBW4buLIHRyw606IFbhu4sgdHLDrSBsw6AgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcgbmjhuqV0IOG6o25oIGjGsOG7n25nIMSR4bq/biBnacOhIG5ow6AuIE5ow6Ag4bufIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBob+G6t2MgZ+G6p24gY8OhYyB0aeG7h24gw61jaCBuaMawIHRyxrDhu51uZyBo4buNYywgYuG7h25oIHZp4buHbiB2w6AgdHJ1bmcgdMOibSB0aMawxqFuZyBt4bqhaSB0aMaw4budbmcgY8OzIGdpw6EgY2FvIGjGoW4uDQotICAgRGnhu4duIHTDrWNoOiBEaeG7h24gdMOtY2ggxJHhuqV0IHbDoCBkaeG7h24gdMOtY2ggc8OgbiBj4bunYSBuZ8O0aSBuaMOgIGPFqW5nIGzDoCB54bq/dSB04buRIHF1YW4gdHLhu41uZy4gTmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBkaeG7h24gdMOtY2ggbOG7m24gaMahbiB0aMaw4budbmcgY8OzIGdpw6EgY2FvIGjGoW4uDQotICAgVMOsbmggdHLhuqFuZyB2w6AgdHXhu5VpIGPhu6dhIG5nw7RpIG5ow6A6IE5ow6AgbeG7m2kgeMOieSBob+G6t2MgxJHGsOG7o2MgYuG6o28gdHLDrCB04buRdCB0aMaw4budbmcgY8OzIGdpw6EgdHLhu4sgY2FvIGjGoW4gc28gduG7m2kgbmjDoCBjxakgaG/hurdjIGPhuqduIHPhu61hIGNo4buvYS4NCi0gICBDw6FjIHRp4buHbiBuZ2hpOiBT4buxIGhp4buHbiBkaeG7h24gY+G7p2EgY8OhYyB0aeG7h24gbmdoaSBuaMawIGdhcmFnZSwgxJFp4buBdSBow7JhIGtow7RuZyBraMOtLCBo4buHIHRo4buRbmcgc8aw4bufaSwgYuG7gyBixqFpLCB2w6Agc8OibiB2xrDhu51uIGPDsyB0aOG7gyB0xINuZyBnacOhIHRy4buLIGPhu6dhIG5nw7RpIG5ow6AuDQotICAgWeG6v3UgdOG7kSBraW5oIHThur8gdsOgIHTDoGkgY2jDrW5oOiBUw6xuaCBow6xuaCBraW5oIHThur8sIGzDo2kgc3XhuqV0IHbDoCBjw6FjIGNow61uaCBzw6FjaCB0w6BpIGNow61uaCBj4bunYSBjaMOtbmggcGjhu6cgY8Wpbmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgbmjDoC4NCg0KIyBDSMavxqBORyAyOiBQSMavxqBORyBQSMOBUCBOR0hJw4pOIEPhu6hVDQoNCiMjIE3DtCBow6xuaCBuZ2hpw6puIGPhu6l1DQoNCiMjIyBNw7QgaMOsbmggbG9naXQNCg0KJGxvZ2l0KM+AKSA9IGxvZyAoz4AvMS3PgCkgPSDOsl8wKyDOsl8xWF8xKyDOsl8yWF8yKy4uLisgQl9rWF9rJA0KDQpW4bubaSDPgCBsw6AgeMOhYyBzdeG6pXQgxJHhu4MgYmnhur9uIHBo4bulIHRodeG7mWMgbmjhuq1uIGdpw6EgdHLhu4sgInRow6BuaCBjw7RuZyIuIMSQ4buRaSB24bubaSBow6BtIGdsbSBwaOG6oW0gdHLDuSB0aOG7qSBoYWkgY+G7p2EgYmnhur9uIG5o4buLIHBow6JuIHRo4buDIGhp4buHbiBjaG8gInRow6BuaCBjw7RuZyIgKGNow7puZyB0YSBz4butIGThu6VuZyBow6BtIGxldmVscygpIMSR4buDIGtp4buDbSB0cmEgdGjhu6kgdOG7sSBj4bunYSBjw6FjIHBo4bqhbSB0csO5IGPhu6dhIG3hu5l0IGJp4bq/biDEkeG7i25oIHTDrW5oLg0KDQojIyMgTcO0IGjDrG5oIHByb2JpdA0KDQpI4buTaSBxdXkgUHJvYml0IGhheSBjw7JuIMSRxrDhu6NjIGfhu41pIGzDoCBtw7QgaMOsbmggUHJvYml0LCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDGsOG7m2MgbMaw4bujbmcgbcO0IGjDrG5oIGPDsyBiaeG6v24gcGjhu6UgdGh14buZYyBk4bqhbmcgbmjhu4sgcGjDom4uIFRyb25nIGjhu5NpIHF1eSBQcm9iaXQsIHhlbSBow6BtIHjDoWMgc3XhuqV0ICRccGkoeCkkIGhv4bq3YyBcJCAxLVxwaSh4KVwkIGzDoCBow6BtIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCBj4bunYSBt4buZdCBiaeG6v24gbmfhuqt1IG5oacOqbiBYIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbiB04bupYyBsw6AgeMOhYyBzdeG6pXQgdGjDoG5oIGPDtG5nIGPDsyBk4bqhbmcNCg0KJCRccGkoeCk9XHBoaShcYWxwaGErXGJldGEoeCkpJCQNCg0KVHJvbmcgxJHDsyA6ICQkXHBoaSh4KT0oXGZyYWMxe1xzcXJ0MlxwaGl9XGludF9caW5mdHleeCBcbWF0aHJte2V9XnstMS8yfVwsdF4yJCQNCg0KS8OtIGhp4buHdToNCg0KJCRQcm9iaXQoXHBpKHgpKT1ccGhpXi0xKFxwaSh4KSkkJA0KDQpNw7QgaMOsbmggUHJvYml0IMSRxrDhu6NjIHZp4bq/dCBkxrDhu5tpIGThuqFuZw0KDQokJFByb2JpdChccGkoeCkpPVxhbHBoYSArIGJldGF4JCQNCg0KIyMjIEPDoWMgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBtw7QgaMOsbmgNCg0KxJDhu4MgxJHDoW5oIGdpw6EgY8OhYyBtw7QgaMOsbmggaOG7k2kgY+G7lSDEkWnhu4NuIGNow7puZyB0YSB0aMaw4budbmcgZOG7sWEgdsOgbyBo4buHIHPhu5EgeMOhYyDEkeG7i25oIG3DtCBow6xuaCAkKFJeMikkLCBuaMawbmcgxJHhu5FpIHbhu5tpIG3DtCBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgY2jDum5nIHRhIHPhu60gZOG7pW5nIGPDoWMgdGnDqnUgY2jDrSBzYXU6DQoNCioqQUlDIC0gQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbioqDQoNCkFJQyDEkcaw4bujYyDEkeG7gSB4deG6pXQgYuG7n2kgQWthaWtlIEhpcm90dWd1LCBt4buZdCBuaMOgIHRo4buRbmcga8OqIGjhu41jIG5nxrDhu51pIE5o4bqtdC4gQUlDIGzDoCBt4buZdCB0acOqdSBjaMOtIMSRxrDhu6NjIHPhu60gZOG7pW5nIG3hu5l0IGPDoWNoIHBo4buVIGJp4bq/biDEkeG7gyDEkcOhbmggZ2nDoSBt4buZdCBtw7QgaMOsbmggaOG7k2kgcXV5IMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyBi4bufaSBwaMawxqFuZyBwaMOhcCBNYXhpbXVtIExpa2VraWhvb2QgKE1MKS4gTeG7mXQgY8OhY2ggY2h1bmcgY2h1bmcgZ2nDoSB0cuG7iyBj4bunYSBBSUMgY8Ogbmcgbmjhu48gdGjDrCBtw7QgaMOsbmggY8OgbmcgdOG7kXQuIEFJQyDEkcaw4bujYyB0w61uaCBi4bqxbmcgY8O0bmcgdGjhu6ljIHNhdTogJEFJQz0gLTJsbihMKSsyayQgVuG7m2kgTCBsw6AgZ2nDoSB0cuG7iyBj4buxYyDEkeG6oWkgY+G7p2EgaMOgbSBo4bujcCBsw70gKGxpa2VsaWhvb2QgZnVuY3Rpb24pIHbDoCBrIGzDoCBz4buRIHRoYW0gc+G7kSBj4bunYSBtw7QgaMOsbmguDQoNCktoaSB0aOG7sWMgaGnhu4duIHZp4buHYyDGsOG7m2MgbMaw4bujbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSBi4bqxbmcgbOG7h25oIGdsbSB0aMOsIGNo4buJIHPhu5EgQUlDIMSRw6MgxJHGsOG7o2MgdMOtbmggdG/DoW4gdsOgIHRo4buDIGhp4buHbiB0csOqbiBi4bqjbmcga+G6v3QgcXXhuqMgKCBi4bqxbmcgbOG7h25oIHN1bW1hcnkpLg0KDQoqKkRldmlhbmNlKioNCg0KRGV2aWFuY2UgY8WpbmcgbMOgIG3hu5l0IHRpw6p1IGNow60gcuG6pXQgcGjhu5UgYmnhur9uIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSRw6FuaCBnacOhIG3hu5l0IG3DtCBow6xuaCBo4buTaSBxdXkgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGLhu59pIHBoxrDGoW5nIHBow6FwIEjhu6NwIGzDvSBj4buxYyDEkeG6oWkgKE1MKS4gTeG7mXQgY8OhY2ggdOG7lW5nIHF1w6EsIGPFqW5nIGdp4buRbmcgbmjGsCBjaOG7iSB0acOqdSBBSUMsIGdpw6EgdHLhu4sgY+G7p2EgRGV2aWFuY2UgY8Ogbmcgbmjhu48gdGjDrCBtw7QgaMOsbmggY8OgbmcgdOG7kXQuDQoNCkzGsHUgw706IEtoaSB0aOG7sWMgaGnhu4duIHZp4buHYyDGsOG7m2MgbMaw4bujbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSBi4bqxbmcgbOG7h25oIGdsbSB0aMOsIGNo4buJIHPhu5EgQUlDIHbDoCBEZXZpYW5jZSDEkcOjIMSRxrDhu6NjIHTDrW5oIHRvw6FuIHbDoCB0aOG7gyBoaeG7h24gdHLDqm4gYuG6o25nIGvhur90IHF14bqjICggYuG6sW5nIGzhu4duaCBzdW1tYXJ5KS4NCg0KKipCcmllciBTY29yZSoqIEzDoCBjaOG7iSB0acOqdSBkw7luZyDEkeG7gyDEkcOhbmggZ2nDoSBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljLCBCcmllciBTY29yZSDEkcaw4bujYyB0w61uaCBuaMawIHNhdTogJEI9IDEvbiBcc3VtX3tpPTF9XntufShwX2ktb19pKSQNCg0KVHJvbmcgxJHDszogcGksb2kgbOG6p24gbMaw4bujdCBsw6AgZ2nDoSB0cuG7iyB4w6FjIHN14bqldCBxdWFuIHPDoXQgxJHGsOG7o2MsIHbDoCBnacOhIHRy4buLIHjDoWMgc3XhuqV0IHTDrW5oIHJhIHThu6sgbcO0IGjDrG5oLg0KDQojIyBE4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1DQoNCiMjIyBHaeG7m2kgdGhp4buHdSBi4buZIGThu68gbGnhu4d1DQoNCkLhu5kgZOG7ryBsaeG7h3UgIkhvdXNlUHJpY2VzIiDEkcaw4bujYyBs4bqleSB04burIGfDs2kgQUVSLiBUcm9uZyBi4buZIGThu68gdHLDqm4gbGnDqm4gcXVhbiDEkeG6v24gZ2nDoSBiw6FuIGPhu6dhIDU0NiBjxINuIG5ow6Ag4bufIHRow6BuaCBwaOG7kSBXaW5kc29yLCBDYW5hZGEgdHJvbmcgdGjDoW5nIDcsOCw5IGPhu6dhIG7Eg20gMTk4Ny4gQuG7mSBk4buvIGxp4buHdSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgYsOhbiBj4bunYSBuZ8O0aSBuaMOgLCBjaG8gcGjDqXAgY8OhYyBuaMOgIHBow6JuIHTDrWNoIGhp4buDdSByw7UgaMahbiB24buBIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nDoSBiw6FuIGPhu6dhIG5nw7RpIG5ow6AgdsOgIHjDonkgZOG7sW5nIMSRxrDhu6NjIGPDoWMgbcO0IGjDrG5oIGThu7EgYsOhby4NCg0KIyMjIEdp4bqjaSB0aMOtY2ggY8OhYyBiaeG6v24NCg0KROG7ryBsaeG7h3UgdHLDqm4gYmFvIGfhu5NtIDEyIGJp4bq/bjogNiBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB2w6AgNiBiaeG6v24gxJHhu4tuaCB0w61uaC4NCg0KKio2IGJp4bq/biDEkeG7i25oIGzGsOG7o25nKioNCg0KLSAgIFByaWNlOiBHacOhIGLDoW4gY+G7p2EgbmfDtGkgbmjDoCAoVVNEKQ0KDQotICAgTG90c2l6ZTogRGnhu4duIHTDrWNoIGPEg24gbmjDoA0KDQotICAgQmVkcm9vbXM6IFPhu5EgbMaw4bujbmcgcGjDsm5nIG5n4bunDQoNCi0gICBCYXRocm9vbXM6IFPhu5EgbMaw4bujbmcgcGjDsm5nIHThuq9tDQoNCi0gICBTdG9yaWVzOiBT4buRIHThuqduZyBj4bunYSBuZ8O0aSBuaMOgIGtow7RuZyB0w61uaCB04bqnbmcgaOG6p20NCg0KLSAgIEdhcmFnZTogU+G7kSBnYXJhIHRyb25nIG5ow6ANCg0KKio2IGJp4bq/biDEkeG7i25oIHTDrW5oKioNCg0KLSAgIERyaXZld2F5OiBOZ8O0aSBuaMOgIGPDsyBraHUgduG7sWMgcmnDqm5nIMSR4buDIMSR4bqtdSB4ZSBraMO0bmcgKHllcy9ubyk/DQoNCi0gICBSZWNyZWF0aW9uOiBOaMOgIGPDsyBwaMOybmcgZ2nhuqNpIHRyw60ga2jDtG5nICh5ZXMvbm8pPw0KDQotICAgRnVsbGJhc2U6IE5ow6AgY8OzIMSRxrDhu6NjIHRyYW5nIGLhu4sgdOG6p25nIGjhuqdtIGhvw6BuIHRoaeG7h24gaGF5IGtow7RuZyAoeWVzL25vKT8gKCB04bqnbmcgaOG6p20gaG/DoG4gdGhp4buHbiBiYW8gZ+G7k20gY8OhYyBwaMOybmcgbmjGsCBwaMOybmcgdOG6rXAgdGjhu4MgZOG7pWMsIHRyw7IgY2jGoWkgxJFp4buHbiB04butLCAuLi4pDQoNCi0gICBHYXNoZWF0OiBOaMOgIGPDsyBz4butIGThu6VuZyBnYXMgxJHhu4MgxJF1biBuxrDhu5tjIG7Ds25nIGtow7RuZyAoeWVzL25vKT8NCg0KLSAgIEFpcmNvbjogTmjDoCBjw7MgbcOheSDEkWnhu4F1IGhvw6AgdHJ1bmcgdMOibSBraMO0bmcgKHllcy9ubyk/DQoNCi0gICBQcmVmZXI6IE5ow6AgY8OzIG7hurFtIHRyb25nIGtodSB0cnVuZyB0w6JtIGPhu6dhIHRow6BuaCBwaOG7kSBraMO0bmcgKHllcy9ubyk/DQoNCiMjIyBC4buZIGThu68gbGnhu4d1DQoNCmBgYHtyfQ0Kbm1rIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9WSVAvRG93bmxvYWRzL0hvdXNlUHJpY2VzLmNzdiIpDQpkYXRhdGFibGUobm1rKQ0KYGBgDQoNCiMjIyBC4buZIGThu68gbGnhu4d1IHNhdSBraGkgbcOjIGjDs2ENCg0KTcOjIGjDs2EgYmnhur9uIMSR4buLbmggbMaw4bujbmcgKioqUHJpY2UqKiogdGjDoG5oIGJp4bq/biDEkeG7i25oIHTDrW5oLiBO4bq/dSBnacOhIGLDoW4gbmjDoCBuaOG7jyBoxqFuIGhv4bq3YyBi4bqxbmcgMTAwMDAwIFVTRCB0YSBxdXkgxrDhu5tjIGzDoCAwLiBO4bq/dSBnacOhIGLDoW4gbmjDoCBs4bubbiBoxqFuIDEwMDAwMCBVU0QgdGEgcXV5IMaw4bubYyBsw6AgMS4NCg0KYGBge3J9DQpQbWFob2E8LXN1YnNldChubWssIHByaWNlIDwgMTkwMDAwKQ0KZGltKFBtYWhvYSkNCmBgYA0KDQpgYGB7cn0NClBtYWhvYSRwcmljZVtQbWFob2EkcHJpY2UgPD0gMTAwMDAwXSA8LSAwDQpQbWFob2EkcHJpY2VbUG1haG9hJHByaWNlID4gMTAwMDAwXSA8LSAxDQpkYXRhdGFibGUoUG1haG9hKQ0KYGBgDQoNCg0KIyMjIFjDoWMgxJHhu4tuaCBiaeG6v24gcGjhu6UgdGh14buZYw0KDQpW4bubaSBt4bulYyDEkcOtY2ggcGjDom4gdMOtY2ggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBnacOhIGLDoW4gY+G7p2EgbmfDtGkgbmjDoCwgc+G7rSBk4bulbmcgYmnhur9uIMSR4buLbmggdMOtbmggbMOgbSBiaeG6v24gcGjhu6UgdGh14buZYzoNCg0KKipQcmljZTogR2nDoSBiw6FuIGPhu6dhIG5nw7RpIG5ow6AqKg0KDQpCaeG6v24gcGjhu6UgdGh14buZYyB0cm9uZyBuZ2hpw6puIGPhu6l1IG7DoHkgbMOgIGJp4bq/biBnacOhIG5ow6AgKFByaWNlKSwgbeG7mXQgdHJvbmcgbmjhu69uZyB54bq/dSB04buRIHF1YW4gdHLhu41uZyB0cm9uZyBsxKluaCB24buxYyBi4bqldCDEkeG7mW5nIHPhuqNuLCBwaOG6o24gw6FuaCBnacOhIHRy4buLIG3DoCBuZ8aw4budaSBtdWEgc+G6tW4gc8OgbmcgdHLhuqMgxJHhu4Mgc+G7nyBo4buvdSDEkcaw4bujYyBt4buZdCBuZ8O0aSBuaMOgLiBHacOhIG5ow6AgY2jhu4t1IOG6o25oIGjGsOG7n25nIGLhu59pIG5oaeG7gXUgeeG6v3UgdOG7kSBuaMawIGRp4buHbiB0w61jaCBj4bunYSBuZ8O0aSBuaMOgLCBz4buRIHBow7JuZyBuZ+G7pywgcGjDsm5nIHThuq9tIHbDoCBjw6FjIHRp4buHbiBuZ2hpIGtow6FjIG5oxrAgbmfDtGkgbmjDoCBjw7MgdOG6p25nIGjhuqdtIMSRw6MgxJHGsOG7o2MgaG/DoG4gdGhp4buHbiBoYXkgY2jGsGEsIHbhu4sgdHLDrSBuZ8O0aSBuaMOgIGPDsyBu4bqxbSDhu58gduG7iyB0csOtIHRydW5nIHTDom0gaGF5IGtow7RuZywuLi4gRGnhu4duIHTDrWNoIGzhu5tuIHbDoCBuaGnhu4F1IHRp4buHbiBuZ2hpIHRoxrDhu51uZyBk4bqrbiDEkeG6v24gZ2nDoSBuaMOgIGNhbyBoxqFuLiB24buLIHRyw60gbmfDtGkgbmjDoCBsw6AgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcgbmjhuqV0LCB24bubaSBjw6FjIGtodSB24buxYyBjw7MgY8ahIHPhu58gaOG6oSB04bqnbmcgdOG7kXQsIGFuIG5pbmggdsOgIGfhuqduIHRydW5nIHTDom0gdGjGsOG7nW5nIGThuqtuIMSR4bq/biBnacOhIG5ow6AgY2FvIGjGoW4uIFRyb25nIGLhu5kgZOG7ryBsaeG7h3UgKioqSG91c2VQcmljZXMqKiosIGJp4bq/biAqKipQcmljZSoqKiBsw6AgbeG7mXQgYmnhur9uIHF1YW4gdHLhu41uZyB2w6wgbsOzIOG6o25oIGjGsOG7n25nIG5oaeG7gXUgxJHhur9uIG5ow6AgxJHhuqd1IHTGsCwgbmfGsOG7nWkgbXVhIG5ow6AgdsOgIG5ow6AgaG/huqFjaCDEkeG7i25oIGNow61uaCBzw6FjaC4gVmnhu4djIGPDsyBt4bq3dCBj4bunYSBiaeG6v24gbsOgeSBnacO6cCBuaMOgIMSR4bqndSB0xrAgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIHRow7RuZyBtaW5oLCB04buRaSDGsHUgaMOzYSBs4bujaSBuaHXhuq1uIHbDoCBwaMOhdCB0cmnhu4NuIGLhu4FuIHbhu69uZyB0aOG7iyB0csaw4budbmcgYuG6pXQgxJHhu5luZyBz4bqjbi4NCg0KIyBDSMavxqBORyAzOiBUSOG7kE5HIEvDiiBNw5QgVOG6oiBDw4FDIEJJ4bq+Tg0KDQpgYGB7cn0NCnN1bW1hcnkoUG1haG9hKQ0KYGBgDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIHThu6tuZyBiaeG6v24NCg0KIyMjIEJp4bq/biBwaOG7pSB0aHXhu5ljIChQcmljZSkNCg0KKipCaeG6v24gUHJpY2UqKjogR2nDoSBiw6FuIGPhu6dhIG5nw7RpIG5ow6ANCg0KLSAgIELhuqNuZyB04bqnbiBz4buRIC0gYuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NCnRhYmxlKFBtYWhvYSRwcmljZSkNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKFBtYWhvYSRwcmljZSkvc3VtKHRhYmxlKFBtYWhvYSRwcmljZSkpDQpgYGANCg0KLSAgIMSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KUG1haG9hIHw+IGdncGxvdChhZXMoIHggPSBwcmljZSwgeSA9IGFmdGVyX3N0YXQoY291bnQpKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ2JsdWUnKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoIGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAxLjUpICsNCiAgdGhlbWVfY2xhc3NpYygpICsgDQogIGxhYnMoeCA9ICdHacOhIGLDoW4nLCB5ID0gJ1Phu5EgbmfDtGkgbmjDoCcpDQpgYGANCg0KTmjhuq1uIHjDqXQ6IEvhur90IHF14bqjIGNobyB0aOG6pXkgdHJvbmcgNTQ2IG5nw7RpIG5ow6AgY8OzIDQ4MiBuZ8O0aSBuaMOgIGPDsyBnacOhIGLDoW4gZMaw4bubaSAxMDAwMDAgVVNEIGNoaeG6v20gODglIHPhu5EgbmfDtGkgbmjDoCB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgdsOgIDYzIG5nw7RpIG5ow6AgY8OzIG3hu6ljIGdpw6EgYsOhbiB0csOqbiAxMDAwMDAgVVNEIGNoaeG6v20gMTIlIHPhu5EgbmfDtGkgbmjDoCB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQuDQoNCiMjIyBCaeG6v24gxJHhu5ljIGzhuq1wDQoNCioqQmnhur9uIEJlZHJvb21zKio6IFPhu5EgcGjDsm5nIG5n4bunIHRyb25nIG5nw7RpIG5ow6AuDQoNCmBgYHtyfQ0Kc3VtbWFyeShQbWFob2EkYmVkcm9vbXMpDQpgYGANCg0KLSAgIELhuqNuZyB04bqnbiBz4buRDQoNCmBgYHtyfQ0KdGFibGUoUG1haG9hJGJlZHJvb21zKQ0KYGBgDQoNCi0gICBC4bqjbmcgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KdGFibGUoUG1haG9hJGJlZHJvb21zKS9zdW0odGFibGUoUG1haG9hJGJlZHJvb21zKSkqMTAwDQpgYGANCg0KLSAgIMSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KUG1haG9hIHw+IGdncGxvdCggYWVzKCB4ID0gYmVkcm9vbXMsIHk9IGFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsPSdvcmFuZ2UnKSArIGdlb21fdGV4dChhZXMobGFiZWw9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksYWNjdXJhY3k9LjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvcj0gJ2JsYWNrJywgdmp1c3Q9IC0uNSkgKyB0aGVtZV9jbGFzc2ljKCkgKyB4bGFiKCdT4buRIHBow7JuZyBuZ+G7pycpICsgeWxhYignU+G7kSBuZ8O0aSBuaMOgJykNCg0KYGBgDQoNCk5o4bqtbiB4w6l0OiBL4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5DQoNCi0gICBOaOG7r25nIG5nw7RpIG5ow6AgY8OzIDMgcGjDsm5nIG5n4bunIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgNTUsMjMlIChjw7MgMzAxIG5nw7RpIG5ow6ApDQoNCi0gICBOaOG7r25nIG5nw7RpIG5ow6AgY8OzIDEgcGjDsm5nIG5n4bunIHbDoCBuaMOgIGPDsyA2IHBow7JuZyBuZ+G7pyBjaGnhur9tIHThu4kgbOG7hyB0aOG6pXAgbmjhuqV0IDAsMzclIChjw7MgMiBuZ8O0aSBuaMOgKQ0KDQotICAgTmjhu69uZyBuZ8O0aSBuaMOgIGPDsyAyIHBow7JuZyBuZ+G7pyBjaGnhur9tIHThu7cgbOG7hyAyNCw5MSUgKGPDsyAxMzYgbmfDtGkgbmjDoCkNCg0KLSAgIE5o4buvbmcgbmfDtGkgbmjDoCBjw7MgNCBwaMOybmcgbmfhu6cgY2hp4bq/bSB04bu3IGzhu4cgMTcsNCUgKGPDsyA5NCBuZ8O0aSBuaMOgKQ0KDQotICAgTmjhu69uZyBuZ8O0aSBuaMOgIGPDsyA1IHBow7JuZyBuZ+G7pyBjaGnhur9tIHThu7cgbOG7hyAxLDgzJSAoY8OzIDEwIG5nw7RpIG5ow6ApDQoNCioqQmnhur9uIERyaXZld2F5Kio6IE5ow6AgY8OzIGtodSB24buxYyByacOqbmcgxJHhu4MgxJHhuq11IHhlIGtow7RuZz8NCg0KLSAgIELhuqNuZyB04bqnbiBz4buRDQoNCmBgYHtyfQ0KdGFibGUoUG1haG9hJGRyaXZld2F5KQ0KYGBgDQoNCi0gICBC4bqjbmcgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KdGFibGUoUG1haG9hJGRyaXZld2F5KS9zdW0odGFibGUoUG1haG9hJGRyaXZld2F5KSkNCmBgYA0KDQotICAgxJDhu5MgdGjhu4sNCg0KYGBge3J9DQpQbWFob2EgfD4gZ2dwbG90KGFlcyggeCA9IGRyaXZld2F5LCB5ID0gYWZ0ZXJfc3RhdChjb3VudCkpKSArDQogIGdlb21fYmFyKGZpbGwgPSAnU2FsbW9uJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KCBhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gMS41KSArDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICBsYWJzKHggPSAnQ2jhu5cgxJHhuq11IHhlJywgeSA9ICdT4buRIG5nw7RpIG5ow6AnKQ0KYGBgDQoNCk5o4bqtbiB4w6l0OiBL4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5IHRyb25nIHThu5VuZyBz4buRIDU0NiBuZ8O0aSBuaMOgIHRow6wgY8OzIDc3IG5nw7RpIG5ow6AgdHJvbmcgY3Xhu5ljIGto4bqjbyBzw6F0IGtow7RuZyBjw7Mga2h1IHbhu7FjIHJpw6puZyDEkeG7gyDEkeG6rXUgeGUgKGNoaeG6v20gMTQlKSB2w6AgY8OzIDQ2OCBuZ8O0aSBuaMOgIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBjw7MgbmjDoCBjw7Mga2h1IHbhu7FjIHJpw6puZyDEkeG7gyDEkeG6rXUgeGUgKGNoaeG6v20gODYlKS4NCg0KKipCaeG6v24gUHJlZmVyKio6IE5ow6AgY8OzIG7hurFtIHRyb25nIGtodSB0cnVuZyB0w6JtIGPhu6dhIHRow6BuaCBwaOG7kSBraMO0bmc/DQoNCi0gICBC4bqjbmcgdOG6p24gc+G7kQ0KDQpgYGB7cn0NCnRhYmxlKFBtYWhvYSRwcmVmZXIpDQpgYGANCg0KLSAgIELhuqNuZyB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQp0YWJsZShQbWFob2EkcHJlZmVyKS9zdW0odGFibGUoUG1haG9hJHByZWZlcikpDQpgYGANCg0KLSAgIMSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KUG1haG9hIHw+IGdncGxvdChhZXMoIHggPSBwcmVmZXIsIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICdncmVlbicpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudCggYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IDEuNSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgbGFicyh4ID0gJ1bhu4sgdHLDrScsIHkgPSAnU+G7kSBuZ8O0aSBuaMOgJykNCmBgYA0KDQpOaOG6rW4geMOpdDogS+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRo4bqleSB0cm9uZyB04buVbmcgc+G7kSA1NDUgbmfDtGkgbmjDoCB0aMOsIGPDsyAxMjcgbmfDtGkgbmjDoCB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgY8OzIHbhu4sgdHLDrSBuZ8O0aSBuaMOgIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSAoY2hp4bq/bSAyMyUpIHbDoCBjw7MgNDE4IG5nw7RpIG5ow6AgdHJvbmcgY3Xhu5ljIGto4bqjbyBzw6F0IGPDsyB24buLIHRyw60gbuG6sW0gY8OhY2ggeGEgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgKGNoaeG6v20gNzclKS4NCg0KKipCaeG6v24gUmVjcmVhdGlvbjoqKiBOaMOgIGPDsyBwaMOybmcgZ2nhuqNpIHRyw60ga2jDtG5nPw0KDQotICAgQuG6o25nIHThuqduIHPhu5ENCg0KYGBge3J9DQp0YWJsZShQbWFob2EkcmVjcmVhdGlvbikNCmBgYA0KDQotICAgQuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NCnRhYmxlKFBtYWhvYSRyZWNyZWF0aW9uKS9zdW0odGFibGUoUG1haG9hJHJlY3JlYXRpb24pKQ0KDQpgYGANCg0KLSAgIMSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KdGFibGUoUG1haG9hJHJlY3JlYXRpb24pDQp0YWJsZShQbWFob2EkcmVjcmVhdGlvbikvc3VtKHRhYmxlKFBtYWhvYSRyZWNyZWF0aW9uKSkqMTAwDQpQbWFob2EgfD4gZ2dwbG90KGFlcyggeCA9IHJlY3JlYXRpb24sIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICdicm93bicpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudCggYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IDEuNSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKyANCiAgbGFicyh4ID0gJ1Bow7JuZyBnaeG6o2kgdHLDrScsIHkgPSAnU+G7kSBuZ8O0aSBuaMOgJykNCmBgYA0KDQpgYGB7cn0NCnRoaHQgPC0gUG1haG9hICU+JSBncm91cF9ieShyZWNyZWF0aW9uKSAlPiUgc3VtbWFyaXNlKCBuPW4oKSkgJT4lIG11dGF0ZSggcGVyY2VudCA9bi9zdW0obikpIA0KdGhodCB8PiBnZ3Bsb3QoYWVzKHg9JycsIHk9cGVyY2VudCwgZmlsbD0gcmVjcmVhdGlvbikpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCB3aWR0aCA9IDEpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChwZXJjZW50KjEwMCksICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkrDQogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQgPSAwKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImJyb3duIiwgIm1vY2Nhc2luIiksIG5hbWUgPSAicmVjcmVhdGlvbiIpICsNCiAgICBsYWJzKHRpdGxlID0gInJlY3JlYXRpb24iKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCk5o4bqtbiB4w6l0OiBL4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5IGPDsyAxOCUgc+G7kSBuZ8O0aSBuaMOgIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBuaMOgIGPDsyBwaMOybmcgZ2nhuqNpIHRyw60gdsOgIDgyJSBz4buRIG5nw7RpIG5ow6AgdHJvbmcgY3Xhu5ljIGto4bqjbyBzw6F0IG5ow6Aga2jDtG5nIGPDsyBwaMOybmcgZ2nhuqNpIHRyw60uDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIGNobyBjw6FjIGPhurdwIGJp4bq/bg0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgZ2nhu69hIGJp4bq/biBQcmljZSB2w6AgYmnhur9uIEJlZHJvb21zDQoNCkdp4bqjaSB0aMOtY2g6IEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGdp4buvYSBoYWkgYmnhur9uIHRyw6puIGNobyBjaMO6bmcgdGEgYmnhur90IHPhu5EgbMaw4bujbmcgcGjDsm5nIG5n4bunIHRow6wgY8OzIG3hu6ljIGdpw6EgYsOhbiBuaMawIHRo4bq/IG7DoG8uDQoNCi0gICBC4bqjbmcgdOG6p24gc+G7kQ0KDQpgYGB7cn0NCm5tayRwaG9uZ25ndSA8LSBjdXQoIG5tayRiZWRyb29tcywgYnJlYWtzID0gYygwLDIsNyksIGxhYmVscyA9IGMoJ8OtdCcsICduaGnhu4F1JykpDQpubWskZ2lhIDwtIGN1dCggbm1rJHByaWNlLCBicmVha3MgPSBjKDAsNzAwMDAsMTkxMDAwKSwgbGFiZWxzID0gYygndGjhuqVwJywgJ2NhbycpKQ0KdGFibGUobm1rJGdpYSkNCmBgYA0KDQpUw7RpIGNoaWEgYmnhur9uIHByaWNlIChnacOhIGLDoW4gbmjDoCkgdGjDoG5oIDIgbeG7qWMgZ2nDoSBjYW8gdsOgIHRo4bqlcC4gVHJvbmcgY3Xhu5ljIGto4bqjbyBzw6F0IGPDsyAzNDUgbmfGsOG7nWkgYsOhbiBuaMOgIHbhu5tpIG3hu6ljIGdpw6EgdGjhuqVwIHbDoCAyMDEgbmfGsOG7nWkgYsOhbiBuaMOgIHbhu5tpIG3hu6ljIGdpw6EgY2FvLg0KDQpgYGB7cn0NCm0gPC0gdGFibGUobm1rJHBob25nbmd1LCBubWskZ2lhKQ0KYWRkbWFyZ2lucyhtKQ0KYGBgDQoNCk5o4bqtbiB4w6l0Og0KDQpDw7MgMTI3IG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBjw7Mgw610IHBow7JuZyBuZ+G7pyBjw7MgbeG7qWMgZ2nDoSBiw6FuIHRo4bqlcC4NCg0KQ8OzIDExIG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBjw7Mgw610IHBow7JuZyBuZ+G7pyBjw7MgbeG7qWMgZ2nDoSBiw6FuIGNhby4NCg0KQ8OzIDIxOCBuZ8aw4budaSB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgY8OzIG5oaeG7gXUgcGjDsm5nIG5n4bunIGPDsyBt4bupYyBnacOhIGLDoW4gdGjhuqVwLg0KDQpDw7MgMTkwIG5nxrDhu51pIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBjw7Mgbmhp4buBdSBwaMOybmcgbmfhu6cgY8OzIG3hu6ljIGdpw6EgYsOhbiBjYW8uDQoNCi0gICDEkOG7kyB0aOG7iw0KDQpgYGB7cn0NCm5tayB8PiBjb3VudChwaG9uZ25ndSwgZ2lhKSB8Pg0KICBncm91cF9ieShwaG9uZ25ndSkgfD4NCiAgbXV0YXRlKHBIID0gbi9zdW0obikpIHw+DQogIGdncGxvdChhZXMoeCA9IHBob25nbmd1LCB5ID0gbiwgZmlsbCA9IGdpYSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBILCBhY2N1cmFjeSA9IC4wMSkpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZSA9IDQpICsNCiAgeWxhYignU+G7kSBuZ8O0aSBuaMOgJykgKw0KICB4bGFiKCdT4buRIHBow7JuZyBuZ+G7pycpDQpgYGANCg0KVOG7qyBr4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5Og0KDQotICAgVHJvbmcgc+G7kSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIMOtdCBwaMOybmcgbmfhu6cgdGjDrCBjw7MgNyw5NyUgbMOgIG5ow6AgY8OzIG3hu6ljIGdpw6EgYsOhbiBjYW8sIDkyLDAzJSBsw6AgbmjDoCBjw7MgbeG7qWMgZ2nDoSBiw6FuIHRo4bqlcC4NCg0KLSAgIFRyb25nIHPhu5Egbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBuaGnhu4F1IHBow7JuZyBuZ+G7pyB0aMOsIGPDsyA0Niw1NyUgbMOgIG5ow6AgY8OzIG3hu6ljIGdpw6EgYsOhbiBjYW8sIDUzLDQzJSBsw6AgbmjDoCBjw7MgbeG7qWMgZ2nDoSBiw6FuIHRo4bqlcC4NCg0KIyMjIFRo4buRbmcga8OqIG3DtCB04bqjIGdp4buvYSBiaeG6v24gUHJpY2UgdsOgIGJp4bq/biBEcml2ZXdheQ0KDQpHaeG6o2kgdGjDrWNoOiBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBnaeG7r2EgaGFpIGJp4bq/biB0csOqbiBjaG8gY2jDum5nIHRhIGJp4bq/dCBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIGNo4buXIMSR4buDIHhlIHRow6wgY8OzIG3hu6ljIGdpw6EgYsOhbiBuaMawIHRo4bq/IG7DoG8uDQoNCi0gICBC4bqjbmcgdOG6p24gc+G7kQ0KDQpgYGB7cn0NCm1rIDwtIHRhYmxlKFBtYWhvYSRwcmljZSwgUG1haG9hJGRyaXZld2F5KQ0KYWRkbWFyZ2lucyhtaykNCmBgYA0KDQotICAgQuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NCnByb3AudGFibGUobWspDQpgYGANCg0KLSAgIMSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KZ2dwbG90KFBtYWhvYSwgYWVzKHByaWNlLCAgZmlsbCA9IGRyaXZld2F5KSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgYmlud2lkdGggPSAyNSkgKyB4bGFiKCJHacOhIGLDoW4iKSArIHlsYWIoIlPhu5EgbmfDtGkgbmjDoCIpDQoNCmBgYA0KDQpU4burIGvhur90IHF14bqjIHRyw6puIGNobyB0aOG6pXk6DQoNCi0gICBOaOG7r25nIG5nw7RpIG5ow6AgY8OzIG3hu6ljIGdpw6EgYsOhbiBkxrDhu5tpIDEwMDAwMCBVU0QgdGjDrCBjw7MgNzcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIGNo4buXIMSR4bqtdSB4ZSAoY2hp4bq/bSAxNCwxMyUpIHbDoCBjw7MgNDA1IG5nw7RpIG5ow6AgY8OzIGNo4buXIMSR4bqtdSB4ZSAoY2hp4bq/bSA3NCwzMSUpDQoNCi0gICBOaOG7r25nIG5nw7RpIG5ow6AgY8OzIG3hu6ljIGdpw6EgYsOhbiBjYW8gaMahbiAxMDAwMDAgVVNEIHRow6wgY8OzIDAgbmfDtGkgbmjDoCBraMO0bmcgY8OzIGNo4buXIMSR4bqtdSB4ZSAoY2hp4bq/bSAwLDAwJSkgdsOgIGPDsyA2MyBuZ8O0aSBuaMOgIGPDsyBjaOG7lyDEkeG6rXUgeGUgKGNoaeG6v20gMTEsNTYlKQ0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgZ2nhu69hIGJp4bq/biBQcmljZSB2w6AgYmnhur9uIFByZWZlcg0KDQpHaeG6o2kgdGjDrWNoOiBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBnaeG7r2EgaGFpIGJp4bq/biB0csOqbiBjaG8gY2jDum5nIHRhIGJp4bq/dCBuaOG7r25nIG5nw7RpIG5ow6Ag4bufIHbhu4sgdHLDrSB0cnVuZyB0w6JtIHRow6wgY8OzIG3hu6ljIGdpw6EgYsOhbiBuaMawIHRo4bq/IG7DoG8uDQoNCi0gICBC4bqjbmcgdOG6p24gc+G7kQ0KDQpgYGB7cn0NCm1rMSA8LSB0YWJsZShQbWFob2EkcHJpY2UsIFBtYWhvYSRwcmVmZXIpDQphZGRtYXJnaW5zKG1rMSkNCmBgYA0KDQotICAgQuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NCnByb3AudGFibGUobWsxKQ0KYGBgDQoNCi0gICBCaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpnZ3Bsb3QoUG1haG9hLCBhZXMocHJpY2UsICBmaWxsID0gcHJlZmVyKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgYmlud2lkdGggPSAyNSkgKyB4bGFiKCJHacOhIGLDoW4iKSArIHlsYWIoIlPhu5EgbmfDtGkgbmjDoCIpDQoNCmBgYA0KDQpU4burIGvhur90IHF14bqjIHRyw6puIGNobyB0aOG6pXk6DQoNCi0gICBOaOG7r25nIG5nw7RpIG5ow6AgY8OzIG3hu6ljIGdpw6EgYsOhbiBkxrDhu5tpIDEwMDAwMCBVU0QgdGjDrCBjw7MgMzc5IG5nw7RpIG5ow6AgY8OhY2ggeGEgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgKGNoaeG6v20gNjksNSUpIHbDoCBjw7MgMTAzIG5nw7RpIG5ow6AgY8OzIGNo4buXIMSR4bqtdSB4ZSAoY2hp4bq/bSAxOCw5JSkNCg0KLSAgIE5o4buvbmcgbmfDtGkgbmjDoCBjw7MgbeG7qWMgZ2nDoSBiw6FuIGNhbyBoxqFuIDEwMDAwMCBVU0QgdGjDrCBjw7MgMzkgbmfDtGkgbmjDoCBjw6FjIHhhIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIChjaGnhur9tIDcsMTYlKSB2w6AgY8OzIDI0IG5nw7RpIG5ow6AgY8OzIGNo4buXIMSR4bqtdSB4ZSAoY2hp4bq/bSA0LDQlKQ0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgZ2nhu69hIGJp4bq/biBQcmljZSB2w6AgYmnhur9uIFJlY3JlYXRpb24NCg0KR2nhuqNpIHRow61jaDogTOG6rXAgYuG6o25nIHThuqduIHPhu5EgZ2nhu69hIGhhaSBiaeG6v24gdHLDqm4gY2hvIGNow7puZyB0YSBiaeG6v3Qgbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBwaMOybmcgZ2nhuqNpIHRyw60gdGjDrCBjw7MgbeG7qWMgZ2nDoSBiw6FuIG5oxrAgdGjhur8gbsOgby4NCg0KYGBge3J9DQptazIgPC0gdGFibGUoUG1haG9hJHByaWNlLCBQbWFob2EkcmVjcmVhdGlvbikNCmFkZG1hcmdpbnMobWsyKQ0KYGBgDQoNCi0gICBC4bqjbmcgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KcHJvcC50YWJsZShtazIpDQpgYGANCg0KLSAgIMSQ4buTIHRo4buLDQoNCmBgYHtyfQ0KZ2dwbG90KFBtYWhvYSwgYWVzKHByaWNlLCAgZmlsbCA9IHJlY3JlYXRpb24pKSArIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCBiaW53aWR0aCA9IDI1KSArIHhsYWIoIkdpw6EgYsOhbiIpICsgeWxhYigiU+G7kSBuZ8O0aSBuaMOgIikNCg0KYGBgDQoNClThu6sga+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRo4bqleToNCg0KLSAgIE5o4buvbmcgbmfDtGkgbmjDoCBjw7MgbeG7qWMgZ2nDoSBiw6FuIGTGsOG7m2kgMTAwMDAwIFVTRCB0aMOsIGPDsyA0MDYgbmfDtGkgbmjDoCBraMO0bmcgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSAoY2hp4bq/bSA3NCw1JSkgdsOgIGPDsyA3NiBuZ8O0aSBuaMOgIGPDsyBjaOG7lyDEkeG6rXUgeGUgKGNoaeG6v20gMTMsOTQlKQ0KDQotICAgTmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBt4bupYyBnacOhIGLDoW4gY2FvIGjGoW4gMTAwMDAwIFVTRCB0aMOsIGPDsyA0MiBuZ8O0aSBuaMOgIGtow7RuZyBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIChjaGnhur9tIDcsNyUpIHbDoCBjw7MgMjEgbmfDtGkgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIChjaGnhur9tIDMsODUlKQ0KDQojIENIxq/GoE5HIDQ6IFBIw4JOIFTDjUNIIEThu64gTEnhu4ZVDQoNCiMjIFBow6JuIHTDrWNoIFJlbGF0aXZlIFJpc2ssIFJpc2tyYWRpbywgT2Rkc3JhZGlvIGdp4buvYSBiaeG6v24gUHJpY2UgdsOgIGJp4bq/biBCZWRyb29tcw0KDQotICAgKlByaWNlKjogR2nDoSBiw6FuIGPhu6dhIG5nw7RpIG5ow6ANCg0KLSAgICpCZWRyb29tcyo6IFPhu5EgbMaw4bujbmcgcGjDsm5nIG5n4bunIGPDsyB0cm9uZyBuZ8O0aSBuaMOgDQoNCmBgYHtyfQ0KUmVsUmlzayhtKQ0KYGBgDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKG0pDQpgYGANCg0KTmjhuq1uIHjDqXQ6DQoNClThu7cgbOG7hyBuaOG7r25nIG5ow6AgY8OzIG5oaeG7gXUgcGjDsm5nIG5n4bunIMSRxrDhu6NjIGLDoW4gduG7m2kgbeG7qWMgZ2nDoSB0aOG6pXAgbmhp4buBdSBoxqFuIDcyLDI0JSBzbyB24bubaSB04bu3IGzhu4cgbmjhu69uZyBuaMOgIGPDsyDDrXQgcGjDsm5nIG5n4bunIMSRxrDhu6NjIGLDoW4gduG7m2kgbeG7qWMgZ2nDoSBjYW8uDQoNClThu7cgbOG7hyBuaOG7r25nIG5ow6AgY8OzIG5oaeG7gXUgcGjDsm5nIG5n4bunIMSRxrDhu6NjIGLDoW4gduG7m2kgbeG7qWMgZ2nDoSB0aOG6pXAgZ+G6pXAgNSw4NCBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbmjhu69uZyBuaMOgIGPDsyDDrXQgcGjDsm5nIG5n4bunIMSRxrDhu6NjIGLDoW4gduG7m2kgbeG7qWMgZ2nDoSBjYW8uDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKG0pDQpgYGANCg0KTmjhuq1uIHjDqXQ6IFThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIGdpw6EgYsOhbiB0aOG6pXAgdHLDqm4gbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBnacOhIGLDoW4gY2FvIHRyb25nIHPhu5Egbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBuaGnhu4F1IHBow7JuZyBuZ+G7pyBjYW8gZ+G6pXAgOSw5IGzhuqduIHNvIHbhu5tpIHThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIGdpw6EgYsOhbiB0aOG6pXAgdHLDqm4gbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBnacOhIGLDoW4gY2FvIHRyb25nIHPhu5Egbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyDDrXQgcGjDsm5nIG5n4bunLg0KDQojIyBQaMOibiB0w61jaCBSZWxhdGl2ZSBSaXNrLCBSaXNrcmFkaW8sIE9kZHNyYWRpbyBnaeG7r2EgYmnhur9uIFByaWNlIHbDoCBiaeG6v24gUHJlZmVyDQoNCi0gICAqUHJpY2UqOiBHacOhIGLDoW4gY+G7p2EgbmfDtGkgbmjDoA0KDQotICAgKlByZWZlcio6IE5ow6AgY8OzIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBoYXkga2jDtG5nPw0KDQpgYGB7cn0NClJlbFJpc2sobWsxKQ0KYGBgDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKG1rMSkNCmBgYA0KDQpOaOG6rW4geMOpdDogVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXkNCg0KVOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgbuG6sW0g4bufIHbhu4sgdHLDrSB0cnVuZyB0w6JtIMSRxrDhu6NjIGLDoW4gduG7m2kgbeG7qWMgZ2nDoSB0aOG6pXAgKGTGsOG7m2kgMTAwLDAwMCBVU0QpIGNhbyBoxqFuIHThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6AgbuG6sW0g4bufIHbhu4sgdHLDrSB0cnVuZyB0w6JtIMSRxrDhu6NjIGLDoW4gduG7m2kgbeG7qWMgZ2nDoSB0aOG6pXAgKGTGsOG7m2kgMTAwLDAwMCBVU0QpIDI3LDAyJS4NCg0KVOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBu4bqxbSDhu58gduG7iyB0csOtIHRydW5nIHTDom0gxJHGsOG7o2MgYsOhbiB24bubaSBt4bupYyBnacOhIGNhbyAodHLDqm4gMTAwLDAwMCBVU0QpIGfhuqVwIDEsNzggbOG6p24gc28gduG7m2kgdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgbuG6sW0g4bufIHbhu4sgdHLDrSB0cnVuZyB0w6JtIMSRxrDhu6NjIGLDoW4gduG7m2kgbeG7qWMgZ2nDoSBjYW8gKHRyw6puIDEwMCwwMDAgVVNEKS4NCg0KYGBge3J9DQpvZGRzcmF0aW8obWsxKQ0KDQpgYGANCg0KTmjhuq1uIHjDqXQ6IFThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6AgbuG6sW0g4bufIHbhu4sgdHLDrSB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBzbyB24bubaSBuaOG7r25nIG5nw7RpIG5ow6AgbuG6sW0g4bufIHbhu4sgdHLDrSBjw6FjaCB4YSB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSB0cm9uZyBz4buRIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgbeG7qWMgZ2nDoSBiw6FuIGNhbyAoaMahbiAxMDAsMDAwIFVTRCkgY2FvIGfhuqVwIDIsMjYgbOG6p24gdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBu4bqxbSDhu58gduG7iyB0csOtIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIHNvIHbhu5tpIG5o4buvbmcgbmfDtGkgbmjDoCBu4bqxbSDhu58gduG7iyB0csOtIGPDoWNoIHhhIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIHRyb25nIHPhu5Egbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBt4bupYyBnacOhIGLDoW4gdGjhuqVwIChkxrDhu5tpIDEwMCwwMDAgVVNEKS4NCg0KIyMgUGjDom4gdMOtY2ggUmVsYXRpdmUgUmlzaywgUmlza3JhZGlvLCBPZGRzcmFkaW8gZ2nhu69hIGJp4bq/biBQcmljZSB2w6AgYmnhur9uIFJlY3JlYXRpb24NCg0KLSAgICpQcmljZSo6IEdpw6EgYsOhbiBj4bunYSBuZ8O0aSBuaMOgDQoNCi0gICAqUmVjcmVhdGlvbio6IE5ow6AgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSBoYXkga2jDtG5nPw0KDQpgYGB7cn0NClJlbFJpc2sobWsyKQ0KYGBgDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKG1rMikNCmBgYA0KDQpOaOG6rW4geMOpdDogS+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRhIHRo4bqleQ0KDQpU4bu3IGzhu4cgbmjhu69uZyBuZ8O0aSBuaMOgIGtow7RuZyBraMO0bmcgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSDEkcaw4bujYyBiw6FuIHbhu5tpIG3hu6ljIGdpw6EgYsOhbiB0aOG6pXAgKGTGsOG7m2kgMTAwMDAwIFVTRCkgbmhp4buBdSBoxqFuIDI2LDMlIHNvIHbhu5tpIHThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSDEkcaw4bujYyBiw6FuIHbhu5tpIG3hu6ljIGdpw6EgYsOhbiB0aOG6pXAgKGTGsOG7m2kgMTAwMDAwIFVTRCkuDQoNClThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSBjw7MgbeG7qWMgZ2nDoSBiw6FuIGNhbyAobOG7m24gaMahbiAxMDAwMDAgVVNEKSBn4bqlcCAyLDExIGzhuqduIHNvIHbhu5tpIHThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6Aga2jDtG5nIGPDsyBwaMOybmcgZ2nhuqNpIHRyw60gxJHGsOG7o2MgYsOhbiB24bubaSBt4bupYyBnacOhIGNhbyAoaMahbiAxMDAwMDAgVVNEKS4NCg0KYGBge3J9DQpvZGRzcmF0aW8obWsyKQ0KDQpgYGANCg0KTmjhuq1uIHjDqXQ6IFThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSB0csOqbiBuaOG7r25nIG5nw7RpIG5ow6Aga2jDtG5nIGPDsyBwaMOybmcgZ2nhuqNpIHRyw60gdHJvbmcgc+G7kSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIG3hu6ljIGdpw6EgYsOhbiB0aOG6pXAgKGTGsOG7m2kgMTAwMDAwIFVTRCkgY2FvIGfhuqVwIDIsNjcgbOG6p24gdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIHRyw6puIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSB0cm9uZyBz4buRIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgbeG7qWMgZ2nDoSBiw6FuIGNhbyAoaMahbiAxMDAwMDAgVVNEKQ0KDQojIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHDQoNCiMjIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGJp4bq/biAqUHJpY2UqDQoNCmBgYHtyfQ0KbWtrIDwtIFBtYWhvYVsgUG1haG9hJHByaWNlID09ICcxJyxdDQpwcm9wLnRlc3QoIGxlbmd0aChta2skcHJpY2UpLCBsZW5ndGgoIFBtYWhvYSRwcmljZSkpDQpgYGANCg0KYGBge3J9DQpta2sgPC0gIFBtYWhvYVsgUG1haG9hJHByaWNlID09ICcwJyxdDQpwcm9wLnRlc3QoIGxlbmd0aChta2skcHJpY2UpLCBsZW5ndGgoIFBtYWhvYSRwcmljZSkpDQpgYGANCg0KTmjhuq1uIHjDqXQ6IFbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUgdGEgY8OzIHThu7cgbOG7hyBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIGdpw6EgYsOhbiBjYW8gaMahbiAxMDAwMDAgVVNEIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDksMDYlIMSR4bq/biAxNCw2MSUuIE3hurdjIGtow6FjLCB04bu3IGzhu4cgbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBnacOhIGLDoW4gdGjhuqVwIGjGoW4gMTAwMDAwIFVTRCB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA4NSwzJSDEkeG6v24gOTAsOSUuDQoNCiMjIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGJp4bq/biAqQmVkcm9vbXMqDQoNCmBgYHtyfQ0KYmVkIDwtIFBtYWhvYVtQbWFob2EkYmVkcm9vbXMgPiAyLF0NCnByb3AudGVzdCggbGVuZ3RoKGJlZCRiZWRyb29tcyksIGxlbmd0aChQbWFob2EkYmVkcm9vbXMpKQ0KYGBgDQoNCk5o4bqtbiB4w6l0OiBW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIHRhIGPDsyB04bu3IGzhu4cgbmfGsOG7nWkgYsOhbiBuaMOgIGPDsyBuaGnhu4F1IGjGoW4gMiBwaMOybmcgbmfhu6cgdHJvbmcgY3Xhu5ljIGto4bqjbyBzw6F0IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgNzAsNzclIMSR4bq/biA3OCwyMyUuDQoNCiMjIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGJp4bq/biAqUHJlcmZlcioNCg0KYGBge3J9DQpta2trIDwtIFBtYWhvYVtQbWFob2EkcHJlZmVyID09J3llcycsXQ0KcHJvcC50ZXN0KCBsZW5ndGgobWtrayRwcmVmZXIpLCBsZW5ndGgoUG1haG9hJHByZWZlcikpDQpgYGANCg0KYGBge3J9DQpta2trIDwtIFBtYWhvYVtQbWFob2EkcHJlZmVyID09J25vJyxdDQpwcm9wLnRlc3QoIGxlbmd0aChta2trJHByZWZlciksIGxlbmd0aChQbWFob2EkcHJlZmVyKSkNCmBgYA0KDQpOaOG6rW4geMOpdDogVuG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSB0YSBjw7MgdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCDEkcOzIG7hurFtIHRyb25nIGtodSB24buxYyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAxOSw4JSDEkeG6v24gMjcsMSUuIE3hurdjIGtow6FjLCB04bu3IGzhu4cgbmjhu69uZyBuZ8O0aSBuaMOgIGtow7RuZyBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgdHJvbmcgY3Xhu5ljIGto4bqjbyBzw6F0IHThu6sgNzIsOCUgxJHhur9uIDgwLDEzJS4NCg0KIyMjIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgYmnhur9uICpEcml2ZXdheSoNCg0KYGBge3J9DQpta2trIDwtIFBtYWhvYVtQbWFob2EkZHJpdmV3YXkgPT0gJ3llcycsXQ0KcHJvcC50ZXN0KCBsZW5ndGgobWtrayRkcml2ZXdheSksIGxlbmd0aChQbWFob2EkZHJpdmV3YXkpKQ0KYGBgDQoNCk5o4bqtbiB4w6l0OiBW4bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIHRhIGPDsyB04bu3IGzhu4cgbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA4Miw2JSDEkeG6v24gODgsNiUuDQoNCiMjIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGJp4bq/biAqUmVjcmVhdGlvbioNCg0KYGBge3J9DQpta2trayA8LSBQbWFob2FbUG1haG9hJHJlY3JlYXRpb24gPT0gJ25vJyxdDQpwcm9wLnRlc3QoIGxlbmd0aChta2trayRyZWNyZWF0aW9uKSwgbGVuZ3RoKFBtYWhvYSRyZWNyZWF0aW9uKSkNCmBgYA0KDQpgYGB7cn0NCm1ra2trIDwtIFBtYWhvYVtQbWFob2EkcmVjcmVhdGlvbiA9PSAneWVzJyxdDQpwcm9wLnRlc3QoIGxlbmd0aChta2trayRyZWNyZWF0aW9uKSwgbGVuZ3RoKFBtYWhvYSRyZWNyZWF0aW9uKSkNCmBgYA0KDQpOaOG6rW4geMOpdDogVuG7m2kgxJHhu5kgdGluIGPhuq15IDk1JSB0YSBjw7MgdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIHRyb25nIGN14buZYyBraOG6o28gc8OhdCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDE0LDczJSDEkeG6v24gMjEsMzIlLiBN4bq3YyBraMOhYywgdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSB0cm9uZyBjdeG7mWMga2jhuqNvIHPDoXQgdOG7qyA3OCw2NyUgxJHhur9uIDg1LDI2JS4NCg0KIyMgVGjhu5FuZyBrw6ogc3V5IGRp4buFbg0KDQojIyMgS2nhu4NtIMSR4buLbmggZ2nhu69hIDIgYmnhur9uICpQcmljZSogdsOgIGJp4bq/biAqQmVkcm9vbXMqDQoNCi0gICAqUHJpY2UqOiBHacOhIGLDoW4gbmjDoA0KDQotICAgKkJlZHJvb21zKjogU+G7kSBsxrDhu6NuZyBwaMOybmcgbmfhu6cgY8OzIHRyb25nIG5nw7RpIG5ow6ANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiRIXzAkOiBQcmljZSB2w6AgQmVkcm9vbXMgxJHhu5ljIGzhuq1wLg0KDQokSF8xJDogUHJpY2UgdsOgIEJlZHJvb21zIGtow7RuZyDEkeG7mWMgbOG6rXAuDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChtKQ0KYGBgDQoNCk5o4bqtbiB4w6l0OiBL4bq/dCBxdeG6oyBjaG8gY2jDum5nIHRhIHRo4bqleSBy4bqxbmcgcC12YWx1ZSA9IDEuMDE4ZS0xNSBcPCAwLjA1LiDEkMOieSBjxaluZyBsw6AgYuG6sW5nIGNo4bupbmcgxJHhu4MgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEgwLiBW4bqteSB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGJp4bq/biBz4buRIGzGsOG7o25nIHBow7JuZyBuZ+G7pyB2w6AgYmnhur9uIGdpw6EgYsOhbiBj4bunYSBuZ8O0aSBuaMOgIGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdQ0KDQojIyMgS2nhu4NtIMSR4buLbmggZ2nhu69hIDIgYmnhur9uICpQcmljZSogdsOgIGJp4bq/biAqUHJlZmVyKg0KDQotICAgKlByaWNlKjogR2nDoSBiw6FuIG5ow6ANCg0KLSAgICpQcmVmZXIqOiBOZ8O0aSBuaMOgIGPDsyBu4bqxbSB0cm9uZyBraHUgduG7sWMgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgaGF5IGtow7RuZz8NCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiRIXzAkOiBQcmljZSB2w6AgUHJlZmVyIMSR4buZYyBs4bqtcC4NCg0KJEhfMSQ6IFByaWNlIHbDoCBQcmVmZXIga2jDtG5nIMSR4buZYyBs4bqtcC4NCg0KYGBge3J9DQpjaGlzcS50ZXN0KG1rMSkNCmBgYA0KDQpOaOG6rW4geMOpdDogS+G6v3QgcXXhuqMgY2hvIGNow7puZyB0YSB0aOG6pXkgcuG6sW5nIHAtdmFsdWUgPSAwLjAwNTE5NCBcPCAwLjA1LiDEkMOieSBjxaluZyBsw6AgYuG6sW5nIGNo4bupbmcgxJHhu4MgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEgwLiBW4bqteSB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgdOG6p25nIGjhuqdtIGhheSBraMO0bmcgdsOgIGdpw6EgbmjDoCBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUuDQoNCiMjIyBLaeG7g20gxJHhu4tuaCBnaeG7r2EgMiBiaeG6v24gKlByaWNlKiB2w6AgYmnhur9uICpEcml2ZXdheSoNCg0KLSAgICpQcmljZSo6IEdpw6EgYsOhbiBuaMOgDQoNCi0gICAqRHJpdmV3YXkqOiBOZ8O0aSBuaMOgIGPDsyBraHUgduG7sWMgxJHhuq11IHhlIHJpw6puZyBoYXkga2jDtG5nPw0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJEhfMCQ6IFByaWNlIHbDoCBEcml2ZXdheSDEkeG7mWMgbOG6rXAuDQoNCiRIXzEkOiBQcmljZSB2w6AgRHJpdmV3YXkga2jDtG5nIMSR4buZYyBs4bqtcC4NCg0KYGBge3J9DQpjaGlzcS50ZXN0KG1rKQ0KDQpgYGANCg0KTmjhuq1uIHjDqXQ6IEvhur90IHF14bqjIGNobyBjaMO6bmcgdGEgdGjhuqV5IHLhurFuZyBwLXZhbHVlID0gMC4wMDEyMzMgXDwgMC4wNS4gxJDDonkgY8WpbmcgbMOgIGLhurFuZyBjaOG7qW5nIMSR4buDIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMC4gVuG6rXkgduG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIGtodSB24buxYyDEkeG6rXUgeGUgdsOgIGdpw6EgYsOhbiBj4bunYSBuZ8O0aSBuaMOgIGtow7RuZyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdS4NCg0KIyMjIEtp4buDbSDEkeG7i25oIGdp4buvYSAyIGJp4bq/biAqUHJpY2UqIHbDoCBiaeG6v24gKlJlY2VhdGlvbioNCg0KLSAgICpQcmljZSo6IEdpw6EgYsOhbiBuaMOgDQoNCi0gICAqUmVjcmVhdGlvbio6IE5nw7RpIG5ow6AgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSBoYXkga2jDtG5nPw0KDQpHaeG6oyB0aHV54bq/dDoNCg0KJEhfMCQ6IFByaWNlIHbDoCBSZWNyZWF0aW9uIMSR4buZYyBs4bqtcC4NCg0KJEhfMSQ6IFByaWNlIHbDoCBSZWNyZWF0aW9uIGtow7RuZyDEkeG7mWMgbOG6rXAuDQoNCmBgYHtyfQ0KY2hpc3EudGVzdChtazIpDQoNCmBgYA0KDQpOaOG6rW4geMOpdDogS+G6v3QgcXXhuqMgY2hvIGNow7puZyB0YSB0aOG6pXkgcuG6sW5nIHAtdmFsdWUgPSAwLjAwMTE0MyBcPCAwLjA1LiDEkMOieSBjxaluZyBsw6AgYuG6sW5nIGNo4bupbmcgxJHhu4MgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEgwLiBW4bqteSB24bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIHbDoCBnacOhIGLDoW4gY+G7p2EgbmfDtGkgbmjDoCBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUuDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkNCg0KIyMjIE3DtCBow6xuaCBo4buTaSBxdXkgbG9naXQNCg0KROG6oW5nIHThu5VuZyBxdcOhdDoNCg0KJCRsb2dpdCjPgCk9bG9nKM+ALygx4oiSz4ApPc6yXzArzrJfMVhfMSvOsl8yWF8yK+KLryvOsl9rWF9rJCQNCg0KYGBge3J9DQpsb2dpdCA8LSBnbG0oIHByaWNlIH4gcHJlZmVyICsgYmVkcm9vbXMgKyByZWNyZWF0aW9uICwgZmFtaWx5PSBiaW5vbWlhbCggbGluayA9ICdsb2dpdCcpLCBkYXRhPVBtYWhvYSkNCnN1bW1hcnkobG9naXQpDQpgYGANCg0KVuG6rXkgbsOqbiBtw7QgaMOsbmggbG9naXQgxJHGsOG7o2MgeMOhYyDEkeG7i25oIG5oxrAgc2F1Og0KDQokbG9nKFxmcmFje1xwaX17MS1ccGl9KSA9IC01LjUxMDggKyAwLjcwNzhwcmVmZXIgKyAwLjk3MDliZWRyb29tcyArIDAuODAxMXJlY3JlYXRpb24kDQoNCioqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyoqDQoNCi0gSOG7hyBz4buRIGNo4bq3biBsw6AgLTUsNTEwOCDEkWnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6Aga2hpIGtow7RuZyBjw7Mgc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIHRow6wgbeG7qWMgZ2nDoSBiw6FuIGPhu6dhIG5nw7RpIG5ow6AgbMOgIC01LDUxMDguDQoNCi0gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBnacOhIHRy4buLIM6yMT0wLjcwNzggY2hvIHRo4bqleSBy4bqxbmcgbmjhu69uZyBuZ8O0aSBuaMOgIG7hurFtIOG7nyB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSBjw7Mgb2RkcyBjYW8gaMahbiBzbyB24bubaSBuaOG7r25nIG5nw7RpIG5ow6Ag4bufIHbhu4sgdHLDrSBjw6FjaCB4YSB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kS4gIE9kZHMgY+G7p2EgduG7iyB0csOtIG5nw7RpIG5ow6Ag4bufIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIGNhbyBoxqFuIDIsMDI5NTIxMzk3IGzhuqduIG5o4buvbmcgbmfDtGkg4bufIGPDoWNoIHhhIHRydW5nIHTDom0gdGjDoG5oIHBo4buRLg0KDQotIFRyb25nIHRyxrDhu51uZyBo4bujcCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgZ2nDoSB0cuG7iyDOsjI9MC45NzA5IHRo4buDIGhp4buHbiB24bubaSBt4buXaSBuZ8O0aSBuaMOgIGPDsyB0aMOqbSBt4buZdCBwaMOybmcgbmfhu6cgdGjDrCBvZGRzIGPhu6dhIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhur0gdMSDbmcuIE9kZHMgY+G7p2Egbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyB0aMOqbSBt4buZdCBwaMOybmcgbmfhu6cgY2FvIGjGoW4gMiw2NCBs4bqnbiBzbyB24bubaSBzbyB24bubaSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIMOtdCBoxqFuIG3hu5l0IHBow7JuZyBuZ+G7pw0KDQotIFRyb25nIHRyxrDhu51uZyBo4bujcCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgZ2nDoSB0cuG7iyDOsjM9MC44MDExIGNobyB0aOG6pXkgcuG6sW5nIG5o4buvbmcgbmfDtGkgbmjDoCBjw7Mga2h1IGdp4bqjaSB0csOtIGPDsyBvZGRzIGNhbyBoxqFuIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIGtodSBnaeG6o2kgdHLDrS4gT2RkcyBj4bunYSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIGtodSBnaeG6o2kgdHLDrSBjYW8gaMahbiAyLDIyOSBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nw7RpIG5ow6Aga2jDtG5nIGPDsyBraHUgZ2nhuqNpIHRyw60NCg0KKipLaeG7g20gxJHhu4tuaCBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oKioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QvIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogTcO0IGjDrG5oIGtow7RuZyBwaMO5IGjhu6NwDQoNCiRIXzEkOiBNw7QgaMOsbmggcGjDuSBo4bujcA0KDQpgYGB7cn0NCmxyX3Rlc3QgPC0gYW5vdmEobG9naXQsIHRlc3QgPSAiQ2hpc3EiKQ0KcF92YWx1ZSA8LSBscl90ZXN0JFByWzJdIA0KcF92YWx1ZQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgUC12YWx1ZSBcPCAwLDA1IHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCBuw6puIG3DtCBow6xuaCBMb2dpdCBsw6AgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdS4NCg0KIyMjIE3DtCBow6xuaCBo4buTaSBxdXkgY2xvZ2xvZw0KDQpE4bqhbmcgdOG7lW5nIHF1w6F0Og0KDQokJGNsb2dsb2coz4ApPWxvZyjiiJJsb2coMeKIks+AKSk9zrJfMCvOsl8xWF8xK86yXzJYXzIr4ouvK86yX2tYX2skJA0KDQpgYGB7cn0NCmNsb2dsb2cgPC0gZ2xtKCBwcmljZSB+IHByZWZlciArIGJlZHJvb21zICsgcmVjcmVhdGlvbiAgLCBmYW1pbHk9IGJpbm9taWFsKCBsaW5rID0gJ2Nsb2dsb2cnKSwgZGF0YT1QbWFob2EpDQpzdW1tYXJ5KGNsb2dsb2cpDQoNCmBgYA0KDQpW4bqteSBuw6puIG3DtCBow6xuaCBjbG9nbG9nIMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBuaMawIHNhdToNCg0KJGNsb2dsb2coXHBpKSA9IC01LjA0MzcgKyAwLjYyODNwcmVmZXIgKyAwLjgxNDJiZWRyb29tcyArIDAuNjk3NXJlY3JlYXRpb24kDQoNCioqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyoqDQoNCi0gSOG7hyBz4buRIM6yMSA9IDAsNjI4MyBjaG8gdGjhuqV5IHLhurFuZyBu4bq/dSBuZ8O0aSBuaMOgIMSRxrDhu6NjIG7hurFtIHRyb25nIHbhu4sgdHLDrSB0cnVuZyB0w6JtIHRow6BuaCBwaOG7kSB0aMOsIGdpw6EgYsOhbiBuZ8O0aSBuaMOgIHPhur0gY2FvIGjGoW4gbmjhu69uZyBuZ8O0aSBuaMOgIOG7nyB24buLIHRyw60gY8OhY2ggeGEgdGjDoG5oIHBo4buRLg0KDQotIEjhu4cgc+G7kSDOsjIgPSAwLjgxNDIgY2hvIHRo4bqleSBy4bqxbmcga2hpIG5o4buvbmcgbmfDtGkgbmjDoCBjw7Mgbmhp4buBdSBwaMOybmcgbmfhu6cgdGjDrCAgbeG7qWMgZ2nDoSBiw6FuIG5nw7RpIG5ow6Agc+G6vSBjYW8gaMahbiBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHPhu5EgbMaw4bujbmcgw610IHBow7JuZyBuZ+G7pyBjw7MgbeG7qWMgZ2nDoSBiw6FuIHRo4bqlcC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIG5o4buvbmcgbmfDtGkgbmjDoCBjw7Mgbmhp4buBdSBwaMOybmcgbmfhu6cgdGjDrCBjw7MgZ2nDoSBiw6FuIGNhby4NCg0KLSBI4buHIHPhu5EgzrIzID0gMC42OTc1IGNobyB0aOG6pXkgcuG6sW5nIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIHRow6wgZ2nDoSBiw6FuIG5nw7RpIG5ow6Agc+G6vSBjw7MgbeG7qWMgZ2nDoSBiw6FuIGNhbyBoxqFuIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSBz4bq9IGPDsyBt4bupYyBnacOhIGLDoW4gdGjhuqVwDQoNCipLaeG7g20gxJHhu4tuaCBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dC8gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBNw7QgaMOsbmgga2jDtG5nIHBow7kgaOG7o3ANCg0KJEhfMSQ6IE3DtCBow6xuaCBwaMO5IGjhu6NwDQoNCmBgYHtyfQ0KbHJfdGVzdCA8LSBhbm92YShjbG9nbG9nLCB0ZXN0ID0gIkNoaXNxIikNCnBfdmFsdWUgPC0gbHJfdGVzdCRQclsyXSANCnBfdmFsdWUNCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IFAtdmFsdWUgXDwgMCwwNSB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgbsOqbiBtw7QgaMOsbmggQ2xvZ2RvZyBsw6AgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdS4NCg0KIyMjIE3DtCBow6xuaCBo4buTaSBxdXkgcHJvYml0DQoNCkThuqFuZyB04buVbmcgcXXDoXQ6DQoNCiQkcHJvYml0KM+AKT3Opigx4oiSz4ApKT3Osl8wK86yXzFYXzErzrJfMlhfMivii68rzrJfa1hfayQkDQoNCmBgYHtyfQ0KcHJvYml0IDwtIGdsbSggcHJpY2UgfiBwcmVmZXIgKyBiZWRyb29tcyArIHJlY3JlYXRpb24gLCBmYW1pbHk9IGJpbm9taWFsKCBsaW5rID0gJ3Byb2JpdCcpLCBkYXRhPVBtYWhvYSkNCnN1bW1hcnkocHJvYml0KQ0KYGBgDQoNClbhuq15IG7Dqm4gbcO0IGjDrG5oIHByb2JpdCDEkcaw4bujYyB4w6FjIMSR4buLbmggbmjGsCBzYXU6DQoNCiRwcm9iaXQoXHBpKSA9IC0zLjExOTQgKyAwLjM3NTJwcmVmZXIgKyAwLjU0NDBiZWRyb29tcyArIDAuNDQ1NnJlY3JlYXRpb24kDQoNCkjhu4cgc+G7kSDOsjAgPSAtMy4xMTk0IGNobyBiaeG6v3QgcuG6sW5nLCBjaMOqbmggbMOqY2ggdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgZ2nDoSBiw6FuIGNhbyBzbyB24bubaSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIGdpw6EgdGjhuqVwIGzDoCDOpigtMywxMTk0KQ0KDQpI4buHIHPhu5EgzrIxID0gMC4zNzUyIGPDsyDDvSBuZ2jEqWEgbMOgIHRyb25nIHRyxrDhu51uZyBo4bujcCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSB0aMOsIGNow6puaCBs4buHY2ggdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCDEkcaw4bujYyBu4bqxbSDhu58gduG7iyB0csOtIHRydW5nIHTDom0gduG7m2kgbmjhu69uZyBuZ8O0aSBuaMOgIOG7nyB24buLIHRyw60gY8OhY2ggeGEgdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgdGjDrCB4w6FjIHN14bqldCBuaOG7r25nIG5nw7RpIG5ow6AgxJHGsOG7o2MgbuG6sW0g4bufIHRydW5nIHTDom0gY8OzIG3hu6ljIGdpw6EgYsOhbiBjYW8gY2FvIGjGoW4gbmjhu69uZyBuZ8O0aSBuaMOgIOG7nyBjw6FjaCB4YSB0aMOgbmggcGjhu5EgY8OzIG3hu6ljIGdpw6EgYsOhbiB0aOG6pXAgDQoNCkjhu4cgc+G7kSDOsjIgPSAwLjU0NDAgY8OzIMO9IG5naMSpYSBsw6AgdHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpIHRow6wgY2jDqm5oIGzhu4djaCB04bu3IGzhu4cgbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBz4buRIGzGsOG7o25nIHBow7JuZyBuZ+G7pyBuaGnhu4F1ICB24bubaSBuaOG7r25nIG5nw7RpIG5ow6AgY8OzIHPhu5EgbMaw4bujbmcgcGjDsm5nIG5n4bunIMOtdCB0aMOsIHjDoWMgc3XhuqV0IG5o4buvbmcgbmfDtGkgbmjDoCBjw7Mgbmhp4buBdSBwaMOybmcgbmfhu6cgY8OzIG3hu6ljIGdpw6EgYsOhbiBjYW8gY2FvIGjGoW4gbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyDDrXQgcGjDsm5nIG5n4bunIGPDsyBt4bupYyBnacOhIGLDoW4gdGjhuqVwIA0KDQpI4buHIHPhu5EgzrIzID0gMC40NDU2IGPDsyDDvSBuZ2jEqWEgbMOgIHRyb25nIHRyxrDhu51uZyBo4bujcCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSB0aMOsIGNow6puaCBs4buHY2ggdOG7tyBs4buHIG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIHbhu5tpIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSB0aMOsIHjDoWMgc3XhuqV0IG5o4buvbmcgbmfDtGkgbmjDoCBjw7MgcGjDsm5nIGdp4bqjaSB0csOtIGPDsyBt4bupYyBnacOhIGLDoW4gY2FvIGNhbyBoxqFuIG5o4buvbmcgbmfDtGkgbmjDoCBraMO0bmcgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSBjw7MgbeG7qWMgZ2nDoSBiw6FuIHRo4bqlcCANCg0KKktp4buDbSDEkeG7i25oIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmgqDQoNCkPhurdwIGdp4bqjIHRodXnhur90LyDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IE3DtCBow6xuaCBraMO0bmcgcGjDuSBo4bujcA0KDQokSF8xJDogTcO0IGjDrG5oIHBow7kgaOG7o3ANCg0KYGBge3J9DQpscl90ZXN0IDwtIGFub3ZhKHByb2JpdCwgdGVzdCA9ICJDaGlzcSIpDQpwX3ZhbHVlIDwtIGxyX3Rlc3QkUHJbMl0gDQpwX3ZhbHVlDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBQLXZhbHVlIFw8IDAsMDUgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkIG7Dqm4gbcO0IGjDrG5oIFByb2JpdCBsw6AgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdS4NCg0KIyMjIE1hIHRy4bqtbiBuaOG6p20gbOG6q24NCg0KKipNYSB0cuG6rW4gbmjhuqdtIGzhuqtuIGPhu6dhIG3DtCBow6xuaCBMb2dpdCoqDQoNCmBgYHtyfQ0KcHJlZGljdGxvZ2l0IDwtIHByZWRpY3QuZ2xtKGxvZ2l0LCB0eXBlPSJyZXNwb25zZSIpDQoNCnByZWRpY3RlZGxvZ2l0IDwtIGlmZWxzZShwcmVkaWN0bG9naXQgPiAgMC41LCAiMSIsICIwIikNCg0KIyBU4bqhbyBjb25mdXNpb24gbWF0cml4IMSR4buDIMSRw6FuaCBnacOhIGhp4buHdSBzdeG6pXQNCmNvbmZ1c2lvbk1hdHJpeCh0YWJsZShQcmVkaWN0ZWQgPSBmYWN0b3IocHJlZGljdGVkbG9naXQsIGxldmVscyA9IGMoIjEiLCIwIikpLCBBY3R1YWwgPSBmYWN0b3IoUG1haG9hJHByaWNlLCBsZXZlbHMgPSBjKCIxIiwiMCIpKSkpDQpgYGANCg0KKipNYSB0cuG6rW4gbmjhuqdtIGzhuqtuIGPhu6dhIG3DtCBow6xuaCBQcm9iaXQqKg0KDQpgYGB7cn0NCnByZWRpY3Rwcm9iaXQgPC0gcHJlZGljdC5nbG0ocHJvYml0LCB0eXBlPSJyZXNwb25zZSIpDQoNCnByZWRpY3RlZHByb2JpdCA8LSBpZmVsc2UocHJlZGljdHByb2JpdCA+ICAwLjUsICIxIiwgIjAiKQ0KDQojIFThuqFvIGNvbmZ1c2lvbiBtYXRyaXggxJHhu4MgxJHDoW5oIGdpw6EgaGnhu4d1IHN14bqldA0KY29uZnVzaW9uTWF0cml4KHRhYmxlKFByZWRpY3RlZCA9IGZhY3RvcihwcmVkaWN0ZWRwcm9iaXQsIGxldmVscyA9IGMoIjEiLCIwIikpLCBBY3R1YWwgPSBmYWN0b3IoUG1haG9hJHByaWNlLCBsZXZlbHMgPSBjKCIxIiwiMCIpKSkpDQpgYGANCg0KDQoqKk1hIHRy4bqtbiBuaOG6p20gbOG6q24gY+G7p2EgbcO0IGjDrG5oIENsb2dkb2cqKg0KYGBge3J9DQpwcmVkaWN0Y2xvZ2xvZyA8LSBwcmVkaWN0LmdsbShjbG9nbG9nLCB0eXBlPSJyZXNwb25zZSIpDQoNCnByZWRpY3RlZGNsb2dsb2cgPC0gaWZlbHNlKHByZWRpY3RjbG9nbG9nID4gIDAuNSwgIjEiLCAiMCIpDQoNCiMgVOG6oW8gY29uZnVzaW9uIG1hdHJpeCDEkeG7gyDEkcOhbmggZ2nDoSBoaeG7h3Ugc3XhuqV0DQpjb25mdXNpb25NYXRyaXgodGFibGUoUHJlZGljdGVkID0gZmFjdG9yKHByZWRpY3RlZGNsb2dsb2csIGxldmVscyA9IGMoIjEiLCIwIikpLCBBY3R1YWwgPSBmYWN0b3IoUG1haG9hJHByaWNlLCBsZXZlbHMgPSBjKCIxIiwiMCIpKSkpDQpgYGANCg0KUXVhIGvhur90IHF14bqjIG1hIHRy4bqtbiBuaOG6p20gbOG6q24gY+G7p2EgYmEgbcO0IGjDrG5oIGxvZ2l0LCBwcm9iaXQgdsOgIGNsb2dkb2csIHTDtGkgbmjhuq1uIHRo4bqleSBr4bq/dCBxdeG6oyBj4bunYSBiYSBtw7QgaMOsbmggdMawxqFuZyDEkeG7k25nIHbhu5tpIG5oYXUuIEPhuqMgYmEgbWEgdHLhuq1uIG5o4bqnbSBs4bqrbiDEkWnhu4F1IGNo4buJIHJhIGPDsyA0Nzkgc+G7kSBs4bqnbiBtw7QgaMOsbmggZOG7sSDEkW/DoW4gxJHDum5nIGzDoCBnacOhIGLDoW4gbmjDoC4gTeG6t3Qga2jDoWMsIGPDsyA2MiBs4bqnbiBtw7QgaMOsbmggZOG7sSDEkW/DoW4gc2FpIMSR4buRaSB24bubaSBt4bupYyBnacOhIGLDoW4gbmjDoCB04burIDEwMDAwMCB0cuG7nyBsw6puIHbDoCBraG/huqNuZyAzIGzhuqduIG3DtCBow6xuaCBk4buxIMSRb8OhbiBzYWkgZ2nDoSBiw6FuIGTGsOG7m2kgMTAwMDAwLiBT4buRIGzhuqduIG3DtCBow6xuaCBk4buxIMSRb8OhbiDEkcO6bmcg4bufIG3hu6ljIGzGsMahbmcgdHJ1bmcgbMOgIDEgbOG6p24uIEvhur90IHF14bqjIGPFqW5nIGNo4buJIHJhIHThu7cgbOG7hyBtw7QgaMOsbmggZOG7sSDEkW/DoW4gxJHDum5nIGzDoCA4OCwwNyUuDQoNCiMjIyBDw6FjIGNo4buJIHRpw6p1IMSRw6FuaCBnacOhIG3DtCBow6xuaA0KDQotICAgQUlDIC0gQWthaWtlIEluZm9ybWF0aW9uIENyaXRlcmlvbjoNCg0KYGBge3J9DQpBSUMobG9naXQpDQpgYGANCg0KYGBge3J9DQpBSUMocHJvYml0KQ0KYGBgDQoNCmBgYHtyfQ0KQUlDKGNsb2dsb2cpDQpgYGANCg0KVOG7qyBjaOG7iSBz4buRIEFJQyBj4bunYSAzIG3DtCBow6xuaCB0csOqbiB0YSB0aOG6pXkgbcO0IGjDrG5oIHByb2JpdCBjw7MgY2jhu4kgc+G7kSBBSUMgdGjhuqVwIG5o4bqldCAoMzUzLjk0NDUpLiBWw6wgdGjhur8gxJHhu5FpIHbhu5tpIHRpw6p1IGNow60gxJHDoW5oIGdpw6EgQUlDIHRow6wgbcO0IGjDrG5oIHByb2JpdCBsw6AgcGjDuSBo4bujcCDEkeG7gyB4ZW0geMOpdCBz4buxIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhur9uIGJp4bq/biBwaOG7pSB0aHXhu5ljIFByaWNlIGjGoW4gbcO0IGjDrG5oIGxvZ2l0IHbDoCBjbG9nbG9nLg0KDQotICAgRGV2aWFuY2UNCg0KYGBge3J9DQpkZXZpYW5jZShsb2dpdCkNCmBgYA0KDQpgYGB7cn0NCmRldmlhbmNlKHByb2JpdCkNCg0KYGBgDQoNCmBgYHtyfQ0KZGV2aWFuY2UoY2xvZ2xvZykNCg0KYGBgDQoNClThu6sgY2jhu4kgc+G7kSBkZXZpYW5jZSBj4bunYSAzIG3DtCBow6xuaCB0csOqbiB0YSB0aOG6pXkgbcO0IGjDrG5oIHByb2JpdCBjw7MgY2jhu4kgc+G7kSBkZXZpYW5jZSB0aOG6pXAgbmjhuqV0ICgzNDUuOTQ0NSkuIFbDrCB0aOG6vyDEkeG7kWkgduG7m2kgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBkZXZpZW5jZSB0aMOsIG3DtCBow6xuaCBwcm9iaXQgbMOgIHBow7kgaOG7o3AgxJHhu4MgeGVtIHjDqXQgc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIMSR4bq/biBiaeG6v24gcGjhu6UgdGh14buZYyBQcmljZSBoxqFuIG3DtCBow6xuaCBsb2dpdCB2w6AgY2xvZ2xvZy4NCg0KLSAgIEJyaWVyIFNjb3JlDQoNCmBgYHtyfQ0KQnJpZXJTY29yZShsb2dpdCkNCg0KYGBgDQoNCmBgYHtyfQ0KQnJpZXJTY29yZShwcm9iaXQpDQoNCmBgYA0KDQpgYGB7cn0NCkJyaWVyU2NvcmUoY2xvZ2xvZykNCg0KYGBgDQoNClThu6sgY2jhu4kgc+G7kSBCcmllclNjb3JlIGPhu6dhIDMgbcO0IGjDrG5oIHRyw6puIHRhIHRo4bqleSBtw7QgaMOsbmggcHJvYml0IGPDsyBjaOG7iSBz4buRIEJyaWVyU2NvcmUgdGjhuqVwIG5o4bqldCAoMC4wOTQzMjI1NCkuIFbDrCB0aOG6vyDEkeG7kWkgduG7m2kgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBCcmllclNjb3JlIHRow6wgbcO0IGjDrG5oIHByb2JpdCBsw6AgcGjDuSBo4bujcCDEkeG7gyB4ZW0geMOpdCBz4buxIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhur9uIGJp4bq/biBwaOG7pSB0aHXhu5ljIFByaWNlIGjGoW4gbcO0IGjDrG5oIExvZ2l0IHbDoCBDbG9nbG9nLg0KDQoqKlRow7RuZyBxdWEgY8OhYyB0acOqdSBjaMOtIMSRw6FuaCBnacOhIG3DtCBow6xuaCBBSUMsIERldmlhbmNlIHbDoCBCcmllclNjb3JlIHRow6wgbcO0IGjDrG5oIHBow7kgaOG7o3AgbmjhuqV0IMSR4buDIHhlbSB4w6l0IHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgUHJlZmVyLCBCZWRyb29tcywgUmVjcmVhdGlvbiB04bubaSBiaeG6v24gcGjhu6UgdGh14buZYyBQcmljZSBsw6AgbcO0IGjDrG5oIGjhu5NpIHF1eSBQcm9iaXQqKg0KDQojIyMgS+G6v3QgcXXhuqMgbcO0IGjDrG5oIHNhdSBraGkgbOG7sWEgY2jhu41uDQoNCmBgYHtyfQ0Kc3VtbWFyeShwcm9iaXQpDQpgYGANCg0KKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjIGPhu6dhIG3DtCBow6xuaCBQcm9iaXQqKg0KDQotICAgTmjhu69uZyBuZ8O0aSBuaMOgIMSRxrDhu6NjIG7hurFtIOG7nyB24buLIHRyw60gdHJ1bmcgdMOibSB0aMOgbmggcGjhu5EgY8OzIHTDoWMgxJHhu5luZyDEkeG6v24gbeG7qWMgZ2nDoSBiw6FuIGPhu6dhIG5nw7RpIG5ow6AgduG7m2kgaOG7hyBz4buRIM6yID0gMC4zNzUyLiBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIG5o4buvbmcgbmfDtGkgbmjDoCDEkcaw4bujYyBu4bqxbSDhu58gduG7iyB0csOtIHRydW5nIHTDom0gdGjDoG5oIHBo4buRIGPDsyB0w6FjIMSR4buZbmcgY8O5bmcgY2hp4buBdSDEkeG6v24gbeG7qWMgZ2nDoSBiw6FuIGPhu6dhIG5nw7RpIG5ow6AuDQoNCi0gICBT4buRIGzGsOG7o25nIHBow7JuZyBuZ+G7pyBj4bunYSBuZ8O0aSBuaMOgIGPDsyB0w6FjIMSR4buZbmcgxJHhur9uIG3hu6ljIGdpw6EgYsOhbiBj4bunYSBuZ8O0aSBuaMOgIHbhu5tpIGjhu4cgc+G7kSDOsiA9IDAuNTQ0MC4gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBz4buRIGzGsOG7o25nIHBow7JuZyBuZ+G7pyBj4bunYSBuZ8O0aSBuaMOgIGPDsyB0w6FjIMSR4buZbmcgY8O5bmcgY2hp4buBdSDEkeG6v24gbeG7qWMgZ2nDoSBiw6FuIGPhu6dhIG5nw7RpIG5ow6AuDQoNCi0gICBOaOG7r25nIG5nw7RpIG5ow6AgY8OzIHBow7JuZyBnaeG6o2kgdHLDrSBjw7MgdMOhYyDEkeG7mW5nIMSR4bq/biBt4bupYyBnacOhIGLDoW4gY+G7p2EgbmfDtGkgbmjDoCB24bubaSBo4buHIHPhu5EgzrIgPSAwLjQ0NTYuIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgbmjhu69uZyBuZ8O0aSBuaMOgIGPDsyBwaMOybmcgZ2nhuqNpIHRyw60gY8OzIHTDoWMgxJHhu5luZyBjw7luZyBjaGnhu4F1IMSR4bq/biBt4bupYyBnacOhIGLDoW4gY+G7p2EgbmfDtGkgbmjDoC4NCg0KIyBL4bq+VCBMVeG6rE4NCg0KTmdoacOqbiBj4bupdSDEkcOjIHjDoWMgxJHhu4tuaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgbmjDoCB04bqhaSBXaW5kb3IsIENhbmFkYSB0cm9uZyBuxINtIDE5ODcgdGjDtG5nIHF1YSBwaMOibiB0w61jaCBz4buRIGxp4buHdSBi4bqxbmcgcGjGsMahbmcgcGjDoXAgdGjhu5FuZyBrw6ogdG/DoW4gaOG7jWMsIHPhu60gZOG7pW5nIHBo4bqnbiBt4buBbSBSc3R1ZGlvLCBwaMOibiB0w61jaCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oLiBDw6FjIGvhur90IHF14bqjIGNow61uaCBjaG8gdGjhuqV5IGPDoWMgYmnhur9uIMSR4buBdSBjw7MgdMOhYyDEkeG7mW5nIHTDrWNoIGPhu7FjIMSR4bq/biBnacOhIG5ow6AuIE5nb8OgaSByYSwgduG7iyB0csOtIGPhu6dhIG5ow6AgY8WpbmcgbMOgIG3hu5l0IHnhur91IHThu5EgcXVhbiB0cuG7jW5nIMSR4buRaSB24bubaSBjw6FjIG5ow6AgbuG6sW0gdHJvbmcga2h1IHbhu7FjIMawdSB0acOqbiBjw7MgZ2nDoSBjYW8gaMahbi4gVHV5IG5oacOqbiwgbmdoacOqbiBj4bupdSBjw7JuIG3hu5l0IHPhu5EgaOG6oW4gY2jhur8gbmjGsCBk4buvIGxp4buHdSBjaOG7iSBk4buxYSB0csOqbiBuxINtIDE5ODcgdOG6oWkgV2luZHNvciwgQ2FuYWRhIHbDoCBwaMawxqFuZyBwaMOhcCBo4buTaSBxdXkgdHV54bq/biB0w61uaC4NCg0KVuG7m2kgbeG7pWMgdGnDqnUgcGjDom4gdMOtY2ggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBnacOhIGPhu6dhIG5nw7RpIG5ow6AsIG5naGnDqm4gY+G7qXUgc+G7rSBk4bulbmcgZOG7ryBsaeG7h3UgcXXDoSBraOG7qSDEkcaw4bujYyB0csOtY2ggeHXhuqV0IHThu6sgLiBTYXUga2hpIHRoxrBjIGhp4buHbiBo4buTaSBxdXkgdsOgIGzhu7FhIGNo4buNbiBtw7QgaMOsbmggcGjDuSBo4bujcCBuaOG6pXQgdHJvbmcgMyBtw7QgaMOsbmguIEvhur90IHF14bqjIGNobyB0aOG6pXkgbcO0IGjDrG5oIHBow7kgaOG7o3AgbmjhuqV0IGzDoCBtw7QgaMOsbmggaOG7k2kgcXV5IGjDoG0gcHJvYml0Lg0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IG3hu6ljIGdpw6EgYsOhbiBuaMOgIGNo4buLdSBuaGnhu4F1IHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSBn4buTbTogU+G7kSBsxrDhu6NuZyBwaMOybmcgbmfhu6csIFbhu4sgdHLDrSBj4bunYSBuZ8O0aSBuaMOgIHbDoCBUaeG7h24gbmdoaSBj4bunYSBuZ8O0aSBuaMOgIMSRw7MuDQoNClF1YSBr4bq/dCBxdeG6oyBo4buTaSBxdXkgdGEgY8OgbmcgdGjhuqV5IHLDtSDEkcaw4bujYyB04bqnbSBxdWFuIHRy4buNbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggbXVhIG5ow6AgxJHhu5FpIHbhu5tpIGPDoWMgbmjDoCDEkeG6p3UgdMawLCDEkWnhu4F1IG7DoHkgZ2nDunAgY2hvIHRo4buLIHRyxrDhu51uZyBi4bqldCDEkeG7mW5nIHPhuqNuIGPDsyBjw6FjIMSR4buLbmggaMaw4bubbmcgY+G7pSB0aOG7gyB0cm9uZyB0xrDGoW5nIGxhaS4NCg0KIyBLSeG6vk4gTkdI4buKDQoNCkPDoWMgbmjDoCDEkeG6p3UgdMawIG7Dqm4gdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIGtodSB24buxYyDGsHUgdGnDqm4gdsOgIGPDoWMgbmjDoCBjw7MgZGnhu4duIHTDrWNoIGzhu5tuLCBuaGnhu4F1IHBow7JuZyBuZ+G7pywgcGjDsm5nIHThuq9tIHbDoCBjw6FjIHRp4buHbiBuZ2hpIGPhuqduIHRoaeG6v3QgxJHhu4MgdOG7kWkgxrB1IGjDs2EgbOG7o2kgbmh14bqtbiDEkeG6p3UgdMawLiBOZ8aw4budaSBtdWEgbmjDoCBuw6puIHhlbSB4w6l0IGvhu7kgbMaw4buhbmcgY8OhYyB0aeG7h24gbmdoaSB2w6AgduG7iyB0csOtIGPhu6dhIG5ow6AgxJHhu4MgxJHhuqNtIGLhuqNvIGNo4bqldCBsxrDhu6NuZyBz4buRbmcgdOG7kXQgaMahbiB2w6AgZ2nDoSB0cuG7iyBi4bqldCDEkeG7mW5nIHPhuqNuIHRyb25nIHTGsMahbmcgbGFpLiDEkOG7kWkgduG7m2kgbmjDoCBob+G6oWNoIMSR4buLbmggY2jDrW5oIHPDoWNoLCBjaMOtbmggcGjhu6cgbsOqbiDEkeG6p3UgdMawIHbDoG8gY8ahIHPhu58gaOG6oSB04bqnbmcgdsOgIHRp4buHbiDDrWNoIGPDtG5nIGPhu5luZywgY8WpbmcgbmjGsCBo4buXIHRy4bujIHBow6F0IHRyaeG7g24gY8OhYyBuZ8O0aSBuaMOgIHRyb25nIGPDoWMga2h1IHbhu7FjIMawdSB0acOqbiDEkeG7gyDhu5VuIMSR4buLbmggdsOgIHTEg25nIGdpw6EgdHLhu4sgdGjhu4sgdHLGsOG7nW5nIGLhuqV0IMSR4buZbmcgc+G6o24uIE5o4buvbmcga+G6v3QgcXXhuqMgdsOgIGtp4bq/biBuZ2jhu4sgY2jDrW5oIHPDoWNoIHRyb25nIHZp4buHYyDEkcawYSByYSBjw6FjIHF1eeG6v3QgxJHhu4tuaCBzw6FuZyBzdeG7kXQsIG3DoCBjw7JuIMSRw7NuZyBnw7NwIHbDoG8gdmnhu4djIOG7lW4gxJHhu4tuaCB2w6AgcGjDoXQgdHJp4buDbiB0aOG7iyB0csaw4budbmcgYuG6pXQgxJHhu5luZyBz4bqjbiwgxJHhuqNtIGLhuqNvIGNo4bqldCBsxrDhu6NuZyBjdeG7mWMgc+G7kW5nIGNobyBj4buZbmcgxJHhu5NuZy4NCg0KIyBUw4BJIExJ4buGVSBUSEFNIEtI4bqiTw0KDQoxLiAgVHLhuqduIEtpbSBUaGFuaCwgVHLhuqduIE3huqFuaCBUxrDhu51uZywgVsWpIEFuaCBMaW5oIER1eTogIkdpw6FvIHRyw6xuaCBQaMOibiB0w61jaCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5oIiwgdHLGsOG7nW5nIMSQ4bqhaSBo4buNYyBUw6BpIGNow61uaCAtIE1hcmtldGluZywgVGjDoG5oIHBo4buRIEjhu5MgQ2jDrSBNaW5oLg0K