03:35:16, 09 - 03 - 2024

NHIỆM VỤ 5


1. GIỚI THIỆU BỘ DỮ LIỆU sales_data_sample.csv

Tập dữ liệu chứa dữ liệu Bán hàng của một công ty ô tô

MÔ TẢ DỮ LIỆU:

  • SỐ ĐẶT HÀNG: Cột này thể hiện số nhận dạng duy nhất được gán cho mỗi đơn hàng.

  • SỐ LƯỢNG ĐẶT HÀNG: Nó cho biết số lượng mặt hàng được đặt hàng trong mỗi đơn hàng.

  • GIÁ: MỖI Cột này chỉ định giá của từng mặt hàng trong đơn hàng.

  • SỐ ĐẶT HÀNG: Nó đại diện cho số dòng của từng mục trong một đơn hàng.

  • VIỆC BÁN HÀNG: Cột này biểu thị tổng số tiền bán được cho mỗi đơn hàng, được tính bằng cách nhân số lượng đặt hàng với giá của từng mặt hàng.

  • NGÀY ĐẶT HÀNG: Nó biểu thị ngày đặt hàng.

  • DAYS_SINCE_LASTORDER: Cột này thể hiện số ngày đã trôi qua kể từ đơn hàng cuối cùng của mỗi khách hàng. Nó có thể được sử dụng để phân tích mô hình mua hàng của khách hàng.

  • TRẠNG THÁI: Nó cho biết trạng thái của đơn đặt hàng, chẳng hạn như “Đã giao hàng”, “Đang xử lý”, “Đã hủy”, “Đang tranh chấp”, “Đang tạm dừng” hoặc “Đã giải quyết”.

  • DÒNG SẢN PHẨM: Cột này chỉ định danh mục dòng sản phẩm mà mỗi mặt hàng thuộc về.

  • MSRP: Nó là viết tắt của Giá bán lẻ đề xuất của nhà sản xuất và thể hiện giá bán đề xuất cho từng mặt hàng.

  • MÃ SẢN PHẨM: Cột này thể hiện mã duy nhất được gán cho mỗi sản phẩm.

  • TÊN KHÁCH HÀNG: Nó biểu thị tên của khách hàng đã đặt hàng.

  • ĐIỆN THOẠI: Cột này chứa số điện thoại liên hệ của khách hàng.

  • ĐỊA CHỈ1: Nó đại diện cho dòng đầu tiên trong địa chỉ của khách hàng.

  • THÀNH PHỐ: Cột này chỉ định thành phố nơi khách hàng sinh sống.

  • MÃ BƯU ĐIỆN: Nó biểu thị mã bưu chính hoặc mã ZIP được liên kết với địa chỉ của khách hàng.

  • QUỐC GIA: Cột này cho biết quốc gia nơi khách hàng sinh sống.

  • LIÊN HỆ TÊN: Nó đại diện cho họ của người liên hệ có liên quan đến khách hàng.

  • LIÊN HỆ TÊN ĐẦU TIÊN: Cột này biểu thị tên của người liên hệ được liên kết với khách hàng.

  • GIẢM GIÁ: Nó cho biết quy mô của giao dịch hoặc đơn đặt hàng, đó là các danh mục “Nhỏ”, “Trung bình” hoặc “Lớn”.

Hàng 1

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
htp <- read.csv(file = "C:/Users/HP/Downloads/sales_data_sample.csv")
# Đổi tên các cột
names(htp) <- c("MADONHANG", "SOLUONGDATHANG", "GIABAN", "SOTHUTULINH", "DOANHTHU",
                 "NGAYDATHANG", "SONGAYTROILANHANG", "TRANGTHAI", "DANHMUCSANPHAM",
                 "GIAOSUGOIDIEN", "MASANPHAM", "TENKHACHHANG", "DIENTHOAI", "DIACHI1",
                 "THANHPHO", "MAVUNG", "HO", "QUOCGIA", "TEN", "SIZEDONHANG")

1.1 Biểu Đồ 1: Phân Phối Số Lượng Đặt Hàng

Hàng 2

hist(htp$SOLUONGDATHANG, main="Phân Phối Số Lượng Đặt Hàng", xlab="Số Lượng Đặt Hàng", col="navy", border="black")

  • Giải Thích Kết Quả:

Biểu đồ này giúp ta hiểu rõ về phân phối số lượng đặt hàng, từ đó có thể đánh giá mức độ mua sắm của khách hàng.

Trục x (Số Lượng Đặt Hàng): Hiển thị giá trị của biến SOLUONGDATHANG.

Trục y (Tần suất): Hiển thị số lượng quan sát (đơn vị) tương ứng với mỗi khoảng giá trị trên trục x.

Khi quan sát biểu đồ histogram, bạn có thể có cái nhìn tổng quan về phân phối của SOLUONGDATHANG, giúp bạn nhận biết các đặc điểm như phân chia các khoảng, biên độ của dữ liệu, và xu hướng tập trung dữ liệu. Điều này có thể hữu ích để đưa ra quyết định và phân tích chi tiết hơn về dữ liệu của bạn.

1.2 Biểu Đồ 2: Biểu Đồ Cột Cho Dòng Sản Phẩm

ggplot(htp, aes(x=DANHMUCSANPHAM)) +
  geom_bar(fill='navy') +
  labs(x='Dòng Sản Phẩm', y='Số Lượng', title='Số Lượng Sản Phẩm Theo Dòng') +
  theme_minimal()

  • Giải Thích Kết Quả:

Biểu đồ này giúp xác định dòng sản phẩm nào có số lượng đặt hàng nhiều nhất, từ đó có thể tối ưu hóa quảng cáo và tồn kho.

Kết quả là một biểu đồ cột thể hiện số lượng sản phẩm theo từng dòng sản phẩm, với trục x là dòng sản phẩm, trục y là số lượng sản phẩm, và mỗi cột được tô màu xanh đậm. Tiêu đề và nhãn trục giúp giải thích nội dung của biểu đồ.

Biểu đồ này giúp bạn có cái nhìn tổng quan về phân phối số lượng sản phẩm theo từng dòng sản phẩm và có thể giúp bạn nhận ra sự phân bố tập trung của sản phẩm trong các dòng khác nhau.

1.3 Biểu Đồ 3: Biểu Đồ Đường Số Lượng Đặt Hàng Theo Ngày

ggplot(htp, aes(x=NGAYDATHANG, y=SOLUONGDATHANG)) +
  geom_line(color='navy', size=1) +
  labs(x='Ngày Đặt Hàng', y='Số Lượng Đặt Hàng', title='Số Lượng Đặt Hàng Theo Ngày') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

  • Giải Thích Kết Quả:

Biểu đồ này giúp theo dõi xu hướng mua sắm theo thời gian, có thể phát hiện các đợt tăng trưởng hoặc giảm giá đặt hàng.

Kết quả là một biểu đồ đường thể hiện sự biến động của số lượng đặt hàng theo ngày. Bạn có thể quan sát xu hướng tăng giảm của số lượng đặt hàng trong thời gian và nhận biết các điểm nhấn quan trọng.

1.4 Biểu Đồ 4: Biểu Đồ Scatter Giữa Giá Bán và Số Lượng Đặt Hàng

  • Giải Thích Kết Quả:

Biểu đồ này giúp xác định mối quan hệ giữa giá bán và số lượng đặt hàng, có thể phát hiện xu hướng giá ảnh hưởng đến mức độ bán hàng.

Kết quả là một biểu đồ phân tán (scatter plot) hiển thị mối quan hệ giữa giá bán và số lượng đặt hàng.

Các điểm trên biểu đồ biểu thị giá trị của cặp biến tương ứng. Nếu có xu hướng hoặc mối quan hệ giữa hai biến, bạn có thể quan sát được từ biểu đồ này.

1.5 Biểu Đồ 5: Biểu Đồ Boxplot Số Lượng Đặt Hàng Theo Trạng Thái Đơn Hàng

boxplot(htp$SOLUONGDATHANG ~ htp$TRANGTHAI, col='navy', main='Boxplot Số Lượng Đặt Hàng Theo Trạng Thái Đơn Hàng',
        xlab='Trạng Thái Đơn Hàng', ylab='Số Lượng Đặt Hàng')

  • Giải Thích Kết Quả:

Biểu đồ này giúp so sánh phân phối số lượng đặt hàng giữa các trạng thái đơn hàng khác nhau.

Kết quả là một biểu đồ hộp thể hiện phân phối và sự biến động của số lượng đặt hàng theo từng trạng thái đơn hàng. Các hộp (box) biểu thị phạm vi giữa các phần tư của dữ liệu, và các điểm ngoại lai có thể được quan sát từ biểu đồ. Biểu đồ hộp giúp bạn có cái nhìn tổng quan về phân phối và phương sai của dữ liệu.

1.6 Biểu Đồ 6: Biểu Đồ Piechart Tỉ Lệ Trạng Thái Đơn Hàng

status_counts <- table(htp$TRANGTHAI)
pie(status_counts, labels=names(status_counts), main='Tỉ Lệ Trạng Thái Đơn Hàng', col=rainbow(length(status_counts)))

  • Giải Thích Kết Quả:

Biểu đồ Piechart giúp hiển thị tỉ lệ phần trăm của mỗi trạng thái đơn hàng.

Kết quả là một biểu đồ tròn thể hiện tỉ lệ các trạng thái đơn hàng. Mỗi phần tròn đại diện cho một trạng thái, và diện tích của phần tròn thể hiện tỉ lệ tương ứng với số lượng đơn hàng ở mỗi trạng thái. Biểu đồ tròn thường được sử dụng để thể hiện sự phân bố phần trăm hoặc tỉ lệ của các phần của một toàn bộ.

1.7 Biểu Đồ Số Lượng Đặt Hàng Theo Quốc Gia

ggplot(htp, aes(x=QUOCGIA)) +
  geom_bar(fill='navy') +
  labs(x='Quốc Gia', y='Số Lượng Đặt Hàng', title='Số Lượng Đặt Hàng Theo Quốc Gia') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Giải Thích Kết Quả:

Biểu đồ này giúp so sánh số lượng đặt hàng giữa các quốc gia khác nhau.

Kết quả là một biểu đồ cột thể hiện số lượng đặt hàng theo từng quốc gia. Biểu đồ này giúp bạn có cái nhìn tổng quan về phân phối của đặt hàng theo quốc gia và nhận biết sự tập trung đặt hàng ở đâu nhiều nhất.

1.8 Biểu Đồ 8: Biểu Đồ Phân Phối Giá Bán

  • Giải Thích Kết Quả:

Biểu đồ này giúp hiểu rõ phân phối của giá bán, có thể phát hiện các mức giá phổ biến hoặc ngoại lệ.

Kết quả là một biểu đồ histogram hiển thị phân phối của giá bán. Biểu đồ này giúp bạn có cái nhìn tổng quan về phân phối của giá bán trong dữ liệu, với các thanh cột biểu thị tần suất xuất hiện của các khoảng giá trị khác nhau.

1.9 Biểu Đồ 9: Biểu Đồ Boxplot Đánh Giá Số Ngày Trôi Qua Kể Từ Đơn Hàng Cuối Cùng

ggplot(htp, aes(x=NGAYDATHANG, y=SOLUONGDATHANG, color=QUOCGIA)) +
  geom_point(size=3) +
  labs(x='Ngày Đặt Hàng', y='Số Lượng Đặt Hàng', title='Scatter Số Lượng Đặt Hàng Theo Ngày') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Giải Thích Kết Quả:

Biểu đồ này giúp đánh giá thời gian giữa các đơn hàng và phân phối của nó.

1.10 Biểu Đồ 10: Biểu Đồ Tròn Tỉ Lệ Số Đơn Hàng Theo Kích Thước Đơn

order_size_counts <- table(htp$SIZEDONHANG)
pie(order_size_counts, labels=names(order_size_counts), main='Tỉ Lệ Số Đơn Hàng Theo Kích Thước Đơn',
    col=rainbow(length(order_size_counts)))

  • Giải Thích Kết Quả:

Biểu đồ tròn giúp hiển thị phần trăm số đơn hàng thuộc vào từng kích thước đơn.

Kết quả là một biểu đồ phân tán hiển thị sự phân bố số lượng đặt hàng theo ngày, và mỗi điểm có màu sắc phân biệt tương ứng với quốc gia.

Biểu đồ này giúp bạn nhận biết mối quan hệ giữa ngày đặt hàng và số lượng đặt hàng, cũng như sự tương quan theo quốc gia.

1.11 Biểu Đồ 11: Biểu Đồ Scatter Giữa Giá Bán và Doanh Thu

  • Giải Thích Kết Quả:

Biểu đồ này giúp xác định mối quan hệ giữa giá bán và doanh thu, có thể phát hiện xu hướng tăng trưởng doanh thu với giá bán.

Kết quả là một biểu đồ phân tán (scatter plot) hiển thị mối quan hệ giữa giá bán và doanh thu. Các điểm trên biểu đồ biểu thị giá trị của cặp biến tương ứng. Nếu có xu hướng hoặc mối quan hệ giữa hai biến, bạn có thể quan sát được từ biểu đồ này.

1.12 Biểu Đồ 12: Biểu Đồ Phân Phối Doanh Thu Theo Dòng Sản Phẩm

ggplot(htp, aes(x=DANHMUCSANPHAM, y=DOANHTHU, fill=DANHMUCSANPHAM)) +
  geom_bar(stat='identity') +
  labs(x='Dòng Sản Phẩm', y='Tổng Doanh Thu', title='Tổng Doanh Thu Theo Dòng Sản Phẩm') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Giải Thích Kết Quả:

Biểu đồ này giúp so sánh phân phối doanh thu giữa các dòng sản phẩm khác nhau.

Kết quả là một biểu đồ cột thể hiện tổng doanh thu theo từng dòng sản phẩm. Biểu đồ này giúp bạn nhìn nhận được mức độ đóng góp của từng dòng sản phẩm vào tổng doanh thu và so sánh giữa chúng.

1.13 Biểu Đồ 13: Biểu Đồ Phân Phối Doanh Thu Theo Dòng Sản Phẩm

ggplot(htp, aes(x=DANHMUCSANPHAM, y=DOANHTHU, fill=DANHMUCSANPHAM)) +
  geom_boxplot() +
  labs(x='Dòng Sản Phẩm', y='Doanh Thu', title='Phân Phối Doanh Thu Theo Dòng Sản Phẩm') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
## Warning: Continuous x aesthetic
## ℹ did you forget `aes(group = ...)`?
## Warning: The following aesthetics were dropped during statistical transformation: fill.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

  • Giải Thích Kết Quả:

Biểu đồ này giúp so sánh phân phối doanh thu giữa các dòng sản phẩm khác nhau.

Kết quả là một biểu đồ boxplot thể hiện phân phối doanh thu theo từng dòng sản phẩm. Biểu đồ này giúp bạn hiểu về phân phối dữ liệu, điểm trung tâm, và biến động của doanh thu trong từng nhóm dòng sản phẩm.

1.14 Biểu Đồ 14: Biểu Đồ Phân Phối Số Lượng Đặt Hàng Theo Kích Thước Đơn

  • Giải Thích Kết Quả:

Biểu đồ này giúp hiển thị phân phối số lượng đặt hàng theo kích thước đơn, có thể phát hiện kích thước đơn phổ biến nhất.

Kết quả là một biểu đồ cột thể hiện phân phối số lượng đặt hàng theo kích thước đơn. Biểu đồ này giúp bạn nhận biết mức độ đặt hàng trong từng kích thước đơn và so sánh giữa chúng.

1.15 Biểu Đồ 15: Biểu Đồ Đường Doanh Thu Theo Ngày

ggplot(htp, aes(x=NGAYDATHANG, y=DOANHTHU)) +
  geom_line(color='navy', size=1) +
  labs(x='Ngày Đặt Hàng', y='Doanh Thu', title='Doanh Thu Theo Ngày') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Giải Thích Kết Quả:

Biểu đồ này giúp theo dõi xu hướng doanh thu theo ngày, có thể phát hiện các đợt tăng trưởng hoặc giảm giá đặt hàng.

Kết quả là một biểu đồ đường thể hiện biến động của doanh thu theo ngày đặt hàng. Biểu đồ này giúp bạn theo dõi xu hướng tăng giảm của doanh thu trong khoảng thời gian nhất định và nhận biết các điểm nổi bật.

1.16 Biểu Đồ 16: Biểu Đồ Piechart Tỉ Lệ Kích Thước Đơn Hàng

order_size_percentage <- prop.table(table(htp$SIZEDONHANG))
pie(order_size_percentage, labels=names(order_size_percentage),
    main='Tỉ Lệ Kích Thước Đơn Hàng', col=rainbow(length(order_size_percentage)))

  • Giải Thích Kết Quả:

Biểu đồ Piechart giúp hiển thị tỉ lệ phần trăm của mỗi kích thước đơn hàng.

Kết quả là một biểu đồ pie chart thể hiện tỷ lệ phần trăm của từng kích thước đơn hàng. Biểu đồ này giúp bạn dễ dàng nhận biết phần trăm đóng góp của từng kích thước đơn hàng vào tổng số đơn hàng.

1.17 Biểu Đồ 17: Biểu Đồ Cột Kích Thước Đơn Hàng Theo Dòng Sản Phẩm

ggplot(htp, aes(x=DANHMUCSANPHAM, fill=SIZEDONHANG)) +
  geom_bar(position='dodge') +
  labs(x='Dòng Sản Phẩm', y='Số Lượng Đặt Hàng', title='Kích Thước Đơn Hàng Theo Dòng Sản Phẩm') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Giải Thích Kết Quả:

Biểu đồ cột này so sánh kích thước đơn hàng giữa các dòng sản phẩm.

Kết quả là một biểu đồ cột thể hiện số lượng đặt hàng theo từng kích thước đơn hàng, phân loại theo dòng sản phẩm. Biểu đồ này giúp bạn so sánh mức độ đặt hàng của từng dòng sản phẩm theo kích thước đơn hàng.

1.18 Biểu Đồ 19: Biểu Đồ Động Doanh Thu Theo Ngày và Dòng Sản Phẩm

htp %>%
  ggplot(aes(x=NGAYDATHANG, y=DOANHTHU, group=DANHMUCSANPHAM, color=DANHMUCSANPHAM)) +
  geom_line(size=1) +
  labs(x='Ngày Đặt Hàng', y='Doanh Thu', title='Doanh Thu Theo Ngày và Dòng Sản Phẩm') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Giải Thích Kết Quả:

Biểu đồ động này thể hiện sự thay đổi của doanh thu theo ngày và dòng sản phẩm.

Kết quả là một biểu đồ đường thể hiện biến động của doanh thu theo ngày đặt hàng, phân loại theo dòng sản phẩm. Biểu đồ này giúp bạn theo dõi xu hướng tăng giảm của doanh thu theo ngày và so sánh giữa các dòng sản phẩm.

1.19 Biểu Đồ 19: Biểu Đồ Cột Doanh Thu Theo Quốc Gia

ggplot(htp, aes(x=QUOCGIA, y=DOANHTHU, fill=QUOCGIA)) +
  geom_bar(stat='identity') +
  labs(x='Quốc Gia', y='Doanh Thu', title='Doanh Thu Theo Quốc Gia') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Giải Thích Kết Quả:

Biểu đồ cột này thể hiện doanh thu theo quốc gia, giúp so sánh hiệu suất bán hàng giữa các quốc gia.

Kết quả là một biểu đồ cột thể hiện doanh thu theo từng quốc gia. Biểu đồ này giúp bạn so sánh doanh thu giữa các quốc gia khác nhau và nhìn nhận mức độ đóng góp của từng quốc gia vào tổng doanh thu.

1.20 Biểu Đồ 21: Biểu Đồ Scatter Giữa Giá Bán và Số Lượng Đặt Hàng

ggplot(htp, aes(x=GIABAN, y=SOLUONGDATHANG, color=DANHMUCSANPHAM)) +
  geom_point(size=3) +
  labs(x='Giá Bán', y='Số Lượng Đặt Hàng', title='Scatter Giữa Giá Bán và Số Lượng Đặt Hàng') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • Giải Thích Kết Quả:

Biểu đồ scatter này thể hiện mối quan hệ giữa giá bán và số lượng đặt hàng, có thể phát hiện xu hướng hoặc tương quan giữa các biến này.

Kết quả là một biểu đồ scatter thể hiện mối quan hệ giữa giá bán và số lượng đặt hàng, với mỗi điểm màu sắc theo dòng sản phẩm.

Biểu đồ này giúp bạn nhận biết xu hướng giữa giá và số lượng đặt hàng cũng như so sánh giữa các dòng sản phẩm.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1IC0gTcO0biBOZ8O0biBOZ+G7ryBM4bqtcCBUcsOsbmggVHJvbmcgUGjDom4gVMOtY2ggROG7ryBMaeG7h3UiDQphdXRob3I6ICJIb8OgbmcgVOG6pW4gUGjDoXQiDQpkYXRlOiANCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVHJ1ZQ0KICAgIHRvYzogVHJ1ZQ0KICAgIHRvY19mbG9hdDogVHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQpgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyAqKk5ISeG7hk0gVuG7pCA1KioNCioqKg0KDQojIyAqKjEuIEdJ4buaSSBUSEnhu4ZVIELhu5ggROG7riBMSeG7hlUgc2FsZXNfZGF0YV9zYW1wbGUuY3N2KioNCg0KVOG6rXAgZOG7ryBsaeG7h3UgY2jhu6lhIGThu68gbGnhu4d1IELDoW4gaMOgbmcgY+G7p2EgbeG7mXQgY8O0bmcgdHkgw7QgdMO0DQoNCk3DlCBU4bqiIEThu64gTEnhu4ZVOg0KDQoqIFPhu5AgxJDhurZUIEjDgE5HOiBD4buZdCBuw6B5IHRo4buDIGhp4buHbiBz4buRIG5o4bqtbiBk4bqhbmcgZHV5IG5o4bqldCDEkcaw4bujYyBnw6FuIGNobyBt4buXaSDEkcahbiBow6BuZy4NCg0KKiBT4buQIEzGr+G7ok5HIMSQ4bq2VCBIw4BORzoJTsOzIGNobyBiaeG6v3Qgc+G7kSBsxrDhu6NuZyBt4bq3dCBow6BuZyDEkcaw4bujYyDEkeG6t3QgaMOgbmcgdHJvbmcgbeG7l2kgxJHGoW4gaMOgbmcuDQoNCiogR0nDgTogTeG7lkkJQ+G7mXQgbsOgeSBjaOG7iSDEkeG7i25oIGdpw6EgY+G7p2EgdOG7q25nIG3hurd0IGjDoG5nIHRyb25nIMSRxqFuIGjDoG5nLg0KDQoqIFPhu5AgxJDhurZUIEjDgE5HOglOw7MgxJHhuqFpIGRp4buHbiBjaG8gc+G7kSBkw7JuZyBj4bunYSB04burbmcgbeG7pWMgdHJvbmcgbeG7mXQgxJHGoW4gaMOgbmcuDQoNCiogVknhu4ZDIELDgU4gSMOATkc6CUPhu5l0IG7DoHkgYmnhu4N1IHRo4buLIHThu5VuZyBz4buRIHRp4buBbiBiw6FuIMSRxrDhu6NjIGNobyBt4buXaSDEkcahbiBow6BuZywgxJHGsOG7o2MgdMOtbmggYuG6sW5nIGPDoWNoIG5ow6JuIHPhu5EgbMaw4bujbmcgxJHhurd0IGjDoG5nIHbhu5tpIGdpw6EgY+G7p2EgdOG7q25nIG3hurd0IGjDoG5nLg0KDQoqIE5Hw4BZIMSQ4bq2VCBIw4BORzoJTsOzIGJp4buDdSB0aOG7iyBuZ8OgeSDEkeG6t3QgaMOgbmcuDQoNCiogREFZU19TSU5DRV9MQVNUT1JERVI6CUPhu5l0IG7DoHkgdGjhu4MgaGnhu4duIHPhu5EgbmfDoHkgxJHDoyB0csO0aSBxdWEga+G7gyB04burIMSRxqFuIGjDoG5nIGN14buRaSBjw7luZyBj4bunYSBt4buXaSBraMOhY2ggaMOgbmcuIE7DsyBjw7MgdGjhu4MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgcGjDom4gdMOtY2ggbcO0IGjDrG5oIG11YSBow6BuZyBj4bunYSBraMOhY2ggaMOgbmcuDQoNCiogVFLhuqBORyBUSMOBSToJTsOzIGNobyBiaeG6v3QgdHLhuqFuZyB0aMOhaSBj4bunYSDEkcahbiDEkeG6t3QgaMOgbmcsIGNo4bqzbmcgaOG6oW4gbmjGsCAixJDDoyBnaWFvIGjDoG5nIiwgIsSQYW5nIHjhu60gbMO9IiwgIsSQw6MgaOG7p3kiLCAixJBhbmcgdHJhbmggY2jhuqVwIiwgIsSQYW5nIHThuqFtIGThu6tuZyIgaG/hurdjICLEkMOjIGdp4bqjaSBxdXnhur90Ii4NCg0KKiBEw5JORyBT4bqiTiBQSOG6qE06CUPhu5l0IG7DoHkgY2jhu4kgxJHhu4tuaCBkYW5oIG3hu6VjIGTDsm5nIHPhuqNuIHBo4bqpbSBtw6AgbeG7l2kgbeG6t3QgaMOgbmcgdGh14buZYyB24buBLg0KDQoqIE1TUlA6CU7DsyBsw6Agdmnhur90IHThuq90IGPhu6dhIEdpw6EgYsOhbiBs4bq7IMSR4buBIHh14bqldCBj4bunYSBuaMOgIHPhuqNuIHh14bqldCB2w6AgdGjhu4MgaGnhu4duIGdpw6EgYsOhbiDEkeG7gSB4deG6pXQgY2hvIHThu6tuZyBt4bq3dCBow6BuZy4NCg0KKiBNw4MgU+G6ok4gUEjhuqhNOglD4buZdCBuw6B5IHRo4buDIGhp4buHbiBtw6MgZHV5IG5o4bqldCDEkcaw4bujYyBnw6FuIGNobyBt4buXaSBz4bqjbiBwaOG6qW0uDQoNCiogVMOKTiBLSMOBQ0ggSMOATkc6CU7DsyBiaeG7g3UgdGjhu4sgdMOqbiBj4bunYSBraMOhY2ggaMOgbmcgxJHDoyDEkeG6t3QgaMOgbmcuDQoNCiogxJBJ4buGTiBUSE/huqBJOglD4buZdCBuw6B5IGNo4bupYSBz4buRIMSRaeG7h24gdGhv4bqhaSBsacOqbiBo4buHIGPhu6dhIGtow6FjaCBow6BuZy4NCg0KKiDEkOG7ikEgQ0jhu4gxOglOw7MgxJHhuqFpIGRp4buHbiBjaG8gZMOybmcgxJHhuqd1IHRpw6puIHRyb25nIMSR4buLYSBjaOG7iSBj4bunYSBraMOhY2ggaMOgbmcuDQoNCiogVEjDgE5IIFBI4buQOglD4buZdCBuw6B5IGNo4buJIMSR4buLbmggdGjDoG5oIHBo4buRIG7GoWkga2jDoWNoIGjDoG5nIHNpbmggc+G7kW5nLg0KDQoqIE3DgyBCxq9VIMSQSeG7hk46CU7DsyBiaeG7g3UgdGjhu4sgbcOjIGLGsHUgY2jDrW5oIGhv4bq3YyBtw6MgWklQIMSRxrDhu6NjIGxpw6puIGvhur90IHbhu5tpIMSR4buLYSBjaOG7iSBj4bunYSBraMOhY2ggaMOgbmcuDQoNCiogUVXhu5BDIEdJQToJQ+G7mXQgbsOgeSBjaG8gYmnhur90IHF14buRYyBnaWEgbsahaSBraMOhY2ggaMOgbmcgc2luaCBz4buRbmcuDQoNCiogTEnDik4gSOG7hiBUw4pOOglOw7MgxJHhuqFpIGRp4buHbiBjaG8gaOG7jSBj4bunYSBuZ8aw4budaSBsacOqbiBo4buHIGPDsyBsacOqbiBxdWFuIMSR4bq/biBraMOhY2ggaMOgbmcuDQoNCiogTEnDik4gSOG7hiBUw4pOIMSQ4bqmVSBUScOKTjoJQ+G7mXQgbsOgeSBiaeG7g3UgdGjhu4sgdMOqbiBj4bunYSBuZ8aw4budaSBsacOqbiBo4buHIMSRxrDhu6NjIGxpw6puIGvhur90IHbhu5tpIGtow6FjaCBow6BuZy4NCg0KKiBHSeG6ok0gR0nDgToJTsOzIGNobyBiaeG6v3QgcXV5IG3DtCBj4bunYSBnaWFvIGThu4tjaCBob+G6t2MgxJHGoW4gxJHhurd0IGjDoG5nLCDEkcOzIGzDoCBjw6FjIGRhbmggbeG7pWMgIk5o4buPIiwgIlRydW5nIGLDrG5oIiBob+G6t2MgIkzhu5tuIi4NCg0KSMOgbmcgMQ0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpodHAgPC0gcmVhZC5jc3YoZmlsZSA9ICJDOi9Vc2Vycy9IUC9Eb3dubG9hZHMvc2FsZXNfZGF0YV9zYW1wbGUuY3N2IikNCiMgxJDhu5VpIHTDqm4gY8OhYyBj4buZdA0KbmFtZXMoaHRwKSA8LSBjKCJNQURPTkhBTkciLCAiU09MVU9OR0RBVEhBTkciLCAiR0lBQkFOIiwgIlNPVEhVVFVMSU5IIiwgIkRPQU5IVEhVIiwNCiAgICAgICAgICAgICAgICAgIk5HQVlEQVRIQU5HIiwgIlNPTkdBWVRST0lMQU5IQU5HIiwgIlRSQU5HVEhBSSIsICJEQU5ITVVDU0FOUEhBTSIsDQogICAgICAgICAgICAgICAgICJHSUFPU1VHT0lESUVOIiwgIk1BU0FOUEhBTSIsICJURU5LSEFDSEhBTkciLCAiRElFTlRIT0FJIiwgIkRJQUNISTEiLA0KICAgICAgICAgICAgICAgICAiVEhBTkhQSE8iLCAiTUFWVU5HIiwgIkhPIiwgIlFVT0NHSUEiLCAiVEVOIiwgIlNJWkVET05IQU5HIikNCmBgYA0KDQojIyMgKioxLjEgQmnhu4N1IMSQ4buTIDE6IFBow6JuIFBo4buRaSBT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZyoqDQoNCkjDoG5nIDINCg0KYGBge3J9DQpoaXN0KGh0cCRTT0xVT05HREFUSEFORywgbWFpbj0iUGjDom4gUGjhu5FpIFPhu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nIiwgeGxhYj0iU+G7kSBMxrDhu6NuZyDEkOG6t3QgSMOgbmciLCBjb2w9Im5hdnkiLCBib3JkZXI9ImJsYWNrIikNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB0YSBoaeG7g3UgcsO1IHbhu4EgcGjDom4gcGjhu5FpIHPhu5EgbMaw4bujbmcgxJHhurd0IGjDoG5nLCB04burIMSRw7MgY8OzIHRo4buDIMSRw6FuaCBnacOhIG3hu6ljIMSR4buZIG11YSBz4bqvbSBj4bunYSBraMOhY2ggaMOgbmcuDQoNClRy4bulYyB4IChT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZyk6IEhp4buDbiB0aOG7iyBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBTT0xVT05HREFUSEFORy4NCg0KVHLhu6VjIHkgKFThuqduIHN14bqldCk6IEhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIHF1YW4gc8OhdCAoxJHGoW4gduG7iykgdMawxqFuZyDhu6luZyB24bubaSBt4buXaSBraG/huqNuZyBnacOhIHRy4buLIHRyw6puIHRy4bulYyB4Lg0KDQpLaGkgcXVhbiBzw6F0IGJp4buDdSDEkeG7kyBoaXN0b2dyYW0sIGLhuqFuIGPDsyB0aOG7gyBjw7MgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIHBow6JuIHBo4buRaSBj4bunYSBTT0xVT05HREFUSEFORywgZ2nDunAgYuG6oW4gbmjhuq1uIGJp4bq/dCBjw6FjIMSR4bq3YyDEkWnhu4NtIG5oxrAgcGjDom4gY2hpYSBjw6FjIGtob+G6o25nLCBiacOqbiDEkeG7mSBj4bunYSBk4buvIGxp4buHdSwgdsOgIHh1IGjGsOG7m25nIHThuq1wIHRydW5nIGThu68gbGnhu4d1LiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIGjhu691IMOtY2ggxJHhu4MgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIHbDoCBwaMOibiB0w61jaCBjaGkgdGnhur90IGjGoW4gduG7gSBk4buvIGxp4buHdSBj4bunYSBi4bqhbi4NCg0KIyMjICoqMS4yIEJp4buDdSDEkOG7kyAyOiBCaeG7g3UgxJDhu5MgQ+G7mXQgQ2hvIETDsm5nIFPhuqNuIFBo4bqpbSoqDQoNCmBgYHtyfQ0KZ2dwbG90KGh0cCwgYWVzKHg9REFOSE1VQ1NBTlBIQU0pKSArDQogIGdlb21fYmFyKGZpbGw9J25hdnknKSArDQogIGxhYnMoeD0nRMOybmcgU+G6o24gUGjhuqltJywgeT0nU+G7kSBMxrDhu6NuZycsIHRpdGxlPSdT4buRIEzGsOG7o25nIFPhuqNuIFBo4bqpbSBUaGVvIETDsm5nJykgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB4w6FjIMSR4buLbmggZMOybmcgc+G6o24gcGjhuqltIG7DoG8gY8OzIHPhu5EgbMaw4bujbmcgxJHhurd0IGjDoG5nIG5oaeG7gXUgbmjhuqV0LCB04burIMSRw7MgY8OzIHRo4buDIHThu5FpIMawdSBow7NhIHF14bqjbmcgY8OhbyB2w6AgdOG7k24ga2hvLg0KDQpL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbSB0aGVvIHThu6tuZyBkw7JuZyBz4bqjbiBwaOG6qW0sIHbhu5tpIHRy4bulYyB4IGzDoCBkw7JuZyBz4bqjbiBwaOG6qW0sIHRy4bulYyB5IGzDoCBz4buRIGzGsOG7o25nIHPhuqNuIHBo4bqpbSwgdsOgIG3hu5dpIGPhu5l0IMSRxrDhu6NjIHTDtCBtw6B1IHhhbmggxJHhuq1tLiBUacOqdSDEkeG7gSB2w6AgbmjDo24gdHLhu6VjIGdpw7pwIGdp4bqjaSB0aMOtY2ggbuG7mWkgZHVuZyBj4bunYSBiaeG7g3UgxJHhu5MuDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGLhuqFuIGPDsyBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbhu4EgcGjDom4gcGjhu5FpIHPhu5EgbMaw4bujbmcgc+G6o24gcGjhuqltIHRoZW8gdOG7q25nIGTDsm5nIHPhuqNuIHBo4bqpbSB2w6AgY8OzIHRo4buDIGdpw7pwIGLhuqFuIG5o4bqtbiByYSBz4buxIHBow6JuIGLhu5EgdOG6rXAgdHJ1bmcgY+G7p2Egc+G6o24gcGjhuqltIHRyb25nIGPDoWMgZMOybmcga2jDoWMgbmhhdS4NCg0KIyMjICoqMS4zIEJp4buDdSDEkOG7kyAzOiBCaeG7g3UgxJDhu5MgxJDGsOG7nW5nIFPhu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nIFRoZW8gTmfDoHkqKg0KDQpgYGB7cn0NCmdncGxvdChodHAsIGFlcyh4PU5HQVlEQVRIQU5HLCB5PVNPTFVPTkdEQVRIQU5HKSkgKw0KICBnZW9tX2xpbmUoY29sb3I9J25hdnknLCBzaXplPTEpICsNCiAgbGFicyh4PSdOZ8OgeSDEkOG6t3QgSMOgbmcnLCB5PSdT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZycsIHRpdGxlPSdT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZyBUaGVvIE5nw6B5JykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHRoZW8gZMO1aSB4dSBoxrDhu5tuZyBtdWEgc+G6r20gdGhlbyB0aOG7nWkgZ2lhbiwgY8OzIHRo4buDIHBow6F0IGhp4buHbiBjw6FjIMSR4bujdCB0xINuZyB0csaw4bufbmcgaG/hurdjIGdp4bqjbSBnacOhIMSR4bq3dCBow6BuZy4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyDEkcaw4budbmcgdGjhu4MgaGnhu4duIHPhu7EgYmnhur9uIMSR4buZbmcgY+G7p2Egc+G7kSBsxrDhu6NuZyDEkeG6t3QgaMOgbmcgdGhlbyBuZ8OgeS4gQuG6oW4gY8OzIHRo4buDIHF1YW4gc8OhdCB4dSBoxrDhu5tuZyB0xINuZyBnaeG6o20gY+G7p2Egc+G7kSBsxrDhu6NuZyDEkeG6t3QgaMOgbmcgdHJvbmcgdGjhu51pIGdpYW4gdsOgIG5o4bqtbiBiaeG6v3QgY8OhYyDEkWnhu4NtIG5o4bqlbiBxdWFuIHRy4buNbmcuDQoNCiMjIyAqKjEuNCBCaeG7g3UgxJDhu5MgNDogQmnhu4N1IMSQ4buTIFNjYXR0ZXIgR2nhu69hIEdpw6EgQsOhbiB2w6AgU+G7kSBMxrDhu6NuZyDEkOG6t3QgSMOgbmcqKg0KDQpgYGB7ciBzY2F0dGVyX3Bsb3QsIGVjaG89RkFMU0V9DQpwbG90KGh0cCRHSUFCQU4sIGh0cCRTT0xVT05HREFUSEFORywgY29sPSduYXZ5JywgcGNoPTE2LCBtYWluPSdTY2F0dGVyIEdp4buvYSBHacOhIELDoW4gdsOgIFPhu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nJywNCiAgICAgeGxhYj0nR2nDoSBCw6FuJywgeWxhYj0nU+G7kSBMxrDhu6NuZyDEkOG6t3QgSMOgbmcnKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHjDoWMgxJHhu4tuaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiB2w6Agc+G7kSBsxrDhu6NuZyDEkeG6t3QgaMOgbmcsIGPDsyB0aOG7gyBwaMOhdCBoaeG7h24geHUgaMaw4bubbmcgZ2nDoSDhuqNuaCBoxrDhu59uZyDEkeG6v24gbeG7qWMgxJHhu5kgYsOhbiBow6BuZy4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBwaMOibiB0w6FuIChzY2F0dGVyIHBsb3QpIGhp4buDbiB0aOG7iyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiB2w6Agc+G7kSBsxrDhu6NuZyDEkeG6t3QgaMOgbmcuIA0KDQpDw6FjIMSRaeG7g20gdHLDqm4gYmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBnacOhIHRy4buLIGPhu6dhIGPhurdwIGJp4bq/biB0xrDGoW5nIOG7qW5nLiBO4bq/dSBjw7MgeHUgaMaw4bubbmcgaG/hurdjIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/biwgYuG6oW4gY8OzIHRo4buDIHF1YW4gc8OhdCDEkcaw4bujYyB04burIGJp4buDdSDEkeG7kyBuw6B5Lg0KDQojIyMgKioxLjUgQmnhu4N1IMSQ4buTIDU6IEJp4buDdSDEkOG7kyBCb3hwbG90IFPhu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nIFRoZW8gVHLhuqFuZyBUaMOhaSDEkMahbiBIw6BuZyoqDQoNCg0KYGBge3J9DQpib3hwbG90KGh0cCRTT0xVT05HREFUSEFORyB+IGh0cCRUUkFOR1RIQUksIGNvbD0nbmF2eScsIG1haW49J0JveHBsb3QgU+G7kSBMxrDhu6NuZyDEkOG6t3QgSMOgbmcgVGhlbyBUcuG6oW5nIFRow6FpIMSQxqFuIEjDoG5nJywNCiAgICAgICAgeGxhYj0nVHLhuqFuZyBUaMOhaSDEkMahbiBIw6BuZycsIHlsYWI9J1Phu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nJykNCg0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHNvIHPDoW5oIHBow6JuIHBo4buRaSBz4buRIGzGsOG7o25nIMSR4bq3dCBow6BuZyBnaeG7r2EgY8OhYyB0cuG6oW5nIHRow6FpIMSRxqFuIGjDoG5nIGtow6FjIG5oYXUuDQogDQpL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIGjhu5lwIHRo4buDIGhp4buHbiBwaMOibiBwaOG7kWkgdsOgIHPhu7EgYmnhur9uIMSR4buZbmcgY+G7p2Egc+G7kSBsxrDhu6NuZyDEkeG6t3QgaMOgbmcgdGhlbyB04burbmcgdHLhuqFuZyB0aMOhaSDEkcahbiBow6BuZy4gQ8OhYyBo4buZcCAoYm94KSBiaeG7g3UgdGjhu4sgcGjhuqFtIHZpIGdp4buvYSBjw6FjIHBo4bqnbiB0xrAgY+G7p2EgZOG7ryBsaeG7h3UsIHbDoCBjw6FjIMSRaeG7g20gbmdv4bqhaSBsYWkgY8OzIHRo4buDIMSRxrDhu6NjIHF1YW4gc8OhdCB04burIGJp4buDdSDEkeG7ky4gQmnhu4N1IMSR4buTIGjhu5lwIGdpw7pwIGLhuqFuIGPDsyBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbhu4EgcGjDom4gcGjhu5FpIHbDoCBwaMawxqFuZyBzYWkgY+G7p2EgZOG7ryBsaeG7h3UuDQoNCiMjIyAqKjEuNiBCaeG7g3UgxJDhu5MgNjogQmnhu4N1IMSQ4buTIFBpZWNoYXJ0IFThu4kgTOG7hyBUcuG6oW5nIFRow6FpIMSQxqFuIEjDoG5nKioNCg0KYGBge3J9DQpzdGF0dXNfY291bnRzIDwtIHRhYmxlKGh0cCRUUkFOR1RIQUkpDQpwaWUoc3RhdHVzX2NvdW50cywgbGFiZWxzPW5hbWVzKHN0YXR1c19jb3VudHMpLCBtYWluPSdU4buJIEzhu4cgVHLhuqFuZyBUaMOhaSDEkMahbiBIw6BuZycsIGNvbD1yYWluYm93KGxlbmd0aChzdGF0dXNfY291bnRzKSkpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KQmnhu4N1IMSR4buTIFBpZWNoYXJ0IGdpw7pwIGhp4buDbiB0aOG7iyB04buJIGzhu4cgcGjhuqduIHRyxINtIGPhu6dhIG3hu5dpIHRy4bqhbmcgdGjDoWkgxJHGoW4gaMOgbmcuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIHThu4kgbOG7hyBjw6FjIHRy4bqhbmcgdGjDoWkgxJHGoW4gaMOgbmcuIE3hu5dpIHBo4bqnbiB0csOybiDEkeG6oWkgZGnhu4duIGNobyBt4buZdCB0cuG6oW5nIHRow6FpLCB2w6AgZGnhu4duIHTDrWNoIGPhu6dhIHBo4bqnbiB0csOybiB0aOG7gyBoaeG7h24gdOG7iSBs4buHIHTGsMahbmcg4bupbmcgduG7m2kgc+G7kSBsxrDhu6NuZyDEkcahbiBow6BuZyDhu58gbeG7l2kgdHLhuqFuZyB0aMOhaS4gQmnhu4N1IMSR4buTIHRyw7JuIHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyB0aOG7gyBoaeG7h24gc+G7sSBwaMOibiBi4buRIHBo4bqnbiB0csSDbSBob+G6t2MgdOG7iSBs4buHIGPhu6dhIGPDoWMgcGjhuqduIGPhu6dhIG3hu5l0IHRvw6BuIGLhu5kuDQoNCiMjIyAqKjEuNyBCaeG7g3UgxJDhu5MgU+G7kSBMxrDhu6NuZyDEkOG6t3QgSMOgbmcgVGhlbyBRdeG7kWMgR2lhKioNCg0KDQpgYGB7ciwgZWNobyA9IFRSVUV9DQpnZ3Bsb3QoaHRwLCBhZXMoeD1RVU9DR0lBKSkgKw0KICBnZW9tX2JhcihmaWxsPSduYXZ5JykgKw0KICBsYWJzKHg9J1F14buRYyBHaWEnLCB5PSdT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZycsIHRpdGxlPSdT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZyBUaGVvIFF14buRYyBHaWEnKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgc28gc8Ohbmggc+G7kSBsxrDhu6NuZyDEkeG6t3QgaMOgbmcgZ2nhu69hIGPDoWMgcXXhu5FjIGdpYSBraMOhYyBuaGF1Lg0KDQpL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIMSR4bq3dCBow6BuZyB0aGVvIHThu6tuZyBxdeG7kWMgZ2lhLiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBi4bqhbiBjw7MgY8OhaSBuaMOsbiB04buVbmcgcXVhbiB24buBIHBow6JuIHBo4buRaSBj4bunYSDEkeG6t3QgaMOgbmcgdGhlbyBxdeG7kWMgZ2lhIHbDoCBuaOG6rW4gYmnhur90IHPhu7EgdOG6rXAgdHJ1bmcgxJHhurd0IGjDoG5nIOG7nyDEkcOidSBuaGnhu4F1IG5o4bqldC4NCg0KIyMjICoqMS44IEJp4buDdSDEkOG7kyA4OiBCaeG7g3UgxJDhu5MgUGjDom4gUGjhu5FpIEdpw6EgQsOhbioqDQoNCg0KYGBge3IgcHJpY2VfZGlzdHJpYnV0aW9uLCBlY2hvPUZBTFNFfQ0KaGlzdChodHAkR0lBQkFOLCBtYWluPSJQaMOibiBQaOG7kWkgR2nDoSBCw6FuIiwgeGxhYj0iR2nDoSBCw6FuIiwgY29sPSJuYXZ5IiwgYm9yZGVyPSJibGFjayIpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgaGnhu4N1IHLDtSBwaMOibiBwaOG7kWkgY+G7p2EgZ2nDoSBiw6FuLCBjw7MgdGjhu4MgcGjDoXQgaGnhu4duIGPDoWMgbeG7qWMgZ2nDoSBwaOG7lSBiaeG6v24gaG/hurdjIG5nb+G6oWkgbOG7hy4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBoaXN0b2dyYW0gaGnhu4NuIHRo4buLIHBow6JuIHBo4buRaSBj4bunYSBnacOhIGLDoW4uIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGLhuqFuIGPDsyBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbhu4EgcGjDom4gcGjhu5FpIGPhu6dhIGdpw6EgYsOhbiB0cm9uZyBk4buvIGxp4buHdSwgduG7m2kgY8OhYyB0aGFuaCBj4buZdCBiaeG7g3UgdGjhu4sgdOG6p24gc3XhuqV0IHh14bqldCBoaeG7h24gY+G7p2EgY8OhYyBraG/huqNuZyBnacOhIHRy4buLIGtow6FjIG5oYXUuDQoNCiMjIyAqKjEuOSBCaeG7g3UgxJDhu5MgOTogQmnhu4N1IMSQ4buTIEJveHBsb3QgxJDDoW5oIEdpw6EgU+G7kSBOZ8OgeSBUcsO0aSBRdWEgS+G7gyBU4burIMSQxqFuIEjDoG5nIEN14buRaSBDw7luZyoqDQoNCg0KYGBge3J9DQpnZ3Bsb3QoaHRwLCBhZXMoeD1OR0FZREFUSEFORywgeT1TT0xVT05HREFUSEFORywgY29sb3I9UVVPQ0dJQSkpICsNCiAgZ2VvbV9wb2ludChzaXplPTMpICsNCiAgbGFicyh4PSdOZ8OgeSDEkOG6t3QgSMOgbmcnLCB5PSdT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZycsIHRpdGxlPSdTY2F0dGVyIFPhu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nIFRoZW8gTmfDoHknKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgxJHDoW5oIGdpw6EgdGjhu51pIGdpYW4gZ2nhu69hIGPDoWMgxJHGoW4gaMOgbmcgdsOgIHBow6JuIHBo4buRaSBj4bunYSBuw7MuDQoNCiMjIyAqKjEuMTAgQmnhu4N1IMSQ4buTIDEwOiBCaeG7g3UgxJDhu5MgVHLDsm4gVOG7iSBM4buHIFPhu5EgxJDGoW4gSMOgbmcgVGhlbyBLw61jaCBUaMaw4bubYyDEkMahbioqDQoNCmBgYHtyfQ0Kb3JkZXJfc2l6ZV9jb3VudHMgPC0gdGFibGUoaHRwJFNJWkVET05IQU5HKQ0KcGllKG9yZGVyX3NpemVfY291bnRzLCBsYWJlbHM9bmFtZXMob3JkZXJfc2l6ZV9jb3VudHMpLCBtYWluPSdU4buJIEzhu4cgU+G7kSDEkMahbiBIw6BuZyBUaGVvIEvDrWNoIFRoxrDhu5tjIMSQxqFuJywNCiAgICBjb2w9cmFpbmJvdyhsZW5ndGgob3JkZXJfc2l6ZV9jb3VudHMpKSkNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQpCaeG7g3UgxJHhu5MgdHLDsm4gZ2nDunAgaGnhu4NuIHRo4buLIHBo4bqnbiB0csSDbSBz4buRIMSRxqFuIGjDoG5nIHRodeG7mWMgdsOgbyB04burbmcga8OtY2ggdGjGsOG7m2MgxJHGoW4uDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgcGjDom4gdMOhbiBoaeG7g24gdGjhu4sgc+G7sSBwaMOibiBi4buRIHPhu5EgbMaw4bujbmcgxJHhurd0IGjDoG5nIHRoZW8gbmfDoHksIHbDoCBt4buXaSDEkWnhu4NtIGPDsyBtw6B1IHPhuq9jIHBow6JuIGJp4buHdCB0xrDGoW5nIOG7qW5nIHbhu5tpIHF14buRYyBnaWEuIA0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBi4bqhbiBuaOG6rW4gYmnhur90IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbmfDoHkgxJHhurd0IGjDoG5nIHbDoCBz4buRIGzGsOG7o25nIMSR4bq3dCBow6BuZywgY8WpbmcgbmjGsCBz4buxIHTGsMahbmcgcXVhbiB0aGVvIHF14buRYyBnaWEuDQoNCiMjIyAqKjEuMTEgQmnhu4N1IMSQ4buTIDExOiBCaeG7g3UgxJDhu5MgU2NhdHRlciBHaeG7r2EgR2nDoSBCw6FuIHbDoCBEb2FuaCBUaHUqKg0KDQpgYGB7ciBzY2F0dGVyX3Bsb3RfcmV2ZW51ZSwgZWNobz1GQUxTRX0NCnBsb3QoaHRwJEdJQUJBTiwgaHRwJERPQU5IVEhVLCBjb2w9J25hdnknLCBwY2g9MTYsIG1haW49J1NjYXR0ZXIgR2nhu69hIEdpw6EgQsOhbiB2w6AgRG9hbmggVGh1JywNCiAgICAgeGxhYj0nR2nDoSBCw6FuJywgeWxhYj0nRG9hbmggVGh1JykNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCB4w6FjIMSR4buLbmggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBnacOhIGLDoW4gdsOgIGRvYW5oIHRodSwgY8OzIHRo4buDIHBow6F0IGhp4buHbiB4dSBoxrDhu5tuZyB0xINuZyB0csaw4bufbmcgZG9hbmggdGh1IHbhu5tpIGdpw6EgYsOhbi4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBwaMOibiB0w6FuIChzY2F0dGVyIHBsb3QpIGhp4buDbiB0aOG7iyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdpw6EgYsOhbiB2w6AgZG9hbmggdGh1LiBDw6FjIMSRaeG7g20gdHLDqm4gYmnhu4N1IMSR4buTIGJp4buDdSB0aOG7iyBnacOhIHRy4buLIGPhu6dhIGPhurdwIGJp4bq/biB0xrDGoW5nIOG7qW5nLiBO4bq/dSBjw7MgeHUgaMaw4bubbmcgaG/hurdjIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/biwgYuG6oW4gY8OzIHRo4buDIHF1YW4gc8OhdCDEkcaw4bujYyB04burIGJp4buDdSDEkeG7kyBuw6B5Lg0KDQojIyMgKioxLjEyIEJp4buDdSDEkOG7kyAxMjogQmnhu4N1IMSQ4buTIFBow6JuIFBo4buRaSBEb2FuaCBUaHUgVGhlbyBEw7JuZyBT4bqjbiBQaOG6qW0qKg0KDQpgYGB7cn0NCmdncGxvdChodHAsIGFlcyh4PURBTkhNVUNTQU5QSEFNLCB5PURPQU5IVEhVLCBmaWxsPURBTkhNVUNTQU5QSEFNKSkgKw0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsNCiAgbGFicyh4PSdEw7JuZyBT4bqjbiBQaOG6qW0nLCB5PSdU4buVbmcgRG9hbmggVGh1JywgdGl0bGU9J1Thu5VuZyBEb2FuaCBUaHUgVGhlbyBEw7JuZyBT4bqjbiBQaOG6qW0nKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgc28gc8OhbmggcGjDom4gcGjhu5FpIGRvYW5oIHRodSBnaeG7r2EgY8OhYyBkw7JuZyBz4bqjbiBwaOG6qW0ga2jDoWMgbmhhdS4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gdOG7lW5nIGRvYW5oIHRodSB0aGVvIHThu6tuZyBkw7JuZyBz4bqjbiBwaOG6qW0uIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGLhuqFuIG5ow6xuIG5o4bqtbiDEkcaw4bujYyBt4bupYyDEkeG7mSDEkcOzbmcgZ8OzcCBj4bunYSB04burbmcgZMOybmcgc+G6o24gcGjhuqltIHbDoG8gdOG7lW5nIGRvYW5oIHRodSB2w6Agc28gc8OhbmggZ2nhu69hIGNow7puZy4NCg0KIyMjICoqMS4xMyBCaeG7g3UgxJDhu5MgMTM6IEJp4buDdSDEkOG7kyBQaMOibiBQaOG7kWkgRG9hbmggVGh1IFRoZW8gRMOybmcgU+G6o24gUGjhuqltKioNCg0KYGBge3J9DQpnZ3Bsb3QoaHRwLCBhZXMoeD1EQU5ITVVDU0FOUEhBTSwgeT1ET0FOSFRIVSwgZmlsbD1EQU5ITVVDU0FOUEhBTSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHg9J0TDsm5nIFPhuqNuIFBo4bqpbScsIHk9J0RvYW5oIFRodScsIHRpdGxlPSdQaMOibiBQaOG7kWkgRG9hbmggVGh1IFRoZW8gRMOybmcgU+G6o24gUGjhuqltJykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCkJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIHNvIHPDoW5oIHBow6JuIHBo4buRaSBkb2FuaCB0aHUgZ2nhu69hIGPDoWMgZMOybmcgc+G6o24gcGjhuqltIGtow6FjIG5oYXUuDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgYm94cGxvdCB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIGRvYW5oIHRodSB0aGVvIHThu6tuZyBkw7JuZyBz4bqjbiBwaOG6qW0uIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGLhuqFuIGhp4buDdSB24buBIHBow6JuIHBo4buRaSBk4buvIGxp4buHdSwgxJFp4buDbSB0cnVuZyB0w6JtLCB2w6AgYmnhur9uIMSR4buZbmcgY+G7p2EgZG9hbmggdGh1IHRyb25nIHThu6tuZyBuaMOzbSBkw7JuZyBz4bqjbiBwaOG6qW0uDQoNCiMjIyAqKjEuMTQgQmnhu4N1IMSQ4buTIDE0OiBCaeG7g3UgxJDhu5MgUGjDom4gUGjhu5FpIFPhu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nIFRoZW8gS8OtY2ggVGjGsOG7m2MgxJDGoW4qKg0KDQpgYGB7ciBvcmRlcl9zaXplX2Rpc3RyaWJ1dGlvbiwgZWNobz1GQUxTRX0NCmdncGxvdChodHAsIGFlcyh4PVNJWkVET05IQU5HLCBmaWxsPVNJWkVET05IQU5HKSkgKw0KICBnZW9tX2JhcigpICsNCiAgbGFicyh4PSdLw61jaCBUaMaw4bubYyDEkMahbicsIHk9J1Phu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nJywgdGl0bGU9J1Bow6JuIFBo4buRaSBT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZyBUaGVvIEvDrWNoIFRoxrDhu5tjIMSQxqFuJykgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQpCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBoaeG7g24gdGjhu4sgcGjDom4gcGjhu5FpIHPhu5EgbMaw4bujbmcgxJHhurd0IGjDoG5nIHRoZW8ga8OtY2ggdGjGsOG7m2MgxJHGoW4sIGPDsyB0aOG7gyBwaMOhdCBoaeG7h24ga8OtY2ggdGjGsOG7m2MgxJHGoW4gcGjhu5UgYmnhur9uIG5o4bqldC4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcGjDom4gcGjhu5FpIHPhu5EgbMaw4bujbmcgxJHhurd0IGjDoG5nIHRoZW8ga8OtY2ggdGjGsOG7m2MgxJHGoW4uIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGLhuqFuIG5o4bqtbiBiaeG6v3QgbeG7qWMgxJHhu5kgxJHhurd0IGjDoG5nIHRyb25nIHThu6tuZyBrw61jaCB0aMaw4bubYyDEkcahbiB2w6Agc28gc8OhbmggZ2nhu69hIGNow7puZy4NCg0KIyMjICoqMS4xNSBCaeG7g3UgxJDhu5MgMTU6IEJp4buDdSDEkOG7kyDEkMaw4budbmcgRG9hbmggVGh1IFRoZW8gTmfDoHkqKg0KDQpgYGB7cn0NCmdncGxvdChodHAsIGFlcyh4PU5HQVlEQVRIQU5HLCB5PURPQU5IVEhVKSkgKw0KICBnZW9tX2xpbmUoY29sb3I9J25hdnknLCBzaXplPTEpICsNCiAgbGFicyh4PSdOZ8OgeSDEkOG6t3QgSMOgbmcnLCB5PSdEb2FuaCBUaHUnLCB0aXRsZT0nRG9hbmggVGh1IFRoZW8gTmfDoHknKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KKiAqKkdp4bqjaSBUaMOtY2ggS+G6v3QgUXXhuqM6KioNCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgdGhlbyBkw7VpIHh1IGjGsOG7m25nIGRvYW5oIHRodSB0aGVvIG5nw6B5LCBjw7MgdGjhu4MgcGjDoXQgaGnhu4duIGPDoWMgxJHhu6N0IHTEg25nIHRyxrDhu59uZyBob+G6t2MgZ2nhuqNtIGdpw6EgxJHhurd0IGjDoG5nLg0KDQpL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIMSRxrDhu51uZyB0aOG7gyBoaeG7h24gYmnhur9uIMSR4buZbmcgY+G7p2EgZG9hbmggdGh1IHRoZW8gbmfDoHkgxJHhurd0IGjDoG5nLiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBi4bqhbiB0aGVvIGTDtWkgeHUgaMaw4bubbmcgdMSDbmcgZ2nhuqNtIGPhu6dhIGRvYW5oIHRodSB0cm9uZyBraG/huqNuZyB0aOG7nWkgZ2lhbiBuaOG6pXQgxJHhu4tuaCB2w6Agbmjhuq1uIGJp4bq/dCBjw6FjIMSRaeG7g20gbuG7lWkgYuG6rXQuDQoNCiMjIyAqKjEuMTYgQmnhu4N1IMSQ4buTIDE2OiBCaeG7g3UgxJDhu5MgUGllY2hhcnQgVOG7iSBM4buHIEvDrWNoIFRoxrDhu5tjIMSQxqFuIEjDoG5nKioNCg0KYGBge3J9DQpvcmRlcl9zaXplX3BlcmNlbnRhZ2UgPC0gcHJvcC50YWJsZSh0YWJsZShodHAkU0laRURPTkhBTkcpKQ0KcGllKG9yZGVyX3NpemVfcGVyY2VudGFnZSwgbGFiZWxzPW5hbWVzKG9yZGVyX3NpemVfcGVyY2VudGFnZSksDQogICAgbWFpbj0nVOG7iSBM4buHIEvDrWNoIFRoxrDhu5tjIMSQxqFuIEjDoG5nJywgY29sPXJhaW5ib3cobGVuZ3RoKG9yZGVyX3NpemVfcGVyY2VudGFnZSkpKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCkJp4buDdSDEkeG7kyBQaWVjaGFydCBnacO6cCBoaeG7g24gdGjhu4sgdOG7iSBs4buHIHBo4bqnbiB0csSDbSBj4bunYSBt4buXaSBrw61jaCB0aMaw4bubYyDEkcahbiBow6BuZy4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBwaWUgY2hhcnQgdGjhu4MgaGnhu4duIHThu7cgbOG7hyBwaOG6p24gdHLEg20gY+G7p2EgdOG7q25nIGvDrWNoIHRoxrDhu5tjIMSRxqFuIGjDoG5nLiBCaeG7g3UgxJHhu5MgbsOgeSBnacO6cCBi4bqhbiBk4buFIGTDoG5nIG5o4bqtbiBiaeG6v3QgcGjhuqduIHRyxINtIMSRw7NuZyBnw7NwIGPhu6dhIHThu6tuZyBrw61jaCB0aMaw4bubYyDEkcahbiBow6BuZyB2w6BvIHThu5VuZyBz4buRIMSRxqFuIGjDoG5nLg0KDQojIyMgKioxLjE3IEJp4buDdSDEkOG7kyAxNzogQmnhu4N1IMSQ4buTIEPhu5l0IEvDrWNoIFRoxrDhu5tjIMSQxqFuIEjDoG5nIFRoZW8gRMOybmcgU+G6o24gUGjhuqltKioNCg0KYGBge3J9DQpnZ3Bsb3QoaHRwLCBhZXMoeD1EQU5ITVVDU0FOUEhBTSwgZmlsbD1TSVpFRE9OSEFORykpICsNCiAgZ2VvbV9iYXIocG9zaXRpb249J2RvZGdlJykgKw0KICBsYWJzKHg9J0TDsm5nIFPhuqNuIFBo4bqpbScsIHk9J1Phu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nJywgdGl0bGU9J0vDrWNoIFRoxrDhu5tjIMSQxqFuIEjDoG5nIFRoZW8gRMOybmcgU+G6o24gUGjhuqltJykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCkJp4buDdSDEkeG7kyBj4buZdCBuw6B5IHNvIHPDoW5oIGvDrWNoIHRoxrDhu5tjIMSRxqFuIGjDoG5nIGdp4buvYSBjw6FjIGTDsm5nIHPhuqNuIHBo4bqpbS4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyDEkeG6t3QgaMOgbmcgdGhlbyB04burbmcga8OtY2ggdGjGsOG7m2MgxJHGoW4gaMOgbmcsIHBow6JuIGxv4bqhaSB0aGVvIGTDsm5nIHPhuqNuIHBo4bqpbS4gQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgYuG6oW4gc28gc8OhbmggbeG7qWMgxJHhu5kgxJHhurd0IGjDoG5nIGPhu6dhIHThu6tuZyBkw7JuZyBz4bqjbiBwaOG6qW0gdGhlbyBrw61jaCB0aMaw4bubYyDEkcahbiBow6BuZy4NCg0KIyMjICoqMS4xOCBCaeG7g3UgxJDhu5MgMTk6IEJp4buDdSDEkOG7kyDEkOG7mW5nIERvYW5oIFRodSBUaGVvIE5nw6B5IHbDoCBEw7JuZyBT4bqjbiBQaOG6qW0qKg0KDQpgYGB7cn0NCmh0cCAlPiUNCiAgZ2dwbG90KGFlcyh4PU5HQVlEQVRIQU5HLCB5PURPQU5IVEhVLCBncm91cD1EQU5ITVVDU0FOUEhBTSwgY29sb3I9REFOSE1VQ1NBTlBIQU0pKSArDQogIGdlb21fbGluZShzaXplPTEpICsNCiAgbGFicyh4PSdOZ8OgeSDEkOG6t3QgSMOgbmcnLCB5PSdEb2FuaCBUaHUnLCB0aXRsZT0nRG9hbmggVGh1IFRoZW8gTmfDoHkgdsOgIETDsm5nIFPhuqNuIFBo4bqpbScpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQoqICoqR2nhuqNpIFRow61jaCBL4bq/dCBRdeG6ozoqKg0KDQpCaeG7g3UgxJHhu5MgxJHhu5luZyBuw6B5IHRo4buDIGhp4buHbiBz4buxIHRoYXkgxJHhu5VpIGPhu6dhIGRvYW5oIHRodSB0aGVvIG5nw6B5IHbDoCBkw7JuZyBz4bqjbiBwaOG6qW0uDQoNCkvhur90IHF14bqjIGzDoCBt4buZdCBiaeG7g3UgxJHhu5MgxJHGsOG7nW5nIHRo4buDIGhp4buHbiBiaeG6v24gxJHhu5luZyBj4bunYSBkb2FuaCB0aHUgdGhlbyBuZ8OgeSDEkeG6t3QgaMOgbmcsIHBow6JuIGxv4bqhaSB0aGVvIGTDsm5nIHPhuqNuIHBo4bqpbS4gQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgYuG6oW4gdGhlbyBkw7VpIHh1IGjGsOG7m25nIHTEg25nIGdp4bqjbSBj4bunYSBkb2FuaCB0aHUgdGhlbyBuZ8OgeSB2w6Agc28gc8OhbmggZ2nhu69hIGPDoWMgZMOybmcgc+G6o24gcGjhuqltLg0KDQojIyMgKioxLjE5IEJp4buDdSDEkOG7kyAxOTogQmnhu4N1IMSQ4buTIEPhu5l0IERvYW5oIFRodSBUaGVvIFF14buRYyBHaWEqKg0KDQpgYGB7cn0NCmdncGxvdChodHAsIGFlcyh4PVFVT0NHSUEsIHk9RE9BTkhUSFUsIGZpbGw9UVVPQ0dJQSkpICsNCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArDQogIGxhYnMoeD0nUXXhu5FjIEdpYScsIHk9J0RvYW5oIFRodScsIHRpdGxlPSdEb2FuaCBUaHUgVGhlbyBRdeG7kWMgR2lhJykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCkJp4buDdSDEkeG7kyBj4buZdCBuw6B5IHRo4buDIGhp4buHbiBkb2FuaCB0aHUgdGhlbyBxdeG7kWMgZ2lhLCBnacO6cCBzbyBzw6FuaCBoaeG7h3Ugc3XhuqV0IGLDoW4gaMOgbmcgZ2nhu69hIGPDoWMgcXXhu5FjIGdpYS4NCg0KS+G6v3QgcXXhuqMgbMOgIG3hu5l0IGJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gZG9hbmggdGh1IHRoZW8gdOG7q25nIHF14buRYyBnaWEuIEJp4buDdSDEkeG7kyBuw6B5IGdpw7pwIGLhuqFuIHNvIHPDoW5oIGRvYW5oIHRodSBnaeG7r2EgY8OhYyBxdeG7kWMgZ2lhIGtow6FjIG5oYXUgdsOgIG5ow6xuIG5o4bqtbiBt4bupYyDEkeG7mSDEkcOzbmcgZ8OzcCBj4bunYSB04burbmcgcXXhu5FjIGdpYSB2w6BvIHThu5VuZyBkb2FuaCB0aHUuDQoNCiMjIyAqKjEuMjAgQmnhu4N1IMSQ4buTIDIxOiBCaeG7g3UgxJDhu5MgU2NhdHRlciBHaeG7r2EgR2nDoSBCw6FuIHbDoCBT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZyoqDQoNCmBgYHtyfQ0KZ2dwbG90KGh0cCwgYWVzKHg9R0lBQkFOLCB5PVNPTFVPTkdEQVRIQU5HLCBjb2xvcj1EQU5ITVVDU0FOUEhBTSkpICsNCiAgZ2VvbV9wb2ludChzaXplPTMpICsNCiAgbGFicyh4PSdHacOhIELDoW4nLCB5PSdT4buRIEzGsOG7o25nIMSQ4bq3dCBIw6BuZycsIHRpdGxlPSdTY2F0dGVyIEdp4buvYSBHacOhIELDoW4gdsOgIFPhu5EgTMaw4bujbmcgxJDhurd0IEjDoG5nJykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiogKipHaeG6o2kgVGjDrWNoIEvhur90IFF14bqjOioqDQoNCkJp4buDdSDEkeG7kyBzY2F0dGVyIG7DoHkgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZ2nDoSBiw6FuIHbDoCBz4buRIGzGsOG7o25nIMSR4bq3dCBow6BuZywgY8OzIHRo4buDIHBow6F0IGhp4buHbiB4dSBoxrDhu5tuZyBob+G6t2MgdMawxqFuZyBxdWFuIGdp4buvYSBjw6FjIGJp4bq/biBuw6B5Lg0KDQpL4bq/dCBxdeG6oyBsw6AgbeG7mXQgYmnhu4N1IMSR4buTIHNjYXR0ZXIgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZ2nDoSBiw6FuIHbDoCBz4buRIGzGsOG7o25nIMSR4bq3dCBow6BuZywgduG7m2kgbeG7l2kgxJFp4buDbSBtw6B1IHPhuq9jIHRoZW8gZMOybmcgc+G6o24gcGjhuqltLiANCg0KQmnhu4N1IMSR4buTIG7DoHkgZ2nDunAgYuG6oW4gbmjhuq1uIGJp4bq/dCB4dSBoxrDhu5tuZyBnaeG7r2EgZ2nDoSB2w6Agc+G7kSBsxrDhu6NuZyDEkeG6t3QgaMOgbmcgY8WpbmcgbmjGsCBzbyBzw6FuaCBnaeG7r2EgY8OhYyBkw7JuZyBz4bqjbiBwaOG6qW0uDQoNCg==