Nhiệm vụ 3.1
1. Tóm tắt
Bộ dữ liệu phân tích dân số của hơn 100 quốc gia qua các năm từ 1950
- 2021 theo từng độ tuổi, từ đó ta sẽ thấy được tốc độ gia tăng dân số,
sự già hóa dân số và các quốc gia có số dân đông nhất.
Chi tiết các biến có trong bộ dữ liệu:
Bộ dữ liệu có 18288 quan sát và 24 biến
- Country name (Na): Tên quốc gia
- Year (Y): năm
- Population: dân số
- Population of children under the age of 1 (U1): dân
số trẻ em dưới 1 tuổi
- Population of children under the age of 5 (U5): dân
số trẻ em dưới 5 tuổi
- Population of children under the age of 15 (U15):
dân số trẻ em dưới 15 tuổi
- Population under the age of 25 (U25): dân số dưới
25 tuổi
- Population aged 15 to 64 years (15T64): số dân từ
15 đến 64 tuổi
- Population older than 15 years (O15): dân số trên
15 tuổi
- Population older than 18 years (O18): dân số trên
18 tuổi
- Population at age 1 (1): dân số 1 tuổi
- Population aged 1 to 4 years (1T): dân số 1 đến 4
tuổi
- Population aged 5 to 9 years (5T9): dân số 5 đến 9
tuổi
- Population aged 10 to 14 years (10T14): dân số 10
đến 14 tuổi
- Population aged 15 to 19 years (15T19): dân số 15
đến 19 tuổi
- Population aged 20 to 29 years (20T9): dân số 20
đến 29 tuổi
- Population aged 30 to 39 years (30T39): dân số 30
đến 39 tuổi
- Population aged 40 to 49 years (40T49): dân số 40
đến 49 tuổi
- Population aged 50 to 59 years (50T59): dân số 50
đến 59 tuổi
- Population aged 60 to 69 years (60T69): dân số 60
đến 69 tuổi
- Population aged 70 to 79 years (70T79): dân số 70
đến 79 tuổi
- Population aged 80 to 89 years (80T89): dân số 80
đến 89 tuổi
- Population aged 90 to 99 years (90T99): dân số 90
đến 99 tuổi
- Population older than 100 years (O100): dân số hơn
100 tuổi
na <- read.csv("D:/Ngôn Ngữ Lập Trình/population-and-demography.csv")
dim(na)
## [1] 18288 24
2. Phân tích dữ liệu
- Quan sát dữ liệu 5 quốc gia có số dân đông: China, India, United
States, Indonesia, Brazil từ năm 1951 - 2021 theo từng độ tuổi
(dưới 15 tuổi, dưới 25 tuổi, từ 15 đến 19 tuổi, từ 20 đến 29 tuổi, từ 30
đến 39 tuổi, từ 60 đến 69 tuối,từ 15 đến 64 tuổi, hơn 100 tuổi)
library(tidyverse)
library(DT)
library(flextable)
names(na) <- c('Na','Y','Pop','U1','U5','U15','U25','15T64','O15','O18','1','1T4','5T9','10T14','15T19','20T29','30T39','40T49','50T59','60T69','70T79','80T89','90T99','O100')
d <- na %>% filter(Na %in% c('China','India','United States', 'Indonesia', 'Brazil'))%>%select(Na,Y,Pop,U15,U25,'15T19','20T29','30T39','60T69','15T64','O100')
datatable(d)
3. Giải thích
- China, India, United States, Indonesia, Brazil có số dân đông
d1 <- d%>%select(Na,Y,Pop)
datatable(d1)
- Các số liệu này cung cấp thông tin về sự phân bố dân số theo các độ
tuổi khác nhau trong mỗi quốc gia. Chúng có thể được sử dụng để so sánh
mức độ tuổi trẻ, mức độ già, và sự phân bố dân số của các quốc gia khác
nhau.
4. Mã hóa dữ liệu
d2 <- d
- Thêm một cột Na.Code để chia China với 4 nước còn lại
d2$Na.Code <- ifelse(d2$Na == 'China','China','Not China')
- Thêm một cột Na.Code1 để chia năm thành thế kỷ 20 và thế kỷ 21
d2$Y.Code1 <- ifelse(d2$Y >= 2001,'TK21', 'TK20')
- Thêm một cột Pop.Code để chia dân số thành 3 nhóm: nhóm 1 với số dân
nhỏ hơn 100000000, nhóm 2 với số dân từ 100000000 đến 999999999 , nhóm 3
với số dân lớn hơn 1000000000
d2$Pop.Code <- case_when(d2$Pop < 100000000 ~ 'Nhóm 1', d2$Pop >= 100000000 & d2$Pop < 999999999 ~ 'Nhóm 2', d2$Pop >1000000000 ~ 'Nhóm 3')
- Thêm một cột O100.Code để phân loại người lớn tuổi trên 100 tuổi
thành 4 nhóm: nhóm 1 dưới 100, nhóm 2 từ 100 đến 999, nhóm 3 từ 1000 đến
9999, nhóm 4 lớn hơn 10000
d2$O100.Code <- case_when(d2$O100 < 100 ~ 'Nhóm 1', d2$O100 >= 100 & d2$O100 < 999 ~ 'Nhóm 2', d2$O100 >= 1000 & d2$O100 <9999 ~ 'Nhóm 3',d2$O100 >= 10000 ~ 'Nhóm 4')
Bảng số liệu mới mà ta nhận được sau khi mã
hóa
datatable(d2)
5. Bảng tần số
- Với tần suất xuất hiện 72 lần thì chúng ta thấy được bộ dữ liệu đang
phân tích dân số của các nước trong thời gian 72 năm
table(d$Na)
##
## Brazil China India Indonesia United States
## 72 72 72 72 72
- Lập bảng tần số về số người lớn tuổi có độ tuổi hơn 100 tuổi của 5
nước
table(d2$O100.Code)
##
## Nhóm 1 Nhóm 2 Nhóm 3 Nhóm 4
## 23 164 93 80
d4 <- d2%>% group_by(Na,O100.Code) %>% summarise(n= n())
datatable(d4)
Từ bảng tần số trên ta thấy người lớn tuổi ở nhóm số 2 có tần
số xuất hiện nhiều nhất. Trong đó ta thấy Indonesia có số dân thuộc nhóm
2 ở độ tuổi hơn 100 nhiều nhất, sau đó là Brazil.
6. Phân tích số liệu
Tính toán đặc trưng đo lường theo Brazil
Br <- d%>% filter(Na=='Brazil')
- Dân số trung bình ở độ tuổi dưới 15 tuổi
mean(Br$U15,na.rm = T)
## [1] 43998992
- Từ số liệu bên dưới ta thấy dân số thấp nhất của Brazil là 53955360,
cao nhất là 21326220
- Phân vị thứ nhất bằng 91075260
- Trung vị bằng 138213270
- Dân số trung bình lad 136542332
- Phân vị thứ ba bằng 183152472
summary(Br$Pop)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 53955360 91075260 138213270 136542332 183152472 214326220
- Tổng số người dân hơn 100 qua các năm
sum(Br$O100)
## [1] 38468
- Phương sai của các giá trị trong biến từ 15 đến 19
var(Br$'15T19')
## [1] 1.73329e+13
- Giá trị ở vị trí trung vị của các giá trị trong độ tuổi 15 đến
64
median(Br$'15T64')
## [1] 81616995
Tính toán đặc trưng đo lường theo nhóm quốc
gia
- Dân số trung bình theo nhóm quốc gia: Từ bảng số liệu ta thấy dân số
trung bình của China là cao nhất
moc <- d%>% group_by(Na) %>% summarise(n = n(),mean_of_Pop = mean(Pop))
moc
## # A tibble: 5 × 3
## Na n mean_of_Pop
## <chr> <int> <dbl>
## 1 Brazil 72 136542332.
## 2 China 72 1035531645.
## 3 India 72 829637465.
## 4 Indonesia 72 167585644.
## 5 United States 72 241932229.
- Tính trung vị theo nhóm quốc gia: Từ bảng số liệu ta thấy trung vị
của China là cao nhất
medoc <- d %>% group_by(Na) %>% summarise(med_of_Pop = median(Pop))
medoc
## # A tibble: 5 × 2
## Na med_of_Pop
## <chr> <dbl>
## 1 Brazil 138213270
## 2 China 1069005250
## 3 India 789060550
## 4 Indonesia 167463490
## 5 United States 236329480
- Tính dân số trung bình theo năm và quốc gia
moc2 <- d2%>% group_by(Na,Y.Code1) %>% summarise(n = n(),mean_of_Pop = mean(Pop),.groups = 'drop')
moc2
## # A tibble: 10 × 4
## Na Y.Code1 n mean_of_Pop
## <chr> <chr> <int> <dbl>
## 1 Brazil TK20 51 111405843.
## 2 Brazil TK21 21 197588093.
## 3 China TK20 51 903556212.
## 4 China TK21 21 1356043410.
## 5 India TK20 51 655156644.
## 6 India TK21 21 1253376600
## 7 Indonesia TK20 51 135039123.
## 8 Indonesia TK21 21 246627196.
## 9 United States TK20 51 212599363.
## 10 United States TK21 21 313169189.
Từ bảng số liệu ta có một số kết luận sau:
TK 20 thì dân số trung bình của China là cao nhất TK 21 thì dân số
trung bình của China là cao nhất
Vậy China là nước có số dân cao nhất trong 5 nước
So sánh dân số 5 quốc gia ở 2 mốc thời gian 2000 và
2021
d5 <- d%>% filter(Y =="2000"| Y=='2021')%>% select(Na,Y,Pop)
datatable(d5)
Từ bảng số liệu trên ta thấy được dân số của 5 quốc gia đều tăng
mạnh, trong đó dân số của China và India có sự tăng trưởng
nhanh.
Trong năm 2000 Brazil là quốc gia có số dân thấp nhất so với 4
nước còn lại.
Trong năm 2021 Brazil là quốc gia có số dân thấp nhất.
Vậy từ đó tà thấy được China và India có sự tăng tưởng nhanh,
Brazil tăng tưởng còn chậm hơn so với 4 quốc gia còn lại.
Nhiệm vụ 3.2
1. Tóm tắt
- Có hàng ngàn (nếu không muốn nói là hàng trăm ngàn) cơ sở giáo dục
đại học trên khắp thế giới nhận sinh viên mới mỗi năm. Do đó, sinh viên
tương lai thường được giao nhiệm vụ nghiên cứu các tổ chức tốt nhất phù
hợp với sở thích học tập của họ trước khi nộp đơn. Cách dễ nhất thường
là xem một trường đại học quan tâm xếp hạng như thế nào trên toàn cầu
(hoặc ở quốc gia bản địa của nó) và sau đó so sánh nó với một trường đại
học khác. Một cách tiếp cận chi tiết hơn sẽ là so sánh các trường đại
học không chỉ trên bảng xếp hạng của họ mà còn về các số liệu như môi
trường nghiên cứu, tiêu chuẩn giảng dạy, lòng hiếu khách đối với sinh
viên nước ngoài và thu nhập của ngành trong số những người khác.
- Cuối cùng, bộ dữ liệu này cung cấp một danh sách các trường đại học
cùng với bảng xếp hạng của họ và nhiều số liệu quan tâm khác theo Times
Higher Education.
library(tidyverse)
library(DT)
library(flextable)
na1 <- read.csv("D:/Ngôn Ngữ Lập Trình/Nhiệm vụ 3/THE World University Rankings 2016-2024.csv")
library(skimr)
skim(na1)
Data summary
Name |
na1 |
Number of rows |
12430 |
Number of columns |
13 |
_______________________ |
|
Column type frequency: |
|
character |
3 |
numeric |
10 |
________________________ |
|
Group variables |
None |
Variable type: character
Name |
0 |
1 |
3 |
91 |
0 |
2105 |
0 |
Country |
0 |
1 |
4 |
22 |
0 |
108 |
0 |
International.Students |
0 |
1 |
1 |
3 |
0 |
89 |
0 |
Variable type: numeric
Rank |
0 |
1 |
736.83 |
467.96 |
1.00 |
346.00 |
691.00 |
1078.00 |
1904.00 |
▇▇▇▅▂ |
Student.Population |
0 |
1 |
23367.00 |
34987.15 |
25.00 |
10149.50 |
17824.00 |
29218.50 |
1824383.00 |
▇▁▁▁▁ |
Students.to.Staff.Ratio |
0 |
1 |
18.90 |
17.06 |
0.30 |
12.30 |
16.30 |
22.00 |
865.80 |
▇▁▁▁▁ |
Overall.Score |
0 |
1 |
35.33 |
16.88 |
8.22 |
21.73 |
32.40 |
45.19 |
98.46 |
▇▇▅▁▁ |
Teaching |
0 |
1 |
28.54 |
14.06 |
8.20 |
18.80 |
24.30 |
33.80 |
99.00 |
▇▅▁▁▁ |
Research.Environment |
0 |
1 |
24.11 |
17.60 |
0.80 |
11.70 |
18.10 |
30.50 |
100.00 |
▇▅▁▁▁ |
Research.Quality |
0 |
1 |
49.19 |
27.53 |
0.70 |
24.50 |
47.45 |
72.97 |
100.00 |
▇▇▇▇▆ |
Industry.Impact |
0 |
1 |
46.51 |
18.70 |
0.00 |
35.30 |
39.50 |
52.20 |
100.00 |
▁▇▅▂▂ |
International.Outlook |
0 |
1 |
47.60 |
23.00 |
7.10 |
28.22 |
43.30 |
63.60 |
100.00 |
▅▇▆▃▃ |
Year |
0 |
1 |
2020.66 |
2.48 |
2016.00 |
2019.00 |
2021.00 |
2023.00 |
2024.00 |
▃▅▃▇▇ |
Chi tiết các biến có trong bộ dữ liệu:
Bộ dữ liệu có 12430 quan sát và 14 biến
- Rank: xếp hạng
- Name (Na): tên Trường
- Country: Quốc gia
- Student Population (S.Pop): số sinh viên
- Students to Staff Ratio (StS): Tỷ lệ sinh viên trên
nhân viên
- International Students (InterS): Sinh viên quốc
tế
- Overall Score (OverS): Điểm tổng thể
- Teaching: Giảng dạy
- Research Environment (Res.En): Môi trường nghiên
cứu
- Research Quality (Res.Qu): Chất lượng nghiên
cứu
- Industry Impac (Ind)t: Tác động của ngành
- International Outlook (Inter): Triển vọng quốc
tế
- Year (Y): Năm
dim(na1)
## [1] 12430 13
2. Phân tích dữ liệu
- Quan sát dữ liệu của một số quốc gia ở Đông Nam Á
(Singapore,Thailand, Malaysia, Philippines,Indonesia, Vietnam) với các
dữ liệu gồm tên số sinh viên, sinh viên quốc tế, Điểm tổng thể, Môi
trường nghiên cứu, Chất lượng nghiên cứu, Tác động của ngành, Triển vọng
quốc tế, năm.
library(tidyverse)
names(na1) <- c('Rank','Na','Country','S.Pop','StS','InterS','OverS','Teaching','Res.En','Res.Qu','Ind','Inter','Y')
names(na1)
## [1] "Rank" "Na" "Country" "S.Pop" "StS" "InterS"
## [7] "OverS" "Teaching" "Res.En" "Res.Qu" "Ind" "Inter"
## [13] "Y"
d6 <- na1%>%select(Y,Country,S.Pop,InterS,OverS,Res.En,Res.Qu,Ind,Inter)
d7 <- d6%>%filter(Country=='Vietnam'|Country=='Singapore'|Country=='Thailand'|Country=='Malaysia'|Country=='Philippiens'|Country=='Indonesia')
datatable(d7)
3. Mã hóa dữ liệu
- Thêm một cột Na.Code để chia Vietnam với 4 nước còn lại
d8 <- d7
d8$Country.Code <- ifelse(d8$Country == 'Vietnam','Việt Nam','Not Việt Nam')
- Thêm một cột Y.Code để chia năm thành trước năm 2020 và sau năm
2020
d8$Y.Code2 <- ifelse(d8$Y >= 2020,'Sau năm 2020', 'Trước năm 2020')
datatable(d8)
Từ bảng dữ liệu trên ta thấy được sau năm 2020 thì Trường Đại
học của Việt Nam đã được đưa vào danh sách trường Đại học có tiếng thế
giới.
4. Bảng tần số
- Từ số liệu bên dưới ta thấy được trong vòng khoảng thời gian 2016
đến 2024 Việt Nam đã có 23 lần được đưa vào danh sách có các trường đại
học thế giới
table(d8$Country)
##
## Indonesia Malaysia Singapore Thailand Vietnam
## 83 123 18 127 23
6. Phân tích số liệu
Tính toán đặc trưng đo lường theo Vietnam
VN <- d6%>% filter(Country=='Vietnam')
- Số sinh viên trùn bình của trường ĐH ở Việt Nam
mean(VN$S.Pop,na.rm = T)
## [1] 42765.74
- Kết quả bên dưới cho thấy: Min - Gía trị nhỏ nhất :
Số sinh viên ít nhất 21519
1st Qu. - Phân vị thứ nhất : là 29647 sinh viên
Median - Trung vị : là 36140 sinh viên
Mean - Gía trị trung bình : là 42766, nghĩa là số
sinh viên trung bình là 42766
3rd Qu. - Phân vị thứ ba : là 50474 sinh viên
Max - Gía trị lớn nhất : Số sinh viên cao nhất từng
chạm đến là 83599
summary(VN$S.Pop)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 21519 29647 36410 42766 50474 83599
- Tổng số sinh viên của Việt Nam từ 2016-2024
sum(VN$S.Pop)
## [1] 983612
- Phương sai của các giá trị điểm tổng thể
var(VN$OverS)
## [1] 104.5054
- Giá trị ở vị trí trung vị triển vọng quốc tế
median(VN$Inter)
## [1] 45.6
Tính toán đặc trưng đo lường theo nhóm quốc
gia
- Số sinh viên trung bình theo nhóm quốc gia: Từ bảng số liệu ta thấy
dân số trung bình của Vietnam là cao nhất
ltna <- d8%>% group_by(Country) %>% summarise(n = n(),mean_of_S.Pop = mean(S.Pop))
ltna
## # A tibble: 5 × 3
## Country n mean_of_S.Pop
## <chr> <int> <dbl>
## 1 Indonesia 83 31153.
## 2 Malaysia 123 17530.
## 3 Singapore 18 28242.
## 4 Thailand 127 30164.
## 5 Vietnam 23 42766.
- Tính trung vị theo nhóm quốc gia: Từ bảng số liệu ta thấy trung vị
của Vietnam là cao nhất
ltna1 <- d8 %>% group_by(Country) %>% summarise(med_of_S.Pop = median(S.Pop))
ltna1
## # A tibble: 5 × 2
## Country med_of_S.Pop
## <chr> <dbl>
## 1 Indonesia 32695
## 2 Malaysia 15858
## 3 Singapore 28248.
## 4 Thailand 28611
## 5 Vietnam 36410
- Tính số sinh viên trung bình theo năm và quốc gia
ltna2 <- d8%>% group_by(Country,Y.Code2) %>% summarise(n = n(),mean_of_S.Pop = mean(S.Pop),.groups = 'drop')
ltna2
## # A tibble: 9 × 4
## Country Y.Code2 n mean_of_S.Pop
## <chr> <chr> <int> <dbl>
## 1 Indonesia Sau năm 2020 71 31128.
## 2 Indonesia Trước năm 2020 12 31300.
## 3 Malaysia Sau năm 2020 91 15905.
## 4 Malaysia Trước năm 2020 32 22151.
## 5 Singapore Sau năm 2020 10 28279.
## 6 Singapore Trước năm 2020 8 28197.
## 7 Thailand Sau năm 2020 87 29180.
## 8 Thailand Trước năm 2020 40 32304.
## 9 Vietnam Sau năm 2020 23 42766.
Từ bảng số liệu trên ta thấy được số sinh viên của 5 nước đều
tăng qua các năm, riêng Việt Nam thì số sinh viên sau năm 2020 mới
có.
Trước năm 2020 và sau năm 2020 Malaysia có số sinh viên thấp hơn
só với các nước khác trong khoảng thời gian đó.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAzIg0KYXV0aG9yOiAiTMOqIFRo4buLIE5n4buNYyDDgW5oIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDogDQogaHRtbF9kb2N1bWVudDogDQogICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmBgYA0KDQojICoqTmhp4buHbSB24bulIDMuMSoqDQoNCiMjICoqMS4gVMOzbSB04bqvdCoqDQoNCkLhu5kgZOG7ryBsaeG7h3UgcGjDom4gdMOtY2ggZMOibiBz4buRIGPhu6dhIGjGoW4gMTAwIHF14buRYyBnaWEgcXVhIGPDoWMgbsSDbSB04burIDE5NTAgLSAyMDIxIHRoZW8gdOG7q25nIMSR4buZIHR14buVaSwgdOG7qyDEkcOzIHRhIHPhur0gdGjhuqV5IMSRxrDhu6NjIHThu5FjIMSR4buZIGdpYSB0xINuZyBkw6JuIHPhu5EsIHPhu7EgZ2nDoCBow7NhIGTDom4gc+G7kSB2w6AgY8OhYyBxdeG7kWMgZ2lhIGPDsyBz4buRIGTDom4gxJHDtG5nIG5o4bqldC4NCiANCioqKkNoaSB0aeG6v3QgY8OhYyBiaeG6v24gY8OzIHRyb25nIGLhu5kgZOG7ryBsaeG7h3U6KioqDQoNCipC4buZIGThu68gbGnhu4d1IGPDsyAxODI4OCBxdWFuIHPDoXQgdsOgIDI0IGJp4bq/bioNCg0KLSBDb3VudHJ5IG5hbWUgKiooTmEpKio6IFTDqm4gcXXhu5FjIGdpYQ0KLSBZZWFyICoqKFkpKio6IG7Eg20NCi0gUG9wdWxhdGlvbjogZMOibiBz4buRDQotIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxICoqKFUxKSoqOiBkw6JuIHPhu5EgdHLhursgZW0gZMaw4bubaSAxIHR14buVaQ0KLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgNSAqKihVNSkqKjogZMOibiBz4buRIHRy4bq7IGVtIGTGsOG7m2kgNSB0deG7lWkNCi0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1ICoqKFUxNSkqKjogZMOibiBz4buRIHRy4bq7IGVtIGTGsOG7m2kgMTUgdHXhu5VpDQotIFBvcHVsYXRpb24gdW5kZXIgdGhlIGFnZSBvZiAyNSAqKihVMjUpKio6IGTDom4gc+G7kSBkxrDhu5tpIDI1IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gNjQgeWVhcnMgKiooMTVUNjQpKio6IHPhu5EgZMOibiB04burIDE1IMSR4bq/biA2NCB0deG7lWkNCi0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDE1IHllYXJzICoqKE8xNSkqKjogZMOibiBz4buRIHRyw6puIDE1IHR14buVaQ0KLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTggeWVhcnMgKiooTzE4KSoqOiBkw6JuIHPhu5EgdHLDqm4gMTggdHXhu5VpDQotIFBvcHVsYXRpb24gYXQgYWdlIDEgKiooMSkqKjogZMOibiBz4buRIDEgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnMgKiooMVQpKio6IGTDom4gc+G7kSAxIMSR4bq/biA0IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzICoqKDVUOSkqKjogZMOibiBz4buRIDUgxJHhur9uIDkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCAxMCB0byAxNCB5ZWFycyAqKigxMFQxNCkqKjogZMOibiBz4buRIDEwIMSR4bq/biAxNCB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDE1IHRvIDE5IHllYXJzICoqKDE1VDE5KSoqOiBkw6JuIHPhu5EgMTUgxJHhur9uIDE5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgMjAgdG8gMjkgeWVhcnMgKiooMjBUOSkqKjogZMOibiBz4buRIDIwIMSR4bq/biAyOSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDMwIHRvIDM5IHllYXJzICoqKDMwVDM5KSoqOiBkw6JuIHPhu5EgMzAgxJHhur9uIDM5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgNDAgdG8gNDkgeWVhcnMgKiooNDBUNDkpKio6IGTDom4gc+G7kSA0MCDEkeG6v24gNDkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFycyAqKig1MFQ1OSkqKjogZMOibiBz4buRIDUwIMSR4bq/biA1OSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDYwIHRvIDY5IHllYXJzICoqKDYwVDY5KSoqOiBkw6JuIHPhu5EgNjAgxJHhur9uIDY5IHR14buVaQ0KLSBQb3B1bGF0aW9uIGFnZWQgNzAgdG8gNzkgeWVhcnMgKiooNzBUNzkpKio6IGTDom4gc+G7kSA3MCDEkeG6v24gNzkgdHXhu5VpDQotIFBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFycyAqKig4MFQ4OSkqKjogZMOibiBz4buRIDgwIMSR4bq/biA4OSB0deG7lWkNCi0gUG9wdWxhdGlvbiBhZ2VkIDkwIHRvIDk5IHllYXJzICoqKDkwVDk5KSoqOiBkw6JuIHPhu5EgOTAgxJHhur9uIDk5IHR14buVaQ0KLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTAwIHllYXJzICoqKE8xMDApKio6IGTDom4gc+G7kSBoxqFuIDEwMCB0deG7lWkNCg0KYGBge3J9DQpuYSA8LSByZWFkLmNzdigiRDovTmfDtG4gTmfhu68gTOG6rXAgVHLDrG5oL3BvcHVsYXRpb24tYW5kLWRlbW9ncmFwaHkuY3N2IikNCmRpbShuYSkNCmBgYA0KIyMgKioyLiBQaMOibiB0w61jaCBk4buvIGxp4buHdSoqDQotIFF1YW4gc8OhdCBk4buvIGxp4buHdSA1IHF14buRYyBnaWEgY8OzIHPhu5EgZMOibiDEkcO0bmc6ICpDaGluYSwgSW5kaWEsIFVuaXRlZCBTdGF0ZXMsIEluZG9uZXNpYSwgQnJhemlsKiB04burIG7Eg20gMTk1MSAtIDIwMjEgdGhlbyB04burbmcgxJHhu5kgdHXhu5VpIChkxrDhu5tpIDE1IHR14buVaSwgZMaw4bubaSAyNSB0deG7lWksIHThu6sgMTUgxJHhur9uIDE5IHR14buVaSwgdOG7qyAyMCDEkeG6v24gMjkgdHXhu5VpLCB04burIDMwIMSR4bq/biAzOSB0deG7lWksIHThu6sgNjAgxJHhur9uIDY5IHR14buRaSx04burIDE1IMSR4bq/biA2NCB0deG7lWksIGjGoW4gMTAwIHR14buVaSkNCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbmFtZXMobmEpIDwtIGMoJ05hJywnWScsJ1BvcCcsJ1UxJywnVTUnLCdVMTUnLCdVMjUnLCcxNVQ2NCcsJ08xNScsJ08xOCcsJzEnLCcxVDQnLCc1VDknLCcxMFQxNCcsJzE1VDE5JywnMjBUMjknLCczMFQzOScsJzQwVDQ5JywnNTBUNTknLCc2MFQ2OScsJzcwVDc5JywnODBUODknLCc5MFQ5OScsJ08xMDAnKQ0KDQpkIDwtIG5hICU+JSBmaWx0ZXIoTmEgJWluJSBjKCdDaGluYScsJ0luZGlhJywnVW5pdGVkIFN0YXRlcycsICdJbmRvbmVzaWEnLCAnQnJhemlsJykpJT4lc2VsZWN0KE5hLFksUG9wLFUxNSxVMjUsJzE1VDE5JywnMjBUMjknLCczMFQzOScsJzYwVDY5JywnMTVUNjQnLCdPMTAwJykNCmRhdGF0YWJsZShkKQ0KDQpgYGANCg0KIyMgKiozLiBHaeG6o2kgdGjDrWNoKioNCg0KLSBDaGluYSwgSW5kaWEsIFVuaXRlZCBTdGF0ZXMsIEluZG9uZXNpYSwgQnJhemlsIGPDsyBz4buRIGTDom4gxJHDtG5nDQpgYGB7cn0NCmQxIDwtIGQlPiVzZWxlY3QoTmEsWSxQb3ApDQpkYXRhdGFibGUoZDEpDQpgYGANCg0KLSBDw6FjIHPhu5EgbGnhu4d1IG7DoHkgY3VuZyBj4bqlcCB0aMO0bmcgdGluIHbhu4Egc+G7sSBwaMOibiBi4buRIGTDom4gc+G7kSB0aGVvIGPDoWMgxJHhu5kgdHXhu5VpIGtow6FjIG5oYXUgdHJvbmcgbeG7l2kgcXXhu5FjIGdpYS4gQ2jDum5nIGPDsyB0aOG7gyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBzbyBzw6FuaCBt4bupYyDEkeG7mSB0deG7lWkgdHLhurssIG3hu6ljIMSR4buZIGdpw6AsIHbDoCBz4buxIHBow6JuIGLhu5EgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSBraMOhYyBuaGF1Lg0KDQojIyAqKjQuIE3DoyBow7NhIGThu68gbGnhu4d1KioNCmBgYHtyfQ0KZDIgPC0gZA0KYGBgDQotIFRow6ptIG3hu5l0IGPhu5l0IE5hLkNvZGUgxJHhu4MgY2hpYSBDaGluYSB24bubaSA0IG7GsOG7m2MgY8OybiBs4bqhaQ0KYGBge3J9DQpkMiROYS5Db2RlIDwtIGlmZWxzZShkMiROYSA9PSAnQ2hpbmEnLCdDaGluYScsJ05vdCBDaGluYScpDQpgYGANCi0gVGjDqm0gbeG7mXQgY+G7mXQgTmEuQ29kZTEgxJHhu4MgY2hpYSBuxINtIHRow6BuaCB0aOG6vyBr4bu3IDIwIHbDoCB0aOG6vyBr4bu3IDIxDQpgYGB7cn0NCmQyJFkuQ29kZTEgPC0gaWZlbHNlKGQyJFkgPj0gMjAwMSwnVEsyMScsICdUSzIwJykNCmBgYA0KLSBUaMOqbSBt4buZdCBj4buZdCBQb3AuQ29kZSDEkeG7gyBjaGlhIGTDom4gc+G7kSB0aMOgbmggMyBuaMOzbTogbmjDs20gMSB24bubaSBz4buRIGTDom4gbmjhu48gaMahbiAxMDAwMDAwMDAsIG5ow7NtIDIgduG7m2kgc+G7kSBkw6JuIHThu6sgMTAwMDAwMDAwIMSR4bq/biA5OTk5OTk5OTkgLCBuaMOzbSAzIHbhu5tpIHPhu5EgZMOibiBs4bubbiBoxqFuIDEwMDAwMDAwMDANCmBgYHtyfQ0KZDIkUG9wLkNvZGUgPC0gY2FzZV93aGVuKGQyJFBvcCA8IDEwMDAwMDAwMCB+ICdOaMOzbSAxJywgZDIkUG9wID49IDEwMDAwMDAwMCAmIGQyJFBvcCA8IDk5OTk5OTk5OSAgfiAnTmjDs20gMicsIGQyJFBvcCA+MTAwMDAwMDAwMCB+ICdOaMOzbSAzJykNCmBgYA0KLSBUaMOqbSBt4buZdCBj4buZdCBPMTAwLkNvZGUgxJHhu4MgcGjDom4gbG/huqFpIG5nxrDhu51pIGzhu5tuIHR14buVaSB0csOqbiAxMDAgdHXhu5VpIHRow6BuaCA0IG5ow7NtOiBuaMOzbSAxIGTGsOG7m2kgMTAwLCBuaMOzbSAyIHThu6sgMTAwIMSR4bq/biA5OTksIG5ow7NtIDMgdOG7qyAxMDAwIMSR4bq/biA5OTk5LCBuaMOzbSA0IGzhu5tuIGjGoW4gMTAwMDAgDQpgYGB7cn0NCmQyJE8xMDAuQ29kZSA8LSBjYXNlX3doZW4oZDIkTzEwMCA8IDEwMCB+ICdOaMOzbSAxJywgZDIkTzEwMCA+PSAxMDAgJiBkMiRPMTAwIDwgOTk5ICB+ICdOaMOzbSAyJywgZDIkTzEwMCA+PSAxMDAwICYgZDIkTzEwMCA8OTk5OSB+ICdOaMOzbSAzJyxkMiRPMTAwID49IDEwMDAwIH4gJ05ow7NtIDQnKQ0KYGBgDQoNCioqKkLhuqNuZyBz4buRIGxp4buHdSBt4bubaSBtw6AgdGEgbmjhuq1uIMSRxrDhu6NjIHNhdSBraGkgbcOjIGjDs2EqKioNCmBgYHtyfQ0KZGF0YXRhYmxlKGQyKQ0KYGBgDQoNCg0KDQojIyAqKjUuIELhuqNuZyB04bqnbiBz4buRKioNCg0KLSBW4bubaSB04bqnbiBzdeG6pXQgeHXhuqV0IGhp4buHbiA3MiBs4bqnbiB0aMOsIGNow7puZyB0YSB0aOG6pXkgxJHGsOG7o2MgYuG7mSBk4buvIGxp4buHdSDEkWFuZyBwaMOibiB0w61jaCBkw6JuIHPhu5EgY+G7p2EgY8OhYyBuxrDhu5tjIHRyb25nIHRo4budaSBnaWFuIDcyIG7Eg20gDQpgYGB7cn0NCnRhYmxlKGQkTmEpDQoNCmBgYA0KDQotIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbhu4Egc+G7kSBuZ8aw4budaSBs4bubbiB0deG7lWkgY8OzIMSR4buZIHR14buVaSBoxqFuIDEwMCB0deG7lWkgY+G7p2EgNSBuxrDhu5tjDQpgYGB7cn0NCnRhYmxlKGQyJE8xMDAuQ29kZSkNCmBgYA0KYGBge3J9DQpkNCA8LSBkMiU+JSBncm91cF9ieShOYSxPMTAwLkNvZGUpICU+JSBzdW1tYXJpc2Uobj0gbigpKQ0KZGF0YXRhYmxlKGQ0KQ0KYGBgDQoNCioqVOG7qyBi4bqjbmcgdOG6p24gc+G7kSB0csOqbiB0YSB0aOG6pXkgbmfGsOG7nWkgbOG7m24gdHXhu5VpIOG7nyBuaMOzbSBz4buRIDIgY8OzIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBuaGnhu4F1IG5o4bqldC4gVHJvbmcgxJHDsyB0YSB0aOG6pXkgSW5kb25lc2lhIGPDsyBz4buRIGTDom4gdGh14buZYyBuaMOzbSAyIOG7nyDEkeG7mSB0deG7lWkgaMahbiAxMDAgbmhp4buBdSBuaOG6pXQsIHNhdSDEkcOzIGzDoCBCcmF6aWwuKioNCg0KDQojIyAqKjYuIFBow6JuIHTDrWNoIHPhu5EgbGnhu4d1KioNCg0KIyMjICoqVMOtbmggdG/DoW4gxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBCcmF6aWwqKg0KYGBge3J9DQpCciA8LSBkJT4lIGZpbHRlcihOYT09J0JyYXppbCcpDQpgYGANCi0gRMOibiBz4buRIHRydW5nIGLDrG5oIOG7nyDEkeG7mSB0deG7lWkgZMaw4bubaSAxNSB0deG7lWkNCmBgYHtyfQ0KbWVhbihCciRVMTUsbmEucm0gPSBUKQ0KYGBgDQotIFThu6sgc+G7kSBsaeG7h3UgYsOqbiBkxrDhu5tpIHRhIHRo4bqleSBkw6JuIHPhu5EgdGjhuqVwIG5o4bqldCBj4bunYSBCcmF6aWwgbMOgIDUzOTU1MzYwLCBjYW8gbmjhuqV0IGzDoCAyMTMyNjIyMA0KLSBQaMOibiB24buLIHRo4bupIG5o4bqldCBi4bqxbmcgOTEwNzUyNjANCi0gVHJ1bmcgduG7iyBi4bqxbmcgMTM4MjEzMjcwDQotIETDom4gc+G7kSB0cnVuZyBiw6xuaCBsYWQgMTM2NTQyMzMyDQotIFBow6JuIHbhu4sgdGjhu6kgYmEgYuG6sW5nIDE4MzE1MjQ3Mg0KYGBge3J9DQpzdW1tYXJ5KEJyJFBvcCkNCmBgYA0KLSBU4buVbmcgc+G7kSBuZ8aw4budaSBkw6JuIGjGoW4gMTAwIHF1YSBjw6FjIG7Eg20NCmBgYHtyfQ0Kc3VtKEJyJE8xMDApDQpgYGANCi0gUGjGsMahbmcgc2FpIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gdOG7qyAxNSDEkeG6v24gMTkNCg0KYGBge3J9DQp2YXIoQnIkJzE1VDE5JykNCmBgYA0KLSBHacOhIHRy4buLIOG7nyB24buLIHRyw60gdHJ1bmcgduG7iyBj4bunYSBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgxJHhu5kgdHXhu5VpIDE1IMSR4bq/biA2NA0KYGBge3J9DQptZWRpYW4oQnIkJzE1VDY0JykNCmBgYA0KIyMjICoqVMOtbmggdG/DoW4gxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcgdGhlbyBuaMOzbSBxdeG7kWMgZ2lhKiojIyMNCg0KLSBEw6JuIHPhu5EgdHJ1bmcgYsOsbmggdGhlbyBuaMOzbSBxdeG7kWMgZ2lhOiBU4burIGLhuqNuZyBz4buRIGxp4buHdSB0YSB0aOG6pXkgZMOibiBz4buRIHRydW5nIGLDrG5oIGPhu6dhIENoaW5hIGzDoCBjYW8gbmjhuqV0DQpgYGB7cn0NCm1vYyA8LSAgZCU+JSBncm91cF9ieShOYSkgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUG9wID0gbWVhbihQb3ApKQ0KbW9jDQoNCmBgYA0KLSBUw61uaCB0cnVuZyB24buLIHRoZW8gbmjDs20gcXXhu5FjIGdpYTogVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdGEgdGjhuqV5IHRydW5nIHbhu4sgY+G7p2EgQ2hpbmEgbMOgIGNhbyBuaOG6pXQNCmBgYHtyfQ0KbWVkb2MgPC0gZCAlPiUgZ3JvdXBfYnkoTmEpICU+JSBzdW1tYXJpc2UobWVkX29mX1BvcCA9IG1lZGlhbihQb3ApKQ0KbWVkb2MNCmBgYA0KLSBUw61uaCBkw6JuIHPhu5EgdHJ1bmcgYsOsbmggdGhlbyBuxINtIHbDoCBxdeG7kWMgZ2lhDQpgYGB7cn0NCm1vYzIgPC0gZDIlPiUgZ3JvdXBfYnkoTmEsWS5Db2RlMSkgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUG9wID0gbWVhbihQb3ApLC5ncm91cHMgPSAnZHJvcCcpDQptb2MyDQpgYGANCg0KKipU4burIGLhuqNuZyBz4buRIGxp4buHdSB0YSBjw7MgbeG7mXQgc+G7kSBr4bq/dCBsdeG6rW4gc2F1OioqDQoNClRLIDIwIHRow6wgZMOibiBz4buRIHRydW5nIGLDrG5oIGPhu6dhIENoaW5hIGzDoCBjYW8gbmjhuqV0DQpUSyAyMSB0aMOsIGTDom4gc+G7kSB0cnVuZyBiw6xuaCBj4bunYSBDaGluYSBsw6AgY2FvIG5o4bqldA0KDQoqVuG6rXkgQ2hpbmEgbMOgIG7GsOG7m2MgY8OzIHPhu5EgZMOibiBjYW8gbmjhuqV0IHRyb25nIDUgbsaw4bubYyoNCg0KIyMjICoqU28gc8OhbmggZMOibiBz4buRIDUgcXXhu5FjIGdpYSDhu58gMiBt4buRYyB0aOG7nWkgZ2lhbiAyMDAwIHbDoCAyMDIxKiogIyMjDQoNCmBgYHtyfQ0KZDUgPC0gZCU+JSBmaWx0ZXIoWSA9PSIyMDAwInwgWT09JzIwMjEnKSU+JSBzZWxlY3QoTmEsWSxQb3ApDQpkYXRhdGFibGUoZDUpDQpgYGANCi0gVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjIGTDom4gc+G7kSBj4bunYSA1IHF14buRYyBnaWEgxJHhu4F1IHTEg25nIG3huqFuaCwgdHJvbmcgxJHDsyBkw6JuIHPhu5EgY+G7p2EgQ2hpbmEgdsOgIEluZGlhIGPDsyBz4buxIHTEg25nIHRyxrDhu59uZyBuaGFuaC4gDQoNCi0gVHJvbmcgbsSDbSAyMDAwIEJyYXppbCBsw6AgcXXhu5FjIGdpYSBjw7Mgc+G7kSBkw6JuIHRo4bqlcCBuaOG6pXQgc28gduG7m2kgNCBuxrDhu5tjIGPDsm4gbOG6oWkuDQoNCi0gVHJvbmcgbsSDbSAyMDIxIEJyYXppbCBsw6AgcXXhu5FjIGdpYSBjw7Mgc+G7kSBkw6JuIHRo4bqlcCBuaOG6pXQuDQoNCi0gVuG6rXkgdOG7qyDEkcOzIHTDoCB0aOG6pXkgxJHGsOG7o2MgQ2hpbmEgdsOgIEluZGlhIGPDsyBz4buxIHTEg25nIHTGsOG7n25nIG5oYW5oLCBCcmF6aWwgdMSDbmcgdMaw4bufbmcgY8OybiBjaOG6rW0gaMahbiBzbyB24bubaSA0IHF14buRYyBnaWEgY8OybiBs4bqhaS4NCg0KIyAqKk5oaeG7h20gduG7pSAzLjIqKg0KDQojIyAqKjEuIFTDs20gdOG6r3QqKg0KLSBDw7MgaMOgbmcgbmfDoG4gKG7hur91IGtow7RuZyBtdeG7kW4gbsOzaSBsw6AgaMOgbmcgdHLEg20gbmfDoG4pIGPGoSBz4bufIGdpw6FvIGThu6VjIMSR4bqhaSBo4buNYyB0csOqbiBraOG6r3AgdGjhur8gZ2nhu5tpIG5o4bqtbiBzaW5oIHZpw6puIG3hu5tpIG3hu5dpIG7Eg20uIERvIMSRw7MsIHNpbmggdmnDqm4gdMawxqFuZyBsYWkgdGjGsOG7nW5nIMSRxrDhu6NjIGdpYW8gbmhp4buHbSB24bulIG5naGnDqm4gY+G7qXUgY8OhYyB04buVIGNo4bupYyB04buRdCBuaOG6pXQgcGjDuSBo4bujcCB24bubaSBz4bufIHRow61jaCBo4buNYyB04bqtcCBj4bunYSBo4buNIHRyxrDhu5tjIGtoaSBu4buZcCDEkcahbi4gQ8OhY2ggZOG7hSBuaOG6pXQgdGjGsOG7nW5nIGzDoCB4ZW0gbeG7mXQgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyBxdWFuIHTDom0geOG6v3AgaOG6oW5nIG5oxrAgdGjhur8gbsOgbyB0csOqbiB0b8OgbiBj4bqndSAoaG/hurdjIOG7nyBxdeG7kWMgZ2lhIGLhuqNuIMSR4buLYSBj4bunYSBuw7MpIHbDoCBzYXUgxJHDsyBzbyBzw6FuaCBuw7MgduG7m2kgbeG7mXQgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyBraMOhYy4gTeG7mXQgY8OhY2ggdGnhur9wIGPhuq1uIGNoaSB0aeG6v3QgaMahbiBz4bq9IGzDoCBzbyBzw6FuaCBjw6FjIHRyxrDhu51uZyDEkeG6oWkgaOG7jWMga2jDtG5nIGNo4buJIHRyw6puIGLhuqNuZyB44bq/cCBo4bqhbmcgY+G7p2EgaOG7jSBtw6AgY8OybiB24buBIGPDoWMgc+G7kSBsaeG7h3UgbmjGsCBtw7RpIHRyxrDhu51uZyBuZ2hpw6puIGPhu6l1LCB0acOqdSBjaHXhuqluIGdp4bqjbmcgZOG6oXksIGzDsm5nIGhp4bq/dSBraMOhY2ggxJHhu5FpIHbhu5tpIHNpbmggdmnDqm4gbsaw4bubYyBuZ2/DoGkgdsOgIHRodSBuaOG6rXAgY+G7p2EgbmfDoG5oIHRyb25nIHPhu5Egbmjhu69uZyBuZ8aw4budaSBraMOhYy4NCi0gQ3Xhu5FpIGPDuW5nLCBi4buZIGThu68gbGnhu4d1IG7DoHkgY3VuZyBj4bqlcCBt4buZdCBkYW5oIHPDoWNoIGPDoWMgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyBjw7luZyB24bubaSBi4bqjbmcgeOG6v3AgaOG6oW5nIGPhu6dhIGjhu40gdsOgIG5oaeG7gXUgc+G7kSBsaeG7h3UgcXVhbiB0w6JtIGtow6FjIHRoZW8gVGltZXMgSGlnaGVyIEVkdWNhdGlvbi4NCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbmExIDwtIHJlYWQuY3N2KCJEOi9OZ8O0biBOZ+G7ryBM4bqtcCBUcsOsbmgvTmhp4buHbSB24bulIDMvVEhFIFdvcmxkIFVuaXZlcnNpdHkgUmFua2luZ3MgMjAxNi0yMDI0LmNzdiIpDQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShuYTEpDQpgYGANCg0KKioqQ2hpIHRp4bq/dCBjw6FjIGJp4bq/biBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdToqKioNCg0KKkLhu5kgZOG7ryBsaeG7h3UgY8OzIDEyNDMwIHF1YW4gc8OhdCB2w6AgMTQgYmnhur9uKg0KDQotIFJhbms6IHjhur9wIGjhuqFuZw0KLSBOYW1lICoqKE5hKSoqOiB0w6puIFRyxrDhu51uZw0KLSBDb3VudHJ5OiBRdeG7kWMgZ2lhDQotIFN0dWRlbnQgUG9wdWxhdGlvbiAqKihTLlBvcCkqKjogc+G7kSBzaW5oIHZpw6puDQotIFN0dWRlbnRzIHRvIFN0YWZmIFJhdGlvICoqKFN0UykqKjogVOG7tyBs4buHIHNpbmggdmnDqm4gdHLDqm4gbmjDom4gdmnDqm4NCi0gSW50ZXJuYXRpb25hbCBTdHVkZW50cyAqKihJbnRlclMpKio6IFNpbmggdmnDqm4gcXXhu5FjIHThur8NCi0gT3ZlcmFsbCBTY29yZSAqKihPdmVyUykqKjogxJBp4buDbSB04buVbmcgdGjhu4MNCi0gVGVhY2hpbmc6IEdp4bqjbmcgZOG6oXkNCi0gUmVzZWFyY2ggRW52aXJvbm1lbnQgKiooUmVzLkVuKSoqOiBNw7RpIHRyxrDhu51uZyBuZ2hpw6puIGPhu6l1DQotIFJlc2VhcmNoIFF1YWxpdHkgKiooUmVzLlF1KSoqOiBDaOG6pXQgbMaw4bujbmcgbmdoacOqbiBj4bupdQ0KLSBJbmR1c3RyeSBJbXBhYyAqKihJbmQpKip0OiBUw6FjIMSR4buZbmcgY+G7p2EgbmfDoG5oDQotIEludGVybmF0aW9uYWwgT3V0bG9vayAqKihJbnRlcikqKjogVHJp4buDbiB24buNbmcgcXXhu5FjIHThur8NCi0gWWVhciAqKihZKSoqOiBOxINtDQoNCmBgYHtyfQ0KZGltKG5hMSkNCmBgYA0KIyMgKioyLiBQaMOibiB0w61jaCBk4buvIGxp4buHdSoqDQoNCi0gUXVhbiBzw6F0IGThu68gbGnhu4d1IGPhu6dhIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSDhu58gxJDDtG5nIE5hbSDDgSAoU2luZ2Fwb3JlLFRoYWlsYW5kLCBNYWxheXNpYSwgUGhpbGlwcGluZXMsSW5kb25lc2lhLCBWaWV0bmFtKSB24bubaSBjw6FjIGThu68gbGnhu4d1IGfhu5NtIHTDqm4gIHPhu5Egc2luaCB2acOqbiwgc2luaCB2acOqbiBxdeG7kWMgdOG6vywgxJBp4buDbSB04buVbmcgdGjhu4MsIE3DtGkgdHLGsOG7nW5nIG5naGnDqm4gY+G7qXUsIENo4bqldCBsxrDhu6NuZyBuZ2hpw6puIGPhu6l1LCBUw6FjIMSR4buZbmcgY+G7p2EgbmfDoG5oLCBUcmnhu4NuIHbhu41uZyBxdeG7kWMgdOG6vywgbsSDbS4NCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpuYW1lcyhuYTEpIDwtIGMoJ1JhbmsnLCdOYScsJ0NvdW50cnknLCdTLlBvcCcsJ1N0UycsJ0ludGVyUycsJ092ZXJTJywnVGVhY2hpbmcnLCdSZXMuRW4nLCdSZXMuUXUnLCdJbmQnLCdJbnRlcicsJ1knKQ0KbmFtZXMobmExKQ0KYGBgDQpgYGB7cn0NCmQ2IDwtIG5hMSU+JXNlbGVjdChZLENvdW50cnksUy5Qb3AsSW50ZXJTLE92ZXJTLFJlcy5FbixSZXMuUXUsSW5kLEludGVyKQ0KZDcgPC0gZDYlPiVmaWx0ZXIoQ291bnRyeT09J1ZpZXRuYW0nfENvdW50cnk9PSdTaW5nYXBvcmUnfENvdW50cnk9PSdUaGFpbGFuZCd8Q291bnRyeT09J01hbGF5c2lhJ3xDb3VudHJ5PT0nUGhpbGlwcGllbnMnfENvdW50cnk9PSdJbmRvbmVzaWEnKQ0KZGF0YXRhYmxlKGQ3KQ0KYGBgDQoNCiMjICoqMy4gTcOjIGjDs2EgZOG7ryBsaeG7h3UqKg0KLSBUaMOqbSBt4buZdCBj4buZdCBOYS5Db2RlIMSR4buDIGNoaWEgVmlldG5hbSB24bubaSA0IG7GsOG7m2MgY8OybiBs4bqhaQ0KYGBge3J9DQpkOCA8LSBkNw0KZDgkQ291bnRyeS5Db2RlIDwtIGlmZWxzZShkOCRDb3VudHJ5ID09ICdWaWV0bmFtJywnVmnhu4d0IE5hbScsJ05vdCBWaeG7h3QgTmFtJykNCg0KYGBgDQoNCi0gVGjDqm0gbeG7mXQgY+G7mXQgWS5Db2RlIMSR4buDIGNoaWEgbsSDbSB0aMOgbmggdHLGsOG7m2MgbsSDbSAyMDIwIHbDoCBzYXUgbsSDbSAyMDIwDQpgYGB7cn0NCmQ4JFkuQ29kZTIgPC0gaWZlbHNlKGQ4JFkgPj0gMjAyMCwnU2F1IG7Eg20gMjAyMCcsICdUcsaw4bubYyBuxINtIDIwMjAnKQ0KDQpkYXRhdGFibGUoZDgpDQpgYGANCg0KDQoqKlThu6sgYuG6o25nIGThu68gbGnhu4d1IHRyw6puIHRhIHRo4bqleSDEkcaw4bujYyBzYXUgbsSDbSAyMDIwIHRow6wgVHLGsOG7nW5nIMSQ4bqhaSBo4buNYyBj4bunYSBWaeG7h3QgTmFtIMSRw6MgxJHGsOG7o2MgxJHGsGEgdsOgbyBkYW5oIHPDoWNoIHRyxrDhu51uZyDEkOG6oWkgaOG7jWMgY8OzIHRp4bq/bmcgdGjhur8gZ2nhu5tpLioqIA0KDQojIyAqKjQuIELhuqNuZyB04bqnbiBz4buRKioNCi0gVOG7qyBz4buRIGxp4buHdSBiw6puIGTGsOG7m2kgdGEgdGjhuqV5IMSRxrDhu6NjIHRyb25nIHbDsm5nIGtob+G6o25nIHRo4budaSBnaWFuIDIwMTYgxJHhur9uIDIwMjQgVmnhu4d0IE5hbSDEkcOjIGPDsyAyMyBs4bqnbiDEkcaw4bujYyDEkcawYSB2w6BvIGRhbmggc8OhY2ggY8OzIGPDoWMgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyB0aOG6vyBnaeG7m2kNCmBgYHtyfQ0KdGFibGUoZDgkQ291bnRyeSkNCmBgYA0KIyMgKio2LiBQaMOibiB0w61jaCBz4buRIGxp4buHdSoqDQoNCiMjIyAqKlTDrW5oIHRvw6FuIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gVmlldG5hbSoqDQoNCmBgYHtyfQ0KVk4gPC0gZDYlPiUgZmlsdGVyKENvdW50cnk9PSdWaWV0bmFtJykNCmBgYA0KLSBT4buRIHNpbmggdmnDqm4gdHLDuW4gYsOsbmggY+G7p2EgdHLGsOG7nW5nIMSQSCDhu58gVmnhu4d0IE5hbQ0KYGBge3J9DQptZWFuKFZOJFMuUG9wLG5hLnJtID0gVCkNCmBgYA0KLSBL4bq/dCBxdeG6oyBiw6puIGTGsOG7m2kgY2hvIHRo4bqleToNCioqTWluIC0gR8OtYSB0cuG7iyBuaOG7jyBuaOG6pXQgOioqIFPhu5Egc2luaCB2acOqbiDDrXQgbmjhuqV0IDIxNTE5DQoNCioqMXN0IFF1LiAtIFBow6JuIHbhu4sgdGjhu6kgbmjhuqV0IDoqKiBsw6AgMjk2NDcgc2luaCB2acOqbiANCg0KKipNZWRpYW4gLSBUcnVuZyB24buLIDoqKiBsw6AgMzYxNDAgc2luaCB2acOqbg0KDQoqKk1lYW4gLSBHw61hIHRy4buLIHRydW5nIGLDrG5oIDoqKiBsw6AgNDI3NjYsIG5naMSpYSBsw6Agc+G7kSBzaW5oIHZpw6puIHRydW5nIGLDrG5oIGzDoCA0Mjc2Ng0KDQoqKjNyZCBRdS4gLSBQaMOibiB24buLIHRo4bupIGJhIDoqKiBsw6AgNTA0NzQgc2luaCB2acOqbg0KDQoqKk1heCAtIEfDrWEgdHLhu4sgbOG7m24gbmjhuqV0IDoqKiBT4buRIHNpbmggdmnDqm4gY2FvIG5o4bqldCB04burbmcgY2jhuqFtIMSR4bq/biBsw6AgODM1OTkNCg0KYGBge3J9DQpzdW1tYXJ5KFZOJFMuUG9wKQ0KYGBgDQotIFThu5VuZyBz4buRIHNpbmggdmnDqm4gY+G7p2EgVmnhu4d0IE5hbSB04burIDIwMTYtMjAyNA0KYGBge3J9DQpzdW0oVk4kUy5Qb3ApDQpgYGANCi0gUGjGsMahbmcgc2FpIGPhu6dhIGPDoWMgZ2nDoSB0cuG7iyDEkWnhu4NtIHThu5VuZyB0aOG7gw0KDQpgYGB7cn0NCnZhcihWTiRPdmVyUykNCmBgYA0KLSBHacOhIHRy4buLIOG7nyB24buLIHRyw60gdHJ1bmcgduG7iyB0cmnhu4NuIHbhu41uZyBxdeG7kWMgdOG6vw0KYGBge3J9DQptZWRpYW4oVk4kSW50ZXIpDQpgYGANCiMjIyAqKlTDrW5oIHRvw6FuIMSR4bq3YyB0csawbmcgxJFvIGzGsOG7nW5nIHRoZW8gbmjDs20gcXXhu5FjIGdpYSoqIyMjDQoNCi0gU+G7kSBzaW5oIHZpw6puIHRydW5nIGLDrG5oIHRoZW8gbmjDs20gcXXhu5FjIGdpYTogVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdGEgdGjhuqV5IGTDom4gc+G7kSB0cnVuZyBiw6xuaCBj4bunYSBWaWV0bmFtIGzDoCBjYW8gbmjhuqV0DQpgYGB7cn0NCmx0bmEgPC0gIGQ4JT4lIGdyb3VwX2J5KENvdW50cnkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSxtZWFuX29mX1MuUG9wID0gbWVhbihTLlBvcCkpDQpsdG5hDQoNCmBgYA0KLSBUw61uaCB0cnVuZyB24buLIHRoZW8gbmjDs20gcXXhu5FjIGdpYTogVOG7qyBi4bqjbmcgc+G7kSBsaeG7h3UgdGEgdGjhuqV5IHRydW5nIHbhu4sgY+G7p2EgVmlldG5hbSBsw6AgY2FvIG5o4bqldA0KYGBge3J9DQpsdG5hMSA8LSBkOCAlPiUgZ3JvdXBfYnkoQ291bnRyeSkgJT4lIHN1bW1hcmlzZShtZWRfb2ZfUy5Qb3AgPSBtZWRpYW4oUy5Qb3ApKQ0KbHRuYTENCmBgYA0KLSBUw61uaCBz4buRIHNpbmggdmnDqm4gdHJ1bmcgYsOsbmggdGhlbyBuxINtIHbDoCBxdeG7kWMgZ2lhDQpgYGB7cn0NCmx0bmEyIDwtIGQ4JT4lIGdyb3VwX2J5KENvdW50cnksWS5Db2RlMikgJT4lIHN1bW1hcmlzZShuID0gbigpLG1lYW5fb2ZfUy5Qb3AgPSBtZWFuKFMuUG9wKSwuZ3JvdXBzID0gJ2Ryb3AnKQ0KbHRuYTINCmBgYA0KLSBU4burIGLhuqNuZyBz4buRIGxp4buHdSB0csOqbiB0YSB0aOG6pXkgxJHGsOG7o2Mgc+G7kSBzaW5oIHZpw6puIGPhu6dhIDUgbsaw4bubYyDEkeG7gXUgdMSDbmcgcXVhIGPDoWMgbsSDbSwgcmnDqm5nIFZp4buHdCBOYW0gdGjDrCBz4buRIHNpbmggdmnDqm4gc2F1IG7Eg20gMjAyMCBt4bubaSBjw7MuIA0KDQotIFRyxrDhu5tjIG7Eg20gMjAyMCB2w6Agc2F1IG7Eg20gMjAyMCBNYWxheXNpYSBjw7Mgc+G7kSBzaW5oIHZpw6puIHRo4bqlcCBoxqFuIHPDsyB24bubaSBjw6FjIG7GsOG7m2Mga2jDoWMgdHJvbmcga2hv4bqjbmcgdGjhu51pIGdpYW4gxJHDsy4NCg0K