10:24:11, 27 - 01 - 2024

NHIỆM VỤ 3.1


1. GIỚI THIỆU CHI TIẾT VỀ BỘ DỮ LIỆU

1.1 TÓM TẮT BỘ DỮ LIỆU

Bộ dữ liệu “population-and-demography.csv” là một nguồn thông tin quan trọng về dân số của các quốc gia và khu vực trên thế giới. Các biến quan trọng bao gồm tên quốc gia, năm quan sát, và các thông số dân số chi tiết theo độ tuổi khác nhau từ năm 1950 đến năm 2021.

1.2 THÔNG TIN CHI TIẾT CỦA BỘ DỮ LIỆU

Trước tiên để đọc về bộ dữ liệu từ một tệp CSV vào trong R, ta có thể thực hiện bằng các câu lệnh sau:

#Sử dụng lệnh read.csv đọc dữ liệu từ file csv vào R và gán vào "danso"
danso <- read.csv(file = "C:/Users/HP/Downloads/population-and-demography.csv")

Để đọc mô tả chi tiết về cấu trúc của bộ dữ liệu ta sử dụng câu lệnh str

#Sử dụng lệnh str để xem cấu trúc của bộ dữ liệu "danso"
str(danso)
## 'data.frame':    18288 obs. of  24 variables:
##  $ Country                                   : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ Year                                      : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ Population                                : num  7480464 7571542 7667534 7764549 7864289 ...
##  $ Population.of.children.under.the.age.of.1 : num  301735 299368 305393 311574 317584 ...
##  $ Population.of.children.under.the.age.of.5 : int  1248282 1246857 1248220 1254725 1267817 1291129 1322342 1354752 1387274 1421808 ...
##  $ Population.of.children.under.the.age.of.15: int  3068855 3105444 3145070 3186382 3231060 3281470 3337026 3396048 3455343 3518528 ...
##  $ Population.under.the.age.of.25            : num  4494349 4552138 4613604 4676232 4741371 ...
##  $ Population.aged.15.to.64.years            : num  4198587 4250002 4303436 4356242 4408474 ...
##  $ Population.older.than.15.years            : num  4411609 4466098 4522464 4578167 4633229 ...
##  $ Population.older.than.18.years            : num  3946595 3993640 4041439 4088379 4136116 ...
##  $ Population.at.age.1                       : num  258652 254304 252906 258717 264765 ...
##  $ Population.aged.1.to.4.years              : num  946547 947489 942827 943151 950233 ...
##  $ Population.aged.5.to.9.years              : int  966210 991791 1017993 1039950 1055592 1062420 1063212 1065357 1071666 1084972 ...
##  $ Population.aged.10.to.14.years            : int  854363 866796 878857 891707 907651 927921 951472 975939 996403 1011748 ...
##  $ Population.aged.15.to.19.years            : int  757113 768616 781411 794308 806216 817550 828600 839588 851433 867048 ...
##  $ Population.aged.20.to.29.years            : int  1241348 1260904 1280288 1298803 1316768 1334989 1353958 1374043 1393789 1414034 ...
##  $ Population.aged.30.to.39.years            : int  909953 922765 935638 948321 961484 975801 991166 1007440 1023595 1040441 ...
##  $ Population.aged.40.to.49.years            : int  661807 667015 672491 678064 684153 691279 699431 708537 717938 728233 ...
##  $ Population.aged.50.to.59.years            : int  467170 468881 470898 472969 475117 477664 480665 484018 487393 491447 ...
##  $ Population.aged.60.to.69.years            : int  271905 273286 274852 276577 278210 279789 281376 282918 284592 286551 ...
##  $ Population.aged.70.to.79.years            : int  92691 94358 96026 97705 99298 100839 102385 103932 105508 107136 ...
##  $ Population.aged.80.to.89.years            : int  9499 10155 10721 11254 11793 12342 12890 13428 13959 14495 ...
##  $ Population.aged.90.to.99.years            : int  123 118 139 166 190 210 233 255 277 307 ...
##  $ Population.older.than.100.years           : num  0 0 0 0 0 0 0 0 0 0 ...

Giải thích kết quả mà câu lệnh trả về

  • ‘data.frame’: 18288 obs. of 24 variables: Đây là bộ dữ liệu data frame, bao gồm 18288 quan sát - obs (tương ứng với 18288 hàng trong file CSV) và 24 biến - variables (tương ứng với 24 cột trong file CSV)
  • CỘT 1 là tên các biến ứng với hàng ngang đầu tiên trong file CSV.
    • Country.name: Tên quốc gia
    • Year: Năm quan sát
    • Population: Tổng dân số của quốc gia
    • Population.of.children.under.the.age.of.1: Dân số của trẻ em có độ tuổi dưới 1
    • Population.of.children.under.the.age.of.5: Dân số của trẻ em có độ tuổi dưới 5
    • Population.of.children.under.the.age.of.15: Dân số của trẻ em có độ tuổi dưới 15
    • Population.under.the.age.of.25: Dân số có độ tuổi dưới 25
    • Population.aged.15.to.64.years: Dân số có độ tuổi từ 15 đến 64
    • Population.older.than.15.years: Dân số có độ tuổi lớn hơn 15
    • Population.older.than.18.years: Dân số có độ tuổi lớn hơn 18
    • Population.at.age.1: Dân số có tuổi là 1
    • Population.aged.1.to.4.years: Dân số có độ tuổi từ 1 đến 4
    • Population.aged.5.to.9.years: Dân số có độ tuổi từ 5 đến 9
    • Population.aged.10.to.14.years: Dân số có độ tuổi từ 10 đến 14
    • Population.aged.15.to.19.years: Dân số có độ tuổi từ 15 đến 19
    • Population.aged.20.to.29.years: Dân số có độ tuổi từ 20 đến 29
    • Population.aged.30.to.39.years: Dân số có độ tuổi từ 30 đến 39
    • Population.aged.40.to.49.years: Dân số có độ tuổi từ 40 đến 49
    • Population.aged.50.to.59.years: Dân số có độ tuổi từ 50 đến 59
    • Population.aged.60.to.69.years: Dân số có độ tuổi từ 60 đến 69
    • Population.aged.70.to.79.years: Dân số có độ tuổi từ 70 đến 79
    • Population.aged.80.to.89.years: Dân số có độ tuổi từ 80 đến 89
    • Population.aged.90.to.99.years: Dân số có độ tuổi từ 90 đến 99
    • Population.older.than.100.years: Dân số có độ tuổi lớn hơn 100
  • CỘT 2 là kiểu biến, ứng với những kết quả như sau:
    • chr: Kiểu biến là ký tự
    • int”: Kiểu biến là số nguyên
    • num: Kiểu biến là sỗ thực
  • CỘT 3 là những quan sát có được.
  • Bộ dữ liệu có 1 biến định tính (ứng với cột đầu tiên trong file CSV) và 23 biến định lượng (ứng với 23 cột còn lại trong file CSV).

Kiểm tra có tất cả bao nhiêu quốc gia trong bộ dữ liệu trên bằng câu lệnh sau:

#Lập bảng tần số mà tên các quốc gia được lặp lại và gán vào soQG
soQG <- table(danso$Country) 
#Xem số lượng quốc gia được quan sát
dim(soQG)
## [1] 254

Kết quả trả về cho ta thấy có 254 quốc gia trong bộ dữ liệu.

Kiểm tra giá trị bị thiếu trong bộ dữ liệu trên bằng câu lệnh sau:

#Kiểm tra xem có bao nhiêu giá trị bị thiếu
sum(is.na(danso))
## [1] 0

Kết quả trả về cho ta thấy không có giá trị bị thiếu.

2. CHỌN VÀ PHÂN TÍCH CHI TIẾT VỀ BỘ DỮ LIỆU

Bộ dữ liệu population-and-demography.csv chứa một lượng thông tin đồ sộ, tuy nhiên chúng ta không thể dùng hết được dữ liệu thu về. Trong quá trình phân tích, chúng ta sẽ tiến hành các bước thực hiện sau đây.

2.1 CHỌN RA 5 ĐỘ TUỔI TRONG BỘ DỮ LIỆU

Ta sẽ chọn ra những biến là dân số có độ tuổi trong độ tuổi lao động là từ 1 tuổi đến 29 tuổi trên bộ dữ liệu “danso”. Ta tiến hành gọi packsge tidyverse dùng để sử dụng toán tử pipe %>%.

# Gọi ra gói tidyverse
library(tidyverse) 
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Chọn ra các biến cần thiết để xử lý
danso2 <- danso %>% select(Country, Year, Population, Population.aged.1.to.4.years, Population.aged.5.to.9.years, Population.aged.10.to.14.years, Population.aged.15.to.19.years, Population.aged.20.to.29.years)
names(danso2)
## [1] "Country"                        "Year"                          
## [3] "Population"                     "Population.aged.1.to.4.years"  
## [5] "Population.aged.5.to.9.years"   "Population.aged.10.to.14.years"
## [7] "Population.aged.15.to.19.years" "Population.aged.20.to.29.years"

Với câu lệnh trên ta hoàn tất để chọn ra biến là:

  • Country: Tên quốc gia
  • Year: Năm
  • Population: Tổng dân số
  • Population.aged.1.to.4.years: Dân số có độ tuổi từ 1 đến 4
  • Population.aged.5.to.9.years: Dân số có độ tuổi từ 5 đến 9
  • Population.aged.10.to.14.years: Dân số có độ tuổi từ 10 đến 14
  • Population.aged.15.to.19.years: Dân số có độ tuổi từ 15 đến 19
  • Population.aged.20.to.29.years: Dân số có độ tuổi từ 20 đến 29

2.2 ĐỔI TÊN CÁC BIẾN DỮ LIỆU

Ta tiến hành đổi tên biến để dễ dàng thao tác hơn

# Lệnh đổi tên biến
danso2 <- danso2 %>% rename('QG' = Country, 'Y' = Year , 'POP' = Population, 'POP1to4' = Population.aged.1.to.4.years, 'POP5to9' = Population.aged.5.to.9.years, 'POP10to14' = Population.aged.10.to.14.years, 'POP15to19' = Population.aged.15.to.19.years, 'POP20to29' = Population.aged.20.to.29.years)
names(danso2)
## [1] "QG"        "Y"         "POP"       "POP1to4"   "POP5to9"   "POP10to14"
## [7] "POP15to19" "POP20to29"

Với câu lệnh và kết quả trên thì tên biến đã được đổi tương ứng với thứ tự biến trong data danso2. ### 2.3 LỌC RA 5 QUỐC GIA TRÊN BỘ DATA DANSO2

Sau đây ta sẽ lọc ra 5 quốc gia trên bộ Data “danso2”. 5 quốc gia được chọn bao gồm: Việt Nam(Vietnam), Trung Quốc(China), Ấn Độ(India), Indonesia(Indonesia), Nga(Russia)

Ta tiến hành lọc bộ dữ liệu

danso3 <- danso2 %>% filter(QG == "Vietnam"| QG == "China"| QG == "India"| QG == "Indonesia"| QG == "Russia")   
names(danso3)
## [1] "QG"        "Y"         "POP"       "POP1to4"   "POP5to9"   "POP10to14"
## [7] "POP15to19" "POP20to29"

Với câu lệnh trên ta hoàn tất để lọc các dữ liệu từ các quốc gia Việt Nam, Trung Quốc, Ấn Độ, Indonesia, Nga.

2.4 MÃ HÓA DỮ LIỆU

Để dễ dàng hơn trong việc phân tích, chúng ta sử dụng các lệnh về mã hóa dữ liệu. Các lệnh mã hóa dữ liệu như case_when, cut(), case_matchifelse() sẽ giúp chúng ta chuyển đổi từ dữ liệu dạng này sang một dạng mới.

danso2$CoCauDanSo <- ifelse(danso2$POP10to14 > 0.1 * danso2$POP, 'Dân số trẻ', 'Dân số già')
danso2$SLDanso <- ifelse(danso2$POP > 50000000, 'Dong dan', 'thua thot')
danso2$SLDanso1 <- case_when(danso2$POP < 50000000 ~ 'thấp', danso2$POP >= 50000000 & danso2$POP < 100000000 ~ 'trung bình ', danso2$POP > 100000000 ~ 'cao' ) #3
danso2$SLDanso2 <- cut(danso2$POP, breaks = c(0, 50000000,100000000, 10000000000), labels= c('kv1', 'kv2', 'kv3')) #4

Kết quả cho biết:

  • CoCauDanSo: Tạo cột mới có tên là CoCauDanSo bằng cách sử dụng lệnh ifelse. Gán giá trị là dân số trẻ nếu giá trị của biến POP10to14 lớn hơn 0.1 lần giá trị của biến POP, ngược lại sẽ là dân số già.

  • SLDanso: Tạo cột mới có tên là SLDanso sử dụng lệnh ifelse. Gán giá trị là đông đúc nếu tổng dân số lớn hơn 5.0000.000, ngược lại sẽ là thưa thớt.

  • SLDanso1: Tạo cột mới có tên là SLDanso1 sử dụng hàm case_when để mã hóa dữ liệu thành ba nhóm: thấp nếu giá trị của biến POP nhỏ hơn 50.000.000, trung bình nếu giá trị của biến POP từ 50.000.000 đến 100.000.000, và cao nếu giá trị của biến POP lớn hơn 100.000.000.

  • SLDanso2: Tạo cột mới có tên là SLDanso2 sử dụng hàm cut để chia dữ liệu thành ba khoảng giá trị: kv1 cho giá trị từ 0 đến 50.000.000, kv2 cho giá trị từ 50.000.000 đến 100.000.000, và kv3 cho giá trị từ 100.000.000 đến 1.000.000.000.

2.5 LẬP BẢNG TẦN SỐ

2.5.1 Bảng tần số một biến

Đối với câu lệnh table(), chúng ta có khả năng xem xét tần suất xuất hiện của một biến trong tập dữ liệu. Điều này mang lại lợi ích lớn trong việc tổng hợp một lượng lớn dữ liệu thành một bảng ngắn gọn, giúp quá trình phân tích trở nên thuận tiện và dễ dàng

danso4 <- cut(danso2$POP,3)
table(danso4)

Kết quả trên cho ta biết:

Sử dụng hàm cut() để chia dữ liệu trong biến tổng dân số POP thuộc data danso2 thành 3 nhóm * (-7.91e+06,2.64e+09] xuất hiện với 18024 quan sát. * (2.64e+09,5.27e+09] xuất hiện với 209 quan sát. * (5.27e+09,7.92e+09] xuất hiện với 55 quan sát.

2.5.2 Bảng tần số nhiều biến

Với câu lệnh group_by cho phép lập bảng với nhiều biến cùng lúc.

danso5 <- danso2 %>% group_by(Y, QG, SLDanso2) %>% summarise(n= n(), .groups = 'drop')
danso5
## # A tibble: 18,288 × 4
##        Y QG                  SLDanso2     n
##    <int> <chr>               <fct>    <int>
##  1  1950 Afghanistan         kv1          1
##  2  1950 Africa (UN)         kv3          1
##  3  1950 Albania             kv1          1
##  4  1950 Algeria             kv1          1
##  5  1950 American Samoa      kv1          1
##  6  1950 Andorra             kv1          1
##  7  1950 Angola              kv1          1
##  8  1950 Anguilla            kv1          1
##  9  1950 Antigua and Barbuda kv1          1
## 10  1950 Argentina           kv1          1
## # ℹ 18,278 more rows

Kết quả trên cho thấy:

*Bảng tấn số với lệnh trên cho ra tần suất dữ liệu của các biến ‘QG’, ‘Y’, ‘SLDSo2’. Câu lệnh summarise(n= n() cho ra số n tần suất của dữ liệu và groups = ‘drop’ giúp chia nhóm dữ liệu.

2.6 TÍNH TOÁN CÁC ĐẶC TRƯNG ĐO LƯỜNG

Để đạt được tính toán chính xác và chi tiết về các đặc trưng đo lường của biến dân số (POP), chúng ta tiến hành phân tích sâu sắc trên bảng Data danso2 Qua quá trình này, chúng ta sẽ thực hiện các thao tác tính toán kỹ lưỡng, mang lại cái nhìn rõ ràng và đầy đủ về động lực và biến động của dân số trong bộ Data.

summary(danso2$POP)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 1.363e+03 2.916e+05 3.834e+06 1.265e+08 1.679e+07 7.909e+09

Kết quả cho ta biết những thông tin sau:

  • Min: Giá trị nhỏ nhất trong dữ liệu, là 1.363e+03.
  • 1st Qu. (Primer Quartile): Giá trị phân vị thứ nhất, tức là giá trị mà 25% dữ liệu nhỏ hơn và 75% dữ liệu lớn hơn. Trong trường hợp này, giá trị là 2.916e+05.
  • Median (Trung vị): Giá trị giữa của dữ liệu khi được sắp xếp tăng dần. 50% dữ liệu nhỏ hơn và 50% dữ liệu lớn hơn. Trong trường hợp này, giá trị là 3.834e+06.
  • Mean (Trung bình): Giá trị trung bình của dữ liệu, là 1.265e+08.
  • 3rd Qu. (Third Quartile): Giá trị phân vị thứ ba, tức là giá trị mà 75% dữ liệu nhỏ hơn và 25% dữ liệu lớn hơn. Trong trường hợp này, giá trị là 1.679e+07.
  • Max.: Giá trị lớn nhất trong dữ liệu, là 7.909e+09.
sum(danso2$POP) 
## [1] 2.312891e+12

Kết quả cho ta biết:

  • 2.312891e+12: là tổng của tất cả các giá trị trong biến POP của bộ dữ liệu danso2. Giá trị này thường được biểu diễn dưới dạng số thực dấu chấm động với mức độ chính xác cao.
mean(danso2$POP,na.rm = T) 
## [1] 126470437

Kết quả cho ta biết:

  • 126470437: giá trị này biểu thị giá trị trung bình của biến POP (tổng dân số) trên toàn bộ bộ dữ liệu danso2. Do đó, giá trị trung bình của dân số trong bộ dữ liệu là khoảng 126 triệu người
length(danso2$POP)
## [1] 18288

Kết quả cho ta biết:

  • 18,288 là có tổng cộng 18,288 quan sát về dân số từ các quốc gia hoặc khu vực khác nhau trong dữ liệu.
var(danso2$POP)
## [1] 3.467458e+17

Kết quả cho ta biết:

  • 3.467458e+17: là giá trị phương sai của biến POP trong bộ dữ liệu danso2. Phương sai là một đại lượng thống kê đo lường mức độ biến động của dữ liệu. Giá trị phương sai lớn cho thấy mức độ biến động của tổng dân số (biến POP) khá cao trong bộ dữ liệu, có sự chênh lệch lớn giữa các giá trị dân số của các quốc gia hoặc khu vực khác nhau.
sd(danso2$POP)
## [1] 588851231

Kết quả cho ta biết:

  • 588,851,231: là giá trị độ lệch chuẩn của biến. Độ lệch chuẩn là một đại lượng thống kê mô tả mức độ phân tán của dữ liệu xung quanh giá trị trung bình. Độ lệch chuẩn lớn cho thấy mức độ biến động của tổng dân số khá cao, với sự chênh lệch lớn giữa các giá trị dân số của các quốc gia hoặc khu vực khác nhau trong bộ dữ liệu.
median(danso2$POP)
## [1] 3833998

Kết quả cho ta biết:

  • 383,399: là giá trị trung vị (median). Trung vị là giá trị chia dữ liệu thành hai phần bằng nhau, tức là có 50% dữ liệu nằm bên trái và 50% nằm bên phải. Trung vị của tổng dân số là 3,833,998, chỉ ra rằng một nửa các quốc gia hoặc khu vực có dân số dưới giá trị này, và nửa còn lại có dân số lớn hơn giá trị này.
quantile(danso2$POP, probs = c(.3,.6,.9))
##        30%        60%        90% 
##   564010.9  6634254.0 86805434.0

Kết quả cho ta biết:

  • 30% Quantile: Giá trị mà 30% dữ liệu dân số nhỏ hơn. Trong trường hợp này, giá trị là 564,010.9, tức là 30% quốc gia hoặc khu vực có dân số dưới giá trị này.

  • 60% Quantile: Giá trị mà 60% dữ liệu dân số nhỏ hơn. Trong trường hợp này, giá trị là 6,634,254.0, chỉ ra rằng 60% quốc gia hoặc khu vực có dân số dưới giá trị này.

  • 90% Quantile: Giá trị mà 90% dữ liệu dân số nhỏ hơn. Trong trường hợp này, giá trị là 86,805,434.0, tức là 90% quốc gia hoặc khu vực có dân số dưới giá trị này.

2.7 TÍNH TOÁN CÁC ĐẶC TRƯNG ĐO LƯỜNG THEO NHÓM

Ta tiếp tục sử dụng bảng Data danso2 để thực hiện các thao tác tính toán các đặc trưng đo lường theo nhóm. Các câu lệnh này được thực hiện theo hai hay nhiều biến.

tn <- danso2 %>% group_by(Y) %>% summarise(mean_of_POP= mean(POP))
tn
## # A tibble: 72 × 2
##        Y mean_of_POP
##    <int>       <dbl>
##  1  1950   60829433.
##  2  1951   61935622.
##  3  1952   63125733.
##  4  1953   64387245.
##  5  1954   65692705.
##  6  1955   67059890.
##  7  1956   68452221.
##  8  1957   69895388.
##  9  1958   71372168.
## 10  1959   72758739.
## # ℹ 62 more rows

Kết quả cho ta biết:

  • tn: là giá trị trung bình của tổng dân số theo năm.
tn1 <- danso2 %>% group_by(Y) %>% summarise(n = n(),med_of_POP= median(POP))
tn1
## # A tibble: 72 × 3
##        Y     n med_of_POP
##    <int> <int>      <dbl>
##  1  1950   254   2077509 
##  2  1951   254   2151493 
##  3  1952   254   2221408 
##  4  1953   254   2279917 
##  5  1954   254   2317102.
##  6  1955   254   2334936 
##  7  1956   254   2352930.
##  8  1957   254   2371338.
##  9  1958   254   2390104 
## 10  1959   254   2410098.
## # ℹ 62 more rows

Kết quả cho ta biết:

  • tn1: là trung vị của tổng dân số theo năm trong đó n=n() cho biết số lần năm đó xuất hiện.
tn2 <- danso2 %>% group_by(QG) %>% summarise(mean_of_POP= mean(POP))
tn2
## # A tibble: 254 × 2
##    QG                  mean_of_POP
##    <chr>                     <dbl>
##  1 Afghanistan           16640671.
##  2 Africa (UN)          643444771.
##  3 Albania                2632759.
##  4 Algeria               23456439.
##  5 American Samoa           39194.
##  6 Andorra                  43576.
##  7 Angola                13175864.
##  8 Anguilla                  8906.
##  9 Antigua and Barbuda      68605.
## 10 Argentina             30799573.
## # ℹ 244 more rows

Kết quả cho ta biết:

  • tn2: là giá trị trung bình của tổng dân số theo từng quốc gia hay khu vực.
tn3 <- danso2 %>% group_by(Y,QG) %>% summarise(mean_of_POP= mean(POP),.groups = 'drop')
tn3
## # A tibble: 18,288 × 3
##        Y QG                  mean_of_POP
##    <int> <chr>                     <dbl>
##  1  1950 Afghanistan             7480464
##  2  1950 Africa (UN)           227549260
##  3  1950 Albania                 1252587
##  4  1950 Algeria                 9019866
##  5  1950 American Samoa            19057
##  6  1950 Andorra                    6028
##  7  1950 Angola                  4478186
##  8  1950 Anguilla                   5036
##  9  1950 Antigua and Barbuda       45456
## 10  1950 Argentina              17017748
## # ℹ 18,278 more rows

Kết quả cho ta biết:

  • tn3 là giá trị trung binh của tổng dân số theo từng năm của từng quốc gia hay khu vực.

NHIỆM VỤ 3.2


1. GIỚI THIỆU CHI TIẾT VỀ BỘ DỮ LIỆU

1.1 TÓM TẮT BỘ DỮ LIỆU

Bộ dữ liệu world_population mô tả về dân số cung cấp ước tính dân số toàn cầu, với Trung Quốc và Ấn Độ là hai quốc gia đông dân nhất. Đồng thời cũng cung cấp thông tin về dân số của 11 quốc gia đông dân, các quốc gia có dân số ít hơn và kỳ vọng tăng trưởng dân số trong tương lai. Bộ dữ liệu cũng chứa thông tin chi tiết về từng quốc gia, bao gồm diện tích, mật độ dân số, và các chỉ số khác.

1.2 THÔNG TIN CHI TIẾT CỦA BỘ DỮ LIỆU

Trước tiên để đọc về bộ dữ liệu từ một tệp CSV vào trong R, ta có thể thực hiện bằng các câu lệnh sau:

#Sử dụng lệnh read.csv đọc dữ liệu từ file csv vào R và gán vào "danso"
WPOP <- read.csv(file = "C:/Users/HP/Downloads/world_population.csv")

Để đọc mô tả chi tiết về cấu trúc của bộ dữ liệu ta sử dụng câu lệnh str

#Sử dụng lệnh str để xem cấu trúc của bộ dữ liệu "danso"
str(WPOP)
## 'data.frame':    234 obs. of  17 variables:
##  $ Rank                       : int  36 138 34 213 203 42 224 201 33 140 ...
##  $ CCA3                       : chr  "AFG" "ALB" "DZA" "ASM" ...
##  $ Country.Territory          : chr  "Afghanistan" "Albania" "Algeria" "American Samoa" ...
##  $ Capital                    : chr  "Kabul" "Tirana" "Algiers" "Pago Pago" ...
##  $ Continent                  : chr  "Asia" "Europe" "Africa" "Oceania" ...
##  $ X2022.Population           : int  41128771 2842321 44903225 44273 79824 35588987 15857 93763 45510318 2780469 ...
##  $ X2020.Population           : int  38972230 2866849 43451666 46189 77700 33428485 15585 92664 45036032 2805608 ...
##  $ X2015.Population           : int  33753499 2882481 39543154 51368 71746 28127721 14525 89941 43257065 2878595 ...
##  $ X2010.Population           : int  28189672 2913399 35856344 54849 71519 23364185 13172 85695 41100123 2946293 ...
##  $ X2000.Population           : int  19542982 3182021 30774621 58230 66097 16394062 11047 75055 37070774 3168523 ...
##  $ X1990.Population           : int  10694796 3295066 25518074 47818 53569 11828638 8316 63328 32637657 3556539 ...
##  $ X1980.Population           : int  12486631 2941651 18739378 32886 35611 8330047 6560 64888 28024803 3135123 ...
##  $ X1970.Population           : int  10752971 2324731 13795915 27075 19860 6029700 6283 64516 23842803 2534377 ...
##  $ Area..km..                 : int  652230 28748 2381741 199 468 1246700 91 442 2780400 29743 ...
##  $ Density..per.km..          : num  63.1 98.9 18.9 222.5 170.6 ...
##  $ Growth.Rate                : num  1.026 0.996 1.016 0.983 1.01 ...
##  $ World.Population.Percentage: num  0.52 0.04 0.56 0 0 0.45 0 0 0.57 0.03 ...

Giải thích kết quả mà câu lệnh trả về

  • ‘data.frame’: 234 obs. of 17 variables Đây là bộ dữ liệu data frame, bao gồm 234 quan sát - obs (tương ứng với 234 hàng trong file CSV) và 17 biến - variables (tương ứng với 17 cột trong file CSV)
  • CỘT 1 là tên các biến ứng với hàng ngang đầu tiên trong file CSV.
    • Rank: Xếp hạng
    • CCA3: Mã quốc gia/vùng lãnh thổ gồm 3 chữ số.
    • Country.Territory: Tên của Quốc gia/Lãnh thổ.
    • Capital: Tên thủ đô.
    • Continent: Tên của lục địa.
    • X2022.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 2022.
    • X2020.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 2020.
    • X2015.Population: Dân số của Quốc gia/Vùng lãnh thổ năm 2015.
    • X2010.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 2010.
    • X2000.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 2000.
    • X1990.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 1990.
    • X1980.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 1980.
    • X1970.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 1970.
    • Area.(km²): Diện tích của Quốc gia/Vùng lãnh thổ tính bằng km vuông.
    • Density.(per.km²): Mật độ dân số trên km vuông.
    • Growth.Rate: Tỷ lệ tăng trưởng dân số theo quốc gia/vùng lãnh thổ.
    • World.Population.Percentage: Tỷ lệ dân số theo từng quốc gia/vùng lãnh thổ.
  • CỘT 2 là kiểu biến, ứng với những kết quả như sau:
    • chr: Kiểu biến là ký tự
    • int”: Kiểu biến là số nguyên
    • num: Kiểu biến là sỗ thực
  • CỘT 3 là những quan sát có được.

Kiểm tra có tất cả bao nhiêu quốc gia trong bộ dữ liệu trên bằng câu lệnh sau:

#Lập bảng tần số mà tên các quốc gia được lặp lại và gán vào soQG
soQG2 <- table(WPOP$Country.Territory) 
#Xem số lượng quốc gia được quan sát
dim(soQG2)
## [1] 234

Kết quả trả về cho ta thấy có 234 quốc gia trong bộ dữ liệu.

Kiểm tra giá trị bị thiếu trong bộ dữ liệu trên bằng câu lệnh sau:

#Kiểm tra xem có bao nhiêu giá trị bị thiếu
sum(is.na(WPOP))
## [1] 0

Kết quả trả về cho ta thấy không có giá trị bị thiếu.

2. CHỌN VÀ PHÂN TÍCH CHI TIẾT VỀ BỘ DỮ LIỆU

Bộ dữ liệu world_population.csv chứa một lượng thông tin đồ sộ, tuy nhiên chúng ta không thể dùng hết được dữ liệu thu về. Trong quá trình phân tích, chúng ta sẽ tiến hành các bước thực hiện sau đây.

2.1 CHỌN RA BỘ DỮ LIỆU CẦN PHÂN TÍCH

Ta sẽ chọn ra những biến là các biến sau Ta tiến hành gọi packsge tidyverse dùng để sử dụng toán tử pipe %>%.

# Gọi ra gói tidyverse
library(tidyverse) 
# Chọn ra các biến cần thiết để xử lý
WPOP2 <- WPOP %>% select(Rank, Country.Territory, X2022.Population, X2020.Population, X2015.Population, X2010.Population, Growth.Rate, World.Population.Percentage)
names(WPOP2)
## [1] "Rank"                        "Country.Territory"          
## [3] "X2022.Population"            "X2020.Population"           
## [5] "X2015.Population"            "X2010.Population"           
## [7] "Growth.Rate"                 "World.Population.Percentage"

Với câu lệnh trên ta hoàn tất để chọn ra biến là:

  • Rank: Xếp hạng
  • Country.Territory: Tên của Quốc gia/Lãnh thổ.
  • X2022.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 2022.
  • X2020.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 2020.
  • X2015.Population: Dân số của Quốc gia/Vùng lãnh thổ năm 2015.
  • X2010.Population: Dân số của Quốc gia/Vùng lãnh thổ vào năm 2010.
  • Growth.Rate: Tỷ lệ tăng trưởng dân số theo quốc gia/vùng lãnh thổ.
  • World.Population.Percentage: Tỷ lệ dân số theo từng quốc gia/vùng lãnh thổ.

2.2 ĐỔI TÊN CÁC BIẾN DỮ LIỆU

Ta tiến hành đổi tên biến để dễ dàng thao tác hơn

# Lệnh đổi tên biến
WPOP2 <- WPOP2 %>% rename('R' = Rank, 'QG2' = Country.Territory , 'POP22' = X2022.Population, 'POP20' = X2020.Population, 'POP15' = X2015.Population, 'POP10' = X2010.Population, 'GR' = Growth.Rate, 'TLDS' = World.Population.Percentage)
names(WPOP2)
## [1] "R"     "QG2"   "POP22" "POP20" "POP15" "POP10" "GR"    "TLDS"

Với câu lệnh và kết quả trên thì tên biến đã được đổi tương ứng với thứ tự biến trong data WPOP2.

2.3 LẬP BẢNG TẦN SỐ

2.3.1 Bảng tần số một biến

Đối với câu lệnh table(), chúng ta có khả năng xem xét tần suất xuất hiện của một biến trong tập dữ liệu. Điều này mang lại lợi ích lớn trong việc tổng hợp một lượng lớn dữ liệu thành một bảng ngắn gọn, giúp quá trình phân tích trở nên thuận tiện và dễ dàng

# Lập bảng tần số cho biến "R" (Xếp hạng)
R1 <- cut(WPOP2$TLDS,3)
table(R1)

Kết quả trên cho ta biết:

Sử dụng hàm cut() để chia dữ liệu trong biến Tỉ lệ dân số thuộc data WPOP2 thành 3 nhóm * (-0.0179,5.96] xuất hiện với 232 quan sát. * (5.96,11.9] xuất hiện với 0 quan sát. * (11.9,17.9] xuất hiện với 2 quan sát.

# Lập bảng tần số cho biến "R" (Xếp hạng)
R2 <- cut(WPOP2$GR,3)
table(R2)

Kết quả trên cho ta biết:

Sử dụng hàm cut() để chia dữ liệu trong biến Tỉ lệ dân số thuộc data WPOP2 thành 3 nhóm * (0.912,0.964] xuất hiện với 1 quan sát. * (0.964,1.02] xuất hiện với 174 quan sát. * (1.02,1.07] xuất hiện với 59 quan sát.

2.3.2 Bảng tần số nhiều biến

Với câu lệnh group_by cho phép lập bảng với nhiều biến cùng lúc.

**BẢNG TẦN SỐ TỈ LỆ TRƯỞNG DÂN SỐ VÀ TỈ LỆ DÂN SỐ CỦA CÁC QUỐC GIA/KHU VỰC

WPOP3 <- WPOP2 %>% group_by(QG2, GR, TLDS) %>% summarise(n= n(), .groups = 'drop')
WPOP3
## # A tibble: 234 × 4
##    QG2                    GR  TLDS     n
##    <chr>               <dbl> <dbl> <int>
##  1 Afghanistan         1.03   0.52     1
##  2 Albania             0.996  0.04     1
##  3 Algeria             1.02   0.56     1
##  4 American Samoa      0.983  0        1
##  5 Andorra             1.01   0        1
##  6 Angola              1.03   0.45     1
##  7 Anguilla            1.01   0        1
##  8 Antigua and Barbuda 1.01   0        1
##  9 Argentina           1.01   0.57     1
## 10 Armenia             0.996  0.03     1
## # ℹ 224 more rows

Kết quả trên cho thấy:

*Bảng tấn số với lệnh trên cho ra tần suất dữ liệu của các biến ‘QG2’, ‘GR’, ‘TLDS’. Câu lệnh summarise(n= n() cho ra số n tần suất của dữ liệu và groups = ‘drop’ giúp chia nhóm dữ liệu.

2.4 TÍNH TOÁN CÁC ĐẶC TRƯNG ĐO LƯỜNG

Để đạt được tính toán chính xác và chi tiết về các đặc trưng đo lường của biến dân số vào năm 2022 (POP22), chúng ta tiến hành phân tích sâu sắc trên bảng Data WPOP2 Qua quá trình này, chúng ta sẽ thực hiện các thao tác tính toán kỹ lưỡng, mang lại cái nhìn rõ ràng và đầy đủ về động lực và biến động của dân số trong bộ Data.

summary(WPOP2$POP22)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 5.100e+02 4.197e+05 5.560e+06 3.407e+07 2.248e+07 1.426e+09

Kết quả cho ta biết những thông tin sau:

  • Min: Giá trị nhỏ nhất trong dữ liệu, là 5.100e+02.
  • 1st Qu. (Primer Quartile): Giá trị phân vị thứ nhất, tức là giá trị mà 25% dữ liệu nhỏ hơn và 75% dữ liệu lớn hơn. Trong trường hợp này, giá trị là 4.197e+05.
  • Median (Trung vị): Giá trị giữa của dữ liệu khi được sắp xếp tăng dần. 50% dữ liệu nhỏ hơn và 50% dữ liệu lớn hơn. Trong trường hợp này, giá trị là 5.560e+06.
  • Mean (Trung bình): Giá trị trung bình của dữ liệu, là 3.407e+07.
  • 3rd Qu. (Third Quartile): Giá trị phân vị thứ ba, tức là giá trị mà 75% dữ liệu nhỏ hơn và 25% dữ liệu lớn hơn. Trong trường hợp này, giá trị là 2.248e+07.
  • Max.: Giá trị lớn nhất trong dữ liệu, là 1.426e+09.
sum(WPOP2$POP22) 
## [1] 7973413042

Kết quả cho ta biết:

  • 79734130422: là tổng của tất cả các giá trị trong biến POP22 của bộ dữ liệu WPOP2. Giá trị này thường được biểu diễn dưới dạng số thực dấu chấm động với mức độ chính xác cao.
mean(WPOP2$POP22,na.rm = T) 
## [1] 34074415

Kết quả cho ta biết:

  • 34074415: giá trị này biểu thị giá trị trung bình của biến POP (tổng dân số) trên toàn bộ bộ dữ liệu danso2. Do đó, giá trị trung bình của dân số trong bộ dữ liệu là khoảng 126 triệu người
length(WPOP2$POP22)
## [1] 234

Kết quả cho ta biết:

  • 234 là có tổng cộng 234 quan sát về dân số từ các quốc gia hoặc khu vực khác nhau trong dữ liệu.
var(WPOP2$POP22)
## [1] 1.870505e+16

Kết quả cho ta biết:

  • 1.870505e+16: là giá trị phương sai của biến POP trong bộ dữ liệu danso2. Phương sai là một đại lượng thống kê đo lường mức độ biến động của dữ liệu. Giá trị phương sai lớn cho thấy mức độ biến động của tổng dân số (biến POP) khá cao trong bộ dữ liệu, có sự chênh lệch lớn giữa các giá trị dân số của các quốc gia hoặc khu vực khác nhau.
sd(WPOP2$POP22)
## [1] 136766425

Kết quả cho ta biết:

  • 13,6766,425: là giá trị độ lệch chuẩn của biến. Độ lệch chuẩn là một đại lượng thống kê mô tả mức độ phân tán của dữ liệu xung quanh giá trị trung bình. Độ lệch chuẩn lớn cho thấy mức độ biến động của tổng dân số khá cao, với sự chênh lệch lớn giữa các giá trị dân số của các quốc gia hoặc khu vực khác nhau trong bộ dữ liệu.
median(WPOP2$POP22)
## [1] 5559945

Kết quả cho ta biết:

  • 5,559,945: là giá trị trung vị (median). Trung vị là giá trị chia dữ liệu thành hai phần bằng nhau, tức là có 50% dữ liệu nằm bên trái và 50% nằm bên phải. Trung vị của tổng dân số là 3,833,998, chỉ ra rằng một nửa các quốc gia hoặc khu vực có dân số dưới giá trị này, và nửa còn lại có dân số lớn hơn giá trị này.
quantile(WPOP2$POP22, probs = c(.3,.6,.9))
##        30%        60%        90% 
##   806098.9  9964403.8 59636961.7

Kết quả cho ta biết:

  • 30% Quantile: Giá trị mà 30% dữ liệu dân số nhỏ hơn. Trong trường hợp này, giá trị là 806098.9 , tức là 30% quốc gia hoặc khu vực có dân số dưới giá trị này.

  • 60% Quantile: Giá trị mà 60% dữ liệu dân số nhỏ hơn. Trong trường hợp này, giá trị là 9964403.8, chỉ ra rằng 60% quốc gia hoặc khu vực có dân số dưới giá trị này.

  • 90% Quantile: Giá trị mà 90% dữ liệu dân số nhỏ hơn. Trong trường hợp này, giá trị là 59636961.7 , tức là 90% quốc gia hoặc khu vực có dân số dưới giá trị này.

3. NHẬN XÉT VỀ BỘ DỮ LIỆU

Dựa trên những nhận xét từ phân tích bộ dữ liệu dân số (world_population.csv), chúng ta có thể rút ra một số phân tích quan trọng về đặc điểm của các quốc gia và lãnh thổ trên toàn thế giới.

Những phân tích này có thể giúp ta hiểu rõ hơn về cấu trúc dân số thế giới, sự chênh lệch giữa các quốc gia, và đóng góp của chúng vào tình hình dân số toàn cầu. Đồng thời, chúng cũng là cơ sở để tiếp tục phân tích chi tiết hơn về các yếu tố ảnh hưởng đến dân số và tăng trưởng dân số của các quốc gia cụ thể.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAzIC0gTcO0biBOZ8O0biBOZ+G7ryBM4bqtcCBUcsOsbmggVHJvbmcgUGjDom4gVMOtY2ggROG7ryBMaeG7h3UiDQphdXRob3I6ICJIb8OgbmcgVOG6pW4gUGjDoXQiDQpkYXRlOiANCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVHJ1ZQ0KICAgIHRvYzogVHJ1ZQ0KICAgIHRvY19mbG9hdDogVHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQpgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyAqKk5ISeG7hk0gVuG7pCAzLjEqKg0KKioqDQoNCiMjICoqMS4gR0nhu5pJIFRISeG7hlUgQ0hJIFRJ4bq+VCBW4buAIELhu5ggROG7riBMSeG7hlUqKg0KDQojIyMgKioxLjEgVMOTTSBU4bquVCBC4buYIEThu64gTEnhu4ZVKioNCg0KQuG7mSBk4buvIGxp4buHdSAiKipwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5LmNzdioqIiBsw6AgbeG7mXQgbmd14buTbiB0aMO0bmcgdGluIHF1YW4gdHLhu41uZyB24buBIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgdsOgIGtodSB24buxYyB0csOqbiB0aOG6vyBnaeG7m2kuIA0KQ8OhYyBiaeG6v24gcXVhbiB0cuG7jW5nIGJhbyBn4buTbSB0w6puIHF14buRYyBnaWEsIG7Eg20gcXVhbiBzw6F0LCB2w6AgY8OhYyB0aMO0bmcgc+G7kSBkw6JuIHPhu5EgY2hpIHRp4bq/dCB0aGVvIMSR4buZIHR14buVaSBraMOhYyBuaGF1IHThu6sgbsSDbSAxOTUwIMSR4bq/biBuxINtIDIwMjEuIA0KDQojIyMgKioxLjIgVEjDlE5HIFRJTiBDSEkgVEnhur5UIEPhu6ZBIELhu5ggROG7riBMSeG7hlUqKg0KDQpUcsaw4bubYyB0acOqbiDEkeG7gyDEkeG7jWMgduG7gSBi4buZIGThu68gbGnhu4d1IHThu6sgbeG7mXQgdOG7h3AgQ1NWIHbDoG8gdHJvbmcgUiwgdGEgY8OzIHRo4buDIHRo4buxYyBoaeG7h24gYuG6sW5nIGPDoWMgY8OidSBs4buHbmggc2F1Og0KDQpgYGB7cn0NCiNT4butIGThu6VuZyBs4buHbmggcmVhZC5jc3YgxJHhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBjc3YgdsOgbyBSIHbDoCBnw6FuIHbDoG8gImRhbnNvIg0KZGFuc28gPC0gcmVhZC5jc3YoZmlsZSA9ICJDOi9Vc2Vycy9IUC9Eb3dubG9hZHMvcG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeS5jc3YiKQ0KYGBgDQoNCsSQ4buDIMSR4buNYyBtw7QgdOG6oyBjaGkgdGnhur90IHbhu4EgY+G6pXUgdHLDumMgY+G7p2EgYuG7mSBk4buvIGxp4buHdSB0YSBz4butIGThu6VuZyBjw6J1IGzhu4duaCBzdHINCg0KYGBge3J9DQojU+G7rSBk4bulbmcgbOG7h25oIHN0ciDEkeG7gyB4ZW0gY+G6pXUgdHLDumMgY+G7p2EgYuG7mSBk4buvIGxp4buHdSAiZGFuc28iDQpzdHIoZGFuc28pDQpgYGANCg0KKipHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjIG3DoCBjw6J1IGzhu4duaCB0cuG6oyB24buBKioNCg0KKiAqKidkYXRhLmZyYW1lJzogMTgyODggb2JzLiBvZiAgMjQgdmFyaWFibGVzOioqIMSQw6J5IGzDoCBi4buZIGThu68gbGnhu4d1IGRhdGEgZnJhbWUsIGJhbyBn4buTbSAxODI4OCBxdWFuIHPDoXQgLSBvYnMgKHTGsMahbmcg4bupbmcgduG7m2kgMTgyODggaMOgbmcgdHJvbmcgZmlsZSBDU1YpIHbDoCAyNCBiaeG6v24gLSB2YXJpYWJsZXMgKHTGsMahbmcg4bupbmcgduG7m2kgMjQgY+G7mXQgdHJvbmcgZmlsZSBDU1YpDQoqICoqQ+G7mFQgMSoqIGzDoCB0w6puIGPDoWMgYmnhur9uIOG7qW5nIHbhu5tpIGjDoG5nIG5nYW5nIMSR4bqndSB0acOqbiB0cm9uZyBmaWxlIENTVi4NCiAgKiAqKkNvdW50cnkubmFtZToqKiBUw6puIHF14buRYyBnaWENCiAgKiAqKlllYXI6KiogTsSDbSBxdWFuIHPDoXQNCiAgKiAqKlBvcHVsYXRpb246KiogVOG7lW5nIGTDom4gc+G7kSBj4bunYSBxdeG7kWMgZ2lhDQogICogKipQb3B1bGF0aW9uLm9mLmNoaWxkcmVuLnVuZGVyLnRoZS5hZ2Uub2YuMToqKiBEw6JuIHPhu5EgY+G7p2EgdHLhursgZW0gY8OzIMSR4buZIHR14buVaSBkxrDhu5tpIDENCiAgKiAqKlBvcHVsYXRpb24ub2YuY2hpbGRyZW4udW5kZXIudGhlLmFnZS5vZi41OioqIETDom4gc+G7kSBj4bunYSB0cuG6uyBlbSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgNQ0KICAqICoqUG9wdWxhdGlvbi5vZi5jaGlsZHJlbi51bmRlci50aGUuYWdlLm9mLjE1OioqIETDom4gc+G7kSBj4bunYSB0cuG6uyBlbSBjw7MgxJHhu5kgdHXhu5VpIGTGsOG7m2kgMTUNCiAgKiAqKlBvcHVsYXRpb24udW5kZXIudGhlLmFnZS5vZi4yNToqKiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSBkxrDhu5tpIDI1DQogICogKipQb3B1bGF0aW9uLmFnZWQuMTUudG8uNjQueWVhcnM6KiogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxNSDEkeG6v24gNjQNCiAgKiAqKlBvcHVsYXRpb24ub2xkZXIudGhhbi4xNS55ZWFyczoqKiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSBs4bubbiBoxqFuIDE1DQogICogKipQb3B1bGF0aW9uLm9sZGVyLnRoYW4uMTgueWVhcnM6KiogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgbOG7m24gaMahbiAxOA0KICAqICoqUG9wdWxhdGlvbi5hdC5hZ2UuMToqKiBEw6JuIHPhu5EgY8OzIHR14buVaSBsw6AgMQ0KICAqICoqUG9wdWxhdGlvbi5hZ2VkLjEudG8uNC55ZWFyczoqKiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDEgxJHhur9uIDQNCiAgKiAqKlBvcHVsYXRpb24uYWdlZC41LnRvLjkueWVhcnM6KiogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA1IMSR4bq/biA5DQogICogKipQb3B1bGF0aW9uLmFnZWQuMTAudG8uMTQueWVhcnM6KiogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxMCDEkeG6v24gMTQNCiAgKiAqKlBvcHVsYXRpb24uYWdlZC4xNS50by4xOS55ZWFyczoqKiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDE1IMSR4bq/biAxOQ0KICAqICoqUG9wdWxhdGlvbi5hZ2VkLjIwLnRvLjI5LnllYXJzOioqIETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgMjAgxJHhur9uIDI5DQogICogKipQb3B1bGF0aW9uLmFnZWQuMzAudG8uMzkueWVhcnM6KiogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAzMCDEkeG6v24gMzkNCiAgKiAqKlBvcHVsYXRpb24uYWdlZC40MC50by40OS55ZWFyczoqKiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDQwIMSR4bq/biA0OQ0KICAqICoqUG9wdWxhdGlvbi5hZ2VkLjUwLnRvLjU5LnllYXJzOioqIETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgNTAgxJHhur9uIDU5DQogICogKipQb3B1bGF0aW9uLmFnZWQuNjAudG8uNjkueWVhcnM6KiogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA2MCDEkeG6v24gNjkNCiAgKiAqKlBvcHVsYXRpb24uYWdlZC43MC50by43OS55ZWFyczoqKiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDcwIMSR4bq/biA3OQ0KICAqICoqUG9wdWxhdGlvbi5hZ2VkLjgwLnRvLjg5LnllYXJzOioqIETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgODAgxJHhur9uIDg5DQogICogKipQb3B1bGF0aW9uLmFnZWQuOTAudG8uOTkueWVhcnM6KiogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA5MCDEkeG6v24gOTkNCiAgKiAqKlBvcHVsYXRpb24ub2xkZXIudGhhbi4xMDAueWVhcnM6KiogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgbOG7m24gaMahbiAxMDANCg0KKiAqKkPhu5hUIDIqKiBsw6Aga2nhu4N1IGJp4bq/biwg4bupbmcgduG7m2kgbmjhu69uZyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCiAgKiAqKmNocjoqKiBLaeG7g3UgYmnhur9uIGzDoCBrw70gdOG7sQ0KICAqICoqaW50IjoqKiBLaeG7g3UgYmnhur9uIGzDoCBz4buRIG5ndXnDqm4NCiAgKiAqKm51bToqKiBLaeG7g3UgYmnhur9uIGzDoCBz4buXIHRo4buxYw0KICANCiogKipD4buYVCAzKiogbMOgIG5o4buvbmcgcXVhbiBzw6F0IGPDsyDEkcaw4bujYy4NCiogQuG7mSBk4buvIGxp4buHdSBjw7MgMSBiaeG6v24gxJHhu4tuaCB0w61uaCAo4bupbmcgduG7m2kgY+G7mXQgxJHhuqd1IHRpw6puIHRyb25nIGZpbGUgQ1NWKSB2w6AgMjMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgKOG7qW5nIHbhu5tpIDIzIGPhu5l0IGPDsm4gbOG6oWkgdHJvbmcgZmlsZSBDU1YpLg0KDQpLaeG7g20gdHJhIGPDsyB04bqldCBj4bqjIGJhbyBuaGnDqnUgcXXhu5FjIGdpYSB0cm9uZyBi4buZIGThu68gbGnhu4d1IHRyw6puIGLhurFuZyBjw6J1IGzhu4duaCBzYXU6DQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIG3DoCB0w6puIGPDoWMgcXXhu5FjIGdpYSDEkcaw4bujYyBs4bq3cCBs4bqhaSB2w6AgZ8OhbiB2w6BvIHNvUUcNCnNvUUcgPC0gdGFibGUoZGFuc28kQ291bnRyeSkgDQojWGVtIHPhu5EgbMaw4bujbmcgcXXhu5FjIGdpYSDEkcaw4bujYyBxdWFuIHPDoXQNCmRpbShzb1FHKQ0KYGBgDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBIGNobyB0YSB0aOG6pXkgY8OzIDI1NCBxdeG7kWMgZ2lhIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIA0KDQpLaeG7g20gdHJhIGdpw6EgdHLhu4sgYuG7iyB0aGnhur91ICB0cm9uZyBi4buZIGThu68gbGnhu4d1IHRyw6puIGLhurFuZyBjw6J1IGzhu4duaCBzYXU6DQoNCmBgYHtyfQ0KI0tp4buDbSB0cmEgeGVtIGPDsyBiYW8gbmhpw6p1IGdpw6EgdHLhu4sgYuG7iyB0aGnhur91DQpzdW0oaXMubmEoZGFuc28pKQ0KYGBgDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBIGNobyB0YSB0aOG6pXkga2jDtG5nIGPDsyBnacOhIHRy4buLIGLhu4sgdGhp4bq/dS4NCg0KIyMgKioyLiBDSOG7jE4gVsOAIFBIw4JOIFTDjUNIIENISSBUSeG6vlQgVuG7gCBC4buYIEThu64gTEnhu4ZVKioNCg0KQuG7mSBk4buvIGxp4buHdSAgcG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeS5jc3YgY2jhu6lhIG3hu5l0IGzGsOG7o25nIHRow7RuZyB0aW4gxJHhu5Mgc+G7mSwgdHV5IG5oacOqbiBjaMO6bmcgdGEga2jDtG5nIHRo4buDIGTDuW5nIGjhur90IMSRxrDhu6NjIGThu68gbGnhu4d1IHRodSB24buBLiBUcm9uZyBxdcOhIHRyw6xuaCBwaMOibiB0w61jaCwgY2jDum5nIHRhIHPhur0gdGnhur9uIGjDoG5oIGPDoWMgYsaw4bubYyB0aOG7sWMgaGnhu4duIHNhdSDEkcOieS4NCg0KIyMjICoqMi4xIENI4buMTiBSQSA1IMSQ4buYIFRV4buUSSBUUk9ORyBC4buYIEThu64gTEnhu4ZVKioNCg0KVGEgc+G6vSBjaOG7jW4gcmEgbmjhu69uZyBiaeG6v24gbMOgIGTDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHRyb25nIMSR4buZIHR14buVaSBsYW8gxJHhu5luZyBsw6AgdOG7qyAxIHR14buVaSDEkeG6v24gMjkgdHXhu5VpIHRyw6puIGLhu5kgZOG7ryBsaeG7h3UgKioiZGFuc28iKiouIA0KVGEgdGnhur9uIGjDoG5oIGfhu41pIHBhY2tzZ2UgdGlkeXZlcnNlIGTDuW5nIMSR4buDIHPhu60gZOG7pW5nIHRvw6FuIHThu60gcGlwZSAlPiUuIA0KDQpgYGB7cn0NCiMgR+G7jWkgcmEgZ8OzaSB0aWR5dmVyc2UNCmxpYnJhcnkodGlkeXZlcnNlKSANCiMgQ2jhu41uIHJhIGPDoWMgYmnhur9uIGPhuqduIHRoaeG6v3QgxJHhu4MgeOG7rSBsw70NCmRhbnNvMiA8LSBkYW5zbyAlPiUgc2VsZWN0KENvdW50cnksIFllYXIsIFBvcHVsYXRpb24sIFBvcHVsYXRpb24uYWdlZC4xLnRvLjQueWVhcnMsIFBvcHVsYXRpb24uYWdlZC41LnRvLjkueWVhcnMsIFBvcHVsYXRpb24uYWdlZC4xMC50by4xNC55ZWFycywgUG9wdWxhdGlvbi5hZ2VkLjE1LnRvLjE5LnllYXJzLCBQb3B1bGF0aW9uLmFnZWQuMjAudG8uMjkueWVhcnMpDQpuYW1lcyhkYW5zbzIpDQpgYGANCg0KVuG7m2kgY8OidSBs4buHbmggdHLDqm4gdGEgaG/DoG4gdOG6pXQgxJHhu4MgY2jhu41uIHJhIGJp4bq/biBsw6A6DQoNCiogQ291bnRyeTogVMOqbiBxdeG7kWMgZ2lhDQoqIFllYXI6IE7Eg20NCiogUG9wdWxhdGlvbjogVOG7lW5nIGTDom4gc+G7kQ0KKiBQb3B1bGF0aW9uLmFnZWQuMS50by40LnllYXJzOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDEgxJHhur9uIDQNCiogUG9wdWxhdGlvbi5hZ2VkLjUudG8uOS55ZWFyczogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyA1IMSR4bq/biA5DQoqIFBvcHVsYXRpb24uYWdlZC4xMC50by4xNC55ZWFyczogRMOibiBz4buRIGPDsyDEkeG7mSB0deG7lWkgdOG7qyAxMCDEkeG6v24gMTQNCiogUG9wdWxhdGlvbi5hZ2VkLjE1LnRvLjE5LnllYXJzOiBEw6JuIHPhu5EgY8OzIMSR4buZIHR14buVaSB04burIDE1IMSR4bq/biAxOQ0KKiBQb3B1bGF0aW9uLmFnZWQuMjAudG8uMjkueWVhcnM6IETDom4gc+G7kSBjw7MgxJHhu5kgdHXhu5VpIHThu6sgMjAgxJHhur9uIDI5DQoNCiMjIyAqKjIuMiDEkOG7lEkgVMOKTiBDw4FDIEJJ4bq+TiBE4buuIExJ4buGVSoqDQoNClRhIHRp4bq/biBow6BuaCDEkeG7lWkgdMOqbiBiaeG6v24gxJHhu4MgZOG7hSBkw6BuZyB0aGFvIHTDoWMgaMahbg0KDQpgYGB7cn0NCiMgTOG7h25oIMSR4buVaSB0w6puIGJp4bq/bg0KZGFuc28yIDwtIGRhbnNvMiAlPiUgcmVuYW1lKCdRRycgPSBDb3VudHJ5LCAnWScgPSBZZWFyICwgJ1BPUCcgPSBQb3B1bGF0aW9uLCAnUE9QMXRvNCcgPSBQb3B1bGF0aW9uLmFnZWQuMS50by40LnllYXJzLCAnUE9QNXRvOScgPSBQb3B1bGF0aW9uLmFnZWQuNS50by45LnllYXJzLCAnUE9QMTB0bzE0JyA9IFBvcHVsYXRpb24uYWdlZC4xMC50by4xNC55ZWFycywgJ1BPUDE1dG8xOScgPSBQb3B1bGF0aW9uLmFnZWQuMTUudG8uMTkueWVhcnMsICdQT1AyMHRvMjknID0gUG9wdWxhdGlvbi5hZ2VkLjIwLnRvLjI5LnllYXJzKQ0KbmFtZXMoZGFuc28yKQ0KYGBgDQpW4bubaSBjw6J1IGzhu4duaCB2w6Aga+G6v3QgcXXhuqMgdHLDqm4gdGjDrCB0w6puIGJp4bq/biDEkcOjIMSRxrDhu6NjIMSR4buVaSB0xrDGoW5nIOG7qW5nIHbhu5tpIHRo4bupIHThu7EgYmnhur9uIHRyb25nIGRhdGEgKipkYW5zbzIqKi4gDQojIyMgKioyLjMgTOG7jEMgUkEgNSBRVeG7kEMgR0lBIFRSw4pOIELhu5ggREFUQSBEQU5TTzIqKg0KDQpTYXUgxJHDonkgdGEgc+G6vSBs4buNYyByYSA1IHF14buRYyBnaWEgdHLDqm4gYuG7mSBEYXRhICJkYW5zbzIiLiA1IHF14buRYyBnaWEgxJHGsOG7o2MgY2jhu41uIGJhbyBn4buTbTogVmnhu4d0IE5hbShWaWV0bmFtKSwgVHJ1bmcgUXXhu5FjKENoaW5hKSwg4bqkbiDEkOG7mShJbmRpYSksIEluZG9uZXNpYShJbmRvbmVzaWEpLCBOZ2EoUnVzc2lhKQ0KDQpUYSB0aeG6v24gaMOgbmggbOG7jWMgYuG7mSBk4buvIGxp4buHdQ0KDQpgYGB7cn0NCmRhbnNvMyA8LSBkYW5zbzIgJT4lIGZpbHRlcihRRyA9PSAiVmlldG5hbSJ8IFFHID09ICJDaGluYSJ8IFFHID09ICJJbmRpYSJ8IFFHID09ICJJbmRvbmVzaWEifCBRRyA9PSAiUnVzc2lhIikgICANCm5hbWVzKGRhbnNvMykNCmBgYA0KDQpW4bubaSBjw6J1IGzhu4duaCB0csOqbiB0YSBob8OgbiB04bqldCDEkeG7gyBs4buNYyBjw6FjIGThu68gbGnhu4d1IHThu6sgY8OhYyBxdeG7kWMgZ2lhIFZp4buHdCBOYW0sIFRydW5nIFF14buRYywg4bqkbiDEkOG7mSwgSW5kb25lc2lhLCBOZ2EuDQoNCiMjIyAqKjIuNCBNw4MgSMOTQSBE4buuIExJ4buGVSoqDQoNCsSQ4buDIGThu4UgZMOgbmcgaMahbiB0cm9uZyB2aeG7h2MgcGjDom4gdMOtY2gsIGNow7puZyB0YSBz4butIGThu6VuZyBjw6FjIGzhu4duaCB24buBIG3DoyBow7NhIGThu68gbGnhu4d1LiANCkPDoWMgbOG7h25oIG3DoyBow7NhIGThu68gbGnhu4d1IG5oxrAgKipjYXNlX3doZW4qKiwgKipjdXQoKSoqLCAqKmNhc2VfbWF0Y2gqKiB2w6AgKippZmVsc2UoKSoqIHPhur0gZ2nDunAgY2jDum5nIHRhIGNodXnhu4NuIMSR4buVaSB04burIGThu68gbGnhu4d1IGThuqFuZyBuw6B5IHNhbmcgbeG7mXQgZOG6oW5nIG3hu5tpLg0KDQoNCmBgYHtyfQ0KZGFuc28yJENvQ2F1RGFuU28gPC0gaWZlbHNlKGRhbnNvMiRQT1AxMHRvMTQgPiAwLjEgKiBkYW5zbzIkUE9QLCAnRMOibiBz4buRIHRy4bq7JywgJ0TDom4gc+G7kSBnacOgJykNCmRhbnNvMiRTTERhbnNvIDwtIGlmZWxzZShkYW5zbzIkUE9QID4gNTAwMDAwMDAsICdEb25nIGRhbicsICd0aHVhIHRob3QnKQ0KZGFuc28yJFNMRGFuc28xIDwtIGNhc2Vfd2hlbihkYW5zbzIkUE9QIDwgNTAwMDAwMDAgfiAndGjhuqVwJywgZGFuc28yJFBPUCA+PSA1MDAwMDAwMCAmIGRhbnNvMiRQT1AgPCAxMDAwMDAwMDAgfiAndHJ1bmcgYsOsbmggJywgZGFuc28yJFBPUCA+IDEwMDAwMDAwMCB+ICdjYW8nICkgIzMNCmRhbnNvMiRTTERhbnNvMiA8LSBjdXQoZGFuc28yJFBPUCwgYnJlYWtzID0gYygwLCA1MDAwMDAwMCwxMDAwMDAwMDAsIDEwMDAwMDAwMDAwKSwgbGFiZWxzPSBjKCdrdjEnLCAna3YyJywgJ2t2MycpKSAjNA0KYGBgDQoNCkvhur90IHF14bqjIGNobyBiaeG6v3Q6DQoNCiogKipDb0NhdURhblNvOioqIFThuqFvIGPhu5l0IG3hu5tpIGPDsyB0w6puIGzDoCBDb0NhdURhblNvIGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBs4buHbmggYGlmZWxzZWAuIEfDoW4gZ2nDoSB0cuG7iyBsw6AgZMOibiBz4buRIHRy4bq7IG7hur91IGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uIFBPUDEwdG8xNCBs4bubbiBoxqFuIDAuMSBs4bqnbiBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBQT1AsIG5nxrDhu6NjIGzhuqFpIHPhur0gbMOgIGTDom4gc+G7kSBnacOgLg0KDQoqICoqU0xEYW5zbzoqKiBU4bqhbyBj4buZdCBt4bubaSBjw7MgdMOqbiBsw6AgU0xEYW5zbyBz4butIGThu6VuZyBs4buHbmggYGlmZWxzZWAuIEfDoW4gZ2nDoSB0cuG7iyBsw6AgxJHDtG5nIMSRw7pjIG7hur91IHThu5VuZyBkw6JuIHPhu5EgbOG7m24gaMahbiA1LjAwMDAuMDAwLCBuZ8aw4bujYyBs4bqhaSBz4bq9IGzDoCB0aMawYSB0aOG7m3QuDQoNCiogKipTTERhbnNvMToqKiBU4bqhbyBj4buZdCBt4bubaSBjw7MgdMOqbiBsw6AgU0xEYW5zbzEgc+G7rSBk4bulbmcgaMOgbSBgY2FzZV93aGVuYCDEkeG7gyBtw6MgaMOzYSBk4buvIGxp4buHdSB0aMOgbmggYmEgbmjDs206IHRo4bqlcCBu4bq/dSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBQT1Agbmjhu48gaMahbiA1MC4wMDAuMDAwLCB0cnVuZyBiw6xuaCBu4bq/dSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBQT1AgdOG7qyA1MC4wMDAuMDAwIMSR4bq/biAxMDAuMDAwLjAwMCwgdsOgIGNhbyBu4bq/dSBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBQT1AgbOG7m24gaMahbiAxMDAuMDAwLjAwMC4NCg0KKiAqKlNMRGFuc28yOioqIFThuqFvIGPhu5l0IG3hu5tpIGPDsyB0w6puIGzDoCBTTERhbnNvMiBz4butIGThu6VuZyBow6BtIGBjdXRgIMSR4buDIGNoaWEgZOG7ryBsaeG7h3UgdGjDoG5oIGJhIGtob+G6o25nIGdpw6EgdHLhu4s6IGt2MSBjaG8gZ2nDoSB0cuG7iyB04burIDAgxJHhur9uIDUwLjAwMC4wMDAsIGt2MiBjaG8gZ2nDoSB0cuG7iyB04burIDUwLjAwMC4wMDAgxJHhur9uIDEwMC4wMDAuMDAwLCB2w6Aga3YzIGNobyBnacOhIHRy4buLIHThu6sgMTAwLjAwMC4wMDAgxJHhur9uIDEuMDAwLjAwMC4wMDAuDQoNCiMjIyAqKjIuNSBM4bqsUCBC4bqiTkcgVOG6pk4gU+G7kCoqDQoNCiMjIyMgKioyLjUuMSBC4bqjbmcgdOG6p24gc+G7kSBt4buZdCBiaeG6v24qKiANCg0KxJDhu5FpIHbhu5tpIGPDonUgbOG7h25oIHRhYmxlKCksIGNow7puZyB0YSBjw7Mga2jhuqMgbsSDbmcgeGVtIHjDqXQgdOG6p24gc3XhuqV0IHh14bqldCBoaeG7h24gY+G7p2EgbeG7mXQgYmnhur9uIHRyb25nIHThuq1wIGThu68gbGnhu4d1LiANCsSQaeG7gXUgbsOgeSBtYW5nIGzhuqFpIGzhu6NpIMOtY2ggbOG7m24gdHJvbmcgdmnhu4djIHThu5VuZyBo4bujcCBt4buZdCBsxrDhu6NuZyBs4bubbiBk4buvIGxp4buHdSB0aMOgbmggbeG7mXQgYuG6o25nIG5n4bqvbiBn4buNbiwgZ2nDunAgcXXDoSB0csOsbmggcGjDom4gdMOtY2ggdHLhu58gbsOqbiB0aHXhuq1uIHRp4buHbiB2w6AgZOG7hSBkw6BuZw0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCmRhbnNvNCA8LSBjdXQoZGFuc28yJFBPUCwzKQ0KdGFibGUoZGFuc280KQ0KYGBgDQoNCkvhur90IHF14bqjIHRyw6puIGNobyB0YSBiaeG6v3Q6DQoNCiAgU+G7rSBk4bulbmcgaMOgbSBjdXQoKSDEkeG7gyBjaGlhIGThu68gbGnhu4d1IHRyb25nIGJp4bq/biB04buVbmcgZMOibiBz4buRIFBPUCB0aHXhu5ljIGRhdGEgZGFuc28yIHRow6BuaCAzIG5ow7NtDQogICogKC03LjkxZSswNiwyLjY0ZSswOV0geHXhuqV0IGhp4buHbiB24bubaSAxODAyNCBxdWFuIHPDoXQuDQogICogKDIuNjRlKzA5LDUuMjdlKzA5XSB4deG6pXQgaGnhu4duIHbhu5tpIDIwOSBxdWFuIHPDoXQuDQogICogKDUuMjdlKzA5LDcuOTJlKzA5XSB4deG6pXQgaGnhu4duIHbhu5tpIDU1IHF1YW4gc8OhdC4NCg0KIyMjIyAqKjIuNS4yIELhuqNuZyB04bqnbiBz4buRIG5oaeG7gXUgYmnhur9uKioNCg0KVuG7m2kgY8OidSBs4buHbmggZ3JvdXBfYnkgY2hvIHBow6lwIGzhuq1wIGLhuqNuZyB24bubaSBuaGnhu4F1IGJp4bq/biBjw7luZyBsw7pjLg0KDQpgYGB7cn0NCmRhbnNvNSA8LSBkYW5zbzIgJT4lIGdyb3VwX2J5KFksIFFHLCBTTERhbnNvMikgJT4lIHN1bW1hcmlzZShuPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpDQpkYW5zbzUNCmBgYA0KDQpL4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5OiANCg0KICAqQuG6o25nIHThuqVuIHPhu5EgduG7m2kgbOG7h25oIHRyw6puIGNobyByYSB04bqnbiBzdeG6pXQgZOG7ryBsaeG7h3UgY+G7p2EgY8OhYyBiaeG6v24gJ1FHJywgJ1knLCAnU0xEU28yJy4gQ8OidSBs4buHbmggc3VtbWFyaXNlKG49IG4oKSBjaG8gcmEgc+G7kSBuIHThuqduIHN14bqldCBj4bunYSBk4buvIGxp4buHdSB2w6AgZ3JvdXBzID0gJ2Ryb3AnIGdpw7pwIGNoaWEgbmjDs20gZOG7ryBsaeG7h3UuIA0KDQojIyMgKioyLjYgVMONTkggVE/DgU4gQ8OBQyDEkOG6tkMgVFLGr05HIMSQTyBMxq/hu5xORyoqDQoNCsSQ4buDIMSR4bqhdCDEkcaw4bujYyB0w61uaCB0b8OhbiBjaMOtbmggeMOhYyB2w6AgY2hpIHRp4bq/dCB24buBIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgY+G7p2EgYmnhur9uIGTDom4gc+G7kSAoUE9QKSwgY2jDum5nIHRhIHRp4bq/biBow6BuaCBwaMOibiB0w61jaCBzw6J1IHPhuq9jIHRyw6puIGLhuqNuZyBEYXRhIGRhbnNvMg0KUXVhIHF1w6EgdHLDrG5oIG7DoHksIGNow7puZyB0YSBz4bq9IHRo4buxYyBoaeG7h24gY8OhYyB0aGFvIHTDoWMgdMOtbmggdG/DoW4ga+G7uSBsxrDhu6FuZywgbWFuZyBs4bqhaSBjw6FpIG5ow6xuIHLDtSByw6BuZyB2w6AgxJHhuqd5IMSR4bunIHbhu4EgxJHhu5luZyBs4buxYyB2w6AgYmnhur9uIMSR4buZbmcgY+G7p2EgZMOibiBz4buRIHRyb25nIGLhu5kgRGF0YS4NCg0KYGBge3J9DQpzdW1tYXJ5KGRhbnNvMiRQT1ApDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dCBuaOG7r25nIHRow7RuZyB0aW4gc2F1Og0KDQogICogKipNaW4qKjogR2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgdHJvbmcgZOG7ryBsaeG7h3UsIGzDoCAxLjM2M2UrMDMuDQogICogKioxc3QgUXUuKiogKFByaW1lciBRdWFydGlsZSk6IEdpw6EgdHLhu4sgcGjDom4gduG7iyB0aOG7qSBuaOG6pXQsIHThu6ljIGzDoCBnacOhIHRy4buLIG3DoCAyNSUgZOG7ryBsaeG7h3Ugbmjhu48gaMahbiB2w6AgNzUlIGThu68gbGnhu4d1IGzhu5tuIGjGoW4uIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCBnacOhIHRy4buLIGzDoCAyLjkxNmUrMDUuDQogICogKipNZWRpYW4qKiAoVHJ1bmcgduG7iyk6IEdpw6EgdHLhu4sgZ2nhu69hIGPhu6dhIGThu68gbGnhu4d1IGtoaSDEkcaw4bujYyBz4bqvcCB44bq/cCB0xINuZyBk4bqnbi4gNTAlIGThu68gbGnhu4d1IG5o4buPIGjGoW4gdsOgIDUwJSBk4buvIGxp4buHdSBs4bubbiBoxqFuLiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgZ2nDoSB0cuG7iyBsw6AgMy44MzRlKzA2Lg0KICAqICoqTWVhbioqIChUcnVuZyBiw6xuaCk6IEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgZOG7ryBsaeG7h3UsIGzDoCAxLjI2NWUrMDguDQogICogKiozcmQgUXUuKiogKFRoaXJkIFF1YXJ0aWxlKTogR2nDoSB0cuG7iyBwaMOibiB24buLIHRo4bupIGJhLCB04bupYyBsw6AgZ2nDoSB0cuG7iyBtw6AgNzUlIGThu68gbGnhu4d1IG5o4buPIGjGoW4gdsOgIDI1JSBk4buvIGxp4buHdSBs4bubbiBoxqFuLiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgZ2nDoSB0cuG7iyBsw6AgMS42NzllKzA3Lg0KICAqICoqTWF4LioqOiBHacOhIHRy4buLIGzhu5tuIG5o4bqldCB0cm9uZyBk4buvIGxp4buHdSwgbMOgIDcuOTA5ZSswOS4NCg0KYGBge3J9DQpzdW0oZGFuc28yJFBPUCkgDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqMi4zMTI4OTFlKzEyKio6IGzDoCB04buVbmcgY+G7p2EgdOG6pXQgY+G6oyBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIFBPUCBj4bunYSBi4buZIGThu68gbGnhu4d1IGRhbnNvMi4gDQpHacOhIHRy4buLIG7DoHkgdGjGsOG7nW5nIMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gZMaw4bubaSBk4bqhbmcgc+G7kSB0aOG7sWMgZOG6pXUgY2jhuqVtIMSR4buZbmcgduG7m2kgbeG7qWMgxJHhu5kgY2jDrW5oIHjDoWMgY2FvLiAgDQoNCmBgYHtyfQ0KbWVhbihkYW5zbzIkUE9QLG5hLnJtID0gVCkgDQpgYGAgDQoNCkvhur90IHF14bqjIGNobyB0YSBiaeG6v3Q6DQoNCiAgKiAqKjEyNjQ3MDQzNyoqOiAgZ2nDoSB0cuG7iyBuw6B5IGJp4buDdSB0aOG7iyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGJp4bq/biBQT1AgKHThu5VuZyBkw6JuIHPhu5EpIHRyw6puIHRvw6BuIGLhu5kgYuG7mSBk4buvIGxp4buHdSBkYW5zbzIuIA0KRG8gxJHDsywgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBkw6JuIHPhu5EgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBsw6Aga2hv4bqjbmcgMTI2IHRyaeG7h3UgbmfGsOG7nWkNCg0KYGBge3J9DQpsZW5ndGgoZGFuc28yJFBPUCkNCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGEgYmnhur90Og0KDQogICogKioxOCwyODgqKiBsw6AgY8OzIHThu5VuZyBj4buZbmcgMTgsMjg4IHF1YW4gc8OhdCB24buBIGTDom4gc+G7kSB04burIGPDoWMgcXXhu5FjIGdpYSBob+G6t2Mga2h1IHbhu7FjIGtow6FjIG5oYXUgdHJvbmcgZOG7ryBsaeG7h3UuDQoNCmBgYHtyfQ0KdmFyKGRhbnNvMiRQT1ApDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqMy40Njc0NThlKzE3Kio6IGzDoCBnacOhIHRy4buLIHBoxrDGoW5nIHNhaSBj4bunYSBiaeG6v24gUE9QIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgZGFuc28yLg0KUGjGsMahbmcgc2FpIGzDoCBt4buZdCDEkeG6oWkgbMaw4bujbmcgdGjhu5FuZyBrw6ogxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIGJp4bq/biDEkeG7mW5nIGPhu6dhIGThu68gbGnhu4d1LiANCkdpw6EgdHLhu4sgcGjGsMahbmcgc2FpIGzhu5tuIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgYmnhur9uIMSR4buZbmcgY+G7p2EgdOG7lW5nIGTDom4gc+G7kSAoYmnhur9uIFBPUCkga2jDoSBjYW8gdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCBs4bubbiBnaeG7r2EgY8OhYyBnacOhIHRy4buLIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgaG/hurdjIGtodSB24buxYyBraMOhYyBuaGF1Lg0KDQpgYGB7cn0NCnNkKGRhbnNvMiRQT1ApDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqNTg4LDg1MSwyMzEqKjogbMOgIGdpw6EgdHLhu4sgxJHhu5kgbOG7h2NoIGNodeG6qW4gY+G7p2EgYmnhur9uLg0KxJDhu5kgbOG7h2NoIGNodeG6qW4gbMOgIG3hu5l0IMSR4bqhaSBsxrDhu6NuZyB0aOG7kW5nIGvDqiBtw7QgdOG6oyBt4bupYyDEkeG7mSBwaMOibiB0w6FuIGPhu6dhIGThu68gbGnhu4d1IHh1bmcgcXVhbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaC4gDQrEkOG7mSBs4buHY2ggY2h14bqpbiBs4bubbiBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIGJp4bq/biDEkeG7mW5nIGPhu6dhIHThu5VuZyBkw6JuIHPhu5Ega2jDoSBjYW8sIHbhu5tpIHPhu7EgY2jDqm5oIGzhu4djaCBs4bubbiBnaeG7r2EgY8OhYyBnacOhIHRy4buLIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgaG/hurdjIGtodSB24buxYyBraMOhYyBuaGF1IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuDQoNCmBgYHtyfQ0KbWVkaWFuKGRhbnNvMiRQT1ApDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqMzgzLDM5OToqKiBsw6AgZ2nDoSB0cuG7iyB0cnVuZyB24buLIChtZWRpYW4pLg0KVHJ1bmcgduG7iyBsw6AgZ2nDoSB0cuG7iyBjaGlhIGThu68gbGnhu4d1IHRow6BuaCBoYWkgcGjhuqduIGLhurFuZyBuaGF1LCB04bupYyBsw6AgY8OzIDUwJSBk4buvIGxp4buHdSBu4bqxbSBiw6puIHRyw6FpIHbDoCA1MCUgbuG6sW0gYsOqbiBwaOG6o2kuIA0KVHJ1bmcgduG7iyBj4bunYSB04buVbmcgZMOibiBz4buRIGzDoCAzLDgzMyw5OTgsIGNo4buJIHJhIHLhurFuZyBt4buZdCBu4butYSBjw6FjIHF14buRYyBnaWEgaG/hurdjIGtodSB24buxYyBjw7MgZMOibiBz4buRIGTGsOG7m2kgZ2nDoSB0cuG7iyBuw6B5LCB2w6AgbuG7rWEgY8OybiBs4bqhaSBjw7MgZMOibiBz4buRIGzhu5tuIGjGoW4gZ2nDoSB0cuG7iyBuw6B5Lg0KDQpgYGB7cn0NCnF1YW50aWxlKGRhbnNvMiRQT1AsIHByb2JzID0gYyguMywuNiwuOSkpDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqMzAlIFF1YW50aWxlKio6IEdpw6EgdHLhu4sgbcOgIDMwJSBk4buvIGxp4buHdSBkw6JuIHPhu5Egbmjhu48gaMahbi4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGdpw6EgdHLhu4sgbMOgIDU2NCwwMTAuOSwgdOG7qWMgbMOgIDMwJSBxdeG7kWMgZ2lhIGhv4bq3YyBraHUgduG7sWMgY8OzIGTDom4gc+G7kSBkxrDhu5tpIGdpw6EgdHLhu4sgbsOgeS4NCg0KICAqICoqNjAlIFF1YW50aWxlKio6IEdpw6EgdHLhu4sgbcOgIDYwJSBk4buvIGxp4buHdSBkw6JuIHPhu5Egbmjhu48gaMahbi4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGdpw6EgdHLhu4sgbMOgIDYsNjM0LDI1NC4wLCBjaOG7iSByYSBy4bqxbmcgNjAlIHF14buRYyBnaWEgaG/hurdjIGtodSB24buxYyBjw7MgZMOibiBz4buRIGTGsOG7m2kgZ2nDoSB0cuG7iyBuw6B5Lg0KDQogICogKio5MCUgUXVhbnRpbGUqKjogR2nDoSB0cuG7iyBtw6AgOTAlIGThu68gbGnhu4d1IGTDom4gc+G7kSBuaOG7jyBoxqFuLiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgZ2nDoSB0cuG7iyBsw6AgODYsODA1LDQzNC4wLCB04bupYyBsw6AgOTAlIHF14buRYyBnaWEgaG/hurdjIGtodSB24buxYyBjw7MgZMOibiBz4buRIGTGsOG7m2kgZ2nDoSB0cuG7iyBuw6B5Lg0KDQojIyMgKioyLjcgVMONTkggVE/DgU4gQ8OBQyDEkOG6tkMgVFLGr05HIMSQTyBMxq/hu5xORyBUSEVPIE5Iw5NNKioNCg0KVGEgdGnhur9wIHThu6VjIHPhu60gZOG7pW5nIGLhuqNuZyBEYXRhIGRhbnNvMiDEkeG7gyB0aOG7sWMgaGnhu4duIGPDoWMgdGhhbyB0w6FjIHTDrW5oIHRvw6FuIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBuaMOzbS4NCkPDoWMgY8OidSBs4buHbmggbsOgeSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIHRoZW8gaGFpIGhheSBuaGnhu4F1IGJp4bq/bi4NCg0KDQpgYGB7cn0NCnRuIDwtIGRhbnNvMiAlPiUgZ3JvdXBfYnkoWSkgJT4lIHN1bW1hcmlzZShtZWFuX29mX1BPUD0gbWVhbihQT1ApKQ0KdG4NCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGEgYmnhur90Og0KDQogICogKip0bioqOiBsw6AgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSB04buVbmcgZMOibiBz4buRIHRoZW8gbsSDbS4NCg0KYGBge3J9DQp0bjEgPC0gZGFuc28yICU+JSBncm91cF9ieShZKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCksbWVkX29mX1BPUD0gbWVkaWFuKFBPUCkpDQp0bjENCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGEgYmnhur90Og0KDQogICogKip0bjEqKjogbMOgIHRydW5nIHbhu4sgY+G7p2EgdOG7lW5nIGTDom4gc+G7kSAgdGhlbyBuxINtIHRyb25nIMSRw7MgKipuPW4oKSoqIGNobyBiaeG6v3Qgc+G7kSBs4bqnbiBuxINtIMSRw7MgeHXhuqV0IGhp4buHbi4NCg0KYGBge3J9DQp0bjIgPC0gZGFuc28yICU+JSBncm91cF9ieShRRykgJT4lIHN1bW1hcmlzZShtZWFuX29mX1BPUD0gbWVhbihQT1ApKQ0KdG4yDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqdG4yKio6IGzDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHThu5VuZyBkw6JuIHPhu5EgdGhlbyB04burbmcgcXXhu5FjIGdpYSBoYXkga2h1IHbhu7FjLg0KDQpgYGB7cn0NCnRuMyA8LSBkYW5zbzIgJT4lIGdyb3VwX2J5KFksUUcpICU+JSBzdW1tYXJpc2UobWVhbl9vZl9QT1A9IG1lYW4oUE9QKSwuZ3JvdXBzID0gJ2Ryb3AnKQ0KdG4zDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqdG4zKiogbMOgIGdpw6EgdHLhu4sgdHJ1bmcgYmluaCBj4bunYSB04buVbmcgZMOibiBz4buRIHRoZW8gdOG7q25nIG7Eg20gY+G7p2EgdOG7q25nIHF14buRYyBnaWEgaGF5IGtodSB24buxYy4NCg0KDQoqKioNCiMgKipOSEnhu4ZNIFbhu6QgMy4yKiogIA0KKioqDQojIyAqKjEuIEdJ4buaSSBUSEnhu4ZVIENISSBUSeG6vlQgVuG7gCBC4buYIEThu64gTEnhu4ZVKioNCg0KIyMjICoqMS4xIFTDk00gVOG6rlQgQuG7mCBE4buuIExJ4buGVSoqDQoNCg0KQuG7mSBk4buvIGxp4buHdSAqKndvcmxkX3BvcHVsYXRpb24qKiBtw7QgdOG6oyB24buBIGTDom4gc+G7kSBjdW5nIGPhuqVwIMaw4bubYyB0w61uaCBkw6JuIHPhu5EgdG/DoG4gY+G6p3UsIHbhu5tpIFRydW5nIFF14buRYyB2w6Ag4bqkbiDEkOG7mSBsw6AgaGFpIHF14buRYyBnaWEgxJHDtG5nIGTDom4gbmjhuqV0LiANCsSQ4buTbmcgdGjhu51pIGPFqW5nIGN1bmcgY+G6pXAgdGjDtG5nIHRpbiB24buBIGTDom4gc+G7kSBj4bunYSAxMSBxdeG7kWMgZ2lhIMSRw7RuZyBkw6JuLCBjw6FjIHF14buRYyBnaWEgY8OzIGTDom4gc+G7kSDDrXQgaMahbiB2w6Aga+G7syB24buNbmcgdMSDbmcgdHLGsOG7n25nIGTDom4gc+G7kSB0cm9uZyB0xrDGoW5nIGxhaS4gDQpC4buZIGThu68gbGnhu4d1IGPFqW5nIGNo4bupYSB0aMO0bmcgdGluIGNoaSB0aeG6v3QgduG7gSB04burbmcgcXXhu5FjIGdpYSwgYmFvIGfhu5NtIGRp4buHbiB0w61jaCwgbeG6rXQgxJHhu5kgZMOibiBz4buRLCB2w6AgY8OhYyBjaOG7iSBz4buRIGtow6FjLg0KDQojIyMgKioxLjIgVEjDlE5HIFRJTiBDSEkgVEnhur5UIEPhu6ZBIELhu5ggROG7riBMSeG7hlUqKg0KDQpUcsaw4bubYyB0acOqbiDEkeG7gyDEkeG7jWMgduG7gSBi4buZIGThu68gbGnhu4d1IHThu6sgbeG7mXQgdOG7h3AgQ1NWIHbDoG8gdHJvbmcgUiwgdGEgY8OzIHRo4buDIHRo4buxYyBoaeG7h24gYuG6sW5nIGPDoWMgY8OidSBs4buHbmggc2F1Og0KDQpgYGB7cn0NCiNT4butIGThu6VuZyBs4buHbmggcmVhZC5jc3YgxJHhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBjc3YgdsOgbyBSIHbDoCBnw6FuIHbDoG8gImRhbnNvIg0KV1BPUCA8LSByZWFkLmNzdihmaWxlID0gIkM6L1VzZXJzL0hQL0Rvd25sb2Fkcy93b3JsZF9wb3B1bGF0aW9uLmNzdiIpDQpgYGANCg0KxJDhu4MgxJHhu41jIG3DtCB04bqjIGNoaSB0aeG6v3QgduG7gSBj4bqldSB0csO6YyBj4bunYSBi4buZIGThu68gbGnhu4d1IHRhIHPhu60gZOG7pW5nIGPDonUgbOG7h25oIHN0cg0KDQpgYGB7cn0NCiNT4butIGThu6VuZyBs4buHbmggc3RyIMSR4buDIHhlbSBj4bqldSB0csO6YyBj4bunYSBi4buZIGThu68gbGnhu4d1ICJkYW5zbyINCnN0cihXUE9QKQ0KYGBgDQoNCioqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyBtw6AgY8OidSBs4buHbmggdHLhuqMgduG7gSoqDQoNCiogKionZGF0YS5mcmFtZSc6CTIzNCBvYnMuIG9mICAxNyB2YXJpYWJsZXMqKiDEkMOieSBsw6AgYuG7mSBk4buvIGxp4buHdSBkYXRhIGZyYW1lLCBiYW8gZ+G7k20gMjM0IHF1YW4gc8OhdCAtIG9icyAodMawxqFuZyDhu6luZyB24bubaSAyMzQgaMOgbmcgdHJvbmcgZmlsZSBDU1YpIHbDoCAxNyBiaeG6v24gLSB2YXJpYWJsZXMgKHTGsMahbmcg4bupbmcgduG7m2kgMTcgY+G7mXQgdHJvbmcgZmlsZSBDU1YpDQoqICoqQ+G7mFQgMSoqIGzDoCB0w6puIGPDoWMgYmnhur9uIOG7qW5nIHbhu5tpIGjDoG5nIG5nYW5nIMSR4bqndSB0acOqbiB0cm9uZyBmaWxlIENTVi4NCiAgKiAqKlJhbms6KiogWOG6v3AgaOG6oW5nDQogICogKipDQ0EzOioqIE3DoyBxdeG7kWMgZ2lhL3bDuW5nIGzDo25oIHRo4buVIGfhu5NtIDMgY2jhu68gc+G7kS4NCiAgKiAqKkNvdW50cnkuVGVycml0b3J5OioqIFTDqm4gY+G7p2EgUXXhu5FjIGdpYS9Mw6NuaCB0aOG7lS4NCiAgKiAqKkNhcGl0YWw6KiogVMOqbiB0aOG7pyDEkcO0Lg0KICAqICoqQ29udGluZW50OioqIFTDqm4gY+G7p2EgbOG7pWMgxJHhu4thLg0KICAqICoqWDIwMjIuUG9wdWxhdGlvbjoqKiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMjAyMi4NCiAgKiAqKlgyMDIwLlBvcHVsYXRpb246KiogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDIwMjAuDQogICogKipYMjAxNS5Qb3B1bGF0aW9uOioqIETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIG7Eg20gMjAxNS4NCiAgKiAqKlgyMDEwLlBvcHVsYXRpb246KiogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDIwMTAuDQogICogKipYMjAwMC5Qb3B1bGF0aW9uOioqIETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHbDoG8gbsSDbSAyMDAwLg0KICAqICoqWDE5OTAuUG9wdWxhdGlvbjoqKiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMTk5MC4NCiAgKiAqKlgxOTgwLlBvcHVsYXRpb246KiogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDE5ODAuDQogICogKipYMTk3MC5Qb3B1bGF0aW9uOioqIETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHbDoG8gbsSDbSAxOTcwLg0KICAqICoqQXJlYS4oa23Csik6KiogRGnhu4duIHTDrWNoIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdMOtbmggYuG6sW5nIGttIHZ1w7RuZy4NCiAgKiAqKkRlbnNpdHkuKHBlci5rbcKyKToqKiBN4bqtdCDEkeG7mSBkw6JuIHPhu5EgdHLDqm4ga20gdnXDtG5nLg0KICAqICoqR3Jvd3RoLlJhdGU6KiogVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EgdGhlbyBxdeG7kWMgZ2lhL3bDuW5nIGzDo25oIHRo4buVLg0KICAqICoqV29ybGQuUG9wdWxhdGlvbi5QZXJjZW50YWdlOioqIFThu7cgbOG7hyBkw6JuIHPhu5EgdGhlbyB04burbmcgcXXhu5FjIGdpYS92w7luZyBsw6NuaCB0aOG7lS4NCg0KKiAqKkPhu5hUIDIqKiBsw6Aga2nhu4N1IGJp4bq/biwg4bupbmcgduG7m2kgbmjhu69uZyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCiAgKiAqKmNocjoqKiBLaeG7g3UgYmnhur9uIGzDoCBrw70gdOG7sQ0KICAqICoqaW50IjoqKiBLaeG7g3UgYmnhur9uIGzDoCBz4buRIG5ndXnDqm4NCiAgKiAqKm51bToqKiBLaeG7g3UgYmnhur9uIGzDoCBz4buXIHRo4buxYw0KICANCiogKipD4buYVCAzKiogbMOgIG5o4buvbmcgcXVhbiBzw6F0IGPDsyDEkcaw4bujYy4NCg0KS2nhu4NtIHRyYSBjw7MgdOG6pXQgY+G6oyBiYW8gbmhpw6p1IHF14buRYyBnaWEgdHJvbmcgYuG7mSBk4buvIGxp4buHdSB0csOqbiBi4bqxbmcgY8OidSBs4buHbmggc2F1Og0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBtw6AgdMOqbiBjw6FjIHF14buRYyBnaWEgxJHGsOG7o2MgbOG6t3AgbOG6oWkgdsOgIGfDoW4gdsOgbyBzb1FHDQpzb1FHMiA8LSB0YWJsZShXUE9QJENvdW50cnkuVGVycml0b3J5KSANCiNYZW0gc+G7kSBsxrDhu6NuZyBxdeG7kWMgZ2lhIMSRxrDhu6NjIHF1YW4gc8OhdA0KZGltKHNvUUcyKQ0KYGBgDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBIGNobyB0YSB0aOG6pXkgY8OzIDIzNCBxdeG7kWMgZ2lhIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuIA0KDQpLaeG7g20gdHJhIGdpw6EgdHLhu4sgYuG7iyB0aGnhur91ICB0cm9uZyBi4buZIGThu68gbGnhu4d1IHRyw6puIGLhurFuZyBjw6J1IGzhu4duaCBzYXU6DQoNCmBgYHtyfQ0KI0tp4buDbSB0cmEgeGVtIGPDsyBiYW8gbmhpw6p1IGdpw6EgdHLhu4sgYuG7iyB0aGnhur91DQpzdW0oaXMubmEoV1BPUCkpDQpgYGANCkvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIHRhIHRo4bqleSBraMO0bmcgY8OzIGdpw6EgdHLhu4sgYuG7iyB0aGnhur91Lg0KDQojIyAqKjIuIENI4buMTiBWw4AgUEjDgk4gVMONQ0ggQ0hJIFRJ4bq+VCBW4buAIELhu5ggROG7riBMSeG7hlUqKg0KDQpC4buZIGThu68gbGnhu4d1ICB3b3JsZF9wb3B1bGF0aW9uLmNzdiBjaOG7qWEgbeG7mXQgbMaw4bujbmcgdGjDtG5nIHRpbiDEkeG7kyBz4buZLCB0dXkgbmhpw6puIGNow7puZyB0YSBraMO0bmcgdGjhu4MgZMO5bmcgaOG6v3QgxJHGsOG7o2MgZOG7ryBsaeG7h3UgdGh1IHbhu4EuIFRyb25nIHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoLCBjaMO6bmcgdGEgc+G6vSB0aeG6v24gaMOgbmggY8OhYyBixrDhu5tjIHRo4buxYyBoaeG7h24gc2F1IMSRw6J5Lg0KDQojIyMgKioyLjEgQ0jhu4xOIFJBIELhu5ggROG7riBMSeG7hlUgQ+G6pk4gUEjDgk4gVMONQ0gqKg0KDQpUYSBz4bq9IGNo4buNbiByYSBuaOG7r25nIGJp4bq/biBsw6AgY8OhYyBiaeG6v24gc2F1DQpUYSB0aeG6v24gaMOgbmggZ+G7jWkgcGFja3NnZSB0aWR5dmVyc2UgZMO5bmcgxJHhu4Mgc+G7rSBk4bulbmcgdG/DoW4gdOG7rSBwaXBlICU+JS4gDQoNCmBgYHtyfQ0KIyBH4buNaSByYSBnw7NpIHRpZHl2ZXJzZQ0KbGlicmFyeSh0aWR5dmVyc2UpIA0KIyBDaOG7jW4gcmEgY8OhYyBiaeG6v24gY+G6p24gdGhp4bq/dCDEkeG7gyB44butIGzDvQ0KV1BPUDIgPC0gV1BPUCAlPiUgc2VsZWN0KFJhbmssIENvdW50cnkuVGVycml0b3J5LCBYMjAyMi5Qb3B1bGF0aW9uLCBYMjAyMC5Qb3B1bGF0aW9uLCBYMjAxNS5Qb3B1bGF0aW9uLCBYMjAxMC5Qb3B1bGF0aW9uLCBHcm93dGguUmF0ZSwgV29ybGQuUG9wdWxhdGlvbi5QZXJjZW50YWdlKQ0KbmFtZXMoV1BPUDIpDQpgYGANCg0KVuG7m2kgY8OidSBs4buHbmggdHLDqm4gdGEgaG/DoG4gdOG6pXQgxJHhu4MgY2jhu41uIHJhIGJp4bq/biBsw6A6DQoNCiAgKiBSYW5rOiBY4bq/cCBo4bqhbmcNCiAgKiBDb3VudHJ5LlRlcnJpdG9yeTogVMOqbiBj4bunYSBRdeG7kWMgZ2lhL0zDo25oIHRo4buVLg0KICAqIFgyMDIyLlBvcHVsYXRpb246IETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHbDoG8gbsSDbSAyMDIyLg0KICAqIFgyMDIwLlBvcHVsYXRpb246IETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHbDoG8gbsSDbSAyMDIwLg0KICAqIFgyMDE1LlBvcHVsYXRpb246IETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIG7Eg20gMjAxNS4NCiAgKiBYMjAxMC5Qb3B1bGF0aW9uOiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMjAxMC4NCiAgKiBHcm93dGguUmF0ZTogVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EgdGhlbyBxdeG7kWMgZ2lhL3bDuW5nIGzDo25oIHRo4buVLg0KICAqIFdvcmxkLlBvcHVsYXRpb24uUGVyY2VudGFnZTogVOG7tyBs4buHIGTDom4gc+G7kSB0aGVvIHThu6tuZyBxdeG7kWMgZ2lhL3bDuW5nIGzDo25oIHRo4buVLg0KDQojIyMgKioyLjIgxJDhu5RJIFTDik4gQ8OBQyBCSeG6vk4gROG7riBMSeG7hlUqKg0KDQpUYSB0aeG6v24gaMOgbmggxJHhu5VpIHTDqm4gYmnhur9uIMSR4buDIGThu4UgZMOgbmcgdGhhbyB0w6FjIGjGoW4NCg0KYGBge3J9DQojIEzhu4duaCDEkeG7lWkgdMOqbiBiaeG6v24NCldQT1AyIDwtIFdQT1AyICU+JSByZW5hbWUoJ1InID0gUmFuaywgJ1FHMicgPSBDb3VudHJ5LlRlcnJpdG9yeSAsICdQT1AyMicgPSBYMjAyMi5Qb3B1bGF0aW9uLCAnUE9QMjAnID0gWDIwMjAuUG9wdWxhdGlvbiwgJ1BPUDE1JyA9IFgyMDE1LlBvcHVsYXRpb24sICdQT1AxMCcgPSBYMjAxMC5Qb3B1bGF0aW9uLCAnR1InID0gR3Jvd3RoLlJhdGUsICdUTERTJyA9IFdvcmxkLlBvcHVsYXRpb24uUGVyY2VudGFnZSkNCm5hbWVzKFdQT1AyKQ0KYGBgDQpW4bubaSBjw6J1IGzhu4duaCB2w6Aga+G6v3QgcXXhuqMgdHLDqm4gdGjDrCB0w6puIGJp4bq/biDEkcOjIMSRxrDhu6NjIMSR4buVaSB0xrDGoW5nIOG7qW5nIHbhu5tpIHRo4bupIHThu7EgYmnhur9uIHRyb25nIGRhdGEgKipXUE9QMioqLg0KDQojIyMgKioyLjMgTOG6rFAgQuG6ok5HIFThuqZOIFPhu5AqKg0KDQojIyMjICoqMi4zLjEgQuG6o25nIHThuqduIHPhu5EgbeG7mXQgYmnhur9uKiogDQoNCsSQ4buRaSB24bubaSBjw6J1IGzhu4duaCB0YWJsZSgpLCBjaMO6bmcgdGEgY8OzIGto4bqjIG7Eg25nIHhlbSB4w6l0IHThuqduIHN14bqldCB4deG6pXQgaGnhu4duIGPhu6dhIG3hu5l0IGJp4bq/biB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4gDQrEkGnhu4F1IG7DoHkgbWFuZyBs4bqhaSBs4bujaSDDrWNoIGzhu5tuIHRyb25nIHZp4buHYyB04buVbmcgaOG7o3AgbeG7mXQgbMaw4bujbmcgbOG7m24gZOG7ryBsaeG7h3UgdGjDoG5oIG3hu5l0IGLhuqNuZyBuZ+G6r24gZ+G7jW4sIGdpw7pwIHF1w6EgdHLDrG5oIHBow6JuIHTDrWNoIHRy4bufIG7Dqm4gdGh14bqtbiB0aeG7h24gdsOgIGThu4UgZMOgbmcNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNobyBiaeG6v24gIlIiIChY4bq/cCBo4bqhbmcpDQpSMSA8LSBjdXQoV1BPUDIkVExEUywzKQ0KdGFibGUoUjEpDQpgYGANCg0KS+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRhIGJp4bq/dDoNCg0KICBT4butIGThu6VuZyBow6BtIGN1dCgpIMSR4buDIGNoaWEgZOG7ryBsaeG7h3UgdHJvbmcgYmnhur9uIFThu4kgbOG7hyBkw6JuIHPhu5EgdGh14buZYyBkYXRhIFdQT1AyIHRow6BuaCAzIG5ow7NtDQogICogKC0wLjAxNzksNS45Nl0gIHh14bqldCBoaeG7h24gduG7m2kgMjMyIHF1YW4gc8OhdC4NCiAgKiAoNS45NiwxMS45XSB4deG6pXQgaGnhu4duIHbhu5tpIDAgcXVhbiBzw6F0Lg0KICAqICgxMS45LDE3LjldICB4deG6pXQgaGnhu4duIHbhu5tpIDIgcXVhbiBzw6F0Lg0KDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaG8gYmnhur9uICJSIiAoWOG6v3AgaOG6oW5nKQ0KUjIgPC0gY3V0KFdQT1AyJEdSLDMpDQp0YWJsZShSMikNCmBgYA0KDQpL4bq/dCBxdeG6oyB0csOqbiBjaG8gdGEgYmnhur90Og0KDQogIFPhu60gZOG7pW5nIGjDoG0gY3V0KCkgxJHhu4MgY2hpYSBk4buvIGxp4buHdSB0cm9uZyBiaeG6v24gVOG7iSBs4buHIGTDom4gc+G7kSB0aHXhu5ljIGRhdGEgV1BPUDIgdGjDoG5oIDMgbmjDs20NCiAgKiAoMC45MTIsMC45NjRdICB4deG6pXQgaGnhu4duIHbhu5tpIDEgcXVhbiBzw6F0Lg0KICAqICgwLjk2NCwxLjAyXSB4deG6pXQgaGnhu4duIHbhu5tpIDE3NCBxdWFuIHPDoXQuDQogICogKDEuMDIsMS4wN10gIHh14bqldCBoaeG7h24gduG7m2kgNTkgcXVhbiBzw6F0Lg0KICANCiMjIyMgKioyLjMuMiBC4bqjbmcgdOG6p24gc+G7kSBuaGnhu4F1IGJp4bq/bioqDQoNClbhu5tpIGPDonUgbOG7h25oIGdyb3VwX2J5IGNobyBwaMOpcCBs4bqtcCBi4bqjbmcgduG7m2kgbmhp4buBdSBiaeG6v24gY8O5bmcgbMO6Yy4NCg0KKipC4bqiTkcgVOG6pk4gU+G7kCBU4buIIEzhu4YgVFLGr+G7nk5HIETDgk4gU+G7kCBWw4AgVOG7iCBM4buGIETDgk4gU+G7kCBD4bumQSBDw4FDIFFV4buQQyBHSUEvS0hVIFbhu7BDDQoNCmBgYHtyfQ0KV1BPUDMgPC0gV1BPUDIgJT4lIGdyb3VwX2J5KFFHMiwgR1IsIFRMRFMpICU+JSBzdW1tYXJpc2Uobj0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KV1BPUDMNCmBgYA0KDQpL4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5OiANCg0KICAqQuG6o25nIHThuqVuIHPhu5EgduG7m2kgbOG7h25oIHRyw6puIGNobyByYSB04bqnbiBzdeG6pXQgZOG7ryBsaeG7h3UgY+G7p2EgY8OhYyBiaeG6v24gJ1FHMicsICdHUicsICdUTERTJy4gQ8OidSBs4buHbmggc3VtbWFyaXNlKG49IG4oKSBjaG8gcmEgc+G7kSBuIHThuqduIHN14bqldCBj4bunYSBk4buvIGxp4buHdSB2w6AgZ3JvdXBzID0gJ2Ryb3AnIGdpw7pwIGNoaWEgbmjDs20gZOG7ryBsaeG7h3UuIA0KICANCiMjIyAqKjIuNCBUw41OSCBUT8OBTiBDw4FDIMSQ4bq2QyBUUsavTkcgxJBPIEzGr+G7nE5HKioNCg0KxJDhu4MgxJHhuqF0IMSRxrDhu6NjIHTDrW5oIHRvw6FuIGNow61uaCB4w6FjIHbDoCBjaGkgdGnhur90IHbhu4EgY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZyBj4bunYSBiaeG6v24gZMOibiBz4buRIHbDoG8gbsSDbSAyMDIyIChQT1AyMiksIGNow7puZyB0YSB0aeG6v24gaMOgbmggcGjDom4gdMOtY2ggc8OidSBz4bqvYyB0csOqbiBi4bqjbmcgRGF0YSBXUE9QMg0KUXVhIHF1w6EgdHLDrG5oIG7DoHksIGNow7puZyB0YSBz4bq9IHRo4buxYyBoaeG7h24gY8OhYyB0aGFvIHTDoWMgdMOtbmggdG/DoW4ga+G7uSBsxrDhu6FuZywgbWFuZyBs4bqhaSBjw6FpIG5ow6xuIHLDtSByw6BuZyB2w6AgxJHhuqd5IMSR4bunIHbhu4EgxJHhu5luZyBs4buxYyB2w6AgYmnhur9uIMSR4buZbmcgY+G7p2EgZMOibiBz4buRIHRyb25nIGLhu5kgRGF0YS4NCg0KYGBge3J9DQpzdW1tYXJ5KFdQT1AyJFBPUDIyKQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0YSBiaeG6v3Qgbmjhu69uZyB0aMO0bmcgdGluIHNhdToNCg0KICAqICoqTWluKio6IEdpw6EgdHLhu4sgbmjhu48gbmjhuqV0IHRyb25nIGThu68gbGnhu4d1LCBsw6AgNS4xMDBlKzAyLg0KICAqICoqMXN0IFF1LioqIChQcmltZXIgUXVhcnRpbGUpOiBHacOhIHRy4buLIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0LCB04bupYyBsw6AgZ2nDoSB0cuG7iyBtw6AgMjUlIGThu68gbGnhu4d1IG5o4buPIGjGoW4gdsOgIDc1JSBk4buvIGxp4buHdSBs4bubbiBoxqFuLiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgZ2nDoSB0cuG7iyBsw6AgNC4xOTdlKzA1Lg0KICAqICoqTWVkaWFuKiogKFRydW5nIHbhu4spOiBHacOhIHRy4buLIGdp4buvYSBj4bunYSBk4buvIGxp4buHdSBraGkgxJHGsOG7o2Mgc+G6r3AgeOG6v3AgdMSDbmcgZOG6p24uIDUwJSBk4buvIGxp4buHdSBuaOG7jyBoxqFuIHbDoCA1MCUgZOG7ryBsaeG7h3UgbOG7m24gaMahbi4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGdpw6EgdHLhu4sgbMOgIDUuNTYwZSswNi4NCiAgKiAqKk1lYW4qKiAoVHJ1bmcgYsOsbmgpOiBHacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGThu68gbGnhu4d1LCBsw6AgMy40MDdlKzA3Lg0KICAqICoqM3JkIFF1LioqIChUaGlyZCBRdWFydGlsZSk6IEdpw6EgdHLhu4sgcGjDom4gduG7iyB0aOG7qSBiYSwgdOG7qWMgbMOgIGdpw6EgdHLhu4sgbcOgIDc1JSBk4buvIGxp4buHdSBuaOG7jyBoxqFuIHbDoCAyNSUgZOG7ryBsaeG7h3UgbOG7m24gaMahbi4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGdpw6EgdHLhu4sgbMOgIDIuMjQ4ZSswNy4NCiAgKiAqKk1heC4qKjogR2nDoSB0cuG7iyBs4bubbiBuaOG6pXQgdHJvbmcgZOG7ryBsaeG7h3UsIGzDoCAxLjQyNmUrMDkuDQoNCmBgYHtyfQ0Kc3VtKFdQT1AyJFBPUDIyKSANCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGEgYmnhur90Og0KDQogICogKio3OTczNDEzMDQyMioqOiBsw6AgdOG7lW5nIGPhu6dhIHThuqV0IGPhuqMgY8OhYyBnacOhIHRy4buLIHRyb25nIGJp4bq/biBQT1AyMiBj4bunYSBi4buZIGThu68gbGnhu4d1IFdQT1AyLiANCkdpw6EgdHLhu4sgbsOgeSB0aMaw4budbmcgxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBkxrDhu5tpIGThuqFuZyBz4buRIHRo4buxYyBk4bqldSBjaOG6pW0gxJHhu5luZyB24bubaSBt4bupYyDEkeG7mSBjaMOtbmggeMOhYyBjYW8uICANCg0KYGBge3J9DQptZWFuKFdQT1AyJFBPUDIyLG5hLnJtID0gVCkgDQpgYGAgDQoNCkvhur90IHF14bqjIGNobyB0YSBiaeG6v3Q6DQoNCiAgKiAqKjM0MDc0NDE1Kio6ICBnacOhIHRy4buLIG7DoHkgYmnhu4N1IHRo4buLIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgYmnhur9uIFBPUCAodOG7lW5nIGTDom4gc+G7kSkgdHLDqm4gdG/DoG4gYuG7mSBi4buZIGThu68gbGnhu4d1IGRhbnNvMi4gDQpEbyDEkcOzLCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGTDom4gc+G7kSB0cm9uZyBi4buZIGThu68gbGnhu4d1IGzDoCBraG/huqNuZyAxMjYgdHJp4buHdSBuZ8aw4budaQ0KDQpgYGB7cn0NCmxlbmd0aChXUE9QMiRQT1AyMikNCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGEgYmnhur90Og0KDQogICogKioyMzQqKiBsw6AgY8OzIHThu5VuZyBj4buZbmcgMjM0IHF1YW4gc8OhdCB24buBIGTDom4gc+G7kSB04burIGPDoWMgcXXhu5FjIGdpYSBob+G6t2Mga2h1IHbhu7FjIGtow6FjIG5oYXUgdHJvbmcgZOG7ryBsaeG7h3UuDQoNCmBgYHtyfQ0KdmFyKFdQT1AyJFBPUDIyKQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0YSBiaeG6v3Q6DQoNCiAgKiAqKjEuODcwNTA1ZSsxNioqOiBsw6AgZ2nDoSB0cuG7iyBwaMawxqFuZyBzYWkgY+G7p2EgYmnhur9uIFBPUCB0cm9uZyBi4buZIGThu68gbGnhu4d1IGRhbnNvMi4NClBoxrDGoW5nIHNhaSBsw6AgbeG7mXQgxJHhuqFpIGzGsOG7o25nIHRo4buRbmcga8OqIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBiaeG6v24gxJHhu5luZyBj4bunYSBk4buvIGxp4buHdS4gDQpHacOhIHRy4buLIHBoxrDGoW5nIHNhaSBs4bubbiBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIGJp4bq/biDEkeG7mW5nIGPhu6dhIHThu5VuZyBkw6JuIHPhu5EgKGJp4bq/biBQT1ApIGtow6EgY2FvIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UsIGPDsyBz4buxIGNow6puaCBs4buHY2ggbOG7m24gZ2nhu69hIGPDoWMgZ2nDoSB0cuG7iyBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIGhv4bq3YyBraHUgduG7sWMga2jDoWMgbmhhdS4NCg0KYGBge3J9DQpzZChXUE9QMiRQT1AyMikNCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGEgYmnhur90Og0KDQogICogKioxMyw2NzY2LDQyNSoqOiBsw6AgZ2nDoSB0cuG7iyDEkeG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBiaeG6v24uDQrEkOG7mSBs4buHY2ggY2h14bqpbiBsw6AgbeG7mXQgxJHhuqFpIGzGsOG7o25nIHRo4buRbmcga8OqIG3DtCB04bqjIG3hu6ljIMSR4buZIHBow6JuIHTDoW4gY+G7p2EgZOG7ryBsaeG7h3UgeHVuZyBxdWFuaCBnacOhIHRy4buLIHRydW5nIGLDrG5oLiANCsSQ4buZIGzhu4djaCBjaHXhuqluIGzhu5tuIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgYmnhur9uIMSR4buZbmcgY+G7p2EgdOG7lW5nIGTDom4gc+G7kSBraMOhIGNhbywgduG7m2kgc+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIGdp4buvYSBjw6FjIGdpw6EgdHLhu4sgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBob+G6t2Mga2h1IHbhu7FjIGtow6FjIG5oYXUgdHJvbmcgYuG7mSBk4buvIGxp4buHdS4NCg0KYGBge3J9DQptZWRpYW4oV1BPUDIkUE9QMjIpDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqNSw1NTksOTQ1OioqIGzDoCBnacOhIHRy4buLIHRydW5nIHbhu4sgKG1lZGlhbikuDQpUcnVuZyB24buLIGzDoCBnacOhIHRy4buLIGNoaWEgZOG7ryBsaeG7h3UgdGjDoG5oIGhhaSBwaOG6p24gYuG6sW5nIG5oYXUsIHThu6ljIGzDoCBjw7MgNTAlIGThu68gbGnhu4d1IG7hurFtIGLDqm4gdHLDoWkgdsOgIDUwJSBu4bqxbSBiw6puIHBo4bqjaS4gDQpUcnVuZyB24buLIGPhu6dhIHThu5VuZyBkw6JuIHPhu5EgbMOgIDMsODMzLDk5OCwgY2jhu4kgcmEgcuG6sW5nIG3hu5l0IG7hu61hIGPDoWMgcXXhu5FjIGdpYSBob+G6t2Mga2h1IHbhu7FjIGPDsyBkw6JuIHPhu5EgZMaw4bubaSBnacOhIHRy4buLIG7DoHksIHbDoCBu4butYSBjw7JuIGzhuqFpIGPDsyBkw6JuIHPhu5EgbOG7m24gaMahbiBnacOhIHRy4buLIG7DoHkuDQoNCmBgYHtyfQ0KcXVhbnRpbGUoV1BPUDIkUE9QMjIsIHByb2JzID0gYyguMywuNiwuOSkpDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRhIGJp4bq/dDoNCg0KICAqICoqMzAlIFF1YW50aWxlKio6IEdpw6EgdHLhu4sgbcOgIDMwJSBk4buvIGxp4buHdSBkw6JuIHPhu5Egbmjhu48gaMahbi4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGdpw6EgdHLhu4sgbMOgIDgwNjA5OC45ICwgdOG7qWMgbMOgIDMwJSBxdeG7kWMgZ2lhIGhv4bq3YyBraHUgduG7sWMgY8OzIGTDom4gc+G7kSBkxrDhu5tpIGdpw6EgdHLhu4sgbsOgeS4NCg0KICAqICoqNjAlIFF1YW50aWxlKio6IEdpw6EgdHLhu4sgbcOgIDYwJSBk4buvIGxp4buHdSBkw6JuIHPhu5Egbmjhu48gaMahbi4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGdpw6EgdHLhu4sgbMOgIDk5NjQ0MDMuOCwgY2jhu4kgcmEgcuG6sW5nIDYwJSBxdeG7kWMgZ2lhIGhv4bq3YyBraHUgduG7sWMgY8OzIGTDom4gc+G7kSBkxrDhu5tpIGdpw6EgdHLhu4sgbsOgeS4NCg0KICAqICoqOTAlIFF1YW50aWxlKio6IEdpw6EgdHLhu4sgbcOgIDkwJSBk4buvIGxp4buHdSBkw6JuIHPhu5Egbmjhu48gaMahbi4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGdpw6EgdHLhu4sgbMOgIDU5NjM2OTYxLjcgLCB04bupYyBsw6AgOTAlIHF14buRYyBnaWEgaG/hurdjIGtodSB24buxYyBjw7MgZMOibiBz4buRIGTGsOG7m2kgZ2nDoSB0cuG7iyBuw6B5Lg0KDQojIyAqKjMuIE5I4bqsTiBYw4lUIFbhu4AgQuG7mCBE4buuIExJ4buGVSoqDQoNCkThu7FhIHRyw6puIG5o4buvbmcgbmjhuq1uIHjDqXQgdOG7qyBwaMOibiB0w61jaCBi4buZIGThu68gbGnhu4d1IGTDom4gc+G7kSAod29ybGRfcG9wdWxhdGlvbi5jc3YpLCBjaMO6bmcgdGEgY8OzIHRo4buDIHLDunQgcmEgbeG7mXQgc+G7kSBwaMOibiB0w61jaCBxdWFuIHRy4buNbmcgduG7gSDEkeG6t2MgxJFp4buDbSBj4bunYSBjw6FjIHF14buRYyBnaWEgdsOgIGzDo25oIHRo4buVIHRyw6puIHRvw6BuIHRo4bq/IGdp4bubaS4gDQoNCk5o4buvbmcgcGjDom4gdMOtY2ggbsOgeSBjw7MgdGjhu4MgZ2nDunAgdGEgaGnhu4N1IHLDtSBoxqFuIHbhu4EgY+G6pXUgdHLDumMgZMOibiBz4buRIHRo4bq/IGdp4bubaSwgc+G7sSBjaMOqbmggbOG7h2NoIGdp4buvYSBjw6FjIHF14buRYyBnaWEsIHbDoCDEkcOzbmcgZ8OzcCBj4bunYSBjaMO6bmcgdsOgbyB0w6xuaCBow6xuaCBkw6JuIHPhu5EgdG/DoG4gY+G6p3UuIA0KxJDhu5NuZyB0aOG7nWksIGNow7puZyBjxaluZyBsw6AgY8ahIHPhu58gxJHhu4MgdGnhur9wIHThu6VjIHBow6JuIHTDrWNoIGNoaSB0aeG6v3QgaMahbiB24buBIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gZMOibiBz4buRIHbDoCB0xINuZyB0csaw4bufbmcgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBj4bulIHRo4buDLg0KDQoNCg0KDQo=