Bộ dữ liệu DIAMONDS gồm:

Trong bộ dữ liệu này ta có 53940 quan sát với 10 biến tương ứng với 53940 viên kim cương với 10 đặc tính của nó.

-Carat: Trọng lương của viên kim cương.

-Cut: Chất lượng kim cương với 5 mức độ ‘Fair, Good, Very Good, Premium, Ideal’.

-Color: MÀu sắc kim cương với 7 mức độ ‘D<E<F<G<H<I<J’.

-Clarity: Độ tinh khiết viên kim cương với 8 mức độ ‘IF< VVS1< VVS2< VS1< VS2< SI1< SI2< I1’.

-Depth: chiều sâu của viên kim cương.

-Table: bề mặt kim cương

-Price: giá bán kim cương

-X chiều dài

-Y chiều rộng

-Z chiều cao

names(d)
##  [1] "carat"   "cut"     "color"   "clarity" "depth"   "table"   "price"  
##  [8] "x"       "y"       "z"

Phân tích dữ liệu diamonds với dạng biểu đồ

A.Biểu đồ của dữ liệu CUT như sau

library(tidyverse)
library(scales)
 d <- diamonds
 d %>% ggplot(aes(x = cut)) + 
          labs(title= "Biểu đồ thể hiện 5 mức độ của Carat") +
          geom_bar() +
          labs(x = 'Loại', y = 'Số lượng')

  • Trong biểu đồ này ta có thể thấy sự chênh lệch số lượng kim cuong của 5 mức độ là không đồng điều.

-Cao nhất là Ideal với 21551 viên, và loại thấp nhất là Fair với 1610 viên.

-Để dễ dàng quan sát thì ta có thể dựa vào biểu đồ bên dưới.

1.Biểu đồ này cho thấy số lương của từng loại kim cương

d %>%  group_by(cut) %>% summarise(freq= n()) %>%
ggplot(aes(x = cut,y = freq)) +
  geom_col(fill='orange') +
  labs(title="Biểu đồ cụ thể 5 mức độ CUT") +
  geom_text(aes(label =freq),vjust =2, color ='black') +
  labs(x= 'Loại', y='Số lượng')

2.Và chúng ta có thể thấy rõ hơn số lượng kim cương qua biểu đỏ này

d%>% group_by(cut,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = cut,y = n)) +
    geom_col(fill='orange')  +
    facet_wrap(~color) +
    geom_text(aes(label = n),vjust = 2, color = 'black')

    labs(x = 'Loại', y = 'Số lượng')
## $x
## [1] "Loại"
## 
## $y
## [1] "Số lượng"
## 
## attr(,"class")
## [1] "labels"

3.Biểu đồ trên hiển thị số lượng kim cương theo từng loại cắt, được phân loại theo màu sắc của kim cương. Các biểu đồ con tương ứng cho từng màu sắc của kim cương. Đồng thời, các chú thích số lượng kim cương được thêm vào để làm cho biểu đồ trở nên dễ hiểu hơn.

d %>% ggplot(aes(x = cut)) +
  geom_density(fill = 'orange') +
  facet_wrap(~cut)

4.Đây là biểu đồ mật độ của giá kim cương, với mỗi cách cắt khác nhau của kim cương được hiển thị trong một bảng biểu đồ riêng biệt. Điều này giúp so sánh phân phối giá của kim cương giữa các loại cắt khác nhau.

d %>% group_by(cut) %>% summarise(m= mean(carat)) %>%
  ggplot(aes(x = cut,y = m)) +
    geom_col(position = 'dodge') +
    geom_text(aes(label = round(m,2)), vjust = 2, color = 'orange') +
    labs(x ='Loại', y = 'Mean')

d<- diamonds
d<- d %>% group_by(cut, color) %>% summarise( n= n())

5.giá trị trung bình của trọng lượng cut cho mỗi loại cắt của kim cương được thể hiện qua biểu đồ trên. Đồng thời, các chú thích số liệu được thêm vào để làm cho biểu đồ trở nên dễ hiểu hơn.

d %>% ggplot(aes(x = cut, y = n)) +
  geom_col(data = d %>% filter(color == 'H'), fill = 'orange') +
  geom_col(data = d %>% filter(color == 'I'), fill = 'blue')

6. Biểu đồ nay cho ta biết số lượng kim cương theo từng loại cắt và mà sắc của nó. Trên trục x nó thể hiện chất lượng cắt của kim cương, trục y cho biết sô lượng kim cương. Màu ’Blue thể hiện số kim cương có màu I, ’Orange thể hiện số kim cương có màu H.

B.Biểu đồ của dữ liệu CARAT như sau

d <-diamonds
d %>% ggplot(aes(x = carat)) +
  geom_density(fill = 'pink')

d <- diamonds 
d <- d %>% mutate(caratC = cut(carat,5, label = c('rất nhỏ', 'nhỏ','vừa','lớn','rất lớn')))
d %>% ggplot(aes(x = caratC)) +
  labs(title= "Biểu đồ Carat") +
  geom_bar(fill = 'pink')

1.Trọng lượng carat được phân loại thành 5 nhóm : rất nhỏ, nhỏ, vừa, lớn, rất lớn.

d1 <- d%>% mutate (tlcarat = cut(carat,5, label = c("Rất nhẹ", "Nhẹ", "Vừa", "Nặng", "Rất năng")))
d1 %>% group_by(tlcarat) %>% summarise(n = n()) %>%
  ggplot(aes(tlcarat,n)) +
   geom_col(fill= 'pink') +
   labs(title= "Biểu đồ thể hiện carat")+
   geom_text (aes(label = n), vjust=-0.5, color= 'black')+
   labs(x= "Trọng lượng", y= "Số lượng")

2. Khi nhìn vào biểu đồ này ta vẫn thấy có sự chênh lênh nhất định ở từng loai:

-“Rất nhẹ” chiếm đại đa số với số lượng 43781 viên. “Rất nặng” chiếm thiểu số với số lượng là 3 nhỏ hơn rất nhiều so với các cột khác. Điều này cho thấy rằng kim cương càng có trọng lượng lớn thì càng hiếm.

-Để dễ dàng so sáng thì ta có thể nhìn vào số phần trăm của chúng có thể chiếm băng biểu đồ kế tiếp.

d1 <- d%>% mutate (tlcarat = cut(carat,5, label = c("Rất nhẹ", "Nhẹ", "Vừa", "Nặng", "Rất năng")))
d1 %>% group_by(tlcarat) %>% summarise(n = n()) %>%
  ggplot(aes(tlcarat,n)) +
   geom_col(fill= 'pink') +
   labs(title= "Biểu đồ thể hiện carat")+
   geom_text (aes(label = percent(n/length(d$carat))), vjust=-0.5, color= 'black')+
   labs(x= "Trọng lượng", y= "Số lượng")

d%>% ggplot(aes(x = carat)) +
  geom_density(fill = 'pink') +
  facet_wrap(~cut)

3.Mật độ của trọng lượng carat của kim cương. Biểu đồ được phân loại thành các bảng con dựa trên các loại cắt khác nhau của kim cương, giúp so sánh phân phối của trọng lượng carat giữa các loại cắt.

C. Biểu đồ của dữ liệu COLOR

  • Màu sắc của kim cương được phân chia gôm 7 màu: D,E,F,G,H,I,J. Được thể hiện như sau.
d %>%  group_by(color) %>% summarise(freq= n()) %>%
ggplot(aes(x = color,y = freq)) +
  geom_col(fill='brown') +
  labs(title="Biểu đồ cụ thể 5 mức độ Color") +
  geom_text(aes(label =freq),vjust =-0.5, color ='black') +
  labs(x= 'Màu sắt', y='Số lượng')

-Tổng thể ta có thể thấy sự bố của kim cương với 7 màu sắc cũng không quá chênh lệch. Với G chiếm 11292 viên là màu sắc có số lượng đa số, và màu J là loại chiếm số lượng thấp nhất với 2808 viên. Các màu còn lại có sự chệnh lệch xem xem nhau.

d %>% group_by(color) %>% summarise(n=n()) %>% ggplot(aes(color,n)) +
  geom_col(fill= "brown")+
  labs(title ="Biểu đồ thể hiện COLOR") +
  geom_text(aes(label= percent(n/length(d$color))), vjusst= 1, color= "black") +
  labs(x="Màu sắc", y="Số lượng")

D.Biểu đồ của dữ liệu PRICE như sau

d %>% ggplot(aes(x = price)) +
  labs(title=" Biểu đồ Price")+
  geom_histogram(binwidth = 500, fill = 'blue', color = 'red')

d %>% ggplot(aes(x = price, fill = color)) +
  labs(title="Biểu đồ Price")+
  geom_histogram(binwidth = 500)

1.Biểu đồ của giá kim cương, với mỗi khoảng giá được phân loại dựa trên màu sắc của kim cương. Biểu diễn số lượng kim cương có giá trong một khoảng giá cố định là 500 đơn vị.

d %>% ggplot(aes(x = price, fill = cut)) +
  labs(title=" Biểu đồ Price") +
  geom_density()

2.Mật độ của giá kim cương, với các plot mật độ được phân biệt bởi loại cắt của kim cương. Điều này giúp nhìn nhận sự phân phối của giá kim cương theo từng loại cắt khác nhau.

d %>% ggplot(aes(x = price)) +
  geom_density(fill = 'blue')

d %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(x = '', y = n,fill = color)) +
  labs(title= "Biểu đồ Price") +
    geom_col() +
    coord_polar('y')

3.Số lượng mẫu kim cương theo màu sắc. Điều này cho phép so sánh tỉ lệ phân phối của mẫu kim cương theo màu sắc một cách trực quan.

d%>% ggplot(aes(x = price)) +
  labs(title=" Biểu đồ Price H&I") +
  geom_histogram(data = d %>% filter(color == 'H'), binwidth = 500, fill = 'purple') +
  geom_histogram(data = d %>% filter(color == 'I'), binwidth = 500, fill = 'blue')

4. Biểu đồ giá kim cương, với biểu đồ phân loại dựa trên màu sắc của kim cương. Mỗi thanh biểu diễn số lượng kim cương có giá trong một khoảng giá cố định, và có hai histogram riêng biệt cho màu H và I với màu sắc tương ứng là blue và green.

d %>% ggplot(aes(x = price)) +
  labs(title="Biểu đồ Price")+
  geom_histogram (data = d %>% filter(color == 'F'), fill = 'purple') +
  geom_histogram(data = d %>% filter(color == 'H'), fill = 'blue')

d %>% ggplot(aes(x = price)) +
  geom_density(fill = 'blue') +
  facet_wrap(~cut)

5.biểu đồ mật độ của giá kim cương, với mỗi nhóm biểu diễn dữ liệu được phân loại dựa trên loại cắt của kim cương. Mỗi nhóm có một mật độ riêng biệt của nó, và phân loại được thực hiện để so sánh phân phối của giá kim cương giữa các loại cắt.

d %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(x = '', y = n,fill = color)) +
    geom_col() +
    geom_text(aes(label = n),position = position_stack(vjust = 1))

E. Biểu đồ thể hiện CLARITY

d %>%  group_by(clarity) %>% summarise(freq= n()) %>%
ggplot(aes(x = clarity,y = freq)) +
  geom_col(fill='purple') +
  labs(title="Biểu đồ 8 mức độ tinh khiết ") +
  geom_text(aes(label =freq),vjust = -0.5, color ='black') +
  labs(x= 'Loại', y='Số lượng')

1.Với 8 mức độ tinh khiêt của kim cương thì ta có thể thấy SI1 chiếm số lượng nhiều nhất, tiếp theo đó là VS2. Mức độ tinh khiết thấp nhất là *I1**. Và dưới đây là biểu đồ thể hiện số phần trằm mà từng mức độ tinh khiết có thể chiếm được.

d %>% group_by(clarity) %>% summarise(n = n()) %>%
  ggplot(aes(clarity,n)) +
   geom_col(fill= 'purple') +
   labs(title= "Biểu đồ thể hiện mức độ tinh khiết")+
   geom_text (aes(label = percent(n/length(d$clarity))), vjust=-0.3, color= 'black')+
   labs(x= "Loại ", y= "Số lượng")

d %>% group_by(color,clarity) %>% summarise(n=n()) %>%
  ggplot(aes(x = clarity,y = n)) +
    geom_col(fill = 'purple') +
    facet_wrap(~color) +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    labs(x = 'Mức độ tinh khiết', y = 'Số lượng')

Biểu đồ cho thấy tần suất của các nhóm mức độ tinh khiết trong từng màu sắc. Biểu đồ giúp chúng ta hiểu được mối quan hệ giữa mức độ tinh khiết và màu sắc của kim cương trong tập dữ liệu.

d %>% ggplot(aes(x = clarity)) +
  geom_density(fill = 'purple') +
  facet_wrap(~cut)

2.Đây là biểu đồ mật độ của tinh khiết kim cương, với mỗi cách cắt khác nhau của kim cương được hiển thị trong một bảng biểu đồ riêng biệt. Điều này giúp so sánh độ tinh khiết của kim cương giữa các loại cắt khác nhau.

d %>% ggplot(aes(x = clarity)) +
  labs(title= "Biểu đồ Clarity")+
  geom_density(fill = 'purple')

F. Biểu đồ thể hiện DEPTH

d %>% ggplot(aes(x = depth)) + 
          labs(title= "Biểu đồ thể hiện độ sâu ") +
          geom_bar() +
          labs(x = 'Loại', y = 'Số lượng')

d %>% ggplot(aes(x = depth)) +
  labs(title ="Biểu đồ Deth ") +
  geom_density(fill = 'green') +
  facet_wrap(~cut)

Thể hiện chất lường chiều sâu của kim cương ở từng biểu đồ riêng biệt

d %>% ggplot(aes(x = depth)) +
  geom_density(fill = 'green')

LS0tDQp0aXRsZTogIkJhcnRjaGF0Ig0KYXV0aG9yOiAibnRudCINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgdG9jOiB0cnVlDQotLS0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmQgPC0gZGlhbW9uZHMNCg0Kc3RyKGQpDQpgYGANCg0KDQoNCg0KDQoNCiMgKipC4buZIGThu68gbGnhu4d1IERJQU1PTkRTIGfhu5NtOioqDQoNCiMjIyMgVHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IHRhIGPDsyA1Mzk0MCBxdWFuIHPDoXQgduG7m2kgMTAgYmnhur9uIHTGsMahbmcg4bupbmcgduG7m2kgNTM5NDAgdmnDqm4ga2ltIGPGsMahbmcgduG7m2kgMTAgxJHhurdjIHTDrW5oIGPhu6dhIG7Dsy4gDQoNCiAtQ2FyYXQ6IFRy4buNbmcgbMawxqFuZyBj4bunYSB2acOqbiBraW0gY8awxqFuZy4NCiAgICANCiAtQ3V0OiBDaOG6pXQgbMaw4bujbmcga2ltIGPGsMahbmcgduG7m2kgNSBt4bupYyDEkeG7mSAnRmFpciwgR29vZCwgVmVyeSBHb29kLCBQcmVtaXVtLCBJZGVhbCcuDQogICAgDQogLUNvbG9yOiBNw4B1IHPhuq9jIGtpbSBjxrDGoW5nIHbhu5tpIDcgbeG7qWMgxJHhu5kgJ0Q8RTxGPEc8SDxJPEonLg0KICAgIA0KIC1DbGFyaXR5OiDEkOG7mSB0aW5oIGtoaeG6v3QgdmnDqm4ga2ltIGPGsMahbmcgduG7m2kgOCBt4bupYyDEkeG7mSAnSUY8IFZWUzE8IFZWUzI8IFZTMTwgVlMyPCBTSTE8IFNJMjwgSTEnLg0KICAgIA0KIC1EZXB0aDogY2hp4buBdSBzw6J1IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nLg0KICAgIA0KIC1UYWJsZTogYuG7gSBt4bq3dCBraW0gY8awxqFuZw0KICAgIA0KIC1QcmljZTogZ2nDoSBiw6FuIGtpbSBjxrDGoW5nIA0KICAgIA0KIC1YIGNoaeG7gXUgZMOgaSANCiAgICANCiAtWSBjaGnhu4F1IHLhu5luZw0KICAgIA0KIC1aIGNoaeG7gXUgY2FvDQogICAgDQogICAgDQoNCmBgYHtyfQ0KbmFtZXMoZCkNCmBgYA0KDQoNCg0KIyAqKlBow6JuIHTDrWNoIGThu68gbGnhu4d1IGRpYW1vbmRzIHbhu5tpIGThuqFuZyBiaeG7g3UgxJHhu5MqKg0KDQoNCiMjICoqQS5CaeG7g3UgxJHhu5MgY+G7p2EgZOG7ryBsaeG7h3UgKkNVVCogbmjGsCBzYXUqKg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzY2FsZXMpDQogZCA8LSBkaWFtb25kcw0KIGQgJT4lIGdncGxvdChhZXMoeCA9IGN1dCkpICsgDQogICAgICAgICAgbGFicyh0aXRsZT0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gNSBt4bupYyDEkeG7mSBj4bunYSBDYXJhdCIpICsNCiAgICAgICAgICBnZW9tX2JhcigpICsNCiAgICAgICAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KICANCiAgDQogIC0gVHJvbmcgYmnhu4N1IMSR4buTIG7DoHkgdGEgY8OzIHRo4buDIHRo4bqleSBz4buxIGNow6puaCBs4buHY2ggc+G7kSBsxrDhu6NuZyBraW0gY3VvbmcgY+G7p2EgNSBt4bupYyDEkeG7mSBsw6Aga2jDtG5nIMSR4buTbmcgxJFp4buBdS4NCiAgICANCiAgLUNhbyBuaOG6pXQgbMOgICoqSWRlYWwqKiB24bubaSAyMTU1MSB2acOqbiwgdsOgIGxv4bqhaSB0aOG6pXAgbmjhuqV0IGzDoCAqKkZhaXIqKiB24bubaSAxNjEwIHZpw6puLg0KICAgIA0KLcSQ4buDIGThu4UgZMOgbmcgcXVhbiBzw6F0IHRow6wgdGEgY8OzIHRo4buDIGThu7FhIHbDoG8gYmnhu4N1IMSR4buTIGLDqm4gZMaw4bubaS4NCg0KDQoNCiMjIyMgMS5CaeG7g3UgxJHhu5MgbsOgeSBjaG8gdGjhuqV5IHPhu5EgbMawxqFuZyBj4bunYSB04burbmcgbG/huqFpIGtpbSBjxrDGoW5nIA0KDQoNCg0KYGBge3J9DQpkICU+JSAgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKGZyZXE9IG4oKSkgJT4lDQpnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IGZyZXEpKSArDQogIGdlb21fY29sKGZpbGw9J29yYW5nZScpICsNCiAgbGFicyh0aXRsZT0iQmnhu4N1IMSR4buTIGPhu6UgdGjhu4MgNSBt4bupYyDEkeG7mSBDVVQiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPWZyZXEpLHZqdXN0ID0yLCBjb2xvciA9J2JsYWNrJykgKw0KICBsYWJzKHg9ICdMb+G6oWknLCB5PSdT4buRIGzGsOG7o25nJykNCg0KYGBgDQoNCg0KDQojIyMjIDIuVsOgIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHLDtSBoxqFuIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgcXVhIGJp4buDdSDEkeG7jyBuw6B5IA0KDQoNCg0KDQpgYGB7cn0NCmQlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY3V0LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J29yYW5nZScpICArDQogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KDQojIyMjIDMuQmnhu4N1IMSR4buTIHRyw6puIGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIGxv4bqhaSBj4bqvdCwgxJHGsOG7o2MgcGjDom4gbG/huqFpIHRoZW8gbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZy4gQ8OhYyBiaeG7g3UgxJHhu5MgY29uIHTGsMahbmcg4bupbmcgY2hvIHThu6tuZyBtw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nLiDEkOG7k25nIHRo4budaSwgY8OhYyBjaMO6IHRow61jaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIMSRxrDhu6NjIHRow6ptIHbDoG8gxJHhu4MgbMOgbSBjaG8gYmnhu4N1IMSR4buTIHRy4bufIG7Dqm4gZOG7hSBoaeG7g3UgaMahbi4NCg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0KSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdvcmFuZ2UnKSArDQogIGZhY2V0X3dyYXAofmN1dCkNCmBgYA0KDQoNCiMjIyMgNC7EkMOieSBsw6AgYmnhu4N1IMSR4buTIG3huq10IMSR4buZIGPhu6dhIGdpw6Ega2ltIGPGsMahbmcsIHbhu5tpIG3hu5dpIGPDoWNoIGPhuq90IGtow6FjIG5oYXUgY+G7p2Ega2ltIGPGsMahbmcgxJHGsOG7o2MgaGnhu4NuIHRo4buLIHRyb25nIG3hu5l0IGLhuqNuZyBiaeG7g3UgxJHhu5MgcmnDqm5nIGJp4buHdC4gxJBp4buBdSBuw6B5IGdpw7pwIHNvIHPDoW5oIHBow6JuIHBo4buRaSBnacOhIGPhu6dhIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1Lg0KDQoNCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobT0gbWVhbihjYXJhdCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ29yYW5nZScpICsNCiAgICBsYWJzKHggPSdMb+G6oWknLCB5ID0gJ01lYW4nKQ0KDQpgYGANCg0KYGBge3J9DQpkPC0gZGlhbW9uZHMNCmQ8LSBkICU+JSBncm91cF9ieShjdXQsIGNvbG9yKSAlPiUgc3VtbWFyaXNlKCBuPSBuKCkpDQoNCmBgYA0KDQoNCiMjIyMgNS5nacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgY3V0IGNobyBt4buXaSBsb+G6oWkgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgxJHGsOG7o2MgdGjhu4MgaGnhu4duIHF1YSBiaeG7g3UgxJHhu5MgdHLDqm4uIMSQ4buTbmcgdGjhu51pLCBjw6FjIGNow7ogdGjDrWNoIHPhu5EgbGnhu4d1IMSRxrDhu6NjIHRow6ptIHbDoG8gxJHhu4MgbMOgbSBjaG8gYmnhu4N1IMSR4buTIHRy4bufIG7Dqm4gZOG7hSBoaeG7g3UgaMahbi4NCg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ29yYW5nZScpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnSScpLCBmaWxsID0gJ2JsdWUnKQ0KYGBgDQoNCiMjIyMgNi4gQmnhu4N1IMSR4buTIG5heSBjaG8gdGEgYmnhur90IHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyB04burbmcgbG/huqFpIGPhuq90IHbDoCBtw6Agc+G6r2MgY+G7p2EgbsOzLiBUcsOqbiB0cuG7pWMgeCBuw7MgdGjhu4MgaGnhu4duIGNo4bqldCBsxrDhu6NuZyBj4bqvdCBj4bunYSBraW0gY8awxqFuZywgdHLhu6VjIHkgY2hvIGJp4bq/dCBzw7QgbMaw4bujbmcga2ltIGPGsMahbmcuIE3DoHUgJ0JsdWUgdGjhu4MgaGnhu4duIHPhu5Ega2ltIGPGsMahbmcgY8OzIG3DoHUgKipJKiosICdPcmFuZ2UgdGjhu4MgaGnhu4duIHPhu5Ega2ltIGPGsMahbmcgY8OzIG3DoHUgKipIKiouIA0KDQoNCg0KIyMgKipCLkJp4buDdSDEkeG7kyBj4bunYSBk4buvIGxp4buHdSAqQ0FSQVQqIG5oxrAgc2F1KioNCg0KYGBge3J9DQpkIDwtZGlhbW9uZHMNCmQgJT4lIGdncGxvdChhZXMoeCA9IGNhcmF0KSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdwaW5rJykNCg0KYGBgDQoNCg0KYGBge3J9DQpkIDwtIGRpYW1vbmRzIA0KZCA8LSBkICU+JSBtdXRhdGUoY2FyYXRDID0gY3V0KGNhcmF0LDUsIGxhYmVsID0gYygncuG6pXQgbmjhu48nLCAnbmjhu48nLCd24burYScsJ2zhu5tuJywncuG6pXQgbOG7m24nKSkpDQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBjYXJhdEMpKSArDQogIGxhYnModGl0bGU9ICJCaeG7g3UgxJHhu5MgQ2FyYXQiKSArDQogIGdlb21fYmFyKGZpbGwgPSAncGluaycpDQoNCmBgYA0KDQoNCiMjIyMgMS5UcuG7jW5nIGzGsOG7o25nIGNhcmF0IMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aMOgbmggNSBuaMOzbSA6IHLhuqV0IG5o4buPLCBuaOG7jywgduG7q2EsIGzhu5tuLCBy4bqldCBs4bubbi4NCg0KDQoNCmBgYHtyfQ0KZDEgPC0gZCU+JSBtdXRhdGUgKHRsY2FyYXQgPSBjdXQoY2FyYXQsNSwgbGFiZWwgPSBjKCJS4bqldCBuaOG6uSIsICJOaOG6uSIsICJW4burYSIsICJO4bq3bmciLCAiUuG6pXQgbsSDbmciKSkpDQpkMSAlPiUgZ3JvdXBfYnkodGxjYXJhdCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh0bGNhcmF0LG4pKSArDQogICBnZW9tX2NvbChmaWxsPSAncGluaycpICsNCiAgIGxhYnModGl0bGU9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGNhcmF0IikrDQogICBnZW9tX3RleHQgKGFlcyhsYWJlbCA9IG4pLCB2anVzdD0tMC41LCBjb2xvcj0gJ2JsYWNrJykrDQogICBsYWJzKHg9ICJUcuG7jW5nIGzGsOG7o25nIiwgeT0gIlPhu5EgbMaw4bujbmciKQ0KDQpgYGANCg0KDQoNCiMjIyMgMi4gS2hpIG5ow6xuIHbDoG8gYmnhu4N1IMSR4buTIG7DoHkgdGEgduG6q24gdGjhuqV5IGPDsyBz4buxIGNow6puaCBsw6puaCBuaOG6pXQgxJHhu4tuaCDhu58gdOG7q25nIGxvYWk6DQoNCiAgIC0iUuG6pXQgbmjhurkiIGNoaeG6v20gxJHhuqFpIMSRYSBz4buRIHbhu5tpIHPhu5EgbMaw4bujbmcgNDM3ODEgdmnDqm4uICJS4bqldCBu4bq3bmciIGNoaeG6v20gdGhp4buDdSBz4buRIHbhu5tpIHPhu5EgbMaw4bujbmcgbMOgIDMgbmjhu48gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIGPDoWMgY+G7mXQga2jDoWMuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBraW0gY8awxqFuZyBjw6BuZyBjw7MgdHLhu41uZyBsxrDhu6NuZyBs4bubbiB0aMOsIGPDoG5nIGhp4bq/bS4NCiAgICANCiAgLcSQ4buDIGThu4UgZMOgbmcgc28gc8OhbmcgdGjDrCB0YSBjw7MgdGjhu4MgbmjDrG4gdsOgbyBz4buRIHBo4bqnbiB0csSDbSBj4bunYSBjaMO6bmcgY8OzIHRo4buDIGNoaeG6v20gYsSDbmcgYmnhu4N1IMSR4buTIGvhur8gdGnhur9wLg0KDQoNCg0KYGBge3J9DQpkMSA8LSBkJT4lIG11dGF0ZSAodGxjYXJhdCA9IGN1dChjYXJhdCw1LCBsYWJlbCA9IGMoIlLhuqV0IG5o4bq5IiwgIk5o4bq5IiwgIlbhu6thIiwgIk7hurduZyIsICJS4bqldCBuxINuZyIpKSkNCmQxICU+JSBncm91cF9ieSh0bGNhcmF0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHRsY2FyYXQsbikpICsNCiAgIGdlb21fY29sKGZpbGw9ICdwaW5rJykgKw0KICAgbGFicyh0aXRsZT0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gY2FyYXQiKSsNCiAgIGdlb21fdGV4dCAoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aChkJGNhcmF0KSkpLCB2anVzdD0tMC41LCBjb2xvcj0gJ2JsYWNrJykrDQogICBsYWJzKHg9ICJUcuG7jW5nIGzGsOG7o25nIiwgeT0gIlPhu5EgbMaw4bujbmciKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KZCU+JSBnZ3Bsb3QoYWVzKHggPSBjYXJhdCkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAncGluaycpICsNCiAgZmFjZXRfd3JhcCh+Y3V0KQ0KYGBgDQoNCg0KIyMjIyAzLk3huq10IMSR4buZIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgY+G7p2Ega2ltIGPGsMahbmcuIEJp4buDdSDEkeG7kyDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGjDoG5oIGPDoWMgYuG6o25nIGNvbiBk4buxYSB0csOqbiBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nLCBnacO6cCBzbyBzw6FuaCBwaMOibiBwaOG7kWkgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBjYXJhdCBnaeG7r2EgY8OhYyBsb+G6oWkgY+G6r3QuDQoNCg0KIyMgKipDLiBCaeG7g3UgxJHhu5MgY+G7p2EgZOG7ryBsaeG7h3UgQ09MT1IqKg0KDQogLSBNw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nIMSRxrDhu6NjIHBow6JuIGNoaWEgZ8O0bSA3IG3DoHU6IEQsRSxGLEcsSCxJLEouIMSQxrDhu6NjIHRo4buDIGhp4buHbiBuaMawIHNhdS4NCg0KDQpgYGB7cn0NCmQgJT4lICBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShmcmVxPSBuKCkpICU+JQ0KZ2dwbG90KGFlcyh4ID0gY29sb3IseSA9IGZyZXEpKSArDQogIGdlb21fY29sKGZpbGw9J2Jyb3duJykgKw0KICBsYWJzKHRpdGxlPSJCaeG7g3UgxJHhu5MgY+G7pSB0aOG7gyA1IG3hu6ljIMSR4buZIENvbG9yIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID1mcmVxKSx2anVzdCA9LTAuNSwgY29sb3IgPSdibGFjaycpICsNCiAgbGFicyh4PSAnTcOgdSBz4bqvdCcsIHk9J1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiAgIC1U4buVbmcgdGjhu4MgdGEgY8OzIHRo4buDIHRo4bqleSBz4buxIGLhu5EgY+G7p2Ega2ltIGPGsMahbmcgduG7m2kgNyBtw6B1IHPhuq9jIGPFqW5nIGtow7RuZyBxdcOhIGNow6puaCBs4buHY2guIFbhu5tpICoqRyoqIGNoaeG6v20gMTEyOTIgdmnDqm4gbMOgIG3DoHUgc+G6r2MgY8OzIHPhu5EgbMaw4bujbmcgxJFhIHPhu5EsIHbDoCBtw6B1ICAqKkoqKiBsw6AgbG/huqFpIGNoaeG6v20gc+G7kSBsxrDhu6NuZyB0aOG6pXAgbmjhuqV0IHbhu5tpIDI4MDggdmnDqm4uIEPDoWMgbcOgdSBjw7JuIGzhuqFpIGPDsyBz4buxIGNo4buHbmggbOG7h2NoIHhlbSB4ZW0gbmhhdS4gDQoNCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgZ2VvbV9jb2woZmlsbD0gImJyb3duIikrDQogIGxhYnModGl0bGUgPSJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIENPTE9SIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPSBwZXJjZW50KG4vbGVuZ3RoKGQkY29sb3IpKSksIHZqdXNzdD0gMSwgY29sb3I9ICJibGFjayIpICsNCiAgbGFicyh4PSJNw6B1IHPhuq9jIiwgeT0iU+G7kSBsxrDhu6NuZyIpDQpgYGANCg0KDQoNCg0KIyMgKipELkJp4buDdSDEkeG7kyBj4bunYSBk4buvIGxp4buHdSAqUFJJQ0UqIG5oxrAgc2F1KioNCg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IHByaWNlKSkgKw0KICBsYWJzKHRpdGxlPSIgQmnhu4N1IMSR4buTIFByaWNlIikrDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwLCBmaWxsID0gJ2JsdWUnLCBjb2xvciA9ICdyZWQnKQ0KYGBgDQoNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSwgZmlsbCA9IGNvbG9yKSkgKw0KICBsYWJzKHRpdGxlPSJCaeG7g3UgxJHhu5MgUHJpY2UiKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDApDQpgYGANCg0KDQoNCiMjIyMgMS5CaeG7g3UgxJHhu5MgY+G7p2EgZ2nDoSBraW0gY8awxqFuZywgduG7m2kgbeG7l2kga2hv4bqjbmcgZ2nDoSDEkcaw4bujYyBwaMOibiBsb+G6oWkgZOG7sWEgdHLDqm4gbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZy4gQmnhu4N1IGRp4buFbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyBnacOhIHRyb25nIG3hu5l0IGtob+G6o25nIGdpw6EgY+G7kSDEkeG7i25oIGzDoCA1MDAgxJHGoW4gduG7iy4NCg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gcHJpY2UsIGZpbGwgPSBjdXQpKSArDQogIGxhYnModGl0bGU9IiBCaeG7g3UgxJHhu5MgUHJpY2UiKSArDQogIGdlb21fZGVuc2l0eSgpDQpgYGANCg0KDQojIyMjIDIuTeG6rXQgxJHhu5kgY+G7p2EgZ2nDoSBraW0gY8awxqFuZywgduG7m2kgY8OhYyBwbG90IG3huq10IMSR4buZIMSRxrDhu6NjIHBow6JuIGJp4buHdCBi4bufaSBsb+G6oWkgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcuIMSQaeG7gXUgbsOgeSBnacO6cCBuaMOsbiBuaOG6rW4gc+G7sSBwaMOibiBwaOG7kWkgY+G7p2EgZ2nDoSBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdS4NCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnYmx1ZScpDQpgYGANCg0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAnJywgeSA9IG4sZmlsbCA9IGNvbG9yKSkgKw0KICBsYWJzKHRpdGxlPSAiQmnhu4N1IMSR4buTIFByaWNlIikgKw0KICAgIGdlb21fY29sKCkgKw0KICAgIGNvb3JkX3BvbGFyKCd5JykNCmBgYA0KDQoNCiMjIyMgMy5T4buRIGzGsOG7o25nIG3huqt1IGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYy4gxJBp4buBdSBuw6B5IGNobyBwaMOpcCBzbyBzw6FuaCB04buJIGzhu4cgcGjDom4gcGjhu5FpIGPhu6dhIG3huqt1IGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyBt4buZdCBjw6FjaCB0cuG7sWMgcXVhbi4NCg0KYGBge3J9DQpkJT4lIGdncGxvdChhZXMoeCA9IHByaWNlKSkgKw0KICBsYWJzKHRpdGxlPSIgQmnhu4N1IMSR4buTIFByaWNlIEgmSSIpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBiaW53aWR0aCA9IDUwMCwgZmlsbCA9ICdwdXJwbGUnKSArDQogIGdlb21faGlzdG9ncmFtKGRhdGEgPSBkICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0knKSwgYmlud2lkdGggPSA1MDAsIGZpbGwgPSAnYmx1ZScpDQpgYGANCg0KDQojIyMjIDQuIEJp4buDdSDEkeG7kyBnacOhIGtpbSBjxrDGoW5nLCB24bubaSBiaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIGThu7FhIHRyw6puIG3DoHUgc+G6r2MgY+G7p2Ega2ltIGPGsMahbmcuIE3hu5dpIHRoYW5oIGJp4buDdSBkaeG7hW4gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjw7MgZ2nDoSB0cm9uZyBt4buZdCBraG/huqNuZyBnacOhIGPhu5EgxJHhu4tuaCwgdsOgIGPDsyBoYWkgaGlzdG9ncmFtIHJpw6puZyBiaeG7h3QgY2hvIG3DoHUgSCB2w6AgSSB24bubaSBtw6B1IHPhuq9jIHTGsMahbmcg4bupbmcgbMOgIGJsdWUgdsOgIGdyZWVuLg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gcHJpY2UpKSArDQogIGxhYnModGl0bGU9IkJp4buDdSDEkeG7kyBQcmljZSIpKw0KICBnZW9tX2hpc3RvZ3JhbSAoZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnRicpLCBmaWxsID0gJ3B1cnBsZScpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ2JsdWUnKQ0KYGBgDQoNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnYmx1ZScpICsNCiAgZmFjZXRfd3JhcCh+Y3V0KQ0KYGBgDQoNCg0KIyMjIyA1LmJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSBj4bunYSBnacOhIGtpbSBjxrDGoW5nLCB24bubaSBt4buXaSBuaMOzbSBiaeG7g3UgZGnhu4VuIGThu68gbGnhu4d1IMSRxrDhu6NjIHBow6JuIGxv4bqhaSBk4buxYSB0csOqbiBsb+G6oWkgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcuIE3hu5dpIG5ow7NtIGPDsyBt4buZdCBt4bqtdCDEkeG7mSByacOqbmcgYmnhu4d0IGPhu6dhIG7DsywgdsOgIHBow6JuIGxv4bqhaSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIMSR4buDIHNvIHPDoW5oIHBow6JuIHBo4buRaSBj4bunYSBnacOhIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIGxv4bqhaSBj4bqvdC4NCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBjb2xvcikpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDEpKQ0KYGBgDQoNCg0KDQojIyAqKkUuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gQ0xBUklUWSoqDQoNCg0KYGBge3J9DQpkICU+JSAgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShmcmVxPSBuKCkpICU+JQ0KZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gZnJlcSkpICsNCiAgZ2VvbV9jb2woZmlsbD0ncHVycGxlJykgKw0KICBsYWJzKHRpdGxlPSJCaeG7g3UgxJHhu5MgOCBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID1mcmVxKSx2anVzdCA9IC0wLjUsIGNvbG9yID0nYmxhY2snKSArDQogIGxhYnMoeD0gJ0xv4bqhaScsIHk9J1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCg0KIyMjIyAxLlbhu5tpIDggbeG7qWMgxJHhu5kgdGluaCBraGnDqnQgY+G7p2EgIGtpbSBjxrDGoW5nIHRow6wgdGEgY8OzIHRo4buDIHRo4bqleSAqKlNJMSoqIGNoaeG6v20gc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCwgdGnhur9wIHRoZW8gxJHDsyBsw6AgKipWUzIqKi4gTeG7qWMgxJHhu5kgdGluaCBraGnhur90IHRo4bqlcCBuaOG6pXQgbMOgICpJMSoqLiBWw6AgZMaw4bubaSDEkcOieSBsw6AgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIHBo4bqnbiB0cuG6sW0gbcOgIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgY8OzIHRo4buDIGNoaeG6v20gxJHGsOG7o2MuDQogICAgDQoNCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGNsYXJpdHksbikpICsNCiAgIGdlb21fY29sKGZpbGw9ICdwdXJwbGUnKSArDQogICBsYWJzKHRpdGxlPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QiKSsNCiAgIGdlb21fdGV4dCAoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aChkJGNsYXJpdHkpKSksIHZqdXN0PS0wLjMsIGNvbG9yPSAnYmxhY2snKSsNCiAgIGxhYnMoeD0gIkxv4bqhaSAiLCB5PSAiU+G7kSBsxrDhu6NuZyIpDQpgYGANCg0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGNvbG9yLGNsYXJpdHkpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAncHVycGxlJykgKw0KICAgIGZhY2V0X3dyYXAofmNvbG9yKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMCwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ03hu6ljIMSR4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KDQojIyMjIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHThuqduIHN14bqldCBj4bunYSBjw6FjIG5ow7NtIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCB0cm9uZyB04burbmcgbcOgdSBz4bqvYy4gQmnhu4N1IMSR4buTIGdpw7pwIGNow7puZyB0YSBoaeG7g3UgxJHGsOG7o2MgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgdsOgIG3DoHUgc+G6r2MgY+G7p2Ega2ltIGPGsMahbmcgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UuDQoNCg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IGNsYXJpdHkpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ3B1cnBsZScpICsNCiAgZmFjZXRfd3JhcCh+Y3V0KQ0KYGBgDQogICAgICAgICANCg0KIyMjIyAyLsSQw6J5IGzDoCBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgY+G7p2EgdGluaCBraGnhur90IGtpbSBjxrDGoW5nLCB24bubaSBt4buXaSBjw6FjaCBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nIMSRxrDhu6NjIGhp4buDbiB0aOG7iyB0cm9uZyBt4buZdCBi4bqjbmcgYmnhu4N1IMSR4buTIHJpw6puZyBiaeG7h3QuIMSQaeG7gXUgbsOgeSBnacO6cCBzbyBzw6FuaCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgZ2nhu69hIGPDoWMgbG/huqFpIGPhuq90IGtow6FjIG5oYXUuDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSkpICsNCiAgbGFicyh0aXRsZT0gIkJp4buDdSDEkeG7kyBDbGFyaXR5IikrDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ3B1cnBsZScpDQpgYGANCg0KDQojIyAqKkYuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gREVQVEgqKg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IGRlcHRoKSkgKyANCiAgICAgICAgICBsYWJzKHRpdGxlPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiDEkeG7mSBzw6J1ICIpICsNCiAgICAgICAgICBnZW9tX2JhcigpICsNCiAgICAgICAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBkZXB0aCkpICsNCiAgbGFicyh0aXRsZSA9IkJp4buDdSDEkeG7kyBEZXRoICIpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnZ3JlZW4nKSArDQogIGZhY2V0X3dyYXAofmN1dCkNCmBgYA0KDQojIyMjIFRo4buDIGhp4buHbiBjaOG6pXQgbMaw4budbmcgY2hp4buBdSBzw6J1IGPhu6dhIGtpbSBjxrDGoW5nIOG7nyB04burbmcgYmnhu4N1IMSR4buTIHJpw6puZyBiaeG7h3QNCg0KDQoNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBkZXB0aCkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnZ3JlZW4nKQ0KYGBgDQoNCg0KDQoNCg==