2. Biểu diễn bộ dữ liệu bằng đồ thị (Dạng barchart):
Biểu đồ 1:
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
bd1 <- diamonds
bd1 %>% ggplot(aes(x = cut)) +
geom_bar(fill='pink') +
labs(x = 'Loại', y = 'Số lượng', title = "Biểu đồ cột thể hiện số lượng viên kim cương theo loại")

Về mặt kỹ thuật:
- ggplot: Hàm tạo biểu đồ ggplot2.
- aes(x = cut): Ánh xạ biến cut (loại) vào trục x của biểu đồ.
- geom_bar: Hàm vẽ biểu đồ hình thanh.
- fill=‘pink’: Tùy chỉnh màu sắc của các thanh bằng màu hồng.
- Hàm thêm nhãn cho các thành phần của biểu đồ.
- x = ‘Loại’: Nhãn cho trục x là “Loại”.
- y = ‘Số lượng’: Nhãn cho trục y là “Số lượng”.
- title = “Biểu đồ cột thể hiện số lượng viên kim cương theo loại”:
Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng viên kim cương
theo loại”.
Nhận xét: Nhìn vào số liệu về số lượng viên kim cương theo từng
loại, ta có thể nhận thấy sự chênh lệch đáng kể giữa các loại. Loại kim
cương Ideal nổi bật với số lượng cao nhất, lên đến hơn 20.000 viên,
trong khi loại Fair lại có ít hơn 5.000 viên. Điều này thể hiện rõ sự
phân biệt về chất lượng và giá trị giữa các loại kim cương.
Biểu đồ 2:
bd2 <- diamonds
bd2 %>% ggplot(aes(x = clarity)) +
geom_bar(fill='blue') +
labs(x = 'Độ tinh khiết', y = 'Số lượng', title = "Biểu đồ cột thể hiện số lượng viên kim cương theo độ tinh khiết") +
coord_flip()

Về mặt kỹ thuật:
- ggplot: Hàm tạo biểu đồ ggplot2. aes(x = clarity): Ánh xạ biến
clarity (độ tinh khiết) vào trục x của biểu đồ.
- geom_bar: Hàm vẽ biểu đồ hình thanh.
- fill=‘blue’: Tùy chỉnh màu sắc của các thanh bằng màu xanh lam.
- labs: Hàm thêm nhãn cho các thành phần của biểu đồ.
- x = ‘Độ tinh khiết’: Nhãn cho trục x là “Độ tinh khiết”.
- y = ‘Số lượng’: Nhãn cho trục y là “Số lượng”.
- coord_flip(): Câu lệnh này đảo ngược trục x và y của biểu đồ.
- title = “Biểu đồ cột thể hiện số lượng viên kim cương theo độ tinh
khiết”: Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng viên kim
cương theo độ tinh khiết”.
Nhận xét: Biểu đồ thể hiện số lượng viên kim cương theo độ tinh
khiết. Biểu đồ dạng hình thanh với 5 mức độ tinh khiết được sắp xếp theo
thứ tự từ dưới lên trên: I1, I2, SI1, SI2, VS2. Trong đó mức độ I1 có số
lượng viên cao nhất, mức độ VS2 có số lượng viên thấp nhất, độ chênh
lệch về số lượng viên kim cương giữa các mức độ tinh khiết là khá
lớn.
Biểu đồ 3:
bd3 <- diamonds
bd3 %>% ggplot(aes(x = color)) +
geom_bar(fill='red') +
labs(x = 'Màu', y = 'Số lượng',title = "Biểu đồ cột thể hiện số lượng viên kim cương theo màu")

Về mặt kỹ thuật:
- ggplot: Hàm tạo biểu đồ ggplot2. aes(x = color): Ánh xạ biến color
(màu) vào trục x của biểu đồ.
- geom_bar: Hàm vẽ biểu đồ hình thanh.
- fill=‘blue’: Tùy chỉnh màu sắc của các thanh bằng màu xanh lam.
- labs: Hàm thêm nhãn cho các thành phần của biểu đồ.
- x = ‘Màu’: Nhãn cho trục x là “Màu”.
- y = ‘Số lượng’: Nhãn cho trục y là “Số lượng”.
- title = “Biểu đồ cột thể hiện số lượng viên kim cương theo màu”:
Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng viên kim cương
theo màu”.
Nhận xét: Nhìn vào số liệu về số lượng viên kim cương theo từng
màu, ta có thể nhận thấy sự chênh lệch đáng kể giữa các loại. Loại kim
cương có màu G nổi bật với số lượng cao nhất, trong khi loại có màu J
lại có số lượng ít nhất.
Biểu đồ 4:
bd4 <- diamonds
bd4 %>% group_by(cut) %>% summarise(med = median(carat)) %>%
ggplot(aes(cut,med)) +
geom_col(fill='purple') +
geom_text(aes(label = med),vjust = 2, color = 'black') +
labs(x = 'Loại', y = 'Trung vị',title = " Biểu đồ cột thể hiện trung vị carat theo loại kim cương")

- Về mặt kỹ thuật:
- group_by(cut): Nhóm dữ liệu theo biến cut (loại kim cương).
- summarise(med = median(carat)): Tính toán trung vị (median) của biến
carat cho mỗi nhóm và lưu kết quả vào biến mới med (trung vị).
- aes(cut,med): Ánh xạ biến cut (loại) vào trục x và biến med (trung
vị) vào trục y của biểu đồ.
- aes(label = med): Gán giá trị của biến med (trung vị) vào nhãn của
văn bản.
- vjust = 2: Điều chỉnh vị trí của văn bản theo trục y, dịch lên 2 đơn
vị để tránh chồng lên các cột.
- color = ‘black’ : Thiết lập màu sắc của văn bản là đen.
- labs(x = ‘Loại’): Nhãn cho trục x là “Loại”.
- labs(y = ‘Trung vị’): Nhãn cho trục y là “Trung vị”.
- title = “Biểu đồ cột thể hiện trung vị carat theo loại kim cương”:
Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng trung vị carat
theo loại kim cương”.
- Nhận xét: Qua biểu đồ ta có thể thấy được trung vị của kim cương
loại Fair là cao nhất (1), loại Ideal là thấp nhất(1). Từ đó cho thấy
loại kim cương Fair có xu hướng có trọng lượng lớn hơn so với các loại
khác, trong khi loại kim cương Ideal lại có trọng lượng thấp hơn, có thể
do những viên kim cương này được chế tác để có kích thước nhỏ và trọng
lượng nhẹ hơn, nhằm tối ưu hóa sự lấp lánh và chất lượng của chúng.
Biểu đồ 5:
bd5 <- diamonds
bd5 %>% group_by(cut) %>% summarise(me = mean(carat)) %>%
ggplot(aes(cut,me)) +
geom_col(fill='blue') +
geom_text(aes(label = round(me,2)),vjust = 2, color = 'white') +
labs(x = 'Loại', y = 'Trung bình', title = "Biểu đồ cột thể hiện trung bình carat theo loại kim cương")

- về mặt kỹ thuật:
- group_by(cut): Nhóm dữ liệu theo biến cut (loại kim cương).
- summarise(me = mean(carat)): Tính toán trung bình (mean) của biến
carat cho mỗi nhóm và lưu kết quả vào biến mới me (trung bình).
- aes(cut,me): Ánh xạ biến cut (loại) vào trục x và biến med (trung
vị) vào trục y của biểu đồ.
- aes(label = me): Gán giá trị của biến med (trung vị) vào nhãn của
văn bản.
- vjust = 2: Điều chỉnh vị trí của văn bản theo trục y, dịch lên 2 đơn
vị để tránh chồng lên các cột.
- color = ‘white’ : Thiết lập màu sắc của văn bản là đen.
- labs(x = ‘Loại’): Nhãn cho trục x là “Loại”.
- labs(y = ‘Trung bình’): Nhãn cho trục y là “Trung bình”.
- title = “Biểu đồ cột thể hiện trung bình carat theo loại kim cương”:
Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng trung bình carat
theo loại kim cương”.
- Nhận xét: Kim cương loại Fair có carat trung bình cao nhất đạt 1.05
carat, trong khi kim cương loại Ideal lại có carat trung bình thấp nhất
chỉ là 0.7 carat. Các loại kim cương Good, Very Good và Premium có mức
carat trung bình lần lượt là 0.85 carat, 0.81 carat và 0.89 carat. Nhìn
chung, carat trung bình có xu hướng giảm khi chất lượng cắt cao hơn.
Biểu đồ đã cung cấp được cho ta một cái nhìn tổng quan về mối liên hệ
giữa chất lượng cắt và carat trung bình của kim cương.
Biểu đồ 6:
bd6 <- diamonds
bd6 %>% group_by(cut) %>% summarise(v = var(carat)) %>%
ggplot(aes(cut,v)) +
geom_col(fill='red') +
geom_text(aes(label = round(v,2)),vjust = 2, color = 'white') +
labs(x = 'Loại', y = 'Phương sai',title = "Biểu đồ cột thể hiện phương sai carat theo loại kim cương")

- Về mặt kỹ thuật:
- group_by(cut): Nhóm dữ liệu theo biến cut (loại kim cương).
- summarise(v = var(carat)): Tính toán độ đa dạng (var) của biến carat
cho mỗi nhóm và lưu kết quả vào biến mới v (độ đa dạng).
- aes(cut,v): Ánh xạ biến cut (loại) vào trục x và biến v (Độ đa dạng)
vào trục y của biểu đồ.
- aes(label = v): Gán giá trị của biến med (trung vị) vào nhãn của văn
bản.
- vjust = 2: Điều chỉnh vị trí của văn bản theo trục y, dịch lên 2 đơn
vị để tránh chồng lên các cột.
- color = ‘white’ : Thiết lập màu sắc của văn bản là đen.
- labs(x = ‘Loại’): Nhãn cho trục x là “Loại”.
- labs(y = ‘Độ đa dạng’): Nhãn cho trục y là “Trung bình”.
- title = “Biểu đồ cột thể hiện độ đa dạng carat theo loại kim cương”:
Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng độ đa dạng carat
theo loại kim cương”.
- Nhận xét: Biểu đồ cho thấy loại có phương sai cao nhất là ở loại kim
cương Fair và Premium (0.27). Sau đó là Good và Very Good (0.21). Và xếp
cuối cùng với Ideal có độ biến động carat thấp nhất (0.19). Ngoài ra sự
chênh lệch giữa các phương sai là không đáng kể. Bên cạnh đó biểu đồ còn
cho thấy sự tăng giảm không đồng đều về phương sai của các loại.
Biểu đồ 7:
bd7 <- diamonds
bd7 %>% group_by(cut) %>% summarise(med = median(price)) %>%
ggplot(aes(cut,med)) +
geom_col(fill='purple') +
geom_text(aes(label = med),vjust = 2, color = 'black') +
labs(x = 'Loại', y = 'Trung vị', title = "Biểu đồ cột thể hiện trung vị giá theo loại kim cương")

- Về mặt kỹ thuật:
- group_by(cut): Nhóm dữ liệu theo biến cut (loại kim cương).
- summarise(med = median(price)): Tính toán trung vị (median) của biến
price cho mỗi nhóm và lưu kết quả vào biến mới med (trung bình).
- aes(cut,med): Ánh xạ biến cut (loại) vào trục x và biến med (trung
vị) vào trục y của biểu đồ.
- aes(label = med): Gán giá trị của biến med (trung vị) vào nhãn của
văn bản.
- vjust = 2: Điều chỉnh vị trí của văn bản theo trục y, dịch lên 2 đơn
vị để tránh chồng lên các cột.
- color = ‘black’ : Thiết lập màu sắc của văn bản là đen.
- labs(x = ‘Loại’): Nhãn cho trục x là “Loại”.
- labs(y = ‘Trung bình’): Nhãn cho trục y là “Trung bình”.
- title = “Biểu đồ cột thể hiện trung bình carat theo loại kim cương”:
Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng trung bình carat
theo loại kim cương”.
- Nhận xét: Trung vị là giá trị mà 50% số kim cương có giá cao hơn và
50% số kim cương có giá thấp hơn. Trong biểu đồ, trung vị được thể hiện
bằng đường kẻ ngang màu đen trên mỗi cột. Ví dụ, trung vị của loại
“Good” là 3050.5, nghĩa là 50% số kim cương loại “Good” có giá cao hơn
3050.5 và 50% có giá thấp hơn.Trung vị giá của kim cương giảm dần từ
loại “Fair” đến “Ideal”. Khoảng cách giá giữa các loại kim cương không
đều nhau.Khoảng cách lớn nhất là giữa “Good” và “Ideal” (1472).Khoảng
cách nhỏ nhất là giữa “Premium” và “Fair” (97). Biểu đồ có thể giúp
người mua so sánh giá cả giữa các loại kim cương khác nhau.
Biểu đồ 8:
bd8 <- diamonds
bd8 %>% group_by(cut) %>% summarise(m = mean(price)) %>%
ggplot(aes(cut,m)) +
geom_col(fill='brown') +
geom_text(aes(label = round(m,2)),vjust = 2, color = 'pink') +
labs(x = 'Loại', y = 'Trung bình', title = "Biểu đồ cột thể hiện trung bình giá theo loại kim cương")

- Về mặt kỹ thuật:
- group_by(cut): Nhóm dữ liệu theo biến cut (loại kim cương).
- summarise(m = mean(price)): Tính toán trung bình (mean) của biến
price cho mỗi nhóm và lưu kết quả vào biến mới m (trung bình).
- aes(cut,m): Ánh xạ biến cut (loại) vào trục x và biến med (trung vị)
vào trục y của biểu đồ.
- aes(label = m): Gán giá trị của biến med (trung vị) vào nhãn của văn
bản.
- vjust = 2: Điều chỉnh vị trí của văn bản theo trục y, dịch lên 2 đơn
vị để tránh chồng lên các cột.
- color = ‘pink’ : Thiết lập màu sắc của văn bản là hồng.
- labs(x = ‘Loại’): Nhãn cho trục x là “Loại”.
- labs(y = ‘Trung bình’): Nhãn cho trục y là “Trung bình”.
- round(m,2): làm tròn giá trị của biến mới đến 2 chữ số thập
phân
- title = “Biểu đồ cột thể hiện trung bình giá theo loại kim cương”:
Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng trung bình giá
theo loại kim cương”.
- Nhận xét: Biểu đồ thể hiện giá trung bình của kim cương theo 5 loại
cắt: Fair, Good, Very Good, Premium và Ideal. Trong đó thấp nhất là
Ideal (3457.54 USD) đến cao nhất là Premium (4584.26 USD). Mức chênh
lệch giá trung bình giữa các loại cắt là đáng kể: Fair và Good: 429.9
USD Good và Very Good: 52.9 USD Very Good và Premium: 602.5 USD Premium
và Ideal: 1126.72 USD Biểu đồ này giúp người mua kim cương có thể so
sánh giá cả giữa các loại cắt khác nhau để đưa ra lựa chọn phù hợp nhất
với nhu cầu và ngân sách của mình. Biểu đồ cũng cho thấy tiềm năng đầu
tư vào kim cương. Kim cương có chất lượng cắt tốt có thể giữ giá tốt hơn
và có khả năng tăng giá trị theo thời gian.
Biểu đồ 9:
bd9 <- diamonds
bd9 %>% group_by(cut) %>% summarise(v = var(price)) %>%
ggplot(aes(cut,v)) +
geom_col(fill='red') +
geom_text(aes(label = round(v,2)),vjust = 2, color = 'white') +
labs(x = 'Loại', y = 'Phương sai', title = "Biểu đồ cột thể hiện phương sai về giá theo loại kim cương")

- Về mặt kỹ thuật:
- group_by(cut): Nhóm dữ liệu theo biến cut (loại kim cương).
- summarise(v = var(price)): Tính toán độ đa dạng (var) của biến price
cho mỗi nhóm và lưu kết quả vào biến mới v (độ đa dạng).
- aes(cut,v): Ánh xạ biến cut (loại) vào trục x và biến v (Độ đa dạng)
vào trục y của biểu đồ.
- aes(label = v): Gán giá trị của biến med (trung vị) vào nhãn của văn
bản.
- vjust = 2: Điều chỉnh vị trí của văn bản theo trục y, dịch lên 2 đơn
vị để tránh chồng lên các cột.
- color = ‘white’ : Thiết lập màu sắc của văn bản là trắng.
- labs(x = ‘Loại’): Nhãn cho trục x là “Loại”.
- labs(y = ‘Độ đa dạng’): Nhãn cho trục y là “Trung bình”.
- round(v,2): làm tròn giá trị của biến mới đến 2 chữ số thập
phân
- title = “Biểu đồ cột thể hiện độ đa dạng carat theo loại kim cương”:
Tiêu đề cho biểu đồ là “Biểu đồ cột thể hiện số lượng độ đa dạng carat
theo loại kim cương”.
- Nhận xét: Biểu đồ cột thể hiện mức độ đa dạng về giá của kim cương
theo 5 loại: Fair, Good, Very Good, Premium và Ideal. Mức độ đa dạng về
giá tăng dần từ loại Fair đến Ideal. Loại Fair có mức độ đa dạng về giá
thấp nhất. Loại Premium có mức độ đa dạng về giá cao nhất. Ngoài ra biểu
đồ cũng cho thấy mối tương quan giữa loại kim cương và giá cả.
Biểu đồ 10:
bd10 <- diamonds
bd10 %>% group_by(clarity) %>% summarise(med = median(carat)) %>%
ggplot(aes(clarity,med)) +
geom_col(fill='purple') +
geom_text(aes(label = med),vjust = 2, color = 'black') +
labs(x = 'Độ tinh khiết', y = 'Trung vị',title = "Biểu đồ cột thể hiện trung vị carat theo độ tinh khiết của kim cương")

Biểu đồ 11:
bd11 <- diamonds
bd11 %>% group_by(clarity) %>% summarise(m = mean(carat)) %>%
ggplot(aes(clarity,m)) +
geom_col(fill='red') +
geom_text(aes(label = round(m,2)),vjust = 2, color = 'white') +
labs(x = 'Độ tinh khiết', y = 'Phương sai', title = "Biểu đồ cột thể hiện phương sai carat theo độ tinh khiết của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành clarity
Nhận xét: Ta có thể thấy phương sai của kim cương tỉ lệ nghịch
với độ tinh khiết của chúng. Tức là độ biến động về carat càng giảm khi
viên kim cương càng có độ tinh khiết cao. Cụ thể, loại VVS1 có phương
sai thấp nhất (0.5) và loại I1 có phương cao nhất (1.28). Bên cạnh đó,
độ chênh lệch giữa các phương sai là không đáng kể.
Biểu đồ 12:
bd12 <- diamonds
bd12 %>% group_by(clarity) %>% summarise(v = var(carat)) %>%
ggplot(aes(clarity,v)) +
geom_col(fill='red') +
geom_text(aes(label = round(v,2)),vjust = 2, color = 'white') +
labs(x = 'Độ tinh khiết', y = 'Phương sai', title = "Biểu đồ cột thể hiện phương sai carat theo độ tinh khiết của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành clarity
Nhận xét: Biểu đồ thể hiện sự đa dạng của kích thước kim cương
(carat) theo các cấp độ tinh khiết (IF, VVS1, VVS2, VS1, VS2, SI1, SI2,
I1). Dữ liệu cho thấy: IF và VVS1 có độ đa dạng carat thấp nhất. I1 (có
nhiều tạp chất nhất) có độ đa dạng carat cao nhất. Các cấp độ tinh khiết
khác có độ đa dạng carat nằm giữa hai mức trên.
Biểu đồ 13:
bd13 <- diamonds
bd13 %>% group_by(clarity) %>% summarise(med = median(price)) %>%
ggplot(aes(clarity,med)) +
geom_col(fill='purple') +
geom_text(aes(label = med),vjust = 2, color = 'black') +
labs(x = 'Độ tinh khiết', y = 'Trung vị', title = "Biểu đồ cột thể hiện trung vị giá theo độ tinh khiết của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành clarity
Nhận xét: Biểu đồ thể hiện trung vị giá của kim cương theo cấp độ
độ tinh khiết, từ thấp (I1) đến cao (IF). Giá trị trung vị giảm dần từ
SI2 đến IF, cho thấy kim cương có độ tinh khiết cao có giá trị cao hơn.
Mức giảm giá trị trung vị giữa các cấp độ không đồng đều: Tăng mạnh từ
I1 đến SI2. Giảm nhẹ từ SI1 đến VS2. Giảm dần từ VS1 đến IF.
Biểu đồ 14:
bd14 <- diamonds
bd14 %>% group_by(clarity) %>% summarise(m = mean(price)) %>%
ggplot(aes(clarity,m)) +
geom_col(fill='purple') +
geom_text(aes(label = round(m,0)),vjust = 2, color = 'black') +
labs(x = 'Độ tinh khiết', y = 'Trung bình',title = "Biểu đồ cột thể hiện trung bình giá theo độ tinh khiết của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành clarity
Nhận xét: Biểu đồ cho thấy mối liên hệ tỉ lệ nghịch giữa độ tinh
khiết và giá trung bình của kim cương. Giá trung bình giảm dần từ SI2
đến IF: VS2 và SI1 có giá gần như tương đương. VVS1 và VVS2 có giá gần
nhau, cao hơn VS1 và VS2. SI2 có trung bình giá cao nhất, thấp nhất là
VVS1. Sự chênh lệch giá giữa các cấp độ tinh khiết giảm dần khi độ tinh
khiết tăng
Biểu đồ 15:
bd15 <- diamonds
bd15 %>% group_by(clarity) %>% summarise(v = var(price)) %>%
ggplot(aes(clarity,v)) +
geom_col(fill='red') +
geom_text(aes(label = round(v,0)),vjust = 2, color = 'white') +
labs(x = 'Độ tinh khiết', y = 'Phương sai', title = "Biểu đồ cột thể hiện phương sai về giá theo độ tinh khiết của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành clarity
Nhận xét: Biểu đồ thể hiện số lượng kim cương ở mỗi cấp độ tinh
khiết, được chia thành 7 cấp:IF, VVS1, VVS2, VS1, VS2, SI1, SI2, I1. Có
sự khác biệt rõ ràng về độ đa dạng về giá giữa các cấp độ tinh khiết.
Nhìn chung, cấp độ tinh khiết càng cao, số lượng kim cương càng ít và
giá cũng khá đa dạng. Cụ thể: IF (Internally Flawless) có độ đa dạng về
giá cao. Ý nghĩa: Biểu đồ cho thấy tầm quan trọng của độ tinh khiết
trong việc định giá kim cương.
Biểu đồ 16:
bd16 <- diamonds
bd16 %>% group_by(color) %>% summarise(med = median(carat)) %>%
ggplot(aes(color,med)) +
geom_col(fill='purple') +
geom_text(aes(label = med),vjust = 2, color = 'black') +
labs(x = 'Độ tinh khiết', y = 'Trung vị', title = "Biểu đồ cột thể hiện trung vị carat theo màu của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành color
Nhận xét: Trong biểu đồ, ta có thể dễ dàng thấy kim cương màu J
có trung vị carat cao nhất (1.11), thấp nhất là màu D và E (0.53). Trung
vị cũng tăng dần theo thứ tự tên của các màu. Ngoài ra thì độ chênh lệch
giữa các trung vị không lớn chỉ khoảng 0.2. Dựa vào những nhận xét trên,
ta có thể thấy rằng màu sắc và kích thước carat của kim cương có mối
liên hệ nhất định.
Biểu đồ 17:
bd17 <- diamonds
bd17 %>% group_by(color) %>% summarise(m = mean(carat)) %>%
ggplot(aes(color,m)) +
geom_col(fill='red') +
geom_text(aes(label = round(m,2)),vjust = 2, color = 'white') +
labs(x = 'Độ tinh khiết', y = 'Phương sai', title = "Biểu đồ cột thể hiện trung bình carat theo màu của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành color
Nhận xét: Có thể dễ dàng nhận thấy kim cương màu J có trung
bìnhbình carat cao nhất (1.16) và thấp nhất là kim cương màu D với E có
trung bình carat thấp nhất (0.66). Bên cạnh đó độ chênh lệch trung bình
giữa các màu là không quá nhiều (~ 0.2). Điều này có thể gợi ý đến việc
có sự cân nhắc cẩn thận trong việc chọn màu sắc của kim cương, không chỉ
dựa vào trung bình carat mà còn cần xem xét sự đa dạng trong kích thước
của chúng.
Biểu đồ 18:
bd18 <- diamonds
bd18 %>% group_by(color) %>% summarise(v = var(carat)) %>%
ggplot(aes(color,v)) +
geom_col(fill='red') +
geom_text(aes(label = round(v,2)),vjust = 2, color = 'white') +
labs(x = 'Phương sai', y = 'Độ đa dạng', title = "Biểu đồ cột thể hiện độ đa dạng carat theo màu của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành color
Nhận xét: Có thể dễ dàng nhận thấy kim cương màu J có phương sai
carat cao nhất (0.35) tức là độ biến động về trọng lượng viên kim cương
ở mức cao nhất và thấp nhất là kim cương màu D với E có phương sai carat
thấp nhất (0.66). Bên cạnh đó, độ chênh lệch giữa các phương sai (độ
biến động) không cao, tuy nhiên có sự tăng mạnh giữa hai cột G và
H.
Biểu đồ 19:
bd19 <- diamonds
bd19 %>% group_by(color) %>% summarise(med = median(price)) %>%
ggplot(aes(color,med)) +
geom_col(fill='purple') +
geom_text(aes(label = med),vjust = 2, color = 'black') +
labs(x = 'Độ tinh khiết', y = 'Trung vị', title = "Biểu đồ cột thể hiện trung vị giá theo màu của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành color
Nhận xét: Kim cương màu J có trung vị về giá cao nhất (4234) và
thấp nhất với màu E (1739). Qua biểu đồ có thể thấy sự tăng giảm trung
vị carat giữa các loại màu không đồng đều. Ngoài ra có độ chênh lệch khá
lớn giữa kim cương màu I và J hoặc giữa kim cương màu F và G, còn lại độ
chênh lệch là không đáng kể.
Biểu đồ 20:
bd20<- diamonds
bd20 %>% group_by(color) %>% summarise(m = mean(price)) %>%
ggplot(aes(color,m)) +
geom_col(fill='purple') +
geom_text(aes(label = round(m,0)),vjust = 2, color = 'black') +
labs(x = 'Độ tinh khiết', y = 'Trung bình', title = "Biểu đồ cột thể hiện trung bình giá theo màu của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành color
Nhận xét: Trung bình về giá của kim cương màu J là cao nhất
(5324) và thấp nhất là màu E (3077). Có thể thấy sự tăng dần về trung
bình giá theo thứ tự màu của kim cương với độ chênh lệch là không quá
nhiều. Với biểu đồ này, khi tiến hành chọn lựa mua kim cương ta cũng có
thể dễ dàng đưa ra đánh giá và quyết định hơn.
Biểu đồ 21:
bd21 <- diamonds
bd21 %>% group_by(color) %>% summarise(v = var(price)) %>%
ggplot(aes(color,v)) +
geom_col(fill='red') +
geom_text(aes(label = round(v,0)),vjust = 2, color = 'white') +
labs(x = 'Độ tinh khiết', y = 'Phương sai', title = "Biểu đồ cột thể hiện phương sai về giá theo màu của kim cương")

Về mặt kỹ thuật: Tương tự với những lệnh của các biểu đồ trên mà
thay vào đó ta đổi từ biến cut thành color
Nhận xét: Ta có thể thấy sự biến động về giá tại kim cương màu I
là cao nhất (22300945) và thấp nhất là với kim cương màu (11266703). Độ
chênh lệch của sự biến động về giá giữa kim cương màu D và E là không
đáng kể gần như bằng nhau, trong đó độ chênh lệch nhiều nhất là giữa màu
H và I. Đây là biểu đồ về độ biến động về giá của kim cương theo màu, do
đó ít nhiều ta cũng dễ dàng đưa ra quyết định mua hàng hơn sau khi có
được thông tin từ biểu đò.
Biểu đồ 22:
bd22 <- diamonds
library(scales)
##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
bd22 %>% group_by(cut,color) %>% summarise(n=n()) %>%
ggplot(aes(x = cut,y = n)) +
geom_col(position = 'dodge', fill = 'white') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = -1, color = 'black') +
labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

- Về mặt kỹ thuật:
- group_by(cut, color): Hàm này nhóm các hàng trong bd22 theo các giá
trị của hai cột: “cut” (loại cắt) và “color” (màu sắc). Điều này giống
như việc sắp xếp dữ liệu theo từng loại cắt và màu sắc.
- summarise(n = n()): Hàm này tính tần suất (số lượng) của các quan
sát trong mỗi nhóm được tạo ra ở bước trước. Kết quả của phép tính này
được lưu vào một cột mới có tên “n”.
- ggplot(aes(x = cut, y = n)): Dòng lệnh này tạo ra một biểu đồ cột
(ggplot) bằng cách ánh xạ các giá trị của cột “cut” lên trục hoành (x)
và giá trị của cột “n” (số lượng) lên trục tung (y).
- position = ‘dodge’ (tùy chọn bố cục): Thiết lập này đảm bảo các cột
được sắp xếp cạnh nhau theo từng nhóm (loại cắt), tránh chồng chéo lên
nhau.
- fill = ‘white’ (tùy chọn màu sắc): Thiết lập này tô màu trắng cho
các cột.
- facet_wrap(~color): Hàm này tạo ra một bố cục nhiều biểu đồ, mỗi
biểu đồ đại diện cho một màu sắc của kim cương. Biểu đồ được sắp xếp
theo các màu sắc khác nhau.
- aes(label = n): Thiết lập này xác định nhãn là giá trị của cột “n”
(số lượng).
- vjust = -1 (tùy chọn căn chỉnh): Thiết lập này điều chỉnh vị trí dọc
của các nhãn, đặt chúng hơi thấp hơn so với đỉnh của các cột.
- color = ‘black’ (tùy chọn màu sắc): Thiết lập này tô màu đen cho các
nhãn. labs(x = ‘Loại’, y = ‘Số lượng’): Hãm này đặt nhãn cho trục hoành
(“Loại”) và trục tung (“Số lượng”).
- Nhận xét:
Với tổng số 7 màu sắc cùng với 5 loại, ta có thể thấy 7 biểu đồ tương
ứng với từng màu sắc và mỗi màu sắc có số lượng loại cụ thể
Nhìn sơ qua có thể dễ dàng nhận thấy cả 7 màu đều có loại Ideal cao
nhất và Fair ít nhất
Với loại Ideal, màu G có số lượng nhiều nhất (4884) và màu J có số
lượng thấp nhất (896)
Với mức Premium và Very Good, các màu đều có số lượng không quá chênh
lệch, tất cả đều ở mức trung bình, không quá nhiều và cũng không quá
ít
Với mức Good và Fair, số lượng ít hơn hẳn các mức còn lại, sự chênh
lệch với mức Ideal là quá rõ rệt
Biểu đồ 23:
bd23 <- diamonds
bd23 %>% group_by(cut,clarity) %>% summarise(n=n()) %>%
ggplot(aes(x = cut,y = n)) +
geom_col(position = 'dodge', fill = 'white') +
facet_wrap(~clarity) +
geom_text(aes(label = n),vjust = -0.5, color = 'black') +
labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

- Về mặt kỹ thuật:
- group_by(cut, clarity): Hàm này nhóm các hàng trong bd23 theo các
giá trị của hai cột: “cut” (loại cắt) và “clarity” (độ tinh khiết). Điều
này giống như việc sắp xếp dữ liệu theo từng loại cắt và độ tinh
khiết.
- summarise(n = n()): Hàm này tính tần suất (số lượng) của các quan
sát trong mỗi nhóm được tạo ra ở bước trước. Kết quả của phép tính này
được lưu vào một cột mới có tên “n”.
- ggplot(aes(x = cut, y = n)): Dòng lệnh này tạo ra một biểu đồ cột
(ggplot) bằng cách ánh xạ các giá trị của cột “cut” lên trục hoành (x)
và giá trị của cột “n” (số lượng) lên trục tung (y).
- position = ‘dodge’ (tùy chọn bố cục): Thiết lập này đảm bảo các cột
được sắp xếp cạnh nhau theo từng nhóm (loại cắt), tránh chồng chéo lên
nhau.
- fill = ‘white’ (tùy chọn màu sắc): Thiết lập này tô màu trắng cho
các cột.
- facet_wrap(~clarity): Hàm này tạo ra một bố cục nhiều biểu đồ, mỗi
biểu đồ đại diện cho một độ tinh khiết của kim cương. Biểu đồ được sắp
xếp theo các độ tinh khiết khác nhau.
- aes(label = n): Thiết lập này xác định nhãn là giá trị của cột “n”
(số lượng).
- vjust = -1 (tùy chọn căn chỉnh): Thiết lập này điều chỉnh vị trí dọc
của các nhãn, đặt chúng hơi thấp hơn so với đỉnh của các cột.
- color = ‘black’ (tùy chọn màu sắc): Thiết lập này tô màu đen cho các
nhãn. labs(x = ‘Loại’, y = ‘Số lượng’): Hãm này đặt nhãn cho trục hoành
(“Loại”) và trục tung (“Số lượng”).
- Nhận xét:
Với tổng số 8 độ tinh khiết cùng với 5 loại, ta có thể thấy 8 biểu đồ
tương ứng với từng độ tinh khiết và mỗi độ tinh khiết có số lượng loại
cụ thể
Nhìn sơ qua, cả 8 độ tinh khiết đa số có loại Ideal chiếm cao nhất và
Fair ít nhất
Với loại Ideal, độ tinh khiết SI1 có số lượng nhiều nhất (4282) và I1
có số lượng thấp nhất (146)
Với mức Premium và Very Good, các độ tinh khiết có số lượng khá chênh
lệch nhaunhau
Với mức Good và Fair, số lượng ít hơn hẳn các mức còn lại, sự chênh
lệch với mức Ideal là quá rõ rệt
Biểu đồ 24:
bd24 <- diamonds
bd24 %>% group_by(clarity,color) %>% summarise(n=n()) %>%
ggplot(aes(x = clarity,y = n)) +
geom_col(position = 'dodge', fill = 'white') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = 0, color = 'black') +
labs(x = 'Độ tinh khiết', y = 'Số lượng')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

- Về mặt kỹ thuật:
- group_by(clarity, color): Hàm này nhóm các hàng trong bd24 theo các
giá trị của hai cột: “clarity” (độ tinh khiết) và “color” (màu sắc).
Điều này giống như việc sắp xếp dữ liệu theo từng độ tinh khiết và màu
sắc.
- summarise(n = n()): Hàm này tính tần suất (số lượng) của các quan
sát trong mỗi nhóm được tạo ra ở bước trước. Kết quả của phép tính này
được lưu vào một cột mới có tên “n”.
- ggplot(aes(x = clarity, y = n)): Dòng lệnh này tạo ra một biểu đồ
cột (ggplot) bằng cách ánh xạ các giá trị của cột “clarity” lên trục
hoành (x) và giá trị của cột “n” (số lượng) lên trục tung (y).
- position = ‘dodge’ (tùy chọn bố cục): Thiết lập này đảm bảo các cột
được sắp xếp cạnh nhau theo từng nhóm (độ tinh khiết), tránh chồng chéo
lên nhau.
- fill = ‘white’ (tùy chọn màu sắc): Thiết lập này tô màu trắng cho
các cột.
- facet_wrap(~color): Hàm này tạo ra một bố cục nhiều biểu đồ, mỗi
biểu đồ đại diện cho một màu sắc của kim cương. Biểu đồ được sắp xếp
theo các màu sắc khác nhau.
- aes(label = n): Thiết lập này xác định nhãn là giá trị của cột “n”
(số lượng).
- vjust = -0.5 (tùy chọn căn chỉnh): Thiết lập này điều chỉnh vị trí
dọc của các nhãn, đặt chúng hơi thấp hơn so với đỉnh của các cột.
- color = ‘black’ (tùy chọn màu sắc): Thiết lập này tô màu đen cho các
nhãn. labs(x = ‘Độ tinh khiết’, y = ‘Số lượng’): Hãm này đặt nhãn cho
trục hoành (“Độ tinh khiết”) và trục tung (“Số lượng”).
- Nhận xét: Với tổng số 8 độ tinh khiết cùng với 7 màu, ta có thể thấy
7 biểu đồ tương ứng với từng màu và mỗi màu có số lượng loại cụ thể
Nhìn sơ qua, cả 7 màu đa số có độ tinh khiết SI1 chiếm cao nhất và I1
ít nhất
Với độ tinh khiết VS2, màu G có số lượng nhiều nhất (2347) và J có số
lượng thấp nhất (731)
Với các độ tinh khiết còn lại, thì giữa các màu không có quá nhiều sự
chênh lệch
Biểu đồ 25:
bd25 <- diamonds
bd25 <- bd25 %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
bd25 %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = bd25 %>% filter(color == 'D'), fill = 'red') +
geom_col(data = bd25 %>% filter(color == 'J'), fill = 'blue') +
labs(x = 'Loại', y = 'Số lượng')

- Về mặt kỹ thuật:
- group_by(cut, color): Nhóm dữ liệu trong “bd25” theo hai trường
“cut” (Loại) và “color” (Màu sắc).
- summarise(n = n()): Tính toán số lượng viên kim cương trong mỗi nhóm
và lưu trữ kết quả trong một cột mới có tên “n”.
- ggplot(aes(x = cut, y = n)): Xác định “cut” là trục hoành và “n” là
trục tung.
- geom_col(data = bd25 %>% filter(color == ‘D’), fill = ‘red’):
Thêm một biểu đồ cột cho dữ liệu kim cương màu “D” với màu tô là
đỏ.
- geom_col(data = bd25 %>% filter(color == ‘J’), fill = ‘blue’):
Thêm một biểu đồ cột cho dữ liệu kim cương màu “J” với màu tô là xanh
lam.
- labs(x = ‘Loại’, y = ‘Số lượng’): Thêm nhãn cho trục hoành là “Loại”
và trục tung là “Số lượng”.
- Nhận xét:
Ta có thể thấy sự chênh lệch số lượng giữa 2 màu D và J là khá lớn.
Đặc biệt là ở 3 loại Ideal - Premium - Very Good
Sự chênh lệch lớn nhất là ở mức Ideal
Còn ở 2 mức cuối là Fair và Good, khoảng cách không quá xa
Biểu đồ 26:
bd26 <- diamonds
bd26 <- bd26 %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
bd26 %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = bd26 %>% filter(color == 'E'), fill = 'red') +
geom_col(data = bd26 %>% filter(color == 'J'), fill = 'blue') +
labs(x = 'Loại', y = 'Số lượng')

- Về mặt kỹ thuật:
- group_by(cut, color): Nhóm dữ liệu trong “bd26” theo hai trường
“cut” (Loại) và “color” (Màu sắc).
- summarise(n = n()): Tính toán số lượng viên kim cương trong mỗi nhóm
và lưu trữ kết quả trong một cột mới có tên “n”.
- ggplot(aes(x = cut, y = n)): Xác định “cut” là trục hoành và “n” là
trục tung.
- geom_col(data = bd26 %>% filter(color == ‘E’), fill = ‘red’):
Thêm một biểu đồ cột cho dữ liệu kim cương màu “E” với màu tô là
đỏ.
- geom_col(data = bd26 %>% filter(color == ‘J’), fill = ‘blue’):
Thêm một biểu đồ cột cho dữ liệu kim cương màu “J” với màu tô là xanh
lam.
- labs(x = ‘Loại’, y = ‘Số lượng’): Thêm nhãn cho trục hoành là “Loại”
và trục tung là “Số lượng”.
- Nhận xét: Ta có thể thấy sự chênh lệch số lượng giữa 2 màu E và J là
khá lớn. Đặc biệt là ở 4 loại Ideal - Premium - Very Good - Good, dễ
dàng nhận thấy phần màu đỏ đại diện cho màu E chiếm ưu thế hơn
Sự chênh lệch lớn nhất là ở mức Ideal, khi mà số lượng của màu J còn
không nhiều bằng phân nửa màu E
Còn ở mức cuối là Fair, số lượng của cả hai gần như xấp xỉ nhau
Biểu đồ 27:
bd27 <- diamonds
bd27 <- bd27 %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
bd27 %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = bd27 %>% filter(color == 'H'), fill = 'red') +
geom_col(data = bd27 %>% filter(color == 'I'), fill = 'blue') +
labs(x = 'Loại', y = 'Số lượng')

- Về mặt kỹ thuật:
- group_by(cut, color): Nhóm dữ liệu trong “bd27” theo hai trường
“cut” (Loại) và “color” (Màu sắc).
- summarise(n = n()): Tính toán số lượng viên kim cương trong mỗi nhóm
và lưu trữ kết quả trong một cột mới có tên “n”.
- ggplot(aes(x = cut, y = n)): Xác định “cut” là trục hoành và “n” là
trục tung.
- geom_col(data = bd27 %>% filter(color == ‘H’), fill = ‘red’):
Thêm một biểu đồ cột cho dữ liệu kim cương màu “D” với màu tô là
đỏ.
- geom_col(data = bd27 %>% filter(color == ‘I’), fill = ‘blue’):
Thêm một biểu đồ cột cho dữ liệu kim cương màu “J” với màu tô là xanh
lam.
- labs(x = ‘Loại’, y = ‘Số lượng’): Thêm nhãn cho trục hoành là “Loại”
và trục tung là “Số lượng”.
- Nhận xét:
Ta có thể thấy sự chênh lệch số lượng giữa 2 màu H và I là khá lớn.
Đặc biệt là ở 4 loại Ideal - Premium - Very Good - Good
Sự chênh lệch lớn nhất là ở mức Good, khi màu I có số lượng lớn hơn
gấp 3 lần màu H
Còn ở mức cuối là Fair, cũng có sự chênh lệch nhưng không đáng kể
Biểu đồ 28:
bd28 <- diamonds
bd28 <- bd28 %>% mutate(caratC = cut(carat,5, label = c('rất nhỏ', 'nhỏ','vừa','lớn','rất lớn')))
bd28 %>% ggplot(aes(x = caratC)) +
geom_bar(fill = 'red') +
theme_classic() +
labs(title = "Biểu đồ hình cột thể hiện số lượng kim cương trong mỗi nhóm carat")

- Về mặt kỹ thuật:
- mutate() để thêm một biến mới vào đối tượng “bd28”. Biến mới có tên
“caratC” được tạo ra bằng cách phân chia giá trị carat thành 5 nhóm:
“rất nhỏ”, “nhỏ”, “vừa”, “lớn”, “rất lớn”.
- Hàm cut() được sử dụng để thực hiện việc phân chia này.
- Tham số đầu tiên của cut() là carat, biến mà chúng ta muốn phân
chia.
- Tham số thứ hai là 5, số lượng nhóm mà chúng ta muốn tạo.
- Tham số thứ ba là label, một vector chứa tên cho các nhóm.
- ggplot(aes(x = caratC)) tạo ra một khung vẽ ggplot với trục x được
xác định bởi biến “caratC”.
- geom_bar(fill = ‘red’) thêm một biểu đồ hình cột vào khung vẽ. Màu
của các cột được tô màu đỏ.
- theme_classic(): Áp dụng giao diện cổ điển cho biểu đồ.
- labs(title = “Biểu đồ hình cột thể hiện số lượng kim cương trong mỗi
nhóm carat”): Thêm tiêu đề cho biểu đồ.
- Nhận xét: Sau khi đã chia nhỏ ra làm 5 nhóm, ta có thể thấy số lượng
kim cương thuộc nhóm rất nhỏ là chiếm cao nhất với hơn 4000 viên, sau đó
là nhỏ và vừa. Còn kim cương thuộc nhóm lớn và rất lớn có thể có nhưng
vì quá ít nên biểu đồ không thể hiện lên. Ngoài ra thì độ chênh lệch số
lượng viên kim cương giữa các nhóm là rất cao.
Biểu đồ 29:
bd29 <- diamonds
bd29 <- bd29 %>% mutate(priceC = cut(price,3, label = c('Mắc','Trung bình','Rẻ')))
bd29 %>% ggplot(aes(x = priceC)) +
geom_bar(fill = 'brown') +
theme_classic() +
labs(title = "Biểu đồ hình cột thể hiện số lượng kim cương trong mỗi nhóm price")

- Về mặt kỹ thuật:
- mutate() để thêm một biến mới vào đối tượng “bd29”. Biến mới có tên
“priceC” được tạo ra bằng cách phân chia giá trị carat thành 3 nhóm:
“Mắc”, “Trung bình”, “Rẻ”.
- Hàm cut() được sử dụng để thực hiện việc phân chia này.
- Tham số đầu tiên của cut() là carat, biến mà chúng ta muốn phân
chia.
- Tham số thứ hai là 3, số lượng nhóm mà chúng ta muốn tạo.
- Tham số thứ ba là label, một vector chứa tên cho các nhóm.
- ggplot(aes(x = priceC)) tạo ra một khung vẽ ggplot với trục x được
xác định bởi biến “priceC”.
- geom_bar(fill = ‘red’) thêm một biểu đồ hình cột vào khung vẽ. Màu
của các cột được tô màu đỏ.
- theme_classic(): Áp dụng giao diện cổ điển cho biểu đồ.
- labs(title = “Biểu đồ hình cột thể hiện số lượng kim cương trong mỗi
nhóm price”): Thêm tiêu đề cho biểu đồ.
- Nhận xét: Để dễ dàng đánh giá về giá của các viên kim cương, ta đã
phân nhỏ chúng ra thành 3 nhóm. Trong đó có thể dễ dàng thấy rằng số
lượng viên kim cương thuộc nhóm Mắc là cao nhất với hơn 4000 viên và
thấp nhất là với nhóm Rẻ chưa đến 1000 viên. Ngoài ra ta cũng thấy được
độ chênh lệch giữa các nhóm là khá cao, nhất là khi so các nhóm còn lại
với nhóm Mắc.
Biểu đồ 30:
bd30 <- diamonds
bd30 <- bd30 %>% mutate(depthC = cut(depth,5, label = c('Sâu','Khá sâu','Trung bình','Khá nông','Nông')))
bd30 %>% ggplot(aes(x = depthC)) +
geom_bar(fill = 'yellow') +
theme_classic() +
labs(title = "Biểu đồ hình cột thể hiện số lượng kim cương trong mỗi nhóm depth")

- Về mặt kỹ thuật:
- mutate() để thêm một biến mới vào đối tượng “bd30”. Biến mới có tên
“depthC” được tạo ra bằng cách phân chia giá trị carat thành 5 nhóm:
“Sâu”, “Khá sâu”, “Trung bình”, “Khá nông”, “Nông”.
- Hàm cut() được sử dụng để thực hiện việc phân chia này.
- Tham số đầu tiên của cut() là depth, biến mà chúng ta muốn phân
chia.
- Tham số thứ hai là 5, số lượng nhóm mà chúng ta muốn tạo.
- Tham số thứ ba là label, một vector chứa tên cho các nhóm.
- ggplot(aes(x = depthC)) tạo ra một khung vẽ ggplot với trục x được
xác định bởi biến “caratC”.
- geom_bar(fill = ‘yellow’) thêm một biểu đồ hình cột vào khung vẽ.
Màu của các cột được tô màu vàng.
- theme_classic(): Áp dụng giao diện cổ điển cho biểu đồ.
- labs(title = “Biểu đồ hình cột thể hiện số lượng kim cương trong mỗi
nhóm depth”): Thêm tiêu đề cho biểu đồ.
- Nhận xét: Nhìn vào biểu đồ, sau khi đã chia nhỏ độ sâu của viên kim
cương thành 5 nhóm, ta có thể thấy số lượng viên kim cương có độ sâu
trung bình là cao nhất, kế đến là nhóm khá nông và khá sâu, 2 nhóm còn
lại có thể có nhưng vì quá ít nên biểu đồ đã không thể hiện lên. Ngoài
ra có thể thấy khi so các nhóm còn lại với nhóm độ sâu trung bình ta
thấy sự cách biệt là rất lớn.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA0Ig0KYXV0aG9yOiAibnRuc2FuZyINCmRhdGU6ICIyMDI0LTAyLTI2Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlIA0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgDQoNCiMgMS4gR2nhu5tpIHRoaeG7h3UgYuG7mSBk4buvIGxp4buHdToNCg0KDQoiRGlhbW9uZHMiIGzDoCAxIGLhu5kgZOG7ryBsaeG7h3UgY8OzIHPhurVuIHRyb25nIFJTdHVkaW8gduG7m2kgNTM5NDAgcXVhbiBzw6F0IHbDoCAxMCBiaeG6v24sIGN1bmcgY+G6pXAgY2hvIHRhIHRow7RuZyB0aW4gduG7gSBnacOhIGPhuqMgdsOgIGPDoWMgdGh14buZYyB0w61uaCBj4bunYSBoxqFuIDUzLjk0MCB2acOqbiBraW0gY8awxqFuZyBj4bqvdCB0csOybi4gROG7ryBsaeG7h3UgYmFvIGfhu5NtIGPDoWMgYmnhur9uIHNhdToNCg0KLSBwcmljZSAoR2nDoSk6IEdpw6EgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKMSRw7QgbGEgTeG7uSkuDQoNCi0gY2FyYXQgKFRy4buNbmcgbMaw4bujbmcpOiBUcuG7jW5nIGzGsOG7o25nIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChjYXJhdCkuDQoNCi0gY3V0IChMb+G6oWkpOiBDaOG6pXQgbMaw4bujbmcgY+G6r3QgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKDUgbeG7qWM6IEZhaXIsIFZlcnkgR29vZCwgR29vZCwgUHJlbWl1bSwgSWRlYWwpLg0KDQotIGNvbG9yIChNw6B1IHPhuq9jKTogTcOgdSBz4bqvYyBj4bunYSB2acOqbiBraW0gY8awxqFuZyAoOSBt4bupYzogRCwgRSwgRiwgRywgSCwgSSwgSiwgSywgTCksIHThu6sga2jDtG5nIG3DoHUgKEQpIMSR4bq/biBtw6B1IHbDoG5nIG5o4bqhdCAoTCkuDQoNCi0gY2xhcml0eSAoxJDhu5kgdGluaCBraGnhur90KTogxJDhu5kgdHJvbmcvdGluaCBraGnhur90IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nICg5IG3hu6ljOiBJRiwgVlZTMSwgVlZTMiwgVlMxLCBWUzIsIFNJMSwgU0kyLCBJMSwgSTIpLCB04burIHbDtCBjw7luZyB0aW5oIGtoaeG6v3QgKElGKSDEkeG6v24gbmhp4buBdSB04bqhcCBjaOG6pXQgKEkyKS4NCg0KLSB4IChDaGnhu4F1IGTDoGkpOiBDaGnhu4F1IGTDoGkgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKS4NCg0KLSB5IChDaGnhu4F1IHLhu5luZyk6IENoaeG7gXUgcuG7mW5nIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChtbSkuDQoNCi0geiAoxJDhu5kgc8OidSk6IMSQ4buZIHPDonUgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKS4NCg0KLSBkZXB0aCAoVOG7tyBs4buHIHBo4bqnbiB0csSDbSDEkeG7mSBzw6J1KTogVOG7tyBs4buHIHBo4bqnbiB0csSDbSDEkeG7mSBzw6J1IHNvIHbhu5tpIMSRxrDhu51uZyBrw61uaCB2acOqbiBraW0gY8awxqFuZy4NCg0KLSB0YWJsZSAoQ2hp4buBdSBy4buZbmcgY+G7p2EgxJHhu4luaCk6IENoaeG7gXUgcuG7mW5nIGPhu6dhIMSR4buJbmggdmnDqm4ga2ltIGPGsMahbmcgc28gduG7m2kgxJFp4buDbSBy4buZbmcgbmjhuqV0Lg0KDQojIDIuIEJp4buDdSBkaeG7hW4gYuG7mSBk4buvIGxp4buHdSBi4bqxbmcgxJHhu5MgdGjhu4sgKEThuqFuZyBiYXJjaGFydCk6DQoNCiMjIEJp4buDdSDEkeG7kyAxOiANCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmJkMSA8LSBkaWFtb25kcw0KYmQxICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQpKSArDQogICAgZ2VvbV9iYXIoZmlsbD0ncGluaycpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJywgdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIikNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCg0KICAtIGdncGxvdDogSMOgbSB04bqhbyBiaeG7g3UgxJHhu5MgZ2dwbG90Mi4NCiAgLSBhZXMoeCA9IGN1dCk6IMOBbmggeOG6oSBiaeG6v24gY3V0IChsb+G6oWkpIHbDoG8gdHLhu6VjIHggY+G7p2EgYmnhu4N1IMSR4buTLg0KICAtIGdlb21fYmFyOiBIw6BtIHbhur0gYmnhu4N1IMSR4buTIGjDrG5oIHRoYW5oLg0KICAtIGZpbGw9J3BpbmsnOiBUw7l5IGNo4buJbmggbcOgdSBz4bqvYyBj4bunYSBjw6FjIHRoYW5oIGLhurFuZyBtw6B1IGjhu5NuZy4NCiAgLSBIw6BtIHRow6ptIG5ow6NuIGNobyBjw6FjIHRow6BuaCBwaOG6p24gY+G7p2EgYmnhu4N1IMSR4buTLg0KICAtIHggPSAnTG/huqFpJzogTmjDo24gY2hvIHRy4bulYyB4IGzDoCAiTG/huqFpIi4NCiAgLSB5ID0gJ1Phu5EgbMaw4bujbmcnOiBOaMOjbiBjaG8gdHLhu6VjIHkgbMOgICJT4buRIGzGsOG7o25nIi4NCiAgLSB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBsb+G6oWkiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTIGzDoCAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIi4NCg0KLSBOaOG6rW4geMOpdDogDQpOaMOsbiB2w6BvIHPhu5EgbGnhu4d1IHbhu4Egc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBsb+G6oWksIHRhIGPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHPhu7EgY2jDqm5oIGzhu4djaCDEkcOhbmcga+G7gyBnaeG7r2EgY8OhYyBsb+G6oWkuIExv4bqhaSBraW0gY8awxqFuZyBJZGVhbCBu4buVaSBi4bqtdCB24bubaSBz4buRIGzGsOG7o25nIGNhbyBuaOG6pXQsIGzDqm4gxJHhur9uIGjGoW4gMjAuMDAwIHZpw6puLCB0cm9uZyBraGkgbG/huqFpIEZhaXIgbOG6oWkgY8OzIMOtdCBoxqFuIDUuMDAwIHZpw6puLiDEkGnhu4F1IG7DoHkgdGjhu4MgaGnhu4duIHLDtSBz4buxIHBow6JuIGJp4buHdCB24buBIGNo4bqldCBsxrDhu6NuZyB2w6AgZ2nDoSB0cuG7iyBnaeG7r2EgY8OhYyBsb+G6oWkga2ltIGPGsMahbmcuIA0KDQoNCiMjIEJp4buDdSDEkeG7kyAyOiANCg0KYGBge3J9DQpiZDIgPC0gZGlhbW9uZHMNCmJkMiAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSkpICsNCiAgICBnZW9tX2JhcihmaWxsPSdibHVlJykgKw0KICAgIGxhYnMoeCA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1Phu5EgbMaw4bujbmcnLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QiKSArDQogICAgY29vcmRfZmxpcCgpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDoNCiAgDQogIC0gZ2dwbG90OiBIw6BtIHThuqFvIGJp4buDdSDEkeG7kyBnZ3Bsb3QyLg0KICAgIGFlcyh4ID0gY2xhcml0eSk6IMOBbmggeOG6oSBiaeG6v24gY2xhcml0eSAoxJHhu5kgdGluaCBraGnhur90KSB2w6BvIHRy4bulYyB4IGPhu6dhIGJp4buDdSDEkeG7ky4NCiAgLSBnZW9tX2JhcjogSMOgbSB24bq9IGJp4buDdSDEkeG7kyBow6xuaCB0aGFuaC4NCiAgLSBmaWxsPSdibHVlJzogVMO5eSBjaOG7iW5oIG3DoHUgc+G6r2MgY+G7p2EgY8OhYyB0aGFuaCBi4bqxbmcgbcOgdSB4YW5oIGxhbS4NCiAgLSBsYWJzOiBIw6BtIHRow6ptIG5ow6NuIGNobyBjw6FjIHRow6BuaCBwaOG6p24gY+G7p2EgYmnhu4N1IMSR4buTLg0KICAtIHggPSAnxJDhu5kgdGluaCBraGnhur90JzogTmjDo24gY2hvIHRy4bulYyB4IGzDoCAixJDhu5kgdGluaCBraGnhur90Ii4NCiAgLSB5ID0gJ1Phu5EgbMaw4bujbmcnOiBOaMOjbiBjaG8gdHLhu6VjIHkgbMOgICJT4buRIGzGsOG7o25nIi4NCiAgLSBjb29yZF9mbGlwKCk6IEPDonUgbOG7h25oIG7DoHkgxJHhuqNvIG5nxrDhu6NjIHRy4bulYyB4IHbDoCB5IGPhu6dhIGJp4buDdSDEkeG7ky4NCiAgLSB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QiOiBUacOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTIGzDoCAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdGluaCBraGnhur90Ii4NCg0KLSBOaOG6rW4geMOpdDogDQpCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QuIEJp4buDdSDEkeG7kyBk4bqhbmcgaMOsbmggdGhhbmggduG7m2kgNSBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgxJHGsOG7o2Mgc+G6r3AgeOG6v3AgdGhlbyB0aOG7qSB04buxIHThu6sgZMaw4bubaSBsw6puIHRyw6puOiBJMSwgSTIsIFNJMSwgU0kyLCBWUzIuIFRyb25nIMSRw7MgbeG7qWMgxJHhu5kgSTEgY8OzIHPhu5EgbMaw4bujbmcgdmnDqm4gY2FvIG5o4bqldCwgbeG7qWMgxJHhu5kgVlMyIGPDsyBz4buRIGzGsOG7o25nIHZpw6puIHRo4bqlcCBuaOG6pXQsIMSR4buZIGNow6puaCBs4buHY2ggduG7gSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCBsw6Aga2jDoSBs4bubbi4gDQoNCg0KIyMgQmnhu4N1IMSR4buTIDM6DQpgYGB7cn0NCmJkMyA8LSBkaWFtb25kcw0KYmQzICU+JSBnZ3Bsb3QoYWVzKHggPSBjb2xvcikpICsNCiAgICBnZW9tX2JhcihmaWxsPSdyZWQnKSArDQogICAgbGFicyh4ID0gJ03DoHUnLCB5ID0gJ1Phu5EgbMaw4bujbmcnLHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIG3DoHUiKQ0KYGBgDQoNCi0gVuG7gSBt4bq3dCBr4bu5IHRodeG6rXQ6IA0KDQogIC0gZ2dwbG90OiBIw6BtIHThuqFvIGJp4buDdSDEkeG7kyBnZ3Bsb3QyLg0KICAgIGFlcyh4ID0gY29sb3IpOiDDgW5oIHjhuqEgYmnhur9uIGNvbG9yIChtw6B1KSB2w6BvIHRy4bulYyB4IGPhu6dhIGJp4buDdSDEkeG7ky4NCiAgLSBnZW9tX2JhcjogSMOgbSB24bq9IGJp4buDdSDEkeG7kyBow6xuaCB0aGFuaC4NCiAgLSBmaWxsPSdibHVlJzogVMO5eSBjaOG7iW5oIG3DoHUgc+G6r2MgY+G7p2EgY8OhYyB0aGFuaCBi4bqxbmcgbcOgdSB4YW5oIGxhbS4NCiAgLSBsYWJzOiBIw6BtIHRow6ptIG5ow6NuIGNobyBjw6FjIHRow6BuaCBwaOG6p24gY+G7p2EgYmnhu4N1IMSR4buTLg0KICAtIHggPSAnTcOgdSc6IE5ow6NuIGNobyB0cuG7pWMgeCBsw6AgIk3DoHUiLg0KICAtIHkgPSAnU+G7kSBsxrDhu6NuZyc6IE5ow6NuIGNobyB0cuG7pWMgeSBsw6AgIlPhu5EgbMaw4bujbmciLg0KICAtIC0gdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MgbMOgICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBtw6B1Ii4NCiAgDQotIE5o4bqtbiB4w6l0OiANCk5ow6xuIHbDoG8gc+G7kSBsaeG7h3UgduG7gSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3DoHUsIHRhIGPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHPhu7EgY2jDqm5oIGzhu4djaCDEkcOhbmcga+G7gyBnaeG7r2EgY8OhYyBsb+G6oWkuIExv4bqhaSBraW0gY8awxqFuZyBjw7MgbcOgdSBHIG7hu5VpIGLhuq10IHbhu5tpIHPhu5EgbMaw4bujbmcgY2FvIG5o4bqldCwgdHJvbmcga2hpIGxv4bqhaSBjw7MgbcOgdSBKIGzhuqFpIGPDsyBz4buRIGzGsOG7o25nIMOtdCBuaOG6pXQuICANCg0KIyMgQmnhu4N1IMSR4buTIDQ6IA0KYGBge3J9DQpiZDQgPC0gZGlhbW9uZHMNCmJkNCAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKG1lZCA9IG1lZGlhbihjYXJhdCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGN1dCxtZWQpKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncHVycGxlJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBtZWQpLHZqdXN0ID0gMiwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnVHJ1bmcgduG7iycsdGl0bGUgPSAiIEJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gdHJ1bmcgduG7iyBjYXJhdCB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDogDQogIC0gZ3JvdXBfYnkoY3V0KTogTmjDs20gZOG7ryBsaeG7h3UgdGhlbyBiaeG6v24gY3V0IChsb+G6oWkga2ltIGPGsMahbmcpLg0KICAtIHN1bW1hcmlzZShtZWQgPSBtZWRpYW4oY2FyYXQpKTogVMOtbmggdG/DoW4gdHJ1bmcgduG7iyAobWVkaWFuKSBj4bunYSBiaeG6v24gY2FyYXQgY2hvIG3hu5dpIG5ow7NtIHbDoCBsxrB1IGvhur90IHF14bqjIHbDoG8gYmnhur9uIG3hu5tpIG1lZCAodHJ1bmcgduG7iykuDQogIC0gYWVzKGN1dCxtZWQpOiDDgW5oIHjhuqEgYmnhur9uIGN1dCAobG/huqFpKSB2w6BvIHRy4bulYyB4IHbDoCBiaeG6v24gbWVkICh0cnVuZyB24buLKSB2w6BvIHRy4bulYyB5IGPhu6dhIGJp4buDdSDEkeG7ky4NCiAgLSBhZXMobGFiZWwgPSBtZWQpOiBHw6FuIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uIG1lZCAodHJ1bmcgduG7iykgdsOgbyBuaMOjbiBj4bunYSB2xINuIGLhuqNuLg0KICAtIHZqdXN0ID0gMjogxJBp4buBdSBjaOG7iW5oIHbhu4sgdHLDrSBj4bunYSB2xINuIGLhuqNuIHRoZW8gdHLhu6VjIHksIGThu4tjaCBsw6puIDIgxJHGoW4gduG7iyDEkeG7gyB0csOhbmggY2jhu5NuZyBsw6puIGPDoWMgY+G7mXQuDQogIC0gY29sb3IgPSAnYmxhY2snIDogVGhp4bq/dCBs4bqtcCBtw6B1IHPhuq9jIGPhu6dhIHbEg24gYuG6o24gbMOgIMSRZW4uDQogIC0gbGFicyh4ID0gJ0xv4bqhaScpOiBOaMOjbiBjaG8gdHLhu6VjIHggbMOgICJMb+G6oWkiLg0KICAtIGxhYnMoeSA9ICdUcnVuZyB24buLJyk6IE5ow6NuIGNobyB0cuG7pWMgeSBsw6AgIlRydW5nIHbhu4siLg0KICAtIC0gdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiB0cnVuZyB24buLIGNhcmF0IHRoZW8gbG/huqFpIGtpbSBjxrDGoW5nIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyBsw6AgIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB0cnVuZyB24buLIGNhcmF0IHRoZW8gbG/huqFpIGtpbSBjxrDGoW5nIi4NCg0KLSBOaOG6rW4geMOpdDogDQpRdWEgYmnhu4N1IMSR4buTIHRhIGPDsyB0aOG7gyB0aOG6pXkgxJHGsOG7o2MgdHJ1bmcgduG7iyBj4bunYSBraW0gY8awxqFuZyBsb+G6oWkgRmFpciBsw6AgY2FvIG5o4bqldCAoMSksIGxv4bqhaSBJZGVhbCBsw6AgdGjhuqVwIG5o4bqldCgxKS4gVOG7qyDEkcOzIGNobyB0aOG6pXkgbG/huqFpIGtpbSBjxrDGoW5nIEZhaXIgY8OzIHh1IGjGsOG7m25nIGPDsyB0cuG7jW5nIGzGsOG7o25nIGzhu5tuIGjGoW4gc28gduG7m2kgY8OhYyBsb+G6oWkga2jDoWMsIHRyb25nIGtoaSBsb+G6oWkga2ltIGPGsMahbmcgSWRlYWwgbOG6oWkgY8OzIHRy4buNbmcgbMaw4bujbmcgdGjhuqVwIGjGoW4sIGPDsyB0aOG7gyBkbyBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIG7DoHkgxJHGsOG7o2MgY2jhur8gdMOhYyDEkeG7gyBjw7Mga8OtY2ggdGjGsOG7m2Mgbmjhu48gdsOgIHRy4buNbmcgbMaw4bujbmcgbmjhurkgaMahbiwgbmjhurFtIHThu5FpIMawdSBow7NhIHPhu7EgbOG6pXAgbMOhbmggdsOgIGNo4bqldCBsxrDhu6NuZyBj4bunYSBjaMO6bmcuDQoNCiMjIEJp4buDdSDEkeG7kyA1OiANCmBgYHtyfQ0KYmQ1IDwtIGRpYW1vbmRzDQpiZDUgJT4lIGdyb3VwX2J5KGN1dCkgJT4lIHN1bW1hcmlzZShtZSA9IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyhjdXQsbWUpKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYmx1ZScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobWUsMikpLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnVHJ1bmcgYsOsbmgnLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIGNhcmF0IHRoZW8gbG/huqFpIGtpbSBjxrDGoW5nIikNCmBgYA0KDQotIHbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCiAgLSBncm91cF9ieShjdXQpOiBOaMOzbSBk4buvIGxp4buHdSB0aGVvIGJp4bq/biBjdXQgKGxv4bqhaSBraW0gY8awxqFuZykuDQogIC0gc3VtbWFyaXNlKG1lID0gbWVhbihjYXJhdCkpOiBUw61uaCB0b8OhbiB0cnVuZyBiw6xuaCAobWVhbikgY+G7p2EgYmnhur9uIGNhcmF0IGNobyBt4buXaSBuaMOzbSB2w6AgbMawdSBr4bq/dCBxdeG6oyB2w6BvIGJp4bq/biBt4bubaSBtZSAodHJ1bmcgYsOsbmgpLg0KICAtIGFlcyhjdXQsbWUpOiDDgW5oIHjhuqEgYmnhur9uIGN1dCAobG/huqFpKSB2w6BvIHRy4bulYyB4IHbDoCBiaeG6v24gbWVkICh0cnVuZyB24buLKSB2w6BvIHRy4bulYyB5IGPhu6dhIGJp4buDdSDEkeG7ky4NCiAgLSBhZXMobGFiZWwgPSBtZSk6IEfDoW4gZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gbWVkICh0cnVuZyB24buLKSB2w6BvIG5ow6NuIGPhu6dhIHbEg24gYuG6o24uDQogIC0gdmp1c3QgPSAyOiDEkGnhu4F1IGNo4buJbmggduG7iyB0csOtIGPhu6dhIHbEg24gYuG6o24gdGhlbyB0cuG7pWMgeSwgZOG7i2NoIGzDqm4gMiDEkcahbiB24buLIMSR4buDIHRyw6FuaCBjaOG7k25nIGzDqm4gY8OhYyBj4buZdC4NCiAgLSBjb2xvciA9ICd3aGl0ZScgOiBUaGnhur90IGzhuq1wIG3DoHUgc+G6r2MgY+G7p2EgdsSDbiBi4bqjbiBsw6AgxJFlbi4NCiAgLSBsYWJzKHggPSAnTG/huqFpJyk6IE5ow6NuIGNobyB0cuG7pWMgeCBsw6AgIkxv4bqhaSIuDQogIC0gbGFicyh5ID0gJ1RydW5nIGLDrG5oJyk6IE5ow6NuIGNobyB0cuG7pWMgeSBsw6AgIlRydW5nIGLDrG5oIi4NCiAgLSB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIGNhcmF0IHRoZW8gbG/huqFpIGtpbSBjxrDGoW5nIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyBsw6AgIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB0cnVuZyBiw6xuaCBjYXJhdCB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyIuDQoNCi0gTmjhuq1uIHjDqXQ6IA0KS2ltIGPGsMahbmcgbG/huqFpIEZhaXIgY8OzIGNhcmF0IHRydW5nIGLDrG5oIGNhbyBuaOG6pXQgxJHhuqF0IDEuMDUgY2FyYXQsIHRyb25nIGtoaSBraW0gY8awxqFuZyBsb+G6oWkgSWRlYWwgbOG6oWkgY8OzIGNhcmF0IHRydW5nIGLDrG5oIHRo4bqlcCBuaOG6pXQgY2jhu4kgbMOgIDAuNyBjYXJhdC4gQ8OhYyBsb+G6oWkga2ltIGPGsMahbmcgR29vZCwgVmVyeSBHb29kIHbDoCBQcmVtaXVtIGPDsyBt4bupYyBjYXJhdCB0cnVuZyBiw6xuaCBs4bqnbiBsxrDhu6N0IGzDoCAwLjg1IGNhcmF0LCAwLjgxIGNhcmF0IHbDoCAwLjg5IGNhcmF0LiBOaMOsbiBjaHVuZywgY2FyYXQgdHJ1bmcgYsOsbmggY8OzIHh1IGjGsOG7m25nIGdp4bqjbSBraGkgY2jhuqV0IGzGsOG7o25nIGPhuq90IGNhbyBoxqFuLiBCaeG7g3UgxJHhu5MgxJHDoyBjdW5nIGPhuqVwIMSRxrDhu6NjIGNobyB0YSBt4buZdCBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbhu4EgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBjYXJhdCB0cnVuZyBiw6xuaCBj4bunYSBraW0gY8awxqFuZy4NCg0KIyMgQmnhu4N1IMSR4buTIDY6IA0KYGBge3J9DQpiZDYgPC0gZGlhbW9uZHMNCmJkNiAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKHYgPSB2YXIoY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyhjdXQsdikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHYsMikpLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnUGjGsMahbmcgc2FpJyx0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHBoxrDGoW5nIHNhaSBjYXJhdCB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDogDQogIC0gZ3JvdXBfYnkoY3V0KTogTmjDs20gZOG7ryBsaeG7h3UgdGhlbyBiaeG6v24gY3V0IChsb+G6oWkga2ltIGPGsMahbmcpLg0KICAtIHN1bW1hcmlzZSh2ID0gdmFyKGNhcmF0KSk6IFTDrW5oIHRvw6FuIMSR4buZIMSRYSBk4bqhbmcgKHZhcikgY+G7p2EgYmnhur9uIGNhcmF0IGNobyBt4buXaSBuaMOzbSB2w6AgbMawdSBr4bq/dCBxdeG6oyB2w6BvIGJp4bq/biBt4bubaSB2ICjEkeG7mSDEkWEgZOG6oW5nKS4NCiAgLSBhZXMoY3V0LHYpOiDDgW5oIHjhuqEgYmnhur9uIGN1dCAobG/huqFpKSB2w6BvIHRy4bulYyB4IHbDoCBiaeG6v24gdiAoxJDhu5kgxJFhIGThuqFuZykgdsOgbyB0cuG7pWMgeSBj4bunYSBiaeG7g3UgxJHhu5MuDQogIC0gYWVzKGxhYmVsID0gdik6IEfDoW4gZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gbWVkICh0cnVuZyB24buLKSB2w6BvIG5ow6NuIGPhu6dhIHbEg24gYuG6o24uDQogIC0gdmp1c3QgPSAyOiDEkGnhu4F1IGNo4buJbmggduG7iyB0csOtIGPhu6dhIHbEg24gYuG6o24gdGhlbyB0cuG7pWMgeSwgZOG7i2NoIGzDqm4gMiDEkcahbiB24buLIMSR4buDIHRyw6FuaCBjaOG7k25nIGzDqm4gY8OhYyBj4buZdC4NCiAgLSBjb2xvciA9ICd3aGl0ZScgOiBUaGnhur90IGzhuq1wIG3DoHUgc+G6r2MgY+G7p2EgdsSDbiBi4bqjbiBsw6AgxJFlbi4NCiAgLSBsYWJzKHggPSAnTG/huqFpJyk6IE5ow6NuIGNobyB0cuG7pWMgeCBsw6AgIkxv4bqhaSIuDQogIC0gbGFicyh5ID0gJ8SQ4buZIMSRYSBk4bqhbmcnKTogTmjDo24gY2hvIHRy4bulYyB5IGzDoCAiVHJ1bmcgYsOsbmgiLg0KICAtIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gxJHhu5kgxJFhIGThuqFuZyBjYXJhdCB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MgbMOgICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgxJHhu5kgxJFhIGThuqFuZyBjYXJhdCB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyIuDQoNCi0gTmjhuq1uIHjDqXQ6IA0KQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgbG/huqFpIGPDsyBwaMawxqFuZyBzYWkgY2FvIG5o4bqldCBsw6Ag4bufIGxv4bqhaSBraW0gY8awxqFuZyBGYWlyIHbDoCBQcmVtaXVtICgwLjI3KS4gU2F1IMSRw7MgbMOgIEdvb2QgdsOgIFZlcnkgR29vZCAoMC4yMSkuIFbDoCB44bq/cCBjdeG7kWkgY8O5bmcgduG7m2kgSWRlYWwgY8OzIMSR4buZIGJp4bq/biDEkeG7mW5nIGNhcmF0IHRo4bqlcCBuaOG6pXQgKDAuMTkpLiBOZ2/DoGkgcmEgc+G7sSBjaMOqbmggbOG7h2NoIGdp4buvYSBjw6FjIHBoxrDGoW5nIHNhaSBsw6Aga2jDtG5nIMSRw6FuZyBr4buDLiBCw6puIGPhuqFuaCDEkcOzIGJp4buDdSDEkeG7kyBjw7JuIGNobyB0aOG6pXkgc+G7sSB0xINuZyBnaeG6o20ga2jDtG5nIMSR4buTbmcgxJHhu4F1IHbhu4EgcGjGsMahbmcgc2FpIGPhu6dhIGPDoWMgbG/huqFpLiANCg0KDQojIyBCaeG7g3UgxJHhu5MgNzogDQpgYGB7cn0NCmJkNyA8LSBkaWFtb25kcw0KYmQ3ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobWVkID0gbWVkaWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG1lZCkpICsNCiAgICBnZW9tX2NvbChmaWxsPSdwdXJwbGUnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG1lZCksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdUcnVuZyB24buLJywgdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiB0cnVuZyB24buLIGdpw6EgdGhlbyBsb+G6oWkga2ltIGPGsMahbmciKQ0KYGBgDQoNCi0gVuG7gSBt4bq3dCBr4bu5IHRodeG6rXQ6IA0KICAtIGdyb3VwX2J5KGN1dCk6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gYmnhur9uIGN1dCAobG/huqFpIGtpbSBjxrDGoW5nKS4NCiAgLSBzdW1tYXJpc2UobWVkID0gbWVkaWFuKHByaWNlKSk6IFTDrW5oIHRvw6FuIHRydW5nIHbhu4sgKG1lZGlhbikgY+G7p2EgYmnhur9uIHByaWNlIGNobyBt4buXaSBuaMOzbSB2w6AgbMawdSBr4bq/dCBxdeG6oyB2w6BvIGJp4bq/biBt4bubaSBtZWQgKHRydW5nIGLDrG5oKS4NCiAgLSBhZXMoY3V0LG1lZCk6IMOBbmggeOG6oSBiaeG6v24gY3V0IChsb+G6oWkpIHbDoG8gdHLhu6VjIHggdsOgIGJp4bq/biBtZWQgKHRydW5nIHbhu4spIHbDoG8gdHLhu6VjIHkgY+G7p2EgYmnhu4N1IMSR4buTLg0KICAtIGFlcyhsYWJlbCA9IG1lZCk6IEfDoW4gZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gbWVkICh0cnVuZyB24buLKSB2w6BvIG5ow6NuIGPhu6dhIHbEg24gYuG6o24uDQogIC0gdmp1c3QgPSAyOiDEkGnhu4F1IGNo4buJbmggduG7iyB0csOtIGPhu6dhIHbEg24gYuG6o24gdGhlbyB0cuG7pWMgeSwgZOG7i2NoIGzDqm4gMiDEkcahbiB24buLIMSR4buDIHRyw6FuaCBjaOG7k25nIGzDqm4gY8OhYyBj4buZdC4NCiAgLSBjb2xvciA9ICdibGFjaycgOiBUaGnhur90IGzhuq1wIG3DoHUgc+G6r2MgY+G7p2EgdsSDbiBi4bqjbiBsw6AgxJFlbi4NCiAgLSBsYWJzKHggPSAnTG/huqFpJyk6IE5ow6NuIGNobyB0cuG7pWMgeCBsw6AgIkxv4bqhaSIuDQogIC0gbGFicyh5ID0gJ1RydW5nIGLDrG5oJyk6IE5ow6NuIGNobyB0cuG7pWMgeSBsw6AgIlRydW5nIGLDrG5oIi4NCiAgLSB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIGNhcmF0IHRoZW8gbG/huqFpIGtpbSBjxrDGoW5nIjogVGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyBsw6AgIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB0cnVuZyBiw6xuaCBjYXJhdCB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyIuDQogIA0KLSBOaOG6rW4geMOpdDogDQpUcnVuZyB24buLIGzDoCBnacOhIHRy4buLIG3DoCA1MCUgc+G7kSBraW0gY8awxqFuZyBjw7MgZ2nDoSBjYW8gaMahbiB2w6AgNTAlIHPhu5Ega2ltIGPGsMahbmcgY8OzIGdpw6EgdGjhuqVwIGjGoW4uIFRyb25nIGJp4buDdSDEkeG7kywgdHJ1bmcgduG7iyDEkcaw4bujYyB0aOG7gyBoaeG7h24gYuG6sW5nIMSRxrDhu51uZyBr4bq7IG5nYW5nIG3DoHUgxJFlbiB0csOqbiBt4buXaSBj4buZdC4NClbDrSBk4bulLCB0cnVuZyB24buLIGPhu6dhIGxv4bqhaSAiR29vZCIgbMOgIDMwNTAuNSwgbmdoxKlhIGzDoCA1MCUgc+G7kSBraW0gY8awxqFuZyBsb+G6oWkgIkdvb2QiIGPDsyBnacOhIGNhbyBoxqFuIDMwNTAuNSB2w6AgNTAlIGPDsyBnacOhIHRo4bqlcCBoxqFuLlRydW5nIHbhu4sgZ2nDoSBj4bunYSBraW0gY8awxqFuZyBnaeG6o20gZOG6p24gdOG7qyBsb+G6oWkgIkZhaXIiIMSR4bq/biAiSWRlYWwiLiBLaG/huqNuZyBjw6FjaCBnacOhIGdp4buvYSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBraMO0bmcgxJHhu4F1IG5oYXUuS2hv4bqjbmcgY8OhY2ggbOG7m24gbmjhuqV0IGzDoCBnaeG7r2EgIkdvb2QiIHbDoCAiSWRlYWwiICgxNDcyKS5LaG/huqNuZyBjw6FjaCBuaOG7jyBuaOG6pXQgbMOgIGdp4buvYSAiUHJlbWl1bSIgdsOgICJGYWlyIiAoOTcpLiBCaeG7g3UgxJHhu5MgY8OzIHRo4buDIGdpw7pwIG5nxrDhu51pIG11YSBzbyBzw6FuaCBnacOhIGPhuqMgZ2nhu69hIGPDoWMgbG/huqFpIGtpbSBjxrDGoW5nIGtow6FjIG5oYXUuDQoNCiMjIEJp4buDdSDEkeG7kyA4Og0KYGBge3J9DQpiZDggPC0gZGlhbW9uZHMNCmJkOCAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG0pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYnJvd24nKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLHZqdXN0ID0gMiwgY29sb3IgPSAncGluaycpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdUcnVuZyBiw6xuaCcsIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gdHJ1bmcgYsOsbmggZ2nDoSB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDogDQogIC0gZ3JvdXBfYnkoY3V0KTogTmjDs20gZOG7ryBsaeG7h3UgdGhlbyBiaeG6v24gY3V0IChsb+G6oWkga2ltIGPGsMahbmcpLg0KICAtIHN1bW1hcmlzZShtID0gbWVhbihwcmljZSkpOiBUw61uaCB0b8OhbiB0cnVuZyBiw6xuaCAobWVhbikgY+G7p2EgYmnhur9uIHByaWNlIGNobyBt4buXaSBuaMOzbSB2w6AgbMawdSBr4bq/dCBxdeG6oyB2w6BvIGJp4bq/biBt4bubaSBtICh0cnVuZyBiw6xuaCkuDQogIC0gYWVzKGN1dCxtKTogw4FuaCB44bqhIGJp4bq/biBjdXQgKGxv4bqhaSkgdsOgbyB0cuG7pWMgeCB2w6AgYmnhur9uIG1lZCAodHJ1bmcgduG7iykgdsOgbyB0cuG7pWMgeSBj4bunYSBiaeG7g3UgxJHhu5MuDQogIC0gYWVzKGxhYmVsID0gbSk6IEfDoW4gZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gbWVkICh0cnVuZyB24buLKSB2w6BvIG5ow6NuIGPhu6dhIHbEg24gYuG6o24uDQogIC0gdmp1c3QgPSAyOiDEkGnhu4F1IGNo4buJbmggduG7iyB0csOtIGPhu6dhIHbEg24gYuG6o24gdGhlbyB0cuG7pWMgeSwgZOG7i2NoIGzDqm4gMiDEkcahbiB24buLIMSR4buDIHRyw6FuaCBjaOG7k25nIGzDqm4gY8OhYyBj4buZdC4NCiAgLSBjb2xvciA9ICdwaW5rJyA6IFRoaeG6v3QgbOG6rXAgbcOgdSBz4bqvYyBj4bunYSB2xINuIGLhuqNuIGzDoCBo4buTbmcuDQogIC0gbGFicyh4ID0gJ0xv4bqhaScpOiBOaMOjbiBjaG8gdHLhu6VjIHggbMOgICJMb+G6oWkiLg0KICAtIGxhYnMoeSA9ICdUcnVuZyBiw6xuaCcpOiBOaMOjbiBjaG8gdHLhu6VjIHkgbMOgICJUcnVuZyBiw6xuaCIuDQogIC0gcm91bmQobSwyKTogbMOgbSB0csOybiBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBt4bubaSDEkeG6v24gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibg0KICAtIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gdHJ1bmcgYsOsbmggZ2nDoSB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MgbMOgICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdHJ1bmcgYsOsbmggZ2nDoSB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyIuDQogIA0KLSBOaOG6rW4geMOpdDogDQpCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGdpw6EgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyA1IGxv4bqhaSBj4bqvdDogRmFpciwgR29vZCwgVmVyeSBHb29kLCBQcmVtaXVtIHbDoCBJZGVhbC4gVHJvbmcgxJHDsyB0aOG6pXAgbmjhuqV0IGzDoCBJZGVhbCAoMzQ1Ny41NCBVU0QpIMSR4bq/biBjYW8gbmjhuqV0IGzDoCBQcmVtaXVtICg0NTg0LjI2IFVTRCkuDQpN4bupYyBjaMOqbmggbOG7h2NoIGdpw6EgdHJ1bmcgYsOsbmggZ2nhu69hIGPDoWMgbG/huqFpIGPhuq90IGzDoCDEkcOhbmcga+G7gzoNCkZhaXIgdsOgIEdvb2Q6IDQyOS45IFVTRA0KR29vZCB2w6AgVmVyeSBHb29kOiA1Mi45IFVTRA0KVmVyeSBHb29kIHbDoCBQcmVtaXVtOiA2MDIuNSBVU0QNClByZW1pdW0gdsOgIElkZWFsOiAxMTI2LjcyIFVTRA0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgbmfGsOG7nWkgbXVhIGtpbSBjxrDGoW5nIGPDsyB0aOG7gyBzbyBzw6FuaCBnacOhIGPhuqMgZ2nhu69hIGPDoWMgbG/huqFpIGPhuq90IGtow6FjIG5oYXUgxJHhu4MgxJHGsGEgcmEgbOG7sWEgY2jhu41uIHBow7kgaOG7o3AgbmjhuqV0IHbhu5tpIG5odSBj4bqndSB2w6AgbmfDom4gc8OhY2ggY+G7p2EgbcOsbmguDQpCaeG7g3UgxJHhu5MgY8WpbmcgY2hvIHRo4bqleSB0aeG7gW0gbsSDbmcgxJHhuqd1IHTGsCB2w6BvIGtpbSBjxrDGoW5nLiBLaW0gY8awxqFuZyBjw7MgY2jhuqV0IGzGsOG7o25nIGPhuq90IHThu5F0IGPDsyB0aOG7gyBnaeG7ryBnacOhIHThu5F0IGjGoW4gdsOgIGPDsyBraOG6oyBuxINuZyB0xINuZyBnacOhIHRy4buLIHRoZW8gdGjhu51pIGdpYW4uDQoNCiMjIEJp4buDdSDEkeG7kyA5Og0KYGBge3J9DQpiZDkgPC0gZGlhbW9uZHMNCmJkOSAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKHYgPSB2YXIocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyhjdXQsdikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHYsMikpLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnUGjGsMahbmcgc2FpJywgdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBwaMawxqFuZyBzYWkgduG7gSBnacOhIHRoZW8gbG/huqFpIGtpbSBjxrDGoW5nIikNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCiAgLSBncm91cF9ieShjdXQpOiBOaMOzbSBk4buvIGxp4buHdSB0aGVvIGJp4bq/biBjdXQgKGxv4bqhaSBraW0gY8awxqFuZykuDQogIC0gc3VtbWFyaXNlKHYgPSB2YXIocHJpY2UpKTogVMOtbmggdG/DoW4gxJHhu5kgxJFhIGThuqFuZyAodmFyKSBj4bunYSBiaeG6v24gcHJpY2UgY2hvIG3hu5dpIG5ow7NtIHbDoCBsxrB1IGvhur90IHF14bqjIHbDoG8gYmnhur9uIG3hu5tpIHYgKMSR4buZIMSRYSBk4bqhbmcpLg0KICAtIGFlcyhjdXQsdik6IMOBbmggeOG6oSBiaeG6v24gY3V0IChsb+G6oWkpIHbDoG8gdHLhu6VjIHggdsOgIGJp4bq/biB2ICjEkOG7mSDEkWEgZOG6oW5nKSB2w6BvIHRy4bulYyB5IGPhu6dhIGJp4buDdSDEkeG7ky4NCiAgLSBhZXMobGFiZWwgPSB2KTogR8OhbiBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBtZWQgKHRydW5nIHbhu4spIHbDoG8gbmjDo24gY+G7p2EgdsSDbiBi4bqjbi4NCiAgLSB2anVzdCA9IDI6IMSQaeG7gXUgY2jhu4luaCB24buLIHRyw60gY+G7p2EgdsSDbiBi4bqjbiB0aGVvIHRy4bulYyB5LCBk4buLY2ggbMOqbiAyIMSRxqFuIHbhu4sgxJHhu4MgdHLDoW5oIGNo4buTbmcgbMOqbiBjw6FjIGPhu5l0Lg0KICAtIGNvbG9yID0gJ3doaXRlJyA6IFRoaeG6v3QgbOG6rXAgbcOgdSBz4bqvYyBj4bunYSB2xINuIGLhuqNuIGzDoCB0cuG6r25nLg0KICAtIGxhYnMoeCA9ICdMb+G6oWknKTogTmjDo24gY2hvIHRy4bulYyB4IGzDoCAiTG/huqFpIi4NCiAgLSBsYWJzKHkgPSAnxJDhu5kgxJFhIGThuqFuZycpOiBOaMOjbiBjaG8gdHLhu6VjIHkgbMOgICJUcnVuZyBiw6xuaCIuDQogIC0gcm91bmQodiwyKTogbMOgbSB0csOybiBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBt4bubaSDEkeG6v24gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibg0KICAtIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gxJHhu5kgxJFhIGThuqFuZyBjYXJhdCB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyI6IFRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MgbMOgICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgxJHhu5kgxJFhIGThuqFuZyBjYXJhdCB0aGVvIGxv4bqhaSBraW0gY8awxqFuZyIuDQoNCi0gTmjhuq1uIHjDqXQ6IA0KQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBt4bupYyDEkeG7mSDEkWEgZOG6oW5nIHbhu4EgZ2nDoSBj4bunYSBraW0gY8awxqFuZyB0aGVvIDUgbG/huqFpOiBGYWlyLCBHb29kLCBWZXJ5IEdvb2QsIFByZW1pdW0gdsOgIElkZWFsLiBN4bupYyDEkeG7mSDEkWEgZOG6oW5nIHbhu4EgZ2nDoSB0xINuZyBk4bqnbiB04burIGxv4bqhaSBGYWlyIMSR4bq/biBJZGVhbC4gTG/huqFpIEZhaXIgY8OzIG3hu6ljIMSR4buZIMSRYSBk4bqhbmcgduG7gSBnacOhIHRo4bqlcCBuaOG6pXQuIExv4bqhaSBQcmVtaXVtIGPDsyBt4bupYyDEkeG7mSDEkWEgZOG6oW5nIHbhu4EgZ2nDoSBjYW8gbmjhuqV0LiBOZ2/DoGkgcmEgYmnhu4N1IMSR4buTIGPFqW5nIGNobyB0aOG6pXkgbeG7kWkgdMawxqFuZyBxdWFuIGdp4buvYSBsb+G6oWkga2ltIGPGsMahbmcgdsOgIGdpw6EgY+G6oy4NCg0KIyMgQmnhu4N1IMSR4buTIDEwOiANCmBgYHtyfQ0KYmQxMCA8LSBkaWFtb25kcw0KYmQxMCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShtZWQgPSBtZWRpYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LG1lZCkpICsNCiAgICBnZW9tX2NvbChmaWxsPSdwdXJwbGUnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG1lZCksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdGluaCBraGnhur90JywgeSA9ICdUcnVuZyB24buLJyx0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHRydW5nIHbhu4sgY2FyYXQgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmciKQ0KYGBgDQoNCi0gVuG7gSBt4bq3dCBr4bu5IHRodeG6rXQ6IA0KIFTGsMahbmcgdOG7sSB24bubaSBuaOG7r25nIGzhu4duaCBj4bunYSBjw6FjIGJp4buDdSDEkeG7kyB0csOqbiBtw6AgdGhheSB2w6BvIMSRw7MgdGEgxJHhu5VpIHThu6sgYmnhur9uIGN1dCB0aMOgbmggY2xhcml0eQ0KDQotIE5o4bqtbiB4w6l0OiANCiAgLSBUcnVuZyB24buLIGNhcmF0IGPhu6dhIGtpbSBjxrDGoW5nIGdp4bqjbSBk4bqnbiBraGkgxJHhu5kgdGluaCBraGnhur90IHTEg25nIGThuqduLg0KICAtIEtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgSUYgKGtow7RuZyB0w6wgduG6v3QpIGPDsyB0cnVuZyB24buLIGNhcmF0IG5o4buPIG5o4bqldCAoMC4zNSBjYXJhdCkuDQogIC0gS2ltIGPGsMahbmcgY8OzIMSR4buZIHRpbmgga2hp4bq/dCBJMSAoYmFvIHRo4buDIG7hu5lpIGLhu5kpIGPDsyB0cnVuZyB24buLIGNhcmF0IGzhu5tuIG5o4bqldCAoMS4xMiBjYXJhdCkuDQogIC0gTeG7qWMgxJHhu5kgdGhheSDEkeG7lWkgdHJ1bmcgduG7iyBjYXJhdCBraMO0bmcgxJHhu5NuZyDEkeG7gXUgZ2nhu69hIGPDoWMgY+G6pXAgxJHhu5kgdGluaCBraGnhur90Lg0KICAtIEdp4bqjbSBt4bqhbmg6DQogICAgLSBU4burIElGICgxLjEyIGNhcmF0KSB4deG7kW5nIFZTMiAoMC42MyBjYXJhdCkuDQogICAgLSBU4burIFZTMiAoMC41NyBjYXJhdCkgeHXhu5FuZyBWVlMxICgwLjM5IGNhcmF0KS4NCiAgLSBHaeG6o20gbmjhurk6DQogICAgLSBU4burIFZWUzEgKDAuMzkgY2FyYXQpIHh14buRbmcgSUYgKDAuMzUgY2FyYXQpLg0KICAgIC0gVOG7qyBWVlMyICgwLjQ0IGNhcmF0KSB4deG7kW5nIFZWUzEgKDAuMzkgY2FyYXQpLg0KQmnhu4N1IMSR4buTIG7DoHkgY8OzIHRo4buDIGjhu691IMOtY2ggY2hvIG5o4buvbmcgbmfGsOG7nWkgxJFhbmcgY8OibiBuaOG6r2MgbXVhIGtpbSBjxrDGoW5nLg0KDQojIyBCaeG7g3UgxJHhu5MgMTE6DQpgYGB7cn0NCmJkMTEgPC0gZGlhbW9uZHMNCmJkMTEgJT4lIGdyb3VwX2J5KGNsYXJpdHkpICU+JSBzdW1tYXJpc2UobSA9IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LG0pKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncmVkJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDIpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKw0KICAgIGxhYnMoeCA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1BoxrDGoW5nIHNhaScsIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcGjGsMahbmcgc2FpIGNhcmF0IHRoZW8gxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIikNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCiBUxrDGoW5nIHThu7EgduG7m2kgbmjhu69uZyBs4buHbmggY+G7p2EgY8OhYyBiaeG7g3UgxJHhu5MgdHLDqm4gbcOgIHRoYXkgdsOgbyDEkcOzIHRhIMSR4buVaSB04burIGJp4bq/biBjdXQgdGjDoG5oIGNsYXJpdHkNCg0KLSBOaOG6rW4geMOpdDogDQpUYSBjw7MgdGjhu4MgdGjhuqV5IHBoxrDGoW5nIHNhaSBj4bunYSBraW0gY8awxqFuZyB04buJIGzhu4cgbmdo4buLY2ggduG7m2kgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGNow7puZy4gVOG7qWMgbMOgIMSR4buZIGJp4bq/biDEkeG7mW5nIHbhu4EgY2FyYXQgY8OgbmcgZ2nhuqNtIGtoaSB2acOqbiBraW0gY8awxqFuZyBjw6BuZyBjw7MgxJHhu5kgdGluaCBraGnhur90IGNhby4gQ+G7pSB0aOG7gywgbG/huqFpIFZWUzEgY8OzIHBoxrDGoW5nIHNhaSB0aOG6pXAgbmjhuqV0ICgwLjUpIHbDoCBsb+G6oWkgSTEgY8OzIHBoxrDGoW5nIGNhbyBuaOG6pXQgKDEuMjgpLiBCw6puIGPhuqFuaCDEkcOzLCDEkeG7mSBjaMOqbmggbOG7h2NoIGdp4buvYSBjw6FjIHBoxrDGoW5nIHNhaSBsw6Aga2jDtG5nIMSRw6FuZyBr4buDLiANCg0KIyMgQmnhu4N1IMSR4buTIDEyOiANCmBgYHtyfQ0KYmQxMiA8LSBkaWFtb25kcw0KYmQxMiAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZSh2ID0gdmFyKGNhcmF0KSkgJT4lDQogIGdncGxvdChhZXMoY2xhcml0eSx2KSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3JlZCcpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodiwyKSksdmp1c3QgPSAyLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdGluaCBraGnhur90JywgeSA9ICdQaMawxqFuZyBzYWknLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHBoxrDGoW5nIHNhaSBjYXJhdCB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDogDQogVMawxqFuZyB04buxIHbhu5tpIG5o4buvbmcgbOG7h25oIGPhu6dhIGPDoWMgYmnhu4N1IMSR4buTIHRyw6puIG3DoCB0aGF5IHbDoG8gxJHDsyB0YSDEkeG7lWkgdOG7qyBiaeG6v24gY3V0IHRow6BuaCBjbGFyaXR5DQogDQotIE5o4bqtbiB4w6l0OiANCkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7sSDEkWEgZOG6oW5nIGPhu6dhIGvDrWNoIHRoxrDhu5tjIGtpbSBjxrDGoW5nIChjYXJhdCkgdGhlbyBjw6FjIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dCAoSUYsIFZWUzEsIFZWUzIsIFZTMSwgVlMyLCBTSTEsIFNJMiwgSTEpLg0KROG7ryBsaeG7h3UgY2hvIHRo4bqleToNCklGIHbDoCBWVlMxIGPDsyDEkeG7mSDEkWEgZOG6oW5nIGNhcmF0IHRo4bqlcCBuaOG6pXQuDQpJMSAoY8OzIG5oaeG7gXUgdOG6oXAgY2jhuqV0IG5o4bqldCkgY8OzIMSR4buZIMSRYSBk4bqhbmcgY2FyYXQgY2FvIG5o4bqldC4NCkPDoWMgY+G6pXAgxJHhu5kgdGluaCBraGnhur90IGtow6FjIGPDsyDEkeG7mSDEkWEgZOG6oW5nIGNhcmF0IG7hurFtIGdp4buvYSBoYWkgbeG7qWMgdHLDqm4uDQoNCiMjIEJp4buDdSDEkeG7kyAxMzogDQpgYGB7cn0NCmJkMTMgPC0gZGlhbW9uZHMNCmJkMTMgJT4lIGdyb3VwX2J5KGNsYXJpdHkpICU+JSBzdW1tYXJpc2UobWVkID0gbWVkaWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoY2xhcml0eSxtZWQpKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncHVycGxlJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBtZWQpLHZqdXN0ID0gMiwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnVHJ1bmcgduG7iycsIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gdHJ1bmcgduG7iyBnacOhIHRoZW8gxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIikNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCiBUxrDGoW5nIHThu7EgduG7m2kgbmjhu69uZyBs4buHbmggY+G7p2EgY8OhYyBiaeG7g3UgxJHhu5MgdHLDqm4gbcOgIHRoYXkgdsOgbyDEkcOzIHRhIMSR4buVaSB04burIGJp4bq/biBjdXQgdGjDoG5oIGNsYXJpdHkNCg0KLSBOaOG6rW4geMOpdDogDQpCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRydW5nIHbhu4sgZ2nDoSBj4bunYSBraW0gY8awxqFuZyB0aGVvIGPhuqVwIMSR4buZIMSR4buZIHRpbmgga2hp4bq/dCwgdOG7qyB0aOG6pXAgKEkxKSDEkeG6v24gY2FvIChJRikuDQpHacOhIHRy4buLIHRydW5nIHbhu4sgZ2nhuqNtIGThuqduIHThu6sgU0kyIMSR4bq/biBJRiwgY2hvIHRo4bqleSBraW0gY8awxqFuZyBjw7MgxJHhu5kgdGluaCBraGnhur90IGNhbyBjw7MgZ2nDoSB0cuG7iyBjYW8gaMahbi4NCk3hu6ljIGdp4bqjbSBnacOhIHRy4buLIHRydW5nIHbhu4sgZ2nhu69hIGPDoWMgY+G6pXAgxJHhu5kga2jDtG5nIMSR4buTbmcgxJHhu4F1Og0KVMSDbmcgbeG6oW5oIHThu6sgSTEgxJHhur9uIFNJMi4NCkdp4bqjbSBuaOG6uSB04burIFNJMSDEkeG6v24gVlMyLg0KR2nhuqNtIGThuqduIHThu6sgVlMxIMSR4bq/biBJRi4NCg0KIyMgQmnhu4N1IMSR4buTIDE0Og0KYGBge3J9DQpiZDE0IDwtIGRpYW1vbmRzDQpiZDE0ICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoY2xhcml0eSxtKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3B1cnBsZScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwwKSksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdGluaCBraGnhur90JywgeSA9ICdUcnVuZyBiw6xuaCcsdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiB0cnVuZyBiw6xuaCBnacOhIHRoZW8gxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nIikNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCiBUxrDGoW5nIHThu7EgduG7m2kgbmjhu69uZyBs4buHbmggY+G7p2EgY8OhYyBiaeG7g3UgxJHhu5MgdHLDqm4gbcOgIHRoYXkgdsOgbyDEkcOzIHRhIMSR4buVaSB04burIGJp4bq/biBjdXQgdGjDoG5oIGNsYXJpdHkNCg0KLSBOaOG6rW4geMOpdDogDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBt4buRaSBsacOqbiBo4buHIHThu4kgbOG7hyBuZ2jhu4tjaCBnaeG7r2EgxJHhu5kgdGluaCBraGnhur90IHbDoCBnacOhIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nLg0KR2nDoSB0cnVuZyBiw6xuaCBnaeG6o20gZOG6p24gdOG7qyBTSTIgxJHhur9uIElGOg0KVlMyIHbDoCBTSTEgY8OzIGdpw6EgZ+G6p24gbmjGsCB0xrDGoW5nIMSRxrDGoW5nLg0KVlZTMSB2w6AgVlZTMiBjw7MgZ2nDoSBn4bqnbiBuaGF1LCBjYW8gaMahbiBWUzEgdsOgIFZTMi4NClNJMiBjw7MgdHJ1bmcgYsOsbmggZ2nDoSBjYW8gbmjhuqV0LCB0aOG6pXAgbmjhuqV0IGzDoCBWVlMxLg0KU+G7sSBjaMOqbmggbOG7h2NoIGdpw6EgZ2nhu69hIGPDoWMgY+G6pXAgxJHhu5kgdGluaCBraGnhur90IGdp4bqjbSBk4bqnbiBraGkgxJHhu5kgdGluaCBraGnhur90IHTEg25nDQoNCiMjIEJp4buDdSDEkeG7kyAxNToNCmBgYHtyfQ0KYmQxNSA8LSBkaWFtb25kcw0KYmQxNSAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZSh2ID0gdmFyKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoY2xhcml0eSx2KSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3JlZCcpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodiwwKSksdmp1c3QgPSAyLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdGluaCBraGnhur90JywgeSA9ICdQaMawxqFuZyBzYWknLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHBoxrDGoW5nIHNhaSB24buBIGdpw6EgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmciKQ0KYGBgDQoNCi0gVuG7gSBt4bq3dCBr4bu5IHRodeG6rXQ6IA0KIFTGsMahbmcgdOG7sSB24bubaSBuaOG7r25nIGzhu4duaCBj4bunYSBjw6FjIGJp4buDdSDEkeG7kyB0csOqbiBtw6AgdGhheSB2w6BvIMSRw7MgdGEgxJHhu5VpIHThu6sgYmnhur9uIGN1dCB0aMOgbmggY2xhcml0eQ0KDQotIE5o4bqtbiB4w6l0OiANCkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyDhu58gbeG7l2kgY+G6pXAgxJHhu5kgdGluaCBraGnhur90LCDEkcaw4bujYyBjaGlhIHRow6BuaCA3IGPhuqVwOklGLCBWVlMxLCBWVlMyLCBWUzEsIFZTMiwgU0kxLCBTSTIsIEkxLg0KQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHLDtSByw6BuZyB24buBIMSR4buZIMSRYSBk4bqhbmcgduG7gSBnacOhIGdp4buvYSBjw6FjIGPhuqVwIMSR4buZIHRpbmgga2hp4bq/dC4NCk5ow6xuIGNodW5nLCBj4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QgY8OgbmcgY2FvLCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDoG5nIMOtdCB2w6AgZ2nDoSBjxaluZyBraMOhIMSRYSBk4bqhbmcuDQpD4bulIHRo4buDOg0KSUYgKEludGVybmFsbHkgRmxhd2xlc3MpIGPDsyDEkeG7mSDEkWEgZOG6oW5nIHbhu4EgZ2nDoSBjYW8uDQrDnSBuZ2jEqWE6DQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSB04bqnbSBxdWFuIHRy4buNbmcgY+G7p2EgxJHhu5kgdGluaCBraGnhur90IHRyb25nIHZp4buHYyDEkeG7i25oIGdpw6Ega2ltIGPGsMahbmcuDQoNCiMjIEJp4buDdSDEkeG7kyAxNjoNCmBgYHtyfQ0KYmQxNiA8LSBkaWFtb25kcw0KYmQxNiAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobWVkID0gbWVkaWFuKGNhcmF0KSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbWVkKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3B1cnBsZScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbWVkKSx2anVzdCA9IDIsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1RydW5nIHbhu4snLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHRydW5nIHbhu4sgY2FyYXQgdGhlbyBtw6B1IGPhu6dhIGtpbSBjxrDGoW5nIikNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCiBUxrDGoW5nIHThu7EgduG7m2kgbmjhu69uZyBs4buHbmggY+G7p2EgY8OhYyBiaeG7g3UgxJHhu5MgdHLDqm4gbcOgIHRoYXkgdsOgbyDEkcOzIHRhIMSR4buVaSB04burIGJp4bq/biBjdXQgdGjDoG5oIGNvbG9yDQoNCi0gTmjhuq1uIHjDqXQ6IA0KVHJvbmcgYmnhu4N1IMSR4buTLCB0YSBjw7MgdGjhu4MgZOG7hSBkw6BuZyB0aOG6pXkga2ltIGPGsMahbmcgbcOgdSBKIGPDsyB0cnVuZyB24buLIGNhcmF0IGNhbyBuaOG6pXQgKDEuMTEpLCB0aOG6pXAgbmjhuqV0IGzDoCBtw6B1IEQgdsOgIEUgKDAuNTMpLiBUcnVuZyB24buLIGPFqW5nIHTEg25nIGThuqduIHRoZW8gdGjhu6kgdOG7sSB0w6puIGPhu6dhIGPDoWMgbcOgdS4gTmdvw6BpIHJhIHRow6wgxJHhu5kgY2jDqm5oIGzhu4djaCBnaeG7r2EgY8OhYyB0cnVuZyB24buLIGtow7RuZyBs4bubbiBjaOG7iSBraG/huqNuZyAwLjIuIEThu7FhIHbDoG8gbmjhu69uZyBuaOG6rW4geMOpdCB0csOqbiwgdGEgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgbcOgdSBz4bqvYyB2w6Aga8OtY2ggdGjGsOG7m2MgY2FyYXQgY+G7p2Ega2ltIGPGsMahbmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgbmjhuqV0IMSR4buLbmguICANCg0KIyMgQmnhu4N1IMSR4buTIDE3OiANCmBgYHtyfQ0KYmQxNyA8LSBkaWFtb25kcw0KYmQxNyAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobSA9IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyhjb2xvcixtKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3JlZCcpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksdmp1c3QgPSAyLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdGluaCBraGnhur90JywgeSA9ICdQaMawxqFuZyBzYWknLCB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIGNhcmF0IHRoZW8gbcOgdSBj4bunYSBraW0gY8awxqFuZyIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDogDQogVMawxqFuZyB04buxIHbhu5tpIG5o4buvbmcgbOG7h25oIGPhu6dhIGPDoWMgYmnhu4N1IMSR4buTIHRyw6puIG3DoCB0aGF5IHbDoG8gxJHDsyB0YSDEkeG7lWkgdOG7qyBiaeG6v24gY3V0IHRow6BuaCBjb2xvcg0KIA0KLSBOaOG6rW4geMOpdDogDQpDw7MgdGjhu4MgZOG7hSBkw6BuZyBuaOG6rW4gdGjhuqV5IGtpbSBjxrDGoW5nIG3DoHUgSiBjw7MgdHJ1bmcgYsOsbmhiw6xuaCBjYXJhdCBjYW8gbmjhuqV0ICgxLjE2KSB2w6AgdGjhuqVwIG5o4bqldCBsw6Aga2ltIGPGsMahbmcgbcOgdSBEIHbhu5tpIEUgY8OzIHRydW5nIGLDrG5oIGNhcmF0IHRo4bqlcCBuaOG6pXQgKDAuNjYpLiBCw6puIGPhuqFuaCDEkcOzIMSR4buZIGNow6puaCBs4buHY2ggdHJ1bmcgYsOsbmggZ2nhu69hIGPDoWMgbcOgdSBsw6Aga2jDtG5nIHF1w6Egbmhp4buBdSAofiAwLjIpLiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIGfhu6NpIMO9IMSR4bq/biB2aeG7h2MgY8OzIHPhu7EgY8OibiBuaOG6r2MgY+G6qW4gdGjhuq1uIHRyb25nIHZp4buHYyBjaOG7jW4gbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZywga2jDtG5nIGNo4buJIGThu7FhIHbDoG8gdHJ1bmcgYsOsbmggY2FyYXQgbcOgIGPDsm4gY+G6p24geGVtIHjDqXQgc+G7sSDEkWEgZOG6oW5nIHRyb25nIGvDrWNoIHRoxrDhu5tjIGPhu6dhIGNow7puZy4gDQoNCiMjIEJp4buDdSDEkeG7kyAxODogDQpgYGB7cn0NCmJkMTggPC0gZGlhbW9uZHMNCmJkMTggJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKHYgPSB2YXIoY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyhjb2xvcix2KSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3JlZCcpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodiwyKSksdmp1c3QgPSAyLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHggPSAnUGjGsMahbmcgc2FpJywgeSA9ICfEkOG7mSDEkWEgZOG6oW5nJywgdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiDEkeG7mSDEkWEgZOG6oW5nIGNhcmF0IHRoZW8gbcOgdSBj4bunYSBraW0gY8awxqFuZyIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDogDQogVMawxqFuZyB04buxIHbhu5tpIG5o4buvbmcgbOG7h25oIGPhu6dhIGPDoWMgYmnhu4N1IMSR4buTIHRyw6puIG3DoCB0aGF5IHbDoG8gxJHDsyB0YSDEkeG7lWkgdOG7qyBiaeG6v24gY3V0IHRow6BuaCBjb2xvcg0KDQotIE5o4bqtbiB4w6l0OiANCkPDsyB0aOG7gyBk4buFIGTDoG5nIG5o4bqtbiB0aOG6pXkga2ltIGPGsMahbmcgbcOgdSBKIGPDsyBwaMawxqFuZyBzYWkgY2FyYXQgY2FvIG5o4bqldCAoMC4zNSkgdOG7qWMgbMOgIMSR4buZIGJp4bq/biDEkeG7mW5nIHbhu4EgdHLhu41uZyBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyDhu58gbeG7qWMgY2FvIG5o4bqldCB2w6AgdGjhuqVwIG5o4bqldCBsw6Aga2ltIGPGsMahbmcgbcOgdSBEIHbhu5tpIEUgY8OzIHBoxrDGoW5nIHNhaSBjYXJhdCB0aOG6pXAgbmjhuqV0ICgwLjY2KS4gQsOqbiBj4bqhbmggxJHDsywgxJHhu5kgY2jDqm5oIGzhu4djaCBnaeG7r2EgY8OhYyBwaMawxqFuZyBzYWkgKMSR4buZIGJp4bq/biDEkeG7mW5nKSBraMO0bmcgY2FvLCB0dXkgbmhpw6puIGPDsyBz4buxIHTEg25nIG3huqFuaCBnaeG7r2EgaGFpIGPhu5l0IEcgdsOgIEguIA0KDQoNCiMjIEJp4buDdSDEkeG7kyAxOTogDQpgYGB7cn0NCmJkMTkgPC0gZGlhbW9uZHMNCmJkMTkgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG1lZCA9IG1lZGlhbihwcmljZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKGNvbG9yLG1lZCkpICsNCiAgICBnZW9tX2NvbChmaWxsPSdwdXJwbGUnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG1lZCksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdGluaCBraGnhur90JywgeSA9ICdUcnVuZyB24buLJywgdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiB0cnVuZyB24buLIGdpw6EgdGhlbyBtw6B1IGPhu6dhIGtpbSBjxrDGoW5nIikNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCiBUxrDGoW5nIHThu7EgduG7m2kgbmjhu69uZyBs4buHbmggY+G7p2EgY8OhYyBiaeG7g3UgxJHhu5MgdHLDqm4gbcOgIHRoYXkgdsOgbyDEkcOzIHRhIMSR4buVaSB04burIGJp4bq/biBjdXQgdGjDoG5oIGNvbG9yDQoNCi0gTmjhuq1uIHjDqXQ6IA0KS2ltIGPGsMahbmcgbcOgdSBKIGPDsyB0cnVuZyB24buLIHbhu4EgZ2nDoSBjYW8gbmjhuqV0ICg0MjM0KSB2w6AgdGjhuqVwIG5o4bqldCB24bubaSBtw6B1IEUgKDE3MzkpLiBRdWEgYmnhu4N1IMSR4buTIGPDsyB0aOG7gyB0aOG6pXkgc+G7sSB0xINuZyBnaeG6o20gdHJ1bmcgduG7iyBjYXJhdCBnaeG7r2EgY8OhYyBsb+G6oWkgbcOgdSBraMO0bmcgxJHhu5NuZyDEkeG7gXUuIE5nb8OgaSByYSBjw7MgxJHhu5kgY2jDqm5oIGzhu4djaCBraMOhIGzhu5tuIGdp4buvYSBraW0gY8awxqFuZyBtw6B1IEkgdsOgIEogaG/hurdjIGdp4buvYSBraW0gY8awxqFuZyBtw6B1IEYgdsOgIEcsIGPDsm4gbOG6oWkgxJHhu5kgY2jDqm5oIGzhu4djaCBsw6Aga2jDtG5nIMSRw6FuZyBr4buDLiANCg0KDQojIyBCaeG7g3UgxJHhu5MgMjA6DQpgYGB7cn0NCmJkMjA8LSBkaWFtb25kcw0KYmQyMCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobSA9IG1lYW4ocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyhjb2xvcixtKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J3B1cnBsZScpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwwKSksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnxJDhu5kgdGluaCBraGnhur90JywgeSA9ICdUcnVuZyBiw6xuaCcsIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gdHJ1bmcgYsOsbmggZ2nDoSB0aGVvIG3DoHUgY+G7p2Ega2ltIGPGsMahbmciKQ0KYGBgDQoNCi0gVuG7gSBt4bq3dCBr4bu5IHRodeG6rXQ6IA0KIFTGsMahbmcgdOG7sSB24bubaSBuaOG7r25nIGzhu4duaCBj4bunYSBjw6FjIGJp4buDdSDEkeG7kyB0csOqbiBtw6AgdGhheSB2w6BvIMSRw7MgdGEgxJHhu5VpIHThu6sgYmnhur9uIGN1dCB0aMOgbmggY29sb3INCg0KLSBOaOG6rW4geMOpdDogDQpUcnVuZyBiw6xuaCB24buBIGdpw6EgY+G7p2Ega2ltIGPGsMahbmcgbcOgdSBKIGzDoCBjYW8gbmjhuqV0ICg1MzI0KSB2w6AgdGjhuqVwIG5o4bqldCBsw6AgbcOgdSBFICgzMDc3KS4gQ8OzIHRo4buDIHRo4bqleSBz4buxIHTEg25nIGThuqduIHbhu4EgdHJ1bmcgYsOsbmggZ2nDoSB0aGVvIHRo4bupIHThu7EgbcOgdSBj4bunYSBraW0gY8awxqFuZyB24bubaSDEkeG7mSBjaMOqbmggbOG7h2NoIGzDoCBraMO0bmcgcXXDoSBuaGnhu4F1LiBW4bubaSBiaeG7g3UgxJHhu5MgbsOgeSwga2hpIHRp4bq/biBow6BuaCBjaOG7jW4gbOG7sWEgbXVhIGtpbSBjxrDGoW5nIHRhIGPFqW5nIGPDsyB0aOG7gyBk4buFIGTDoG5nIMSRxrBhIHJhIMSRw6FuaCBnacOhIHbDoCBxdXnhur90IMSR4buLbmggaMahbi4gDQoNCiMjIEJp4buDdSDEkeG7kyAyMToNCmBgYHtyfQ0KYmQyMSA8LSBkaWFtb25kcw0KYmQyMSAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UodiA9IHZhcihwcmljZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKGNvbG9yLHYpKSArDQogICAgZ2VvbV9jb2woZmlsbD0ncmVkJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZCh2LDApKSx2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKw0KICAgIGxhYnMoeCA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1BoxrDGoW5nIHNhaScsIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcGjGsMahbmcgc2FpIHbhu4EgZ2nDoSB0aGVvIG3DoHUgY+G7p2Ega2ltIGPGsMahbmciKQ0KYGBgDQoNCi0gVuG7gSBt4bq3dCBr4bu5IHRodeG6rXQ6IA0KIFTGsMahbmcgdOG7sSB24bubaSBuaOG7r25nIGzhu4duaCBj4bunYSBjw6FjIGJp4buDdSDEkeG7kyB0csOqbiBtw6AgdGhheSB2w6BvIMSRw7MgdGEgxJHhu5VpIHThu6sgYmnhur9uIGN1dCB0aMOgbmggY29sb3INCg0KLSBOaOG6rW4geMOpdDogDQpUYSBjw7MgdGjhu4MgdGjhuqV5IHPhu7EgYmnhur9uIMSR4buZbmcgduG7gSBnacOhIHThuqFpIGtpbSBjxrDGoW5nIG3DoHUgSSBsw6AgY2FvIG5o4bqldCAoMjIzMDA5NDUpIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCB24bubaSBraW0gY8awxqFuZyBtw6B1ICgxMTI2NjcwMykuIMSQ4buZIGNow6puaCBs4buHY2ggY+G7p2Egc+G7sSBiaeG6v24gxJHhu5luZyB24buBIGdpw6EgZ2nhu69hIGtpbSBjxrDGoW5nIG3DoHUgRCB2w6AgRSBsw6Aga2jDtG5nIMSRw6FuZyBr4buDIGfhuqduIG5oxrAgYuG6sW5nIG5oYXUsIHRyb25nIMSRw7MgxJHhu5kgY2jDqm5oIGzhu4djaCBuaGnhu4F1IG5o4bqldCBsw6AgZ2nhu69hIG3DoHUgSCB2w6AgSS4gxJDDonkgbMOgIGJp4buDdSDEkeG7kyB24buBIMSR4buZIGJp4bq/biDEkeG7mW5nIHbhu4EgZ2nDoSBj4bunYSBraW0gY8awxqFuZyB0aGVvIG3DoHUsIGRvIMSRw7Mgw610IG5oaeG7gXUgdGEgY8WpbmcgZOG7hSBkw6BuZyDEkcawYSByYSBxdXnhur90IMSR4buLbmggbXVhIGjDoG5nIGjGoW4gc2F1IGtoaSBjw7MgxJHGsOG7o2MgdGjDtG5nIHRpbiB04burIGJp4buDdSDEkcOyLiANCg0KIyMgQmnhu4N1IMSR4buTIDIyOg0KYGBge3J9DQpiZDIyIDwtIGRpYW1vbmRzDQpsaWJyYXJ5KHNjYWxlcykNCmJkMjIgJT4lIGdyb3VwX2J5KGN1dCxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbikpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScsIGZpbGwgPSAnd2hpdGUnKSArDQogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAtMSwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDoNCiAgLSBncm91cF9ieShjdXQsIGNvbG9yKTogSMOgbSBuw6B5IG5ow7NtIGPDoWMgaMOgbmcgdHJvbmcgYmQyMiB0aGVvIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBoYWkgY+G7mXQ6ICJjdXQiIChsb+G6oWkgY+G6r3QpIHbDoCAiY29sb3IiIChtw6B1IHPhuq9jKS4gxJBp4buBdSBuw6B5IGdp4buRbmcgbmjGsCB2aeG7h2Mgc+G6r3AgeOG6v3AgZOG7ryBsaeG7h3UgdGhlbyB04burbmcgbG/huqFpIGPhuq90IHbDoCBtw6B1IHPhuq9jLg0KICAtIHN1bW1hcmlzZShuID0gbigpKTogSMOgbSBuw6B5IHTDrW5oIHThuqduIHN14bqldCAoc+G7kSBsxrDhu6NuZykgY+G7p2EgY8OhYyBxdWFuIHPDoXQgdHJvbmcgbeG7l2kgbmjDs20gxJHGsOG7o2MgdOG6oW8gcmEg4bufIGLGsOG7m2MgdHLGsOG7m2MuIEvhur90IHF14bqjIGPhu6dhIHBow6lwIHTDrW5oIG7DoHkgxJHGsOG7o2MgbMawdSB2w6BvIG3hu5l0IGPhu5l0IG3hu5tpIGPDsyB0w6puICJuIi4NCiAgLSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSk6IETDsm5nIGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCAoZ2dwbG90KSBi4bqxbmcgY8OhY2ggw6FuaCB44bqhIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCAiY3V0IiBsw6puIHRy4bulYyBob8OgbmggKHgpIHbDoCBnacOhIHRy4buLIGPhu6dhIGPhu5l0ICJuIiAoc+G7kSBsxrDhu6NuZykgbMOqbiB0cuG7pWMgdHVuZyAoeSkuDQogIC0gcG9zaXRpb24gPSAnZG9kZ2UnICh0w7l5IGNo4buNbiBi4buRIGPhu6VjKTogVGhp4bq/dCBs4bqtcCBuw6B5IMSR4bqjbSBi4bqjbyBjw6FjIGPhu5l0IMSRxrDhu6NjIHPhuq9wIHjhur9wIGPhuqFuaCBuaGF1IHRoZW8gdOG7q25nIG5ow7NtIChsb+G6oWkgY+G6r3QpLCB0csOhbmggY2jhu5NuZyBjaMOpbyBsw6puIG5oYXUuDQogIC0gZmlsbCA9ICd3aGl0ZScgKHTDuXkgY2jhu41uIG3DoHUgc+G6r2MpOiBUaGnhur90IGzhuq1wIG7DoHkgdMO0IG3DoHUgdHLhuq9uZyBjaG8gY8OhYyBj4buZdC4NCiAgLSBmYWNldF93cmFwKH5jb2xvcik6IEjDoG0gbsOgeSB04bqhbyByYSBt4buZdCBi4buRIGPhu6VjIG5oaeG7gXUgYmnhu4N1IMSR4buTLCBt4buXaSBiaeG7g3UgxJHhu5MgxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZy4gQmnhu4N1IMSR4buTIMSRxrDhu6NjIHPhuq9wIHjhur9wIHRoZW8gY8OhYyBtw6B1IHPhuq9jIGtow6FjIG5oYXUuDQogIC0gYWVzKGxhYmVsID0gbik6IFRoaeG6v3QgbOG6rXAgbsOgeSB4w6FjIMSR4buLbmggbmjDo24gbMOgIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgIm4iIChz4buRIGzGsOG7o25nKS4NCiAgLSB2anVzdCA9IC0xICh0w7l5IGNo4buNbiBjxINuIGNo4buJbmgpOiBUaGnhur90IGzhuq1wIG7DoHkgxJFp4buBdSBjaOG7iW5oIHbhu4sgdHLDrSBk4buNYyBj4bunYSBjw6FjIG5ow6NuLCDEkeG6t3QgY2jDum5nIGjGoWkgdGjhuqVwIGjGoW4gc28gduG7m2kgxJHhu4luaCBj4bunYSBjw6FjIGPhu5l0Lg0KICAtIGNvbG9yID0gJ2JsYWNrJyAodMO5eSBjaOG7jW4gbcOgdSBz4bqvYyk6IFRoaeG6v3QgbOG6rXAgbsOgeSB0w7QgbcOgdSDEkWVuIGNobyBjw6FjIG5ow6NuLg0KbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpOiBIw6NtIG7DoHkgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgaG/DoG5oICgiTG/huqFpIikgdsOgIHRy4bulYyB0dW5nICgiU+G7kSBsxrDhu6NuZyIpLg0KDQotIE5o4bqtbiB4w6l0OiANCg0KVuG7m2kgdOG7lW5nIHPhu5EgNyBtw6B1IHPhuq9jIGPDuW5nIHbhu5tpIDUgbG/huqFpLCB0YSBjw7MgdGjhu4MgdGjhuqV5IDcgYmnhu4N1IMSR4buTIHTGsMahbmcg4bupbmcgduG7m2kgdOG7q25nIG3DoHUgc+G6r2MgdsOgIG3hu5dpIG3DoHUgc+G6r2MgY8OzIHPhu5EgbMaw4bujbmcgbG/huqFpIGPhu6UgdGjhu4MNCg0KTmjDrG4gc8ahIHF1YSBjw7MgdGjhu4MgZOG7hSBkw6BuZyBuaOG6rW4gdGjhuqV5IGPhuqMgNyBtw6B1IMSR4buBdSBjw7MgbG/huqFpIElkZWFsIGNhbyBuaOG6pXQgdsOgIEZhaXIgw610IG5o4bqldA0KDQpW4bubaSBsb+G6oWkgSWRlYWwsIG3DoHUgRyBjw7Mgc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCAoNDg4NCkgdsOgIG3DoHUgSiBjw7Mgc+G7kSBsxrDhu6NuZyB0aOG6pXAgbmjhuqV0ICg4OTYpICANCg0KVuG7m2kgbeG7qWMgUHJlbWl1bSB2w6AgVmVyeSBHb29kLCBjw6FjIG3DoHUgxJHhu4F1IGPDsyBz4buRIGzGsOG7o25nIGtow7RuZyBxdcOhIGNow6puaCBs4buHY2gsIHThuqV0IGPhuqMgxJHhu4F1IOG7nyBt4bupYyB0cnVuZyBiw6xuaCwga2jDtG5nIHF1w6Egbmhp4buBdSB2w6AgY8Wpbmcga2jDtG5nIHF1w6Egw610DQoNClbhu5tpIG3hu6ljIEdvb2QgdsOgIEZhaXIsIHPhu5EgbMaw4bujbmcgw610IGjGoW4gaOG6s24gY8OhYyBt4bupYyBjw7JuIGzhuqFpLCBz4buxIGNow6puaCBs4buHY2ggduG7m2kgbeG7qWMgSWRlYWwgbMOgIHF1w6EgcsO1IHLhu4d0DQoNCiMjIEJp4buDdSDEkeG7kyAyMzoNCmBgYHtyfQ0KYmQyMyA8LSBkaWFtb25kcw0KYmQyMyAlPiUgZ3JvdXBfYnkoY3V0LGNsYXJpdHkpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IG4pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBmaWxsID0gJ3doaXRlJykgKw0KICAgIGZhY2V0X3dyYXAofmNsYXJpdHkpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAtMC41LCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10Og0KICAtIGdyb3VwX2J5KGN1dCwgY2xhcml0eSk6IEjDoG0gbsOgeSBuaMOzbSBjw6FjIGjDoG5nIHRyb25nIGJkMjMgdGhlbyBjw6FjIGdpw6EgdHLhu4sgY+G7p2EgaGFpIGPhu5l0OiAiY3V0IiAobG/huqFpIGPhuq90KSB2w6AgImNsYXJpdHkiICjEkeG7mSB0aW5oIGtoaeG6v3QpLiDEkGnhu4F1IG7DoHkgZ2nhu5FuZyBuaMawIHZp4buHYyBz4bqvcCB44bq/cCBk4buvIGxp4buHdSB0aGVvIHThu6tuZyBsb+G6oWkgY+G6r3QgdsOgIMSR4buZIHRpbmgga2hp4bq/dC4NCiAgLSBzdW1tYXJpc2UobiA9IG4oKSk6IEjDoG0gbsOgeSB0w61uaCB04bqnbiBzdeG6pXQgKHPhu5EgbMaw4bujbmcpIGPhu6dhIGPDoWMgcXVhbiBzw6F0IHRyb25nIG3hu5dpIG5ow7NtIMSRxrDhu6NjIHThuqFvIHJhIOG7nyBixrDhu5tjIHRyxrDhu5tjLiBL4bq/dCBxdeG6oyBj4bunYSBwaMOpcCB0w61uaCBuw6B5IMSRxrDhu6NjIGzGsHUgdsOgbyBt4buZdCBj4buZdCBt4bubaSBjw7MgdMOqbiAibiIuDQogIC0gZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpOiBEw7JuZyBs4buHbmggbsOgeSB04bqhbyByYSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgKGdncGxvdCkgYuG6sW5nIGPDoWNoIMOhbmggeOG6oSBjw6FjIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgImN1dCIgbMOqbiB0cuG7pWMgaG/DoG5oICh4KSB2w6AgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCAibiIgKHPhu5EgbMaw4bujbmcpIGzDqm4gdHLhu6VjIHR1bmcgKHkpLg0KICAtIHBvc2l0aW9uID0gJ2RvZGdlJyAodMO5eSBjaOG7jW4gYuG7kSBj4bulYyk6IFRoaeG6v3QgbOG6rXAgbsOgeSDEkeG6o20gYuG6o28gY8OhYyBj4buZdCDEkcaw4bujYyBz4bqvcCB44bq/cCBj4bqhbmggbmhhdSB0aGVvIHThu6tuZyBuaMOzbSAobG/huqFpIGPhuq90KSwgdHLDoW5oIGNo4buTbmcgY2jDqW8gbMOqbiBuaGF1Lg0KICAtIGZpbGwgPSAnd2hpdGUnICh0w7l5IGNo4buNbiBtw6B1IHPhuq9jKTogVGhp4bq/dCBs4bqtcCBuw6B5IHTDtCBtw6B1IHRy4bqvbmcgY2hvIGPDoWMgY+G7mXQuDQogIC0gZmFjZXRfd3JhcCh+Y2xhcml0eSk6IEjDoG0gbsOgeSB04bqhbyByYSBt4buZdCBi4buRIGPhu6VjIG5oaeG7gXUgYmnhu4N1IMSR4buTLCBt4buXaSBiaeG7g3UgxJHhu5MgxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIGtpbSBjxrDGoW5nLiBCaeG7g3UgxJHhu5MgxJHGsOG7o2Mgc+G6r3AgeOG6v3AgdGhlbyBjw6FjIMSR4buZIHRpbmgga2hp4bq/dCBraMOhYyBuaGF1Lg0KICAtIGFlcyhsYWJlbCA9IG4pOiBUaGnhur90IGzhuq1wIG7DoHkgeMOhYyDEkeG7i25oIG5ow6NuIGzDoCBnacOhIHRy4buLIGPhu6dhIGPhu5l0ICJuIiAoc+G7kSBsxrDhu6NuZykuDQogIC0gdmp1c3QgPSAtMSAodMO5eSBjaOG7jW4gY8SDbiBjaOG7iW5oKTogVGhp4bq/dCBs4bqtcCBuw6B5IMSRaeG7gXUgY2jhu4luaCB24buLIHRyw60gZOG7jWMgY+G7p2EgY8OhYyBuaMOjbiwgxJHhurd0IGNow7puZyBoxqFpIHRo4bqlcCBoxqFuIHNvIHbhu5tpIMSR4buJbmggY+G7p2EgY8OhYyBj4buZdC4NCiAgLSBjb2xvciA9ICdibGFjaycgKHTDuXkgY2jhu41uIG3DoHUgc+G6r2MpOiBUaGnhur90IGzhuq1wIG7DoHkgdMO0IG3DoHUgxJFlbiBjaG8gY8OhYyBuaMOjbi4NCmxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKTogSMOjbSBuw6B5IMSR4bq3dCBuaMOjbiBjaG8gdHLhu6VjIGhvw6BuaCAoIkxv4bqhaSIpIHbDoCB0cuG7pWMgdHVuZyAoIlPhu5EgbMaw4bujbmciKS4NCg0KLSBOaOG6rW4geMOpdDoNCg0KVuG7m2kgdOG7lW5nIHPhu5EgOCDEkeG7mSB0aW5oIGtoaeG6v3QgY8O5bmcgduG7m2kgNSBsb+G6oWksIHRhIGPDsyB0aOG7gyB0aOG6pXkgOCBiaeG7g3UgxJHhu5MgdMawxqFuZyDhu6luZyB24bubaSB04burbmcgxJHhu5kgdGluaCBraGnhur90IHbDoCBt4buXaSDEkeG7mSB0aW5oIGtoaeG6v3QgY8OzIHPhu5EgbMaw4bujbmcgbG/huqFpIGPhu6UgdGjhu4MNCg0KTmjDrG4gc8ahIHF1YSwgY+G6oyA4IMSR4buZIHRpbmgga2hp4bq/dCDEkWEgc+G7kSBjw7MgbG/huqFpIElkZWFsIGNoaeG6v20gY2FvIG5o4bqldCB2w6AgRmFpciDDrXQgbmjhuqV0DQoNClbhu5tpIGxv4bqhaSBJZGVhbCwgxJHhu5kgdGluaCBraGnhur90IFNJMSBjw7Mgc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCAoNDI4MikgdsOgIEkxIGPDsyBz4buRIGzGsOG7o25nIHRo4bqlcCBuaOG6pXQgKDE0NikgIA0KDQpW4bubaSBt4bupYyBQcmVtaXVtIHbDoCBWZXJ5IEdvb2QsIGPDoWMgxJHhu5kgdGluaCBraGnhur90IGPDsyBz4buRIGzGsOG7o25nIGtow6EgY2jDqm5oIGzhu4djaCBuaGF1bmhhdQ0KDQpW4bubaSBt4bupYyBHb29kIHbDoCBGYWlyLCBz4buRIGzGsOG7o25nIMOtdCBoxqFuIGjhurNuIGPDoWMgbeG7qWMgY8OybiBs4bqhaSwgc+G7sSBjaMOqbmggbOG7h2NoIHbhu5tpIG3hu6ljIElkZWFsIGzDoCBxdcOhIHLDtSBy4buHdA0KDQoNCiMjIEJp4buDdSDEkeG7kyAyNDoNCmBgYHtyfQ0KYmQyNCA8LSBkaWFtb25kcw0KYmQyNCAlPiUgZ3JvdXBfYnkoY2xhcml0eSxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHkseSA9IG4pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnLCBmaWxsID0gJ3doaXRlJykgKw0KICAgIGZhY2V0X3dyYXAofmNvbG9yKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMCwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDoNCiAgLSBncm91cF9ieShjbGFyaXR5LCBjb2xvcik6IEjDoG0gbsOgeSBuaMOzbSBjw6FjIGjDoG5nIHRyb25nIGJkMjQgdGhlbyBjw6FjIGdpw6EgdHLhu4sgY+G7p2EgaGFpIGPhu5l0OiAiY2xhcml0eSIgKMSR4buZIHRpbmgga2hp4bq/dCkgdsOgICJjb2xvciIgKG3DoHUgc+G6r2MpLiDEkGnhu4F1IG7DoHkgZ2nhu5FuZyBuaMawIHZp4buHYyBz4bqvcCB44bq/cCBk4buvIGxp4buHdSB0aGVvIHThu6tuZyDEkeG7mSB0aW5oIGtoaeG6v3QgdsOgIG3DoHUgc+G6r2MuDQogIC0gc3VtbWFyaXNlKG4gPSBuKCkpOiBIw6BtIG7DoHkgdMOtbmggdOG6p24gc3XhuqV0IChz4buRIGzGsOG7o25nKSBj4bunYSBjw6FjIHF1YW4gc8OhdCB0cm9uZyBt4buXaSBuaMOzbSDEkcaw4bujYyB04bqhbyByYSDhu58gYsaw4bubYyB0csaw4bubYy4gS+G6v3QgcXXhuqMgY+G7p2EgcGjDqXAgdMOtbmggbsOgeSDEkcaw4bujYyBsxrB1IHbDoG8gbeG7mXQgY+G7mXQgbeG7m2kgY8OzIHTDqm4gIm4iLg0KICAtIGdncGxvdChhZXMoeCA9IGNsYXJpdHksIHkgPSBuKSk6IETDsm5nIGzhu4duaCBuw6B5IHThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCAoZ2dwbG90KSBi4bqxbmcgY8OhY2ggw6FuaCB44bqhIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCAiY2xhcml0eSIgbMOqbiB0cuG7pWMgaG/DoG5oICh4KSB2w6AgZ2nDoSB0cuG7iyBj4bunYSBj4buZdCAibiIgKHPhu5EgbMaw4bujbmcpIGzDqm4gdHLhu6VjIHR1bmcgKHkpLg0KICAtIHBvc2l0aW9uID0gJ2RvZGdlJyAodMO5eSBjaOG7jW4gYuG7kSBj4bulYyk6IFRoaeG6v3QgbOG6rXAgbsOgeSDEkeG6o20gYuG6o28gY8OhYyBj4buZdCDEkcaw4bujYyBz4bqvcCB44bq/cCBj4bqhbmggbmhhdSB0aGVvIHThu6tuZyBuaMOzbSAoxJHhu5kgdGluaCBraGnhur90KSwgdHLDoW5oIGNo4buTbmcgY2jDqW8gbMOqbiBuaGF1Lg0KICAtIGZpbGwgPSAnd2hpdGUnICh0w7l5IGNo4buNbiBtw6B1IHPhuq9jKTogVGhp4bq/dCBs4bqtcCBuw6B5IHTDtCBtw6B1IHRy4bqvbmcgY2hvIGPDoWMgY+G7mXQuDQogIC0gZmFjZXRfd3JhcCh+Y29sb3IpOiBIw6BtIG7DoHkgdOG6oW8gcmEgbeG7mXQgYuG7kSBj4bulYyBuaGnhu4F1IGJp4buDdSDEkeG7kywgbeG7l2kgYmnhu4N1IMSR4buTIMSR4bqhaSBkaeG7h24gY2hvIG3hu5l0IG3DoHUgc+G6r2MgY+G7p2Ega2ltIGPGsMahbmcuIEJp4buDdSDEkeG7kyDEkcaw4bujYyBz4bqvcCB44bq/cCB0aGVvIGPDoWMgbcOgdSBz4bqvYyBraMOhYyBuaGF1Lg0KICAtIGFlcyhsYWJlbCA9IG4pOiBUaGnhur90IGzhuq1wIG7DoHkgeMOhYyDEkeG7i25oIG5ow6NuIGzDoCBnacOhIHRy4buLIGPhu6dhIGPhu5l0ICJuIiAoc+G7kSBsxrDhu6NuZykuDQogIC0gdmp1c3QgPSAtMC41ICh0w7l5IGNo4buNbiBjxINuIGNo4buJbmgpOiBUaGnhur90IGzhuq1wIG7DoHkgxJFp4buBdSBjaOG7iW5oIHbhu4sgdHLDrSBk4buNYyBj4bunYSBjw6FjIG5ow6NuLCDEkeG6t3QgY2jDum5nIGjGoWkgdGjhuqVwIGjGoW4gc28gduG7m2kgxJHhu4luaCBj4bunYSBjw6FjIGPhu5l0Lg0KICAtIGNvbG9yID0gJ2JsYWNrJyAodMO5eSBjaOG7jW4gbcOgdSBz4bqvYyk6IFRoaeG6v3QgbOG6rXAgbsOgeSB0w7QgbcOgdSDEkWVuIGNobyBjw6FjIG5ow6NuLg0KbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpOiBIw6NtIG7DoHkgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgaG/DoG5oICgixJDhu5kgdGluaCBraGnhur90IikgdsOgIHRy4bulYyB0dW5nICgiU+G7kSBsxrDhu6NuZyIpLg0KDQotIE5o4bqtbiB4w6l0OiANClbhu5tpIHThu5VuZyBz4buRIDggxJHhu5kgdGluaCBraGnhur90IGPDuW5nIHbhu5tpIDcgbcOgdSwgdGEgY8OzIHRo4buDIHRo4bqleSA3IGJp4buDdSDEkeG7kyB0xrDGoW5nIOG7qW5nIHbhu5tpIHThu6tuZyBtw6B1IHbDoCBt4buXaSBtw6B1IGPDsyBz4buRIGzGsOG7o25nIGxv4bqhaSBj4bulIHRo4buDDQoNCk5ow6xuIHPGoSBxdWEsIGPhuqMgNyBtw6B1IMSRYSBz4buRIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgU0kxIGNoaeG6v20gY2FvIG5o4bqldCB2w6AgSTEgw610IG5o4bqldA0KDQpW4bubaSDEkeG7mSB0aW5oIGtoaeG6v3QgVlMyLCBtw6B1IEcgY8OzIHPhu5EgbMaw4bujbmcgbmhp4buBdSBuaOG6pXQgKDIzNDcpIHbDoCBKIGPDsyBz4buRIGzGsOG7o25nIHRo4bqlcCBuaOG6pXQgKDczMSkgIA0KDQpW4bubaSBjw6FjIMSR4buZIHRpbmgga2hp4bq/dCBjw7JuIGzhuqFpLCB0aMOsIGdp4buvYSBjw6FjIG3DoHUga2jDtG5nIGPDsyBxdcOhIG5oaeG7gXUgc+G7sSBjaMOqbmggbOG7h2NoIA0KDQojIyBCaeG7g3UgxJHhu5MgMjU6DQpgYGB7cn0NCmJkMjUgPC0gZGlhbW9uZHMNCmJkMjUgPC0gYmQyNSAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KYmQyNSAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGJkMjUgJT4lIGZpbHRlcihjb2xvciA9PSAnRCcpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGJkMjUgJT4lIGZpbHRlcihjb2xvciA9PSAnSicpLCBmaWxsID0gJ2JsdWUnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDogDQogIC0gZ3JvdXBfYnkoY3V0LCBjb2xvcik6IE5ow7NtIGThu68gbGnhu4d1IHRyb25nICJiZDI1IiB0aGVvIGhhaSB0csaw4budbmcgImN1dCIgKExv4bqhaSkgdsOgICJjb2xvciIgKE3DoHUgc+G6r2MpLg0KICAtIHN1bW1hcmlzZShuID0gbigpKTogVMOtbmggdG/DoW4gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0cm9uZyBt4buXaSBuaMOzbSB2w6AgbMawdSB0cuG7ryBr4bq/dCBxdeG6oyB0cm9uZyBt4buZdCBj4buZdCBt4bubaSBjw7MgdMOqbiAibiIuDQogIC0gZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpOiBYw6FjIMSR4buLbmggImN1dCIgbMOgIHRy4bulYyBob8OgbmggdsOgICJuIiBsw6AgdHLhu6VjIHR1bmcuDQogIC0gZ2VvbV9jb2woZGF0YSA9IGJkMjUgJT4lIGZpbHRlcihjb2xvciA9PSAnRCcpLCBmaWxsID0gJ3JlZCcpOiBUaMOqbSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgY2hvIGThu68gbGnhu4d1IGtpbSBjxrDGoW5nIG3DoHUgIkQiIHbhu5tpIG3DoHUgdMO0IGzDoCDEkeG7jy4NCiAgLSBnZW9tX2NvbChkYXRhID0gYmQyNSAlPiUgZmlsdGVyKGNvbG9yID09ICdKJyksIGZpbGwgPSAnYmx1ZScpOiBUaMOqbSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgY2hvIGThu68gbGnhu4d1IGtpbSBjxrDGoW5nIG3DoHUgIkoiIHbhu5tpIG3DoHUgdMO0IGzDoCB4YW5oIGxhbS4NCiAgLSBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJyk6IFRow6ptIG5ow6NuIGNobyB0cuG7pWMgaG/DoG5oIGzDoCAiTG/huqFpIiB2w6AgdHLhu6VjIHR1bmcgbMOgICJT4buRIGzGsOG7o25nIi4NCg0KLSBOaOG6rW4geMOpdDogDQoNClRhIGPDsyB0aOG7gyB0aOG6pXkgc+G7sSBjaMOqbmggbOG7h2NoIHPhu5EgbMaw4bujbmcgZ2nhu69hIDIgbcOgdSBEIHbDoCBKIGzDoCBraMOhIGzhu5tuLiDEkOG6t2MgYmnhu4d0IGzDoCDhu58gMyBsb+G6oWkgSWRlYWwgLSBQcmVtaXVtIC0gVmVyeSBHb29kDQoNClPhu7EgY2jDqm5oIGzhu4djaCBs4bubbiBuaOG6pXQgbMOgIOG7nyBt4bupYyBJZGVhbA0KDQpDw7JuIOG7nyAyIG3hu6ljIGN14buRaSBsw6AgRmFpciB2w6AgR29vZCwga2hv4bqjbmcgY8OhY2gga2jDtG5nIHF1w6EgeGENCg0KDQojIyBCaeG7g3UgxJHhu5MgMjY6DQpgYGB7cn0NCmJkMjYgPC0gZGlhbW9uZHMNCmJkMjYgPC0gYmQyNiAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KYmQyNiAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGJkMjYgJT4lIGZpbHRlcihjb2xvciA9PSAnRScpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGJkMjYgJT4lIGZpbHRlcihjb2xvciA9PSAnSicpLCBmaWxsID0gJ2JsdWUnKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDogDQogIC0gZ3JvdXBfYnkoY3V0LCBjb2xvcik6IE5ow7NtIGThu68gbGnhu4d1IHRyb25nICJiZDI2IiB0aGVvIGhhaSB0csaw4budbmcgImN1dCIgKExv4bqhaSkgdsOgICJjb2xvciIgKE3DoHUgc+G6r2MpLg0KICAtIHN1bW1hcmlzZShuID0gbigpKTogVMOtbmggdG/DoW4gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0cm9uZyBt4buXaSBuaMOzbSB2w6AgbMawdSB0cuG7ryBr4bq/dCBxdeG6oyB0cm9uZyBt4buZdCBj4buZdCBt4bubaSBjw7MgdMOqbiAibiIuDQogIC0gZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpOiBYw6FjIMSR4buLbmggImN1dCIgbMOgIHRy4bulYyBob8OgbmggdsOgICJuIiBsw6AgdHLhu6VjIHR1bmcuDQogIC0gZ2VvbV9jb2woZGF0YSA9IGJkMjYgJT4lIGZpbHRlcihjb2xvciA9PSAnRScpLCBmaWxsID0gJ3JlZCcpOiBUaMOqbSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgY2hvIGThu68gbGnhu4d1IGtpbSBjxrDGoW5nIG3DoHUgIkUiIHbhu5tpIG3DoHUgdMO0IGzDoCDEkeG7jy4NCiAgLSBnZW9tX2NvbChkYXRhID0gYmQyNiAlPiUgZmlsdGVyKGNvbG9yID09ICdKJyksIGZpbGwgPSAnYmx1ZScpOiBUaMOqbSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgY2hvIGThu68gbGnhu4d1IGtpbSBjxrDGoW5nIG3DoHUgIkoiIHbhu5tpIG3DoHUgdMO0IGzDoCB4YW5oIGxhbS4NCiAgLSBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJyk6IFRow6ptIG5ow6NuIGNobyB0cuG7pWMgaG/DoG5oIGzDoCAiTG/huqFpIiB2w6AgdHLhu6VjIHR1bmcgbMOgICJT4buRIGzGsOG7o25nIi4NCg0KLSBOaOG6rW4geMOpdDogDQpUYSBjw7MgdGjhu4MgdGjhuqV5IHPhu7EgY2jDqm5oIGzhu4djaCBz4buRIGzGsOG7o25nIGdp4buvYSAyIG3DoHUgRSB2w6AgSiBsw6Aga2jDoSBs4bubbi4gxJDhurdjIGJp4buHdCBsw6Ag4bufIDQgbG/huqFpIElkZWFsIC0gUHJlbWl1bSAtIFZlcnkgR29vZCAtIEdvb2QsIGThu4UgZMOgbmcgbmjhuq1uIHRo4bqleSBwaOG6p24gbcOgdSDEkeG7jyDEkeG6oWkgZGnhu4duIGNobyBtw6B1IEUgY2hp4bq/bSDGsHUgdGjhur8gaMahbg0KDQpT4buxIGNow6puaCBs4buHY2ggbOG7m24gbmjhuqV0IGzDoCDhu58gbeG7qWMgSWRlYWwsIGtoaSBtw6Agc+G7kSBsxrDhu6NuZyBj4bunYSBtw6B1IEogY8OybiBraMO0bmcgbmhp4buBdSBi4bqxbmcgcGjDom4gbuG7rWEgbcOgdSBFIA0KDQpDw7JuIOG7nyBt4bupYyBjdeG7kWkgbMOgIEZhaXIsIHPhu5EgbMaw4bujbmcgY+G7p2EgY+G6oyBoYWkgZ+G6p24gbmjGsCB44bqlcCB44buJIG5oYXUgDQoNCiMjIEJp4buDdSDEkeG7kyAyNzoNCmBgYHtyfQ0KYmQyNyA8LSBkaWFtb25kcw0KYmQyNyA8LSBiZDI3ICU+JSBncm91cF9ieShjdXQsIGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQpiZDI3ICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSkgKw0KICBnZW9tX2NvbChkYXRhID0gYmQyNyAlPiUgZmlsdGVyKGNvbG9yID09ICdIJyksIGZpbGwgPSAncmVkJykgKw0KICBnZW9tX2NvbChkYXRhID0gYmQyNyAlPiUgZmlsdGVyKGNvbG9yID09ICdJJyksIGZpbGwgPSAnYmx1ZScpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQotIFbhu4EgbeG6t3Qga+G7uSB0aHXhuq10OiANCiAgLSBncm91cF9ieShjdXQsIGNvbG9yKTogTmjDs20gZOG7ryBsaeG7h3UgdHJvbmcgImJkMjciIHRoZW8gaGFpIHRyxrDhu51uZyAiY3V0IiAoTG/huqFpKSB2w6AgImNvbG9yIiAoTcOgdSBz4bqvYykuDQogIC0gc3VtbWFyaXNlKG4gPSBuKCkpOiBUw61uaCB0b8OhbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRyb25nIG3hu5dpIG5ow7NtIHbDoCBsxrB1IHRy4buvIGvhur90IHF14bqjIHRyb25nIG3hu5l0IGPhu5l0IG3hu5tpIGPDsyB0w6puICJuIi4NCiAgLSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSk6IFjDoWMgxJHhu4tuaCAiY3V0IiBsw6AgdHLhu6VjIGhvw6BuaCB2w6AgIm4iIGzDoCB0cuG7pWMgdHVuZy4NCiAgLSBnZW9tX2NvbChkYXRhID0gYmQyNyAlPiUgZmlsdGVyKGNvbG9yID09ICdIJyksIGZpbGwgPSAncmVkJyk6IFRow6ptIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCBjaG8gZOG7ryBsaeG7h3Uga2ltIGPGsMahbmcgbcOgdSAiRCIgduG7m2kgbcOgdSB0w7QgbMOgIMSR4buPLg0KICAtIGdlb21fY29sKGRhdGEgPSBiZDI3ICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0knKSwgZmlsbCA9ICdibHVlJyk6IFRow6ptIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCBjaG8gZOG7ryBsaeG7h3Uga2ltIGPGsMahbmcgbcOgdSAiSiIgduG7m2kgbcOgdSB0w7QgbMOgIHhhbmggbGFtLg0KICAtIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKTogVGjDqm0gbmjDo24gY2hvIHRy4bulYyBob8OgbmggbMOgICJMb+G6oWkiIHbDoCB0cuG7pWMgdHVuZyBsw6AgIlPhu5EgbMaw4bujbmciLg0KDQotIE5o4bqtbiB4w6l0OiANCg0KVGEgY8OzIHRo4buDIHRo4bqleSBz4buxIGNow6puaCBs4buHY2ggc+G7kSBsxrDhu6NuZyBnaeG7r2EgMiBtw6B1IEggdsOgIEkgbMOgIGtow6EgbOG7m24uIMSQ4bq3YyBiaeG7h3QgbMOgIOG7nyA0IGxv4bqhaSBJZGVhbCAtIFByZW1pdW0gLSBWZXJ5IEdvb2QgLSBHb29kIA0KDQpT4buxIGNow6puaCBs4buHY2ggbOG7m24gbmjhuqV0IGzDoCDhu58gbeG7qWMgR29vZCwga2hpIG3DoHUgSSBjw7Mgc+G7kSBsxrDhu6NuZyBs4bubbiBoxqFuIGfhuqVwIDMgbOG6p24gbcOgdSBIIA0KDQpDw7JuIOG7nyBt4bupYyBjdeG7kWkgbMOgIEZhaXIsIGPFqW5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggbmjGsG5nIGtow7RuZyDEkcOhbmcga+G7gw0KDQojIyBCaeG7g3UgxJHhu5MgMjg6IA0KYGBge3J9DQpiZDI4IDwtIGRpYW1vbmRzIA0KYmQyOCA8LSBiZDI4ICU+JSBtdXRhdGUoY2FyYXRDID0gY3V0KGNhcmF0LDUsIGxhYmVsID0gYygncuG6pXQgbmjhu48nLCAnbmjhu48nLCd24burYScsJ2zhu5tuJywncuG6pXQgbOG7m24nKSkpDQpiZDI4ICU+JSBnZ3Bsb3QoYWVzKHggPSBjYXJhdEMpKSArDQogIGdlb21fYmFyKGZpbGwgPSAncmVkJykgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBow6xuaCBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0cm9uZyBt4buXaSBuaMOzbSBjYXJhdCIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDoNCiAgLSBtdXRhdGUoKSDEkeG7gyB0aMOqbSBt4buZdCBiaeG6v24gbeG7m2kgdsOgbyDEkeG7kWkgdMaw4bujbmcgImJkMjgiLiBCaeG6v24gbeG7m2kgY8OzIHTDqm4gImNhcmF0QyIgxJHGsOG7o2MgdOG6oW8gcmEgYuG6sW5nIGPDoWNoIHBow6JuIGNoaWEgZ2nDoSB0cuG7iyBjYXJhdCB0aMOgbmggNSBuaMOzbTogInLhuqV0IG5o4buPIiwgIm5o4buPIiwgInbhu6thIiwgImzhu5tuIiwgInLhuqV0IGzhu5tuIi4gDQogIC0gSMOgbSBjdXQoKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0aOG7sWMgaGnhu4duIHZp4buHYyBwaMOibiBjaGlhIG7DoHkuDQogICAgLSBUaGFtIHPhu5EgxJHhuqd1IHRpw6puIGPhu6dhIGN1dCgpIGzDoCBjYXJhdCwgYmnhur9uIG3DoCBjaMO6bmcgdGEgbXXhu5FuIHBow6JuIGNoaWEuDQogICAgLSBUaGFtIHPhu5EgdGjhu6kgaGFpIGzDoCA1LCBz4buRIGzGsOG7o25nIG5ow7NtIG3DoCBjaMO6bmcgdGEgbXXhu5FuIHThuqFvLg0KICAgIC0gVGhhbSBz4buRIHRo4bupIGJhIGzDoCBsYWJlbCwgbeG7mXQgdmVjdG9yIGNo4bupYSB0w6puIGNobyBjw6FjIG5ow7NtLg0KICAtIGdncGxvdChhZXMoeCA9IGNhcmF0QykpIHThuqFvIHJhIG3hu5l0IGtodW5nIHbhur0gZ2dwbG90IHbhu5tpIHRy4bulYyB4IMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBi4bufaSBiaeG6v24gImNhcmF0QyIuDQogIC0gZ2VvbV9iYXIoZmlsbCA9ICdyZWQnKSB0aMOqbSBt4buZdCBiaeG7g3UgxJHhu5MgaMOsbmggY+G7mXQgdsOgbyBraHVuZyB24bq9LiBNw6B1IGPhu6dhIGPDoWMgY+G7mXQgxJHGsOG7o2MgdMO0IG3DoHUgxJHhu48uDQogIC0gdGhlbWVfY2xhc3NpYygpOiDDgXAgZOG7pW5nIGdpYW8gZGnhu4duIGPhu5UgxJFp4buDbiBjaG8gYmnhu4N1IMSR4buTLg0KICAtIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGjDrG5oIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRyb25nIG3hu5dpIG5ow7NtIGNhcmF0Iik6IFRow6ptIHRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQoNCi0gTmjhuq1uIHjDqXQ6IA0KU2F1IGtoaSDEkcOjIGNoaWEgbmjhu48gcmEgbMOgbSA1IG5ow7NtLCB0YSBjw7MgdGjhu4MgdGjhuqV5IHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGh14buZYyBuaMOzbSBy4bqldCBuaOG7jyBsw6AgY2hp4bq/bSBjYW8gbmjhuqV0IHbhu5tpIGjGoW4gNDAwMCB2acOqbiwgc2F1IMSRw7MgbMOgIG5o4buPIHbDoCB24burYS4gQ8OybiBraW0gY8awxqFuZyB0aHXhu5ljIG5ow7NtIGzhu5tuIHbDoCBy4bqldCBs4bubbiBjw7MgdGjhu4MgY8OzIG5oxrBuZyB2w6wgcXXDoSDDrXQgbsOqbiBiaeG7g3UgxJHhu5Mga2jDtG5nIHRo4buDIGhp4buHbiBsw6puLiBOZ2/DoGkgcmEgdGjDrCDEkeG7mSBjaMOqbmggbOG7h2NoIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgZ2nhu69hIGPDoWMgbmjDs20gbMOgIHLhuqV0IGNhby4gDQoNCiMjIEJp4buDdSDEkeG7kyAyOToNCmBgYHtyfQ0KYmQyOSA8LSBkaWFtb25kcyANCmJkMjkgPC0gYmQyOSAlPiUgbXV0YXRlKHByaWNlQyA9IGN1dChwcmljZSwzLCBsYWJlbCA9IGMoJ03huq9jJywnVHJ1bmcgYsOsbmgnLCdS4bq7JykpKQ0KYmQyOSAlPiUgZ2dwbG90KGFlcyh4ID0gcHJpY2VDKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ2Jyb3duJykgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBow6xuaCBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0cm9uZyBt4buXaSBuaMOzbSBwcmljZSIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDoNCiAgLSBtdXRhdGUoKSDEkeG7gyB0aMOqbSBt4buZdCBiaeG6v24gbeG7m2kgdsOgbyDEkeG7kWkgdMaw4bujbmcgImJkMjkiLiBCaeG6v24gbeG7m2kgY8OzIHTDqm4gInByaWNlQyIgxJHGsOG7o2MgdOG6oW8gcmEgYuG6sW5nIGPDoWNoIHBow6JuIGNoaWEgZ2nDoSB0cuG7iyBjYXJhdCB0aMOgbmggMyBuaMOzbTogIk3huq9jIiwgIlRydW5nIGLDrG5oIiwgIlLhursiLiANCiAgLSBIw6BtIGN1dCgpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHRo4buxYyBoaeG7h24gdmnhu4djIHBow6JuIGNoaWEgbsOgeS4NCiAgICAtIFRoYW0gc+G7kSDEkeG6p3UgdGnDqm4gY+G7p2EgY3V0KCkgbMOgIGNhcmF0LCBiaeG6v24gbcOgIGNow7puZyB0YSBtdeG7kW4gcGjDom4gY2hpYS4NCiAgICAtIFRoYW0gc+G7kSB0aOG7qSBoYWkgbMOgIDMsIHPhu5EgbMaw4bujbmcgbmjDs20gbcOgIGNow7puZyB0YSBtdeG7kW4gdOG6oW8uDQogICAgLSBUaGFtIHPhu5EgdGjhu6kgYmEgbMOgIGxhYmVsLCBt4buZdCB2ZWN0b3IgY2jhu6lhIHTDqm4gY2hvIGPDoWMgbmjDs20uDQogIC0gZ2dwbG90KGFlcyh4ID0gcHJpY2VDKSkgdOG6oW8gcmEgbeG7mXQga2h1bmcgduG6vSBnZ3Bsb3QgduG7m2kgdHLhu6VjIHggxJHGsOG7o2MgeMOhYyDEkeG7i25oIGLhu59pIGJp4bq/biAicHJpY2VDIi4NCiAgLSBnZW9tX2JhcihmaWxsID0gJ3JlZCcpIHRow6ptIG3hu5l0IGJp4buDdSDEkeG7kyBow6xuaCBj4buZdCB2w6BvIGtodW5nIHbhur0uIE3DoHUgY+G7p2EgY8OhYyBj4buZdCDEkcaw4bujYyB0w7QgbcOgdSDEkeG7jy4NCiAgLSB0aGVtZV9jbGFzc2ljKCk6IMOBcCBk4bulbmcgZ2lhbyBkaeG7h24gY+G7lSDEkWnhu4NuIGNobyBiaeG7g3UgxJHhu5MuDQogIC0gbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgaMOsbmggY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdHJvbmcgbeG7l2kgbmjDs20gcHJpY2UiKTogVGjDqm0gdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCg0KLSBOaOG6rW4geMOpdDogDQrEkOG7gyBk4buFIGTDoG5nIMSRw6FuaCBnacOhIHbhu4EgZ2nDoSBj4bunYSBjw6FjIHZpw6puIGtpbSBjxrDGoW5nLCB0YSDEkcOjIHBow6JuIG5o4buPIGNow7puZyByYSB0aMOgbmggMyBuaMOzbS4gVHJvbmcgxJHDsyBjw7MgdGjhu4MgZOG7hSBkw6BuZyB0aOG6pXkgcuG6sW5nIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGh14buZYyBuaMOzbSBN4bqvYyBsw6AgY2FvIG5o4bqldCB24bubaSBoxqFuIDQwMDAgdmnDqm4gdsOgIHRo4bqlcCBuaOG6pXQgbMOgIHbhu5tpIG5ow7NtIFLhursgY2jGsGEgxJHhur9uIDEwMDAgdmnDqm4uIE5nb8OgaSByYSB0YSBjxaluZyB0aOG6pXkgxJHGsOG7o2MgxJHhu5kgY2jDqm5oIGzhu4djaCBnaeG7r2EgY8OhYyBuaMOzbSBsw6Aga2jDoSBjYW8sIG5o4bqldCBsw6Aga2hpIHNvIGPDoWMgbmjDs20gY8OybiBs4bqhaSB24bubaSBuaMOzbSBN4bqvYy4gDQoNCiMjIEJp4buDdSDEkeG7kyAzMDogDQpgYGB7cn0NCmJkMzAgPC0gZGlhbW9uZHMgDQpiZDMwIDwtIGJkMzAgJT4lIG11dGF0ZShkZXB0aEMgPSBjdXQoZGVwdGgsNSwgbGFiZWwgPSBjKCdTw6J1JywnS2jDoSBzw6J1JywnVHJ1bmcgYsOsbmgnLCdLaMOhIG7DtG5nJywnTsO0bmcnKSkpDQpiZDMwICU+JSBnZ3Bsb3QoYWVzKHggPSBkZXB0aEMpKSArDQogIGdlb21fYmFyKGZpbGwgPSAneWVsbG93JykgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBow6xuaCBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0cm9uZyBt4buXaSBuaMOzbSBkZXB0aCIpDQpgYGANCg0KLSBW4buBIG3hurd0IGvhu7kgdGh14bqtdDoNCiAgLSBtdXRhdGUoKSDEkeG7gyB0aMOqbSBt4buZdCBiaeG6v24gbeG7m2kgdsOgbyDEkeG7kWkgdMaw4bujbmcgImJkMzAiLiBCaeG6v24gbeG7m2kgY8OzIHTDqm4gImRlcHRoQyIgxJHGsOG7o2MgdOG6oW8gcmEgYuG6sW5nIGPDoWNoIHBow6JuIGNoaWEgZ2nDoSB0cuG7iyBjYXJhdCB0aMOgbmggNSBuaMOzbTogIlPDonUiLCAiS2jDoSBzw6J1IiwgIlRydW5nIGLDrG5oIiwgIktow6EgbsO0bmciLCAiTsO0bmciLiANCiAgLSBIw6BtIGN1dCgpIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHRo4buxYyBoaeG7h24gdmnhu4djIHBow6JuIGNoaWEgbsOgeS4NCiAgICAtIFRoYW0gc+G7kSDEkeG6p3UgdGnDqm4gY+G7p2EgY3V0KCkgbMOgIGRlcHRoLCBiaeG6v24gbcOgIGNow7puZyB0YSBtdeG7kW4gcGjDom4gY2hpYS4NCiAgICAtIFRoYW0gc+G7kSB0aOG7qSBoYWkgbMOgIDUsIHPhu5EgbMaw4bujbmcgbmjDs20gbcOgIGNow7puZyB0YSBtdeG7kW4gdOG6oW8uDQogICAgLSBUaGFtIHPhu5EgdGjhu6kgYmEgbMOgIGxhYmVsLCBt4buZdCB2ZWN0b3IgY2jhu6lhIHTDqm4gY2hvIGPDoWMgbmjDs20uDQogIC0gZ2dwbG90KGFlcyh4ID0gZGVwdGhDKSkgdOG6oW8gcmEgbeG7mXQga2h1bmcgduG6vSBnZ3Bsb3QgduG7m2kgdHLhu6VjIHggxJHGsOG7o2MgeMOhYyDEkeG7i25oIGLhu59pIGJp4bq/biAiY2FyYXRDIi4NCiAgLSBnZW9tX2JhcihmaWxsID0gJ3llbGxvdycpIHRow6ptIG3hu5l0IGJp4buDdSDEkeG7kyBow6xuaCBj4buZdCB2w6BvIGtodW5nIHbhur0uIE3DoHUgY+G7p2EgY8OhYyBj4buZdCDEkcaw4bujYyB0w7QgbcOgdSB2w6BuZy4NCiAgLSB0aGVtZV9jbGFzc2ljKCk6IMOBcCBk4bulbmcgZ2lhbyBkaeG7h24gY+G7lSDEkWnhu4NuIGNobyBiaeG7g3UgxJHhu5MuDQogIC0gbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgaMOsbmggY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdHJvbmcgbeG7l2kgbmjDs20gZGVwdGgiKTogVGjDqm0gdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7ky4NCiAgDQotIE5o4bqtbiB4w6l0OiANCk5ow6xuIHbDoG8gYmnhu4N1IMSR4buTLCBzYXUga2hpIMSRw6MgY2hpYSBuaOG7jyDEkeG7mSBzw6J1IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIHRow6BuaCA1IG5ow7NtLCB0YSBjw7MgdGjhu4MgdGjhuqV5IHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzIMSR4buZIHPDonUgdHJ1bmcgYsOsbmggbMOgIGNhbyBuaOG6pXQsIGvhur8gxJHhur9uIGzDoCBuaMOzbSBraMOhIG7DtG5nIHbDoCBraMOhIHPDonUsIDIgbmjDs20gY8OybiBs4bqhaSBjw7MgdGjhu4MgY8OzIG5oxrBuZyB2w6wgcXXDoSDDrXQgbsOqbiBiaeG7g3UgxJHhu5MgxJHDoyBraMO0bmcgdGjhu4MgaGnhu4duIGzDqm4uIE5nb8OgaSByYSBjw7MgdGjhu4MgdGjhuqV5IGtoaSBzbyBjw6FjIG5ow7NtIGPDsm4gbOG6oWkgduG7m2kgbmjDs20gxJHhu5kgc8OidSB0cnVuZyBiw6xuaCB0YSB0aOG6pXkgc+G7sSBjw6FjaCBiaeG7h3QgbMOgIHLhuqV0IGzhu5tuLiA=