“01:23:01, 27 - 01 - 2024”

1 Nhiệm vụ 3.1

1.1 1.1 Tóm tắt

Nhiệm vụ 3.1 tiến hành thao tác 1 số lệnh cơ bản trên population-and-demography.csv thống kê về dân số và nhân khẩu học ở các quốc gia

1.2 1.2 Mô tả datasets

Các mô tả cơ bản về dataset

  • Là 1 data frame

  • Có 24 cột tương đương với 24 biến

  • Các cột lần lượt là

    • Country.name : Tên quốc gia

    • Year : Năm

    • Population : Dân số

    • Population of children under the age of 1 : Dân số trẻ em dưới 1 tuổi

    • Population of children under the age of 5 : Dân số trẻ em dưới 5 tuổi

    • Population of children under the age of 15 : Dân số trẻ em dưới 15 tuổi

    • Population under the age of 25 : Dân số dưới 25 tuổi

    • Population aged 15 to 64 years : Dân số từ 15 đến 64 tuổi

    • Population older than 15 years : Dân số trên 15 tuổi

    • Population older than 18 years : Dân số trên 18 tuổi

    • Population at age 1 : Dân số lúc 1 tuổi

    • Population aged 1 to 4 years : Dân số từ 1 đến 4 tuổi

    • Population aged 5 to 9 years : Dân số từ 5 đến 9 tuổi

    • Population aged 10 to 14 years : Dân số từ 10 đến 14 tuổi

    • Population aged 15 to 19 years : Dân số từ 15 đến 19 tuổi

    • Population aged 20 to 29 years : Dân số từ 20 đến 29 tuổi

    • Population aged 30 to 39 years : Dân số từ 30 đến 39 tuổi

    • Population aged 40 to 49 years : Dân số từ 40 đến 49 tuổi

    • Population aged 50 to 59 years : Dân số từ 50 đến 59 tuổi

    • Population aged 60 to 69 years : Dân số từ 60 đến 69 tuổi

    • Population aged 70 to 79 years : Dân số từ 70 đến 79 tuổi

    • Population aged 80 to 89 years : Dân số từ 80 đến 89 tuổi

    • Population aged 90 to 99 years : Dân số từ 90 đến 99 tuổi

    • Population older than 100 years : Dân số trên 100 tuổi

library(xlsx)
dq <- read.xlsx(file.choose(), sheetIndex = 1, header = T) 

đọc dữ liệu từ excel và gán vào object dq

is.data.frame(dq)
## [1] TRUE

Kiểm tra xem “dq” có phải là data frame hay không, nếu đúng thì TRUE và ngược lại

length(dq)
## [1] 24

cho ra kết quả độ dài, ở đây là số cột của “dq”

names(dq) 
##  [1] "Country.name"                              
##  [2] "Year"                                      
##  [3] "Population"                                
##  [4] "Population.of.children.under.the.age.of.1" 
##  [5] "Population.of.children.under.the.age.of.5" 
##  [6] "Population.of.children.under.the.age.of.15"
##  [7] "Population.under.the.age.of.25"            
##  [8] "Population.aged.15.to.64.years"            
##  [9] "Population.older.than.15.years"            
## [10] "Population.older.than.18.years"            
## [11] "Population.at.age.1"                       
## [12] "Population.aged.1.to.4.years"              
## [13] "Population.aged.5.to.9.years"              
## [14] "Population.aged.10.to.14.years"            
## [15] "Population.aged.15.to.19.years"            
## [16] "Population.aged.20.to.29.years"            
## [17] "Population.aged.30.to.39.years"            
## [18] "Population.aged.40.to.49.years"            
## [19] "Population.aged.50.to.59.years"            
## [20] "Population.aged.60.to.69.years"            
## [21] "Population.aged.70.to.79.years"            
## [22] "Population.aged.80.to.89.years"            
## [23] "Population.aged.90.to.99.years"            
## [24] "Population.older.than.100.years"

cho ra tên các cột của “dq”

dim(dq) 
## [1] 18288    24

data này có 18288 hàng và 24 cột

sum(is.na(dq))  
## [1] 0

tổng số ô trống của object “dq”

Kết quả trả về tương ứng với dq không có ô trống nào ## 1.3 Thống kê dữ liệu

Thực hiện thống kê mô tả datasets này ta được kết quả như sau, ý nghĩa các cột:

  • n_missing: số ô dư liệu trống

  • complete_rate: tỷ lệ ô có dữ liệu

  • mean: trung bình

  • sd: độ lệch chuẩn

  • p0: giá trị nhỏ nhất

  • p25: Phân vị thứ nhất

  • p50: Phân vị thứ hai cũng chính là trung vị

  • p75: phân vị thứ ba

  • p100: giá trị lớn nhất

  • hist: biểu đồ Histogram

Xác định các thông tin của dq

library(skimr)
skim(dq)
Data summary
Name dq
Number of rows 18288
Number of columns 24
_______________________
Column type frequency:
character 1
numeric 23
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Country.name 0 1 4 59 0 254 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Year 0 1 1985.50 20.78 1950 1967.75 1985.5 2003.25 2021 ▇▇▇▇▇
Population 0 1 126470436.62 588851230.77 1363 291591.50 3833997.5 16785463.50 7909295000 ▇▁▁▁▁
Population.of.children.under.the.age.of.1 0 1 3133496.86 14167006.03 25 6663.75 88352.0 463000.50 139783730 ▇▁▁▁▁
Population.of.children.under.the.age.of.5 0 1 14825709.57 67384368.62 136 31995.25 423784.5 2160046.50 690360700 ▇▁▁▁▁
Population.of.children.under.the.age.of.15 0 1 41095227.11 188416973.54 416 89541.50 1186121.5 5905944.75 2015023400 ▇▁▁▁▁
Population.under.the.age.of.25 0 1 63762600.31 294251869.66 623 139541.50 1843099.5 9025129.75 3239281000 ▇▁▁▁▁
Population.aged.15.to.64.years 0 1 77429505.08 367651914.71 748 170263.50 2246772.0 9641250.00 5132999000 ▇▁▁▁▁
Population.older.than.15.years 0 1 85372101.76 404866940.61 849 186716.00 2482104.0 10354345.50 5893678600 ▇▁▁▁▁
Population.older.than.18.years 0 1 78196242.04 372017010.49 752 166417.50 2238130.5 9239904.00 5516283000 ▇▁▁▁▁
Population.at.age.1 0 1 3011212.81 13661998.41 26 6473.75 85824.0 440787.50 138478740 ▇▁▁▁▁
Population.aged.1.to.4.years 0 1 11692212.72 53238243.89 101 25269.25 334454.0 1697850.75 550970400 ▇▁▁▁▁
Population.aged.5.to.9.years 0 1 13598575.21 62534310.11 138 29406.25 392220.5 1947260.75 683611800 ▇▁▁▁▁
Population.aged.10.to.14.years 0 1 12670942.28 58775457.46 73 27879.50 363895.5 1796754.00 659934300 ▇▁▁▁▁
Population.aged.15.to.19.years 0 1 11782258.92 55126036.18 110 26296.50 336969.5 1626210.75 623576060 ▇▁▁▁▁
Population.aged.20.to.29.years 0 1 20872880.04 98860990.50 158 45050.75 609723.5 2758738.50 1210493200 ▇▁▁▁▁
Population.aged.30.to.39.years 0 1 17158704.11 82404600.95 137 36608.25 486290.5 2113149.00 1165207300 ▇▁▁▁▁
Population.aged.40.to.49.years 0 1 13622138.99 66008221.21 119 27440.25 364712.5 1556334.00 976407200 ▇▁▁▁▁
Population.aged.50.to.59.years 0 1 10177069.11 49288480.77 95 19649.75 264781.5 1203386.00 851356900 ▇▁▁▁▁
Population.aged.60.to.69.years 0 1 6801756.84 32712918.99 64 12603.00 168417.5 845242.75 598067140 ▇▁▁▁▁
Population.aged.70.to.79.years 0 1 3618710.03 17491538.61 31 6221.00 81824.0 436710.00 330491170 ▇▁▁▁▁
Population.aged.80.to.89.years 0 1 1195799.30 6238308.33 6 1818.75 20269.5 133380.50 131835590 ▇▁▁▁▁
Population.aged.90.to.99.years 0 1 142784.38 853350.39 0 154.75 1468.5 12499.00 22223974 ▇▁▁▁▁
Population.older.than.100.years 0 1 3107.72 20951.57 0 0.00 13.0 163.00 593166 ▇▁▁▁▁

1.3 1.4 Đổi tên các cột

Các ký hiệu tên tương ứng lần lượt từ cột 1 đến cột 24

  • Country name: ‘name’

  • Year: ‘y’

  • Population: ‘p’

  • Population of children under the age of 1: ‘pu1’

  • Population of children under the age of 5: ‘pu5’

  • Population of children under the age of 15: ‘pu15’

  • Population under the age of 25: ‘pu25’

  • Population aged 15 to 64 years: ‘p15t64’

  • Population older than 15 years: ‘pt15’

  • Population older than 18 years: ‘pt18’

  • Population at age 1: ‘p1’

  • Population aged 1 to 4 years: ‘p1t4’

  • Population aged 5 to 9 years: ‘p5t9’

  • Population aged 10 to 14 years: ‘p10t14’

  • Population aged 15 to 19 years: ‘p15t19’

  • Population aged 20 to 29 years: ‘p20t29’

  • Population aged 30 to 39 years: ‘p30t39’

  • Population aged 40 to 49 years: ‘p40t49’

  • Population aged 50 to 59 years: ‘p50t59’

  • Population aged 60 to 69 years: ‘p60t69’

  • Population aged 70 to 79 years: ‘p70t79’

  • Population aged 80 to 89 years: ‘p80t89’

  • Population aged 90 to 99 years: ‘p90t99’

  • Population older than 100 years: ‘po100’

names(dq) = c('name','y','p','pu1','pu5','pu15','pu25','p15t64','pt15','pt18','p1','p1t4','p5t9','p10t14','p15t19','p20t29','p30t39','p40t49','p50t59','p60t69','p70t79','p80t89','p90t99','po100')

1.4 1.5 Rút trích dữ liệu

Chọn ra 6 cột tương ứng là “name”,“y”,“p”,“pu1”,“p1”,“po100” và chọn những hàng bắt đầu bằng chữ C gán vào object dq18.

Kết quả là: 1440 hàng và 6 cột

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(stringr)
dq18 <- select(dq,name,y,p,pu1,p1,po100) %>% filter(str_detect(name, "^C"))
str(dq18)
## 'data.frame':    1440 obs. of  6 variables:
##  $ name : chr  "Cambodia" "Cambodia" "Cambodia" "Cambodia" ...
##  $ y    : num  1950 1951 1952 1953 1954 ...
##  $ p    : num  4380384 4485394 4592881 4702070 4814380 ...
##  $ pu1  : num  182915 187020 191505 196556 201835 ...
##  $ p1   : num  160034 168136 172102 176400 181257 ...
##  $ po100: num  2 2 2 2 2 2 1 1 1 1 ...

Chọn ra 6 cột tương ứng là “name”,“y”,“p”,“pu1”,“p1”,“po100” và chọn những hàng bắt đầu bằng chữ C gán vào object dq18.

1.5 1.6 Mã hóa dữ liệu

Câu lệnh biểu thị lệnh so sánh trên 2 cột là cột pu1 và po100

  • Nếu có giá trị nào trên cột pu1 của hàng nào đó bằng 0 (dq18$pu1 == 0 đúng), thì giá trị của cột pu1 trong hàng đó sẽ được thay thế thành ‘Khong’

  • Nếu có giá trị nào trên cột pu1 của hàng nào đó không bằng 0 (dq18$pu1 == 0 sai), thì giá trị của cột pu1 trong hàng đó sẽ được thay thế thành ‘Co’

dq18$pu1.phanloai <- ifelse(dq18$pu1 == 0, 'Khong Co', 'Co')
str(dq18)
## 'data.frame':    1440 obs. of  7 variables:
##  $ name        : chr  "Cambodia" "Cambodia" "Cambodia" "Cambodia" ...
##  $ y           : num  1950 1951 1952 1953 1954 ...
##  $ p           : num  4380384 4485394 4592881 4702070 4814380 ...
##  $ pu1         : num  182915 187020 191505 196556 201835 ...
##  $ p1          : num  160034 168136 172102 176400 181257 ...
##  $ po100       : num  2 2 2 2 2 2 1 1 1 1 ...
##  $ pu1.phanloai: chr  "Co" "Co" "Co" "Co" ...

*Tạo một biến mới trong bảng dữ liệt datasets dq18 bằng cách chia biến p thành nhiều khoảng và gắn tên cho từng khoảng dựa trên từng giá trị của nó

  • dq18$p: là biến đang muốn chia thành khoảng

  • 5 là số lượng khoảng

  • labels = c(‘Qua it’,‘It’,‘Trung binh’,‘Nhieu’,‘Qua nhieu’) là tên của các khoảng

dq18$p.cut <- cut(dq18$p,5,labels = c('Qua it','It','Trung binh','Nhieu','Qua nhieu'))
str(dq18)
## 'data.frame':    1440 obs. of  8 variables:
##  $ name        : chr  "Cambodia" "Cambodia" "Cambodia" "Cambodia" ...
##  $ y           : num  1950 1951 1952 1953 1954 ...
##  $ p           : num  4380384 4485394 4592881 4702070 4814380 ...
##  $ pu1         : num  182915 187020 191505 196556 201835 ...
##  $ p1          : num  160034 168136 172102 176400 181257 ...
##  $ po100       : num  2 2 2 2 2 2 1 1 1 1 ...
##  $ pu1.phanloai: chr  "Co" "Co" "Co" "Co" ...
##  $ p.cut       : Factor w/ 5 levels "Qua it","It",..: 1 1 1 1 1 1 1 1 1 1 ...

**Kết quả: biến mới p.cut sẽ chứa các tên tương ứng (‘Qua it’,‘It’,‘Trung binh’,‘Nhieu’,‘Qua nhieu’)

Với khoảng mà giá trị của p thuộc vào. Nó tạo ra một biến phân loại dựa trên giá trị của biến số p.

1.6 1.7 Lập bảng tần số cho 1 biến

  • Bảng tần số có 72 mức giá (1d), được đánh số từ 1 đến 72, tương ứng với mỗi năm từ 1950 đến …
  • Số lần xuất hiện là 20
  • Attribue “dimnames” mô tả các tên của mỗi mức giá, và chúng được hiển thị dưới dạng chuỗi năm, ví dụ: “1950”, “1951”, “1952”, …
dq1 <- table(dq18$y)
str(dq1)
##  'table' int [1:72(1d)] 20 20 20 20 20 20 20 20 20 20 ...
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:72] "1950" "1951" "1952" "1953" ...

1.7 1.8 Lập bảng tần số 2 biến

dq1 <- table(dq18$y)
str(dq1)
##  'table' int [1:72(1d)] 20 20 20 20 20 20 20 20 20 20 ...
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:72] "1950" "1951" "1952" "1953" ...
dq2 <- table(dq18$y,dq18$p.cut)
str(dq2)
##  'table' int [1:72, 1:5] 19 19 19 19 19 19 19 19 19 19 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:72] "1950" "1951" "1952" "1953" ...
##   ..$ : chr [1:5] "Qua it" "It" "Trung binh" "Nhieu" ...

Kết quả - Bảng tần số có 72 hàng (1:72), có 5 cột (1:5)

  • Danh sách 1 : đại diện cho năm, được đánh số từ 1 đến 72, tương ứng với các năm “1951” “1952” “1953” …

  • Danh sách 2: Đại diện cho tên của của các nhóm: “Qua it” “It” “Trung binh” “Nhieu” …

1.8 Phân tích dữ liệu theo quốc gia và thời gian

Tính trung bình, phương sai, min, max của cột p

summary(dq18$p)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 6.937e+03 6.158e+05 4.611e+06 5.895e+07 1.143e+07 1.426e+09

Kết quả

  • Min: Gía trị nhỏ nhất 6.937e+03

  • 1 st Qu: Phân vị thứ nhất 25% dữ liệu nhỏ hơn giá trị 6.158e+05

  • Median: Trung vị, giá trị ở giữa khi dữ liệu được xếp theo giá trị tăng dần 4.611e+06

  • Mean: Gía trị trung bình của dữ liệu 5.895e+07

  • 3rd Qu. : Phân vị thứ ba, có 75% dữ liệu nhỏ hơn giá trị 1.143e+07

  • Max: Gía trị lớn nhất 1.426e+09

Phân tích dân số trung bình theo nhóm quốc gia

  • group_by(y): Nhóm dữ liệu theo cột “y”. Nghĩa là các phép tổng hợp tiếp theo sẽ được thực hiện cho từng nhóm “y” riêng biệt.

  • summarise(mean_of_population = mean(p)): Tính trung bình của cột “p” cho mỗi nhóm “name” và tạo ra một cột mới có tên “mean_of_population” để lưu trữ kết quả.

dq3 <- dq18 %>% group_by(name) %>% summarise(mean_of_population = mean(p))
str(dq3)
## tibble [20 × 2] (S3: tbl_df/tbl/data.frame)
##  $ name              : chr [1:20] "Cambodia" "Cameroon" "Canada" "Cape Verde" ...
##  $ mean_of_population: num [1:20] 9323148 11887287 26143393 366402 28276 ...

Kết quả - Cột ‘name’: chứa tên 20 quốc gia

  • Cột mean_of_population: Chứa 20 giá trị trung bình của ‘p’ cho từng năm

Phân tích số trẻ em dưới 1 tuổi theo nhóm quốc gia và năm

Lệnh này sử dụng dplyr để tạo một tóm tắt của data frame dq18 bằng cách nhóm theo cột name (quốc gia) và y (năm), sau đó tính tổng số lượng (n) và tổng của cột p1 trong mỗi nhóm.

Kết quả sẽ là data frame mới dq4 chứa thông tin tổng hợp theo quốc gia và năm.

dq4 <- dq18 %>% group_by(name,y) %>% summarise(n = n(),sum_of_p1 = sum(p1),.groups = 'drop')
str(dq4)
## tibble [1,440 × 4] (S3: tbl_df/tbl/data.frame)
##  $ name     : chr [1:1440] "Cambodia" "Cambodia" "Cambodia" "Cambodia" ...
##  $ y        : num [1:1440] 1950 1951 1952 1953 1954 ...
##  $ n        : int [1:1440] 1 1 1 1 1 1 1 1 1 1 ...
##  $ sum_of_p1: num [1:1440] 160034 168136 172102 176400 181257 ...

Kết quả - Cột ‘name’ : chứa tên các quốc gia bắt đầu bằng chữ C trong dữ liệu

  • Cột ‘y’ : chứa năm

  • Cột ‘n’ : chứa số lượng của cặp giá trị ‘name’ và ‘y’

  • Cột ‘sum_of_p1’ : Chứa tổng giá trị của cột “p1” cho mỗi cặp giá trị “name” và “y”

2 Nhiệm vụ 3.2

2.1 2.1 Giới thiệu

Tiến hành thao tác một số lệnh cơ bản trên datasets “UNdata_Export_20240126_122832051.xlsx”

2.2 2.2 Mô tả datasets

  • Là một data frame

  • Có 5 cột tương ứng với 5 giá trị

  • Có 285 hàng tương ứng với 285 quan sát

  • Có 286 ô trống

  • Ký hiệu các cột:

    • “Country.or.Area”: “Quốc gia.hoặc.Khu vực”
    • “Year”: “Năm”
    • “Unit” “Đơn vị”
    • “Value”: “Giá trị”
    • “Value.Footnotes”: “Chú thích giá trị”
library(xlsx)
chtr <- read.xlsx(file.choose(), sheetIndex = 1, header = T) 

đọc dữ liệu từ excel và gán vào object chtr

is.data.frame(chtr)
## [1] TRUE

Kiểm tra xem “chtr” có phải là data frame hay không, nếu đúng thì TRUE và ngược lại

length(chtr)
## [1] 5

cho ra kết quả độ dài, ở đây là số cột của “chtr” : 5 cột

names(chtr) 
## [1] "Country.or.Area" "Year"            "Unit"            "Value"          
## [5] "Value.Footnotes"

cho ra tên các cột của “chtr”

dim(chtr) 
## [1] 285   5

data này có 285 hàng và 5 cột

sum(is.na(chtr))  
## [1] 286

tổng số ô trống của object “chtr”

Kết quả trả về tương ứng với chtr có 286 ô trống*

2.3 2.3 Thống kê dữ liệu

Thực hiện thống kê mô tả datasets này ta được kết quả như sau, ý nghĩa các cột:

  • n_missing: số ô dư liệu trống

  • complete_rate: tỷ lệ ô có dữ liệu

  • mean: trung bình

  • sd: độ lệch chuẩn

  • p0: giá trị nhỏ nhất

  • p25: Phân vị thứ nhất

  • p50: Phân vị thứ hai cũng chính là trung vị

  • p75: phân vị thứ ba

  • p100: giá trị lớn nhất

  • hist: biểu đồ Histogram

Xác định thông tin cơ bản trong chtr

library(skimr)
skim(chtr)
Data summary
Name chtr
Number of rows 285
Number of columns 5
_______________________
Column type frequency:
character 3
numeric 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Country.or.Area 0 1.00 1 46 0 26 0
Year 0 1.00 4 74 0 25 0
Unit 3 0.99 8 8 0 1 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Value 3 0.99 2443.88 7727.81 0 32.5 223.26 1401.36 107329.6 ▇▁▁▁▁
Value.Footnotes 280 0.02 1.80 0.45 1 2.0 2.00 2.00 2.0 ▂▁▁▁▇

2.4 2.4 Đổi tên các cột để thao tác

Các ký hiệu tên tương ứng theo thứ tự lần lượt từ cột 1 đến cột 5

  • “Country.or.Area”: name2
    • “Year”: “y2”
    • “Unit” “un”
    • “Value”: “vl”
    • “Value.Footnotes”: “Vnote”
names(chtr)= c('name2','y2','un','Vl','Vnote')
names(chtr)
## [1] "name2" "y2"    "un"    "Vl"    "Vnote"

2.5 2.5 Rút trích dữ liệu

Chọn ra 3 cột tương ứng là “name2”,“y2”,“Vl” và chọn những hàng bắt đầu bằng chữ C gán vào object chtr1.

library(dplyr)
library(stringr)
chtr1 <- select(chtr,name2,y2,Vl) %>% filter(str_detect(name2, "^C"))
str(chtr1)
## 'data.frame':    28 obs. of  3 variables:
##  $ name2: chr  "Chile" "Chile" "Chile" "Chile" ...
##  $ y2   : chr  "2016" "2015" "2014" "2013" ...
##  $ Vl   : num  535 281 214 489 564 ...

2.6 2.6 Mã hóa dữ liệu

  • Nếu giá trị trong cột “Vl” nhỏ hơn 50,000, thì giá trị tương ứng trong cột “Giatri” sẽ là ‘Ít’.

  • Nếu giá trị trong cột “Vl” nằm trong khoảng từ 50,000 đến 100,000, thì giá trị tương ứng trong cột “Giatri” sẽ là ‘Trung Bình’.

Nếu giá trị trong cột “Vl” lớn hơn 100,000, thì giá trị tương ứng trong cột “Giatri” sẽ là ‘Nhiều’.

chtr1$Vl.Giatri <- case_when(chtr1$Vl < 50.000 ~ 'It', chtr1$Vl >= 50.000 & chtr1$Vl <= 100.000 ~ 'Trung Binh', chtr1$Vl > 100.000 ~ 'Nhieu')
str(chtr1)
## 'data.frame':    28 obs. of  4 variables:
##  $ name2    : chr  "Chile" "Chile" "Chile" "Chile" ...
##  $ y2       : chr  "2016" "2015" "2014" "2013" ...
##  $ Vl       : num  535 281 214 489 564 ...
##  $ Vl.Giatri: chr  "Nhieu" "Nhieu" "Nhieu" "Nhieu" ...

Lệnh này Chia phạm vi giá trị của cột “Vl” thành 3 khoảng và gán tên cho mỗi khoảng là ‘Giatri1’, ‘Giatri2’, và ‘Giatri3’. Các giá trị của cột “Vl” sẽ được gán vào các khoảng tương ứng.

chtr1$Vl.cut <- cut(chtr1$Vl, 3, labels = c('Giatri1', 'Giatri2', 'Giatri3'))
str(chtr1) 
## 'data.frame':    28 obs. of  5 variables:
##  $ name2    : chr  "Chile" "Chile" "Chile" "Chile" ...
##  $ y2       : chr  "2016" "2015" "2014" "2013" ...
##  $ Vl       : num  535 281 214 489 564 ...
##  $ Vl.Giatri: chr  "Nhieu" "Nhieu" "Nhieu" "Nhieu" ...
##  $ Vl.cut   : Factor w/ 3 levels "Giatri1","Giatri2",..: 3 2 2 3 3 1 1 1 1 1 ...

2.7 2.7 Lập bảng tần số

Bảng tần số hiển thị số lượng quan sát cho một cột giá trị ‘Vl.cut’ cho từng quốc gia trong ‘name2’.

table(chtr1$name2,chtr1$Vl.cut)
##                                                 
##                                                  Giatri1 Giatri2 Giatri3
##   Chile                                                0       2       3
##   China, Hong Kong Special Administrative Region      14       0       0
##   Cyprus                                               9       0       0

2.8 2.8 Phân tích dữ liệu theo quốc gia, đơn vị và giá trị

Tính trung bình, phương sai, min, max của cột ‘Vl’

summary(chtr$Vl)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
##      0.0     32.5    223.3   2443.9   1401.4 107329.6        3

Kết quả - Min.: Giá trị nhỏ nhất trong dữ liệu. Trong trường hợp này, giá trị nhỏ nhất của cột v là 0.0.

  • 1st Qu.: Phần vị phân vị thứ nhất . Khoảng 25% giá trị trong dữ liệu nhỏ hơn hoặc bằng giá trị này. Trong trường hợp này, giá trị 1st Qu. là 32.5 .

  • Median: Giá trị trung bình . Khoảng 50% giá trị trong dữ liệu nhỏ hơn hoặc bằng giá trị này. Trong trường hợp này, giá trị Median là 223.3 .

  • Mean: Giá trị trung bình của dữ liệu. Trong trường hợp này, giá trị Mean là 2443.9.

  • 3rd Qu.: Phần vị phân vị thứ ba . Khoảng 75% giá trị trong dữ liệu nhỏ hơn hoặc bằng giá trị này. Trong trường hợp này, giá trị 3rd Qu. là 1401.4.

  • Max.: Giá trị lớn nhất trong dữ liệu. Trong trường hợp này, giá trị lớn nhất của cột Vl là 107329.6.

  • NA’s: Gía trị trống có 3

Phân tích dân số trung bình theo nhóm quốc gia

  • group_by(y2): Nhóm dữ liệu theo cột “y2”. Nghĩa là các phép tổng hợp tiếp theo sẽ được thực hiện cho từng nhóm “y2” riêng biệt.

  • summarise(mean_of_population = mean(Vl)): Tính trung bình của cột “Vl” cho mỗi nhóm “name2” và tạo ra một cột mới có tên “mean_of_population” để lưu trữ kết quả.

chtr2 <- chtr1 %>% group_by(name2) %>% summarise(mean_of_population = mean(Vl))
str(chtr2)
## tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
##  $ name2             : chr [1:3] "Chile" "China, Hong Kong Special Administrative Region" "Cyprus"
##  $ mean_of_population: num [1:3] 416.4 37.6 13.4

Kết quả - Cột ‘name2’: chứa tên 3 quốc gia là: “Chile” “China, Hong Kong Special Administrative Region” “Cyprus”

  • Cột mean_of_population: Chứa 3 giá trị trung bình của ‘Vl’ cho từng năm là: 416.4 37.6 13.4
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAzIg0KYXV0aG9yOiAiTmd1eWVuIERpZW0gUXV5bmgiDQpkYXRlOiAiMjAyNC0wMS0yMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfdGl0bGU6IE3hu6VjIGzhu6VjDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogJzEnDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBOaGnhu4dtIHbhu6UgMy4xDQoNCiMjIDEuMSBUw7NtIHThuq90DQoNCk5oaeG7h20gduG7pSAzLjEgdGnhur9uIGjDoG5oIHRoYW8gdMOhYyAxIHPhu5EgbOG7h25oIGPGoSBi4bqjbiB0csOqbiBwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5LmNzdiB0aOG7kW5nIGvDqiB24buBIGTDom4gc+G7kSB2w6AgbmjDom4ga2jhuql1IGjhu41jIOG7nyBjw6FjIHF14buRYyBnaWENCg0KIyMgMS4yIE3DtCB04bqjIGRhdGFzZXRzDQoNCioqQ8OhYyBtw7QgdOG6oyBjxqEgYuG6o24gduG7gSBkYXRhc2V0KioNCg0KLSBMw6AgMSBkYXRhIGZyYW1lDQoNCi0gQ8OzIDI0IGPhu5l0IHTGsMahbmcgxJHGsMahbmcgduG7m2kgMjQgYmnhur9uDQoNCi0gQ8OhYyBj4buZdCBs4bqnbiBsxrDhu6N0IGzDoCANCg0KICAtIENvdW50cnkubmFtZSA6IFTDqm4gcXXhu5FjIGdpYQ0KICAtIFllYXIgOiBOxINtDQogIC0gUG9wdWxhdGlvbiA6IETDom4gc+G7kQ0KICAtIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxIDogRMOibiBz4buRIHRy4bq7IGVtIGTGsOG7m2kgMSB0deG7lWkNCiAgDQogIC0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDUgOiBEw6JuIHPhu5EgdHLhursgZW0gZMaw4bubaSA1IHR14buVaQ0KICANCiAgLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgMTUgOiBEw6JuIHPhu5EgdHLhursgZW0gZMaw4bubaSAxNSB0deG7lWkNCiAgDQogIC0gUG9wdWxhdGlvbiB1bmRlciB0aGUgYWdlIG9mIDI1IDogRMOibiBz4buRIGTGsOG7m2kgMjUgdHXhu5VpDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCAxNSB0byA2NCB5ZWFycyA6IETDom4gc+G7kSB04burIDE1IMSR4bq/biA2NCB0deG7lWkNCiAgDQogIC0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDE1IHllYXJzIDogRMOibiBz4buRIHRyw6puIDE1IHR14buVaQ0KICANCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTggeWVhcnMgOiBEw6JuIHPhu5EgdHLDqm4gMTggdHXhu5VpDQogIA0KICAtIFBvcHVsYXRpb24gYXQgYWdlIDEgOiBEw6JuIHPhu5EgbMO6YyAxIHR14buVaQ0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgMSB0byA0IHllYXJzIDogRMOibiBz4buRIHThu6sgMSDEkeG6v24gNCB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzIDogRMOibiBz4buRIHThu6sgNSDEkeG6v24gOSB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnMgOiBEw6JuIHPhu5EgdOG7qyAxMCDEkeG6v24gMTQgdHXhu5VpDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDE1IHRvIDE5IHllYXJzIDogRMOibiBz4buRIHThu6sgMTUgxJHhur9uIDE5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCAyMCB0byAyOSB5ZWFycyA6IETDom4gc+G7kSB04burIDIwIMSR4bq/biAyOSB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIGFnZWQgMzAgdG8gMzkgeWVhcnMgOiBEw6JuIHPhu5EgdOG7qyAzMCDEkeG6v24gMzkgdHXhu5VpDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDQwIHRvIDQ5IHllYXJzIDogRMOibiBz4buRIHThu6sgNDAgxJHhur9uIDQ5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFycyA6IETDom4gc+G7kSB04burIDUwIMSR4bq/biA1OSB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIGFnZWQgNjAgdG8gNjkgeWVhcnMgOiBEw6JuIHPhu5EgdOG7qyA2MCDEkeG6v24gNjkgdHXhu5VpDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDcwIHRvIDc5IHllYXJzIDogRMOibiBz4buRIHThu6sgNzAgxJHhur9uIDc5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFycyA6IETDom4gc+G7kSB04burIDgwIMSR4bq/biA4OSB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIGFnZWQgOTAgdG8gOTkgeWVhcnMgOiBEw6JuIHPhu5EgdOG7qyA5MCDEkeG6v24gOTkgdHXhu5VpDQogIC0gUG9wdWxhdGlvbiBvbGRlciB0aGFuIDEwMCB5ZWFycyA6IETDom4gc+G7kSB0csOqbiAxMDAgdHXhu5VpDQogIA0KIA0KYGBge3J9IA0KbGlicmFyeSh4bHN4KQ0KZHEgPC0gcmVhZC54bHN4KGZpbGUuY2hvb3NlKCksIHNoZWV0SW5kZXggPSAxLCBoZWFkZXIgPSBUKSANCmBgYA0KxJHhu41jIGThu68gbGnhu4d1IHThu6sgZXhjZWwgdsOgIGfDoW4gdsOgbyBvYmplY3QgZHENCg0KYGBge3J9IA0KaXMuZGF0YS5mcmFtZShkcSkNCmBgYA0KS2nhu4NtIHRyYSB4ZW0gImRxIiBjw7MgcGjhuqNpIGzDoCBkYXRhIGZyYW1lIGhheSBraMO0bmcsIG7hur91IMSRw7puZyB0aMOsIFRSVUUgdsOgIG5nxrDhu6NjIGzhuqFpDQoNCmBgYHtyLCBlY2hvPVRSVUUgfQ0KbGVuZ3RoKGRxKQ0KYGBgDQpjaG8gcmEga+G6v3QgcXXhuqMgxJHhu5kgZMOgaSwg4bufIMSRw6J5IGzDoCBz4buRIGPhu5l0IGPhu6dhICJkcSINCg0KYGBge3IsIGVjaG89VFJVRSB9DQpuYW1lcyhkcSkgDQpgYGANCmNobyByYSB0w6puIGPDoWMgY+G7mXQgY+G7p2EgImRxIg0KDQpgYGB7ciwgZWNobz1UUlVFIH0NCmRpbShkcSkgDQpgYGANCg0KZGF0YSBuw6B5IGPDsyAxODI4OCBow6BuZyB2w6AgMjQgY+G7mXQNCg0KYGBge3IsIGVjaG89VFJVRSB9DQpzdW0oaXMubmEoZHEpKSAgDQpgYGANCnThu5VuZyBz4buRIMO0IHRy4buRbmcgY+G7p2Egb2JqZWN0ICJkcSINCg0KS+G6v3QgcXXhuqMgdHLhuqMgduG7gSB0xrDGoW5nIOG7qW5nIHbhu5tpIGRxIGtow7RuZyBjw7Mgw7QgdHLhu5FuZyBuw6BvDQojIyAxLjMgVGjhu5FuZyBrw6ogZOG7ryBsaeG7h3UNCg0KVGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiBtw7QgdOG6oyBkYXRhc2V0cyBuw6B5IHRhIMSRxrDhu6NjIGvhur90IHF14bqjIG5oxrAgc2F1LCDDvSBuZ2jEqWEgY8OhYyBj4buZdDoNCg0KLSBuX21pc3Npbmc6IHPhu5Egw7QgZMawIGxp4buHdSB0cuG7kW5nDQoNCi0gY29tcGxldGVfcmF0ZTogdOG7tyBs4buHIMO0IGPDsyBk4buvIGxp4buHdQ0KDQotIG1lYW46IHRydW5nIGLDrG5oDQoNCi0gc2Q6IMSR4buZIGzhu4djaCBjaHXhuqluDQoNCi0gcDA6IGdpw6EgdHLhu4sgbmjhu48gbmjhuqV0DQoNCi0gcDI1OiBQaMOibiB24buLIHRo4bupIG5o4bqldA0KDQotIHA1MDogUGjDom4gduG7iyB0aOG7qSBoYWkgY8WpbmcgY2jDrW5oIGzDoCB0cnVuZyB24buLDQoNCi0gcDc1OiBwaMOibiB24buLIHRo4bupIGJhDQoNCi0gcDEwMDogZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQNCg0KLSBoaXN0OiBiaeG7g3UgxJHhu5MgSGlzdG9ncmFtDQoNCioqWMOhYyDEkeG7i25oIGPDoWMgdGjDtG5nIHRpbiBj4bunYSBkcSoqDQpgYGB7cn0NCmxpYnJhcnkoc2tpbXIpDQpza2ltKGRxKQ0KYGBgDQoNCiMjIDEuNCDEkOG7lWkgdMOqbiBjw6FjIGPhu5l0DQoNCioqQ8OhYyBrw70gaGnhu4d1IHTDqm4gdMawxqFuZyDhu6luZyBs4bqnbiBsxrDhu6N0IHThu6sgY+G7mXQgMSDEkeG6v24gY+G7mXQgMjQqKg0KDQotIENvdW50cnkgbmFtZTog4oCYbmFtZeKAmQ0KDQotIFllYXI6IOKAmHnigJkNCg0KLSBQb3B1bGF0aW9uOiDigJhw4oCZDQoNCi0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE6IOKAmHB1MeKAmQ0KDQotIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiA1OiDigJhwdTXigJkNCg0KLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgMTU6IOKAmHB1MTXigJkNCg0KLSBQb3B1bGF0aW9uIHVuZGVyIHRoZSBhZ2Ugb2YgMjU6IOKAmHB1MjXigJkNCg0KLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gNjQgeWVhcnM6IOKAmHAxNXQ2NOKAmQ0KDQotIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxNSB5ZWFyczog4oCYcHQxNeKAmQ0KDQotIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxOCB5ZWFyczog4oCYcHQxOOKAmQ0KDQotIFBvcHVsYXRpb24gYXQgYWdlIDE6IOKAmHAx4oCZDQoNCi0gUG9wdWxhdGlvbiBhZ2VkIDEgdG8gNCB5ZWFyczog4oCYcDF0NOKAmQ0KDQotIFBvcHVsYXRpb24gYWdlZCA1IHRvIDkgeWVhcnM6IOKAmHA1dDnigJkNCg0KLSBQb3B1bGF0aW9uIGFnZWQgMTAgdG8gMTQgeWVhcnM6IOKAmHAxMHQxNOKAmQ0KDQotIFBvcHVsYXRpb24gYWdlZCAxNSB0byAxOSB5ZWFyczog4oCYcDE1dDE54oCZDQoNCi0gUG9wdWxhdGlvbiBhZ2VkIDIwIHRvIDI5IHllYXJzOiDigJhwMjB0MjnigJkNCg0KLSBQb3B1bGF0aW9uIGFnZWQgMzAgdG8gMzkgeWVhcnM6IOKAmHAzMHQzOeKAmQ0KDQotIFBvcHVsYXRpb24gYWdlZCA0MCB0byA0OSB5ZWFyczog4oCYcDQwdDQ54oCZDQoNCi0gUG9wdWxhdGlvbiBhZ2VkIDUwIHRvIDU5IHllYXJzOiDigJhwNTB0NTnigJkNCg0KLSBQb3B1bGF0aW9uIGFnZWQgNjAgdG8gNjkgeWVhcnM6IOKAmHA2MHQ2OeKAmQ0KDQotIFBvcHVsYXRpb24gYWdlZCA3MCB0byA3OSB5ZWFyczog4oCYcDcwdDc54oCZDQoNCi0gUG9wdWxhdGlvbiBhZ2VkIDgwIHRvIDg5IHllYXJzOiDigJhwODB0ODnigJkNCg0KLSBQb3B1bGF0aW9uIGFnZWQgOTAgdG8gOTkgeWVhcnM6IOKAmHA5MHQ5OeKAmQ0KDQotIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxMDAgeWVhcnM6IOKAmHBvMTAw4oCZDQoNCmBgYHtyICxlY2hvPVRSVUUgIH0NCm5hbWVzKGRxKSA9IGMoJ25hbWUnLCd5JywncCcsJ3B1MScsJ3B1NScsJ3B1MTUnLCdwdTI1JywncDE1dDY0JywncHQxNScsJ3B0MTgnLCdwMScsJ3AxdDQnLCdwNXQ5JywncDEwdDE0JywncDE1dDE5JywncDIwdDI5JywncDMwdDM5JywncDQwdDQ5JywncDUwdDU5JywncDYwdDY5JywncDcwdDc5JywncDgwdDg5JywncDkwdDk5JywncG8xMDAnKQ0KYGBgDQoNCg0KIyMgMS41IFLDunQgdHLDrWNoIGThu68gbGnhu4d1DQoNCkNo4buNbiByYSA2IGPhu5l0IHTGsMahbmcg4bupbmcgbMOgICJuYW1lIiwieSIsInAiLCJwdTEiLCJwMSIsInBvMTAwIiB2w6AgY2jhu41uIG5o4buvbmcgaMOgbmcgYuG6r3QgxJHhuqd1IGLhurFuZyBjaOG7ryBDIGfDoW4gdsOgbyBvYmplY3QgZHExOC4gDQoNCioqS+G6v3QgcXXhuqMgbMOgOiAxNDQwIGjDoG5nIHbDoCA2IGPhu5l0ICoqIA0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHN0cmluZ3IpDQpkcTE4IDwtIHNlbGVjdChkcSxuYW1lLHkscCxwdTEscDEscG8xMDApICU+JSBmaWx0ZXIoc3RyX2RldGVjdChuYW1lLCAiXkMiKSkNCnN0cihkcTE4KQ0KYGBgDQoqKkNo4buNbiByYSA2IGPhu5l0IHTGsMahbmcg4bupbmcgbMOgICJuYW1lIiwieSIsInAiLCJwdTEiLCJwMSIsInBvMTAwIiB2w6AgY2jhu41uIG5o4buvbmcgaMOgbmcgYuG6r3QgxJHhuqd1IGLhurFuZyBjaOG7ryBDIGfDoW4gdsOgbyBvYmplY3QgZHExOC4gKioNCg0KIyMgMS42IE3DoyBow7NhIGThu68gbGnhu4d1DQoNCioqQ8OidSBs4buHbmggYmnhu4N1IHRo4buLIGzhu4duaCBzbyBzw6FuaCB0csOqbiAyIGPhu5l0IGzDoCBj4buZdCBwdTEgdsOgIHBvMTAwKioNCg0KLSBO4bq/dSBjw7MgZ2nDoSB0cuG7iyBuw6BvIHRyw6puIGPhu5l0IHB1MSBj4bunYSBow6BuZyBuw6BvIMSRw7MgYuG6sW5nIDAgKGRxMTgkcHUxID09IDAgxJHDum5nKSwgdGjDrCBnacOhIHRy4buLIGPhu6dhIGPhu5l0IHB1MSB0cm9uZyBow6BuZyDEkcOzIHPhur0gxJHGsOG7o2MgdGhheSB0aOG6vyB0aMOgbmgg4oCYS2hvbmfigJkNCg0KLSBO4bq/dSBjw7MgZ2nDoSB0cuG7iyBuw6BvIHRyw6puIGPhu5l0IHB1MSBj4bunYSBow6BuZyBuw6BvIMSRw7Mga2jDtG5nIGLhurFuZyAwIChkcTE4JHB1MSA9PSAwIHNhaSksIHRow6wgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCBwdTEgdHJvbmcgaMOgbmcgxJHDsyBz4bq9IMSRxrDhu6NjIHRoYXkgdGjhur8gdGjDoG5oIOKAmENv4oCZDQoNCmBgYHtyLCBlY2hvPVRSVUUgfQ0KZHExOCRwdTEucGhhbmxvYWkgPC0gaWZlbHNlKGRxMTgkcHUxID09IDAsICdLaG9uZyBDbycsICdDbycpDQpzdHIoZHExOCkNCmBgYA0KKlThuqFvIG3hu5l0IGJp4bq/biBt4bubaSB0cm9uZyBi4bqjbmcgZOG7ryBsaeG7h3QgZGF0YXNldHMgZHExOCBi4bqxbmcgY8OhY2ggY2hpYSBiaeG6v24gcCB0aMOgbmggbmhp4buBdSBraG/huqNuZyB2w6AgZ+G6r24gdMOqbiBjaG8gdOG7q25nIGtob+G6o25nIGThu7FhIHRyw6puIHThu6tuZyBnacOhIHRy4buLIGPhu6dhIG7Dsw0KDQotIGRxMTgkcDogbMOgIGJp4bq/biDEkWFuZyBtdeG7kW4gY2hpYSB0aMOgbmgga2hv4bqjbmcNCg0KLSA1IGzDoCBz4buRIGzGsOG7o25nIGtob+G6o25nIA0KDQotIGxhYmVscyA9IGMoJ1F1YSBpdCcsJ0l0JywnVHJ1bmcgYmluaCcsJ05oaWV1JywnUXVhIG5oaWV1JykgbMOgIHTDqm4gY+G7p2EgY8OhYyBraG/huqNuZw0KDQpgYGB7cn0NCmRxMTgkcC5jdXQgPC0gY3V0KGRxMTgkcCw1LGxhYmVscyA9IGMoJ1F1YSBpdCcsJ0l0JywnVHJ1bmcgYmluaCcsJ05oaWV1JywnUXVhIG5oaWV1JykpDQpzdHIoZHExOCkNCmBgYA0KDQoqKkvhur90IHF14bqjOiBiaeG6v24gbeG7m2kgcC5jdXQgc+G6vSBjaOG7qWEgY8OhYyB0w6puIHTGsMahbmcg4bupbmcgKCdRdWEgaXQnLCdJdCcsJ1RydW5nIGJpbmgnLCdOaGlldScsJ1F1YSBuaGlldScpDQoNClbhu5tpIGtob+G6o25nIG3DoCBnacOhIHRy4buLIGPhu6dhIHAgdGh14buZYyB2w6BvLiBOw7MgdOG6oW8gcmEgbeG7mXQgYmnhur9uIHBow6JuIGxv4bqhaSBk4buxYSB0csOqbiBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBz4buRIHAuDQoNCg0KIyMgMS43IEzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNobyAxIGJp4bq/bg0KDQotIELhuqNuZyB04bqnbiBz4buRIGPDsyA3MiBt4bupYyBnacOhICgxZCksIMSRxrDhu6NjIMSRw6FuaCBz4buRIHThu6sgMSDEkeG6v24gNzIsIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbsSDbSB04burIDE5NTAgxJHhur9uIOKApg0KLSAgU+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGzDoCAyMA0KLSBBdHRyaWJ1ZSDigJxkaW1uYW1lc+KAnSBtw7QgdOG6oyBjw6FjIHTDqm4gY+G7p2EgbeG7l2kgbeG7qWMgZ2nDoSwgdsOgIGNow7puZyDEkcaw4bujYyBoaeG7g24gdGjhu4sgZMaw4bubaSBk4bqhbmcgY2h14buXaSBuxINtLCB2w60gZOG7pTog4oCcMTk1MOKAnSwg4oCcMTk1MeKAnSwg4oCcMTk1MuKAnSwg4oCmDQoNCmBgYHtyfQ0KZHExIDwtIHRhYmxlKGRxMTgkeSkNCnN0cihkcTEpDQpgYGANCiMjIDEuOCBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSAyIGJp4bq/bg0KDQoNCmBgYHtyLCBlY2hvPVRSVUUgfQ0KZHExIDwtIHRhYmxlKGRxMTgkeSkNCnN0cihkcTEpDQpgYGANCg0KYGBge3J9DQpkcTIgPC0gdGFibGUoZHExOCR5LGRxMTgkcC5jdXQpDQpzdHIoZHEyKQ0KYGBgDQoqKkvhur90IHF14bqjKioNCi0gQuG6o25nIHThuqduIHPhu5EgY8OzIDcyIGjDoG5nICgxOjcyKSwgY8OzIDUgY+G7mXQgKDE6NSkNCg0KLSBEYW5oIHPDoWNoIDEgOiDEkeG6oWkgZGnhu4duIGNobyBuxINtLCDEkcaw4bujYyDEkcOhbmggc+G7kSB04burIDEgxJHhur9uIDcyLCB0xrDGoW5nIOG7qW5nIHbhu5tpIGPDoWMgbsSDbSAiMTk1MSIgIjE5NTIiICIxOTUzIiAuLi4NCg0KLSBEYW5oIHPDoWNoIDI6IMSQ4bqhaSBkaeG7h24gY2hvIHTDqm4gY+G7p2EgY+G7p2EgY8OhYyBuaMOzbTogIlF1YSBpdCIgIkl0IiAiVHJ1bmcgYmluaCIgIk5oaWV1IiAuLi4NCiAgDQojIyBQaMOibiB0w61jaCBk4buvIGxp4buHdSB0aGVvIHF14buRYyBnaWEgdsOgIHRo4budaSBnaWFuDQoNCioqVMOtbmggdHJ1bmcgYsOsbmgsIHBoxrDGoW5nIHNhaSwgbWluLCBtYXggY+G7p2EgY+G7mXQgcCoqDQpgYGB7cixlY2hvPVRSVUV9DQpzdW1tYXJ5KGRxMTgkcCkNCmBgYA0KKipL4bq/dCBxdeG6oyoqDQoNCi0gTWluOiBHw61hIHRy4buLIG5o4buPIG5o4bqldCA2LjkzN2UrMDMNCg0KLSAxIHN0IFF1OiBQaMOibiB24buLIHRo4bupIG5o4bqldCAyNSUgZOG7ryBsaeG7h3Ugbmjhu48gaMahbiBnacOhIHRy4buLIDYuMTU4ZSswNSANCg0KLSBNZWRpYW46IFRydW5nIHbhu4ssIGdpw6EgdHLhu4sg4bufIGdp4buvYSAga2hpIGThu68gbGnhu4d1IMSRxrDhu6NjIHjhur9wIHRoZW8gZ2nDoSB0cuG7iyB0xINuZyBk4bqnbiA0LjYxMWUrMDYNCg0KLSBNZWFuOiBHw61hIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGThu68gbGnhu4d1IDUuODk1ZSswNw0KDQotIDNyZCBRdS4gOiBQaMOibiB24buLIHRo4bupIGJhLCBjw7MgNzUlIGThu68gbGnhu4d1IG5o4buPIGjGoW4gZ2nDoSB0cuG7iyAxLjE0M2UrMDcNCg0KLSBNYXg6IEfDrWEgdHLhu4sgbOG7m24gbmjhuqV0IDEuNDI2ZSswOQ0KDQoqKlBow6JuIHTDrWNoIGTDom4gc+G7kSB0cnVuZyBiw6xuaCB0aGVvIG5ow7NtIHF14buRYyBnaWEqKg0KDQotIGdyb3VwX2J5KHkpOiBOaMOzbSBk4buvIGxp4buHdSB0aGVvIGPhu5l0IOKAnHnigJ0uDQogIE5naMSpYSBsw6AgY8OhYyBwaMOpcCB04buVbmcgaOG7o3AgdGnhur9wIHRoZW8gc+G6vSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGNobyB04burbmcgbmjDs20g4oCceeKAnSByacOqbmcgYmnhu4d0Lg0KDQotIHN1bW1hcmlzZShtZWFuX29mX3BvcHVsYXRpb24gPSBtZWFuKHApKTogVMOtbmggdHJ1bmcgYsOsbmggY+G7p2EgY+G7mXQg4oCccOKAnSBjaG8gbeG7l2kgbmjDs20g4oCcbmFtZeKAnSB2w6AgdOG6oW8gcmEgbeG7mXQgY+G7mXQgbeG7m2kgY8OzIHTDqm4g4oCcbWVhbl9vZl9wb3B1bGF0aW9u4oCdIMSR4buDIGzGsHUgdHLhu68ga+G6v3QgcXXhuqMuDQoNCmBgYHtyLCBlY2hvPVRSVUV9DQpkcTMgPC0gZHExOCAlPiUgZ3JvdXBfYnkobmFtZSkgJT4lIHN1bW1hcmlzZShtZWFuX29mX3BvcHVsYXRpb24gPSBtZWFuKHApKQ0Kc3RyKGRxMykNCmBgYA0KKipL4bq/dCBxdeG6oyoqDQotIEPhu5l0ICduYW1lJzogY2jhu6lhIHTDqm4gMjAgcXXhu5FjIGdpYQ0KDQotIEPhu5l0IG1lYW5fb2ZfcG9wdWxhdGlvbjogQ2jhu6lhIDIwIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgJ3AnIGNobyB04burbmcgbsSDbQ0KDQoqKlBow6JuIHTDrWNoIHPhu5EgdHLhursgZW0gZMaw4bubaSAxIHR14buVaSB0aGVvIG5ow7NtIHF14buRYyBnaWEgdsOgIG7Eg20qKg0KDQpM4buHbmggbsOgeSBz4butIGThu6VuZyBkcGx5ciDEkeG7gyB04bqhbyBt4buZdCB0w7NtIHThuq90IGPhu6dhIGRhdGEgZnJhbWUgZHExOCBi4bqxbmcgY8OhY2ggbmjDs20gdGhlbyBj4buZdCBuYW1lIChxdeG7kWMgZ2lhKSB2w6AgeSAobsSDbSksIHNhdSDEkcOzIHTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nIChuKSB2w6AgdOG7lW5nIGPhu6dhIGPhu5l0IHAxIHRyb25nIG3hu5dpIG5ow7NtLg0KDQpL4bq/dCBxdeG6oyBz4bq9IGzDoCBkYXRhIGZyYW1lIG3hu5tpIGRxNCBjaOG7qWEgdGjDtG5nIHRpbiB04buVbmcgaOG7o3AgdGhlbyBxdeG7kWMgZ2lhIHbDoCBuxINtLg0KDQpgYGB7ciwgZWNobz1UUlVFfQ0KZHE0IDwtIGRxMTggJT4lIGdyb3VwX2J5KG5hbWUseSkgJT4lIHN1bW1hcmlzZShuID0gbigpLHN1bV9vZl9wMSA9IHN1bShwMSksLmdyb3VwcyA9ICdkcm9wJykNCnN0cihkcTQpDQpgYGANCioqS+G6v3QgcXXhuqMqKg0KLSBD4buZdCAnbmFtZScgOiBjaOG7qWEgdMOqbiBjw6FjIHF14buRYyBnaWEgYuG6r3QgxJHhuqd1IGLhurFuZyBjaOG7ryBDIHRyb25nIGThu68gbGnhu4d1DQoNCi0gQ+G7mXQgJ3knIDogY2jhu6lhIG7Eg20NCg0KLSBD4buZdCAnbicgOiBjaOG7qWEgc+G7kSBsxrDhu6NuZyBj4bunYSBj4bq3cCBnacOhIHRy4buLICduYW1lJyB2w6AgJ3knDQoNCi0gQ+G7mXQgJ3N1bV9vZl9wMScgOiBDaOG7qWEgdOG7lW5nIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQg4oCccDHigJ0gY2hvIG3hu5dpIGPhurdwIGdpw6EgdHLhu4sg4oCcbmFtZeKAnSB2w6Ag4oCceeKAnQ0KDQojIE5oaeG7h20gduG7pSAzLjINCiMjIDIuMSBHaeG7m2kgdGhp4buHdQ0KDQpUaeG6v24gaMOgbmggdGhhbyB0w6FjIG3hu5l0IHPhu5EgbOG7h25oIGPGoSBi4bqjbiB0csOqbiBkYXRhc2V0cyAiVU5kYXRhX0V4cG9ydF8yMDI0MDEyNl8xMjI4MzIwNTEueGxzeCINCg0KIyMgMi4yIE3DtCB04bqjIGRhdGFzZXRzDQotIEzDoCBt4buZdCBkYXRhIGZyYW1lDQoNCi0gQ8OzIDUgY+G7mXQgdMawxqFuZyDhu6luZyB24bubaSA1IGdpw6EgdHLhu4sNCg0KLSBDw7MgMjg1IGjDoG5nIHTGsMahbmcg4bupbmcgduG7m2kgMjg1IHF1YW4gc8OhdA0KDQotIEPDsyAyODYgw7QgdHLhu5FuZw0KDQotIEvDvSBoaeG7h3UgY8OhYyBj4buZdDoNCiAgLSAiQ291bnRyeS5vci5BcmVhIjogIlF14buRYyBnaWEuaG/hurdjLktodSB24buxYyINCiAgLSAiWWVhciI6ICJOxINtIiAgICAgICAgICAgIA0KICAtICJVbml0IiAixJDGoW4gduG7iyIgICAgICAgICAgICANCiAgLSAiVmFsdWUiOiAiR2nDoSB0cuG7iyIgICAgICAgICAgDQogIC0gIlZhbHVlLkZvb3Rub3RlcyI6ICJDaMO6IHRow61jaCBnacOhIHRy4buLIg0KDQpgYGB7cn0gDQpsaWJyYXJ5KHhsc3gpDQpjaHRyIDwtIHJlYWQueGxzeChmaWxlLmNob29zZSgpLCBzaGVldEluZGV4ID0gMSwgaGVhZGVyID0gVCkgDQpgYGANCsSR4buNYyBk4buvIGxp4buHdSB04burIGV4Y2VsIHbDoCBnw6FuIHbDoG8gb2JqZWN0IGNodHINCg0KYGBge3J9IA0KaXMuZGF0YS5mcmFtZShjaHRyKQ0KYGBgDQpLaeG7g20gdHJhIHhlbSAiY2h0ciIgY8OzIHBo4bqjaSBsw6AgZGF0YSBmcmFtZSBoYXkga2jDtG5nLCBu4bq/dSDEkcO6bmcgdGjDrCBUUlVFIHbDoCBuZ8aw4bujYyBs4bqhaQ0KDQpgYGB7ciwgZWNobz1UUlVFIH0NCmxlbmd0aChjaHRyKQ0KYGBgDQpjaG8gcmEga+G6v3QgcXXhuqMgxJHhu5kgZMOgaSwg4bufIMSRw6J5IGzDoCBz4buRIGPhu5l0IGPhu6dhICJjaHRyIiA6IDUgY+G7mXQNCg0KYGBge3IsIGVjaG89VFJVRSB9DQpuYW1lcyhjaHRyKSANCmBgYA0KY2hvIHJhIHTDqm4gY8OhYyBj4buZdCBj4bunYSAiY2h0ciINCg0KYGBge3IsIGVjaG89VFJVRSB9DQpkaW0oY2h0cikgDQpgYGANCg0KZGF0YSBuw6B5IGPDsyAyODUgaMOgbmcgdsOgIDUgY+G7mXQNCg0KYGBge3IsIGVjaG89VFJVRSB9DQpzdW0oaXMubmEoY2h0cikpICANCmBgYA0KdOG7lW5nIHPhu5Egw7QgdHLhu5FuZyBj4bunYSBvYmplY3QgImNodHIiDQoNCkvhur90IHF14bqjIHRy4bqjIHbhu4EgdMawxqFuZyDhu6luZyB24bubaSBjaHRyIGPDsyAyODYgw7QgdHLhu5FuZyoNCg0KIyMgMi4zIFRo4buRbmcga8OqIGThu68gbGnhu4d1DQoNClRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogbcO0IHThuqMgZGF0YXNldHMgbsOgeSB0YSDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdSwgw70gbmdoxKlhIGPDoWMgY+G7mXQ6DQoNCi0gbl9taXNzaW5nOiBz4buRIMO0IGTGsCBsaeG7h3UgdHLhu5FuZw0KDQotIGNvbXBsZXRlX3JhdGU6IHThu7cgbOG7hyDDtCBjw7MgZOG7ryBsaeG7h3UNCg0KLSBtZWFuOiB0cnVuZyBiw6xuaA0KDQotIHNkOiDEkeG7mSBs4buHY2ggY2h14bqpbg0KDQotIHAwOiBnacOhIHRy4buLIG5o4buPIG5o4bqldA0KDQotIHAyNTogUGjDom4gduG7iyB0aOG7qSBuaOG6pXQNCg0KLSBwNTA6IFBow6JuIHbhu4sgdGjhu6kgaGFpIGPFqW5nIGNow61uaCBsw6AgdHJ1bmcgduG7iw0KDQotIHA3NTogcGjDom4gduG7iyB0aOG7qSBiYQ0KDQotIHAxMDA6IGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0DQoNCi0gaGlzdDogYmnhu4N1IMSR4buTIEhpc3RvZ3JhbQ0KDQoqKljDoWMgxJHhu4tuaCB0aMO0bmcgdGluIGPGoSBi4bqjbiB0cm9uZyBjaHRyKioNCg0KYGBge3J9DQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShjaHRyKQ0KYGBgDQoNCiMjIDIuNCDEkOG7lWkgdMOqbiBjw6FjIGPhu5l0IMSR4buDIHRoYW8gdMOhYw0KDQpDw6FjIGvDvSBoaeG7h3UgdMOqbiB0xrDGoW5nIOG7qW5nIHRoZW8gdGjhu6kgdOG7sSBs4bqnbiBsxrDhu6N0IHThu6sgY+G7mXQgMSDEkeG6v24gY+G7mXQgNQ0KDQotICJDb3VudHJ5Lm9yLkFyZWEiOiBuYW1lMg0KICAtICJZZWFyIjogInkyIiAgICAgICAgICAgIA0KICAtICJVbml0IiAidW4iICAgICAgICAgICAgDQogIC0gIlZhbHVlIjogInZsIiAgICAgICAgICANCiAgLSAiVmFsdWUuRm9vdG5vdGVzIjogIlZub3RlIg0KYGBge3J9DQpuYW1lcyhjaHRyKT0gYygnbmFtZTInLCd5MicsJ3VuJywnVmwnLCdWbm90ZScpDQpuYW1lcyhjaHRyKQ0KYGBgDQojIyAyLjUgUsO6dCB0csOtY2ggZOG7ryBsaeG7h3UNCg0KQ2jhu41uIHJhIDMgY+G7mXQgdMawxqFuZyDhu6luZyBsw6AgIm5hbWUyIiwieTIiLCJWbCIgdsOgIGNo4buNbiBuaOG7r25nIGjDoG5nIGLhuq90IMSR4bqndSBi4bqxbmcgY2jhu68gQyBnw6FuIHbDoG8gb2JqZWN0IGNodHIxLiANCg0KYGBgIHtyLGVjaG89VFJVRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpjaHRyMSA8LSBzZWxlY3QoY2h0cixuYW1lMix5MixWbCkgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KG5hbWUyLCAiXkMiKSkNCnN0cihjaHRyMSkNCmBgYA0KDQojIyAyLjYgTcOjIGjDs2EgZOG7ryBsaeG7h3UNCg0KLSBO4bq/dSBnacOhIHRy4buLIHRyb25nIGPhu5l0IOKAnFZs4oCdIG5o4buPIGjGoW4gNTAsMDAwLCB0aMOsIGdpw6EgdHLhu4sgdMawxqFuZyDhu6luZyB0cm9uZyBj4buZdCDigJxHaWF0cmnigJ0gc+G6vSBsw6Ag4oCYw4104oCZLg0KDQotIE7hur91IGdpw6EgdHLhu4sgdHJvbmcgY+G7mXQg4oCcVmzigJ0gbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyA1MCwwMDAgxJHhur9uIDEwMCwwMDAsIHRow6wgZ2nDoSB0cuG7iyB0xrDGoW5nIOG7qW5nIHRyb25nIGPhu5l0IOKAnEdpYXRyaeKAnSBz4bq9IGzDoCDigJhUcnVuZyBCw6xuaOKAmS4NCg0KTuG6v3UgZ2nDoSB0cuG7iyB0cm9uZyBj4buZdCDigJxWbOKAnSBs4bubbiBoxqFuIDEwMCwwMDAsIHRow6wgZ2nDoSB0cuG7iyB0xrDGoW5nIOG7qW5nIHRyb25nIGPhu5l0IOKAnEdpYXRyaeKAnSBz4bq9IGzDoCDigJhOaGnhu4F14oCZLg0KDQpgYGB7cixlY2hvPVRSVUV9DQpjaHRyMSRWbC5HaWF0cmkgPC0gY2FzZV93aGVuKGNodHIxJFZsIDwgNTAuMDAwIH4gJ0l0JywgY2h0cjEkVmwgPj0gNTAuMDAwICYgY2h0cjEkVmwgPD0gMTAwLjAwMCB+ICdUcnVuZyBCaW5oJywgY2h0cjEkVmwgPiAxMDAuMDAwIH4gJ05oaWV1JykNCnN0cihjaHRyMSkNCmBgYA0KDQpM4buHbmggbsOgeSBDaGlhIHBo4bqhbSB2aSBnacOhIHRy4buLIGPhu6dhIGPhu5l0IOKAnFZs4oCdIHRow6BuaCAzIGtob+G6o25nIHbDoCBnw6FuIHTDqm4gY2hvIG3hu5dpIGtob+G6o25nIGzDoCDigJhHaWF0cmkx4oCZLCDigJhHaWF0cmky4oCZLCB2w6Ag4oCYR2lhdHJpM+KAmS4gQ8OhYyBnacOhIHRy4buLIGPhu6dhIGPhu5l0IOKAnFZs4oCdIHPhur0gxJHGsOG7o2MgZ8OhbiB2w6BvIGPDoWMga2hv4bqjbmcgdMawxqFuZyDhu6luZy4NCg0KYGBge3J9DQpjaHRyMSRWbC5jdXQgPC0gY3V0KGNodHIxJFZsLCAzLCBsYWJlbHMgPSBjKCdHaWF0cmkxJywgJ0dpYXRyaTInLCAnR2lhdHJpMycpKQ0Kc3RyKGNodHIxKSANCmBgYA0KDQoNCiMjIDIuNyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kQ0KDQpC4bqjbmcgdOG6p24gc+G7kSBoaeG7g24gdGjhu4sgc+G7kSBsxrDhu6NuZyBxdWFuIHPDoXQgY2hvIG3hu5l0IGPhu5l0IGdpw6EgdHLhu4sgJ1ZsLmN1dCcgY2hvIHThu6tuZyBxdeG7kWMgZ2lhIHRyb25nICduYW1lMicuIA0KDQpgYGB7ciwgZWNobz1UUlVFfQ0KdGFibGUoY2h0cjEkbmFtZTIsY2h0cjEkVmwuY3V0KQ0KYGBgDQojIyAyLjggUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdGhlbyBxdeG7kWMgZ2lhLCDEkcahbiB24buLIHbDoCBnacOhIHRy4buLDQoNCioqVMOtbmggdHJ1bmcgYsOsbmgsIHBoxrDGoW5nIHNhaSwgbWluLCBtYXggY+G7p2EgY+G7mXQgJ1ZsJyoqDQpgYGB7ciwgZWNobyA9VFJVRX0NCnN1bW1hcnkoY2h0ciRWbCkNCmBgYA0KDQoqKkvhur90IHF14bqjKioNCi0gTWluLjogR2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQgdHJvbmcgZOG7ryBsaeG7h3UuIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCBnacOhIHRy4buLIG5o4buPIG5o4bqldCBj4bunYSBj4buZdCB2IGzDoCAwLjAuDQoNCi0gMXN0IFF1LjogUGjhuqduIHbhu4sgcGjDom4gduG7iyB0aOG7qSBuaOG6pXQgLiBLaG/huqNuZyAyNSUgZ2nDoSB0cuG7iyB0cm9uZyBk4buvIGxp4buHdSBuaOG7jyBoxqFuIGhv4bq3YyBi4bqxbmcgZ2nDoSB0cuG7iyBuw6B5LiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgZ2nDoSB0cuG7iyAxc3QgUXUuIGzDoCAzMi41IC4NCg0KLSBNZWRpYW46IEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggLiBLaG/huqNuZyA1MCUgZ2nDoSB0cuG7iyB0cm9uZyBk4buvIGxp4buHdSBuaOG7jyBoxqFuIGhv4bq3YyBi4bqxbmcgZ2nDoSB0cuG7iyBuw6B5LiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgZ2nDoSB0cuG7iyBNZWRpYW4gbMOgIDIyMy4zIC4NCg0KLSBNZWFuOiBHacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGThu68gbGnhu4d1LiBUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwgZ2nDoSB0cuG7iyBNZWFuIGzDoCAyNDQzLjkuDQoNCi0gM3JkIFF1LjogUGjhuqduIHbhu4sgcGjDom4gduG7iyB0aOG7qSBiYSAuIEtob+G6o25nIDc1JSBnacOhIHRy4buLIHRyb25nIGThu68gbGnhu4d1IG5o4buPIGjGoW4gaG/hurdjIGLhurFuZyBnacOhIHRy4buLIG7DoHkuIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCBnacOhIHRy4buLIDNyZCBRdS4gbMOgIDE0MDEuNC4NCg0KLSBNYXguOiBHacOhIHRy4buLIGzhu5tuIG5o4bqldCB0cm9uZyBk4buvIGxp4buHdS4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0IGPhu6dhIGPhu5l0IFZsIGzDoCAxMDczMjkuNi4NCg0KLSBOQSdzOiBHw61hIHRy4buLIHRy4buRbmcgY8OzIDMNCg0KKipQaMOibiB0w61jaCBkw6JuIHPhu5EgdHJ1bmcgYsOsbmggdGhlbyBuaMOzbSBxdeG7kWMgZ2lhKioNCg0KLSBncm91cF9ieSh5Mik6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gY+G7mXQg4oCceTLigJ0uDQogIE5naMSpYSBsw6AgY8OhYyBwaMOpcCB04buVbmcgaOG7o3AgdGnhur9wIHRoZW8gc+G6vSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGNobyB04burbmcgbmjDs20g4oCceTLigJ0gcmnDqm5nIGJp4buHdC4NCg0KLSBzdW1tYXJpc2UobWVhbl9vZl9wb3B1bGF0aW9uID0gbWVhbihWbCkpOiBUw61uaCB0cnVuZyBiw6xuaCBj4bunYSBj4buZdCDigJxWbOKAnSBjaG8gbeG7l2kgbmjDs20g4oCcbmFtZTLigJ0gdsOgIHThuqFvIHJhIG3hu5l0IGPhu5l0IG3hu5tpIGPDsyB0w6puIOKAnG1lYW5fb2ZfcG9wdWxhdGlvbuKAnSDEkeG7gyBsxrB1IHRy4buvIGvhur90IHF14bqjLg0KDQpgYGB7ciwgZWNobz1UUlVFfQ0KY2h0cjIgPC0gY2h0cjEgJT4lIGdyb3VwX2J5KG5hbWUyKSAlPiUgc3VtbWFyaXNlKG1lYW5fb2ZfcG9wdWxhdGlvbiA9IG1lYW4oVmwpKQ0Kc3RyKGNodHIyKQ0KYGBgDQoqKkvhur90IHF14bqjKioNCi0gQ+G7mXQgJ25hbWUyJzogY2jhu6lhIHTDqm4gMyBxdeG7kWMgZ2lhIGzDoDogIkNoaWxlIiAiQ2hpbmEsIEhvbmcgS29uZyBTcGVjaWFsIEFkbWluaXN0cmF0aXZlIFJlZ2lvbiIgIkN5cHJ1cyINCg0KLSBD4buZdCBtZWFuX29mX3BvcHVsYXRpb246IENo4bupYSAzIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgJ1ZsJyBjaG8gdOG7q25nIG7Eg20gbMOgOiAgNDE2LjQgMzcuNiAxMy40DQoNCg==