1. Tóm tắt bộ dữ liệu

  • Ước tính dân số thế giới của Cục điều tra dân số Hoa Kỳ vào tháng 6 năm 2019 cho thấy dân số toàn cầu hiện tại là 7.577.130.400 người trên trái đất, vượt xa dân số thế giới 7,2 tỷ người năm 2015.

  • Sự gia tăng dân số này sẽ bị ảnh hưởng đáng kể bởi chín quốc gia cụ thể có xu hướng đóng góp vào tăng trưởng dân số nhanh hơn so với các quốc gia khác. Các quốc gia này bao gồThế giới đang phải đối mặt với quá trình già hóa dân số, điều này ảnh hưởng đáng kể đến khả năng duy trì tỷ lệ hỗ trợ dân số. Một kết quả quan trọng từ năm 2017 là hầu hết các quốc gia trên thế giới sẽ đối mặt với sự tăng trưởng đáng kể trong nhóm tuổi từ 60 trở lên. Điều này đặt áp lực lớn lên nhóm tuổi trẻ vì dân số người cao tuổi trở nên quá lớn mà không có đủ số lượng sinh để duy trì tỷ lệ hỗ trợ khỏe mạnh.

Chi tiết các biến có trong bộ dữ liệu:

Bộ dữ liệu có 234 quan sát và 15 biến

  • CCA3 : Mã quốc gia/vùng lãnh thổ gồm 3 chữ số

  • Name : Tên quốc gia/vùng lãnh thổ

  • 2022 : Dân số của Quốc gia/Vùng lãnh thổ vào năm 2022.

  • 2020 : Dân số của Quốc gia/Vùng lãnh thổ vào năm 2020.

  • 2015 : Dân số của Quốc gia/Vùng lãnh thổ vào năm 2015.

  • 2010 : Dân số của Quốc gia/Vùng lãnh thổ vào năm 2010.

  • 2000 : Dân số của Quốc gia/Vùng lãnh thổ vào năm 2000.

  • 1990 : Dân số của Quốc gia/Vùng lãnh thổ vào năm 1990.

  • 1980 : Dân số của Quốc gia/Vùng lãnh thổ vào năm 1980.

  • 1970 : Dân số của Quốc gia/Vùng lãnh thổ vào năm 1970.

  • Area (km²) : Diện tích của Quốc gia/Vùng lãnh thổ tính bằng km vuông.

  • Density (per km²) : Mật độ dân số trên km vuông.

  • Growth Rate : Tỷ lệ tăng trưởng dân số theo quốc gia/vùng lãnh thổ.

  • World Population Percentage : Tỷ lệ dân số theo từng quốc gia/vùng lãnh thổ.

  • Rank : Xếp hạng theo dân số

d <- read.csv("D:/Ngôn Ngữ Lập Trình/Nhiệm vụ 5/World Population Live Dataset.csv")
dim(d)
## [1] 234  15

2. Biểu đồ

2.1. Biểu đồ cột dân số 10 nước đứng top 10

d1 <- d[d$Rank <= 10,]
d1 %>% ggplot(aes(x = Name, y = X2022)) +
  geom_bar(stat = "identity", fill = "pink") +
  geom_text(aes(label = round(X2022)), vjust = 2, color = 'white')+
  labs(title = "Biểu đồ dân số năm 2022",x = "Nước",y = "Số dân")

  • China có số dân cao nhất năm 2022 là 1425887 triệu người.

  • India có số dân cao thứ 2 là 1417173 triệu người

  • Mexico có số dân thấp nhất là 127504 triệu người.

2.2. Mật độ dân số của các quốc gia thuộc top 10

d1 %>% ggplot(aes(x = Name, y = Density..per.km..,fill = Name))+ 
  geom_bar(stat = "identity") +
  labs(x = "Quốc gia", y = "Mật độ dân số", title = "Mật độ dân số của các quốc gia hàng đầu") +
  geom_text(aes(label = round(Density..per.km..,3)), vjust = 2, color = 'red')+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Bangladesh có mật độ dân số khoảng 1160 người/km vuông, mật độ dân số cao.

  • Ngược lại, Russia lại có mật đô dân số thấp khoảng 8 người/km vuông.

  • Trong 2 nước có dân số đông, India lại có mật độ dân số cao hơn China khoảng 2.9 lần.

2.3: Tỷ lệ tăng trưởng dân số của các quốc gia

d1 %>%ggplot(aes(x = Name, y = GrowthRate, fill = Name)) +
  geom_bar(stat = "identity") +
  labs(x = "Quốc gia", y = "Tỷ lệ tăng trưởng dân số", title = "Tỷ lệ tăng trưởng dân số của các quốc gia ") +
  geom_text(aes(label = round(GrowthRate,3)), vjust = 2, color = 'red')+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Tỷ lệ tăng trường các nước không có sự biến động nhiều. Trong đó, biểu đồ dự báo Nigeria và Pakistan sẽ có mức độ tăng trưởng cao hơn so với các nước còn lại là 1.02.

2.4.Phần trăm dân số thế giới của các quốc gia

d1 %>% ggplot( aes(x = Name, y = World.Population.Percentage, fill = Name)) +
  geom_bar(stat = "identity") +
  labs(x = "Quốc gia", y = "Phần trăm dân số thế giới", title = "Phần trăm dân số thế giới của các quốc gia ") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Phần trăm dân số thế giới của United States cao nhất so với các nước khoảng 4.24%. Sau đó là Indonesia khoảng 3.45%. Ngược lại Mexico có phần trăm dân số thấp nhất khoảng 1.6%.

2.5.Diện tích của các quốc gia

d1 %>%ggplot(aes(x = Name, y = Area..km.., fill = Name)) +
  geom_bar(stat = "identity") +
  labs(x = "Quốc gia", y = "Diện tích (km²)", title = "Diện tích của các quốc gia ") +
   geom_text(aes(label = round(Area..km..,3)), vjust = 2, color = 'black')+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Trung Quốc (China): Diện tích là 9.706.961 km².

  • Ấn Độ (India): Diện tích là 3.287.590 km².

  • Hoa Kỳ (United States): Diện tích là 9.372.610 km².

  • Indonesia: Diện tích là 1.904.569 km².

  • Pakistan: Diện tích là 881.912 km².

  • Nigeria: Diện tích là 923.768 km².

  • Brazil: Diện tích là 8.515.767 km².

  • Bangladesh: Diện tích là 147.570 km².

  • Nga (Russia): Diện tích là 17.098.242 km².

  • Mexico : Diện tích là 964.375 km².

2.6.Biểu đồ cho diện tích một số quốc gia ở ĐNÁ

d3 <- d%>% filter(Name %in% c('Indonesia','Philippines','Vietnam','Thailand', 'Myanmar','Laos','Singapore','Brunei'))
d3 %>% ggplot(aes(x = " ", y = Area..km.., fill = Name)) +
  geom_bar(stat = "identity") +
  coord_polar("y",) +
  labs(title = "Biểu đồ diện tích một số nước ĐNÁ",fill = "Quốc gia",x = NULL, y = NULL) +
  theme_minimal() +
  geom_text(aes(label = paste0(round(Area..km.. / sum(Area..km..) * 100, 1), "%")),position = position_stack(vjust = 0.5),size = 4)

  • Indonesia có diện tích cao nhất so với các nước khác trong khu vực.

  • Trong khi đó, Brunei có diện tích thấp nhất.

  • Vietnam có diện tích là 8.3%

2.7. Biểu đồ mật độ dân số của một số quốc gia thuộc ĐNÁ

d3 %>% ggplot(aes(x = "", y = Density..per.km.., fill = Name)) +
  geom_bar(stat = "identity") +
  coord_polar("y", start = 0) +
  labs(title = "Biểu đồ mật độ dân số của một số nước ĐNÁ",fill = "Quốc gia",x = NULL, y = NULL) +
  theme_minimal() +
  geom_text(aes(label = paste0(round(Density..per.km.. / sum(Density..per.km..) * 100, 1), "%")),
            position = position_stack(vjust = 0.5),
            size = 4)

  • Mật độ dân số của Singapore là cao nhất 88.4%

2.8. Biểu đồ Histogram Population_2022

d %>% ggplot(aes(x = X2022)) +
  geom_histogram(binwidth = 10000, fill = 'lightgreen',color='black') +
  labs(title = "Histogram of Population 2022",x = "Population",y = "Frequency")

2.9. Biểu đồ Density Population_2022

d %>% ggplot(aes(x = X2022)) +
  geom_density(fill = 'lightblue')+
   labs(title = "Density of Population 2022",x = "Population",y = "Frequency")

  • Dân số năm 2022 của các nước có sự biến động mạnh.

2.10. Biểu đồ Histogram Area

d %>% ggplot(aes(x = Area..km..)) +
  geom_histogram(binwidth = 500000, fill = "lightgreen", color = "black") +
  labs(title = "Histogram of Area", x = "Area (km²)",y = "Frequency")

2.11. Biểu đồ Density Area

d %>% ggplot(aes(x = Area..km..)) +
  geom_density(fill = 'lightblue')+
   labs(title = "Density of Area",x = "Area (km²)",y = "Frequency")

  • Diện tích các nước có sự chênh lệch lớn do đó dựa vào số dân và diện tích ta có thể thấy được mật độ dân số các nước đều có sự khác biệt rõ ràng và từ đó có thể suy đoán rằng dân số các nước ở những năm 2023,2024 và về sau nữa đều sẽ tăng trưởng mạnh nhưng diện tích không đổi do đó mật độ dân số ngày một đông. Trong khi đó điều kiện y tế phát triển số người lớn tuổi cao, nguy cơ già hóa dân số toàn cầu.

2.12. Biểu đồ Histogram Density

d %>% ggplot( aes(x = Density..per.km..)) +
  geom_histogram(binwidth = 100, fill = "red", color = "black") +
  labs(title = "Histogram of Density",
       x = "Density (per km²)",
       y = "Frequency")

  • Mật độ dân số các nước đều có sự chênh lệch và mật độ ở các nước đứng đầu danh sách đều dày đặc.

2.13. Biểu đồ scatterplot cho dữ liệu Population_2022 và Area

d %>% ggplot(aes(x = X2022, y = Area..km..)) +
  geom_point(color = "purple") +
  labs(title = "Scatterplot of Population 2022 and Area",
       x = "Population",
       y = "Area (km²)")

  • Biểu đồ scatterplot cho dữ liệu Population_2022 và Area cho thấy mối quan hệ giữa dân số và diện tích của các quốc gia trong bộ dữ liệu.

  • Nhìn vào biểu đồ, chúng ta có thể thấy rằng các điểm dữ liệu được phân tán trên không gian biểu đồ một cách ngẫu nhiên. Điều này cho thấy không có một mẫu quy luật rõ ràng về mối quan hệ giữa dân số và diện tích.

  • Tuy nhiên, chúng ta có thể nhận thấy rằng có một số quốc gia có diện tích nhỏ và dân số lớn, trong khi một số quốc gia khác có diện tích lớn nhưng dân số thấp hơn. Điều này cho thấy rằng không chỉ diện tích mà còn các yếu tố khác có thể ảnh hưởng đến mật độ dân số của mỗi quốc gia.

2.14. Biểu đồ scatterplot cho dữ liệu Population_2022 và Density

d %>% ggplot(aes(x = X2022, y = Density..per.km..)) +
  geom_point(color = "green") +
  labs(title = "Scatterplot of Population 2022 and Density",
       x = "Population",
       y = "Density (per km²)")

  • Biểu đồ scatterplot cho dữ liệu Population_2022 và Density thể hiện mối quan hệ giữa dân số và mật độ dân số của các quốc gia trong bộ dữ liệu.

  • Có một số quốc gia có dân số lớn và mật độ dân số cao, trong khi một số quốc gia khác có dân số lớn nhưng mật độ dân số thấp hơn. Điều này chỉ ra rằng mật độ dân số không chỉ phụ thuộc vào dân số mà còn phụ thuộc vào các yếu tố khác như diện tích.

2.15. Biểu đồ scatterplot cho dữ liệu Area và Density

d %>% ggplot(aes(x = Area..km.., y = Density..per.km..)) +
  geom_point(color = "red") +
  labs(title = "Scatterplot of Area and Density",
       x = "Area (km²)",
       y = "Density (per km²)")

  • Chúng ta có thể nhận thấy một số quốc gia có diện tích nhỏ và mật độ dân số cao, trong khi một số quốc gia khác có diện tích lớn nhưng mật độ dân số thấp hơn. Điều này cho thấy rằng mật độ dân số không chỉ phụ thuộc vào diện tích mà còn phụ thuộc vào các yếu tố khác như dân số và các yếu tố địa lý khác.

  • Ngoài ra, biểu đồ cũng cho thấy rằng có một số quốc gia có mật độ dân số rất cao với diện tích nhỏ, trong khi có một số quốc gia khác có diện tích lớn nhưng mật độ dân số thấp hơn. Điều này có thể chỉ ra sự khác biệt về sự phân bố dân số và diện tích giữa các quốc gia.

  • Tuy nhiên, để hiểu rõ hơn về mối quan hệ giữa diện tích và mật độ dân số, cần xem xét thêm các yếu tố khác như dân số, cơ cấu dân số, và các yếu tố kinh tế, xã hội khác của từng quốc gia. Điều này giúp ta có cái nhìn tổng quan và chi tiết hơn về mối quan hệ này trong bộ dữ liệu.

2.16. Biểu đồ đường thể hiện mật độ dân số của các quốc gia ĐNÁ

d3 %>% ggplot( aes(x = Name, y = Density..per.km..)) +
  geom_line() +
  geom_point() +
  labs(title = "Population Density of Countries", x = "Country", y = "Density (per km²)") +
  theme_minimal()

  • Nhìn vào biểu đồ, chúng ta có thể thấy rằng Philippines có mật độ dân số cao nhất, tiếp theo là Vietnam và Indonesia. Thái Lan và Myanmar có mật độ dân số thấp hơn so với các quốc gia khác trong số này.

  • Biểu đồ sử dụng các điểm để biểu thị dữ liệu từng quốc gia cụ thể, trong khi đường thẳng nối các điểm giúp chúng ta nhìn thấy xu hướng tổng quan của mật độ dân số.

2.17. Biểu đồ cột đối chiếu diện tích các quốc gia ĐNÁ

d3 %>% ggplot(aes(x = Name, y = Area..km..)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "Comparison of Country Areas", x = "Country", y = "Area (km²)") +
  theme_minimal()

  • Qua biểu đồ, chúng ta có thể nhìn thấy rằng Indonesia có diện tích lớn nhất trong số các quốc gia được so sánh, tiếp theo là Myanmar, Thailand, Philippines và Vietnam.

2.18. Biểu đồ cột thể hiện tỷ lệ tăng trưởng dân số của các quốc gia ĐNÁ

d3 %>% ggplot(aes(x = Name, y = GrowthRate)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "Population Growth Rate of Countries", x = "Country", y = "Growth Rate") +
  theme_minimal()

  • Dựa vào biểu đồ, chúng ta có thể nhận thấy rằng Indonesia, Philippines và Vietnam có tỷ lệ tăng trưởng dân số cao nhất trong số các quốc gia được so sánh. Thái Lan và Myanmar có tỷ lệ tăng trưởng dân số thấp hơn so với các quốc gia khác trong nhóm này.

2.19. Biểu đồ cột thể hiện tỉ lệ dân số của các quốc gia ĐNÁ

d3 %>% ggplot(aes(x = Name, y = World.Population.Percentage)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "World Population Percentage Rank of Countries", x = "Country", y = "Rank") +
  theme_minimal()

  • Dựa vào biểu đồ, chúng ta có thể nhìn thấy rằng Indonesia có dân số chiếm phần trăm lớn nhất trên thế giới trong số các quốc gia được so sánh. Philippines và Vietnam cũng có dân số chiếm phần trăm khá cao. Brunei và Singapore có dân số chiếm phần trăm thấp hơn so với các quốc gia khác trong nhóm này.

2.20. Biểu đồ cột thể hiện diện tích và mật độ dân số của các quốc gia ĐNÁ

d3 %>% ggplot(aes(x = Name)) +
  geom_col(aes(y = Area..km..), fill = "steelblue", width = 0.4, position = "dodge") +
  geom_line(aes(y = Density..per.km.. * 5000), color = "red", size = 1, group = 1) +
  labs(title = "Comparison of Area and Population Density", x = "Country", y = "Area / Density") +
  scale_y_continuous(sec.axis = sec_axis(~./5000, name = "Density (per km²)")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Dựa vào biểu đồ, chúng ta có thể thấy rằng Indonesia có diện tích lớn nhất trong số các quốc gia được so sánh, trong khi Philippines có mật độ dân số cao nhất. Vietnam và Thailand có diện tích tương đối lớn, nhưng mật độ dân số thấp hơn so với Indonesia và Philippines. Myanmar có diện tích và mật độ dân số thấp nhất trong số các quốc gia này.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTMOqIFRo4buLIE5n4buNYyDDgW5oIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDogDQogaHRtbF9kb2N1bWVudDogDQogICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmBgYA0KDQojICoqMS4gVMOzbSB04bqvdCBi4buZIGThu68gbGnhu4d1KioNCg0KLSDGr+G7m2MgdMOtbmggZMOibiBz4buRIHRo4bq/IGdp4bubaSBj4bunYSBD4bulYyDEkWnhu4F1IHRyYSBkw6JuIHPhu5EgSG9hIEvhu7MgdsOgbyB0aMOhbmcgNiBuxINtIDIwMTkgY2hvIHRo4bqleSBkw6JuIHPhu5EgdG/DoG4gY+G6p3UgaGnhu4duIHThuqFpIGzDoCA3LjU3Ny4xMzAuNDAwIG5nxrDhu51pIHRyw6puIHRyw6FpIMSR4bqldCwgdsaw4bujdCB4YSBkw6JuIHPhu5EgdGjhur8gZ2nhu5tpIDcsMiB04bu3IG5nxrDhu51pIG7Eg20gMjAxNS4gDQoNCi0gU+G7sSBnaWEgdMSDbmcgZMOibiBz4buRIG7DoHkgc+G6vSBi4buLIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIGLhu59pIGNow61uIHF14buRYyBnaWEgY+G7pSB0aOG7gyBjw7MgeHUgaMaw4bubbmcgxJHDs25nIGfDs3AgdsOgbyB0xINuZyB0csaw4bufbmcgZMOibiBz4buRIG5oYW5oIGjGoW4gc28gduG7m2kgY8OhYyBxdeG7kWMgZ2lhIGtow6FjLiBDw6FjIHF14buRYyBnaWEgbsOgeSBiYW8gZ+G7k1Ro4bq/IGdp4bubaSDEkWFuZyBwaOG6o2kgxJHhu5FpIG3hurd0IHbhu5tpIHF1w6EgdHLDrG5oIGdpw6AgaMOzYSBkw6JuIHPhu5EsIMSRaeG7gXUgbsOgeSDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24ga2jhuqMgbsSDbmcgZHV5IHRyw6wgdOG7tyBs4buHIGjhu5cgdHLhu6MgZMOibiBz4buRLiBN4buZdCBr4bq/dCBxdeG6oyBxdWFuIHRy4buNbmcgdOG7qyBuxINtIDIwMTcgbMOgIGjhuqd1IGjhur90IGPDoWMgcXXhu5FjIGdpYSB0csOqbiB0aOG6vyBnaeG7m2kgc+G6vSDEkeG7kWkgbeG6t3QgduG7m2kgc+G7sSB0xINuZyB0csaw4bufbmcgxJHDoW5nIGvhu4MgdHJvbmcgbmjDs20gdHXhu5VpIHThu6sgNjAgdHLhu58gbMOqbi4gxJBp4buBdSBuw6B5IMSR4bq3dCDDoXAgbOG7sWMgbOG7m24gbMOqbiBuaMOzbSB0deG7lWkgdHLhursgdsOsIGTDom4gc+G7kSBuZ8aw4budaSBjYW8gdHXhu5VpIHRy4bufIG7Dqm4gcXXDoSBs4bubbiBtw6Aga2jDtG5nIGPDsyDEkeG7pyBz4buRIGzGsOG7o25nIHNpbmggxJHhu4MgZHV5IHRyw6wgdOG7tyBs4buHIGjhu5cgdHLhu6Mga2jhu49lIG3huqFuaC4NCg0KKioqQ2hpIHRp4bq/dCBjw6FjIGJp4bq/biBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdToqKioNCg0KKkLhu5kgZOG7ryBsaeG7h3UgY8OzIDIzNCBxdWFuIHPDoXQgdsOgIDE1IGJp4bq/bioNCg0KLSBDQ0EzIDogTcOjIHF14buRYyBnaWEvdsO5bmcgbMOjbmggdGjhu5UgZ+G7k20gMyBjaOG7ryBz4buRDQoNCi0gTmFtZSA6IFTDqm4gcXXhu5FjIGdpYS92w7luZyBsw6NuaCB0aOG7lQ0KDQotIDIwMjIgOiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMjAyMi4NCg0KLSAyMDIwIDogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDIwMjAuIA0KDQotIDIwMTUgOiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMjAxNS4NCg0KLSAyMDEwIDogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDIwMTAuDQoNCi0gMjAwMCA6IETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHbDoG8gbsSDbSAyMDAwLg0KDQotIDE5OTAgOiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMTk5MC4NCg0KLSAxOTgwIDogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDE5ODAuDQoNCi0gMTk3MCA6IETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHbDoG8gbsSDbSAxOTcwLg0KIA0KLSBBcmVhIChrbcKyKSA6IERp4buHbiB0w61jaCBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHTDrW5oIGLhurFuZyBrbSB2dcO0bmcuDQoNCi0gRGVuc2l0eSAocGVyIGttwrIpCTogTeG6rXQgxJHhu5kgZMOibiBz4buRIHRyw6puIGttIHZ1w7RuZy4NCg0KLSBHcm93dGggUmF0ZSA6IFThu7cgbOG7hyB0xINuZyB0csaw4bufbmcgZMOibiBz4buRIHRoZW8gcXXhu5FjIGdpYS92w7luZyBsw6NuaCB0aOG7lS4NCg0KLSBXb3JsZCBQb3B1bGF0aW9uIFBlcmNlbnRhZ2UJOiBU4bu3IGzhu4cgZMOibiBz4buRIHRoZW8gdOG7q25nIHF14buRYyBnaWEvdsO5bmcgbMOjbmggdGjhu5UuDQoNCi0gUmFuayA6IFjhur9wIGjhuqFuZyB0aGVvIGTDom4gc+G7kQ0KYGBge3J9DQpkIDwtIHJlYWQuY3N2KCJEOi9OZ8O0biBOZ+G7ryBM4bqtcCBUcsOsbmgvTmhp4buHbSB24bulIDUvV29ybGQgUG9wdWxhdGlvbiBMaXZlIERhdGFzZXQuY3N2IikNCmRpbShkKQ0KYGBgDQoNCiMgKioyLiBCaeG7g3UgxJHhu5MqKg0KDQojIyAqKjIuMS4gQmnhu4N1IMSR4buTIGPhu5l0IGTDom4gc+G7kSAxMCBuxrDhu5tjIMSR4bupbmcgdG9wIDEwKioNCmBgYHtyfQ0KZDEgPC0gZFtkJFJhbmsgPD0gMTAsXQ0KZDEgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBYMjAyMikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAicGluayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKFgyMDIyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgZMOibiBz4buRIG7Eg20gMjAyMiIseCA9ICJOxrDhu5tjIix5ID0gIlPhu5EgZMOibiIpDQpgYGANCg0KLSBDaGluYSBjw7Mgc+G7kSBkw6JuIGNhbyBuaOG6pXQgbsSDbSAyMDIyIGzDoCAxNDI1ODg3IHRyaeG7h3UgbmfGsOG7nWkuDQoNCi0gSW5kaWEgY8OzIHPhu5EgZMOibiBjYW8gdGjhu6kgMiBsw6AgMTQxNzE3MyB0cmnhu4d1IG5nxrDhu51pDQoNCi0gTWV4aWNvIGPDsyBz4buRIGTDom4gdGjhuqVwIG5o4bqldCBsw6AgMTI3NTA0IHRyaeG7h3UgbmfGsOG7nWkuDQoNCiMjICoqMi4yLiBN4bqtdCDEkeG7mSBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRodeG7mWMgdG9wIDEwKioNCmBgYHtyfQ0KZDEgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBEZW5zaXR5Li5wZXIua20uLixmaWxsID0gTmFtZSkpKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh4ID0gIlF14buRYyBnaWEiLCB5ID0gIk3huq10IMSR4buZIGTDom4gc+G7kSIsIHRpdGxlID0gIk3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgaMOgbmcgxJHhuqd1IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoRGVuc2l0eS4ucGVyLmttLi4sMykpLCB2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCi0gQmFuZ2xhZGVzaCBjw7MgbeG6rXQgxJHhu5kgZMOibiBz4buRIGtob+G6o25nIDExNjAgbmfGsOG7nWkva20gdnXDtG5nLCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvLg0KDQotIE5nxrDhu6NjIGzhuqFpLCBSdXNzaWEgbOG6oWkgY8OzIG3huq10IMSRw7QgZMOibiBz4buRIHRo4bqlcCBraG/huqNuZyA4IG5nxrDhu51pL2ttIHZ1w7RuZy4NCg0KLSBUcm9uZyAyIG7GsOG7m2MgY8OzIGTDom4gc+G7kSDEkcO0bmcsIEluZGlhIGzhuqFpIGPDsyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvIGjGoW4gQ2hpbmEga2hv4bqjbmcgMi45IGzhuqduLg0KDQojIyAqKjIuMzogVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhKioNCmBgYHtyfQ0KZDEgJT4lZ2dwbG90KGFlcyh4ID0gTmFtZSwgeSA9IEdyb3d0aFJhdGUsIGZpbGwgPSBOYW1lKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHggPSAiUXXhu5FjIGdpYSIsIHkgPSAiVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EiLCB0aXRsZSA9ICJU4bu3IGzhu4cgdMSDbmcgdHLGsOG7n25nIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoR3Jvd3RoUmF0ZSwzKSksIHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLSBU4bu3IGzhu4cgdMSDbmcgdHLGsOG7nW5nIGPDoWMgbsaw4bubYyBraMO0bmcgY8OzIHPhu7EgYmnhur9uIMSR4buZbmcgbmhp4buBdS4gVHJvbmcgxJHDsywgYmnhu4N1IMSR4buTIGThu7EgYsOhbyBOaWdlcmlhIHbDoCBQYWtpc3RhbiBz4bq9IGPDsyBt4bupYyDEkeG7mSB0xINuZyB0csaw4bufbmcgY2FvIGjGoW4gc28gduG7m2kgY8OhYyBuxrDhu5tjIGPDsm4gbOG6oWkgbMOgIDEuMDIuDQoNCiMjICoqMi40LlBo4bqnbiB0csSDbSBkw6JuIHPhu5EgdGjhur8gZ2nhu5tpIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSoqDQpgYGB7cn0NCmQxICU+JSBnZ3Bsb3QoIGFlcyh4ID0gTmFtZSwgeSA9IFdvcmxkLlBvcHVsYXRpb24uUGVyY2VudGFnZSwgZmlsbCA9IE5hbWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnMoeCA9ICJRdeG7kWMgZ2lhIiwgeSA9ICJQaOG6p24gdHLEg20gZMOibiBz4buRIHRo4bq/IGdp4bubaSIsIHRpdGxlID0gIlBo4bqnbiB0csSDbSBkw6JuIHPhu5EgdGjhur8gZ2nhu5tpIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSAiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLSBQaOG6p24gdHLEg20gZMOibiBz4buRIHRo4bq/IGdp4bubaSBj4bunYSBVbml0ZWQgU3RhdGVzIGNhbyBuaOG6pXQgc28gduG7m2kgY8OhYyBuxrDhu5tjIGtob+G6o25nIDQuMjQlLiBTYXUgxJHDsyBsw6AgSW5kb25lc2lhIGtob+G6o25nIDMuNDUlLiBOZ8aw4bujYyBs4bqhaSBNZXhpY28gY8OzIHBo4bqnbiB0csSDbSBkw6JuIHPhu5EgdGjhuqVwIG5o4bqldCBraG/huqNuZyAxLjYlLg0KDQojIyAqKjIuNS5EaeG7h24gdMOtY2ggY+G7p2EgY8OhYyBxdeG7kWMgZ2lhKioNCg0KYGBge3J9DQpkMSAlPiVnZ3Bsb3QoYWVzKHggPSBOYW1lLCB5ID0gQXJlYS4ua20uLiwgZmlsbCA9IE5hbWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnMoeCA9ICJRdeG7kWMgZ2lhIiwgeSA9ICJEaeG7h24gdMOtY2ggKGttwrIpIiwgdGl0bGUgPSAiRGnhu4duIHTDrWNoIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSAiKSArDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoQXJlYS4ua20uLiwzKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnYmxhY2snKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCiAgICANCmBgYA0KDQotIFRydW5nIFF14buRYyAoQ2hpbmEpOiBEaeG7h24gdMOtY2ggbMOgIDkuNzA2Ljk2MSBrbcKyLg0KDQotIOG6pG4gxJDhu5kgKEluZGlhKTogRGnhu4duIHTDrWNoIGzDoCAzLjI4Ny41OTAga23Csi4NCg0KLSBIb2EgS+G7syAoVW5pdGVkIFN0YXRlcyk6IERp4buHbiB0w61jaCBsw6AgOS4zNzIuNjEwIGttwrIuDQoNCi0gSW5kb25lc2lhOiBEaeG7h24gdMOtY2ggbMOgIDEuOTA0LjU2OSBrbcKyLg0KDQotIFBha2lzdGFuOiBEaeG7h24gdMOtY2ggbMOgIDg4MS45MTIga23Csi4NCg0KLSBOaWdlcmlhOiBEaeG7h24gdMOtY2ggbMOgIDkyMy43Njgga23Csi4NCg0KLSBCcmF6aWw6IERp4buHbiB0w61jaCBsw6AgOC41MTUuNzY3IGttwrIuDQoNCi0gQmFuZ2xhZGVzaDogRGnhu4duIHTDrWNoIGzDoCAxNDcuNTcwIGttwrIuDQoNCi0gTmdhIChSdXNzaWEpOiBEaeG7h24gdMOtY2ggbMOgIDE3LjA5OC4yNDIga23Csi4NCg0KLSBNZXhpY28gOiBEaeG7h24gdMOtY2ggbMOgIDk2NC4zNzUga23Csi4gDQoNCiMjICoqMi42LkJp4buDdSDEkeG7kyBjaG8gZGnhu4duIHTDrWNoIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSDhu58gxJBOw4EqKg0KYGBge3J9DQpkMyA8LSBkJT4lIGZpbHRlcihOYW1lICVpbiUgYygnSW5kb25lc2lhJywnUGhpbGlwcGluZXMnLCdWaWV0bmFtJywnVGhhaWxhbmQnLCAnTXlhbm1hcicsJ0xhb3MnLCdTaW5nYXBvcmUnLCdCcnVuZWknKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZDMgJT4lIGdncGxvdChhZXMoeCA9ICIgIiwgeSA9IEFyZWEuLmttLi4sIGZpbGwgPSBOYW1lKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBjb29yZF9wb2xhcigieSIsKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGRp4buHbiB0w61jaCBt4buZdCBz4buRIG7GsOG7m2MgxJBOw4EiLGZpbGwgPSAiUXXhu5FjIGdpYSIseCA9IE5VTEwsIHkgPSBOVUxMKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQoQXJlYS4ua20uLiAvIHN1bShBcmVhLi5rbS4uKSAqIDEwMCwgMSksICIlIikpLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLHNpemUgPSA0KQ0KYGBgDQoNCi0gSW5kb25lc2lhIGPDsyBkaeG7h24gdMOtY2ggY2FvIG5o4bqldCBzbyB24bubaSBjw6FjIG7GsOG7m2Mga2jDoWMgdHJvbmcga2h1IHbhu7FjLg0KDQotIFRyb25nIGtoaSDEkcOzLCBCcnVuZWkgY8OzIGRp4buHbiB0w61jaCB0aOG6pXAgbmjhuqV0Lg0KDQotIFZpZXRuYW0gY8OzIGRp4buHbiB0w61jaCBsw6AgOC4zJQ0KDQojIyAqKjIuNy4gQmnhu4N1IMSR4buTIG3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBt4buZdCBz4buRIHF14buRYyBnaWEgdGh14buZYyDEkE7DgSoqDQpgYGB7cn0NCmQzICU+JSBnZ3Bsb3QoYWVzKHggPSAiIiwgeSA9IERlbnNpdHkuLnBlci5rbS4uLCBmaWxsID0gTmFtZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgZMOibiBz4buRIGPhu6dhIG3hu5l0IHPhu5Egbsaw4bubYyDEkE7DgSIsZmlsbCA9ICJRdeG7kWMgZ2lhIix4ID0gTlVMTCwgeSA9IE5VTEwpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChEZW5zaXR5Li5wZXIua20uLiAvIHN1bShEZW5zaXR5Li5wZXIua20uLikgKiAxMDAsIDEpLCAiJSIpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgc2l6ZSA9IDQpDQpgYGANCg0KLSBN4bqtdCDEkeG7mSBkw6JuIHPhu5EgY+G7p2EgU2luZ2Fwb3JlIGzDoCBjYW8gbmjhuqV0IDg4LjQlDQoNCiMjICoqMi44LiBCaeG7g3UgxJHhu5MgSGlzdG9ncmFtIFBvcHVsYXRpb25fMjAyMioqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IFgyMDIyKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwMDAwLCBmaWxsID0gJ2xpZ2h0Z3JlZW4nLGNvbG9yPSdibGFjaycpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gb2YgUG9wdWxhdGlvbiAyMDIyIix4ID0gIlBvcHVsYXRpb24iLHkgPSAiRnJlcXVlbmN5IikNCg0KYGBgDQoNCg0KKioyLjkuIEJp4buDdSDEkeG7kyBEZW5zaXR5IFBvcHVsYXRpb25fMjAyMioqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IFgyMDIyKSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdsaWdodGJsdWUnKSsNCiAgIGxhYnModGl0bGUgPSAiRGVuc2l0eSBvZiBQb3B1bGF0aW9uIDIwMjIiLHggPSAiUG9wdWxhdGlvbiIseSA9ICJGcmVxdWVuY3kiKQ0KDQpgYGANCg0KLSBEw6JuIHPhu5EgbsSDbSAyMDIyIGPhu6dhIGPDoWMgbsaw4bubYyBjw7Mgc+G7sSBiaeG6v24gxJHhu5luZyBt4bqhbmguIA0KDQojIyAqKjIuMTAuIEJp4buDdSDEkeG7kyBIaXN0b2dyYW0gQXJlYSoqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IEFyZWEuLmttLi4pKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMDAwLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gb2YgQXJlYSIsIHggPSAiQXJlYSAoa23CsikiLHkgPSAiRnJlcXVlbmN5IikNCg0KYGBgDQoNCioqMi4xMS4gQmnhu4N1IMSR4buTIERlbnNpdHkgQXJlYSoqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IEFyZWEuLmttLi4pKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ2xpZ2h0Ymx1ZScpKw0KICAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IG9mIEFyZWEiLHggPSAiQXJlYSAoa23CsikiLHkgPSAiRnJlcXVlbmN5IikNCg0KYGBgDQoNCi0gRGnhu4duIHTDrWNoIGPDoWMgbsaw4bubYyBjw7Mgc+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIGRvIMSRw7MgZOG7sWEgdsOgbyBz4buRIGTDom4gdsOgIGRp4buHbiB0w61jaCB0YSBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjIG3huq10IMSR4buZIGTDom4gc+G7kSBjw6FjIG7GsOG7m2MgxJHhu4F1IGPDsyBz4buxIGtow6FjIGJp4buHdCByw7UgcsOgbmcgdsOgIHThu6sgxJHDsyBjw7MgdGjhu4Mgc3V5IMSRb8OhbiBy4bqxbmcgZMOibiBz4buRIGPDoWMgbsaw4bubYyDhu58gbmjhu69uZyBuxINtIDIwMjMsMjAyNCB2w6AgduG7gSBzYXUgbuG7r2EgxJHhu4F1IHPhur0gdMSDbmcgdHLGsOG7n25nIG3huqFuaCBuaMawbmcgZGnhu4duIHTDrWNoIGtow7RuZyDEkeG7lWkgZG8gxJHDsyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgbmfDoHkgbeG7mXQgxJHDtG5nLiBUcm9uZyBraGkgxJHDsyDEkWnhu4F1IGtp4buHbiB5IHThur8gcGjDoXQgdHJp4buDbiBz4buRIG5nxrDhu51pIGzhu5tuIHR14buVaSBjYW8sIG5ndXkgY8ahIGdpw6AgaMOzYSBkw6JuIHPhu5EgdG/DoG4gY+G6p3UuDQoNCiMjICoqMi4xMi4gQmnhu4N1IMSR4buTIEhpc3RvZ3JhbSBEZW5zaXR5KioNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoIGFlcyh4ID0gRGVuc2l0eS4ucGVyLmttLi4pKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTAwLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBEZW5zaXR5IiwNCiAgICAgICB4ID0gIkRlbnNpdHkgKHBlciBrbcKyKSIsDQogICAgICAgeSA9ICJGcmVxdWVuY3kiKQ0KYGBgDQoNCi0gTeG6rXQgxJHhu5kgZMOibiBz4buRIGPDoWMgbsaw4bubYyDEkeG7gXUgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCB2w6AgbeG6rXQgxJHhu5kg4bufIGPDoWMgbsaw4bubYyDEkeG7qW5nIMSR4bqndSBkYW5oIHPDoWNoIMSR4buBdSBkw6B5IMSR4bq3Yy4NCg0KIyMgKioyLjEzLiBCaeG7g3UgxJHhu5Mgc2NhdHRlcnBsb3QgY2hvIGThu68gbGnhu4d1IFBvcHVsYXRpb25fMjAyMiB2w6AgQXJlYSoqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IFgyMDIyLCB5ID0gQXJlYS4ua20uLikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJwdXJwbGUiKSArDQogIGxhYnModGl0bGUgPSAiU2NhdHRlcnBsb3Qgb2YgUG9wdWxhdGlvbiAyMDIyIGFuZCBBcmVhIiwNCiAgICAgICB4ID0gIlBvcHVsYXRpb24iLA0KICAgICAgIHkgPSAiQXJlYSAoa23CsikiKQ0KDQpgYGANCg0KLSBCaeG7g3UgxJHhu5Mgc2NhdHRlcnBsb3QgY2hvIGThu68gbGnhu4d1IFBvcHVsYXRpb25fMjAyMiB2w6AgQXJlYSBjaG8gdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZMOibiBz4buRIHbDoCBkaeG7h24gdMOtY2ggY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuDQoNCi0gTmjDrG4gdsOgbyBiaeG7g3UgxJHhu5MsIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHLhurFuZyBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UgxJHGsOG7o2MgcGjDom4gdMOhbiB0csOqbiBraMO0bmcgZ2lhbiBiaeG7g3UgxJHhu5MgbeG7mXQgY8OhY2ggbmfhuqt1IG5oacOqbi4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBt4buZdCBt4bqrdSBxdXkgbHXhuq10IHLDtSByw6BuZyB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZMOibiBz4buRIHbDoCBkaeG7h24gdMOtY2guDQoNCi0gVHV5IG5oacOqbiwgY2jDum5nIHRhIGPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHLhurFuZyBjw7MgbeG7mXQgc+G7kSBxdeG7kWMgZ2lhIGPDsyBkaeG7h24gdMOtY2ggbmjhu48gdsOgIGTDom4gc+G7kSBs4bubbiwgdHJvbmcga2hpIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBraMOhYyBjw7MgZGnhu4duIHTDrWNoIGzhu5tuIG5oxrBuZyBkw6JuIHPhu5EgdGjhuqVwIGjGoW4uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBraMO0bmcgY2jhu4kgZGnhu4duIHTDrWNoIG3DoCBjw7JuIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIG3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBt4buXaSBxdeG7kWMgZ2lhLg0KDQojIyAqKjIuMTQuIEJp4buDdSDEkeG7kyBzY2F0dGVycGxvdCBjaG8gZOG7ryBsaeG7h3UgUG9wdWxhdGlvbl8yMDIyIHbDoCBEZW5zaXR5KioNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gWDIwMjIsIHkgPSBEZW5zaXR5Li5wZXIua20uLikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJncmVlbiIpICsNCiAgbGFicyh0aXRsZSA9ICJTY2F0dGVycGxvdCBvZiBQb3B1bGF0aW9uIDIwMjIgYW5kIERlbnNpdHkiLA0KICAgICAgIHggPSAiUG9wdWxhdGlvbiIsDQogICAgICAgeSA9ICJEZW5zaXR5IChwZXIga23CsikiKQ0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIHNjYXR0ZXJwbG90IGNobyBk4buvIGxp4buHdSBQb3B1bGF0aW9uXzIwMjIgdsOgIERlbnNpdHkgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZMOibiBz4buRIHbDoCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuDQoNCi0gQ8OzIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBjw7MgZMOibiBz4buRIGzhu5tuIHbDoCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvLCB0cm9uZyBraGkgbeG7mXQgc+G7kSBxdeG7kWMgZ2lhIGtow6FjIGPDsyBkw6JuIHPhu5EgbOG7m24gbmjGsG5nIG3huq10IMSR4buZIGTDom4gc+G7kSB0aOG6pXAgaMahbi4gxJBp4buBdSBuw6B5IGNo4buJIHJhIHLhurFuZyBt4bqtdCDEkeG7mSBkw6JuIHPhu5Ega2jDtG5nIGNo4buJIHBo4bulIHRodeG7mWMgdsOgbyBkw6JuIHPhu5EgbcOgIGPDsm4gcGjhu6UgdGh14buZYyB2w6BvIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBuaMawIGRp4buHbiB0w61jaC4NCg0KIyMgKioyLjE1LiBCaeG7g3UgxJHhu5Mgc2NhdHRlcnBsb3QgY2hvIGThu68gbGnhu4d1IEFyZWEgdsOgIERlbnNpdHkqKg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBBcmVhLi5rbS4uLCB5ID0gRGVuc2l0eS4ucGVyLmttLi4pKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIlNjYXR0ZXJwbG90IG9mIEFyZWEgYW5kIERlbnNpdHkiLA0KICAgICAgIHggPSAiQXJlYSAoa23CsikiLA0KICAgICAgIHkgPSAiRGVuc2l0eSAocGVyIGttwrIpIikNCmBgYA0KDQotIENow7puZyB0YSBjw7MgdGjhu4Mgbmjhuq1uIHRo4bqleSBt4buZdCBz4buRIHF14buRYyBnaWEgY8OzIGRp4buHbiB0w61jaCBuaOG7jyB2w6AgbeG6rXQgxJHhu5kgZMOibiBz4buRIGNhbywgdHJvbmcga2hpIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBraMOhYyBjw7MgZGnhu4duIHTDrWNoIGzhu5tuIG5oxrBuZyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgdGjhuqVwIGjGoW4uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBt4bqtdCDEkeG7mSBkw6JuIHPhu5Ega2jDtG5nIGNo4buJIHBo4bulIHRodeG7mWMgdsOgbyBkaeG7h24gdMOtY2ggbcOgIGPDsm4gcGjhu6UgdGh14buZYyB2w6BvIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBuaMawIGTDom4gc+G7kSB2w6AgY8OhYyB54bq/dSB04buRIMSR4buLYSBsw70ga2jDoWMuDQoNCi0gTmdvw6BpIHJhLCBiaeG7g3UgxJHhu5MgY8WpbmcgY2hvIHRo4bqleSBy4bqxbmcgY8OzIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBjw7MgbeG6rXQgxJHhu5kgZMOibiBz4buRIHLhuqV0IGNhbyB24bubaSBkaeG7h24gdMOtY2ggbmjhu48sIHRyb25nIGtoaSBjw7MgbeG7mXQgc+G7kSBxdeG7kWMgZ2lhIGtow6FjIGPDsyBkaeG7h24gdMOtY2ggbOG7m24gbmjGsG5nIG3huq10IMSR4buZIGTDom4gc+G7kSB0aOG6pXAgaMahbi4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBjaOG7iSByYSBz4buxIGtow6FjIGJp4buHdCB24buBIHPhu7EgcGjDom4gYuG7kSBkw6JuIHPhu5EgdsOgIGRp4buHbiB0w61jaCBnaeG7r2EgY8OhYyBxdeG7kWMgZ2lhLg0KDQotIFR1eSBuaGnDqm4sIMSR4buDIGhp4buDdSByw7UgaMahbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZGnhu4duIHTDrWNoIHbDoCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EsIGPhuqduIHhlbSB4w6l0IHRow6ptIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBuaMawIGTDom4gc+G7kSwgY8ahIGPhuqV1IGTDom4gc+G7kSwgdsOgIGPDoWMgeeG6v3UgdOG7kSBraW5oIHThur8sIHjDoyBo4buZaSBraMOhYyBj4bunYSB04burbmcgcXXhu5FjIGdpYS4gxJBp4buBdSBuw6B5IGdpw7pwIHRhIGPDsyBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbDoCBjaGkgdGnhur90IGjGoW4gduG7gSBt4buRaSBxdWFuIGjhu4cgbsOgeSB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQojIyAqKjIuMTYuIEJp4buDdSDEkeG7kyDEkcaw4budbmcgdGjhu4MgaGnhu4duIG3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgxJBOw4EqKg0KYGBge3J9DQpkMyAlPiUgZ2dwbG90KCBhZXMoeCA9IE5hbWUsIHkgPSBEZW5zaXR5Li5wZXIua20uLikpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHRpdGxlID0gIlBvcHVsYXRpb24gRGVuc2l0eSBvZiBDb3VudHJpZXMiLCB4ID0gIkNvdW50cnkiLCB5ID0gIkRlbnNpdHkgKHBlciBrbcKyKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KLSBOaMOsbiB2w6BvIGJp4buDdSDEkeG7kywgY2jDum5nIHRhIGPDsyB0aOG7gyB0aOG6pXkgcuG6sW5nIFBoaWxpcHBpbmVzIGPDsyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvIG5o4bqldCwgdGnhur9wIHRoZW8gbMOgIFZpZXRuYW0gdsOgIEluZG9uZXNpYS4gVGjDoWkgTGFuIHbDoCBNeWFubWFyIGPDsyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgdGjhuqVwIGjGoW4gc28gduG7m2kgY8OhYyBxdeG7kWMgZ2lhIGtow6FjIHRyb25nIHPhu5EgbsOgeS4NCg0KLSBCaeG7g3UgxJHhu5Mgc+G7rSBk4bulbmcgY8OhYyDEkWnhu4NtIMSR4buDIGJp4buDdSB0aOG7iyBk4buvIGxp4buHdSB04burbmcgcXXhu5FjIGdpYSBj4bulIHRo4buDLCB0cm9uZyBraGkgxJHGsOG7nW5nIHRo4bqzbmcgbuG7kWkgY8OhYyDEkWnhu4NtIGdpw7pwIGNow7puZyB0YSBuaMOsbiB0aOG6pXkgeHUgaMaw4bubbmcgdOG7lW5nIHF1YW4gY+G7p2EgbeG6rXQgxJHhu5kgZMOibiBz4buRLg0KDQojIyAqKjIuMTcuIEJp4buDdSDEkeG7kyBj4buZdCDEkeG7kWkgY2hp4bq/dSBkaeG7h24gdMOtY2ggY8OhYyBxdeG7kWMgZ2lhIMSQTsOBKioNCmBgYHtyfQ0KZDMgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBBcmVhLi5rbS4uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiQ29tcGFyaXNvbiBvZiBDb3VudHJ5IEFyZWFzIiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJBcmVhIChrbcKyKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KLSBRdWEgYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIG5ow6xuIHRo4bqleSBy4bqxbmcgSW5kb25lc2lhIGPDsyBkaeG7h24gdMOtY2ggbOG7m24gbmjhuqV0IHRyb25nIHPhu5EgY8OhYyBxdeG7kWMgZ2lhIMSRxrDhu6NjIHNvIHPDoW5oLCB0aeG6v3AgdGhlbyBsw6AgTXlhbm1hciwgVGhhaWxhbmQsIFBoaWxpcHBpbmVzIHbDoCBWaWV0bmFtLg0KDQojIyAqKjIuMTguIEJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gdOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIMSQTsOBKioNCmBgYHtyfQ0KZDMgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBHcm93dGhSYXRlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiUG9wdWxhdGlvbiBHcm93dGggUmF0ZSBvZiBDb3VudHJpZXMiLCB4ID0gIkNvdW50cnkiLCB5ID0gIkdyb3d0aCBSYXRlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQotIEThu7FhIHbDoG8gYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIG5o4bqtbiB0aOG6pXkgcuG6sW5nIEluZG9uZXNpYSwgUGhpbGlwcGluZXMgdsOgIFZpZXRuYW0gY8OzIHThu7cgbOG7hyB0xINuZyB0csaw4bufbmcgZMOibiBz4buRIGNhbyBuaOG6pXQgdHJvbmcgc+G7kSBjw6FjIHF14buRYyBnaWEgxJHGsOG7o2Mgc28gc8OhbmguIFRow6FpIExhbiB2w6AgTXlhbm1hciBjw7MgdOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EgdGjhuqVwIGjGoW4gc28gduG7m2kgY8OhYyBxdeG7kWMgZ2lhIGtow6FjIHRyb25nIG5ow7NtIG7DoHkuDQoNCiMjICoqMi4xOS4gQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiB04buJIGzhu4cgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSDEkE7DgSoqDQpgYGB7cn0NCmQzICU+JSBnZ3Bsb3QoYWVzKHggPSBOYW1lLCB5ID0gV29ybGQuUG9wdWxhdGlvbi5QZXJjZW50YWdlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiV29ybGQgUG9wdWxhdGlvbiBQZXJjZW50YWdlIFJhbmsgb2YgQ291bnRyaWVzIiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJSYW5rIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQotIEThu7FhIHbDoG8gYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIG5ow6xuIHRo4bqleSBy4bqxbmcgSW5kb25lc2lhIGPDsyBkw6JuIHPhu5EgY2hp4bq/bSBwaOG6p24gdHLEg20gbOG7m24gbmjhuqV0IHRyw6puIHRo4bq/IGdp4bubaSB0cm9uZyBz4buRIGPDoWMgcXXhu5FjIGdpYSDEkcaw4bujYyBzbyBzw6FuaC4gUGhpbGlwcGluZXMgdsOgIFZpZXRuYW0gY8WpbmcgY8OzIGTDom4gc+G7kSBjaGnhur9tIHBo4bqnbiB0csSDbSBraMOhIGNhby4gQnJ1bmVpIHbDoCBTaW5nYXBvcmUgY8OzIGTDom4gc+G7kSBjaGnhur9tIHBo4bqnbiB0csSDbSB0aOG6pXAgaMahbiBzbyB24bubaSBjw6FjIHF14buRYyBnaWEga2jDoWMgdHJvbmcgbmjDs20gbsOgeS4NCg0KIyMgKioyLjIwLiBCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIGRp4buHbiB0w61jaCB2w6AgbeG6rXQgxJHhu5kgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSDEkE7DgSoqDQpgYGB7cn0NCmQzICU+JSBnZ3Bsb3QoYWVzKHggPSBOYW1lKSkgKw0KICBnZW9tX2NvbChhZXMoeSA9IEFyZWEuLmttLi4pLCBmaWxsID0gInN0ZWVsYmx1ZSIsIHdpZHRoID0gMC40LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gRGVuc2l0eS4ucGVyLmttLi4gKiA1MDAwKSwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEsIGdyb3VwID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkNvbXBhcmlzb24gb2YgQXJlYSBhbmQgUG9wdWxhdGlvbiBEZW5zaXR5IiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJBcmVhIC8gRGVuc2l0eSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKHNlYy5heGlzID0gc2VjX2F4aXMofi4vNTAwMCwgbmFtZSA9ICJEZW5zaXR5IChwZXIga23CsikiKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCi0gROG7sWEgdsOgbyBiaeG7g3UgxJHhu5MsIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHLhurFuZyBJbmRvbmVzaWEgY8OzIGRp4buHbiB0w61jaCBs4bubbiBuaOG6pXQgdHJvbmcgc+G7kSBjw6FjIHF14buRYyBnaWEgxJHGsOG7o2Mgc28gc8OhbmgsIHRyb25nIGtoaSBQaGlsaXBwaW5lcyBjw7MgbeG6rXQgxJHhu5kgZMOibiBz4buRIGNhbyBuaOG6pXQuIFZpZXRuYW0gdsOgIFRoYWlsYW5kIGPDsyBkaeG7h24gdMOtY2ggdMawxqFuZyDEkeG7kWkgbOG7m24sIG5oxrBuZyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgdGjhuqVwIGjGoW4gc28gduG7m2kgSW5kb25lc2lhIHbDoCBQaGlsaXBwaW5lcy4gTXlhbm1hciBjw7MgZGnhu4duIHTDrWNoIHbDoCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgdGjhuqVwIG5o4bqldCB0cm9uZyBz4buRIGPDoWMgcXXhu5FjIGdpYSBuw6B5Lg==