1 Mục tiêu bài nghiên cứu:
Đánh giá 53940 viên kim cương trên dữ liệu Diamonds::
CLARITY (Độ tinh khiết của kim cương)
COLOR (Màu của kim cương)
CARAT (Trọng lượng của kim cương)
CUT (Vết cắt của kim cương )
Gồm có 10 biến, đó là:
- Price: Giá của viên kim cương (USD)
- Carat: Trọng lượng của viên kim cương (carat)
- Cut: Chất lượng của vết cắt (Fair, Good, Very Good,
Excellent, Ideal)
- Color: Màu sắc của viên kim cương(D,E,I,F,G,H)
- Clarity: Độ trong của viên kim
cương(VS2,VVS2,SI1,SI2,VS1,VVS1)
- X: Độ dài của viên kim cương (mm)
- Y: Độ rộng của viên kim cương (mm)
- Z: Độ sâu của viên kim cương (mm)
- Table: Chiều rộng của đỉnh kim cương so với điểm
rộng nhất
- Depth: Tỷ lệ phần trăm độ sâu
2 Tiến hành nghiên cứu:
Trước hết, ta cần phải gọi dữ liệu diamonds lên
- Đổi tên biến cut trong dữ liệu diamonds, thay bằng
tên loại để tránh bị nhầm lẫn khi đánh giá giữa loại
của kim cương và vết cắt của kim cương
h <- rename(h, loai = cut)
datatable(h)
3 Tiến hành nghiên cứu
3.1 Biểu đồ tỉ số loại kim cương
h %>% group_by(loai) %>% summarise(n = n()) %>%
ggplot(aes(loai,n)) +
geom_col(fill='beige') +
geom_text(aes(label = percent(n/length(h$carat))),vjust = 2, color = 'red') +
labs(x = 'Loại', y = 'Số lượng') +
labs(title =' Hình1: Biểu đồ tỉ số các loại kim cương')

- Quan sát biểu đồ ta thấy:
- Các loại kim cương phân bố không đồng đều
- Số lượng kim cương loại Ideal nhiều nhất chiếm hơn
40%
- Số lượng kim cương loại Fair ít nhất chiếm chỉ hơn
3% ít hơn 13 lần so với loại Ideal
- Số lượng kim cương loại Good,
Verygood, Premium có số lượng tăng dần
lần lượt là: 9,1%, 22,4%; 25,6%
3.2 Biểu đồ phân loại màu của kim cương
h %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(color,n)) +
geom_col(fill='blue') +
geom_text(aes(label = n),vjust = 2, color = 'yellow') +
labs(x = 'Màu', y = 'Số lượng')

labs(title =' Hình 1: Biểu đồ phân loại màu của kim cương') +
coord_flip()
- Quan sát biểu đồ ta thấy:
- Màu sắc của các kim cương phân bố không đồng đều
- Số kim cương không màu chiếm phần lớn số lượng gồm: D, E,
F có lần lượt là 6775, 9797, 9542 viên
- Số kim cương màu G chiếm số lượng lớn nhất với
11292 viên
- Số kim cương có màu nhưng rất ít( gần như không màu) chiếm phần nhỏ
số lượng gồm: H, I, J có lần lượt là 8304, 5422, 2808
viên.
3.3 Biểu đồ thể hiện số lượng kim cương theo màu
h %>% group_by(color) %>% summarise(n=n()) %>%
ggplot(aes(x = color,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = 2, color = 'blue') +
labs(x = 'Màu sắc', y = 'Số lượng') +
labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện số lượng kim cương theo màu')

- Quan sát biểu đồ ta thấy:
- Tỉ trọng giữa các màu của kim cương không đồng đều
- Cấp độ màu G có số lượng lớn nhất là 11292 viên gấp
4 lần so với cấp độ màu J bé nhất là 2808 viên
- Cấp độ màu E có 9797 viên
- Cấp độ màu F, H, D có lần lượt là 9542, 8304, 6775
viên
- Cấp độ màu I có 5422 viên
3.4 Biểu đồ phân bổ số lượng màu của các kim cương(Biểu đồ
ngang)
h %>% ggplot(aes(x = color)) +
geom_bar() +
labs(x = 'Màu sắc', y = 'Số lượng') +
coord_flip() +
labs(title = 'Hình 1: Biểu đồ phân bổ số lượng màu của các kim cương(biểu đồ ngang)')

- Quan sát biểu đồ ta thấy:
- Màu sắc của các kim cương phân bố không đồng đều. Cho thấy mức độ
khan hiếm của từng loại màu của kim cương
- Số kim cương màu G chiếm số lượng lớn nhất với hơn
11000 viên
- Số kim cương có màu nhưng rất ít( gần như không màu) chiếm phần nhỏ
số lượng gồm: H, I, J có lần lượt là hơn 8000viên, gần
5500 viên, gần 3000 viên.
- Số kim cương không màu chiếm phần lớn số lượng gồm: D, E,
F có lần lượt là hơn 6500 viên, gần 10000 viên, xấp xỉ 9500
viên
3.5 Biểu đồ thể hiện giá trị trung bình của số kim cương phân theo
màu
h %>% group_by(loai) %>% summarise(m= mean(carat)) %>%
ggplot(aes(x = loai,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = -1, color = 'red') +
labs(x = 'Màu', y = 'Mean') +
labs(title = 'Hình 1: Biểu đồ thể hiện trung bình số kim cương theo màu')

- Quan sát biểu đồ ta thấy
- Mức độ phân bố trung bình các màu của kim cương tương đối đồng
đều
- Màu Fair có mức độ phân bố trung bình cao nhất
1,05
- Màu Good, Very Good,
Premiumcó mức độ phân bố trung bình gần 0,8 cụ thể lần
lượt là: 0,85; 0,81; 0,89
- Màu Ideal có mức độ phân bố trung bình thấp nhất
chỉ nằm ở 0,7
3.6 Biểu đồ thể hiện tỉ lệ kim cương theo loại và màu
k <- h %>% group_by(loai, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.
k %>% ggplot(aes(x = loai, y = n)) +
geom_col(data = k %>% filter(color == 'G'), fill = 'red') +
geom_col(data = k %>% filter(color == 'H'), fill = 'blue')

- Quan sát biểu đồ ta thấy:
- k là một tập hợp mới thống kê số lượng kim cương theo loại và
màu
- Ta thấy số lượng kim cương màu H chiếm phần lớn trong tổng, số lượng
kim cương màu G chỉ chiếm số ít
- Cụ thể:
- SỐ lượng kim cương màu G loại Ideal nhiều nhất với
hơn 3000 viên trong khi đó cùng loại màu H chỉ gần 2000 viên
- Số lượng kim cương màu G loại Fair chiếm phần lớn
với hơn 300 viên trong khi đó cùng loại màu H gần như không có
- SỐ lượng kim cương màu G loại VeryGoodchiếm trung
bình với gần 2000 viên trong khi đó cùng loại màu H chỉ gần 500
viên
3.7 Biểu đồ thể hiện vết cắt table của kim cương
h %>% group_by(table) %>% filter(table >= 53 & table <= 65) %>% summarise(n = n()) %>%
ggplot(aes(table,n)) +
geom_col(fill='green') +
xlab('Table') +
ylab('Số lượng') +
labs(title = 'Hình 1: Vết cắt table của kim cương')

- Quan sát biểu đồ trên ta thấy được:
- Mức độ phân bổ của các vết cắt kim cương ko đồng đều
- Các viên kim cương có vết cắt nằm trong khoảng từ 55 đến 60 chiếm số
lượng lớn nhất với hơn 30000 viên. Cụ thể là: Vết cắt ở 55,75 và 56,6
chiếm số lượng lớn nhất với hơn 19000 viên
- Các viên kim cương có vết cắt nằm trong khoảng từ 52,5 đến dưới 55
chiếm số lượng tương đối nhỏ với hơn 3000 viên.
- Các viên kim cương có vết cắt nằm trong khoảng từ 60 đến dưới 65
chiếm số lượng nhỏ nhất với hơn 4000 viên. Cụ thể là: Vết cắt ở 65 chiếm
số lượng nhỏ nhất với chỉ khoảng 200 viên
3.8 Biểu đồ thể hiện trung bình giá kim cương theo loại
h %>% group_by(loai,color) %>% summarise(m = mean(price)) %>%
ggplot(aes(x = loai,y = m)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
geom_text(aes(label = round(m))) +
labs(x = 'Loại', y = 'Số lượng') +
labs(title = 'Hình 1: Biểu đồ thể hiện trung bình giá kim cương theo loại')
## `summarise()` has grouped output by 'loai'. You can override using the
## `.groups` argument.

3.9 Tập hợp các biểu đồ thể hiện số lượng kim cương theo cấp độ tinh
khiết
h %>% group_by(clarity,color) %>% summarise(n=n()) %>%
ggplot(aes(x = clarity,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~color) +
labs(x = 'Độ tinh khiết', y = 'Số lượng') +
labs(title = 'Hình 1: Tập hợp các biểu đồ thể hiện số lượng kim cương theo cấp độ tinh khiết')
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.

3.10 Biểu đồ thể hiện trọng lượng của kim cương
h %>% group_by(carat) %>% filter(carat >= 0.23 & carat <= 2.05) %>% summarise(n = n()) %>%
ggplot(aes(carat,n)) +
geom_col(fill='blue') +
xlab('Carat') +
ylab('Số lượng') +
labs(title = 'Hình 1: Trọng lượng của kim cương')

Qua hình trên ta thấy được: - Ta thấy trọng lượng của kim cương phân
bố không đồng đều. Đa số tập trung ở mức từ 0,3-1,6 carat - Các mức
trọng lượng chiếm phần lớn là 0,3 ; 0,65 và 1 carat - Các mức trọng
lượng chiếm số lượng ít nhất là từ 1,6- 1,9
3.11 Biểu đồ thể hiện kim cương theo màu
h %>% ggplot(aes(x = price, fill = color)) +
geom_histogram(binwidth = 500)

- Quan sát biểu đồ ta thấy: Kim cương càng hiếm thì có giá trị càng
cao ví dụ như màu J,I. Ngược lại mức dộ phổ biến của các màu D, E , F là
rất cao
3.12 Biểu đồ thể hiện mức dộ phân bổ của kim cương theo mức giá
h %>% ggplot(aes(x = price)) +
geom_histogram(binwidth = 500, fill = 'blue', color = 'red') +
facet_wrap(~color)

3.13 Biểu đồ thể hiện số lượng kim cương màu G và màu J
h %>% ggplot(aes(x = price)) +
geom_histogram(data = h %>% filter(color == 'G'), binwidth = 500, fill = 'red') +
geom_histogram(data = h %>% filter(color == 'J'), binwidth = 500, fill = 'green')

3.14 Biểu đồ thể hiện tỉ trọng kim cương theo mức giá
h %>% ggplot(aes(x = price)) +
geom_density(fill = 'red')

3.15 Biểu đồ thể hiện tỉ trọng kim cương theo mức giá của từng
loại
h %>% ggplot(aes(x = price)) +
geom_density(fill = 'green') +
facet_wrap(~loai)

3.16 Biểu đồ thể hiện số lượng kim cương theo màu
h %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = color)) +
geom_col() +
coord_polar('y')

3.17 Biểu đồ thể hiện sự phân bổ của kim cương theo giá và trọng
lượng
h %>% ggplot(aes(x = carat, y = price)) +
geom_point() +
xlab('Trọng lượng của kim cương') +
ylab('Giá trị của kim cương')

3.18 Biểu đồ thể hiện xu hướng phân bổ kim cương theo giá , carat
của từng màu
h %>% ggplot(aes(x = carat, y = price)) +
geom_point(color = 'red') +
geom_smooth(method = 'lm', color = 'green') +
facet_wrap('color')
## `geom_smooth()` using formula = 'y ~ x'

3.19 Biểu đồ thể hiên số kim cương theo carat và color
qplot(color, data = diamonds, geom = 'bar', weight = carat)+ scale_y_continuous("carat")

LS0tCnRpdGxlOiAiTmhp4buHbSB24bulIDUuIgphdXRob3I6ICJQaOG6oW0gWHXDom4gSG9hbiIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGRmX3ByaW50OiBrYWJsZQogICAgaGlnaGxpZ2h0OiB0YW5nbwogIHBkZl9kb2N1bWVudDoKICAgIGV4dHJhX2RlcGVuZGVuY2llczoKICAgICAgdmlldG5hbTogdXRmOAogICAgdG9jOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGNsYXNzLnNvdXJjZSA9ICJudW1iZXJMaW5lcyBsaW5lQW5jaG9ycyIsIAogIGNsYXNzLm91dHB1dCA9IGMoIm51bWJlckxpbmVzIGxpbmVBbmNob3JzIGNodW5rb3V0IikgCikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KERUKQoKYGBgCgpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9CmRpdi5zb3VyY2VDb2RlIHByZS5jaHVua291dCB7CiAgYmFja2dyb3VuZDogd2hpdGU7Cn0KYGBgCiAKIyAxIE3hu6VjIHRpw6p1IGLDoGkgbmdoacOqbiBj4bupdToKIC0gxJDDoW5oIGdpw6EgNTM5NDAgdmnDqm4ga2ltIGPGsMahbmcgdHLDqm4gZOG7ryBsaeG7h3UgRGlhbW9uZHM6OgogIAogIC0gKipDTEFSSVRZKiogKMSQ4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZykKICAtICoqQ09MT1IqKiAoTcOgdSBj4bunYSBraW0gY8awxqFuZykgIAogIC0gKipDQVJBVCoqIChUcuG7jW5nIGzGsOG7o25nIGPhu6dhIGtpbSBjxrDGoW5nKQogIC0gKipDVVQqKiAoVuG6v3QgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgKQogIAotIEfhu5NtIGPDsyAxMCBiaeG6v24sIMSRw7MgbMOgOgogIC0gKipQcmljZSoqOiBHacOhIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChVU0QpCiAgLSAqKkNhcmF0Kio6IFRy4buNbmcgbMaw4bujbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKGNhcmF0KQogIC0gKipDdXQqKjogQ2jhuqV0IGzGsOG7o25nIGPhu6dhIHbhur90IGPhuq90IChGYWlyLCBHb29kLCBWZXJ5IEdvb2QsIEV4Y2VsbGVudCwgSWRlYWwpCiAgLSAqKkNvbG9yKio6IE3DoHUgc+G6r2MgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcoRCxFLEksRixHLEgpCiAgLSAqKkNsYXJpdHkqKjogxJDhu5kgdHJvbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcoVlMyLFZWUzIsU0kxLFNJMixWUzEsVlZTMSkKICAtICoqWCoqOiDEkOG7mSBkw6BpIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChtbSkKICAtICoqWSoqOiDEkOG7mSBy4buZbmcgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQogIC0gKipaKio6IMSQ4buZIHPDonUgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQogIC0gKipUYWJsZSoqOiBDaGnhu4F1IHLhu5luZyBj4bunYSDEkeG7iW5oIGtpbSBjxrDGoW5nIHNvIHbhu5tpIMSRaeG7g20gcuG7mW5nIG5o4bqldAogIC0gKipEZXB0aCoqOiBU4bu3IGzhu4cgcGjhuqduIHRyxINtIMSR4buZIHPDonUKCiMgMiBUaeG6v24gaMOgbmggbmdoacOqbiBj4bupdToKVHLGsOG7m2MgaOG6v3QsIHRhIGPhuqduIHBo4bqjaSBn4buNaSBk4buvIGxp4buHdSBkaWFtb25kcyBsw6puIApgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggPC0gZGlhbW9uZHMKYGBgCgotIMSQ4buVaSB0w6puIGJp4bq/biAqKmN1dCoqIHRyb25nIGThu68gbGnhu4d1IGRpYW1vbmRzLCB0aGF5IGLhurFuZyB0w6puICoqbG/huqFpKiogxJHhu4MgdHLDoW5oIGLhu4sgbmjhuqdtIGzhuqtuIGtoaSDEkcOhbmggZ2nDoSBnaeG7r2EgbG/huqFpIGPhu6dhIGtpbSBjxrDGoW5nIHbDoCB24bq/dCBj4bqvdCBj4bunYSBraW0gY8awxqFuZyAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoIDwtIHJlbmFtZShoLCBsb2FpID0gY3V0KQpkYXRhdGFibGUoaCkKYGBgCgojIDMgVGnhur9uIGjDoG5oIG5naGnDqm4gY+G7qXUgCgojIyAzLjEgQmnhu4N1IMSR4buTIHThu4kgc+G7kSBsb+G6oWkga2ltIGPGsMahbmcKCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkobG9haSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGxvYWksbikpICsKICAgIGdlb21fY29sKGZpbGw9J2JlaWdlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQobi9sZW5ndGgoaCRjYXJhdCkpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0nIEjDrG5oMTogQmnhu4N1IMSR4buTIHThu4kgc+G7kSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZycpCiAgICAKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gQ8OhYyBsb+G6oWkga2ltIGPGsMahbmcgcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUKICAtIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbG/huqFpICoqSWRlYWwqKiBuaGnhu4F1IG5o4bqldCBjaGnhur9tIGjGoW4gNDAlIAogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBsb+G6oWkgKipGYWlyKiogw610IG5o4bqldCBjaGnhur9tIGNo4buJIGjGoW4gMyUgw610IGjGoW4gMTMgbOG6p24gc28gduG7m2kgbG/huqFpICoqSWRlYWwqKgogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBsb+G6oWkgKipHb29kKiosICoqVmVyeWdvb2QqKiwgKipQcmVtaXVtKiogY8OzIHPhu5EgbMaw4bujbmcgdMSDbmcgZOG6p24gbOG6p24gbMaw4bujdCBsw6A6IDksMSUsIDIyLDQlOyAyNSw2JQoKCiMjIDMuMiBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGNvbG9yLG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdibHVlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAneWVsbG93JykgKwogICAgbGFicyh4ID0gJ03DoHUnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQogICAgbGFicyh0aXRsZSA9JyBIw6xuaCAxOiBCaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcnKSArCiAgICBjb29yZF9mbGlwKCkKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gTcOgdSBz4bqvYyBj4bunYSBjw6FjIGtpbSBjxrDGoW5nIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1IAogIC0gU+G7kSBraW0gY8awxqFuZyBraMO0bmcgbcOgdSBjaGnhur9tIHBo4bqnbiBs4bubbiBz4buRIGzGsOG7o25nIGfhu5NtOiAqKkQsIEUsIEYqKiBjw7MgbOG6p24gbMaw4bujdCBsw6AgNjc3NSwgOTc5NywgOTU0MiB2acOqbiAKICAtIFPhu5Ega2ltIGPGsMahbmcgbcOgdSAqKkcqKiBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIDExMjkyIHZpw6puIAogIC0gU+G7kSBraW0gY8awxqFuZyBjw7MgbcOgdSBuaMawbmcgcuG6pXQgw610KCBn4bqnbiBuaMawIGtow7RuZyBtw6B1KSBjaGnhur9tIHBo4bqnbiBuaOG7jyBz4buRIGzGsOG7o25nIGfhu5NtOiAqKkgsIEksIEoqKiBjw7MgbOG6p24gbMaw4bujdCBsw6AgODMwNCwgNTQyMiwgMjgwOCB2acOqbi4KCiMjIDMuMyBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBtw6B1IApgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb2xvcix5ID0gbikpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKwogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ2JsdWUnKSArCiAgICBsYWJzKHggPSAnTcOgdSBz4bqvYycsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogVOG6rXAgaOG7o3AgY8OhYyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBtw6B1JykKYGBgCgotIFF1YW4gc8OhdCBiaeG7g3UgxJHhu5MgdGEgdGjhuqV5OgogIC0gVOG7iSB0cuG7jW5nIGdp4buvYSBjw6FjIG3DoHUgY+G7p2Ega2ltIGPGsMahbmcga2jDtG5nIMSR4buTbmcgxJHhu4F1CiAgLSBD4bqlcCDEkeG7mSBtw6B1ICoqRyoqIGPDsyBz4buRIGzGsOG7o25nIGzhu5tuIG5o4bqldCBsw6AgMTEyOTIgdmnDqm4gZ+G6pXAgNCBs4bqnbiBzbyB24bubaSBj4bqlcCDEkeG7mSBtw6B1IEogYsOpIG5o4bqldCBsw6AgMjgwOCB2acOqbgogIC0gQ+G6pXAgxJHhu5kgbcOgdSAqKkUqKiBjw7MgOTc5NyB2acOqbiAKICAtIEPhuqVwIMSR4buZIG3DoHUgKipGKiosIEgsIEQgY8OzIGzhuqduIGzGsOG7o3QgbMOgIDk1NDIsIDgzMDQsIDY3NzUgdmnDqm4KICAtIEPhuqVwIMSR4buZIG3DoHUgKipJKiogY8OzIDU0MjIgdmnDqm4gCgojIyAzLjQgQmnhu4N1IMSR4buTIHBow6JuIGLhu5Ugc+G7kSBsxrDhu6NuZyBtw6B1IGPhu6dhIGPDoWMga2ltIGPGsMahbmcoQmnhu4N1IMSR4buTIG5nYW5nKQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdncGxvdChhZXMoeCA9IGNvbG9yKSkgKwogICAgZ2VvbV9iYXIoKSArCiAgICBsYWJzKHggPSAnTcOgdSBz4bqvYycsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IEJp4buDdSDEkeG7kyBwaMOibiBi4buVIHPhu5EgbMaw4bujbmcgbcOgdSBj4bunYSBjw6FjIGtpbSBjxrDGoW5nKGJp4buDdSDEkeG7kyBuZ2FuZyknKQpgYGAKCi0gUXVhbiBzw6F0IGJp4buDdSDEkeG7kyB0YSB0aOG6pXk6CiAgLSBNw6B1IHPhuq9jIGPhu6dhIGPDoWMga2ltIGPGsMahbmcgcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUuIENobyB0aOG6pXkgbeG7qWMgxJHhu5kga2hhbiBoaeG6v20gY+G7p2EgdOG7q25nIGxv4bqhaSBtw6B1IGPhu6dhIGtpbSBjxrDGoW5nIAogIC0gU+G7kSBraW0gY8awxqFuZyBtw6B1ICoqRyoqIGNoaeG6v20gc+G7kSBsxrDhu6NuZyBs4bubbiBuaOG6pXQgduG7m2kgaMahbiAxMTAwMCB2acOqbiAKICAtIFPhu5Ega2ltIGPGsMahbmcgY8OzIG3DoHUgbmjGsG5nIHLhuqV0IMOtdCggZ+G6p24gbmjGsCBraMO0bmcgbcOgdSkgY2hp4bq/bSBwaOG6p24gbmjhu48gc+G7kSBsxrDhu6NuZyBn4buTbTogKipILCBJLCBKKiogY8OzIGzhuqduIGzGsOG7o3QgbMOgIGjGoW4gODAwMHZpw6puLCBn4bqnbiA1NTAwIHZpw6puLCBn4bqnbiAzMDAwIHZpw6puLgogIC0gU+G7kSBraW0gY8awxqFuZyBraMO0bmcgbcOgdSBjaGnhur9tIHBo4bqnbiBs4bubbiBz4buRIGzGsOG7o25nIGfhu5NtOiAqKkQsIEUsIEYqKiBjw7MgbOG6p24gbMaw4bujdCBsw6AgaMahbiA2NTAwIHZpw6puLCBn4bqnbiAxMDAwMCB2acOqbiwgeOG6pXAgeOG7iSA5NTAwIHZpw6puCgojIyAzLjUgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHPhu5Ega2ltIGPGsMahbmcgcGjDom4gdGhlbyBtw6B1CmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkobG9haSkgJT4lIHN1bW1hcmlzZShtPSBtZWFuKGNhcmF0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9haSx5ID0gbSkpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IC0xLCBjb2xvciA9ICdyZWQnKSArCiAgICBsYWJzKHggPSAnTcOgdScsIHkgPSAnTWVhbicpICsKICAgIGxhYnModGl0bGUgPSAnSMOsbmggMTogQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB0cnVuZyBiw6xuaCBz4buRIGtpbSBjxrDGoW5nIHRoZW8gbcOgdScpCmBgYAoKLSBRdWFuIHPDoXQgYmnhu4N1IMSR4buTIHRhIHRo4bqleSAKICAtIE3hu6ljIMSR4buZIHBow6JuIGLhu5EgdHJ1bmcgYsOsbmggY8OhYyBtw6B1IGPhu6dhIGtpbSBjxrDGoW5nIHTGsMahbmcgxJHhu5FpIMSR4buTbmcgxJHhu4F1IAogIC0gTcOgdSAqKkZhaXIqKiBjw7MgbeG7qWMgxJHhu5kgcGjDom4gYuG7kSB0cnVuZyBiw6xuaCBjYW8gbmjhuqV0IDEsMDUKICAtIE3DoHUgKipHb29kKiosICoqVmVyeSBHb29kKiosICoqUHJlbWl1bSoqY8OzIG3hu6ljIMSR4buZIHBow6JuIGLhu5EgdHJ1bmcgYsOsbmggZ+G6p24gMCw4IGPhu6UgdGjhu4MgbOG6p24gbMaw4bujdCBsw6A6IDAsODU7IDAsODE7IDAsODkKICAtIE3DoHUgKipJZGVhbCoqIGPDsyBt4bupYyDEkeG7mSBwaMOibiBi4buRIHRydW5nIGLDrG5oIHRo4bqlcCBuaOG6pXQgY2jhu4kgbuG6sW0g4bufIDAsNwogIAojIyAzLjYgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB04buJIGzhu4cga2ltIGPGsMahbmcgdGhlbyBsb+G6oWkgdsOgIG3DoHUKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQprIDwtIGggJT4lIGdyb3VwX2J5KGxvYWksIGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpCmsgJT4lIGdncGxvdChhZXMoeCA9IGxvYWksIHkgPSBuKSkgKwogIGdlb21fY29sKGRhdGEgPSBrICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0cnKSwgZmlsbCA9ICdyZWQnKSArCiAgZ2VvbV9jb2woZGF0YSA9IGsgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ2JsdWUnKQpgYGAKCi0gUXVhbiBzw6F0IGJp4buDdSDEkeG7kyB0YSB0aOG6pXk6CiAgLSBrIGzDoCBt4buZdCB04bqtcCBo4bujcCBt4bubaSB0aOG7kW5nIGvDqiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbG/huqFpIHbDoCBtw6B1IAogIC0gVGEgdGjhuqV5IHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBIIGNoaeG6v20gcGjhuqduIGzhu5tuIHRyb25nIHThu5VuZywgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBtw6B1IEcgY2jhu4kgY2hp4bq/bSBz4buRIMOtdCAKLSBD4bulIHRo4buDOiAKICAtIFPhu5AgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBHIGxv4bqhaSAqKklkZWFsKiogbmhp4buBdSBuaOG6pXQgduG7m2kgaMahbiAzMDAwIHZpw6puIHRyb25nIGtoaSDEkcOzIGPDuW5nIGxv4bqhaSBtw6B1IEggY2jhu4kgZ+G6p24gMjAwMCB2acOqbgogIC0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBtw6B1IEcgbG/huqFpICoqRmFpcioqIGNoaeG6v20gcGjhuqduIGzhu5tuIHbhu5tpIGjGoW4gMzAwIHZpw6puIHRyb25nIGtoaSDEkcOzIGPDuW5nIGxv4bqhaSBtw6B1IEggZ+G6p24gbmjGsCBraMO0bmcgY8OzCiAgLSBT4buQIGzGsOG7o25nIGtpbSBjxrDGoW5nIG3DoHUgRyBsb+G6oWkgKipWZXJ5R29vZCoqY2hp4bq/bSB0cnVuZyBiw6xuaCB24bubaSBn4bqnbiAyMDAwIHZpw6puIHRyb25nIGtoaSDEkcOzIGPDuW5nIGxv4bqhaSBtw6B1IEggY2jhu4kgZ+G6p24gNTAwIHZpw6puCiAgCgojIyAzLjcgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB24bq/dCBj4bqvdCB0YWJsZSBj4bunYSBraW0gY8awxqFuZwpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdyb3VwX2J5KHRhYmxlKSAlPiUgZmlsdGVyKHRhYmxlID49IDUzICYgdGFibGUgPD0gNjUpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXModGFibGUsbikpICsKICAgIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKwogICAgeGxhYignVGFibGUnKSArCiAgICB5bGFiKCdT4buRIGzGsOG7o25nJykgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBW4bq/dCBj4bqvdCB0YWJsZSBj4bunYSBraW0gY8awxqFuZycpCmBgYAoKLSBRdWFuIHPDoXQgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSDEkcaw4bujYzoKICAtIE3hu6ljIMSR4buZIHBow6JuIGLhu5UgY+G7p2EgY8OhYyB24bq/dCBj4bqvdCBraW0gY8awxqFuZyBrbyDEkeG7k25nIMSR4buBdSAKICAtIEPDoWMgdmnDqm4ga2ltIGPGsMahbmcgY8OzIHbhur90IGPhuq90IG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgNTUgxJHhur9uIDYwIGNoaeG6v20gc+G7kSBsxrDhu6NuZyBs4bubbiBuaOG6pXQgduG7m2kgaMahbiAzMDAwMCB2acOqbi4gQ+G7pSB0aOG7gyBsw6A6IFbhur90IGPhuq90IOG7nyA1NSw3NSB2w6AgNTYsNiBjaGnhur9tIHPhu5EgbMaw4bujbmcgbOG7m24gbmjhuqV0IHbhu5tpIGjGoW4gMTkwMDAgdmnDqm4gCiAgLSBDw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyB24bq/dCBj4bqvdCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDUyLDUgxJHhur9uIGTGsOG7m2kgNTUgY2hp4bq/bSBz4buRIGzGsOG7o25nIHTGsMahbmcgxJHhu5FpIG5o4buPIHbhu5tpIGjGoW4gMzAwMCB2acOqbi4gCiAgLSBDw6FjIHZpw6puIGtpbSBjxrDGoW5nIGPDsyB24bq/dCBj4bqvdCBu4bqxbSB0cm9uZyBraG/huqNuZyB04burIDYwIMSR4bq/biBkxrDhu5tpIDY1IGNoaeG6v20gc+G7kSBsxrDhu6NuZyBuaOG7jyBuaOG6pXQgduG7m2kgaMahbiA0MDAwIHZpw6puLiBD4bulIHRo4buDIGzDoDogVuG6v3QgY+G6r3Qg4bufIDY1IGNoaeG6v20gc+G7kSBsxrDhu6NuZyBuaOG7jyBuaOG6pXQgduG7m2kgY2jhu4kga2hv4bqjbmcgMjAwIHZpw6puIAoKICAKCiMjIDMuOCBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHRydW5nIGLDrG5oIGdpw6Ega2ltIGPGsMahbmcgdGhlbyBsb+G6oWkKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShsb2FpLGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKHByaWNlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9haSx5ID0gbSkpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKwogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtKSkpICsKICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHJ1bmcgYsOsbmggZ2nDoSBraW0gY8awxqFuZyB0aGVvIGxv4bqhaScpCmBgYAoKIyMgMy45IFThuq1wIGjhu6NwIGPDoWMgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gY+G6pXAgxJHhu5kgdGluaCBraGnhur90CmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ3JvdXBfYnkoY2xhcml0eSxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gbikpICsKICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKwogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsKICAgIGxhYnMoeCA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArCiAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDE6IFThuq1wIGjhu6NwIGPDoWMgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gY+G6pXAgxJHhu5kgdGluaCBraGnhur90JykKYGBgCgojIyAzLjEwIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHLhu41uZyBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZwoKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjYXJhdCkgJT4lIGZpbHRlcihjYXJhdCA+PSAwLjIzICYgY2FyYXQgPD0gMi4wNSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKGNhcmF0LG4pKSArCiAgICBnZW9tX2NvbChmaWxsPSdibHVlJykgKwogICAgeGxhYignQ2FyYXQnKSArCiAgICB5bGFiKCdT4buRIGzGsOG7o25nJykgKwogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBUcuG7jW5nIGzGsOG7o25nIGPhu6dhIGtpbSBjxrDGoW5nJykKYGBgCgpRdWEgaMOsbmggdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjOgotIFRhIHRo4bqleSB0cuG7jW5nIGzGsOG7o25nIGPhu6dhIGtpbSBjxrDGoW5nIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1LiDEkGEgc+G7kSB04bqtcCB0cnVuZyDhu58gbeG7qWMgdOG7qyAwLDMtMSw2IGNhcmF0Ci0gQ8OhYyBt4bupYyB0cuG7jW5nIGzGsOG7o25nIGNoaeG6v20gcGjhuqduIGzhu5tuIGzDoCAwLDMgOyAwLDY1IHbDoCAxIGNhcmF0Ci0gQ8OhYyBt4bupYyB0cuG7jW5nIGzGsOG7o25nIGNoaeG6v20gc+G7kSBsxrDhu6NuZyDDrXQgbmjhuqV0IGzDoCB04burIDEsNi0gMSw5IAoKIyMgMy4xMSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGtpbSBjxrDGoW5nIHRoZW8gbcOgdQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdncGxvdChhZXMoeCA9IHByaWNlLCBmaWxsID0gY29sb3IpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDApCmBgYAoKLSBRdWFuIHPDoXQgYmnhu4N1IMSR4buTIHRhIHRo4bqleTogS2ltIGPGsMahbmcgY8OgbmcgaGnhur9tIHRow6wgY8OzIGdpw6EgdHLhu4sgY8OgbmcgY2FvIHbDrSBk4bulIG5oxrAgbcOgdSBKLEkuIE5nxrDhu6NjIGzhuqFpIG3hu6ljIGThu5kgcGjhu5UgYmnhur9uIGPhu6dhIGPDoWMgbcOgdSBELCBFICwgRiBsw6AgcuG6pXQgY2FvCiAgCiMjIDMuMTIgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bupYyBk4buZIHBow6JuIGLhu5UgY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBt4bupYyBnacOhIApgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdncGxvdChhZXMoeCA9IHByaWNlKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwLCBmaWxsID0gJ2JsdWUnLCBjb2xvciA9ICdyZWQnKSArCiAgZmFjZXRfd3JhcCh+Y29sb3IpCmBgYAoKIyMgMy4xMyBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBHIHbDoCBtw6B1IEoKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSkpICsKICBnZW9tX2hpc3RvZ3JhbShkYXRhID0gaCAlPiUgZmlsdGVyKGNvbG9yID09ICdHJyksIGJpbndpZHRoID0gNTAwLCBmaWxsID0gJ3JlZCcpICsKICBnZW9tX2hpc3RvZ3JhbShkYXRhID0gaCAlPiUgZmlsdGVyKGNvbG9yID09ICdKJyksIGJpbndpZHRoID0gNTAwLCBmaWxsID0gJ2dyZWVuJykKYGBgCgojIyAzLjE0IEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG7iSB0cuG7jW5nIGtpbSBjxrDGoW5nIHRoZW8gbeG7qWMgZ2nDoQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9CmggJT4lIGdncGxvdChhZXMoeCA9IHByaWNlKSkgKwogIGdlb21fZGVuc2l0eShmaWxsID0gJ3JlZCcpCmBgYAoKIyMgMy4xNSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu4kgdHLhu41uZyBraW0gY8awxqFuZyB0aGVvIG3hu6ljIGdpw6EgY+G7p2EgdOG7q25nIGxv4bqhaSAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSkpICsKICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdncmVlbicpICsKICBmYWNldF93cmFwKH5sb2FpKQpgYGAKCiMjIDMuMTYgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSAKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpoICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSAnJywgeSA9IG4sZmlsbCA9IGNvbG9yKSkgKwogICAgZ2VvbV9jb2woKSArCiAgICBjb29yZF9wb2xhcigneScpCmBgYAoKIyMgMy4xNyBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu7EgcGjDom4gYuG7lSBj4bunYSBraW0gY8awxqFuZyB0aGVvIGdpw6EgdsOgIHRy4buNbmcgbMaw4bujbmcgCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ2dwbG90KGFlcyh4ID0gY2FyYXQsIHkgPSBwcmljZSkpICsKICBnZW9tX3BvaW50KCkgKwogIHhsYWIoJ1Ry4buNbmcgbMaw4bujbmcgY+G7p2Ega2ltIGPGsMahbmcnKSArIAogIHlsYWIoJ0dpw6EgdHLhu4sgY+G7p2Ega2ltIGPGsMahbmcnKQpgYGAKCiMjIDMuMTggQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB4dSBoxrDhu5tuZyBwaMOibiBi4buVIGtpbSBjxrDGoW5nIHRoZW8gZ2nDoSAsIGNhcmF0IGPhu6dhIHThu6tuZyBtw6B1CmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KaCAlPiUgZ2dwbG90KGFlcyh4ID0gY2FyYXQsIHkgPSBwcmljZSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gJ3JlZCcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICdncmVlbicpICsgCiAgZmFjZXRfd3JhcCgnY29sb3InKQpgYGAKCiMjIDMuMTkgQmnhu4N1IMSR4buTIHRo4buDIGhpw6puIHPhu5Ega2ltIGPGsMahbmcgdGhlbyBjYXJhdCB2w6AgY29sb3IKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpxcGxvdChjb2xvciwgZGF0YSA9IGRpYW1vbmRzLCBnZW9tID0gJ2JhcicsIHdlaWdodCA9IGNhcmF0KSsgc2NhbGVfeV9jb250aW51b3VzKCJjYXJhdCIpCmBgYAoKCgoK