vẽ biểu sử dụng một biến
Biểu đồ 1
- Biểu đồ thể hiện số người tham gia bảo hiểm y tế theo giới tính
library("dplyr")
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library("ggplot2")
g %>% group_by(sex) %>% summarise(n = n()) %>%
ggplot(aes(n,sex)) +
geom_col(fill='pink') +
labs(title = " Biểu đồ 1. thể hiện số người tham gia bảo hiểm y tế theo sex(giới tính) ") +
geom_text(aes(label = n),vjust = 1, color = 'black') +
labs(x = 'Số lượng', y = 'giới tính')
Nhận xét: - Nhìn trong biểu đồ dễ dàng nhận
thấy có 676 người giới tính nam tham gia bảo hiểm y tế và có 662 người
giới tính nữ tham gia bảo hiểm y tế - Cho thấy trong xã hội hầu hết dù
là giới tính nào thì mọi người vẫn tham gia bảo hiểm y tế đầy đủ, số
lượng người tham gia bảo hiểm y tế có giới tính nam và nữ xấp xỉ bằng
nhau.
Biểu đồ 2
- Biểu đồ thể hiện số người tham gia bảo hiểm y tế theo số con cái
(children)
g %>% group_by(children) %>% summarise(n = n()) %>%
ggplot(aes(children,n)) +
geom_col(fill='lightgreen') +
geom_text(aes(label = n),vjust = 1, color = 'orange') +
labs(x = 'số con cái', y = 'số lượng')
Nhận xét: - Kết quả cho thấy gia đình không có
con chiếm đa số trong số lượng người tham gia bảo hiểm y tế - Có 574
người tham gia bảo hiểm y tế không có con, 324 người tham gia bảo hiểm y
tế có 1 con, 240 người tham gia bảo hiểm y tế có 2 con, 157 người tham
gia bảo hiểm y tế có 3 con, 25 người tham gia bảo hiểm y tế có 4 con, 18
người tham gia bảo hiểm y tế có 5 con - Như thế cho thấy người có càng
nhiều con thì số lượng tham gia bảo hiểm sẽ giảm đi.
Biểu đồ 3
- Biểu đồ thể hiện số lượng người tham gia bảo hiểm y tế theo khu vực
(region)
g %>% group_by(region) %>% summarise(n = n()) %>%
ggplot(aes(n,region)) +
geom_col(fill='pink') +
labs(title = " Biểu đồ 3. thể hiện số người tham gia bảo hiểm y tế theo region(khu vực) ") +
geom_text(aes(label = n),vjust = 1, color = 'black') +
labs(x = 'Số lượng', y = 'khu vực')
Nhận xét: - Kết quả cho hàng ứng với 325 người
tham gia bảo hiểm y tế ở vùng southwest(Tây Nam), 364 người tham gia bảo
hiểm y tế ở vùng southeast(đông nam), 325 người tham gia bảo hiểm y tế ở
vùng northwest(tây bắc),324 người tham gia bảo hiểm y tế ở vùng
northeast(tây nam)
Biểu đồ 4
- Biểu đồ biểu thị mật độ của chỉ số bmi
g %>% ggplot(aes(x = bmi)) +
geom_density(fill = 'lightyellow')

Biểu đồ 5
- Biểu đồ số lượng chi phí tham gia baor hiểm y tế theo biến
smoker
g %>% ggplot(aes(x = charges)) +
geom_histogram(data = g %>% filter(smoker == 'no'), binwidth = 5000, fill = 'black') +
geom_histogram(data = g %>% filter(smoker == 'yes'), binwidth = 5000, fill = 'white')
Nhận xét: - Kết quả cho thấy phần lớn người
không hút thuốc chiếm tỷ lệ chi phí tham gia bảo hiểm y tế cao hơn người
có hút thuốc với chi phí tham gia bảo hiểm y tế
Biểu đồ 6
- Biểu đồ biểu thị mật độ chhi phí bao hiểm y tế theo tuổi
library("dplyr")
g %>% ggplot(aes(x = charges, fill = age)) +
geom_density()
## Warning: The following aesthetics were dropped during statistical transformation: fill.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
## the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
## variable into a factor?

Biểu đồ 7
- Biểu đồ biểu thị mật độ cho phí bảo hiểm y tế theo giới tính
g %>% ggplot(aes(x = charges)) +
geom_density(fill = 'green') +
facet_wrap(~sex)

Biểu đồ 8
- Biểu đồ thể hiện chỉ số khối cơ thể trung bình theo tuổi và giới
tính
g %>% group_by(age,sex) %>% summarise(m = mean(bmi)) %>%
ggplot(aes(x = age,y = m)) +
geom_col(position = 'dodge') +
facet_wrap(~sex) +
geom_text(aes(label = round(m))) +
labs(x = 'age', y = 'Số lượng')
## `summarise()` has grouped output by 'age'. You can override using the `.groups`
## argument.
Nhận xét: - Cột x thể hiện tuổi từ 18 đến 64
tuổi - Cột y thể hiện giá trị trung bình chỉ số khối cơ thể dựa vào cột
x và giới tính - Kết quả cho thấy giá trị trung bình theo từng độ tuổi
và theo từng giới tính biểu thị rõ ràng như trên, giúp dễ nhận biết để
lấy số liệu
Biểu đồ 9
- Biểu đồ thể hiện số lượng người tham gia bảo hiểm y tế dựa theo tuổi
và khu vực
g %>% group_by(age,region) %>% summarise(n=n()) %>%
ggplot(aes(x = age,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~region) +
geom_text(aes(label = n),vjust = 1, color = 'white') +
labs(x = 'Tuổi', y = 'Số lượng')
## `summarise()` has grouped output by 'age'. You can override using the `.groups`
## argument.
Nhận xét: - Cột x thể hiện tuổi của người tham
gia bâỏ hiểm y tế
- Cột y thể hiện số lượng người tham gia bảo hiểm y tế - Mỗi đồ thị
tượng trưng cho bốn 4 khu vực khác nhau - Từ kết quả trên cho thấy độ
tuổi 18 tring 4 khu vực đều chiếm số lượng khá cao so với các độ tuổi
khác.
Biểu đồ 10
- Biểu đồ thể hiện tổng chỉ số khối cơ thể trung bình theo vùng
g2 <- g %>% group_by(region) %>% summarise(avg_price15= mean(bmi))
g2 %>% ggplot(aes(x = region, y = avg_price15))+
geom_col(fill = 'green') +
geom_text(aes(label = round(avg_price15)), vjust = 2, color ='white') +
labs(title = 'Hình 2.16: Chi phí khối cơ thể trung bình theo vùng miền' , x = 'region', y = 'Average Price')
Nhận xétt: - Cột x thể hiện khu vực với 4 vùng
northeast, northwest. Southeast, southwest. - Cột y thể hiện tổng chỉ số
khối cơ thể trung bình
Biểu đồ 11
- Biểu đồ thể hiện tổng chỉ số khối trung bình theo tuổi và giới
tinh
g %>% group_by(age,sex) %>% summarise(m = mean(bmi)) %>%
ggplot(aes(x = age,y = m)) +
geom_col(position = 'dodge') +
facet_wrap(~sex) +
geom_text(aes(label= round(m)), vjust=2, color='red')+
labs(x= 'tuổi', y= 'chỉ số khối cơ thể trung bình',title='Hình 23: Giá trị trung bình của bmi theo age và sex ')
## `summarise()` has grouped output by 'age'. You can override using the `.groups`
## argument.
- Cột x thể hiện tuổi của người tham gia bảo hiểm y tế từ 18 đến 64 tuổi
- Cột y thể hiện chỉ số khối cơ thể trung bình theo tuổi và giới tính -
Hai đồ thị tương ứng với hai giới tính nam và nữ
Biểu đồ 12
- Biểu đồ thể hiện trung vị chi phí bảo hiểm y tế theo khu vực
g %>% group_by(region) %>% summarise(m= median(charges)) %>%
ggplot(aes(x = region,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'white') +
labs(x = 'vùng', y = 'Trung vị',title = "Hình 28: Biểu đồ trung vị chi phí bảo hiểm theo vùng")
Nhận xét: - Cột x thể hiện vùng với 4 vùng
northeast, northwest, southeast, southwwest. - Cột y thể hiện trung vị
chi phí bảo hiểm y tế - Kết quả thể hiện số lượng trung vị chi phí bảo
hiểm y tế theo 4 vùng
Biểu đồ 13
- Biểu đồ thể hiện mật độ chi phí bảo hiểm y tế theo giới tính
g %>% ggplot(aes(x = charges)) +
geom_density(fill = 'green') +
facet_wrap(~sex)
Nhận xét: - cột x thể hiện chi phí bảo hiểm y
tế - Cột y thể hiện mật độ chi phí bảo hiểm y tế - Hai đồ thị tương ứng
với 2 giới tính nam và nữ
Biểu đồ 14
- Biểu đồ thể hiện mật độ chi phí bảo hiểm y tế dựa theo vùng
g %>% ggplot(aes(x = charges)) +
geom_density(fill = 'lightpink') +
facet_wrap(~region)
Nhận xét: - Cột x thể hiện chi phí bảo hiểm y
tế - Cột y thể hiện mật độ chi phí bảo hiểm theo vùng
- 4 đồ thị tương đương với mỗi vùng khác nhau
Biểu đồ 15
- Biểu đồ thể hiện trung vị chi phí bảo hiểm y tế theo giới tính
g %>% group_by(sex) %>% summarise(m= median(charges)) %>%
ggplot(aes(x = sex,y = m)) +
geom_col(position = 'dodge') +
geom_text(aes(label = round(m,2)), vjust = 2, color = 'white') +
labs(x = 'giới tính', y = 'Trung vị',title = "Hình 28: Biểu đồ trung vị chi phí bảo hiểm theo giới tính")
Nhận xét: - Cột x thể hiện giới tính tượng
trưng cho hai cột - Cột y thể hiện trung vị chi phí bảo hiểm y tế - giữa
hai cột không có sự chênh lệnh quá nhiều
Biểu đồ 16
- Biểu đồ thể hiện chi phí y tế trung bình theo tuổi và giới tính
g %>% group_by(age,sex) %>% summarise(m = mean(charges)) %>%
ggplot(aes(x = age,y = m)) +
geom_col(position = 'dodge') +
facet_wrap(~sex) +
geom_text(aes(label= round(m)), vjust=2, color='red')+
labs(x= 'Tuổi', y= 'chi phí trung bình',title='Hình 23: Giá trị trung bình của charges theo age và sex ')
## `summarise()` has grouped output by 'age'. You can override using the `.groups`
## argument.
Nhận xét: - Cột x thể hiện độ tuổi từ 18 đến
64 tuổi - Cột y thể hiện chi phí BHYT trung bình
- 2 đồ thị tương ứng với 2 giới tính
- Kết quả cho thấy số liệu cụ thể của từng độ tuổi và từng giới tính
Biểu đồ 17
- Biểu đồ thể hiện chi phí y tế trung hình theo khu vực
g3 <- g %>% group_by(region) %>% summarise(avg_price15= mean(charges))
g3 %>% ggplot(aes(x = region, y = avg_price15))+
geom_col(fill = 'green') +
geom_text(aes(label = round(avg_price15)), vjust = 2, color ='white') +
labs(title = 'Hình 2.16: Chi phí y tế trung bình theo bảo hiểm y tế theo vùng miền' , x = 'region', y = 'Average Price')
Nhận xét: - Cột x thể hiện khu vực với 4 khu
vực khác nhau
- cột y thể hiện chi phí y tế trung bình theo mỗi vùng
Biểu đồ 18
- Biểu đồ thể hiện số lượng người tham gia bảo hiểm y tế theo
vùng
g %>% ggplot(aes(x = region)) +
geom_bar() +
labs(x = 'Loại', y = 'Số lượng') +
coord_flip()
Nhận xét: - Kết quả cho thấy 4 cột ngang tương
ứng với 4 vùng
Biểu đồ 19
- Biểu đồ thể hiện số lượng người tham gia bảo hiểm y tế theo chỉ số
khối cơ thể và vùng miền
g %>% group_by(bmi,region) %>% summarise(n=n()) %>%
ggplot(aes(x = bmi,y = n)) +
geom_col(position = 'dodge') +
facet_wrap(~region) +
geom_text(aes(label = n),vjust = 2, color = 'green') +
labs(x = 'bmi', y = 'Số lượng')
## `summarise()` has grouped output by 'bmi'. You can override using the `.groups`
## argument.
Nhận xét: - Kết quả cho ra số liệu cụ thể cho
mỗi bmi và 4 đồ thị tương ứng cho mỗi phòng
Biểu đồ 20
- Biểu đồ thể hiện số lượng người tham gia bảo hiểm y tế theo chỉ số
bmi phân theo vùng miền
g %>% ggplot(aes(x = bmi, fill = region)) +
geom_histogram(binwidth = 1)
Nhận xét: - Cột x thể hiện chỉ số bmi - cột y
thể hiện số lượng - Kết quả cho ra đồ thị phân theo 4 màu sắc tương
đương 4 vùng theo chỉ bmi
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAicHRxR2lhbyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIFRoZW1lOiAiZGVmYXVsdCINCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICBUb2M6IHRydWUNCiAgICBUb2NfZGVwdGg6ICcyJw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyAqKkdp4bubaSB0aGnhu4d1IHbhu4EgYuG7mSBk4buvIGxp4buHdSoqDQoNCi0gQ2jhu41uIGLhu5kgZOG7ryBsaeG7h3UgaW5zdXJhbmNlIG7Ds2kgduG7gSBjaGkgcGjDrSBi4bqjbyBoaeG7g20geSB04bq/IGPDoSBuaMOibiB0aGVvIHThu6tuZyDEkeG7mSB0deG7lWkg4bufIGtodSB24buxYyBN4bu5IExhIFRpbmggDQoNCi0gR8OhbiBi4buZIGThu68gbGnhu4d1IHRow6BuaCBnIMSR4buDIGThu4UgdGhhbyB0w6FjDQpgYGB7cn0NCmcgPC0gcmVhZC5jc3YoJ0Q6L2luc3VyYW5jZS5jc3YnLGhlYWRlciA9IFQgKQ0KYGBgDQotIELhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtIDEzMzggcXVhbiBzw6F0IHbDoCA3IGJp4bq/biDhu6luZyB24bubaSA3IGPhu5l0DQpgYGB7cn0NCmRpbShnKQ0KYGBgDQpgYGB7cn0NCm5hbWVzKGcpDQpgYGANCiAgLSBBZ2U6IMSQ4buZIHR14buVaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IGPDoSBuaMOibiAodOG7qyAxOCDEkeG6v24gNjQgdHXhu5VpKQ0KICAtIFNleDogZ2nhu5tpIHTDrW5oDQogIC0gYm1pOiBDaOG7iSBz4buRIGto4buRaSBjxqEgdGjhu4MsIGN1bmcgY+G6pXAgc+G7sSBoaeG7g3UgYmnhur90IHbhu4EgY8ahIHRo4buDLCBjw6JuIG7hurduZyB0xrDGoW5nIMSR4buRaSBjYW8gaGF5IHRo4bqlcCBzbyB24bubaSBjaGnhu4F1IGNhbywgY2jhu4kgc+G7kSBraMOhY2ggcXVhbiB24buBIHRy4buNbmcgbMaw4bujbmcgY8ahIHRo4buDIChrZy9tXjIpIHPhu60gZOG7pW5nIHThu7cgbOG7hyBnaeG7r2EgY2hp4buBdSBjYW8gdsOgIGPDom4gbuG6t25nLCBsw70gdMaw4bufbmcgbmjhuqV0IGzDoCAxOCw1IMSR4bq/biAyNCw5Lg0KICAtIGNoaWxkcmVuOiBz4buRIGNvbiBj4bunYSBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20gDQogIC0gc21va2VyOiBuZ8aw4budaSB0aGFtIGdpYSBjw7MgaMO6dCB0aHXhu5FjIGhheSBraMO0bmcgDQogIC0gcmVnaW9uOiBraHUgduG7sWMg4bufIG3hu7kgbGEgdGluaCBiYW8gZ+G7k20gxJHDtG5nIGLhuq9jLCDEkcO0bmcgbmFtLCB0w6J5IG5hbSwgdMOieSBi4bqvYy4NCiAgLSBjaGFyZ2VzOiBDaGkgcGjDrSB5IHThur8gY8OhIG5ow6JuIGRvIGLhuqNvIGhp4buDbSB5IHThur8gdGhhbmggdG/DoW4NCg0KIyAqKnbhur0gYmnhu4N1IHPhu60gZOG7pW5nIG3hu5l0IGJp4bq/bioqDQoNCiMjICoqKkJp4buDdSDEkeG7kyAxKioqDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIG5nxrDhu51pIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmggDQpgYGB7cn0NCmxpYnJhcnkoImRwbHlyIikNCmxpYnJhcnkoImdncGxvdDIiKQ0KZyAlPiUgZ3JvdXBfYnkoc2V4KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSANCiAgZ2dwbG90KGFlcyhuLHNleCkpICsNCiAgICBnZW9tX2NvbChmaWxsPSdwaW5rJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyAxLiB0aOG7gyBoaeG7h24gc+G7kSBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IHRoZW8gc2V4KGdp4bubaSB0w61uaCkgIikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDEsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdT4buRIGzGsOG7o25nJywgeSA9ICdnaeG7m2kgdMOtbmgnKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKiogDQotIE5ow6xuIHRyb25nIGJp4buDdSDEkeG7kyBk4buFIGTDoG5nIG5o4bqtbiB0aOG6pXkgY8OzIDY3NiBuZ8aw4budaSBnaeG7m2kgdMOtbmggbmFtIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8gdsOgIGPDsyA2NjIgbmfGsOG7nWkgZ2nhu5tpIHTDrW5oIG7hu68gdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyANCi0gQ2hvIHRo4bqleSB0cm9uZyB4w6MgaOG7mWkgaOG6p3UgaOG6v3QgZMO5IGzDoCBnaeG7m2kgdMOtbmggbsOgbyB0aMOsIG3hu41pIG5nxrDhu51pIHbhuqtuIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8gxJHhuqd5IMSR4bunLCBz4buRIGzGsOG7o25nIG5nxrDhu51pIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8gY8OzIGdp4bubaSB0w61uaCBuYW0gdsOgIG7hu68geOG6pXAgeOG7iSBi4bqxbmcgbmhhdS4NCg0KIyMgKioqQmnhu4N1IMSR4buTIDIqKioNCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbmfGsOG7nWkgdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyB0aGVvIHPhu5EgY29uIGPDoWkgKGNoaWxkcmVuKQ0KYGBge3J9DQogZyAlPiUgZ3JvdXBfYnkoY2hpbGRyZW4pICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY2hpbGRyZW4sbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdsaWdodGdyZWVuJykgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDEsIGNvbG9yID0gJ29yYW5nZScpICsNCiAgICBsYWJzKHggPSAnc+G7kSBjb24gY8OhaScsIHkgPSAnc+G7kSBsxrDhu6NuZycpDQpgYGANCioqKk5o4bqtbiB4w6l0OioqKg0KLSBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IGdpYSDEkcOsbmgga2jDtG5nIGPDsyBjb24gY2hp4bq/bSDEkWEgc+G7kSB0cm9uZyBz4buRIGzGsOG7o25nIG5nxrDhu51pIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8NCi0gQ8OzIDU3NCBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IGtow7RuZyBjw7MgY29uLCAzMjQgbmfGsOG7nWkgdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyBjw7MgMSBjb24sIDI0MCBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IGPDsyAyIGNvbiwgMTU3IG5nxrDhu51pIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8gY8OzIDMgY29uLCAyNSBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IGPDsyA0IGNvbiwgMTggbmfGsOG7nWkgdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyBjw7MgNSBjb24gDQotIE5oxrAgdGjhur8gY2hvIHRo4bqleSBuZ8aw4budaSBjw7MgY8Ogbmcgbmhp4buBdSBjb24gdGjDrCBz4buRIGzGsOG7o25nIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSBz4bq9IGdp4bqjbSDEkWkuIA0KDQojIyAqKipCaeG7g3UgxJHhu5MgMyoqKg0KDQotIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IHRoZW8ga2h1IHbhu7FjIChyZWdpb24pDQpgYGB7cn0NCmcgJT4lIGdyb3VwX2J5KHJlZ2lvbikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhuLHJlZ2lvbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdwaW5rJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyAzLiB0aOG7gyBoaeG7h24gc+G7kSBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IHRoZW8gcmVnaW9uKGtodSB24buxYykgIikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDEsIGNvbG9yID0gJ2JsYWNrJykgKw0KICAgIGxhYnMoeCA9ICdT4buRIGzGsOG7o25nJywgeSA9ICdraHUgduG7sWMnKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKioNCi0gS+G6v3QgcXXhuqMgY2hvIGjDoG5nIOG7qW5nIHbhu5tpIDMyNSBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IOG7nyB2w7luZyBzb3V0aHdlc3QoVMOieSBOYW0pLCAzNjQgbmfGsOG7nWkgdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyDhu58gdsO5bmcgc291dGhlYXN0KMSRw7RuZyBuYW0pLCAzMjUgbmfGsOG7nWkgdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyDhu58gdsO5bmcgbm9ydGh3ZXN0KHTDonkgYuG6r2MpLDMyNCBuZ8aw4budaSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IOG7nyB2w7luZyBub3J0aGVhc3QodMOieSBuYW0pDQoNCiMjICoqKkJp4buDdSDEkeG7kyA0KioqDQoNCi0gQmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBt4bqtdCDEkeG7mSBj4bunYSBjaOG7iSBz4buRIGJtaQ0KYGBge3J9DQpnICU+JSBnZ3Bsb3QoYWVzKHggPSBibWkpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ2xpZ2h0eWVsbG93JykNCmBgYA0KDQojIyAqKipCaeG7g3UgxJHhu5MgNSoqKg0KDQotIEJp4buDdSDEkeG7kyBz4buRIGzGsOG7o25nIGNoaSBwaMOtIHRoYW0gZ2lhIGJhb3IgaGnhu4NtIHkgdOG6vyB0aGVvIGJp4bq/biBzbW9rZXINCmBgYHtyfQ0KZyAlPiUgZ2dwbG90KGFlcyh4ID0gY2hhcmdlcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IGcgJT4lIGZpbHRlcihzbW9rZXIgPT0gJ25vJyksIGJpbndpZHRoID0gNTAwMCwgZmlsbCA9ICdibGFjaycpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IGcgJT4lIGZpbHRlcihzbW9rZXIgPT0gJ3llcycpLCBiaW53aWR0aCA9IDUwMDAsIGZpbGwgPSAnd2hpdGUnKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKioNCi0gS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBwaOG6p24gbOG7m24gbmfGsOG7nWkga2jDtG5nIGjDunQgdGh14buRYyBjaGnhur9tIHThu7cgbOG7hyBjaGkgcGjDrSB0aGFtIGdpYSBi4bqjbyBoaeG7g20geSB04bq/IGNhbyBoxqFuIG5nxrDhu51pIGPDsyBow7p0IHRodeG7kWMgduG7m2kgY2hpIHBow60gdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyANCg0KIyMgKioqQmnhu4N1IMSR4buTIDYqKioNCg0KLSBCaeG7g3UgxJHhu5MgYmnhu4N1IHRo4buLIG3huq10IMSR4buZIGNoaGkgcGjDrSBiYW8gaGnhu4NtIHkgdOG6vyB0aGVvIHR14buVaQ0KYGBge3J9DQpsaWJyYXJ5KCJkcGx5ciIpDQpnICU+JSBnZ3Bsb3QoYWVzKHggPSBjaGFyZ2VzLCBmaWxsID0gYWdlKSkgKw0KICBnZW9tX2RlbnNpdHkoKQ0KYGBgDQogDQojIyAqKipCaeG7g3UgxJHhu5MgNyoqKg0KDQotIEJp4buDdSDEkeG7kyBiaeG7g3UgdGjhu4sgbeG6rXQgxJHhu5kgY2hvIHBow60gYuG6o28gaGnhu4NtIHkgdOG6vyB0aGVvIGdp4bubaSB0w61uaA0KYGBge3J9DQpnICU+JSBnZ3Bsb3QoYWVzKHggPSBjaGFyZ2VzKSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdncmVlbicpICsNCiAgZmFjZXRfd3JhcCh+c2V4KQ0KYGBgDQoNCiMjICoqKkJp4buDdSDEkeG7kyA4KioqDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBjaOG7iSBz4buRIGto4buRaSBjxqEgdGjhu4MgdHJ1bmcgYsOsbmggdGhlbyB0deG7lWkgdsOgIGdp4bubaSB0w61uaA0KYGBge3J9DQpnICU+JSBncm91cF9ieShhZ2Usc2V4KSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKGJtaSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhZ2UseSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZmFjZXRfd3JhcCh+c2V4KSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0pKSkgKw0KICAgIGxhYnMoeCA9ICdhZ2UnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKiogDQotIEPhu5l0IHggdGjhu4MgaGnhu4duIHR14buVaSB04burIDE4IMSR4bq/biA2NCB0deG7lWkNCi0gQ+G7mXQgeSB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBjaOG7iSBz4buRIGto4buRaSBjxqEgdGjhu4MgZOG7sWEgdsOgbyBj4buZdCB4IHbDoCBnaeG7m2kgdMOtbmggDQotIEvhur90IHF14bqjIGNobyB0aOG6pXkgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCB0aGVvIHThu6tuZyDEkeG7mSB0deG7lWkgdsOgIHRoZW8gdOG7q25nICBnaeG7m2kgdMOtbmggYmnhu4N1IHRo4buLIHLDtSByw6BuZyBuaMawIHRyw6puLCBnacO6cCBk4buFIG5o4bqtbiBiaeG6v3QgxJHhu4MgbOG6pXkgc+G7kSBsaeG7h3UNCg0KIyMgKioqQmnhu4N1IMSR4buTIDkqKioNCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyBk4buxYSB0aGVvIHR14buVaSB2w6Aga2h1ICB24buxYyANCmBgYHtyfQ0KZyAlPiUgZ3JvdXBfYnkoYWdlLHJlZ2lvbikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGFnZSx5ID0gbikpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBmYWNldF93cmFwKH5yZWdpb24pICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAxLCBjb2xvciA9ICd3aGl0ZScpICsNCiAgICBsYWJzKHggPSAnVHXhu5VpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KKioqTmjhuq1uIHjDqXQ6KioqDQotIEPhu5l0IHggdGjhu4MgaGnhu4duIHR14buVaSBj4bunYSBuZ8aw4budaSB0aGFtIGdpYSBiw6Lhu48gaGnhu4NtIHkgdOG6vyAgDQotIEPhu5l0IHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyANCi0gTeG7l2kgxJHhu5MgdGjhu4sgdMaw4bujbmcgdHLGsG5nIGNobyBi4buRbiA0IGtodSB24buxYyBraMOhYyBuaGF1DQotIFThu6sga+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRo4bqleSDEkeG7mSB0deG7lWkgMTggdHJpbmcgNCBraHUgduG7sWMgxJHhu4F1IGNoaeG6v20gc+G7kSBsxrDhu6NuZyBraMOhIGNhbyBzbyB24bubaSBjw6FjIMSR4buZIHR14buVaSBraMOhYy4gDQoNCiMjICoqKkJp4buDdSDEkeG7kyAxMCoqKg0KDQotIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG7lW5nIGNo4buJIHPhu5Ega2jhu5FpIGPGoSB0aOG7gyB0cnVuZyBiw6xuaCB0aGVvIHbDuW5nIA0KYGBge3J9DQpnMiA8LSBnICU+JSBncm91cF9ieShyZWdpb24pICU+JSBzdW1tYXJpc2UoYXZnX3ByaWNlMTU9IG1lYW4oYm1pKSkNCg0KZzIgJT4lIGdncGxvdChhZXMoeCA9IHJlZ2lvbiwgeSA9IGF2Z19wcmljZTE1KSkrDQogICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdncmVlbicpICsNCiAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoYXZnX3ByaWNlMTUpKSwgdmp1c3QgPSAyLCBjb2xvciA9J3doaXRlJykgKw0KICAgICAgICAgIGxhYnModGl0bGUgPSAnSMOsbmggMi4xNjogQ2hpIHBow60ga2jhu5FpIGPGoSB0aOG7gyB0cnVuZyBiw6xuaCB0aGVvIHbDuW5nIG1p4buBbicgLCB4ID0gJ3JlZ2lvbicsIHkgPSAnQXZlcmFnZSBQcmljZScpDQpgYGANCioqKk5o4bqtbiB4w6l0dDoqKioNCi0gQ+G7mXQgeCB0aOG7gyBoaeG7h24ga2h1ICB24buxYyB24bubaSA0IHbDuW5nIG5vcnRoZWFzdCwgbm9ydGh3ZXN0LiBTb3V0aGVhc3QsIHNvdXRod2VzdC4gDQotIEPhu5l0IHkgdGjhu4MgaGnhu4duIHThu5VuZyBjaOG7iSBz4buRIGto4buRaSBjxqEgdGjhu4MgdHJ1bmcgYsOsbmggDQoNCiMjICoqKkJp4buDdSDEkeG7kyAxMSoqKg0KDQotIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdOG7lW5nIGNo4buJIHPhu5Ega2jhu5FpIHRydW5nIGLDrG5oIHRoZW8gdHXhu5VpIHbDoCBnaeG7m2kgdGluaA0KYGBge3J9DQpnICU+JSBncm91cF9ieShhZ2Usc2V4KSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKGJtaSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhZ2UseSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZmFjZXRfd3JhcCh+c2V4KSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQobSkpLCB2anVzdD0yLCBjb2xvcj0ncmVkJykrIA0KICBsYWJzKHg9ICd0deG7lWknLCB5PSAnY2jhu4kgc+G7kSBraOG7kWkgY8ahIHRo4buDIHRydW5nIGLDrG5oJyx0aXRsZT0nSMOsbmggMjM6IEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgYm1pIHRoZW8gYWdlIHbDoCBzZXggJykNCmBgYA0KLSBD4buZdCB4IHRo4buDIGhp4buHbiB0deG7lWkgY+G7p2EgbmfGsOG7nWkgdGhhbSBnaWEgYuG6o28gaGnhu4NtIHkgdOG6vyB04burIDE4IMSR4bq/biA2NCB0deG7lWkNCi0gQ+G7mXQgeSB0aOG7gyBoaeG7h24gY2jhu4kgc+G7kSBraOG7kWkgY8ahIHRo4buDIHRydW5nIGLDrG5oIHRoZW8gdHXhu5VpIHbDoCBnaeG7m2kgdMOtbmggDQotIEhhaSDEkeG7kyB0aOG7iyB0xrDGoW5nIOG7qW5nIHbhu5tpIGhhaSBnaeG7m2kgdMOtbmggbmFtIHbDoCBu4buvDQoNCiMjICoqKkJp4buDdSDEkeG7kyAxMioqKg0KDQotIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gdHJ1bmcgduG7iyBjaGkgcGjDrSBi4bqjbyBoaeG7g20geSB04bq/IHRoZW8ga2h1IHbhu7FjDQpgYGB7cn0NCmcgJT4lIGdyb3VwX2J5KHJlZ2lvbikgJT4lIHN1bW1hcmlzZShtPSBtZWRpYW4oY2hhcmdlcykpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSByZWdpb24seSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKw0KICAgIGxhYnMoeCA9ICd2w7luZycsIHkgPSAnVHJ1bmcgduG7iycsdGl0bGUgPSAiSMOsbmggMjg6IEJp4buDdSDEkeG7kyB0cnVuZyB24buLIGNoaSBwaMOtIGLhuqNvIGhp4buDbSB0aGVvIHbDuW5nIikNCmBgYA0KKioqTmjhuq1uIHjDqXQ6KioqDQotIEPhu5l0IHggdGjhu4MgaGnhu4duIHbDuW5nIHbhu5tpIDQgdsO5bmcgbm9ydGhlYXN0LCBub3J0aHdlc3QsIHNvdXRoZWFzdCwgc291dGh3d2VzdC4gDQotIEPhu5l0IHkgdGjhu4MgaGnhu4duIHRydW5nIHbhu4sgY2hpIHBow60gYuG6o28gaGnhu4NtIHkgdOG6vw0KLSBL4bq/dCBxdeG6oyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB0cnVuZyB24buLIGNoaSBwaMOtIGLhuqNvIGhp4buDbSB5IHThur8gdGhlbyA0IHbDuW5nIA0KDQojIyAqKipCaeG7g3UgxJHhu5MgMTMqKioNCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG3huq10IMSR4buZIGNoaSBwaMOtIGLhuqNvIGhp4buDbSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmggDQpgYGB7cn0NCmcgJT4lIGdncGxvdChhZXMoeCA9IGNoYXJnZXMpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ2dyZWVuJykgKw0KICBmYWNldF93cmFwKH5zZXgpDQpgYGANCioqKk5o4bqtbiB4w6l0OioqKg0KLSBj4buZdCB4IHRo4buDIGhp4buHbiBjaGkgcGjDrSBi4bqjbyBoaeG7g20geSB04bq/IA0KLSBD4buZdCB5IHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSBjaGkgcGjDrSBi4bqjbyBoaeG7g20geSB04bq/IA0KLSBIYWkgxJHhu5MgdGjhu4sgdMawxqFuZyDhu6luZyB24bubaSAyIGdp4bubaSB0w61uaCBuYW0gdsOgIG7hu68gDQoNCiMjICoqKkJp4buDdSDEkeG7kyAxNCoqKg0KDQotIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgY2hpIHBow60gYuG6o28gaGnhu4NtIHkgdOG6vyBk4buxYSB0aGVvIHbDuW5nDQpgYGB7cn0NCmcgJT4lIGdncGxvdChhZXMoeCA9IGNoYXJnZXMpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ2xpZ2h0cGluaycpICsNCiAgZmFjZXRfd3JhcCh+cmVnaW9uKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKioNCi0gQ+G7mXQgeCB0aOG7gyBoaeG7h24gY2hpIHBow60gYuG6o28gaGnhu4NtIHkgdOG6vyANCi0gQ+G7mXQgeSB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgY2hpIHBow60gYuG6o28gaGnhu4NtIHRoZW8gdsO5bmcgIA0KLSA0IMSR4buTIHRo4buLIHTGsMahbmcgxJHGsMahbmcgduG7m2kgbeG7l2kgdsO5bmcga2jDoWMgbmhhdSANCg0KIyMgKioqQmnhu4N1IMSR4buTIDE1KioqDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB0cnVuZyB24buLIGNoaSBwaMOtIGLhuqNvIGhp4buDbSB5IHThur8gdGhlbyBnaeG7m2kgdMOtbmggDQpgYGB7cn0NCmcgJT4lIGdyb3VwX2J5KHNleCkgJT4lIHN1bW1hcmlzZShtPSBtZWRpYW4oY2hhcmdlcykpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzZXgseSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKw0KICAgIGxhYnMoeCA9ICdnaeG7m2kgdMOtbmgnLCB5ID0gJ1RydW5nIHbhu4snLHRpdGxlID0gIkjDrG5oIDI4OiBCaeG7g3UgxJHhu5MgdHJ1bmcgduG7iyBjaGkgcGjDrSBi4bqjbyBoaeG7g20gdGhlbyBnaeG7m2kgdMOtbmgiKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKioNCi0gQ+G7mXQgeCB0aOG7gyBoaeG7h24gZ2nhu5tpIHTDrW5oIHTGsOG7o25nIHRyxrBuZyBjaG8gaGFpIGPhu5l0IA0KLSBD4buZdCB5IHRo4buDIGhp4buHbiB0cnVuZyB24buLIGNoaSBwaMOtIGLhuqNvIGhp4buDbSB5IHThur8gDQotIGdp4buvYSBoYWkgY+G7mXQga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHbmggcXXDoSBuaGnhu4F1IA0KDQojIyAqKipCaeG7g3UgxJHhu5MgMTYqKioNCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGNoaSBwaMOtIHkgdOG6vyB0cnVuZyBiw6xuaCB0aGVvIHR14buVaSB2w6AgZ2nhu5tpIHTDrW5oDQpgYGB7cn0NCmcgJT4lIGdyb3VwX2J5KGFnZSxzZXgpICU+JSBzdW1tYXJpc2UobSA9IG1lYW4oY2hhcmdlcykpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhZ2UseSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZmFjZXRfd3JhcCh+c2V4KSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQobSkpLCB2anVzdD0yLCBjb2xvcj0ncmVkJykrIA0KICBsYWJzKHg9ICdUdeG7lWknLCB5PSAnY2hpIHBow60gdHJ1bmcgYsOsbmgnLHRpdGxlPSdIw6xuaCAyMzogR2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBjaGFyZ2VzIHRoZW8gYWdlIHbDoCBzZXggJykNCmBgYA0KKioqTmjhuq1uIHjDqXQ6KioqDQotIEPhu5l0IHggdGjhu4MgaGnhu4duIMSR4buZIHR14buVaSB04burIDE4IMSR4bq/biA2NCB0deG7lWkgDQotIEPhu5l0IHkgdGjhu4MgaGnhu4duIGNoaSBwaMOtIEJIWVQgdHJ1bmcgYsOsbmggIA0KLSAyIMSR4buTIHRo4buLIHTGsMahbmcg4bupbmcgduG7m2kgMiBnaeG7m2kgdMOtbmggIA0KLSBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHPhu5EgbGnhu4d1IGPhu6UgdGjhu4MgY+G7p2EgdOG7q25nIMSR4buZIHR14buVaSB2w6AgdOG7q25nIGdp4bubaSB0w61uaCAgDQogDQojIyAqKipCaeG7g3UgxJHhu5MgMTcqKioNCg0KLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGNoaSBwaMOtIHkgdOG6vyB0cnVuZyBow6xuaCB0aGVvIGtodSB24buxYw0KYGBge3J9DQpnMyA8LSBnICU+JSBncm91cF9ieShyZWdpb24pICU+JSBzdW1tYXJpc2UoYXZnX3ByaWNlMTU9IG1lYW4oY2hhcmdlcykpDQoNCmczICU+JSBnZ3Bsb3QoYWVzKHggPSByZWdpb24sIHkgPSBhdmdfcHJpY2UxNSkpKw0KICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnZ3JlZW4nKSArDQogICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKGF2Z19wcmljZTE1KSksIHZqdXN0ID0gMiwgY29sb3IgPSd3aGl0ZScpICsNCiAgICAgICAgICBsYWJzKHRpdGxlID0gJ0jDrG5oIDIuMTY6IENoaSBwaMOtIHkgdOG6vyB0cnVuZyBiw6xuaCB0aGVvIGLhuqNvIGhp4buDbSB5IHThur8gdGhlbyB2w7luZyBtaeG7gW4nICwgeCA9ICdyZWdpb24nLCB5ID0gJ0F2ZXJhZ2UgUHJpY2UnKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKioNCi0gQ+G7mXQgeCB0aOG7gyBoaeG7h24ga2h1IHbhu7FjIHbhu5tpIDQga2h1IHbhu7FjIGtow6FjIG5oYXUgIA0KLSBj4buZdCB5IHRo4buDIGhp4buHbiBjaGkgcGjDrSB5IHThur8gdHJ1bmcgYsOsbmggdGhlbyBt4buXaSB2w7luZyANCg0KIyMgKioqQmnhu4N1IMSR4buTIDE4KioqDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIG5nxrDhu51pIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8gdGhlbyB2w7luZw0KYGBge3J9DQpnICU+JSBnZ3Bsb3QoYWVzKHggPSByZWdpb24pKSArDQogICAgZ2VvbV9iYXIoKSArDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsNCiAgICBjb29yZF9mbGlwKCkNCmBgYA0KKioqTmjhuq1uIHjDqXQ6KioqIA0KLSBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IDQgY+G7mXQgbmdhbmcgdMawxqFuZyDhu6luZyB24bubaSA0IHbDuW5nICANCg0KIyMgKioqQmnhu4N1IMSR4buTIDE5KioqDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIG5nxrDhu51pIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8gdGhlbyBjaOG7iSBz4buRIGto4buRaSBjxqEgdGjhu4MgdsOgIHbDuW5nIG1p4buBbg0KYGBge3J9DQpnICU+JSBncm91cF9ieShibWkscmVnaW9uKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYm1pLHkgPSBuKSkgKw0KICAgIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICAgIGZhY2V0X3dyYXAofnJlZ2lvbikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ2dyZWVuJykgKw0KICAgIGxhYnMoeCA9ICdibWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKiogDQotIEvhur90IHF14bqjIGNobyByYSBz4buRIGxp4buHdSBj4bulIHRo4buDIGNobyBt4buXaSBibWkgdsOgIDQgxJHhu5MgdGjhu4sgdMawxqFuZyDhu6luZyBjaG8gbeG7l2kgcGjDsm5nICANCg0KIyMgKioqQmnhu4N1IMSR4buTIDIwKioqDQoNCi0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIG5nxrDhu51pIHRoYW0gZ2lhIGLhuqNvIGhp4buDbSB5IHThur8gdGhlbyBjaOG7iSBz4buRIGJtaSBwaMOibiB0aGVvIHbDuW5nIG1p4buBbiAgDQpgYGB7cn0NCmcgJT4lIGdncGxvdChhZXMoeCA9IGJtaSwgZmlsbCA9IHJlZ2lvbikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKQ0KYGBgDQoqKipOaOG6rW4geMOpdDoqKioNCi0gQ+G7mXQgeCB0aOG7gyBoaeG7h24gY2jhu4kgc+G7kSBibWkgDQotIGPhu5l0IHkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgDQotIEvhur90IHF14bqjIGNobyByYSDEkeG7kyB0aOG7iyBwaMOibiB0aGVvIDQgbcOgdSBz4bqvYyB0xrDGoW5nIMSRxrDGoW5nIDQgdsO5bmcgdGhlbyBjaOG7iSBibWkgIA0KDQoNCg0KDQoNCg0KDQo=