1 Giới thiệu bộ dữ liệu

Bộ dữ liệu iris là một tập hợp các dữ liệu về các loài hoa iris thu thập bởi nhà thực vật học Ronald Fisher vào những năm 1930. Bộ dữ liệu này chứa thông tin về các đặc điểm morfôlogi của các mẫu hoa iris thuộc ba loài khác nhau: Iris setosa, Iris versicolor và Iris virginica. Cụ thể, các đặc điểm này bao gồm:

  • Sepal Length (Chiều dài lá đài): Độ dài của lá đài trong đơn vị centimet.
  • Sepal Width (Chiều rộng lá đài): Độ rộng của lá đài trong đơn vị centimet.
  • Petal Length (Chiều dài cánh hoa): Độ dài của cánh hoa trong đơn vị centimet.
  • Petal Width (Chiều rộng cánh hoa): Độ rộng của cánh hoa trong đơn vị centimet. Mỗi mẫu hoa iris được ghi lại thông qua bốn thuộc tính trên và được gắn nhãn với loài tương ứng của nó.

Bộ dữ liệu iris gồm tổng cộng 150 mẫu, với mỗi loài hoa iris có 50 mẫu. Bộ dữ liệu này đã trở thành một bộ dữ liệu kinh điển trong lĩnh vực học máy và thống kê, được sử dụng rộng rãi để minh họa các kỹ thuật phân loại, phân tích phân biệt và khám phá dữ liệu.

Với các thông tin về kích thước và hình dạng của lá đài và cánh hoa, bộ dữ liệu iris cung cấp một nền tảng lý tưởng để nghiên cứu và áp dụng các phương pháp phân loại và nhận dạng mẫu, cũng như hiểu rõ hơn về sự đa dạng của loài hoa iris.

1.1 Biểu đồ 1

library(tidyverse)
data("iris")
hoa <- iris
library(dplyr)
library(ggplot2)

# Tính toán chiều dài lá trung bình của mỗi loài hoa iris
iris_avg_sepal_length <- iris %>%
  group_by(Species) %>%
  summarise(avg_sepal_length = mean(Sepal.Length))

# Vẽ biểu đồ cột
ggplot(iris_avg_sepal_length, aes(x = Species, y = avg_sepal_length, fill = Species)) +
  geom_bar(stat = "identity", color = "black") +
  labs(title = "Độ dài lá trung bình của mỗi loài",
       x = "Loài",
       y = "Độ dài lá trung bình")

Giải thích biểu đồ 1 - group_by(Species): Hàm group_by() của gói dplyr được sử dụng để nhóm dữ liệu theo một biến cụ thể, trong trường hợp này là cột Species.

  • summarise(avg_sepal_length = mean(Sepal.Length)): Hàm summarise() của dplyr được sử dụng để tóm tắt dữ liệu. Trong trường hợp này, chúng ta tính giá trị trung bình của cột Sepal.Length cho mỗi nhóm loài hoa Species, và lưu kết quả vào cột mới avg_sepal_length. Kết quả sẽ được lưu vào một data frame mới có tên là iris_avg_sepal_length.

  • ggplot(): Hàm này khởi tạo một đối tượng ggplot. Trong trường hợp này, chúng ta cung cấp dữ liệu iris_avg_sepal_length làm dữ liệu đầu vào.

  • aes(): Hàm này được sử dụng để xác định các aesthetics (mỹ thuật) cho biểu đồ. Trong trường hợp này, chúng ta gán cột Species cho trục x và cột avg_sepal_length cho trục y, và tô màu theo Species.

-geom_bar(): Hàm này được sử dụng để vẽ biểu đồ cột. Tham số stat = “identity” đảm bảo rằng chiều cao của các cột được lấy trực tiếp từ dữ liệu (không thực hiện tính toán lại).

-labs(): Hàm này được sử dụng để gán nhãn cho các trục và biểu đồ.

  • biểu đồ này sẽ tính toán chiều dài lá trung bình của mỗi loài hoa iris và sau đó vẽ biểu đồ cột để so sánh giữa các loài. Biểu đồ cột sẽ có trục x là tên loài hoa iris và trục y là chiều dài lá trung bình, được tô màu khác nhau cho mỗi loài hoa để dễ nhận biết.

1.2 Biểu đồ 2

library(ggplot2)
# Tính số lượng của mỗi loài hoa iris
species_count <- table(iris$Species)
# Tạo biểu đồ pie chart
pie_chart <- ggplot(data = NULL, aes(x = "", y = species_count, fill = names(species_count))) +
  geom_bar(stat = "identity") +
  coord_polar("y", start = 0) +
  labs(title = "Phân bố của các loài hoa",
       fill = "Loài") +
  theme_void()
# Hiển thị biểu đồ
print(pie_chart)
## Don't know how to automatically pick scale for object of type <table>.
## Defaulting to continuous.

Giải thích biểu đồ 2

  • ggplot(data = NULL, aes(x = ““, y = species_count, fill = names(species_count))): Đây là câu lệnh để khởi tạo một đối tượng ggplot. Chúng ta cung cấp NULL cho dữ liệu vì chúng ta đã tính toán số lượng trước đó. Trong aesthetics, chúng ta sử dụng y để đại diện cho số lượng của mỗi loài hoa iris, và fill để tô màu theo tên của các loài hoa.

  • geom_bar(stat = “identity”): Chúng ta sử dụng geom_bar() để tạo ra biểu đồ cột, với tham số stat = “identity” để đảm bảo rằng chiều cao của cột được lấy trực tiếp từ dữ liệu (không thực hiện tính toán lại).

  • coord_polar(“y”, start = 0): Hàm này thiết lập loại biểu đồ là biểu đồ pie chart.

  • labs(): Hàm này được sử dụng để đặt tiêu đề và nhãn cho biểu đồ.

  • theme_void(): Hàm này thiết lập giao diện cho biểu đồ là không có gì (void), nghĩa là không có bất kỳ lưới hoặc trục nào.

1.3 Biểu đồ 3

library(ggplot2)
# Tính số lượng của mỗi loài hoa iris
species_count <- table(iris$Species)
# Tạo biểu đồ pie chart
pie_chart <- ggplot(data = NULL, aes(x = "", y = species_count, fill = names(species_count))) +
  geom_bar(stat = "identity") +
  coord_polar("y", start = 0) +
  labs(title = "phân bố của 3 loài hoa",
       fill = "loài") +
  theme_minimal()
# Hiển thị biểu đồ
print(pie_chart)
## Don't know how to automatically pick scale for object of type <table>.
## Defaulting to continuous.

Giả thích biểu đồ 3

  • table(iris$Species) tính số lượng hoa của mỗi loại.

  • ggplot() khởi tạo biểu đồ pie chart.

  • geom_bar(stat = “identity”) tạo ra biểu đồ cột với chiều dài tương ứng với số lượng từng loại hoa.

  • coord_polar(“y”, start = 0) chuyển biểu đồ thành dạng pie chart với trục số quanh đường tròn.

  • theme_minimal() thiết lập giao diện cho biểu đồ.

  • Sau khi chạy mã này, bạn sẽ có một biểu đồ pie chart thể hiện số lượng hoa từng loại có trục số quanh đường tròn.

1.4 BIểu đồ 4

library(ggplot2)
# Tạo biểu đồ density plot
density_plot <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
  geom_density(alpha = 0.5) +
  labs(title = "Density Plot of Sepal Length by Species",
       x = "Sepal Length",
       y = "Density",
       fill = "Species") +
  theme_minimal()
# Hiển thị biểu đồ
print(density_plot)

Giải thích biểu đồ 4

  • ggplot(iris, aes(x = Sepal.Length, fill = Species)) khởi tạo biểu đồ density plot, với dữ liệu từ dataframe iris, chiều dài lá đài (Sepal.Length) làm trục x và màu sắc theo loài hoa (Species).

  • geom_density(alpha = 0.5) thêm layer density plot vào biểu đồ với độ mờ (alpha) là 0.5 để giảm độ trong suốt của đường density.

  • labs() được sử dụng để đặt tiêu đề và nhãn cho các trục và biểu đồ.

  • theme_minimal() thiết lập giao diện cho biểu đồ là giao diện tối giản.

  • Sau khi chạy mã này, bạn sẽ có một biểu đồ density plot thể hiện phân phối của chiều dài lá đài theo từng loài hoa iris.

1.5 Biểu đồ 5

library(ggplot2)

# Tạo biểu đồ histogram
histogram_plot <- ggplot(iris, aes(x = Sepal.Width, fill = Species)) +
  geom_histogram(binwidth = 0.2, position = "dodge", alpha = 0.5) +
  labs(title = "Histogram of Sepal Width by Species",
       x = "Sepal Width",
       y = "Frequency",
       fill = "Species") +
  theme_minimal()

# Hiển thị biểu đồ
print(histogram_plot)

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTmhoYW8iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQojICoqR2nhu5tpIHRoaeG7h3UgYuG7mSBk4buvIGxp4buHdSoqDQoNCkLhu5kgZOG7ryBsaeG7h3UgaXJpcyBsw6AgbeG7mXQgdOG6rXAgaOG7o3AgY8OhYyBk4buvIGxp4buHdSB24buBIGPDoWMgbG/DoGkgaG9hIGlyaXMgdGh1IHRo4bqtcCBi4bufaSBuaMOgIHRo4buxYyB24bqtdCBo4buNYyBSb25hbGQgRmlzaGVyIHbDoG8gbmjhu69uZyBuxINtIDE5MzAuIELhu5kgZOG7ryBsaeG7h3UgbsOgeSBjaOG7qWEgdGjDtG5nIHRpbiB24buBIGPDoWMgxJHhurdjIMSRaeG7g20gbW9yZsO0bG9naSBj4bunYSBjw6FjIG3huqt1IGhvYSBpcmlzIHRodeG7mWMgYmEgbG/DoGkga2jDoWMgbmhhdTogSXJpcyBzZXRvc2EsIElyaXMgdmVyc2ljb2xvciB2w6AgSXJpcyB2aXJnaW5pY2EuIEPhu6UgdGjhu4MsIGPDoWMgxJHhurdjIMSRaeG7g20gbsOgeSBiYW8gZ+G7k206DQoNCi0gU2VwYWwgTGVuZ3RoIChDaGnhu4F1IGTDoGkgbMOhIMSRw6BpKTogxJDhu5kgZMOgaSBj4bunYSBsw6EgxJHDoGkgdHJvbmcgxJHGoW4gduG7iyBjZW50aW1ldC4NCi0gU2VwYWwgV2lkdGggKENoaeG7gXUgcuG7mW5nIGzDoSDEkcOgaSk6IMSQ4buZIHLhu5luZyBj4bunYSBsw6EgxJHDoGkgdHJvbmcgxJHGoW4gduG7iyBjZW50aW1ldC4NCi0gUGV0YWwgTGVuZ3RoIChDaGnhu4F1IGTDoGkgY8OhbmggaG9hKTogxJDhu5kgZMOgaSBj4bunYSBjw6FuaCBob2EgdHJvbmcgxJHGoW4gduG7iyBjZW50aW1ldC4NCi0gUGV0YWwgV2lkdGggKENoaeG7gXUgcuG7mW5nIGPDoW5oIGhvYSk6IMSQ4buZIHLhu5luZyBj4bunYSBjw6FuaCBob2EgdHJvbmcgxJHGoW4gduG7iyBjZW50aW1ldC4NCk3hu5dpIG3huqt1IGhvYSBpcmlzIMSRxrDhu6NjIGdoaSBs4bqhaSB0aMO0bmcgcXVhIGLhu5FuIHRodeG7mWMgdMOtbmggdHLDqm4gdsOgIMSRxrDhu6NjIGfhuq9uIG5ow6NuIHbhu5tpIGxvw6BpIHTGsMahbmcg4bupbmcgY+G7p2EgbsOzLg0KDQpC4buZIGThu68gbGnhu4d1IGlyaXMgZ+G7k20gdOG7lW5nIGPhu5luZyAxNTAgbeG6q3UsIHbhu5tpIG3hu5dpIGxvw6BpIGhvYSBpcmlzIGPDsyA1MCBt4bqrdS4gQuG7mSBk4buvIGxp4buHdSBuw6B5IMSRw6MgdHLhu58gdGjDoG5oIG3hu5l0IGLhu5kgZOG7ryBsaeG7h3Uga2luaCDEkWnhu4NuIHRyb25nIGzEqW5oIHbhu7FjIGjhu41jIG3DoXkgdsOgIHRo4buRbmcga8OqLCDEkcaw4bujYyBz4butIGThu6VuZyBy4buZbmcgcsOjaSDEkeG7gyBtaW5oIGjhu41hIGPDoWMga+G7uSB0aHXhuq10IHBow6JuIGxv4bqhaSwgcGjDom4gdMOtY2ggcGjDom4gYmnhu4d0IHbDoCBraMOhbSBwaMOhIGThu68gbGnhu4d1Lg0KDQpW4bubaSBjw6FjIHRow7RuZyB0aW4gduG7gSBrw61jaCB0aMaw4bubYyB2w6AgaMOsbmggZOG6oW5nIGPhu6dhIGzDoSDEkcOgaSB2w6AgY8OhbmggaG9hLCBi4buZIGThu68gbGnhu4d1IGlyaXMgY3VuZyBj4bqlcCBt4buZdCBu4buBbiB04bqjbmcgbMO9IHTGsOG7n25nIMSR4buDIG5naGnDqm4gY+G7qXUgdsOgIMOhcCBk4bulbmcgY8OhYyBwaMawxqFuZyBwaMOhcCBwaMOibiBsb+G6oWkgdsOgIG5o4bqtbiBk4bqhbmcgbeG6q3UsIGPFqW5nIG5oxrAgaGnhu4N1IHLDtSBoxqFuIHbhu4Egc+G7sSDEkWEgZOG6oW5nIGPhu6dhIGxvw6BpIGhvYSBpcmlzLg0KDQojIyAqKkJp4buDdSDEkeG7kyAxKioNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmRhdGEoImlyaXMiKQ0KaG9hIDwtIGlyaXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgVMOtbmggdG/DoW4gY2hp4buBdSBkw6BpIGzDoSB0cnVuZyBiw6xuaCBj4bunYSBt4buXaSBsb8OgaSBob2EgaXJpcw0KaXJpc19hdmdfc2VwYWxfbGVuZ3RoIDwtIGlyaXMgJT4lDQogIGdyb3VwX2J5KFNwZWNpZXMpICU+JQ0KICBzdW1tYXJpc2UoYXZnX3NlcGFsX2xlbmd0aCA9IG1lYW4oU2VwYWwuTGVuZ3RoKSkNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdA0KZ2dwbG90KGlyaXNfYXZnX3NlcGFsX2xlbmd0aCwgYWVzKHggPSBTcGVjaWVzLCB5ID0gYXZnX3NlcGFsX2xlbmd0aCwgZmlsbCA9IFNwZWNpZXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh0aXRsZSA9ICLEkOG7mSBkw6BpIGzDoSB0cnVuZyBiw6xuaCBj4bunYSBt4buXaSBsb8OgaSIsDQogICAgICAgeCA9ICJMb8OgaSIsDQogICAgICAgeSA9ICLEkOG7mSBkw6BpIGzDoSB0cnVuZyBiw6xuaCIpDQoNCmBgYA0KDQoNCioqR2nhuqNpIHRow61jaCBiaeG7g3UgxJHhu5MgMSoqDQotIGdyb3VwX2J5KFNwZWNpZXMpOiBIw6BtIGdyb3VwX2J5KCkgY+G7p2EgZ8OzaSBkcGx5ciDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBuaMOzbSBk4buvIGxp4buHdSB0aGVvIG3hu5l0IGJp4bq/biBj4bulIHRo4buDLCB0cm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSBsw6AgY+G7mXQgU3BlY2llcy4NCg0KLSBzdW1tYXJpc2UoYXZnX3NlcGFsX2xlbmd0aCA9IG1lYW4oU2VwYWwuTGVuZ3RoKSk6IEjDoG0gc3VtbWFyaXNlKCkgY+G7p2EgZHBseXIgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdMOzbSB04bqvdCBk4buvIGxp4buHdS4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGNow7puZyB0YSB0w61uaCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGPhu5l0IFNlcGFsLkxlbmd0aCBjaG8gbeG7l2kgbmjDs20gbG/DoGkgaG9hIFNwZWNpZXMsIHbDoCBsxrB1IGvhur90IHF14bqjIHbDoG8gY+G7mXQgbeG7m2kgYXZnX3NlcGFsX2xlbmd0aC4gS+G6v3QgcXXhuqMgc+G6vSDEkcaw4bujYyBsxrB1IHbDoG8gbeG7mXQgZGF0YSBmcmFtZSBt4bubaSBjw7MgdMOqbiBsw6AgaXJpc19hdmdfc2VwYWxfbGVuZ3RoLg0KDQotIGdncGxvdCgpOiBIw6BtIG7DoHkga2jhu59pIHThuqFvIG3hu5l0IMSR4buRaSB0xrDhu6NuZyBnZ3Bsb3QuIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCBjaMO6bmcgdGEgY3VuZyBj4bqlcCBk4buvIGxp4buHdSBpcmlzX2F2Z19zZXBhbF9sZW5ndGggbMOgbSBk4buvIGxp4buHdSDEkeG6p3UgdsOgby4NCg0KLSBhZXMoKTogSMOgbSBuw6B5IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHjDoWMgxJHhu4tuaCBjw6FjIGFlc3RoZXRpY3MgKG3hu7kgdGh14bqtdCkgY2hvIGJp4buDdSDEkeG7ky4gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHksIGNow7puZyB0YSBnw6FuIGPhu5l0IFNwZWNpZXMgY2hvIHRy4bulYyB4IHbDoCBj4buZdCBhdmdfc2VwYWxfbGVuZ3RoIGNobyB0cuG7pWMgeSwgdsOgIHTDtCBtw6B1IHRoZW8gU3BlY2llcy4NCg0KLWdlb21fYmFyKCk6IEjDoG0gbsOgeSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IGJp4buDdSDEkeG7kyBj4buZdC4gVGhhbSBz4buRIHN0YXQgPSAiaWRlbnRpdHkiIMSR4bqjbSBi4bqjbyBy4bqxbmcgY2hp4buBdSBjYW8gY+G7p2EgY8OhYyBj4buZdCDEkcaw4bujYyBs4bqleSB0cuG7sWMgdGnhur9wIHThu6sgZOG7ryBsaeG7h3UgKGtow7RuZyB0aOG7sWMgaGnhu4duIHTDrW5oIHRvw6FuIGzhuqFpKS4NCg0KLWxhYnMoKTogSMOgbSBuw6B5IMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGfDoW4gbmjDo24gY2hvIGPDoWMgdHLhu6VjIHbDoCBiaeG7g3UgxJHhu5MuDQoNCi0gYmnhu4N1IMSR4buTIG7DoHkgc+G6vSB0w61uaCB0b8OhbiBjaGnhu4F1IGTDoGkgbMOhIHRydW5nIGLDrG5oIGPhu6dhIG3hu5dpIGxvw6BpIGhvYSBpcmlzIHbDoCBzYXUgxJHDsyB24bq9IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7gyBzbyBzw6FuaCBnaeG7r2EgY8OhYyBsb8OgaS4gQmnhu4N1IMSR4buTIGPhu5l0IHPhur0gY8OzIHRy4bulYyB4IGzDoCB0w6puIGxvw6BpIGhvYSBpcmlzIHbDoCB0cuG7pWMgeSBsw6AgY2hp4buBdSBkw6BpIGzDoSB0cnVuZyBiw6xuaCwgxJHGsOG7o2MgdMO0IG3DoHUga2jDoWMgbmhhdSBjaG8gbeG7l2kgbG/DoGkgaG9hIMSR4buDIGThu4Ugbmjhuq1uIGJp4bq/dC4NCg0KIyMgKipCaeG7g3UgxJHhu5MgMioqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KIyBUw61uaCBz4buRIGzGsOG7o25nIGPhu6dhIG3hu5dpIGxvw6BpIGhvYSBpcmlzDQpzcGVjaWVzX2NvdW50IDwtIHRhYmxlKGlyaXMkU3BlY2llcykNCiMgVOG6oW8gYmnhu4N1IMSR4buTIHBpZSBjaGFydA0KcGllX2NoYXJ0IDwtIGdncGxvdChkYXRhID0gTlVMTCwgYWVzKHggPSAiIiwgeSA9IHNwZWNpZXNfY291bnQsIGZpbGwgPSBuYW1lcyhzcGVjaWVzX2NvdW50KSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGPhu6dhIGPDoWMgbG/DoGkgaG9hIiwNCiAgICAgICBmaWxsID0gIkxvw6BpIikgKw0KICB0aGVtZV92b2lkKCkNCiMgSGnhu4NuIHRo4buLIGJp4buDdSDEkeG7kw0KcHJpbnQocGllX2NoYXJ0KQ0KDQpgYGANCg0KKipHaeG6o2kgdGjDrWNoIGJp4buDdSDEkeG7kyAyKioNCg0KLSBnZ3Bsb3QoZGF0YSA9IE5VTEwsIGFlcyh4ID0gIiIsIHkgPSBzcGVjaWVzX2NvdW50LCBmaWxsID0gbmFtZXMoc3BlY2llc19jb3VudCkpKTogxJDDonkgbMOgIGPDonUgbOG7h25oIMSR4buDIGto4bufaSB04bqhbyBt4buZdCDEkeG7kWkgdMaw4bujbmcgZ2dwbG90LiBDaMO6bmcgdGEgY3VuZyBj4bqlcCBOVUxMIGNobyBk4buvIGxp4buHdSB2w6wgY2jDum5nIHRhIMSRw6MgdMOtbmggdG/DoW4gc+G7kSBsxrDhu6NuZyB0csaw4bubYyDEkcOzLiBUcm9uZyBhZXN0aGV0aWNzLCBjaMO6bmcgdGEgc+G7rSBk4bulbmcgeSDEkeG7gyDEkeG6oWkgZGnhu4duIGNobyBz4buRIGzGsOG7o25nIGPhu6dhIG3hu5dpIGxvw6BpIGhvYSBpcmlzLCB2w6AgZmlsbCDEkeG7gyB0w7QgbcOgdSB0aGVvIHTDqm4gY+G7p2EgY8OhYyBsb8OgaSBob2EuDQoNCi0gZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpOiBDaMO6bmcgdGEgc+G7rSBk4bulbmcgZ2VvbV9iYXIoKSDEkeG7gyB04bqhbyByYSBiaeG7g3UgxJHhu5MgY+G7mXQsIHbhu5tpIHRoYW0gc+G7kSBzdGF0ID0gImlkZW50aXR5IiDEkeG7gyDEkeG6o20gYuG6o28gcuG6sW5nIGNoaeG7gXUgY2FvIGPhu6dhIGPhu5l0IMSRxrDhu6NjIGzhuqV5IHRy4buxYyB0aeG6v3AgdOG7qyBk4buvIGxp4buHdSAoa2jDtG5nIHRo4buxYyBoaeG7h24gdMOtbmggdG/DoW4gbOG6oWkpLg0KDQotIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQgPSAwKTogSMOgbSBuw6B5IHRoaeG6v3QgbOG6rXAgbG/huqFpIGJp4buDdSDEkeG7kyBsw6AgYmnhu4N1IMSR4buTIHBpZSBjaGFydC4NCg0KLSBsYWJzKCk6IEjDoG0gbsOgeSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgdsOgIG5ow6NuIGNobyBiaeG7g3UgxJHhu5MuDQoNCi0gdGhlbWVfdm9pZCgpOiBIw6BtIG7DoHkgdGhp4bq/dCBs4bqtcCBnaWFvIGRp4buHbiBjaG8gYmnhu4N1IMSR4buTIGzDoCBraMO0bmcgY8OzIGfDrCAodm9pZCksIG5naMSpYSBsw6Aga2jDtG5nIGPDsyBi4bqldCBr4buzIGzGsOG7m2kgaG/hurdjIHRy4bulYyBuw6BvLg0KDQojIyAqKkJp4buDdSDEkeG7kyAzKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQojIFTDrW5oIHPhu5EgbMaw4bujbmcgY+G7p2EgbeG7l2kgbG/DoGkgaG9hIGlyaXMNCnNwZWNpZXNfY291bnQgPC0gdGFibGUoaXJpcyRTcGVjaWVzKQ0KIyBU4bqhbyBiaeG7g3UgxJHhu5MgcGllIGNoYXJ0DQpwaWVfY2hhcnQgPC0gZ2dwbG90KGRhdGEgPSBOVUxMLCBhZXMoeCA9ICIiLCB5ID0gc3BlY2llc19jb3VudCwgZmlsbCA9IG5hbWVzKHNwZWNpZXNfY291bnQpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCkgKw0KICBsYWJzKHRpdGxlID0gInBow6JuIGLhu5EgY+G7p2EgMyBsb8OgaSBob2EiLA0KICAgICAgIGZpbGwgPSAibG/DoGkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KIyBIaeG7g24gdGjhu4sgYmnhu4N1IMSR4buTDQpwcmludChwaWVfY2hhcnQpDQoNCmBgYA0KDQoNCioqR2nhuqMgdGjDrWNoIGJp4buDdSDEkeG7kyAzKioNCg0KLSB0YWJsZShpcmlzJFNwZWNpZXMpIHTDrW5oIHPhu5EgbMaw4bujbmcgaG9hIGPhu6dhIG3hu5dpIGxv4bqhaS4NCg0KLSBnZ3Bsb3QoKSBraOG7n2kgdOG6oW8gYmnhu4N1IMSR4buTIHBpZSBjaGFydC4NCg0KLSBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgdOG6oW8gcmEgYmnhu4N1IMSR4buTIGPhu5l0IHbhu5tpIGNoaeG7gXUgZMOgaSB0xrDGoW5nIOG7qW5nIHbhu5tpIHPhu5EgbMaw4bujbmcgdOG7q25nIGxv4bqhaSBob2EuDQoNCi0gY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApIGNodXnhu4NuIGJp4buDdSDEkeG7kyB0aMOgbmggZOG6oW5nIHBpZSBjaGFydCB24bubaSB0cuG7pWMgc+G7kSBxdWFuaCDEkcaw4budbmcgdHLDsm4uDQoNCi0gdGhlbWVfbWluaW1hbCgpIHRoaeG6v3QgbOG6rXAgZ2lhbyBkaeG7h24gY2hvIGJp4buDdSDEkeG7ky4NCg0KLSBTYXUga2hpIGNo4bqheSBtw6MgbsOgeSwgYuG6oW4gc+G6vSBjw7MgbeG7mXQgYmnhu4N1IMSR4buTIHBpZSBjaGFydCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBob2EgdOG7q25nIGxv4bqhaSBjw7MgdHLhu6VjIHPhu5EgcXVhbmggxJHGsOG7nW5nIHRyw7JuLg0KDQojIyAqKkJJ4buDdSDEkeG7kyA0KioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQojIFThuqFvIGJp4buDdSDEkeG7kyBkZW5zaXR5IHBsb3QNCmRlbnNpdHlfcGxvdCA8LSBnZ3Bsb3QoaXJpcywgYWVzKHggPSBTZXBhbC5MZW5ndGgsIGZpbGwgPSBTcGVjaWVzKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IFBsb3Qgb2YgU2VwYWwgTGVuZ3RoIGJ5IFNwZWNpZXMiLA0KICAgICAgIHggPSAiU2VwYWwgTGVuZ3RoIiwNCiAgICAgICB5ID0gIkRlbnNpdHkiLA0KICAgICAgIGZpbGwgPSAiU3BlY2llcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQojIEhp4buDbiB0aOG7iyBiaeG7g3UgxJHhu5MNCnByaW50KGRlbnNpdHlfcGxvdCkNCg0KYGBgDQoqKkdp4bqjaSB0aMOtY2ggYmnhu4N1IMSR4buTIDQqKg0KDQotIGdncGxvdChpcmlzLCBhZXMoeCA9IFNlcGFsLkxlbmd0aCwgZmlsbCA9IFNwZWNpZXMpKSBraOG7n2kgdOG6oW8gYmnhu4N1IMSR4buTIGRlbnNpdHkgcGxvdCwgduG7m2kgZOG7ryBsaeG7h3UgdOG7qyBkYXRhZnJhbWUgaXJpcywgY2hp4buBdSBkw6BpIGzDoSDEkcOgaSAoU2VwYWwuTGVuZ3RoKSBsw6BtIHRy4bulYyB4IHbDoCBtw6B1IHPhuq9jIHRoZW8gbG/DoGkgaG9hIChTcGVjaWVzKS4NCg0KLSBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpIHRow6ptIGxheWVyIGRlbnNpdHkgcGxvdCB2w6BvIGJp4buDdSDEkeG7kyB24bubaSDEkeG7mSBt4budIChhbHBoYSkgbMOgIDAuNSDEkeG7gyBnaeG6o20gxJHhu5kgdHJvbmcgc3Xhu5F0IGPhu6dhIMSRxrDhu51uZyBkZW5zaXR5Lg0KDQotIGxhYnMoKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgdsOgIG5ow6NuIGNobyBjw6FjIHRy4bulYyB2w6AgYmnhu4N1IMSR4buTLg0KDQotIHRoZW1lX21pbmltYWwoKSB0aGnhur90IGzhuq1wIGdpYW8gZGnhu4duIGNobyBiaeG7g3UgxJHhu5MgbMOgIGdpYW8gZGnhu4duIHThu5FpIGdp4bqjbi4NCg0KLSBTYXUga2hpIGNo4bqheSBtw6MgbsOgeSwgYuG6oW4gc+G6vSBjw7MgbeG7mXQgYmnhu4N1IMSR4buTIGRlbnNpdHkgcGxvdCB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGPhu6dhIGNoaeG7gXUgZMOgaSBsw6EgxJHDoGkgdGhlbyB04burbmcgbG/DoGkgaG9hIGlyaXMuDQoNCg0KIyMgKipCaeG7g3UgxJHhu5MgNSoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFThuqFvIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0NCmhpc3RvZ3JhbV9wbG90IDwtIGdncGxvdChpcmlzLCBhZXMoeCA9IFNlcGFsLldpZHRoLCBmaWxsID0gU3BlY2llcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjUpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gb2YgU2VwYWwgV2lkdGggYnkgU3BlY2llcyIsDQogICAgICAgeCA9ICJTZXBhbCBXaWR0aCIsDQogICAgICAgeSA9ICJGcmVxdWVuY3kiLA0KICAgICAgIGZpbGwgPSAiU3BlY2llcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgSGnhu4NuIHRo4buLIGJp4buDdSDEkeG7kw0KcHJpbnQoaGlzdG9ncmFtX3Bsb3QpDQoNCmBgYA0KDQo=