1. Giới thiệu về bộ dữ liệu Smartphones Sales

1.1 Bộ dữ liệu Smartphones Sales

Bộ dữ liệu bao gồm thông tin về điện thoại thông minh, ghi lại các thuộc tính khác nhau như thương hiệu, màu sắc, bộ nhớ, lưu trữ, đánh giá của người dùng, giá bán, giá gốc và chiết khấu. Nó cung cấp một cái nhìn toàn diện về thị trường điện thoại thông minh, cho phép phân tích các chiến lược định giá, sở thích của người tiêu dùng và xu hướng thị trường. Với thông số kỹ thuật chi tiết và dữ liệu về giá cả, bộ dữ liệu này là một nguồn tài nguyên quý giá cho các nhà bán lẻ, nhà sản xuất và nhà phân tích tìm kiếm thông tin về cảnh quan cạnh tranh và hành vi của người tiêu dùng trong ngành công nghiệp điện thoại thông minh.

  1. Brands: Các thương hiệu điện thoại thông minh được bao gồm trong tập dữ liệu.
  2. Colors: Các màu sắc có sẵn cho các điện thoại thông minh.
  3. Memory: Khả năng lưu trữ của các điện thoại thông thường được đo bằng gigabyte (GB) hoặc megabyte (MB).
  4. Storage: Khả năng lưu trữ nội bộ của các điện thoại thông thường được đo bằng gigabyte (GB) hoặc megabyte (MB).
  5. Rating: Điểm đánh giá hoặc điểm số được gán cho các điện thoại thông minh, phản ánh sự hài lòng hoặc hiệu suất của người dùng.
  6. Selling Price: Giá bán cho người tiêu dùng của các điện thoại thông minh.
  7. Original Price: Giá gốc hoặc giá niêm yết của các điện thoại thông minh trước bất kỳ chiết khấu hoặc khuyến mãi nào.
  8. Mobile: Chỉ ra liệu thiết bị có phải là điện thoại di động hay không.
  9. Discount: Chiết khấu được áp dụng vào giá gốc để tính toán giá bán.
  10. Discount percentage: Tỷ lệ phần trăm chiết khấu được áp dụng vào giá gốc để tính toán giá bán.

1.2 Đọc dữ liệu từ file Excel và gán dữ liệu vào object

library(xlsx) 
## Warning: package 'xlsx' was built under R version 4.3.3
s <- read.xlsx("D:/lamtamnhu/Sales.xlsx", sheetIndex = 1, header = T) 
  • Bộ dữ liệu có cấu trúc bao gồm: 3114 hàng tương ứng với 3114 quan sát và 12 cột tương ứng với 12 biến.
dim(s)
## [1] 3114   12

2. Phân tích bộ dữ liệu

2.1 Biểu đồ 1 - Biểu đồ thể hiện % tỷ lệ hãng điện thoại

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(dplyr)
library(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor

Câu lệnh trên tạo ra một biểu đồ cột thể hiện tỷ lệ phần trăm của các hãng điện thoại. Dựa trên dữ liệu đầu vào d, biểu đồ sẽ có trục x là “Hãng điện thoại” và trục y là “Số lượng”.

Các bước để tạo biểu đồ và phân tích kết quả như sau:

  1. Dữ liệu được nhóm theo “Brands”, tức là các hãng điện thoại được nhóm lại.
  2. Với mỗi nhóm, số lượng phần tử trong nhóm được tính toán bằng hàm n().
  3. Biểu đồ cột được tạo ra bằng geom_col, mỗi cột biểu thị số lượng phần tử của từng nhóm. Màu sắc cột được đặt là màu xanh lá cây.
  4. Tiêu đề của biểu đồ được đặt là “Biểu đồ thể hiện % tỷ lệ hãng điện thoại”.
  5. Giao diện của biểu đồ được thiết lập thành giao diện classic bằng theme_classic().
  6. Với mỗi cột, một nhãn số được thêm vào biểu đồ bằng geom_text. Nhãn số này là phần trăm của số lượng phần tử trong nhóm so với tổng số phần tử của toàn bộ dữ liệu. Màu sắc của nhãn số được đặt là màu đỏ.
  7. Nhãn cho trục x được đặt là “Hãng điện thoại” và nhãn cho trục y được đặt là “Số lượng”.

Kết quả là một biểu đồ cột thể hiện số lượng phần tử và phần trăm của các hãng điện thoại. Nhãn số trên mỗi cột cho biết tỷ lệ phần trăm của số lượng phần tử trong hãng điện thoại đó so với tổng số phần tử của toàn bộ dữ liệu. Màu sắc xanh lá cây của các cột tạo nên sự tương phản và thu hút sự chú ý của người đọc, trong khi nhãn số màu đỏ giúp nhấn mạnh giá trị phần trăm.

library(scales)
s %>% group_by(Brands) %>% summarise(n = n()) %>%
  ggplot(aes(Brands,n)) +
    geom_col(fill='green') +
    labs(title = "Biểu đồ thể hiện % tỷ lệ hãng điện thoại") +
    theme_classic() +
    geom_text(aes(label = percent(n/length(s$Brands))),vjust = 1, color = 'red') +
    labs(x = 'Hãng điện thoại', y = 'Số lượng')

2.2 Biểu đồ 2 - Biểu đồ thể hiện nhóm theo sự hài lòng khách hàng

  • Ta tiến hành phân chia biến Rating thành 5 phần: Không hài lòng, Tạm chấp nhận, Bình thường, Hài lòng, Rất hài lòng.
table(cut(s$Rating,5))
## 
##  (2.3,2.84] (2.84,3.38] (3.38,3.92] (3.92,4.46]    (4.46,5] 
##           7          19         371        1992         581

Dựa vào biểu đồ thể hiện nhóm theo sự hài lòng của khách hàng, chúng ta có thể phân tích kết quả như sau:

  1. Phân bố sự hài lòng: Biểu đồ cho thấy phân bố sự hài lòng của khách hàng được chia thành 5 nhóm: “không hài lòng”, “Tạm chấp nhận”, “Bình thường”, “Hài lòng” và “Rất hài lòng”. Mỗi nhóm được biểu diễn bằng một cột trên biểu đồ. Ngoài ra còn cột “NA” là cột “Không có ý kiến”.

  2. Số lượng khách hàng trong mỗi nhóm: Chiều cao của các cột thể hiện số lượng khách hàng trong mỗi nhóm sự hài lòng. Nhìn vào biểu đồ, chúng ta có thể so sánh số lượng khách hàng giữa các nhóm và nhận ra nhóm có số lượng khách hàng cao nhất là nhóm “Hài lòng”.

  3. Nhận xét về sự hài lòng: Dựa vào biểu đồ, chúng ta có thể đưa ra nhận xét về mức độ sự hài lòng của khách hàng. Nhóm “Hài lòng” có số lượng khách hàng nhiều nhất, chúng ta có thể kết luận rằng hầu hết khách hàng đánh giá sản phẩm hoặc dịch vụ khá cao. Ngoài ra, nhóm “không hài lòng” chiếm tỷ lệ thấp nhất, điều này có thể cho thấy sản phẩm hoặc dịch vụ đáp ứng được sự hài lòng của khách hàng.

s <- s
s1 <- s %>% mutate(HL = cut(Rating,5, label = c('không hài lòng', 'Tạm chấp nhận','Bình thường','Hài lòng','Rất hài lòng')))
s1 %>% group_by(HL) %>% summarise(n = n()) %>%
  ggplot(aes(HL,n)) +
    geom_col(fill='blue') +
    labs(title = " Biểu đồ thể hiện nhóm theo sự hài lòng khách hàng") +
    geom_text(aes(label = n),vjust = 0, color = 'black') +
    labs(x = 'Sự hài lòng', y = 'Số lượng')

2.3 Biểu đồ 3 - Biểu đồ thể hiện số lượng điện thoại được chiết khấu

Câu lệnh trên thêm một cột mới vào dữ liệu d được gọi là “group” dựa trên giá trị của cột “Discount”. Nếu giá trị trong cột “Discount” lớn hơn 0, thì giá trị trong cột “group” sẽ là “Có chiết khấu”, ngược lại, giá trị trong cột “group” sẽ là “Không chiết khấu”.

Sau đó, câu lệnh table(d$group) được sử dụng để tạo một bảng tần số, hiển thị số lượng quan sát trong mỗi nhóm của cột “group”.

Kết quả là một bảng tần số, trong đó các nhóm “Có chiết khấu” và “Không chiết khấu” được hiển thị và số lượng quan sát trong mỗi nhóm được đếm lần lượt là 1193 và 1921.

s$group <- ifelse(s$Discount > 0, "Có chiết khấu", "Không chiết khấu")
table(s$group)
## 
##    Có chiết khấu Không chiết khấu 
##             1193             1921

Dựa vào biểu đồ thể hiện nhóm theo chiết khấu, chúng ta có thể phân tích kết quả như sau:

  1. Phân bố chiết khấu: Biểu đồ cho thấy phân bố các nhóm dựa trên chiết khấu của sản phẩm. Các nhóm được chia thành “Có chiết khấu” và “Không chiết khấu”. Mỗi nhóm được biểu diễn bằng một cột trên biểu đồ.

  2. Số lượng sản phẩm trong mỗi nhóm: Nhóm “Không chiết khấu” có số lượng 1921 nhiều hơn nhóm “Có chiết khấu” là 1193.

  3. Nhận xét về chiết khấu: Dựa vào biểu đồ, chúng ta có thể đưa ra nhận xét về mức độ chiết khấu của sản phẩm. Ta thấy nhóm “Không chiết khấu” chiếm tỷ lệ cao, điều này có thể cho thấy chiết khấu không phổ biến hoặc không ảnh hưởng đáng kể đến số lượng sản phẩm.

s %>% group_by(group) %>% summarise(n = n()) %>%
  ggplot(aes(group,n)) +
    geom_col(fill='gray') +
    geom_text(aes(label = n),vjust = 2, color = 'red') +
    labs(title = " Biểu đồ thể hiện nhóm theo chiết khấu ",x = 'Độ sâu', y = 'Số lượng') 

2.4 Biểu đồ 4 - Biểu đồ thể hiện giá bán của các loại điện thoại

Biểu đồ thể hiện giá bán của điện thoại dựa trên dữ liệu từ tập dữ liệu. Dưới đây là phân tích kết quả của biểu đồ:

  1. Phân bố giá bán: Biểu đồ histogram cho thấy phân bố giá bán của điện thoại. Trục x trên biểu đồ biểu diễn giá bán của điện thoại, trong khi trục y biểu diễn số lượng điện thoại. Mỗi cột trên biểu đồ đại diện cho một khoảng giá bán, và chiều cao của cột thể hiện số lượng điện thoại trong khoảng đó.

  2. Binwidth: Thông qua đoạn mã geom_histogram(binwidth = 5000), binwidth được thiết lập là 5000. Điều này có nghĩa là giá bán của điện thoại được chia thành các khoảng có độ rộng 5000. Số lượng cột trên biểu đồ sẽ phụ thuộc vào khoảng giá và binwidth này.

  3. Màu sắc: Các cột trên biểu đồ được tô màu xanh lam (fill = ‘blue’) và có viền màu đỏ (color = ‘red’), tạo nên sự tương phản trực quan.

  4. Tiêu đề và nhãn trục: Biểu đồ có tiêu đề “Biểu đồ thể hiện giá bán của điện thoại”, trục x được ghi là “Giá bán” và trục y được ghi là “Số lượng”.

Biểu đồ này giúp chúng ta nhìn thấy phân phối giá bán của điện thoại và tập trung giá trong các khoảng giá cụ thể. Chúng ta có thể sử dụng biểu đồ này để hiểu thị trường và cung cầu của điện thoại, nhận biết các khoảng giá phổ biến và đánh giá tập trung giá trong các khoảng đó.

s %>% ggplot(aes(x = Selling.Price)) +
  geom_histogram(binwidth = 5000, fill = 'blue', color = 'red') +
  labs(title = " Biểu đồ thể hiện giá bán của điện thoại ",x = 'Giá bán', y = 'Số lượng') 

2.5 Biểu đồ 5 - Biểu đồ thể hiện mật đồ giá bán của điện thoại

Dưới đây là phân tích kết quả của biểu đồ:

  1. Mật độ giá bán: Biểu đồ mật độ (density plot) thể hiện mật độ phân bố của giá bán điện thoại. Trục x biểu diễn giá bán, trong khi trục y biểu diễn mật độ, hay tỷ lệ giữa số lượng điện thoại và diện tích dưới đường cong.

  2. Màu sắc: Đường cong mật độ được tô màu hồng (“fill = ‘pink’”), tạo nên sự tương phản trực quan.

  3. Tiêu đề và nhãn trục: Biểu đồ có tiêu đề “Biểu đồ thể hiện mật độ giá bán của điện thoại”, trục x được ghi là “Giá bán” và trục y được ghi là “Mật độ”.

Biểu đồ mật độ giúp chúng ta nhìn thấy sự phân bố mật độ của giá bán điện thoại. Đường cong mật độ càng cao tại một giá trị cụ thể, càng cho thấy mật độ lớn hơn của giá bán ở đó. Điều này giúp chúng ta hiểu rõ hơn về mức độ tập trung và biểu diễn phân phối giá bán của điện thoại trong tập dữ liệu.

Lưu ý rằng để phân tích kết quả chi tiết hơn, cần xem xét thông tin cụ thể về dữ liệu và ngữ cảnh của nghiên cứu.

s %>% ggplot(aes(x = Selling.Price)) +
  geom_density(fill = 'pink') +
  labs(title = " Biểu đồ thể hiện mật độ giá bán của điện thoại ",x = 'Giá bán', y = 'Mật độ') 

2.6 Biểu đồ 6 - Biểu đồ thể hiện tỷ lệ có camera của điện thoại

Tạo ra một biểu đồ cột (bar chart) thể hiện số lượng điện thoại có Camera dựa trên dữ liệu từ tập dữ liệu d. Dưới đây là phân tích kết quả của biểu đồ:

  1. Nhóm và tổng hợp dữ liệu: Đầu tiên, dữ liệu được nhóm theo biến Camera bằng cách sử dụng group_by(Camera) và sau đó đếm số lượng điện thoại trong mỗi nhóm bằng cách sử dụng summarise(n = n()). Kết quả là một bảng dữ liệu với hai cột: Camera (biến nhóm) và n (số lượng điện thoại có Camera).

  2. Biểu đồ cột: Dữ liệu sau khi được tổng hợp được sử dụng để tạo biểu đồ cột. Trục x trên biểu đồ biểu diễn các giá trị trong biến Camera, trong khi trục y biểu diễn số lượng điện thoại tương ứng. Mỗi cột trên biểu đồ đại diện cho một giá trị trong biến Camera, và chiều cao của cột thể hiện số lượng điện thoại.

  3. Màu sắc: Các cột trên biểu đồ được tô màu đen (fill='black'), tạo nên sự tương phản trực quan.

  4. Chú thích số lượng: Số lượng điện thoại được hiển thị trên mỗi cột sử dụng geom_text và được đặt nhãn (label = n). Chú thích này có màu đỏ (color = 'red') và được đặt vị trí dọc (vjust = 2) để nằm trên cột tương ứng.

  5. Tiêu đề và nhãn trục: Biểu đồ có tiêu đề “Biểu đồ thể hiện số lượng điện thoại có Camera”, trục x được ghi là “Điện thoại có Camera” và trục y được ghi là “Số lượng”.

Biểu đồ này giúp chúng ta nhìn thấy số lượng điện thoại có Camera trong tập dữ liệu là 3114 và nó chiếm 100% số lượng điện thoại. Vậy có lượng điện thoại không có camera là 0. Suy ra, hiện nay có thể nói đa số điện thoại được sản xuất ra đều có Camera.

s %>% group_by(Camera) %>% summarise(n = n()) %>%
  ggplot(aes(Camera,n)) +
    geom_col(fill='black') +
    geom_text(aes(label = n),vjust = 2, color = 'red') +
    labs(title = " Biểu đồ thể hiện Số lượng điện thoại có Camera ",x = 'Điện thoại có Camera', y = 'Số lượng') 

2.7 Biểu đồ 7 - Biểu đồ thể hiện mật độ chiết khấu của điện thoại dựa trên giá gốc

Chúng ta có một biểu đồ mật độ (density plot) mới dựa trên giá gốc (Original.Price) của dữ liệu. Biểu đồ này cũng được phân chia thành các nhóm sử dụng facet_wrap(~group). Dưới đây là phân tích kết quả của biểu đồ:

  1. Mật độ giá gốc: Biểu đồ mật độ thể hiện mật độ phân bố của giá gốc của điện thoại. Trục x biểu diễn giá gốc, trong khi trục y biểu diễn mật độ, hay tỷ lệ giữa số lượng điện thoại và diện tích dưới đường cong.

  2. Màu sắc: Đường cong mật độ được tô màu xanh lá cây (“fill = ‘green’”), tạo nên sự tương phản trực quan.

  3. Phân nhóm: Biểu đồ được phân chia thành các nhóm bằng facet_wrap(~group). Mỗi nhóm có thể hiển thị trên một panel riêng biệt, giúp so sánh mật độ giá gốc giữa hai nhóm “Có chiết khấu” và “Không chiết khấu”.

Biểu đồ mật độ giúp chúng ta nhìn thấy sự phân bố mật độ của giá gốc trong từng nhóm khác nhau của dữ liệu. Điều này giúp chúng ta so sánh mật độ giá gốc giữa hai nhóm “Có chiết khấu” và “Không chiết khấu” là tương đương nhau.

s %>% ggplot(aes(x = Original.Price)) +
  geom_density(fill = 'green') +
  facet_wrap(~group) +
  labs(title = "Biểu đồ thể hiện mật độ chiết khấu của điện thoại dựa trên giá gốc")

2.8 Biểu đồ 8 - Biểu đồ cột (bar chart) thể hiện số lượng điện thoại theo từng nhãn hiệu (Brands)

Biểu đồ cột (bar chart) thể hiện số lượng điện thoại theo từng nhãn hiệu (Brands) dựa trên dữ liệu từ tập dữ liệu d. Dưới đây là phân tích kết quả của biểu đồ:

  1. Nhóm và tổng hợp dữ liệu: Đầu tiên, dữ liệu được nhóm theo biến Brands bằng cách sử dụng group_by(Brands) và sau đó đếm số lượng điện thoại trong mỗi nhóm bằng cách sử dụng summarise(n = n()). Kết quả là một bảng dữ liệu với hai cột: Brands (nhãn hiệu) và n (số lượng điện thoại của từng nhãn hiệu).

  2. Biểu đồ cột: Dữ liệu sau khi được tổng hợp được sử dụng để tạo biểu đồ cột. Trục x trên biểu đồ biểu diễn các giá trị trong biến Brands, trong khi trục y biểu diễn số lượng điện thoại tương ứng. Mỗi cột trên biểu đồ đại diện cho một nhãn hiệu, và chiều cao của cột thể hiện số lượng điện thoại.

  3. Chú thích số lượng: Số lượng điện thoại được hiển thị trên mỗi cột sử dụng geom_text và được đặt nhãn (label = n). Vị trí của chú thích được đặt bằng position_stack(vjust = 1), giúp chú thích nằm trên cột tương ứng.

s %>% group_by(Brands) %>% summarise(n = n()) %>%
  ggplot(aes(Brands,n)) +
    geom_col() +
    geom_text(aes(label = n),position = position_stack(vjust = 1)) +
   labs(title = "Biểu đồ thể hiện số lượng của điện thoại dựa trên thương hiệu")

  1. Phân phối nhãn hiệu: Biểu đồ cột cho thấy phân phối số lượng điện thoại theo từng nhãn hiệu có sự chênh lệch rõ ràng.

  2. So sánh giữa các nhãn hiệu: Biểu đồ cột giúp chúng ta so sánh số lượng điện thoại giữa các nhãn hiệu. Chúng ta có thể xác định được nhãn hiệu nổi bật với số lượng điện thoại cao hơn so với những nhãn hiệu khác là thương hiệu SAMSUNG với số lượng 719, thấp nhất là thương hiệu IQOO với số lượng là 5.

2.9 Biểu đồ 9 - Biểu đồ histogram thể hiện phân phối giá gốc (Original.Price) của điện thoại từ hai nhãn hiệu ‘Apple’ và ‘SAMSUNG’

Biểu đồ histogram thể hiện phân phối giá gốc (Original.Price) của điện thoại từ hai nhãn hiệu ‘Apple’ và ‘SAMSUNG’ trong tập dữ liệu d. Dưới đây là phân tích kết quả của biểu đồ:

  1. Xác định biến và dữ liệu: Biến x trên trục x của biểu đồ được xác định là giá gốc (Original.Price). Dữ liệu được sử dụng để tạo biểu đồ là tập dữ liệu d.

  2. Biểu đồ histogram: Để hiển thị phân phối giá gốc của điện thoại từ nhãn hiệu ‘Apple’, bạn sử dụng geom_histogram và lọc dữ liệu bằng filter(Brands == 'Apple'). Kết quả là một histogram với các cột biểu thị tần suất của các khoảng giá gốc. Tương tự, bạn tạo một histogram khác cho nhãn hiệu ‘SAMSUNG’.

  3. Cấu hình binwidth và màu sắc: Thông qua đối số binwidth = 2000, bạn chỉ định rằng mỗi khoảng trên biểu đồ histogram có chiều rộng là 2000. Điều này ảnh hưởng đến số lượng và kích thước của các cột trên biểu đồ. Bạn sử dụng fill để thiết lập màu sắc của các cột, ví dụ: ‘red’ cho ‘Apple’ và ‘lightgreen’ cho ‘SAMSUNG’.

s %>% ggplot(aes(x = Original.Price)) +
  geom_histogram(data = s %>% filter(Brands == 'Apple'), binwidth = 2000, fill = 'red') +
  geom_histogram(data = s %>% filter(Brands == 'SAMSUNG'), binwidth = 2000, fill = 'lightgreen') +
  labs(title = "Biểu đồ histogram thể hiện phân phối giá gốc của điện thoại")

2.10 Biểu đồ 10 - Biểu đồ cột đồng tâm thể hiện số lượng điện thoại từng nhãn hiệu từ bộ dữ liệu

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ cột đồng tâm thể hiện số lượng điện thoại từng nhãn hiệu từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Nhóm dữ liệu: Câu lệnh sử dụng hàm group_by() để nhóm dữ liệu theo nhãn hiệu (Brands).
  2. Tính tổng số lượng: Hàm summarise() được sử dụng để tính số lượng (n) cho mỗi nhãn hiệu.
  3. Vẽ biểu đồ cột đồng tâm: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (rỗng) và giá trị y (số lượng) của từng nhãn hiệu, và sử dụng màu sắc khác nhau cho từng nhãn hiệu (fill = Brands).
  4. Hàm geom_col() được sử dụng để vẽ các cột.
  5. Hàm coord_polar('y') được sử dụng để chuyển đổi biểu đồ sang dạng đồng tâm.
  6. Hàm geom_text() được sử dụng để thêm chú thích số liệu lên các cột. Thông qua tham số label = n, chú thích sẽ hiển thị giá trị số lượng (n), và thông qua tham số position_stack(vjust = .5), chú thích được căn chỉnh theo chiều dọc.
  7. Hàm theme_void() được sử dụng để loại bỏ nền và các thành phần trang trí khác của biểu đồ.

Kết quả là một biểu đồ cột đồng tâm, trong đó mỗi cột biểu thị số lượng điện thoại từng nhãn hiệu. Các cột được sắp xếp xung quanh một trục tròn và có thể so sánh sự khác biệt về số lượng giữa các nhãn hiệu.

s %>% group_by(Brands) %>% summarise(n = n()) %>%
  ggplot(aes(x ='', y = n,fill = Brands)) +
    geom_col(color = 'black') +
    coord_polar('y') +
    geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = .5)) +
    theme_void()

Số lượng điện thoại theo nhãn hiệu: Chúng ta có thể xác định được nhãn hiệu nổi bật với số lượng điện thoại cao hơn so với những nhãn hiệu khác là thương hiệu SAMSUNG với số lượng 719, thấp nhất là thương hiệu IQOO với số lượng là 5.

2.11 Biểu đồ 11 - Biểu đồ cột đồng tâm thể hiện số lượng điện thoại SAMSUNG theo chiết khấu

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ cột đồng tâm thể hiện số lượng điện thoại Samsung theo từng nhóm từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Sau đây là phân tích kết quả của câu lệnh:

  1. Lọc dữ liệu: Câu lệnh filter(Brands == 'SAMSUNG') sử dụng hàm filter() để chỉ lấy dữ liệu của điện thoại Samsung (Brands == 'SAMSUNG'), và gán kết quả cho biến s2.
  2. Nhóm dữ liệu: Câu lệnh group_by(group) sử dụng hàm group_by() để nhóm dữ liệu theo nhóm (group).
  3. Tính tổng số lượng: Hàm summarise() được sử dụng để tính số lượng (n) cho mỗi nhóm.
  4. Vẽ biểu đồ cột đồng tâm: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (rỗng) và giá trị y (số lượng) của từng nhóm, và sử dụng màu sắc khác nhau cho từng nhóm (fill = group).
  5. Hàm geom_col() được sử dụng để vẽ các cột. Tham số width = 1 được sử dụng để đặt chiều rộng của các cột.
  6. Hàm coord_polar('y') được sử dụng để chuyển đổi biểu đồ sang dạng đồng tâm.
  7. Hàm geom_text() được sử dụng để thêm chú thích số liệu lên các cột. Thông qua tham số label = n, chú thích sẽ hiển thị giá trị số lượng (n), và thông qua tham số position_stack(vjust = .5), chú thích được căn chỉnh theo chiều dọc.
  8. Hàm theme_void() được sử dụng để loại bỏ nền và các thành phần trang trí khác của biểu đồ.

Kết quả là một biểu đồ cột đồng tâm, trong đó mỗi cột biểu thị số lượng điện thoại Samsung theo từng nhóm. Các cột được sắp xếp xung quanh một trục tròn và có thể so sánh sự khác biệt về số lượng giữa các nhóm.

s2 <- s %>% filter(Brands == 'SAMSUNG' )
s2 %>% group_by(group) %>% summarise(n = n()) %>%
  ggplot(aes(x = '', y = n,fill = group)) +
    geom_col(color = 'black', width = 1) +
    coord_polar('y') +
    geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = .5)) +
    theme_void()

2.12 Biểu đồ 12 - Biểu đồ điểm thể hiện mối quan hệ giữa giá bán khách hàng và giá niêm yết

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ điểm thể hiện mối quan hệ giữa giá bán khách hàng và giá niêm yết của điện thoại từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Vẽ biểu đồ điểm: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (giá bán khách hàng) và giá trị y (giá niêm yết) của từng điểm.
  2. Hàm geom_point() được sử dụng để vẽ các điểm trên biểu đồ, biểu thị mỗi điểm dữ liệu.
  3. Hàm xlab()ylab() được sử dụng để đặt nhãn cho trục x và trục y tương ứng, giúp diễn giải ý nghĩa của các trục.

Kết quả là một biểu đồ điểm, trong đó mỗi điểm biểu thị mối quan hệ giữa giá bán khách hàng (trục x) và giá niêm yết (trục y) của từng điện thoại. Biểu đồ này giúp hiển thị phân phối và mối liên hệ giữa hai biến giá trị.

s %>% ggplot(aes(x = Selling.Price, y = Original.Price)) +
  geom_point() +
  xlab('Giá bán khách hàng') + 
  ylab('Giá niêm yết')

2.13 Biểu đồ 13 - Biểu đồ điểm thể hiện mối quan hệ giữa khả năng lưu trữ thông thường và khả năng lưu trữ nội bộ của điện thoại

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ điểm thể hiện mối quan hệ giữa khả năng lưu trữ thông thường và khả năng lưu trữ nội bộ của điện thoại từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Vẽ biểu đồ điểm: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (khả năng lưu trữ thông thường) và giá trị y (khả năng lưu trữ nội bộ) của từng điểm.
  2. Hàm geom_point() được sử dụng để vẽ các điểm trên biểu đồ, biểu thị mỗi điểm dữ liệu. Tham số color = 'lightblue' được sử dụng để đặt màu sắc của các điểm là màu xanh nhạt.
  3. Hàm geom_smooth() được sử dụng để vẽ đường hồi quy tuyến tính dựa trên dữ liệu. Tham số method = 'lm' chỉ định sử dụng phương pháp hồi quy tuyến tính, và color = 'green' đặt màu sắc của đường hồi quy là màu xanh lá cây.
  4. Hàm xlab()ylab() được sử dụng để đặt nhãn cho trục x và trục y tương ứng, giúp diễn giải ý nghĩa của các trục.

Kết quả là một biểu đồ điểm, trong đó mỗi điểm biểu thị mối quan hệ giữa khả năng lưu trữ thông thường (trục x) và khả năng lưu trữ nội bộ (trục y) của từng điện thoại. Các điểm được hiển thị với màu sắc xanh nhạt, và đường hồi quy tuyến tính được vẽ để biểu thị xu hướng tổng quát của dữ liệu. Biểu đồ này giúp phân tích mối liên hệ giữa hai biến khả năng lưu trữ và xác định xu hướng chung.

s %>% ggplot(aes(x = Memory, y = Storage)) +
  geom_point(color ='lightblue') +
  geom_smooth(method = 'lm', color = 'green') +
  xlab('Khả năng lưu trữ thông thường') + 
  ylab('Khả năng lưu trữ nội bộ')
## `geom_smooth()` using formula = 'y ~ x'

2.14 Biểu đồ 14 - Biểu đồ histogram thể hiện phân bố giá bán khách hàng của điện thoại theo khả năng lưu trữ

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ histogram thể hiện phân bố giá bán khách hàng của điện thoại theo khả năng lưu trữ từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Vẽ biểu đồ histogram: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (giá bán khách hàng) và sử dụng màu sắc khác nhau cho từng khoảng giá dựa trên khả năng lưu trữ (fill = Memory).
  2. Hàm geom_histogram() được sử dụng để vẽ histogram. Tham số binwidth = 6000 xác định độ rộng của các khoảng giá, trong trường hợp này là 6000.

Kết quả là một biểu đồ histogram, trong đó trục x biểu thị giá bán khách hàng và trục y biểu thị số lượng điện thoại trong từng khoảng giá. Các khoảng giá có màu sắc khác nhau dựa trên khả năng lưu trữ của điện thoại. Biểu đồ này giúp phân tích phân phối giá bán khách hàng và mối liên hệ với khả năng lưu trữ.

s %>% ggplot(aes(x = Selling.Price, fill = Memory)) +
 geom_histogram(binwidth = 6000)

2.15 Biểu đồ 15 - Biểu đồ mật độ (density plot) thể hiện phân phối giá bán của các điện thoại từ hai thương hiệu SAMSUNG và OPPO

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ mật độ (density plot) thể hiện phân phối giá bán của các điện thoại từ hai thương hiệu SAMSUNG và OPPO từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Lọc dữ liệu: Hàm filter() được sử dụng để lọc các dòng dữ liệu chỉ từ thương hiệu SAMSUNG hoặc OPPO (Brands == 'SAMSUNG' | Brands == 'OPPO').
  2. Vẽ biểu đồ mật độ: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (giá bán) và sử dụng màu sắc khác nhau cho từng thương hiệu (fill = Brands).
  3. Hàm geom_density() được sử dụng để vẽ biểu đồ mật độ dựa trên dữ liệu. Biểu đồ mật độ thể hiện phân phối xác suất của giá bán cho từng thương hiệu.
  4. Hàm labs() được sử dụng để đặt tiêu đề cho biểu đồ (title = "Biểu đồ thể hiện giá bán của SAMSUNG và OPPO") và nhãn cho trục x và trục y (x = 'Giá bán', y = 'Tỷ trọng').

Kết quả là một biểu đồ mật độ, trong đó trục x biểu thị giá bán và trục y biểu thị tỷ trọng (xác suất) của giá bán. Các đường mật độ khác nhau tương ứng với hai thương hiệu SAMSUNG và OPPO. Biểu đồ này giúp so sánh phân phối giá bán giữa hai thương hiệu và phân tích sự khác biệt trong giá cả.

s %>% filter(Brands== 'SAMSUNG' | Brands== 'OPPO') %>%
  ggplot(aes(x=Selling.Price, fill = Brands)) +
  geom_density() +
  labs(title = "Biểu đồ thể hiện giá bán của SAMSUNG và OPPO") +
  labs(x = 'Giá bán', y = 'Tỷ trọng')

2.16 Biểu đồ 16 - Biểu đồ tần số (frequency plot) thể hiện số lần xuất hiện của các mức giá gốc của các điện thoại từ hai thương hiệu Apple và OPPO

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ tần số (frequency plot) thể hiện số lần xuất hiện của các mức giá gốc của các điện thoại từ hai thương hiệu Apple và OPPO từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Lọc dữ liệu: Hàm filter() được sử dụng để lọc các dòng dữ liệu chỉ từ thương hiệu Apple hoặc OPPO (Brands == 'Apple' | Brands == 'OPPO').

  2. Vẽ biểu đồ tần số: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (giá gốc) và sử dụng màu sắc khác nhau cho từng thương hiệu (color = Brands).

  3. Hàm geom_freqpoly() được sử dụng để vẽ đường tần số dựa trên dữ liệu. Đường tần số thể hiện số lần xuất hiện của từng mức giá gốc.

  4. Hàm `labs()` được sử dụng để đặt tiêu đề cho biểu đồ (`title = “Biểu đồ tần số giá gốc của Apple và OPPO”`) và nhãn cho trục x và trục y (`x = ‘Giá gốc’, y = ‘Tần số xuất hiện’`).

Kết quả là một biểu đồ tần số, trong đó trục x biểu thị giá gốc và trục y biểu thị số lần xuất hiện của mỗi mức giá. Các đường tần số khác nhau tương ứng với hai thương hiệu Apple và OPPO. Biểu đồ này giúp phân tích phân phối giá gốc của các điện thoại từ hai thương hiệu và so sánh tần số xuất hiện giữa chúng.
s %>% filter(Brands== 'Apple' | Brands== 'OPPO') %>%
  ggplot(aes(x=Original.Price, color=Brands)) + 
  geom_freqpoly(linewidth = 1) +
  labs(title = "Biểu đồ tần số giá gốc của Apple và OPPO") +
  labs(x = 'Giá gốc', y = 'Tần số xuất hiện')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

2.17 Biểu đồ 17 - Biểu đồ cột (column chart) thể hiện số lượng điện thoại của hai thương hiệu vivo và realme

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ cột (column chart) thể hiện số lượng điện thoại của hai thương hiệu vivo và realme từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Vẽ biểu đồ cột: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định trục x (hãng điện thoại) và không có thông tin y (y = '').
  2. Hàm geom_col() được sử dụng để vẽ các cột thể hiện số lượng điện thoại. Cụ thể, hai lệnh geom_col() được sử dụng, mỗi lệnh tương ứng với một thương hiệu. Biểu đồ sử dụng dữ liệu đã được lọc thông qua hàm filter() để chỉ hiển thị số lượng điện thoại của vivo và realme. Tham số fill được sử dụng để định nghĩa màu sắc cho cột của từng thương hiệu.
  3. Hàm labs() được sử dụng để đặt tiêu đề cho biểu đồ (title = "Biểu đồ thể hiện số lượng điện thoại của vivo và realme") và nhãn cho trục x và trục y (x = 'Hãng điện thoại', y = 'Số lượng').

Kết quả là một biểu đồ cột, trong đó trục x biểu thị các thương hiệu điện thoại và trục y biểu thị số lượng điện thoại tương ứng. Cột màu đỏ tương ứng với thương hiệu vivo và cột màu vàng tương ứng với thương hiệu realme. Biểu đồ này giúp so sánh số lượng điện thoại giữa hai thương hiệu và phân tích sự khác biệt trong số lượng.

s %>% ggplot(aes(x= Brands, y= '')) +
  geom_col(data = s %>% filter(Brands == 'vivo'), fill = 'red') +
  geom_col(data = s %>% filter(Brands == 'realme'), fill = 'yellow') +
  labs(title = " Biểu đồ thể hiện số lượng điện thoại của vivo và realme") +
  labs(x = 'Hãng điện thoại', y = 'Số lượng')

2.18 Biểu đồ 18 - Biểu đồ điểm (scatter plot) thể hiện số lượng điện thoại của mỗi hãng với điểm số Rating lớn hơn 4

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ điểm (scatter plot) thể hiện số lượng điện thoại của mỗi hãng với điểm số Rating lớn hơn 4 từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Lọc dữ liệu: Hàm filter() được sử dụng để lọc các dòng dữ liệu chỉ có Rating lớn hơn 4 (Rating > 4).
  2. Vẽ biểu đồ điểm: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định trục x (hãng) và trục y (Rating).
  3. Hàm geom_point() được sử dụng để vẽ các điểm trên biểu đồ, mỗi điểm tương ứng với một hãng điện thoại. Các điểm được màu đỏ (color = 'red').
  4. Hàm labs() được sử dụng để đặt tiêu đề cho biểu đồ (title = "Biểu đồ số lượng điện thoại của hãng Rating trên 4") và nhãn cho trục x (x = 'Hãng') và trục y (y = 'Rating').

Kết quả là một biểu đồ điểm, trong đó trục x biểu thị các hãng điện thoại và trục y biểu thị điểm số Rating tương ứng. Mỗi điểm trên biểu đồ tương ứng với một hãng điện thoại và màu đỏ. Biểu đồ này giúp hiển thị số lượng điện thoại của mỗi hãng có Rating lớn hơn 4 và phân tích mức độ đánh giá của từng hãng.

s %>% filter(Rating>4) %>%
  ggplot(aes(x=Brands, y=Rating)) +
  geom_point(color = 'red') +
  labs(title = "Biểu đồ số lượng điện thoại của hãng Rating trên 4") +
  labs(x = 'Hãng', 'Rating')

2.19 Biểu đồ 19 - Biểu đồ tần số (frequency plot) thể hiện số lần xuất hiện của các mức giá gốc của các điện thoại có màu đen và trắng

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ tần số (frequency plot) thể hiện số lần xuất hiện của các mức giá gốc của các điện thoại có màu đen và trắng từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Lọc dữ liệu: Hàm filter() được sử dụng để lọc các dòng dữ liệu chỉ từ các điện thoại có màu đen hoặc trắng (Colors == 'White' | Colors == 'Black').
  2. Vẽ biểu đồ tần số: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (giá gốc) và sử dụng màu sắc khác nhau cho từng màu (color = Colors).
  3. Hàm geom_freqpoly() được sử dụng để vẽ đường tần số dựa trên dữ liệu. Đường tần số thể hiện số lần xuất hiện của từng mức giá gốc.
  4. Hàm labs() được sử dụng để đặt tiêu đề cho biểu đồ (title = "Biểu đồ tần số giá gốc theo màu đen và trắng") và nhãn cho trục x và trục y (x = 'Giá gốc', y = 'Tần số xuất hiện').

Kết quả là một biểu đồ tần số, trong đó trục x biểu thị giá gốc và trục y biểu thị số lần xuất hiện của mỗi mức giá. Các đường tần số khác nhau tương ứng với hai màu đen và trắng. Biểu đồ này giúp phân tích phân phối giá gốc của các điện thoại có màu đen và trắng và so sánh tần số xuất hiện giữa chúng.

s %>% filter(Colors== 'White' | Colors== 'Black') %>%
  ggplot(aes(x=Original.Price, color=Colors)) + 
  geom_freqpoly(linewidth = 1) +
  labs(title = "Biểu đồ tần số giá gốc theo màu đen và trắng") +
  labs(x = 'Giá gốc', y = 'Tần số xuất hiện')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

2.20 Biểu đồ 20 - Biểu đồ tần số (frequency plot) thể hiện số lần xuất hiện của các mức đánh giá sự hài lòng của các điện thoại có bộ nhớ RAM là 8 GB và 6 GB

Câu lệnh trên sử dụng ống dẫn (%>%) và gói ggplot2 để vẽ một biểu đồ tần số (frequency plot) thể hiện số lần xuất hiện của các mức đánh giá sự hài lòng của các điện thoại có bộ nhớ RAM là 8 GB và 6 GB từ bộ dữ liệu “Smartphones Sales” trong R Markdown. Dưới đây là phân tích kết quả của câu lệnh:

  1. Lọc dữ liệu: Hàm filter() được sử dụng để lọc các dòng dữ liệu chỉ từ các điện thoại có bộ nhớ RAM là 8 GB hoặc 6 GB (Memory == '8 GB' | Memory == '6 GB').
  2. Vẽ biểu đồ tần số: Hàm ggplot() được sử dụng để tạo một khung biểu đồ. Thông qua tham số aes(), biểu đồ chỉ định giá trị x (đánh giá sự hài lòng) và sử dụng màu sắc khác nhau cho từng bộ nhớ RAM (color = Memory).
  3. Hàm geom_freqpoly() được sử dụng để vẽ đường tần số dựa trên dữ liệu. Đường tần số thể hiện số lần xuất hiện của từng mức đánh giá sự hài lòng.
  4. Hàm labs() được sử dụng để đặt tiêu đề cho biểu đồ (title = "Biểu đồ tần số giá gốc theo màu đen và trắng") và nhãn cho trục x và trục y (x = 'Sự hài lòng', y = 'Tần số xuất hiện').

Kết quả là một biểu đồ tần số, trong đó trục x biểu thị đánh giá sự hài lòng và trục y biểu thị số lần xuất hiện của mỗi mức đánh giá. Các đường tần số khác nhau tương ứng với hai bộ nhớ RAM là 8 GB và 6 GB. Biểu đồ này giúp phân tích phân phối đánh giá sự hài lòng của các điện thoại có bộ nhớ RAM khác nhau và so sánh tần số xuất hiện giữa chúng.

s %>% filter(Memory== '8 GB' | Memory== '6 GB') %>%
  ggplot(aes(x=Rating, color=Memory)) + 
  geom_freqpoly(linewidth = 1) +
  labs(title = "Biểu đồ tần số giá gốc theo màu đen và trắng") +
  labs(x = 'Sự hài lòng', y = 'Tần số xuất hiện')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 62 rows containing non-finite outside the scale range
## (`stat_bin()`).

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTMOibSBUw6JtIE5oxrAiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyAqKjEuIEdp4bubaSB0aGnhu4d1IHbhu4EgYuG7mSBk4buvIGxp4buHdSBTbWFydHBob25lcyBTYWxlcyoqDQoNCiMjICoqMS4xIELhu5kgZOG7ryBsaeG7h3UgU21hcnRwaG9uZXMgU2FsZXMqKg0KDQpC4buZIGThu68gbGnhu4d1IGJhbyBn4buTbSB0aMO0bmcgdGluIHbhu4EgxJFp4buHbiB0aG/huqFpIHRow7RuZyBtaW5oLCBnaGkgbOG6oWkgKmPDoWMgdGh14buZYyB0w61uaCBraMOhYyBuaGF1KiBuaMawICoqKnRoxrDGoW5nIGhp4buHdSwgbcOgdSBz4bqvYywgYuG7mSBuaOG7mywgbMawdSB0cuG7rywgxJHDoW5oIGdpw6EgY+G7p2EgbmfGsOG7nWkgZMO5bmcsIGdpw6EgYsOhbiwgZ2nDoSBn4buRYyB2w6AgY2hp4bq/dCBraOG6pXUqKiouIE7DsyBjdW5nIGPhuqVwIG3hu5l0IGPDoWkgbmjDrG4gdG/DoG4gZGnhu4duIHbhu4EgdGjhu4sgdHLGsOG7nW5nIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaCwgY2hvIHBow6lwIHBow6JuIHTDrWNoIGPDoWMgY2hp4bq/biBsxrDhu6NjIMSR4buLbmggZ2nDoSwgc+G7nyB0aMOtY2ggY+G7p2EgbmfGsOG7nWkgdGnDqnUgZMO5bmcgdsOgIHh1IGjGsOG7m25nIHRo4buLIHRyxrDhu51uZy4gVuG7m2kgdGjDtG5nIHPhu5Ega+G7uSB0aHXhuq10IGNoaSB0aeG6v3QgdsOgIGThu68gbGnhu4d1IHbhu4EgZ2nDoSBj4bqjLCBi4buZIGThu68gbGnhu4d1IG7DoHkgbMOgIG3hu5l0IG5ndeG7k24gdMOgaSBuZ3V5w6puIHF1w70gZ2nDoSBjaG8gY8OhYyBuaMOgIGLDoW4gbOG6uywgbmjDoCBz4bqjbiB4deG6pXQgdsOgIG5ow6AgcGjDom4gdMOtY2ggdMOsbSBraeG6v20gdGjDtG5nIHRpbiB24buBIGPhuqNuaCBxdWFuIGPhuqFuaCB0cmFuaCB2w6AgaMOgbmggdmkgY+G7p2EgbmfGsOG7nWkgdGnDqnUgZMO5bmcgdHJvbmcgbmfDoG5oIGPDtG5nIG5naGnhu4dwIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaC4NCg0KMS4gICoqQnJhbmRzOioqIEPDoWMgdGjGsMahbmcgaGnhu4d1IMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaCDEkcaw4bujYyBiYW8gZ+G7k20gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UuDQoyLiAgKipDb2xvcnM6KiogQ8OhYyBtw6B1IHPhuq9jIGPDsyBz4bq1biBjaG8gY8OhYyDEkWnhu4duIHRob+G6oWkgdGjDtG5nIG1pbmguDQozLiAgKipNZW1vcnk6KiogS2jhuqMgbsSDbmcgbMawdSB0cuG7ryBj4bunYSBjw6FjIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgdGjGsOG7nW5nIMSRxrDhu6NjIMSRbyBi4bqxbmcgZ2lnYWJ5dGUgKEdCKSBob+G6t2MgbWVnYWJ5dGUgKE1CKS4NCjQuICAqKlN0b3JhZ2U6KiogS2jhuqMgbsSDbmcgbMawdSB0cuG7ryBu4buZaSBi4buZIGPhu6dhIGPDoWMgxJFp4buHbiB0aG/huqFpIHRow7RuZyB0aMaw4budbmcgxJHGsOG7o2MgxJFvIGLhurFuZyBnaWdhYnl0ZSAoR0IpIGhv4bq3YyBtZWdhYnl0ZSAoTUIpLg0KNS4gICoqUmF0aW5nOioqIMSQaeG7g20gxJHDoW5oIGdpw6EgaG/hurdjIMSRaeG7g20gc+G7kSDEkcaw4bujYyBnw6FuIGNobyBjw6FjIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaCwgcGjhuqNuIMOhbmggc+G7sSBow6BpIGzDsm5nIGhv4bq3YyBoaeG7h3Ugc3XhuqV0IGPhu6dhIG5nxrDhu51pIGTDuW5nLg0KNi4gICoqU2VsbGluZyBQcmljZToqKiBHacOhIGLDoW4gY2hvIG5nxrDhu51pIHRpw6p1IGTDuW5nIGPhu6dhIGPDoWMgxJFp4buHbiB0aG/huqFpIHRow7RuZyBtaW5oLg0KNy4gICoqT3JpZ2luYWwgUHJpY2U6KiogR2nDoSBn4buRYyBob+G6t2MgZ2nDoSBuacOqbSB54bq/dCBj4bunYSBjw6FjIMSRaeG7h24gdGhv4bqhaSB0aMO0bmcgbWluaCB0csaw4bubYyBi4bqldCBr4buzIGNoaeG6v3Qga2jhuqV1IGhv4bq3YyBraHV54bq/biBtw6NpIG7DoG8uDQo4LiAgKipNb2JpbGU6KiogQ2jhu4kgcmEgbGnhu4d1IHRoaeG6v3QgYuG7iyBjw7MgcGjhuqNpIGzDoCDEkWnhu4duIHRob+G6oWkgZGkgxJHhu5luZyBoYXkga2jDtG5nLg0KOS4gICoqRGlzY291bnQ6KiogQ2hp4bq/dCBraOG6pXUgxJHGsOG7o2Mgw6FwIGThu6VuZyB2w6BvIGdpw6EgZ+G7kWMgxJHhu4MgdMOtbmggdG/DoW4gZ2nDoSBiw6FuLg0KMTAuICoqRGlzY291bnQgcGVyY2VudGFnZToqKiBU4bu3IGzhu4cgcGjhuqduIHRyxINtIGNoaeG6v3Qga2jhuqV1IMSRxrDhu6NjIMOhcCBk4bulbmcgdsOgbyBnacOhIGfhu5FjIMSR4buDIHTDrW5oIHRvw6FuIGdpw6EgYsOhbi4NCg0KIyMgKioxLjIgxJDhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBFeGNlbCB2w6AgZ8OhbiBk4buvIGxp4buHdSB2w6BvIG9iamVjdCoqDQoNCmBgYHtyfQ0KbGlicmFyeSh4bHN4KSANCnMgPC0gcmVhZC54bHN4KCJEOi9sYW10YW1uaHUvU2FsZXMueGxzeCIsIHNoZWV0SW5kZXggPSAxLCBoZWFkZXIgPSBUKSANCmBgYA0KDQotICAgQuG7mSBk4buvIGxp4buHdSBjw7MgY+G6pXUgdHLDumMgYmFvIGfhu5NtOiAzMTE0IGjDoG5nIHTGsMahbmcg4bupbmcgduG7m2kgMzExNCBxdWFuIHPDoXQgdsOgIDEyIGPhu5l0IHTGsMahbmcg4bupbmcgduG7m2kgMTIgYmnhur9uLg0KDQpgYGB7cn0NCmRpbShzKQ0KYGBgDQoNCiMgKioyLiBQaMOibiB0w61jaCBi4buZIGThu68gbGnhu4d1KioNCg0KIyMgKioyLjEgQmnhu4N1IMSR4buTIDEgLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duICUgdOG7tyBs4buHIGjDo25nIMSRaeG7h24gdGhv4bqhaSoqDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzY2FsZXMpDQpgYGANCg0KQ8OidSBs4buHbmggdHLDqm4gdOG6oW8gcmEgbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiB04bu3IGzhu4cgcGjhuqduIHRyxINtIGPhu6dhIGPDoWMgaMOjbmcgxJFp4buHbiB0aG/huqFpLiBE4buxYSB0csOqbiBk4buvIGxp4buHdSDEkeG6p3UgdsOgbyBgZGAsIGJp4buDdSDEkeG7kyBz4bq9IGPDsyB0cuG7pWMgeCBsw6AgIkjDo25nIMSRaeG7h24gdGhv4bqhaSIgdsOgIHRy4bulYyB5IGzDoCAiU+G7kSBsxrDhu6NuZyIuDQoNCkPDoWMgYsaw4bubYyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgdsOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQoxLiAgROG7ryBsaeG7h3UgxJHGsOG7o2MgbmjDs20gdGhlbyAiQnJhbmRzIiwgdOG7qWMgbMOgIGPDoWMgaMOjbmcgxJFp4buHbiB0aG/huqFpIMSRxrDhu6NjIG5ow7NtIGzhuqFpLg0KMi4gIFbhu5tpIG3hu5dpIG5ow7NtLCBz4buRIGzGsOG7o25nIHBo4bqnbiB04butIHRyb25nIG5ow7NtIMSRxrDhu6NjIHTDrW5oIHRvw6FuIGLhurFuZyBow6BtIGBuKClgLg0KMy4gIEJp4buDdSDEkeG7kyBj4buZdCDEkcaw4bujYyB04bqhbyByYSBi4bqxbmcgYGdlb21fY29sYCwgbeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcgcGjhuqduIHThu60gY+G7p2EgdOG7q25nIG5ow7NtLiBNw6B1IHPhuq9jIGPhu5l0IMSRxrDhu6NjIMSR4bq3dCBsw6AgbcOgdSB4YW5oIGzDoSBjw6J5Lg0KNC4gIFRpw6p1IMSR4buBIGPhu6dhIGJp4buDdSDEkeG7kyDEkcaw4bujYyDEkeG6t3QgbMOgICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duICUgdOG7tyBs4buHIGjDo25nIMSRaeG7h24gdGhv4bqhaSIuDQo1LiAgR2lhbyBkaeG7h24gY+G7p2EgYmnhu4N1IMSR4buTIMSRxrDhu6NjIHRoaeG6v3QgbOG6rXAgdGjDoG5oIGdpYW8gZGnhu4duIGNsYXNzaWMgYuG6sW5nIGB0aGVtZV9jbGFzc2ljKClgLg0KNi4gIFbhu5tpIG3hu5dpIGPhu5l0LCBt4buZdCBuaMOjbiBz4buRIMSRxrDhu6NjIHRow6ptIHbDoG8gYmnhu4N1IMSR4buTIGLhurFuZyBgZ2VvbV90ZXh0YC4gTmjDo24gc+G7kSBuw6B5IGzDoCBwaOG6p24gdHLEg20gY+G7p2Egc+G7kSBsxrDhu6NuZyBwaOG6p24gdOG7rSB0cm9uZyBuaMOzbSBzbyB24bubaSB04buVbmcgc+G7kSBwaOG6p24gdOG7rSBj4bunYSB0b8OgbiBi4buZIGThu68gbGnhu4d1LiBNw6B1IHPhuq9jIGPhu6dhIG5ow6NuIHPhu5EgxJHGsOG7o2MgxJHhurd0IGzDoCBtw6B1IMSR4buPLg0KNy4gIE5ow6NuIGNobyB0cuG7pWMgeCDEkcaw4bujYyDEkeG6t3QgbMOgICJIw6NuZyDEkWnhu4duIHRob+G6oWkiIHbDoCBuaMOjbiBjaG8gdHLhu6VjIHkgxJHGsOG7o2MgxJHhurd0IGzDoCAiU+G7kSBsxrDhu6NuZyIuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgcGjhuqduIHThu60gdsOgIHBo4bqnbiB0csSDbSBj4bunYSBjw6FjIGjDo25nIMSRaeG7h24gdGhv4bqhaS4gTmjDo24gc+G7kSB0csOqbiBt4buXaSBj4buZdCBjaG8gYmnhur90IHThu7cgbOG7hyBwaOG6p24gdHLEg20gY+G7p2Egc+G7kSBsxrDhu6NuZyBwaOG6p24gdOG7rSB0cm9uZyBow6NuZyDEkWnhu4duIHRob+G6oWkgxJHDsyBzbyB24bubaSB04buVbmcgc+G7kSBwaOG6p24gdOG7rSBj4bunYSB0b8OgbiBi4buZIGThu68gbGnhu4d1LiBNw6B1IHPhuq9jIHhhbmggbMOhIGPDonkgY+G7p2EgY8OhYyBj4buZdCB04bqhbyBuw6puIHPhu7EgdMawxqFuZyBwaOG6o24gdsOgIHRodSBow7p0IHPhu7EgY2jDuiDDvSBj4bunYSBuZ8aw4budaSDEkeG7jWMsIHRyb25nIGtoaSBuaMOjbiBz4buRIG3DoHUgxJHhu48gZ2nDunAgbmjhuqVuIG3huqFuaCBnacOhIHRy4buLIHBo4bqnbiB0csSDbS4NCg0KYGBge3J9DQpsaWJyYXJ5KHNjYWxlcykNCnMgJT4lIGdyb3VwX2J5KEJyYW5kcykgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhCcmFuZHMsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsNCiAgICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gJSB04bu3IGzhu4cgaMOjbmcgxJFp4buHbiB0aG/huqFpIikgKw0KICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQobi9sZW5ndGgocyRCcmFuZHMpKSksdmp1c3QgPSAxLCBjb2xvciA9ICdyZWQnKSArDQogICAgbGFicyh4ID0gJ0jDo25nIMSRaeG7h24gdGhv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KIyMgKioyLjIgQmnhu4N1IMSR4buTIDIgLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gc+G7sSBow6BpIGzDsm5nIGtow6FjaCBow6BuZyoqDQoNCi0gICBUYSB0aeG6v24gaMOgbmggcGjDom4gY2hpYSBiaeG6v24gUmF0aW5nIHRow6BuaCA1IHBo4bqnbjogS2jDtG5nIGjDoGkgbMOybmcsIFThuqFtIGNo4bqlcCBuaOG6rW4sIELDrG5oIHRoxrDhu51uZywgSMOgaSBsw7JuZywgUuG6pXQgaMOgaSBsw7JuZy4NCg0KYGBge3J9DQp0YWJsZShjdXQocyRSYXRpbmcsNSkpDQpgYGANCg0KROG7sWEgdsOgbyBiaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gc+G7sSBow6BpIGzDsm5nIGPhu6dhIGtow6FjaCBow6BuZywgY2jDum5nIHRhIGPDsyB0aOG7gyBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KMS4gIFBow6JuIGLhu5Egc+G7sSBow6BpIGzDsm5nOiBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBwaMOibiBi4buRIHPhu7EgaMOgaSBsw7JuZyBj4bunYSBraMOhY2ggaMOgbmcgxJHGsOG7o2MgY2hpYSB0aMOgbmggNSBuaMOzbTogImtow7RuZyBow6BpIGzDsm5nIiwgIlThuqFtIGNo4bqlcCBuaOG6rW4iLCAiQsOsbmggdGjGsOG7nW5nIiwgIkjDoGkgbMOybmciIHbDoCAiUuG6pXQgaMOgaSBsw7JuZyIuIE3hu5dpIG5ow7NtIMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gYuG6sW5nIG3hu5l0IGPhu5l0IHRyw6puIGJp4buDdSDEkeG7ky4gTmdvw6BpIHJhIGPDsm4gY+G7mXQgIk5BIiBsw6AgY+G7mXQgIktow7RuZyBjw7Mgw70ga2nhur9uIi4NCg0KMi4gIFPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIHRyb25nIG3hu5dpIG5ow7NtOiBDaGnhu4F1IGNhbyBj4bunYSBjw6FjIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyB0cm9uZyBt4buXaSBuaMOzbSBz4buxIGjDoGkgbMOybmcuIE5ow6xuIHbDoG8gYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGdp4buvYSBjw6FjIG5ow7NtIHbDoCBuaOG6rW4gcmEgbmjDs20gY8OzIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIGNhbyBuaOG6pXQgbMOgIG5ow7NtICJIw6BpIGzDsm5nIi4NCg0KMy4gIE5o4bqtbiB4w6l0IHbhu4Egc+G7sSBow6BpIGzDsm5nOiBE4buxYSB2w6BvIGJp4buDdSDEkeG7kywgY2jDum5nIHRhIGPDsyB0aOG7gyDEkcawYSByYSBuaOG6rW4geMOpdCB24buBIG3hu6ljIMSR4buZIHPhu7EgaMOgaSBsw7JuZyBj4bunYSBraMOhY2ggaMOgbmcuIE5ow7NtICJIw6BpIGzDsm5nIiBjw7Mgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgbmhp4buBdSBuaOG6pXQsIGNow7puZyB0YSBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBo4bqndSBo4bq/dCBraMOhY2ggaMOgbmcgxJHDoW5oIGdpw6Egc+G6o24gcGjhuqltIGhv4bq3YyBk4buLY2ggduG7pSBraMOhIGNhby4gTmdvw6BpIHJhLCBuaMOzbSAia2jDtG5nIGjDoGkgbMOybmciIGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBuaOG6pXQsIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4MgY2hvIHRo4bqleSBz4bqjbiBwaOG6qW0gaG/hurdjIGThu4tjaCB24bulIMSRw6FwIOG7qW5nIMSRxrDhu6NjIHPhu7EgaMOgaSBsw7JuZyBj4bunYSBraMOhY2ggaMOgbmcuDQoNCmBgYHtyfQ0KcyA8LSBzDQpzMSA8LSBzICU+JSBtdXRhdGUoSEwgPSBjdXQoUmF0aW5nLDUsIGxhYmVsID0gYygna2jDtG5nIGjDoGkgbMOybmcnLCAnVOG6oW0gY2jhuqVwIG5o4bqtbicsJ0LDrG5oIHRoxrDhu51uZycsJ0jDoGkgbMOybmcnLCdS4bqldCBow6BpIGzDsm5nJykpKQ0KczEgJT4lIGdyb3VwX2J5KEhMKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKEhMLG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYmx1ZScpICsNCiAgICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG5ow7NtIHRoZW8gc+G7sSBow6BpIGzDsm5nIGtow6FjaCBow6BuZyIpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAwLCBjb2xvciA9ICdibGFjaycpICsNCiAgICBsYWJzKHggPSAnU+G7sSBow6BpIGzDsm5nJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQojIyAqKjIuMyBCaeG7g3UgxJHhu5MgMyAtIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgxJHGsOG7o2MgY2hp4bq/dCBraOG6pXUqKg0KDQpDw6J1IGzhu4duaCB0csOqbiB0aMOqbSBt4buZdCBj4buZdCBt4bubaSB2w6BvIGThu68gbGnhu4d1IGQgxJHGsOG7o2MgZ+G7jWkgbMOgICJncm91cCIgZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBj4buZdCAiRGlzY291bnQiLiBO4bq/dSBnacOhIHRy4buLIHRyb25nIGPhu5l0ICJEaXNjb3VudCIgbOG7m24gaMahbiAwLCB0aMOsIGdpw6EgdHLhu4sgdHJvbmcgY+G7mXQgImdyb3VwIiBz4bq9IGzDoCAiQ8OzIGNoaeG6v3Qga2jhuqV1IiwgbmfGsOG7o2MgbOG6oWksIGdpw6EgdHLhu4sgdHJvbmcgY+G7mXQgImdyb3VwIiBz4bq9IGzDoCAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1Ii4NCg0KU2F1IMSRw7MsIGPDonUgbOG7h25oIHRhYmxlKGRcJGdyb3VwKSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBt4buZdCBi4bqjbmcgdOG6p24gc+G7kSwgaGnhu4NuIHRo4buLIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IHRyb25nIG3hu5dpIG5ow7NtIGPhu6dhIGPhu5l0ICJncm91cCIuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBi4bqjbmcgdOG6p24gc+G7kSwgdHJvbmcgxJHDsyBjw6FjIG5ow7NtICJDw7MgY2hp4bq/dCBraOG6pXUiIHbDoCAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1IiDEkcaw4bujYyBoaeG7g24gdGjhu4sgdsOgIHPhu5EgbMaw4bujbmcgcXVhbiBzw6F0IHRyb25nIG3hu5dpIG5ow7NtIMSRxrDhu6NjIMSR4bq/bSBs4bqnbiBsxrDhu6N0IGzDoCAxMTkzIHbDoCAxOTIxLg0KDQpgYGB7cn0NCnMkZ3JvdXAgPC0gaWZlbHNlKHMkRGlzY291bnQgPiAwLCAiQ8OzIGNoaeG6v3Qga2jhuqV1IiwgIktow7RuZyBjaGnhur90IGto4bqldSIpDQp0YWJsZShzJGdyb3VwKQ0KYGBgDQoNCkThu7FhIHbDoG8gYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBuaMOzbSB0aGVvIGNoaeG6v3Qga2jhuqV1LCBjaMO6bmcgdGEgY8OzIHRo4buDIHBow6JuIHTDrWNoIGvhur90IHF14bqjIG5oxrAgc2F1Og0KDQoxLiAgUGjDom4gYuG7kSBjaGnhur90IGto4bqldTogQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgcGjDom4gYuG7kSBjw6FjIG5ow7NtIGThu7FhIHRyw6puIGNoaeG6v3Qga2jhuqV1IGPhu6dhIHPhuqNuIHBo4bqpbS4gQ8OhYyBuaMOzbSDEkcaw4bujYyBjaGlhIHRow6BuaCAiQ8OzIGNoaeG6v3Qga2jhuqV1IiB2w6AgIktow7RuZyBjaGnhur90IGto4bqldSIuIE3hu5dpIG5ow7NtIMSRxrDhu6NjIGJp4buDdSBkaeG7hW4gYuG6sW5nIG3hu5l0IGPhu5l0IHRyw6puIGJp4buDdSDEkeG7ky4NCg0KMi4gIFPhu5EgbMaw4bujbmcgc+G6o24gcGjhuqltIHRyb25nIG3hu5dpIG5ow7NtOiBOaMOzbSAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1IiBjw7Mgc+G7kSBsxrDhu6NuZyAxOTIxIG5oaeG7gXUgaMahbiBuaMOzbSAiQ8OzIGNoaeG6v3Qga2jhuqV1IiBsw6AgMTE5My4NCg0KMy4gIE5o4bqtbiB4w6l0IHbhu4EgY2hp4bq/dCBraOG6pXU6IEThu7FhIHbDoG8gYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIMSRxrBhIHJhIG5o4bqtbiB4w6l0IHbhu4EgbeG7qWMgxJHhu5kgY2hp4bq/dCBraOG6pXUgY+G7p2Egc+G6o24gcGjhuqltLiBUYSB0aOG6pXkgbmjDs20gIktow7RuZyBjaGnhur90IGto4bqldSIgY2hp4bq/bSB04bu3IGzhu4cgY2FvLCDEkWnhu4F1IG7DoHkgY8OzIHRo4buDIGNobyB0aOG6pXkgY2hp4bq/dCBraOG6pXUga2jDtG5nIHBo4buVIGJp4bq/biBob+G6t2Mga2jDtG5nIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIMSR4bq/biBz4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbS4NCg0KYGBge3J9DQpzICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhncm91cCxuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J2dyYXknKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbmjDs20gdGhlbyBjaGnhur90IGto4bqldSAiLHggPSAnxJDhu5kgc8OidScsIHkgPSAnU+G7kSBsxrDhu6NuZycpIA0KYGBgDQoNCiMjICoqMi40IEJp4buDdSDEkeG7kyA0IC0gQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBnacOhIGLDoW4gY+G7p2EgY8OhYyBsb+G6oWkgxJFp4buHbiB0aG/huqFpKioNCg0KQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpIGThu7FhIHRyw6puIGThu68gbGnhu4d1IHThu6sgdOG6rXAgZOG7ryBsaeG7h3UuIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGJp4buDdSDEkeG7kzoNCg0KMS4gIFBow6JuIGLhu5EgZ2nDoSBiw6FuOiBCaeG7g3UgxJHhu5MgaGlzdG9ncmFtIGNobyB0aOG6pXkgcGjDom4gYuG7kSBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpLiBUcuG7pWMgeCB0csOqbiBiaeG7g3UgxJHhu5MgYmnhu4N1IGRp4buFbiBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpLCB0cm9uZyBraGkgdHLhu6VjIHkgYmnhu4N1IGRp4buFbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaS4gTeG7l2kgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIMSR4bqhaSBkaeG7h24gY2hvIG3hu5l0IGtob+G6o25nIGdpw6EgYsOhbiwgdsOgIGNoaeG7gXUgY2FvIGPhu6dhIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSB0cm9uZyBraG/huqNuZyDEkcOzLg0KDQoyLiAgQmlud2lkdGg6IFRow7RuZyBxdWEgxJFv4bqhbiBtw6MgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwKSwgYmlud2lkdGggxJHGsOG7o2MgdGhp4bq/dCBs4bqtcCBsw6AgNTAwMC4gxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIGdpw6EgYsOhbiBj4bunYSDEkWnhu4duIHRob+G6oWkgxJHGsOG7o2MgY2hpYSB0aMOgbmggY8OhYyBraG/huqNuZyBjw7MgxJHhu5kgcuG7mW5nIDUwMDAuIFPhu5EgbMaw4bujbmcgY+G7mXQgdHLDqm4gYmnhu4N1IMSR4buTIHPhur0gcGjhu6UgdGh14buZYyB2w6BvIGtob+G6o25nIGdpw6EgdsOgIGJpbndpZHRoIG7DoHkuDQoNCjMuICBNw6B1IHPhuq9jOiBDw6FjIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyDEkcaw4bujYyB0w7QgbcOgdSB4YW5oIGxhbSAoZmlsbCA9ICdibHVlJykgdsOgIGPDsyB2aeG7gW4gbcOgdSDEkeG7jyAoY29sb3IgPSAncmVkJyksIHThuqFvIG7Dqm4gc+G7sSB0xrDGoW5nIHBo4bqjbiB0cuG7sWMgcXVhbi4NCg0KNC4gIFRpw6p1IMSR4buBIHbDoCBuaMOjbiB0cuG7pWM6IEJp4buDdSDEkeG7kyBjw7MgdGnDqnUgxJHhu4EgIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2nDoSBiw6FuIGPhu6dhIMSRaeG7h24gdGhv4bqhaSIsIHRy4bulYyB4IMSRxrDhu6NjIGdoaSBsw6AgIkdpw6EgYsOhbiIgdsOgIHRy4bulYyB5IMSRxrDhu6NjIGdoaSBsw6AgIlPhu5EgbMaw4bujbmciLg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBjaMO6bmcgdGEgbmjDrG4gdGjhuqV5IHBow6JuIHBo4buRaSBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpIHbDoCB04bqtcCB0cnVuZyBnacOhIHRyb25nIGPDoWMga2hv4bqjbmcgZ2nDoSBj4bulIHRo4buDLiBDaMO6bmcgdGEgY8OzIHRo4buDIHPhu60gZOG7pW5nIGJp4buDdSDEkeG7kyBuw6B5IMSR4buDIGhp4buDdSB0aOG7iyB0csaw4budbmcgdsOgIGN1bmcgY+G6p3UgY+G7p2EgxJFp4buHbiB0aG/huqFpLCBuaOG6rW4gYmnhur90IGPDoWMga2hv4bqjbmcgZ2nDoSBwaOG7lSBiaeG6v24gdsOgIMSRw6FuaCBnacOhIHThuq1wIHRydW5nIGdpw6EgdHJvbmcgY8OhYyBraG/huqNuZyDEkcOzLg0KDQpgYGB7cn0NCnMgJT4lIGdncGxvdChhZXMoeCA9IFNlbGxpbmcuUHJpY2UpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMCwgZmlsbCA9ICdibHVlJywgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHRpdGxlID0gIiBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGdpw6EgYsOhbiBj4bunYSDEkWnhu4duIHRob+G6oWkgIix4ID0gJ0dpw6EgYsOhbicsIHkgPSAnU+G7kSBsxrDhu6NuZycpIA0KDQpgYGANCg0KIyMgKioyLjUgQmnhu4N1IMSR4buTIDUgLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG3huq10IMSR4buTIGdpw6EgYsOhbiBj4bunYSDEkWnhu4duIHRob+G6oWkqKg0KDQpExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBiaeG7g3UgxJHhu5M6DQoNCjEuICBN4bqtdCDEkeG7mSBnacOhIGLDoW46IEJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSAoZGVuc2l0eSBwbG90KSB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgcGjDom4gYuG7kSBj4bunYSBnacOhIGLDoW4gxJFp4buHbiB0aG/huqFpLiBUcuG7pWMgeCBiaeG7g3UgZGnhu4VuIGdpw6EgYsOhbiwgdHJvbmcga2hpIHRy4bulYyB5IGJp4buDdSBkaeG7hW4gbeG6rXQgxJHhu5ksIGhheSB04bu3IGzhu4cgZ2nhu69hIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHbDoCBkaeG7h24gdMOtY2ggZMaw4bubaSDEkcaw4budbmcgY29uZy4NCg0KMi4gIE3DoHUgc+G6r2M6IMSQxrDhu51uZyBjb25nIG3huq10IMSR4buZIMSRxrDhu6NjIHTDtCBtw6B1IGjhu5NuZyAoImZpbGwgPSAncGluayciKSwgdOG6oW8gbsOqbiBz4buxIHTGsMahbmcgcGjhuqNuIHRy4buxYyBxdWFuLg0KDQozLiAgVGnDqnUgxJHhu4EgdsOgIG5ow6NuIHRy4bulYzogQmnhu4N1IMSR4buTIGPDsyB0acOqdSDEkeG7gSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpIiwgdHLhu6VjIHggxJHGsOG7o2MgZ2hpIGzDoCAiR2nDoSBiw6FuIiB2w6AgdHLhu6VjIHkgxJHGsOG7o2MgZ2hpIGzDoCAiTeG6rXQgxJHhu5kiLg0KDQpCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgZ2nDunAgY2jDum5nIHRhIG5ow6xuIHRo4bqleSBz4buxIHBow6JuIGLhu5EgbeG6rXQgxJHhu5kgY+G7p2EgZ2nDoSBiw6FuIMSRaeG7h24gdGhv4bqhaS4gxJDGsOG7nW5nIGNvbmcgbeG6rXQgxJHhu5kgY8OgbmcgY2FvIHThuqFpIG3hu5l0IGdpw6EgdHLhu4sgY+G7pSB0aOG7gywgY8OgbmcgY2hvIHRo4bqleSBt4bqtdCDEkeG7mSBs4bubbiBoxqFuIGPhu6dhIGdpw6EgYsOhbiDhu58gxJHDsy4gxJBp4buBdSBuw6B5IGdpw7pwIGNow7puZyB0YSBoaeG7g3UgcsO1IGjGoW4gduG7gSBt4bupYyDEkeG7mSB04bqtcCB0cnVuZyB2w6AgYmnhu4N1IGRp4buFbiBwaMOibiBwaOG7kWkgZ2nDoSBiw6FuIGPhu6dhIMSRaeG7h24gdGhv4bqhaSB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4NCg0KTMawdSDDvSBy4bqxbmcgxJHhu4MgcGjDom4gdMOtY2gga+G6v3QgcXXhuqMgY2hpIHRp4bq/dCBoxqFuLCBj4bqnbiB4ZW0geMOpdCB0aMO0bmcgdGluIGPhu6UgdGjhu4MgduG7gSBk4buvIGxp4buHdSB2w6Agbmfhu68gY+G6o25oIGPhu6dhIG5naGnDqm4gY+G7qXUuDQoNCmBgYHtyfQ0KcyAlPiUgZ2dwbG90KGFlcyh4ID0gU2VsbGluZy5QcmljZSkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAncGluaycpICsNCiAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bqtdCDEkeG7mSBnacOhIGLDoW4gY+G7p2EgxJFp4buHbiB0aG/huqFpICIseCA9ICdHacOhIGLDoW4nLCB5ID0gJ03huq10IMSR4buZJykgDQpgYGANCg0KIyMgKioyLjYgQmnhu4N1IMSR4buTIDYgLSBCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu7cgbOG7hyBjw7MgY2FtZXJhIGPhu6dhIMSRaeG7h24gdGhv4bqhaSoqDQoNClThuqFvIHJhIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCAoYmFyIGNoYXJ0KSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY8OzIENhbWVyYSBk4buxYSB0csOqbiBk4buvIGxp4buHdSB04burIHThuq1wIGThu68gbGnhu4d1IGBkYC4gRMaw4bubaSDEkcOieSBsw6AgcGjDom4gdMOtY2gga+G6v3QgcXXhuqMgY+G7p2EgYmnhu4N1IMSR4buTOg0KDQoxLiAgTmjDs20gdsOgIHThu5VuZyBo4bujcCBk4buvIGxp4buHdTogxJDhuqd1IHRpw6puLCBk4buvIGxp4buHdSDEkcaw4bujYyBuaMOzbSB0aGVvIGJp4bq/biBDYW1lcmEgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGdyb3VwX2J5KENhbWVyYSkgdsOgIHNhdSDEkcOzIMSR4bq/bSBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSB0cm9uZyBt4buXaSBuaMOzbSBi4bqxbmcgY8OhY2ggc+G7rSBk4bulbmcgc3VtbWFyaXNlKG4gPSBuKCkpLiBL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYuG6o25nIGThu68gbGnhu4d1IHbhu5tpIGhhaSBj4buZdDogQ2FtZXJhIChiaeG6v24gbmjDs20pIHbDoCBuIChz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBjw7MgQ2FtZXJhKS4NCg0KMi4gIEJp4buDdSDEkeG7kyBj4buZdDogROG7ryBsaeG7h3Ugc2F1IGtoaSDEkcaw4bujYyB04buVbmcgaOG7o3AgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGPhu5l0LiBUcuG7pWMgeCB0csOqbiBiaeG7g3UgxJHhu5MgYmnhu4N1IGRp4buFbiBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgYmnhur9uIGBDYW1lcmFgLCB0cm9uZyBraGkgdHLhu6VjIHkgYmnhu4N1IGRp4buFbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSB0xrDGoW5nIOG7qW5nLiBN4buXaSBj4buZdCB0csOqbiBiaeG7g3UgxJHhu5MgxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gYENhbWVyYWAsIHbDoCBjaGnhu4F1IGNhbyBj4bunYSBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkuDQoNCjMuICBNw6B1IHPhuq9jOiBDw6FjIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyDEkcaw4bujYyB0w7QgbcOgdSDEkWVuIChgZmlsbD0nYmxhY2snYCksIHThuqFvIG7Dqm4gc+G7sSB0xrDGoW5nIHBo4bqjbiB0cuG7sWMgcXVhbi4NCg0KNC4gIENow7ogdGjDrWNoIHPhu5EgbMaw4bujbmc6IFPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIMSRxrDhu6NjIGhp4buDbiB0aOG7iyB0csOqbiBt4buXaSBj4buZdCBz4butIGThu6VuZyBgZ2VvbV90ZXh0YCB2w6AgxJHGsOG7o2MgxJHhurd0IG5ow6NuIChgbGFiZWwgPSBuYCkuIENow7ogdGjDrWNoIG7DoHkgY8OzIG3DoHUgxJHhu48gKGBjb2xvciA9ICdyZWQnYCkgdsOgIMSRxrDhu6NjIMSR4bq3dCB24buLIHRyw60gZOG7jWMgKGB2anVzdCA9IDJgKSDEkeG7gyBu4bqxbSB0csOqbiBj4buZdCB0xrDGoW5nIOG7qW5nLg0KDQo1LiAgVGnDqnUgxJHhu4EgdsOgIG5ow6NuIHRy4bulYzogQmnhu4N1IMSR4buTIGPDsyB0acOqdSDEkeG7gSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBjw7MgQ2FtZXJhIiwgdHLhu6VjIHggxJHGsOG7o2MgZ2hpIGzDoCAixJBp4buHbiB0aG/huqFpIGPDsyBDYW1lcmEiIHbDoCB0cuG7pWMgeSDEkcaw4bujYyBnaGkgbMOgICJT4buRIGzGsOG7o25nIi4NCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgY2jDum5nIHRhIG5ow6xuIHRo4bqleSBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBjw7MgQ2FtZXJhIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGzDoCAzMTE0IHbDoCBuw7MgY2hp4bq/bSAxMDAlIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpLiBW4bqteSBjw7MgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGtow7RuZyBjw7MgY2FtZXJhIGzDoCAwLiBTdXkgcmEsIGhp4buHbiBuYXkgY8OzIHRo4buDIG7Ds2kgxJFhIHPhu5EgxJFp4buHbiB0aG/huqFpIMSRxrDhu6NjIHPhuqNuIHh14bqldCByYSDEkeG7gXUgY8OzIENhbWVyYS4NCg0KYGBge3J9DQpzICU+JSBncm91cF9ieShDYW1lcmEpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoQ2FtZXJhLG4pKSArDQogICAgZ2VvbV9jb2woZmlsbD0nYmxhY2snKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICAgIGxhYnModGl0bGUgPSAiIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gU+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY8OzIENhbWVyYSAiLHggPSAnxJBp4buHbiB0aG/huqFpIGPDsyBDYW1lcmEnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSANCmBgYA0KDQojIyAqKjIuNyBCaeG7g3UgxJHhu5MgNyAtIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgY2hp4bq/dCBraOG6pXUgY+G7p2EgxJFp4buHbiB0aG/huqFpIGThu7FhIHRyw6puIGdpw6EgZ+G7kWMqKg0KDQpDaMO6bmcgdGEgY8OzIG3hu5l0IGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSAoZGVuc2l0eSBwbG90KSBt4bubaSBk4buxYSB0csOqbiBnacOhIGfhu5FjIChPcmlnaW5hbC5QcmljZSkgY+G7p2EgZOG7ryBsaeG7h3UuIEJp4buDdSDEkeG7kyBuw6B5IGPFqW5nIMSRxrDhu6NjIHBow6JuIGNoaWEgdGjDoG5oIGPDoWMgbmjDs20gc+G7rSBk4bulbmcgYGZhY2V0X3dyYXAofmdyb3VwKWAuIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGJp4buDdSDEkeG7kzoNCg0KMS4gIE3huq10IMSR4buZIGdpw6EgZ+G7kWM6IEJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSB0aOG7gyBoaeG7h24gbeG6rXQgxJHhu5kgcGjDom4gYuG7kSBj4bunYSBnacOhIGfhu5FjIGPhu6dhIMSRaeG7h24gdGhv4bqhaS4gVHLhu6VjIHggYmnhu4N1IGRp4buFbiBnacOhIGfhu5FjLCB0cm9uZyBraGkgdHLhu6VjIHkgYmnhu4N1IGRp4buFbiBt4bqtdCDEkeG7mSwgaGF5IHThu7cgbOG7hyBnaeG7r2Egc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdsOgIGRp4buHbiB0w61jaCBkxrDhu5tpIMSRxrDhu51uZyBjb25nLg0KDQoyLiAgTcOgdSBz4bqvYzogxJDGsOG7nW5nIGNvbmcgbeG6rXQgxJHhu5kgxJHGsOG7o2MgdMO0IG3DoHUgeGFuaCBsw6EgY8OieSAoImZpbGwgPSAnZ3JlZW4nIiksIHThuqFvIG7Dqm4gc+G7sSB0xrDGoW5nIHBo4bqjbiB0cuG7sWMgcXVhbi4NCg0KMy4gIFBow6JuIG5ow7NtOiBCaeG7g3UgxJHhu5MgxJHGsOG7o2MgcGjDom4gY2hpYSB0aMOgbmggY8OhYyBuaMOzbSBi4bqxbmcgYGZhY2V0X3dyYXAofmdyb3VwKWAuIE3hu5dpIG5ow7NtIGPDsyB0aOG7gyBoaeG7g24gdGjhu4sgdHLDqm4gbeG7mXQgcGFuZWwgcmnDqm5nIGJp4buHdCwgZ2nDunAgc28gc8OhbmggbeG6rXQgxJHhu5kgZ2nDoSBn4buRYyBnaeG7r2EgaGFpIG5ow7NtICJDw7MgY2hp4bq/dCBraOG6pXUiIHbDoCAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1Ii4NCg0KQmnhu4N1IMSR4buTIG3huq10IMSR4buZIGdpw7pwIGNow7puZyB0YSBuaMOsbiB0aOG6pXkgc+G7sSBwaMOibiBi4buRIG3huq10IMSR4buZIGPhu6dhIGdpw6EgZ+G7kWMgdHJvbmcgdOG7q25nIG5ow7NtIGtow6FjIG5oYXUgY+G7p2EgZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBnacO6cCBjaMO6bmcgdGEgc28gc8OhbmggbeG6rXQgxJHhu5kgZ2nDoSBn4buRYyBnaeG7r2EgaGFpIG5ow7NtICJDw7MgY2hp4bq/dCBraOG6pXUiIHbDoCAiS2jDtG5nIGNoaeG6v3Qga2jhuqV1IiBsw6AgdMawxqFuZyDEkcawxqFuZyBuaGF1Lg0KDQpgYGB7cn0NCnMgJT4lIGdncGxvdChhZXMoeCA9IE9yaWdpbmFsLlByaWNlKSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdncmVlbicpICsNCiAgZmFjZXRfd3JhcCh+Z3JvdXApICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIG3huq10IMSR4buZIGNoaeG6v3Qga2jhuqV1IGPhu6dhIMSRaeG7h24gdGhv4bqhaSBk4buxYSB0csOqbiBnacOhIGfhu5FjIikNCmBgYA0KDQojIyAqKjIuOCBCaeG7g3UgxJHhu5MgOCAtIEJp4buDdSDEkeG7kyBj4buZdCAoYmFyIGNoYXJ0KSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdGhlbyB04burbmcgbmjDo24gaGnhu4d1IChCcmFuZHMpKioNCg0KQmnhu4N1IMSR4buTIGPhu5l0IChiYXIgY2hhcnQpIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSB0aGVvIHThu6tuZyBuaMOjbiBoaeG7h3UgKEJyYW5kcykgZOG7sWEgdHLDqm4gZOG7ryBsaeG7h3UgdOG7qyB04bqtcCBk4buvIGxp4buHdSBgZGAuIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGJp4buDdSDEkeG7kzoNCg0KMS4gIE5ow7NtIHbDoCB04buVbmcgaOG7o3AgZOG7ryBsaeG7h3U6IMSQ4bqndSB0acOqbiwgZOG7ryBsaeG7h3UgxJHGsOG7o2MgbmjDs20gdGhlbyBiaeG6v24gYEJyYW5kc2AgYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGBncm91cF9ieShCcmFuZHMpYCB2w6Agc2F1IMSRw7MgxJHhur9tIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHRyb25nIG3hu5dpIG5ow7NtIGLhurFuZyBjw6FjaCBz4butIGThu6VuZyBgc3VtbWFyaXNlKG4gPSBuKCkpYC4gS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGLhuqNuZyBk4buvIGxp4buHdSB24bubaSBoYWkgY+G7mXQ6IGBCcmFuZHNgIChuaMOjbiBoaeG7h3UpIHbDoCBgbmAgKHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGPhu6dhIHThu6tuZyBuaMOjbiBoaeG7h3UpLg0KDQoyLiAgQmnhu4N1IMSR4buTIGPhu5l0OiBE4buvIGxp4buHdSBzYXUga2hpIMSRxrDhu6NjIHThu5VuZyBo4bujcCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBiaeG7g3UgxJHhu5MgY+G7mXQuIFRy4bulYyB4IHRyw6puIGJp4buDdSDEkeG7kyBiaeG7g3UgZGnhu4VuIGPDoWMgZ2nDoSB0cuG7iyB0cm9uZyBiaeG6v24gYEJyYW5kc2AsIHRyb25nIGtoaSB0cuG7pWMgeSBiaeG7g3UgZGnhu4VuIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHTGsMahbmcg4bupbmcuIE3hu5dpIGPhu5l0IHRyw6puIGJp4buDdSDEkeG7kyDEkeG6oWkgZGnhu4duIGNobyBt4buZdCBuaMOjbiBoaeG7h3UsIHbDoCBjaGnhu4F1IGNhbyBj4bunYSBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkuDQoNCjMuICBDaMO6IHRow61jaCBz4buRIGzGsOG7o25nOiBT4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSDEkcaw4bujYyBoaeG7g24gdGjhu4sgdHLDqm4gbeG7l2kgY+G7mXQgc+G7rSBk4bulbmcgYGdlb21fdGV4dGAgdsOgIMSRxrDhu6NjIMSR4bq3dCBuaMOjbiAoYGxhYmVsID0gbmApLiBW4buLIHRyw60gY+G7p2EgY2jDuiB0aMOtY2ggxJHGsOG7o2MgxJHhurd0IGLhurFuZyBgcG9zaXRpb25fc3RhY2sodmp1c3QgPSAxKWAsIGdpw7pwIGNow7ogdGjDrWNoIG7hurFtIHRyw6puIGPhu5l0IHTGsMahbmcg4bupbmcuDQoNCmBgYHtyfQ0KcyAlPiUgZ3JvdXBfYnkoQnJhbmRzKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKEJyYW5kcyxuKSkgKw0KICAgIGdlb21fY29sKCkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMSkpICsNCiAgIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIGPhu6dhIMSRaeG7h24gdGhv4bqhaSBk4buxYSB0csOqbiB0aMawxqFuZyBoaeG7h3UiKQ0KYGBgDQoNCjEuICBQaMOibiBwaOG7kWkgbmjDo24gaGnhu4d1OiBCaeG7g3UgxJHhu5MgY+G7mXQgY2hvIHRo4bqleSBwaMOibiBwaOG7kWkgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdGhlbyB04burbmcgbmjDo24gaGnhu4d1IGPDsyBz4buxIGNow6puaCBs4buHY2ggcsO1IHLDoG5nLg0KDQoyLiAgU28gc8OhbmggZ2nhu69hIGPDoWMgbmjDo24gaGnhu4d1OiBCaeG7g3UgxJHhu5MgY+G7mXQgZ2nDunAgY2jDum5nIHRhIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGdp4buvYSBjw6FjIG5ow6NuIGhp4buHdS4gQ2jDum5nIHRhIGPDsyB0aOG7gyB4w6FjIMSR4buLbmggxJHGsOG7o2MgbmjDo24gaGnhu4d1IG7hu5VpIGLhuq10IHbhu5tpIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGNhbyBoxqFuIHNvIHbhu5tpIG5o4buvbmcgbmjDo24gaGnhu4d1IGtow6FjIGzDoCB0aMawxqFuZyBoaeG7h3UgU0FNU1VORyB24bubaSBz4buRIGzGsOG7o25nIDcxOSwgdGjhuqVwIG5o4bqldCBsw6AgdGjGsMahbmcgaGnhu4d1IElRT08gduG7m2kgc+G7kSBsxrDhu6NuZyBsw6AgNS4NCg0KIyMgKioyLjkgQmnhu4N1IMSR4buTIDkgLSBCaeG7g3UgxJHhu5MgaGlzdG9ncmFtIHRo4buDIGhp4buHbiBwaMOibiBwaOG7kWkgZ2nDoSBn4buRYyAoT3JpZ2luYWwuUHJpY2UpIGPhu6dhIMSRaeG7h24gdGhv4bqhaSB04burIGhhaSBuaMOjbiBoaeG7h3UgJ0FwcGxlJyB2w6AgJ1NBTVNVTkcnKioNCg0KQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGdpw6EgZ+G7kWMgKE9yaWdpbmFsLlByaWNlKSBj4bunYSDEkWnhu4duIHRob+G6oWkgdOG7qyBoYWkgbmjDo24gaGnhu4d1ICdBcHBsZScgdsOgICdTQU1TVU5HJyB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBgZGAuIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGJp4buDdSDEkeG7kzoNCg0KMS4gIFjDoWMgxJHhu4tuaCBiaeG6v24gdsOgIGThu68gbGnhu4d1OiBCaeG6v24gYHhgIHRyw6puIHRy4bulYyB4IGPhu6dhIGJp4buDdSDEkeG7kyDEkcaw4bujYyB4w6FjIMSR4buLbmggbMOgIGdpw6EgZ+G7kWMgKE9yaWdpbmFsLlByaWNlKS4gROG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gYmnhu4N1IMSR4buTIGzDoCB04bqtcCBk4buvIGxp4buHdSBgZGAuDQoNCjIuICBCaeG7g3UgxJHhu5MgaGlzdG9ncmFtOiDEkOG7gyBoaeG7g24gdGjhu4sgcGjDom4gcGjhu5FpIGdpw6EgZ+G7kWMgY+G7p2EgxJFp4buHbiB0aG/huqFpIHThu6sgbmjDo24gaGnhu4d1ICdBcHBsZScsIGLhuqFuIHPhu60gZOG7pW5nIGBnZW9tX2hpc3RvZ3JhbWAgdsOgIGzhu41jIGThu68gbGnhu4d1IGLhurFuZyBgZmlsdGVyKEJyYW5kcyA9PSAnQXBwbGUnKWAuIEvhur90IHF14bqjIGzDoCBt4buZdCBoaXN0b2dyYW0gduG7m2kgY8OhYyBj4buZdCBiaeG7g3UgdGjhu4sgdOG6p24gc3XhuqV0IGPhu6dhIGPDoWMga2hv4bqjbmcgZ2nDoSBn4buRYy4gVMawxqFuZyB04buxLCBi4bqhbiB04bqhbyBt4buZdCBoaXN0b2dyYW0ga2jDoWMgY2hvIG5ow6NuIGhp4buHdSAnU0FNU1VORycuDQoNCjMuICBD4bqldSBow6xuaCBiaW53aWR0aCB2w6AgbcOgdSBz4bqvYzogVGjDtG5nIHF1YSDEkeG7kWkgc+G7kSBgYmlud2lkdGggPSAyMDAwYCwgYuG6oW4gY2jhu4kgxJHhu4tuaCBy4bqxbmcgbeG7l2kga2hv4bqjbmcgdHLDqm4gYmnhu4N1IMSR4buTIGhpc3RvZ3JhbSBjw7MgY2hp4buBdSBy4buZbmcgbMOgIDIwMDAuIMSQaeG7gXUgbsOgeSDhuqNuaCBoxrDhu59uZyDEkeG6v24gc+G7kSBsxrDhu6NuZyB2w6Aga8OtY2ggdGjGsOG7m2MgY+G7p2EgY8OhYyBj4buZdCB0csOqbiBiaeG7g3UgxJHhu5MuIELhuqFuIHPhu60gZOG7pW5nIGBmaWxsYCDEkeG7gyB0aGnhur90IGzhuq1wIG3DoHUgc+G6r2MgY+G7p2EgY8OhYyBj4buZdCwgdsOtIGThu6U6ICdyZWQnIGNobyAnQXBwbGUnIHbDoCAnbGlnaHRncmVlbicgY2hvICdTQU1TVU5HJy4NCg0KYGBge3J9DQpzICU+JSBnZ3Bsb3QoYWVzKHggPSBPcmlnaW5hbC5QcmljZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IHMgJT4lIGZpbHRlcihCcmFuZHMgPT0gJ0FwcGxlJyksIGJpbndpZHRoID0gMjAwMCwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21faGlzdG9ncmFtKGRhdGEgPSBzICU+JSBmaWx0ZXIoQnJhbmRzID09ICdTQU1TVU5HJyksIGJpbndpZHRoID0gMjAwMCwgZmlsbCA9ICdsaWdodGdyZWVuJykgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBoaXN0b2dyYW0gdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSBnacOhIGfhu5FjIGPhu6dhIMSRaeG7h24gdGhv4bqhaSIpDQpgYGANCg0KIyMgKioyLjEwIEJp4buDdSDEkeG7kyAxMCAtIEJp4buDdSDEkeG7kyBj4buZdCDEkeG7k25nIHTDom0gdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHThu6tuZyBuaMOjbiBoaeG7h3UgdOG7qyBi4buZIGThu68gbGnhu4d1KiogDQoNCkPDonUgbOG7h25oIHRyw6puIHPhu60gZOG7pW5nIOG7kW5nIGThuqtuIChgJT4lYCkgdsOgIGfDs2kgYGdncGxvdDJgIMSR4buDIHbhur0gbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IMSR4buTbmcgdMOibSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdOG7q25nIG5ow6NuIGhp4buHdSB04burIGLhu5kgZOG7ryBsaeG7h3UgIlNtYXJ0cGhvbmVzIFNhbGVzIiB0cm9uZyBSIE1hcmtkb3duLiBExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBjw6J1IGzhu4duaDoNCg0KMS4gIE5ow7NtIGThu68gbGnhu4d1OiBDw6J1IGzhu4duaCBz4butIGThu6VuZyBow6BtIGBncm91cF9ieSgpYCDEkeG7gyBuaMOzbSBk4buvIGxp4buHdSB0aGVvIG5ow6NuIGhp4buHdSAoYEJyYW5kc2ApLg0KMi4gIFTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nOiBIw6BtIGBzdW1tYXJpc2UoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdMOtbmggc+G7kSBsxrDhu6NuZyAoYG5gKSBjaG8gbeG7l2kgbmjDo24gaGnhu4d1Lg0KMy4gIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IMSR4buTbmcgdMOibTogSMOgbSBgZ2dwbG90KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGtodW5nIGJp4buDdSDEkeG7ky4gVGjDtG5nIHF1YSB0aGFtIHPhu5EgYGFlcygpYCwgYmnhu4N1IMSR4buTIGNo4buJIMSR4buLbmggZ2nDoSB0cuG7iyB4IChy4buXbmcpIHbDoCBnacOhIHRy4buLIHkgKHPhu5EgbMaw4bujbmcpIGPhu6dhIHThu6tuZyBuaMOjbiBoaeG7h3UsIHbDoCBz4butIGThu6VuZyBtw6B1IHPhuq9jIGtow6FjIG5oYXUgY2hvIHThu6tuZyBuaMOjbiBoaeG7h3UgKGBmaWxsID0gQnJhbmRzYCkuDQo0LiAgSMOgbSBgZ2VvbV9jb2woKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBjw6FjIGPhu5l0Lg0KNS4gIEjDoG0gYGNvb3JkX3BvbGFyKCd5JylgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGNodXnhu4NuIMSR4buVaSBiaeG7g3UgxJHhu5Mgc2FuZyBk4bqhbmcgxJHhu5NuZyB0w6JtLg0KNi4gIEjDoG0gYGdlb21fdGV4dCgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0aMOqbSBjaMO6IHRow61jaCBz4buRIGxp4buHdSBsw6puIGPDoWMgY+G7mXQuIFRow7RuZyBxdWEgdGhhbSBz4buRIGBsYWJlbCA9IG5gLCBjaMO6IHRow61jaCBz4bq9IGhp4buDbiB0aOG7iyBnacOhIHRy4buLIHPhu5EgbMaw4bujbmcgKGBuYCksIHbDoCB0aMO0bmcgcXVhIHRoYW0gc+G7kSBgcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSlgLCBjaMO6IHRow61jaCDEkcaw4bujYyBjxINuIGNo4buJbmggdGhlbyBjaGnhu4F1IGThu41jLg0KNy4gIEjDoG0gYHRoZW1lX3ZvaWQoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbG/huqFpIGLhu48gbuG7gW4gdsOgIGPDoWMgdGjDoG5oIHBo4bqnbiB0cmFuZyB0csOtIGtow6FjIGPhu6dhIGJp4buDdSDEkeG7ky4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCDEkeG7k25nIHTDom0sIHRyb25nIMSRw7MgbeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHThu6tuZyBuaMOjbiBoaeG7h3UuIEPDoWMgY+G7mXQgxJHGsOG7o2Mgc+G6r3AgeOG6v3AgeHVuZyBxdWFuaCBt4buZdCB0cuG7pWMgdHLDsm4gdsOgIGPDsyB0aOG7gyBzbyBzw6FuaCBz4buxIGtow6FjIGJp4buHdCB24buBIHPhu5EgbMaw4bujbmcgZ2nhu69hIGPDoWMgbmjDo24gaGnhu4d1Lg0KDQpgYGB7cn0NCnMgJT4lIGdyb3VwX2J5KEJyYW5kcykgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0nJywgeSA9IG4sZmlsbCA9IEJyYW5kcykpICsNCiAgICBnZW9tX2NvbChjb2xvciA9ICdibGFjaycpICsNCiAgICBjb29yZF9wb2xhcigneScpICsNCiAgICBnZW9tX3RleHQoYWVzKHggPSAxLjMsIGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSkgKw0KICAgIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNClPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIHRoZW8gbmjDo24gaGnhu4d1OiBDaMO6bmcgdGEgY8OzIHRo4buDIHjDoWMgxJHhu4tuaCDEkcaw4bujYyBuaMOjbiBoaeG7h3UgbuG7lWkgYuG6rXQgduG7m2kgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY2FvIGjGoW4gc28gduG7m2kgbmjhu69uZyBuaMOjbiBoaeG7h3Uga2jDoWMgbMOgIHRoxrDGoW5nIGhp4buHdSBTQU1TVU5HIHbhu5tpIHPhu5EgbMaw4bujbmcgNzE5LCB0aOG6pXAgbmjhuqV0IGzDoCB0aMawxqFuZyBoaeG7h3UgSVFPTyB24bubaSBz4buRIGzGsOG7o25nIGzDoCA1Lg0KDQojIyAqKjIuMTEgQmnhu4N1IMSR4buTIDExIC0gQmnhu4N1IMSR4buTIGPhu5l0IMSR4buTbmcgdMOibSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgU0FNU1VORyB0aGVvIGNoaeG6v3Qga2jhuqV1KioNCg0KQ8OidSBs4buHbmggdHLDqm4gc+G7rSBk4bulbmcg4buRbmcgZOG6q24gKGAlPiVgKSB2w6AgZ8OzaSBgZ2dwbG90MmAgxJHhu4MgduG6vSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgxJHhu5NuZyB0w6JtIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBTYW1zdW5nIHRoZW8gdOG7q25nIG5ow7NtIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIFNhdSDEkcOieSBsw6AgcGjDom4gdMOtY2gga+G6v3QgcXXhuqMgY+G7p2EgY8OidSBs4buHbmg6DQoNCjEuICBM4buNYyBk4buvIGxp4buHdTogQ8OidSBs4buHbmggYGZpbHRlcihCcmFuZHMgPT0gJ1NBTVNVTkcnKWAgc+G7rSBk4bulbmcgaMOgbSBgZmlsdGVyKClgIMSR4buDIGNo4buJIGzhuqV5IGThu68gbGnhu4d1IGPhu6dhIMSRaeG7h24gdGhv4bqhaSBTYW1zdW5nIChgQnJhbmRzID09ICdTQU1TVU5HJ2ApLCB2w6AgZ8OhbiBr4bq/dCBxdeG6oyBjaG8gYmnhur9uIGBzMmAuDQoyLiAgTmjDs20gZOG7ryBsaeG7h3U6IEPDonUgbOG7h25oIGBncm91cF9ieShncm91cClgIHPhu60gZOG7pW5nIGjDoG0gYGdyb3VwX2J5KClgIMSR4buDIG5ow7NtIGThu68gbGnhu4d1IHRoZW8gbmjDs20gKGBncm91cGApLg0KMy4gIFTDrW5oIHThu5VuZyBz4buRIGzGsOG7o25nOiBIw6BtIGBzdW1tYXJpc2UoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdMOtbmggc+G7kSBsxrDhu6NuZyAoYG5gKSBjaG8gbeG7l2kgbmjDs20uDQo0LiAgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgxJHhu5NuZyB0w6JtOiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKHLhu5duZykgdsOgIGdpw6EgdHLhu4sgeSAoc+G7kSBsxrDhu6NuZykgY+G7p2EgdOG7q25nIG5ow7NtLCB2w6Agc+G7rSBk4bulbmcgbcOgdSBz4bqvYyBraMOhYyBuaGF1IGNobyB04burbmcgbmjDs20gKGBmaWxsID0gZ3JvdXBgKS4NCjUuICBIw6BtIGBnZW9tX2NvbCgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IGPDoWMgY+G7mXQuIFRoYW0gc+G7kSBgd2lkdGggPSAxYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgY2hp4buBdSBy4buZbmcgY+G7p2EgY8OhYyBj4buZdC4NCjYuICBIw6BtIGBjb29yZF9wb2xhcigneScpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBjaHV54buDbiDEkeG7lWkgYmnhu4N1IMSR4buTIHNhbmcgZOG6oW5nIMSR4buTbmcgdMOibS4NCjcuICBIw6BtIGBnZW9tX3RleHQoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdGjDqm0gY2jDuiB0aMOtY2ggc+G7kSBsaeG7h3UgbMOqbiBjw6FjIGPhu5l0LiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgbGFiZWwgPSBuYCwgY2jDuiB0aMOtY2ggc+G6vSBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyBz4buRIGzGsOG7o25nIChgbmApLCB2w6AgdGjDtG5nIHF1YSB0aGFtIHPhu5EgYHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpYCwgY2jDuiB0aMOtY2ggxJHGsOG7o2MgY8SDbiBjaOG7iW5oIHRoZW8gY2hp4buBdSBk4buNYy4NCjguICBIw6BtIGB0aGVtZV92b2lkKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGxv4bqhaSBi4buPIG7hu4FuIHbDoCBjw6FjIHRow6BuaCBwaOG6p24gdHJhbmcgdHLDrSBraMOhYyBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgxJHhu5NuZyB0w6JtLCB0cm9uZyDEkcOzIG3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBTYW1zdW5nIHRoZW8gdOG7q25nIG5ow7NtLiBDw6FjIGPhu5l0IMSRxrDhu6NjIHPhuq9wIHjhur9wIHh1bmcgcXVhbmggbeG7mXQgdHLhu6VjIHRyw7JuIHbDoCBjw7MgdGjhu4Mgc28gc8Ohbmggc+G7sSBraMOhYyBiaeG7h3QgduG7gSBz4buRIGzGsOG7o25nIGdp4buvYSBjw6FjIG5ow7NtLg0KDQpgYGB7cn0NCnMyIDwtIHMgJT4lIGZpbHRlcihCcmFuZHMgPT0gJ1NBTVNVTkcnICkNCnMyICU+JSBncm91cF9ieShncm91cCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBncm91cCkpICsNCiAgICBnZW9tX2NvbChjb2xvciA9ICdibGFjaycsIHdpZHRoID0gMSkgKw0KICAgIGNvb3JkX3BvbGFyKCd5JykgKw0KICAgIGdlb21fdGV4dChhZXMoeCA9IDEuMywgbGFiZWwgPSBuKSxwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpKSArDQogICAgdGhlbWVfdm9pZCgpDQpgYGANCg0KIyMgKioyLjEyIEJp4buDdSDEkeG7kyAxMiAtIEJp4buDdSDEkeG7kyDEkWnhu4NtIHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiBraMOhY2ggaMOgbmcgdsOgIGdpw6EgbmnDqm0geeG6v3QqKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyDEkWnhu4NtIHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiBraMOhY2ggaMOgbmcgdsOgIGdpw6EgbmnDqm0geeG6v3QgY+G7p2EgxJFp4buHbiB0aG/huqFpIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgVuG6vSBiaeG7g3UgxJHhu5MgxJFp4buDbTogSMOgbSBgZ2dwbG90KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGtodW5nIGJp4buDdSDEkeG7ky4gVGjDtG5nIHF1YSB0aGFtIHPhu5EgYGFlcygpYCwgYmnhu4N1IMSR4buTIGNo4buJIMSR4buLbmggZ2nDoSB0cuG7iyB4IChnacOhIGLDoW4ga2jDoWNoIGjDoG5nKSB2w6AgZ2nDoSB0cuG7iyB5IChnacOhIG5pw6ptIHnhur90KSBj4bunYSB04burbmcgxJFp4buDbS4NCjIuICBIw6BtIGBnZW9tX3BvaW50KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gY8OhYyDEkWnhu4NtIHRyw6puIGJp4buDdSDEkeG7kywgYmnhu4N1IHRo4buLIG3hu5dpIMSRaeG7g20gZOG7ryBsaeG7h3UuDQozLiAgSMOgbSBgeGxhYigpYCB2w6AgYHlsYWIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgdMawxqFuZyDhu6luZywgZ2nDunAgZGnhu4VuIGdp4bqjaSDDvSBuZ2jEqWEgY+G7p2EgY8OhYyB0cuG7pWMuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgxJFp4buDbSwgdHJvbmcgxJHDsyBt4buXaSDEkWnhu4NtIGJp4buDdSB0aOG7iyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiBraMOhY2ggaMOgbmcgKHRy4bulYyB4KSB2w6AgZ2nDoSBuacOqbSB54bq/dCAodHLhu6VjIHkpIGPhu6dhIHThu6tuZyDEkWnhu4duIHRob+G6oWkuIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGhp4buDbiB0aOG7iyBwaMOibiBwaOG7kWkgdsOgIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGhhaSBiaeG6v24gZ2nDoSB0cuG7iy4NCg0KYGBge3J9DQpzICU+JSBnZ3Bsb3QoYWVzKHggPSBTZWxsaW5nLlByaWNlLCB5ID0gT3JpZ2luYWwuUHJpY2UpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHhsYWIoJ0dpw6EgYsOhbiBraMOhY2ggaMOgbmcnKSArIA0KICB5bGFiKCdHacOhIG5pw6ptIHnhur90JykNCmBgYA0KDQojIyAqKjIuMTMgQmnhu4N1IMSR4buTIDEzIC0gQmnhu4N1IMSR4buTIMSRaeG7g20gdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2Ega2jhuqMgbsSDbmcgbMawdSB0cuG7ryB0aMO0bmcgdGjGsOG7nW5nIHbDoCBraOG6oyBuxINuZyBsxrB1IHRy4buvIG7hu5lpIGLhu5kgY+G7p2EgxJFp4buHbiB0aG/huqFpKioNCg0KQ8OidSBs4buHbmggdHLDqm4gc+G7rSBk4bulbmcg4buRbmcgZOG6q24gKGAlPiVgKSB2w6AgZ8OzaSBgZ2dwbG90MmAgxJHhu4MgduG6vSBt4buZdCBiaeG7g3UgxJHhu5MgxJFp4buDbSB0aOG7gyBoaeG7h24gbeG7kWkgcXVhbiBo4buHIGdp4buvYSBraOG6oyBuxINuZyBsxrB1IHRy4buvIHRow7RuZyB0aMaw4budbmcgdsOgIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gbuG7mWkgYuG7mSBj4bunYSDEkWnhu4duIHRob+G6oWkgdOG7qyBi4buZIGThu68gbGnhu4d1ICJTbWFydHBob25lcyBTYWxlcyIgdHJvbmcgUiBNYXJrZG93bi4gRMaw4bubaSDEkcOieSBsw6AgcGjDom4gdMOtY2gga+G6v3QgcXXhuqMgY+G7p2EgY8OidSBs4buHbmg6DQoNCjEuICBW4bq9IGJp4buDdSDEkeG7kyDEkWnhu4NtOiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKGto4bqjIG7Eg25nIGzGsHUgdHLhu68gdGjDtG5nIHRoxrDhu51uZykgdsOgIGdpw6EgdHLhu4sgeSAoa2jhuqMgbsSDbmcgbMawdSB0cuG7ryBu4buZaSBi4buZKSBj4bunYSB04burbmcgxJFp4buDbS4NCjIuICBIw6BtIGBnZW9tX3BvaW50KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gY8OhYyDEkWnhu4NtIHRyw6puIGJp4buDdSDEkeG7kywgYmnhu4N1IHRo4buLIG3hu5dpIMSRaeG7g20gZOG7ryBsaeG7h3UuIFRoYW0gc+G7kSBgY29sb3IgPSAnbGlnaHRibHVlJ2AgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG3DoHUgc+G6r2MgY+G7p2EgY8OhYyDEkWnhu4NtIGzDoCBtw6B1IHhhbmggbmjhuqF0Lg0KMy4gIEjDoG0gYGdlb21fc21vb3RoKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gxJHGsOG7nW5nIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIGThu7FhIHRyw6puIGThu68gbGnhu4d1LiBUaGFtIHPhu5EgYG1ldGhvZCA9ICdsbSdgIGNo4buJIMSR4buLbmggc+G7rSBk4bulbmcgcGjGsMahbmcgcGjDoXAgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmgsIHbDoCBgY29sb3IgPSAnZ3JlZW4nYCDEkeG6t3QgbcOgdSBz4bqvYyBj4bunYSDEkcaw4budbmcgaOG7k2kgcXV5IGzDoCBtw6B1IHhhbmggbMOhIGPDonkuDQo0LiAgSMOgbSBgeGxhYigpYCB2w6AgYHlsYWIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgdMawxqFuZyDhu6luZywgZ2nDunAgZGnhu4VuIGdp4bqjaSDDvSBuZ2jEqWEgY+G7p2EgY8OhYyB0cuG7pWMuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgxJFp4buDbSwgdHJvbmcgxJHDsyBt4buXaSDEkWnhu4NtIGJp4buDdSB0aOG7iyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gdGjDtG5nIHRoxrDhu51uZyAodHLhu6VjIHgpIHbDoCBraOG6oyBuxINuZyBsxrB1IHRy4buvIG7hu5lpIGLhu5kgKHRy4bulYyB5KSBj4bunYSB04burbmcgxJFp4buHbiB0aG/huqFpLiBDw6FjIMSRaeG7g20gxJHGsOG7o2MgaGnhu4NuIHRo4buLIHbhu5tpIG3DoHUgc+G6r2MgeGFuaCBuaOG6oXQsIHbDoCDEkcaw4budbmcgaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggxJHGsOG7o2MgduG6vSDEkeG7gyBiaeG7g3UgdGjhu4sgeHUgaMaw4bubbmcgdOG7lW5nIHF1w6F0IGPhu6dhIGThu68gbGnhu4d1LiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBwaMOibiB0w61jaCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gdsOgIHjDoWMgxJHhu4tuaCB4dSBoxrDhu5tuZyBjaHVuZy4NCg0KYGBge3J9DQpzICU+JSBnZ3Bsb3QoYWVzKHggPSBNZW1vcnksIHkgPSBTdG9yYWdlKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0nbGlnaHRibHVlJykgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICdncmVlbicpICsNCiAgeGxhYignS2jhuqMgbsSDbmcgbMawdSB0cuG7ryB0aMO0bmcgdGjGsOG7nW5nJykgKyANCiAgeWxhYignS2jhuqMgbsSDbmcgbMawdSB0cuG7ryBu4buZaSBi4buZJykNCmBgYA0KDQojIyAqKjIuMTQgQmnhu4N1IMSR4buTIDE0IC0gQmnhu4N1IMSR4buTIGhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gcGjDom4gYuG7kSBnacOhIGLDoW4ga2jDoWNoIGjDoG5nIGPhu6dhIMSRaeG7h24gdGhv4bqhaSB0aGVvIGto4bqjIG7Eg25nIGzGsHUgdHLhu68qKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyBoaXN0b2dyYW0gdGjhu4MgaGnhu4duIHBow6JuIGLhu5EgZ2nDoSBiw6FuIGtow6FjaCBow6BuZyBj4bunYSDEkWnhu4duIHRob+G6oWkgdGhlbyBraOG6oyBuxINuZyBsxrB1IHRy4buvIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgVuG6vSBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtOiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKGdpw6EgYsOhbiBraMOhY2ggaMOgbmcpIHbDoCBz4butIGThu6VuZyBtw6B1IHPhuq9jIGtow6FjIG5oYXUgY2hvIHThu6tuZyBraG/huqNuZyBnacOhIGThu7FhIHRyw6puIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gKGBmaWxsID0gTWVtb3J5YCkuDQoyLiAgSMOgbSBgZ2VvbV9oaXN0b2dyYW0oKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgduG6vSBoaXN0b2dyYW0uIFRoYW0gc+G7kSBgYmlud2lkdGggPSA2MDAwYCB4w6FjIMSR4buLbmggxJHhu5kgcuG7mW5nIGPhu6dhIGPDoWMga2hv4bqjbmcgZ2nDoSwgdHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHkgbMOgIDYwMDAuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgaGlzdG9ncmFtLCB0cm9uZyDEkcOzIHRy4bulYyB4IGJp4buDdSB0aOG7iyBnacOhIGLDoW4ga2jDoWNoIGjDoG5nIHbDoCB0cuG7pWMgeSBiaeG7g3UgdGjhu4sgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdHJvbmcgdOG7q25nIGtob+G6o25nIGdpw6EuIEPDoWMga2hv4bqjbmcgZ2nDoSBjw7MgbcOgdSBz4bqvYyBraMOhYyBuaGF1IGThu7FhIHRyw6puIGto4bqjIG7Eg25nIGzGsHUgdHLhu68gY+G7p2EgxJFp4buHbiB0aG/huqFpLiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBwaMOibiB0w61jaCBwaMOibiBwaOG7kWkgZ2nDoSBiw6FuIGtow6FjaCBow6BuZyB2w6AgbeG7kWkgbGnDqm4gaOG7hyB24bubaSBraOG6oyBuxINuZyBsxrB1IHRy4buvLg0KDQpgYGB7cn0NCnMgJT4lIGdncGxvdChhZXMoeCA9IFNlbGxpbmcuUHJpY2UsIGZpbGwgPSBNZW1vcnkpKSArDQogZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA2MDAwKQ0KYGBgDQoNCiMjICoqMi4xNSBCaeG7g3UgxJHhu5MgMTUgLSBCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgKGRlbnNpdHkgcGxvdCkgdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSBnacOhIGLDoW4gY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgdOG7qyBoYWkgdGjGsMahbmcgaGnhu4d1IFNBTVNVTkcgdsOgIE9QUE8qKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSAoZGVuc2l0eSBwbG90KSB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGdpw6EgYsOhbiBj4bunYSBjw6FjIMSRaeG7h24gdGhv4bqhaSB04burIGhhaSB0aMawxqFuZyBoaeG7h3UgU0FNU1VORyB2w6AgT1BQTyB04burIGLhu5kgZOG7ryBsaeG7h3UgIlNtYXJ0cGhvbmVzIFNhbGVzIiB0cm9uZyBSIE1hcmtkb3duLiBExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBjw6J1IGzhu4duaDoNCg0KMS4gIEzhu41jIGThu68gbGnhu4d1OiBIw6BtIGBmaWx0ZXIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbOG7jWMgY8OhYyBkw7JuZyBk4buvIGxp4buHdSBjaOG7iSB04burIHRoxrDGoW5nIGhp4buHdSBTQU1TVU5HIGhv4bq3YyBPUFBPIChgQnJhbmRzID09ICdTQU1TVU5HJyB8IEJyYW5kcyA9PSAnT1BQTydgKS4NCjIuICBW4bq9IGJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mTogSMOgbSBgZ2dwbG90KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGtodW5nIGJp4buDdSDEkeG7ky4gVGjDtG5nIHF1YSB0aGFtIHPhu5EgYGFlcygpYCwgYmnhu4N1IMSR4buTIGNo4buJIMSR4buLbmggZ2nDoSB0cuG7iyB4IChnacOhIGLDoW4pIHbDoCBz4butIGThu6VuZyBtw6B1IHPhuq9jIGtow6FjIG5oYXUgY2hvIHThu6tuZyB0aMawxqFuZyBoaeG7h3UgKGBmaWxsID0gQnJhbmRzYCkuDQozLiAgSMOgbSBgZ2VvbV9kZW5zaXR5KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gYmnhu4N1IMSR4buTIG3huq10IMSR4buZIGThu7FhIHRyw6puIGThu68gbGnhu4d1LiBCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgdGjhu4MgaGnhu4duIHBow6JuIHBo4buRaSB4w6FjIHN14bqldCBj4bunYSBnacOhIGLDoW4gY2hvIHThu6tuZyB0aMawxqFuZyBoaeG7h3UuDQo0LiAgSMOgbSBgbGFicygpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoYHRpdGxlID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gZ2nDoSBiw6FuIGPhu6dhIFNBTVNVTkcgdsOgIE9QUE8iYCkgdsOgIG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgKGB4ID0gJ0dpw6EgYsOhbicsIHkgPSAnVOG7tyB0cuG7jW5nJ2ApLg0KDQpL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIG3huq10IMSR4buZLCB0cm9uZyDEkcOzIHRy4bulYyB4IGJp4buDdSB0aOG7iyBnacOhIGLDoW4gdsOgIHRy4bulYyB5IGJp4buDdSB0aOG7iyB04bu3IHRy4buNbmcgKHjDoWMgc3XhuqV0KSBj4bunYSBnacOhIGLDoW4uIEPDoWMgxJHGsOG7nW5nIG3huq10IMSR4buZIGtow6FjIG5oYXUgdMawxqFuZyDhu6luZyB24bubaSBoYWkgdGjGsMahbmcgaGnhu4d1IFNBTVNVTkcgdsOgIE9QUE8uIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHNvIHPDoW5oIHBow6JuIHBo4buRaSBnacOhIGLDoW4gZ2nhu69hIGhhaSB0aMawxqFuZyBoaeG7h3UgdsOgIHBow6JuIHTDrWNoIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIGdpw6EgY+G6oy4NCg0KYGBge3J9DQpzICU+JSBmaWx0ZXIoQnJhbmRzPT0gJ1NBTVNVTkcnIHwgQnJhbmRzPT0gJ09QUE8nKSAlPiUNCiAgZ2dwbG90KGFlcyh4PVNlbGxpbmcuUHJpY2UsIGZpbGwgPSBCcmFuZHMpKSArDQogIGdlb21fZGVuc2l0eSgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGdpw6EgYsOhbiBj4bunYSBTQU1TVU5HIHbDoCBPUFBPIikgKw0KICBsYWJzKHggPSAnR2nDoSBiw6FuJywgeSA9ICdU4bu3IHRy4buNbmcnKQ0KYGBgDQoNCiMjICoqMi4xNiBCaeG7g3UgxJHhu5MgMTYgLSBCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSAoZnJlcXVlbmN5IHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBt4bupYyBnacOhIGfhu5FjIGPhu6dhIGPDoWMgxJFp4buHbiB0aG/huqFpIHThu6sgaGFpIHRoxrDGoW5nIGhp4buHdSBBcHBsZSB2w6AgT1BQTyoqIA0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyB04bqnbiBz4buRIChmcmVxdWVuY3kgcGxvdCkgdGjhu4MgaGnhu4duIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBjw6FjIG3hu6ljIGdpw6EgZ+G7kWMgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgdOG7qyBoYWkgdGjGsMahbmcgaGnhu4d1IEFwcGxlIHbDoCBPUFBPIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgTOG7jWMgZOG7ryBsaeG7h3U6IEjDoG0gYGZpbHRlcigpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBs4buNYyBjw6FjIGTDsm5nIGThu68gbGnhu4d1IGNo4buJIHThu6sgdGjGsMahbmcgaGnhu4d1IEFwcGxlIGhv4bq3YyBPUFBPIChgQnJhbmRzID09ICdBcHBsZScgfCBCcmFuZHMgPT0gJ09QUE8nYCkuDQoNCjIuICBW4bq9IGJp4buDdSDEkeG7kyB04bqnbiBz4buROiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKGdpw6EgZ+G7kWMpIHbDoCBz4butIGThu6VuZyBtw6B1IHPhuq9jIGtow6FjIG5oYXUgY2hvIHThu6tuZyB0aMawxqFuZyBoaeG7h3UgKGBjb2xvciA9IEJyYW5kc2ApLg0KDQozLiAgSMOgbSBgZ2VvbV9mcmVxcG9seSgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IMSRxrDhu51uZyB04bqnbiBz4buRIGThu7FhIHRyw6puIGThu68gbGnhu4d1LiDEkMaw4budbmcgdOG6p24gc+G7kSB0aOG7gyBoaeG7h24gc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIHThu6tuZyBt4bupYyBnacOhIGfhu5FjLg0KDQo0LiAgIEjDoG0gXGBsYWJzKClcYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoXGB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBnacOhIGfhu5FjIGPhu6dhIEFwcGxlIHbDoCBPUFBPIlxgKSB2w6AgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB0cuG7pWMgeSAoXGB4ID0gJ0dpw6EgZ+G7kWMnLCB5ID0gJ1ThuqduIHPhu5EgeHXhuqV0IGhp4buHbidcYCkuDQoNCiAgICBL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIHThuqduIHPhu5EsIHRyb25nIMSRw7MgdHLhu6VjIHggYmnhu4N1IHRo4buLIGdpw6EgZ+G7kWMgdsOgIHRy4bulYyB5IGJp4buDdSB0aOG7iyBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgbeG7l2kgbeG7qWMgZ2nDoS4gQ8OhYyDEkcaw4budbmcgdOG6p24gc+G7kSBraMOhYyBuaGF1IHTGsMahbmcg4bupbmcgduG7m2kgaGFpIHRoxrDGoW5nIGhp4buHdSBBcHBsZSB2w6AgT1BQTy4gQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgcGjDom4gdMOtY2ggcGjDom4gcGjhu5FpIGdpw6EgZ+G7kWMgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgdOG7qyBoYWkgdGjGsMahbmcgaGnhu4d1IHbDoCBzbyBzw6FuaCB04bqnbiBz4buRIHh14bqldCBoaeG7h24gZ2nhu69hIGNow7puZy4NCg0KYGBge3J9DQpzICU+JSBmaWx0ZXIoQnJhbmRzPT0gJ0FwcGxlJyB8IEJyYW5kcz09ICdPUFBPJykgJT4lDQogIGdncGxvdChhZXMoeD1PcmlnaW5hbC5QcmljZSwgY29sb3I9QnJhbmRzKSkgKyANCiAgZ2VvbV9mcmVxcG9seShsaW5ld2lkdGggPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHPhu5EgZ2nDoSBn4buRYyBj4bunYSBBcHBsZSB2w6AgT1BQTyIpICsNCiAgbGFicyh4ID0gJ0dpw6EgZ+G7kWMnLCB5ID0gJ1ThuqduIHPhu5EgeHXhuqV0IGhp4buHbicpDQpgYGANCg0KIyMgKioyLjE3IEJp4buDdSDEkeG7kyAxNyAtIEJp4buDdSDEkeG7kyBj4buZdCAoY29sdW1uIGNoYXJ0KSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY+G7p2EgaGFpIHRoxrDGoW5nIGhp4buHdSB2aXZvIHbDoCByZWFsbWUqKiANCg0KQ8OidSBs4buHbmggdHLDqm4gc+G7rSBk4bulbmcg4buRbmcgZOG6q24gKGAlPiVgKSB2w6AgZ8OzaSBgZ2dwbG90MmAgxJHhu4MgduG6vSBt4buZdCBiaeG7g3UgxJHhu5MgY+G7mXQgKGNvbHVtbiBjaGFydCkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgxJFp4buHbiB0aG/huqFpIGPhu6dhIGhhaSB0aMawxqFuZyBoaeG7h3Ugdml2byB2w6AgcmVhbG1lIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQ6IEjDoG0gYGdncGxvdCgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB04bqhbyBt4buZdCBraHVuZyBiaeG7g3UgxJHhu5MuIFRow7RuZyBxdWEgdGhhbSBz4buRIGBhZXMoKWAsIGJp4buDdSDEkeG7kyBjaOG7iSDEkeG7i25oIHRy4bulYyB4IChow6NuZyDEkWnhu4duIHRob+G6oWkpIHbDoCBraMO0bmcgY8OzIHRow7RuZyB0aW4geSAoYHkgPSAnJ2ApLg0KMi4gIEjDoG0gYGdlb21fY29sKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gY8OhYyBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkuIEPhu6UgdGjhu4MsIGhhaSBs4buHbmggYGdlb21fY29sKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nLCBt4buXaSBs4buHbmggdMawxqFuZyDhu6luZyB24bubaSBt4buZdCB0aMawxqFuZyBoaeG7h3UuIEJp4buDdSDEkeG7kyBz4butIGThu6VuZyBk4buvIGxp4buHdSDEkcOjIMSRxrDhu6NjIGzhu41jIHRow7RuZyBxdWEgaMOgbSBgZmlsdGVyKClgIMSR4buDIGNo4buJIGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSB2aXZvIHbDoCByZWFsbWUuIFRoYW0gc+G7kSBgZmlsbGAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhu4tuaCBuZ2jEqWEgbcOgdSBz4bqvYyBjaG8gY+G7mXQgY+G7p2EgdOG7q25nIHRoxrDGoW5nIGhp4buHdS4NCjMuICBIw6BtIGBsYWJzKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTIChgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSB2aXZvIHbDoCByZWFsbWUiYCkgdsOgIG5ow6NuIGNobyB0cuG7pWMgeCB2w6AgdHLhu6VjIHkgKGB4ID0gJ0jDo25nIMSRaeG7h24gdGhv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZydgKS4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCwgdHJvbmcgxJHDsyB0cuG7pWMgeCBiaeG7g3UgdGjhu4sgY8OhYyB0aMawxqFuZyBoaeG7h3UgxJFp4buHbiB0aG/huqFpIHbDoCB0cuG7pWMgeSBiaeG7g3UgdGjhu4sgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgdMawxqFuZyDhu6luZy4gQ+G7mXQgbcOgdSDEkeG7jyB0xrDGoW5nIOG7qW5nIHbhu5tpIHRoxrDGoW5nIGhp4buHdSB2aXZvIHbDoCBj4buZdCBtw6B1IHbDoG5nIHTGsMahbmcg4bupbmcgduG7m2kgdGjGsMahbmcgaGnhu4d1IHJlYWxtZS4gQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgc28gc8Ohbmggc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgZ2nhu69hIGhhaSB0aMawxqFuZyBoaeG7h3UgdsOgIHBow6JuIHTDrWNoIHPhu7Ega2jDoWMgYmnhu4d0IHRyb25nIHPhu5EgbMaw4bujbmcuDQoNCmBgYHtyfQ0KcyAlPiUgZ2dwbG90KGFlcyh4PSBCcmFuZHMsIHk9ICcnKSkgKw0KICBnZW9tX2NvbChkYXRhID0gcyAlPiUgZmlsdGVyKEJyYW5kcyA9PSAndml2bycpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IHMgJT4lIGZpbHRlcihCcmFuZHMgPT0gJ3JlYWxtZScpLCBmaWxsID0gJ3llbGxvdycpICsNCiAgbGFicyh0aXRsZSA9ICIgQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSB2aXZvIHbDoCByZWFsbWUiKSArDQogIGxhYnMoeCA9ICdIw6NuZyDEkWnhu4duIHRob+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiMjICoqMi4xOCBCaeG7g3UgxJHhu5MgMTggLSBCaeG7g3UgxJHhu5MgxJFp4buDbSAoc2NhdHRlciBwbG90KSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY+G7p2EgbeG7l2kgaMOjbmcgduG7m2kgxJFp4buDbSBz4buRIFJhdGluZyBs4bubbiBoxqFuIDQqKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyDEkWnhu4NtIChzY2F0dGVyIHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSBt4buXaSBow6NuZyB24bubaSDEkWnhu4NtIHPhu5EgUmF0aW5nIGzhu5tuIGjGoW4gNCB04burIGLhu5kgZOG7ryBsaeG7h3UgIlNtYXJ0cGhvbmVzIFNhbGVzIiB0cm9uZyBSIE1hcmtkb3duLiBExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBjw6J1IGzhu4duaDoNCg0KMS4gIEzhu41jIGThu68gbGnhu4d1OiBIw6BtIGBmaWx0ZXIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbOG7jWMgY8OhYyBkw7JuZyBk4buvIGxp4buHdSBjaOG7iSBjw7MgUmF0aW5nIGzhu5tuIGjGoW4gNCAoYFJhdGluZyA+IDRgKS4NCjIuICBW4bq9IGJp4buDdSDEkeG7kyDEkWnhu4NtOiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCB0cuG7pWMgeCAoaMOjbmcpIHbDoCB0cuG7pWMgeSAoUmF0aW5nKS4NCjMuICBIw6BtIGBnZW9tX3BvaW50KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gY8OhYyDEkWnhu4NtIHRyw6puIGJp4buDdSDEkeG7kywgbeG7l2kgxJFp4buDbSB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5l0IGjDo25nIMSRaeG7h24gdGhv4bqhaS4gQ8OhYyDEkWnhu4NtIMSRxrDhu6NjIG3DoHUgxJHhu48gKGBjb2xvciA9ICdyZWQnYCkuDQo0LiAgSMOgbSBgbGFicygpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkeG6t3QgdGnDqnUgxJHhu4EgY2hvIGJp4buDdSDEkeG7kyAoYHRpdGxlID0gIkJp4buDdSDEkeG7kyBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSBow6NuZyBSYXRpbmcgdHLDqm4gNCJgKSB2w6AgbmjDo24gY2hvIHRy4bulYyB4IChgeCA9ICdIw6NuZydgKSB2w6AgdHLhu6VjIHkgKGB5ID0gJ1JhdGluZydgKS4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyDEkWnhu4NtLCB0cm9uZyDEkcOzIHRy4bulYyB4IGJp4buDdSB0aOG7iyBjw6FjIGjDo25nIMSRaeG7h24gdGhv4bqhaSB2w6AgdHLhu6VjIHkgYmnhu4N1IHRo4buLIMSRaeG7g20gc+G7kSBSYXRpbmcgdMawxqFuZyDhu6luZy4gTeG7l2kgxJFp4buDbSB0csOqbiBiaeG7g3UgxJHhu5MgdMawxqFuZyDhu6luZyB24bubaSBt4buZdCBow6NuZyDEkWnhu4duIHRob+G6oWkgdsOgIG3DoHUgxJHhu48uIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIMSRaeG7h24gdGhv4bqhaSBj4bunYSBt4buXaSBow6NuZyBjw7MgUmF0aW5nIGzhu5tuIGjGoW4gNCB2w6AgcGjDom4gdMOtY2ggbeG7qWMgxJHhu5kgxJHDoW5oIGdpw6EgY+G7p2EgdOG7q25nIGjDo25nLg0KDQpgYGB7cn0NCnMgJT4lIGZpbHRlcihSYXRpbmc+NCkgJT4lDQogIGdncGxvdChhZXMoeD1CcmFuZHMsIHk9UmF0aW5nKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gJ3JlZCcpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5Mgc+G7kSBsxrDhu6NuZyDEkWnhu4duIHRob+G6oWkgY+G7p2EgaMOjbmcgUmF0aW5nIHRyw6puIDQiKSArDQogIGxhYnMoeCA9ICdIw6NuZycsICdSYXRpbmcnKQ0KYGBgDQoNCiMjICoqMi4xOSBCaeG7g3UgxJHhu5MgMTkgLSBCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSAoZnJlcXVlbmN5IHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBt4bupYyBnacOhIGfhu5FjIGPhu6dhIGPDoWMgxJFp4buHbiB0aG/huqFpIGPDsyBtw6B1IMSRZW4gdsOgIHRy4bqvbmcqKg0KDQpDw6J1IGzhu4duaCB0csOqbiBz4butIGThu6VuZyDhu5FuZyBk4bqrbiAoYCU+JWApIHbDoCBnw7NpIGBnZ3Bsb3QyYCDEkeG7gyB24bq9IG3hu5l0IGJp4buDdSDEkeG7kyB04bqnbiBz4buRIChmcmVxdWVuY3kgcGxvdCkgdGjhu4MgaGnhu4duIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBjw6FjIG3hu6ljIGdpw6EgZ+G7kWMgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIG3DoHUgxJFlbiB2w6AgdHLhuq9uZyB04burIGLhu5kgZOG7ryBsaeG7h3UgIlNtYXJ0cGhvbmVzIFNhbGVzIiB0cm9uZyBSIE1hcmtkb3duLiBExrDhu5tpIMSRw6J5IGzDoCBwaMOibiB0w61jaCBr4bq/dCBxdeG6oyBj4bunYSBjw6J1IGzhu4duaDoNCg0KMS4gIEzhu41jIGThu68gbGnhu4d1OiBIw6BtIGBmaWx0ZXIoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgbOG7jWMgY8OhYyBkw7JuZyBk4buvIGxp4buHdSBjaOG7iSB04burIGPDoWMgxJFp4buHbiB0aG/huqFpIGPDsyBtw6B1IMSRZW4gaG/hurdjIHRy4bqvbmcgKGBDb2xvcnMgPT0gJ1doaXRlJyB8IENvbG9ycyA9PSAnQmxhY2snYCkuDQoyLiAgVuG6vSBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kTogSMOgbSBgZ2dwbG90KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHThuqFvIG3hu5l0IGtodW5nIGJp4buDdSDEkeG7ky4gVGjDtG5nIHF1YSB0aGFtIHPhu5EgYGFlcygpYCwgYmnhu4N1IMSR4buTIGNo4buJIMSR4buLbmggZ2nDoSB0cuG7iyB4IChnacOhIGfhu5FjKSB2w6Agc+G7rSBk4bulbmcgbcOgdSBz4bqvYyBraMOhYyBuaGF1IGNobyB04burbmcgbcOgdSAoYGNvbG9yID0gQ29sb3JzYCkuDQozLiAgSMOgbSBgZ2VvbV9mcmVxcG9seSgpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB24bq9IMSRxrDhu51uZyB04bqnbiBz4buRIGThu7FhIHRyw6puIGThu68gbGnhu4d1LiDEkMaw4budbmcgdOG6p24gc+G7kSB0aOG7gyBoaeG7h24gc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIHThu6tuZyBt4bupYyBnacOhIGfhu5FjLg0KNC4gIEjDoG0gYGxhYnMoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHhurd0IHRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MgKGB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBnacOhIGfhu5FjIHRoZW8gbcOgdSDEkWVuIHbDoCB0cuG6r25nImApIHbDoCBuaMOjbiBjaG8gdHLhu6VjIHggdsOgIHRy4bulYyB5IChgeCA9ICdHacOhIGfhu5FjJywgeSA9ICdU4bqnbiBz4buRIHh14bqldCBoaeG7h24nYCkuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kSwgdHJvbmcgxJHDsyB0cuG7pWMgeCBiaeG7g3UgdGjhu4sgZ2nDoSBn4buRYyB2w6AgdHLhu6VjIHkgYmnhu4N1IHRo4buLIHPhu5EgbOG6p24geHXhuqV0IGhp4buHbiBj4bunYSBt4buXaSBt4bupYyBnacOhLiBDw6FjIMSRxrDhu51uZyB04bqnbiBz4buRIGtow6FjIG5oYXUgdMawxqFuZyDhu6luZyB24bubaSBoYWkgbcOgdSDEkWVuIHbDoCB0cuG6r25nLiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBwaMOibiB0w61jaCBwaMOibiBwaOG7kWkgZ2nDoSBn4buRYyBj4bunYSBjw6FjIMSRaeG7h24gdGhv4bqhaSBjw7MgbcOgdSDEkWVuIHbDoCB0cuG6r25nIHbDoCBzbyBzw6FuaCB04bqnbiBz4buRIHh14bqldCBoaeG7h24gZ2nhu69hIGNow7puZy4NCg0KYGBge3J9DQpzICU+JSBmaWx0ZXIoQ29sb3JzPT0gJ1doaXRlJyB8IENvbG9ycz09ICdCbGFjaycpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9T3JpZ2luYWwuUHJpY2UsIGNvbG9yPUNvbG9ycykpICsgDQogIGdlb21fZnJlcXBvbHkobGluZXdpZHRoID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBz4buRIGdpw6EgZ+G7kWMgdGhlbyBtw6B1IMSRZW4gdsOgIHRy4bqvbmciKSArDQogIGxhYnMoeCA9ICdHacOhIGfhu5FjJywgeSA9ICdU4bqnbiBz4buRIHh14bqldCBoaeG7h24nKQ0KYGBgDQoNCiMjICoqMi4yMCBCaeG7g3UgxJHhu5MgMjAgLSBCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSAoZnJlcXVlbmN5IHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBt4bupYyDEkcOhbmggZ2nDoSBz4buxIGjDoGkgbMOybmcgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIGLhu5kgbmjhu5sgUkFNIGzDoCA4IEdCIHbDoCA2IEdCKioNCg0KQ8OidSBs4buHbmggdHLDqm4gc+G7rSBk4bulbmcg4buRbmcgZOG6q24gKGAlPiVgKSB2w6AgZ8OzaSBgZ2dwbG90MmAgxJHhu4MgduG6vSBt4buZdCBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kSAoZnJlcXVlbmN5IHBsb3QpIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBt4bupYyDEkcOhbmggZ2nDoSBz4buxIGjDoGkgbMOybmcgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIGLhu5kgbmjhu5sgUkFNIGzDoCA4IEdCIHbDoCA2IEdCIHThu6sgYuG7mSBk4buvIGxp4buHdSAiU21hcnRwaG9uZXMgU2FsZXMiIHRyb25nIFIgTWFya2Rvd24uIETGsOG7m2kgxJHDonkgbMOgIHBow6JuIHTDrWNoIGvhur90IHF14bqjIGPhu6dhIGPDonUgbOG7h25oOg0KDQoxLiAgTOG7jWMgZOG7ryBsaeG7h3U6IEjDoG0gYGZpbHRlcigpYCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBs4buNYyBjw6FjIGTDsm5nIGThu68gbGnhu4d1IGNo4buJIHThu6sgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIGLhu5kgbmjhu5sgUkFNIGzDoCA4IEdCIGhv4bq3YyA2IEdCIChgTWVtb3J5ID09ICc4IEdCJyB8IE1lbW9yeSA9PSAnNiBHQidgKS4NCjIuICBW4bq9IGJp4buDdSDEkeG7kyB04bqnbiBz4buROiBIw6BtIGBnZ3Bsb3QoKWAgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQga2h1bmcgYmnhu4N1IMSR4buTLiBUaMO0bmcgcXVhIHRoYW0gc+G7kSBgYWVzKClgLCBiaeG7g3UgxJHhu5MgY2jhu4kgxJHhu4tuaCBnacOhIHRy4buLIHggKMSRw6FuaCBnacOhIHPhu7EgaMOgaSBsw7JuZykgdsOgIHPhu60gZOG7pW5nIG3DoHUgc+G6r2Mga2jDoWMgbmhhdSBjaG8gdOG7q25nIGLhu5kgbmjhu5sgUkFNIChgY29sb3IgPSBNZW1vcnlgKS4NCjMuICBIw6BtIGBnZW9tX2ZyZXFwb2x5KClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHbhur0gxJHGsOG7nW5nIHThuqduIHPhu5EgZOG7sWEgdHLDqm4gZOG7ryBsaeG7h3UuIMSQxrDhu51uZyB04bqnbiBz4buRIHRo4buDIGhp4buHbiBz4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgdOG7q25nIG3hu6ljIMSRw6FuaCBnacOhIHPhu7EgaMOgaSBsw7JuZy4NCjQuICBIw6BtIGBsYWJzKClgIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTIChgdGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHPhu5EgZ2nDoSBn4buRYyB0aGVvIG3DoHUgxJFlbiB2w6AgdHLhuq9uZyJgKSB2w6AgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB0cuG7pWMgeSAoYHggPSAnU+G7sSBow6BpIGzDsm5nJywgeSA9ICdU4bqnbiBz4buRIHh14bqldCBoaeG7h24nYCkuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgdOG6p24gc+G7kSwgdHJvbmcgxJHDsyB0cuG7pWMgeCBiaeG7g3UgdGjhu4sgxJHDoW5oIGdpw6Egc+G7sSBow6BpIGzDsm5nIHbDoCB0cuG7pWMgeSBiaeG7g3UgdGjhu4sgc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIG3hu5dpIG3hu6ljIMSRw6FuaCBnacOhLiBDw6FjIMSRxrDhu51uZyB04bqnbiBz4buRIGtow6FjIG5oYXUgdMawxqFuZyDhu6luZyB24bubaSBoYWkgYuG7mSBuaOG7myBSQU0gbMOgIDggR0IgdsOgIDYgR0IuIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHBow6JuIHTDrWNoIHBow6JuIHBo4buRaSDEkcOhbmggZ2nDoSBz4buxIGjDoGkgbMOybmcgY+G7p2EgY8OhYyDEkWnhu4duIHRob+G6oWkgY8OzIGLhu5kgbmjhu5sgUkFNIGtow6FjIG5oYXUgdsOgIHNvIHPDoW5oIHThuqduIHPhu5EgeHXhuqV0IGhp4buHbiBnaeG7r2EgY2jDum5nLg0KDQpgYGB7cn0NCnMgJT4lIGZpbHRlcihNZW1vcnk9PSAnOCBHQicgfCBNZW1vcnk9PSAnNiBHQicpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9UmF0aW5nLCBjb2xvcj1NZW1vcnkpKSArIA0KICBnZW9tX2ZyZXFwb2x5KGxpbmV3aWR0aCA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc+G7kSBnacOhIGfhu5FjIHRoZW8gbcOgdSDEkWVuIHbDoCB0cuG6r25nIikgKw0KICBsYWJzKHggPSAnU+G7sSBow6BpIGzDsm5nJywgeSA9ICdU4bqnbiBz4buRIHh14bqldCBoaeG7h24nKQ0KYGBgDQo=