Phần 1. TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1. Đọc file dữ liệu

d <- read.csv("C:/Users/PC/OneDrive/Máy tính/TMT/Thực Hành.csv")

Bộ dữ liệu gồm 1.000 quan sát, mỗi quan sát tương ứng với một sinh viên, ghi nhận toàn diện các khía cạnh trong thói quen sinh hoạt hàng ngày gắn liền với quá trình học tập. Các biến được thu thập bao gồm thời gian học mỗi ngày, thời lượng ngủ, mức độ sử dụng mạng xã hội, chất lượng chế độ ăn uống, tần suất vận động thể chất, mức độ căng thẳng, và đánh giá sức khỏe tinh thần. Ngoài ra, dữ liệu còn bao gồm thông tin cá nhân cơ bản như giới tính và năm học. Biến kết quả là điểm thi cuối kỳ, được sử dụng để phản ánh hiệu suất học tập của từng sinh viên. Dữ liệu có cấu trúc rõ ràng, đầy đủ, không chứa giá trị thiếu và phù hợp cho các phân tích định lượng chuyên sâu.

2. Cấu trúc bộ dữ liệu

Bộ dữ liệu Thực hành chứa tổng cộng 1000 bản ghi với 16 biến đặc trưng.

str(d)
## 'data.frame':    1000 obs. of  16 variables:
##  $ student_id                   : chr  "S1000" "S1001" "S1002" "S1003" ...
##  $ age                          : int  23 20 21 23 19 24 21 21 23 18 ...
##  $ gender                       : chr  "Female" "Male" "Female" "Female" ...
##  $ study_hours_per_day          : num  0 6.9 1.4 1 5 7.2 5.6 4.3 4.4 4.8 ...
##  $ social_media_hours           : num  1.2 2.8 3.1 3.9 4.4 1.3 1.5 1 2.2 3.1 ...
##  $ netflix_hours                : num  1.1 2.3 1.3 1 0.5 0 1.4 2 1.7 1.3 ...
##  $ part_time_job                : chr  "No" "No" "No" "No" ...
##  $ attendance_percentage        : num  85 97.3 94.8 71 90.9 82.9 85.8 77.7 100 95.4 ...
##  $ sleep_hours                  : num  8 4.6 8 9.2 4.9 7.4 6.5 4.6 7.1 7.5 ...
##  $ diet_quality                 : chr  "Fair" "Good" "Good" "Fair" ...
##  $ exercise_frequency           : int  6 6 1 4 3 1 2 0 3 5 ...
##  $ parental_education_level     : chr  "Master" "High School" "High School" "Master" ...
##  $ internet_quality             : chr  "Average" "Average" "Fair" "Good" ...
##  $ mental_health_rating         : int  8 8 1 1 1 4 4 8 1 10 ...
##  $ extracurricular_participation: chr  "Yes" "No" "No" "Yes" ...
##  $ exam_score                   : num  56.2 100 34.3 26.8 66.4 100 89.8 72.6 78.9 100 ...

Các biến trong bộ dữ liệu bao gồm:

  • student_id: mã sinh viên, dạng chuỗi ký tự (mỗi sinh viên có một mã duy nhất).

  • age: tuổi sinh viên, kiểu số nguyên.

  • gender: giới tính, lưu dưới dạng ký tự (“Male”, “Female”).

  • study_hours_per_day: số giờ học mỗi ngày, kiểu số thực.

  • social_media_hours: thời gian sử dụng mạng xã hội trung bình mỗi ngày, kiểu số thực.

  • netflix_hours: số giờ xem Netflix hoặc các nền tảng tương tự mỗi ngày, kiểu số thực.

  • part_time_job: sinh viên có đi làm thêm không, kiểu ký tự (“Yes” hoặc “No”).

  • attendance_percentage: tỷ lệ chuyên cần đến lớp (tính theo %), kiểu số thực.

  • sleep_hours: số giờ ngủ trung bình mỗi ngày, kiểu số thực.

  • diet_quality: chất lượng chế độ ăn uống, kiểu ký tự (“Good”, “Fair”).

  • exercise_frequency: tần suất tập thể dục mỗi tuần, kiểu số nguyên.

  • parental_education_level: trình độ học vấn cao nhất của phụ huynh, kiểu ký tự (“None”, “High School”, “Bachelor”, “Master”).

  • internet_quality: chất lượng kết nối Internet tại nơi ở, kiểu ký tự (“Average”, “Good”).

  • mental_health_rating: đánh giá sức khỏe tâm thần theo thang điểm (ví dụ: từ 1 đến 10), kiểu số nguyên.

  • extracurricular_participation: sinh viên có tham gia hoạt động ngoại khóa không, kiểu ký tự (“Yes” hoặc “No”).

  • exam_score: điểm bài thi cuối kỳ, kiểu số thực.

3. Chọn các biến định tính

dldt <- c("gender", "part_time_job", "diet_quality", "parental_education_level", "internet_quality","extracurricular_participation")
dt <- d[, dldt]

5. Kiểm tra một vài dữ liệu

head(dt)
##   gender part_time_job diet_quality parental_education_level internet_quality
## 1 Female            No         Fair                   Master          Average
## 2   Male            No         Good              High School          Average
## 3 Female            No         Good              High School             Fair
## 4 Female            No         Fair                   Master             Good
## 5 Female            No         Fair                   Master             Good
## 6   Male            No         Fair                   Master          Average
##   extracurricular_participation
## 1                           Yes
## 2                            No
## 3                            No
## 4                           Yes
## 5                            No
## 6                            No
tail(dt)
##      gender part_time_job diet_quality parental_education_level
## 995  Female            No         Good              High School
## 996  Female            No         Fair              High School
## 997  Female           Yes         Fair              High School
## 998    Male            No         Good                 Bachelor
## 999    Male           Yes         Fair                 Bachelor
## 1000 Female            No         Good                 Bachelor
##      internet_quality extracurricular_participation
## 995           Average                            No
## 996              Good                           Yes
## 997           Average                           Yes
## 998              Good                           Yes
## 999           Average                            No
## 1000          Average                            No

6. Kiểm tra NA

any(is.na(dt))
## [1] FALSE

Kết quả thu được sau khi kiểm tra “False” ta có thể nói không có giá trị Na trong dữ liệu.

7. Kiểm tra kiểu dữ liệu và đổi về factor

# Kiểm tra kiểu dữ liệu của từng biến trong dldt
sapply(dt, class) 
##                        gender                 part_time_job 
##                   "character"                   "character" 
##                  diet_quality      parental_education_level 
##                   "character"                   "character" 
##              internet_quality extracurricular_participation 
##                   "character"                   "character"

Kết quả kiểm tra kiểu dữ liệu ban đầu cho thấy các biến gender, part_time_job, diet_quality, parental_education_level, internet_qualityextracurricular_participation đều đang ở kiểu “character”, tức là chuỗi ký tự. Đây là dấu hiệu cho thấy dữ liệu chưa được xử lý đúng kiểu, đặc biệt khi các biến này đều mang tính phân loại.

Cụ thể, gender là biến định tính nên cần được chuyển sang kiểu factor để phục vụ cho phân tích thống kê theo nhóm giới tính. Các biến nhị phân như part_time_jobextracurricular_participation cũng nên chuyển thành factor với hai mức “Yes” và “No”. Đối với các biến có thứ tự như diet_quality, internet_qualityparental_education_level, việc chuyển sang kiểu ordered factor là cần thiết nhằm thể hiện đúng bản chất của dữ liệu và cho phép áp dụng các phương pháp phân tích thứ bậc.

Nếu các biến phân loại này vẫn giữ ở dạng chuỗi ký tự, quá trình phân tích sau này sẽ gặp nhiều hạn chế, đặc biệt trong việc trực quan hóa, tính toán tần suất, hoặc xây dựng mô hình học máy. Do đó, việc chuyển đổi đúng kiểu dữ liệu là một bước tiền xử lý quan trọng, góp phần đảm bảo tính chính xác và hiệu quả của toàn bộ quy trình phân tích.

dt <- data.frame(lapply(dt, as.factor))

Phần 2. PHÂN TÍCH MÔ TẢ MỘT BIẾN ĐỊNH TÍNH

2.1. Biến Gender

Bảng tần suất

#Lập bảng tần suất của biến Gender
table(dt$gender)/sum(nrow(dt))
## 
## Female   Male 
##  0.522  0.478

Bảng tần số

#Lập bảng tần số biến Gender
table(dt$gender)
## 
## Female   Male 
##    522    478
  • Vậy trong bộ dữ liệu này có 52.2 % nữ và 47.8% nam.

Biểu đồ

# Vẽ biểu đồ tròn
pie(table(dt$gender) ,
    main   = "Tỷ lệ giới tính",
    labels = paste0(names(table(dt$gender)),
                    " (", round(table(dt$gender)/sum(nrow(dt)) *100, 1), "%)"),
    col    = c("blue", "red"))

Biểu đồ trên phản ánh cơ cấu giới tính của sinh viên trong tập dữ liệu khảo sát. Kết quả cho thấy:

  • Sinh viên nữ (Female) chiếm tỷ lệ 52.2%

  • Sinh viên nam (Male) chiếm 47.8%

Tỷ lệ chênh lệch giữa hai nhóm không quá lớn, tuy nhiên có thể thấy nữ giới chiếm ưu thế nhẹ trong tổng thể mẫu. Điều này phần nào phản ánh sự hiện diện ngày càng đông đảo của nữ sinh trong môi trường giáo dục.

2.2. Biến Part time job

Bảng tần suất

#Lập bảng tần suất của biến part_time_job
table(dt$part_time_job)/sum(nrow(dt))
## 
##    No   Yes 
## 0.785 0.215

Bảng tần số

#Lập bảng tần số biến part_time_job
table(dt$part_time_job)
## 
##  No Yes 
## 785 215

Vậy trong data này có 78.5% sinh viên không đi làm thêm và 21.5% sinh viên đi làm thêm

Biểu đồ

# Vẽ biểu đồ tròn
pie(table(dt$part_time_job) ,
    main   = "Sinh viên có việc làm partime",
    labels = paste0(names(table(dt$part_time_job)),
                    " (", round(table(dt$part_time_job)/sum(nrow(dt)) *100, 1), "%)"),
    col    = c("lightgreen", "lightcoral"))

Biểu đồ tròn thể hiện tỷ lệ sinh viên có việc làm part-time. Theo biểu đồ, phần lớn sinh viên không có việc làm part-time, chiếm tỷ lệ 78.5%. Trong khi đó, chỉ có 21.5% sinh viên đang làm thêm ngoài giờ học. Sự chênh lệch đáng kể này cho thấy đa số sinh viên vẫn ưu tiên việc học hơn là đi làm thêm, hoặc có thể gặp khó khăn trong việc tìm việc làm phù hợp với lịch học.

2.3. Biến Diet Quality

Bảng tần suất

#Lập bảng tần suất của biến diet_quality
table(dt$diet_quality)/sum(nrow(dt))
## 
##  Fair  Good 
## 0.583 0.417

Bảng tần số

#Lập bảng tần số biến diet_quality
table(dt$diet_quality)
## 
## Fair Good 
##  583  417

Biểu đồ

library(ggplot2)

# Tạo bảng tần số để vẽ nhãn
freq_table <- as.data.frame(table(dt$diet_quality))
colnames(freq_table) <- c("diet_quality", "frequency")

# Vẽ biểu đồ
ggplot(freq_table, aes(x = diet_quality, y = frequency, fill = diet_quality)) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = frequency), vjust = -0.3, size = 4) +  # Nhãn ghi chú
  scale_fill_manual(values = c("Fair" = "#FFD700", "Good" = "#32CD32")) +  
  labs(title = "Biểu đồ tần chất lượng chế độ ăn uống của sinh viên",
       x = "Chất lượng chế độ ăn uống",
       y = "Tần số") +
  theme_minimal() +
  theme(legend.position = "none") 

Biểu đồ trên thể hiện tần suất đánh giá chất lượng chế độ ăn uống của sinh viên theo hai mức độ: Fair (Khá), Good (Tốt).

  • Mức Fair chiếm tỷ lệ cao nhất với 583 sinh viên, cho thấy phần lớn sinh viên cho rằng chế độ ăn của họ ở mức tạm ổn nhưng chưa thực sự tốt.

  • Mức Good có 417 sinh viên đánh giá phản ánh một nhóm đáng kể sinh viên có chế độ ăn uống tương đối tốt.

Từ kết quả này, có thể thấy rằng đa số sinh viên chưa có chế độ ăn uống đạt chất lượng. Điều này đặt ra yêu cầu cần nâng cao nhận thức dinh dưỡng trong sinh viên, đồng thời có thể cân nhắc các giải pháp hỗ trợ bữa ăn hợp lý tại trường học nhằm cải thiện sức khỏe và hiệu quả học tập.

2.4. Biến Parental Education Level

Bảng tần suất

#Lập bảng tần suất của biến parental_education_level
table(dt$parental_education_level)/sum(nrow(dt))
## 
##    Bachelor High School      Master        None 
##       0.350       0.392       0.167       0.091

Bảng tần số

#Lập bảng tần số biến parental_education_level
table(dt$parental_education_level)
## 
##    Bachelor High School      Master        None 
##         350         392         167          91

Biểu đồ

library(ggplot2)

# Tạo bảng tần số
freq_table <- as.data.frame(table(dt$parental_education_level))
colnames(freq_table) <- c("parental_education_level", "frequency")

# Vẽ biểu đồ
ggplot(freq_table, aes(x = parental_education_level, y = frequency, fill = parental_education_level)) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = frequency), vjust = -0.3, size = 4) +
  scale_fill_manual(values = c("None" = "#FF9999",
                               "High School" = "#99CCFF",
                               "Bachelor" = "#66C2A5",
                               "Master" = "#FFD700")) +
  labs(title = "Biểu đồ thể hiện học vấn của Phụ Huynh",
       x = "Trình độ học vấn của cha mẹ",
       y = "Tần số") +
  theme_minimal() +
  theme(legend.position = "none")

Biểu đồ cho thấy sự phân bố trình độ học vấn của phụ huynh trong bộ dữ liệu khảo sát. Trong đó, phần lớn phụ huynh có trình độ học vấn từ bậc trung học phổ thông trở lên. Cụ thể, nhóm có trình độ trung học phổ thông chiếm tỷ lệ cao nhất với 392 người, theo sau là nhóm cử nhân với 350 người. Số lượng phụ huynh có trình độ thạc sĩ thấp hơn đáng kể, chỉ 167 người, trong khi nhóm không có trình độ học vấn chiếm tỷ lệ thấp nhất với 91 người. Sự chênh lệch này cho thấy nền tảng học vấn của phụ huynh phần lớn ở mức trung bình đến khá,

2.5. Biến Internet Quality

Bảng tần suất

#Lập bảng tần suất của biến internet_quality
table(dt$internet_quality)/sum(nrow(dt))
## 
## Average    Fair    Good 
##   0.391   0.127   0.482

Bảng tần số

#Lập bảng tần số biến internet_quality
table(dt$internet_quality)
## 
## Average    Fair    Good 
##     391     127     482

Biểu đồ

# Tạo bảng tần số để trực quan hóa
freq_table <- as.data.frame(table(dt$internet_quality))
colnames(freq_table) <- c("internet_quality", "frequency")

# Vẽ biểu đồ cột
ggplot(freq_table, aes(x = internet_quality, y = frequency, fill = internet_quality)) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = frequency), vjust = -0.3, size = 4) +
  scale_fill_manual(values = c("Poor" = "#FF9999",
                               "Average" = "#FFD700",
                               "Good" = "#66C2A5")) +
  labs(title = "Biểu đồ chất lượng kết nối Internet",
       x = "Chất lượng Internet",
       y = "Tần số") +
  theme_minimal() +
  theme(legend.position = "none")

Biểu đồ cho thấy đa số sinh viên được khảo sát có chất lượng kết nối Internet ở mức Good (tốt), chiếm 447 người, tiếp theo là mức Average (trung bình) với 391 người. Nhóm có chất lượng kết nối Poor (kém) chỉ có 162 người.

Điều này cho thấy phần lớn sinh viên được khảo sát có điều kiện học tập trực tuyến tương đối thuận lợi nhờ vào kết nối Internet ổn định. Tuy nhiên, vẫn còn một bộ phận không nhỏ (khoảng 16.7%) gặp khó khăn do kết nối kém, điều này có thể ảnh hưởng tiêu cực đến hiệu quả học tập và cần được xem xét để có giải pháp hỗ trợ phù hợp.

2.6. Biến Extracurricular Participation

Bảng tần suất

#Lập bảng tần suất của biến extracurricular_participation
table(dt$extracurricular_participation)/sum(nrow(dt))
## 
##    No   Yes 
## 0.682 0.318

Bảng tần số

#Lập bảng tần số biến extracurricular_participation
table(dt$extracurricular_participation)
## 
##  No Yes 
## 682 318

Biểu đồ

# Vẽ biểu đồ tròn
pie(table(dt$extracurricular_participation) ,
    main   = "Sinh viên tham gia hoạt động ngoại khóa",
    labels = paste0(names(table(dt$extracurricular_participation)),
                    " (", round(table(dt$extracurricular_participation)/sum(nrow(dt)) *100, 1), "%)"),
    col    = c("lightgreen", "lightcoral"))

Biểu đồ tròn thể hiện rằng chỉ có 31.8% sinh viên tham gia các hoạt động ngoại khóa, trong khi đó 68.2% không tham gia. Tỷ lệ sinh viên không tham gia khá cao, phản ánh thực trạng rằng phần lớn sinh viên chưa chủ động hoặc chưa có điều kiện tham gia các hoạt động bên ngoài lớp học. Điều này có thể xuất phát từ áp lực học tập, thiếu thông tin, hoặc thiếu động lực. Việc khuyến khích sinh viên tham gia nhiều hơn vào các hoạt động ngoại khóa là cần thiết vì đây là yếu tố quan trọng giúp rèn luyện kỹ năng mềm, xây dựng mối quan hệ xã hội và phát triển toàn diện.


Phần 3. ƯỚC LƯỢNG KHOẢNG VÀ KIỂM ĐỊNH GIẢ THUYẾT CHO TỶ LỆ (MỘT BIẾN)

3.1. Gender (Nữ)

Ước lượng khoảng tin cậy

# Số người nữ (gender = "Female") và tổng số quan sát
n_female <- sum(dt$gender == "Female")
n_total  <- nrow(dt)

# Tính khoảng tin cậy 95% và kiểm định giả thuyết với tỷ lệ kỳ vọng p = 0.5
test_female <- prop.test(n_female, n_total, p = 0.5, correct = FALSE)
test_female
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_female out of n_total, null probability 0.5
## X-squared = 1.936, df = 1, p-value = 0.1641
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4910153 0.5528164
## sample estimates:
##     p 
## 0.522
  • Tỷ lệ nữ trong dữ liệu là 0.522.

  • Khoảng tin cậy 95% cho tỷ lệ này là từ 0.491 đến 0.5528.

Kiểm định giả thuyết

Giả thuyết đặt ra như sau:

  • H₀: p = 0.5 (Tỷ lệ nữ là sinh viên gender là 50%)

  • H₁: p ≠ 0.5 (Tỷ lệ nữ là sinh viên gender khác 50%)

Kết quả kiểm định giả thuyết cho thấy p-value = 0.2295, lớn hơn mức ý nghĩa thông thường α = 0.05. Do đó, chúng ta không bác bỏ giả thuyết không (H₀), tức là chưa có đủ bằng chứng thống kê để khẳng định rằng tỷ lệ nữ trong tổng thể khác 50%.

Khoảng tin cậy 95% cho tỷ lệ nữ là từ 49.1% đến 55.3%, trong đó có chứa giá trị 50%. Điều này càng củng cố kết luận rằng sự khác biệt giữa tỷ lệ nữ trong mẫu (52.2%) và mức giả định 50% không đủ ý nghĩa thống kê — nhiều khả năng đây chỉ là kết quả của sự biến động ngẫu nhiên trong quá trình chọn mẫu.

Tóm lại: mặc dù tỷ lệ nữ quan sát được trong mẫu là 52.2%, nhưng với p-value lớn và khoảng tin cậy bao gồm 50%, chúng ta không thể kết luận rằng tỷ lệ nữ trong tổng thể khác biệt một cách có ý nghĩa thống kê so với 50%.

3.2. Part Time Job (Yes)

Ước lượng khoảng tin cậy

# Số người nữ (gender = "Female") và tổng số quan sát
n_yes <- sum(dt$part_time_job == "Yes")
n_total1  <- nrow(dt)

# Tính khoảng tin cậy 95% và kiểm định giả thuyết với tỷ lệ kỳ vọng p = 0.5
test_yes <- prop.test(n_yes, n_total1, p = 0.5, correct = FALSE)
test_yes
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_yes out of n_total1, null probability 0.5
## X-squared = 324.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.1906534 0.2415278
## sample estimates:
##     p 
## 0.215

Tỷ lệ chọn “Yes” trong mẫu là 0.215.

Khoảng tin cậy 95% cho tỷ lệ này là từ 0.1907 đến 0.2415.

Kiểm định giả thuyết

Giả thuyết kiểm định được đặt ra như sau:

  • H₀: p = 0.5 (Tỷ lệ sinh viên có việc “Yes” là 50%)

  • H₁: p ≠ 0.5 (Tỷ lệ sinh viên không có việc “Yes” khác 50%)

Kết quả kiểm định cho thấy p-value < 2.2e-16, nhỏ hơn rất nhiều so với mức ý nghĩa α = 0.05. Do đó, chúng ta bác bỏ giả thuyết không (H₀). Điều này cho thấy có đủ bằng chứng thống kê để kết luận rằng tỷ lệ chọn “Yes” trong tổng thể khác với 50%. Khoảng tin cậy 95% cho tỷ lệ chọn “Yes” là từ 19.07% đến 24.15%, không chứa giá trị 0.5, càng củng cố thêm việc bác bỏ H₀.

Tóm lại: Tỷ lệ chọn “Yes” trong mẫu là 21.5%. Với p-value rất nhỏ (p < 2.2e-16) và khoảng tin cậy không chứa 50%, kết quả cho thấy sự khác biệt so với tỷ lệ 50% là có ý nghĩa thống kê. Tỷ lệ này thấp hơn đáng kể so với mức giả định ban đầu, và không thể được xem là ngẫu nhiên.

3.2. Diet Quality (Good)

Ước lượng khoảng tin cậy

# Số người nữ (diet_quality = "Good") và tổng số quan sát
n_good <- sum(dt$diet_quality == "Good")
n_total2  <- nrow(dt)

# Tính khoảng tin cậy 95% và kiểm định giả thuyết với tỷ lệ kỳ vọng p = 0.5
test_good <- prop.test(n_good, n_total2, p = 0.5, correct = FALSE)
test_good
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_good out of n_total2, null probability 0.5
## X-squared = 27.556, df = 1, p-value = 1.526e-07
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3868147 0.4478205
## sample estimates:
##     p 
## 0.417

Tỷ lệ đánh giá “Good” trong mẫu là 0.417.

Khoảng tin cậy 95% cho tỷ lệ này là từ 0.3868 đến 0.4478.

Kiểm định giả thuyết

Giả thuyết được đặt ra như sau:

  • H₀: p = 0.5 (Tỷ lệ đánh giá “Good” là 50%)

  • H₁: p ≠ 0.5 (Tỷ lệ đánh giá “Good” khác 50%)

Kết quả kiểm định cho thấy p-value = 1.201e-14, nhỏ hơn rất nhiều so với mức ý nghĩa α = 0.05. Do đó, chúng ta bác bỏ giả thuyết không (H₀). Kết quả này chỉ ra rằng có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ đánh giá “Good” quan sát được trong mẫu và tỷ lệ giả định là 50%.

Khoảng tin cậy 95% cho tỷ lệ này là từ 38.7% đến 44.8%, không bao gồm 50%, càng củng cố thêm kết luận bác bỏ H₀.

Tóm lại: Tỷ lệ đánh giá “Good” trong mẫu là 41.7%. Với p-value rất nhỏ (1.526e-074) và khoảng tin cậy không chứa giá trị 50%, chúng ta có đủ bằng chứng thống kê để khẳng định rằng tỷ lệ đánh giá “Good” trong tổng thể khác một cách đáng kể so với 50%. Tỷ lệ này thấp hơn đáng kể so với mức kỳ vọng ban đầu, cho thấy xu hướng đánh giá “Good” không chiếm đa số trong tổng thể.

3.3. Extracurricular Pparticipation (Yes)

Ước lượng khoảng tin cậy

# Số người nữ (extracurricular_participation = "Yes") và tổng số quan sát
n_yes1 <- sum(dt$extracurricular_participation == "Yes")
n_total3  <- nrow(dt)

# Tính khoảng tin cậy 95% và kiểm định giả thuyết với tỷ lệ kỳ vọng p = 0.5
test_yes1 <- prop.test(n_yes1, n_total1, p = 0.5, correct = FALSE)
test_yes1
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_yes1 out of n_total1, null probability 0.5
## X-squared = 132.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2898795 0.3475134
## sample estimates:
##     p 
## 0.318

Tỷ lệ chọn “Yes” trong mẫu là 0.318.

Khoảng tin cậy 95% cho tỷ lệ này là từ 0.2899 đến 0.3475.

Kiểm định giả thuyết

Giả thuyết kiểm định:

  • H₀: p = 0.5 (Tỷ lệ chọn “Yes” là 50%)

  • H₁: p ≠ 0.5 (Tỷ lệ chọn “Yes” khác 50%)

Kết quả kiểm định cho thấy p-value < 2.2e-16, rất nhỏ so với mức ý nghĩa α = 0.05. Do đó, chúng ta bác bỏ giả thuyết không (H₀). Điều này cho thấy có bằng chứng thống kê mạnh mẽ rằng tỷ lệ chọn “Yes” khác với 50%.

Khoảng tin cậy 95% là từ 28.99% đến 34.75%, không chứa giá trị 50%, càng khẳng định sự khác biệt có ý nghĩa thống kê.

Tóm lại: Tỷ lệ chọn “Yes” trong mẫu là 31.8%. Với p-value cực nhỏ và khoảng tin cậy không chứa 50%, chúng ta có đủ bằng chứng để kết luận rằng tỷ lệ chọn “Yes” trong tổng thể thấp hơn đáng kể so với 50%. Đây không phải là kết quả ngẫu nhiên, mà là một sự khác biệt có ý nghĩa thống kê rõ rệt.


Phần 4. PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH

4.1. Gender và Part Time Job

4.1.1. Bảng tần số

# Bảng tần số chéo (cross-tabulation) giữa Gender và Part Time Job
table_gender_job <- table(dt$gender, dt$part_time_job)
table_gender_job
##         
##           No Yes
##   Female 417 105
##   Male   368 110
diff_count <- table_gender_job["Female", "Yes"] - table_gender_job["Male", "Yes"]
diff_not_owner_count <- table_gender_job["Female", "No"] - table_gender_job["Male", "No"]

cat("Nữ có việc nhiều hơn nam:", diff_count, "người\n")
## Nữ có việc nhiều hơn nam: -5 người
cat("Nữ không có việc nhiều hơn nam:", diff_not_owner_count, "người\n")
## Nữ không có việc nhiều hơn nam: 49 người

4.1.2. Bảng tần suất

# Tổng số mẫu
total_samples <- nrow(dt)

# Tỷ lệ tuyệt đối trên tổng số mẫu
prop_abs <- table_gender_job / total_samples

# Tỷ lệ tương đối trong từng giới tính (theo hàng)
prop_by_gender <- prop.table(table_gender_job, margin = 1) #tính tỷ lệ cho từng hàng, tức là chia từng giá trị trong hàng đó cho tổng của hàng đó.

# In tỷ lệ tuyệt đối trên tổng số mẫu
print("Tỷ lệ tuyệt đối (trên tổng số mẫu):")
## [1] "Tỷ lệ tuyệt đối (trên tổng số mẫu):"
print(round(prop_abs, 4))
##         
##             No   Yes
##   Female 0.417 0.105
##   Male   0.368 0.110
# Đưa dữ liệu về dạng long để vẽ
df_prop <- as.data.frame(prop_by_gender)
colnames(df_prop) <- c("Gender", "ParttimeJob", "Proportion")

# Vẽ biểu đồ cột nhóm
ggplot(df_prop, aes(x = Gender, y = Proportion, fill = ParttimeJob)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = scales::percent(Proportion, accuracy = 0.1)),
            position = position_dodge(width = 0.9),
            vjust = -0.3, size = 3.5) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  labs(title = "Tỷ lệ sinh viên có/không có việc làm part-time theo giới tính",
       x = "Giới tính", y = "Tỷ lệ (%)", fill = "Việc làm part-time") +
  theme_minimal()

Biểu đồ cột nhóm thể hiện tỷ lệ sinh viên nam và nữ có hoặc không việc làm part-time, cho thấy phần lớn sinh viên ở cả hai giới đều không làm thêm, với tỷ lệ không làm part-time lần lượt là 79,9% ở nữ và 77,0% ở nam. Tỷ lệ sinh viên nam làm việc part-time cao hơn nữ một chút, lần lượt là 23,0% so với 20,1%, cho thấy nam giới có xu hướng tham gia việc làm thêm nhiều hơn khoảng 2,9 điểm phần trăm. Mặc dù có sự khác biệt nhỏ này, mô hình chung cho thấy ưu tiên học tập toàn thời gian vẫn chiếm đa số và việc làm part-time không phổ biến ở cả hai nhóm. Sự chênh lệch này có thể phản ánh khác biệt về cơ hội việc làm, nhu cầu tài chính hoặc sở thích, nhưng để xác định ý nghĩa thống kê của sự khác biệt cần thực hiện các kiểm định chuyên sâu. Tổng thể, biểu đồ minh họa rõ rằng việc làm part-time không phải là hoạt động phổ biến trong sinh viên, dù nam giới có xu hướng làm thêm nhiều hơn nữ.

4.1.3. Kiểm định Thống kê

chi_test <- chisq.test(table_gender_job)
chi_test
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_gender_job
## X-squared = 1.0755, df = 1, p-value = 0.2997
chi_sq_value <- round(chi_test$statistic, 4)
df_value <- chi_test$parameter
p_value <- round(chi_test$p.value, 4)
  • Giá trị thống kê Chi-bình phương: 1.0755

  • Bậc tự do (df): 1

  • Giá trị p: p_value = 0.2997

  • Với mức ý nghĩa \(\alpha = 0.05\), `r ifelse(p_value1 > 0.05, “vì p_value > 0.05, ta không đủ cơ sở bác bỏ giả thuyết H₀, tức là không có mối quan hệ đáng kể giữa giới tính và nghề nghiệp.”,

Nhận xét: Kết quả kiểm định cho thấy không có sự khác biệt đáng kể về phân bố nghề nghiệp giữa nam và nữ trong mẫu dữ liệu này. Điều này cho thấy giới tính không phải là yếu tố quyết định rõ ràng đối với nghề nghiệp trong nhóm quan sát hiện tại. Tuy nhiên, kết quả có thể bị ảnh hưởng bởi quy mô mẫu hoặc các yếu tố xã hội, văn hóa, kinh tế phức tạp khác chưa được xem xét. Do đó, cần có thêm các nghiên cứu với dữ liệu lớn hơn hoặc phân tích sâu hơn các yếu tố liên quan để có cái nhìn toàn diện hơn về mối quan hệ giữa giới tính và nghề nghiệp.

4.2. Gender và Diet Quality

4.2.1. Bảng tần số

# Bảng tần số chéo (cross-tabulation) giữa Gender và Diet Quality
table_gender_dq <- table(dt$gender, dt$diet_quality)
table_gender_dq
##         
##          Fair Good
##   Female  301  221
##   Male    282  196
diff_fair <- table_gender_dq["Female", "Fair"] - table_gender_dq["Male", "Fair"]
diff_good <- table_gender_dq["Female", "Good"] - table_gender_dq["Male", "Good"]

cat("Nữ có chế độ ăn Fair nhiều hơn nam:", diff_fair, "người\n")
## Nữ có chế độ ăn Fair nhiều hơn nam: 19 người
cat("Nữ có chế độ ăn Good nhiều hơn nam:", diff_good, "người\n")
## Nữ có chế độ ăn Good nhiều hơn nam: 25 người

4.2.2. Bảng tần suất

# Tổng số mẫu
total_samples2 <- nrow(dt)

# Tỷ lệ tuyệt đối trên tổng số mẫu
prop_abs2 <- table_gender_dq / total_samples2

# Tỷ lệ tương đối trong từng giới tính (theo hàng)
prop_by_gender2 <- prop.table(table_gender_dq, margin = 1) #tính tỷ lệ cho từng hàng, tức là chia từng giá trị trong hàng đó cho tổng của hàng đó.

# In tỷ lệ tuyệt đối trên tổng số mẫu
print("Tỷ lệ tuyệt đối (trên tổng số mẫu):")
## [1] "Tỷ lệ tuyệt đối (trên tổng số mẫu):"
print(round(prop_abs2, 4))
##         
##           Fair  Good
##   Female 0.301 0.221
##   Male   0.282 0.196
df <- as.data.frame(table_gender_dq)
colnames(df) <- c("Gender", "DietQuality", "Count")

ggplot(df, aes(x = DietQuality, y = Count, fill = Gender)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(aes(label = Count), position = position_dodge(width = 0.9), vjust = -0.3, size = 3.5) +
  labs(title = "Số lượng theo giới tính và mức độ chế độ ăn",
       x = "Mức độ chế độ ăn",
       y = "Số lượng",
       fill = "Giới tính") +
  theme_minimal()

Biểu đồ cột nhóm này là một minh họa trực quan và sinh động về mối liên hệ giữa giới tính và mức độ chất lượng chế độ ăn trong nhóm sinh viên được khảo sát. Ba mức đánh giá chất lượng chế độ ăn – “Good” (Tốt), “Fair” (Khá) – được thể hiện dọc theo trục hoành, trong khi trục tung biểu thị số lượng sinh viên thuộc từng nhóm. Màu sắc được sử dụng hiệu quả để phân biệt giới tính: nữ sinh được biểu thị bằng cột màu đỏ cam, còn nam sinh bằng màu xanh ngọc. Việc gắn số liệu cụ thể lên mỗi cột giúp người xem nhanh chóng nắm bắt được quy mô từng nhóm.

Dữ liệu cho thấy phần lớn sinh viên có chế độ ăn ở mức trung bình hoặc tốt. Nhóm “Fair” chiếm tỷ lệ cao nhất ở cả hai giới, với 301 nữ sinh và 221 nam sinh – cho thấy đây là mức phổ biến nhất. Nhóm “Good” cũng có số lượng đáng kể, với 282 nữ và 196 nam, phản ánh rằng vẫn có một tỉ lệ lớn sinh viên duy trì được chế độ ăn tích cực.

4.2.3. Kiểm định Thống kê

chi_test2 <- chisq.test(table_gender_dq)
chi_test2
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_gender_dq
## X-squared = 0.13166, df = 1, p-value = 0.7167
chi_sq_value2 <- round(chi_test2$statistic, 4)
df_value2 <- chi_test2$parameter
p_value2 <- round(chi_test2$p.value, 4)
  • Giá trị thống kê Chi-bình phương: 0.1317

  • Bậc tự do (df): 1

  • Giá trị p: p_value = 0.7167

  • Với mức ý nghĩa \(\alpha = 0.05\), `r ifelse(p_value1 > 0.05, “vì p_value > 0.05, ta không đủ cơ sở bác bỏ giả thuyết H₀, tức là không có mối quan hệ đáng kể giữa giới tính và chất lượng ăn uống.”,

Nhận xét: Kết quả kiểm định cho thấy không có sự khác biệt đáng kể về chế độ ăn uống giữa nam và nữ trong nhóm sinh viên được khảo sát. Nói cách khác, xu hướng lựa chọn các chế độ ăn như Good, Fail, Poor không phụ thuộc rõ ràng vào giới tính. Điều này gợi ý rằng các yếu tố ảnh hưởng đến chế độ ăn uống của sinh viên có thể đến từ những khía cạnh khác như nhận thức về sức khỏe, ảnh hưởng xã hội, điều kiện tài chính, hay thói quen cá nhân — hơn là từ giới tính. Để có cái nhìn đầy đủ và sâu sắc hơn, cần có thêm các nghiên cứu kết hợp nhiều biến số và mẫu dữ liệu lớn hơn.

4.3. Diet Quality và Part Time Job

4.3.1. Bảng tần số

# Bảng tần số chéo (cross-tabulation) giữa diet_quality và part_time_job
table_diet_pj <- table(dt$diet_quality, dt$part_time_job)
table_diet_pj
##       
##         No Yes
##   Fair 464 119
##   Good 321  96
# So sánh giữa Good và Fair
diff_yes_good_fair <- table_diet_pj["Good", "Yes"] - table_diet_pj["Fair", "Yes"]
diff_no_good_fair <- table_diet_pj["Good", "No"] - table_diet_pj["Fair", "No"]

cat("Chế độ ăn Good có việc nhiều hơn Fair:", diff_yes_good_fair, "người\n")
## Chế độ ăn Good có việc nhiều hơn Fair: -23 người
cat("Chế độ ăn Good không có việc nhiều hơn Fair:", diff_no_good_fair, "người\n")
## Chế độ ăn Good không có việc nhiều hơn Fair: -143 người

4.3.2. Bảng tần suất

# Tổng số mẫu
total_samples3 <- nrow(dt)

# Tỷ lệ tuyệt đối trên tổng số mẫu
prop_abs3 <- table_diet_pj / total_samples3

# Tỷ lệ tương đối trong từng giới tính (theo hàng)
prop_by_dq<- prop.table(table_diet_pj, margin = 1) #tính tỷ lệ cho từng hàng, tức là chia từng giá trị trong hàng đó cho tổng của hàng đó.

# In tỷ lệ tuyệt đối trên tổng số mẫu
print("Tỷ lệ tuyệt đối (trên tổng số mẫu):")
## [1] "Tỷ lệ tuyệt đối (trên tổng số mẫu):"
print(round(prop_abs3, 4))
##       
##           No   Yes
##   Fair 0.464 0.119
##   Good 0.321 0.096
# In tỷ lệ tương đối trong từng giới tính
print("Tỷ lệ tương đối trong từng giới tính:")
## [1] "Tỷ lệ tương đối trong từng giới tính:"
print(round(prop_by_gender, 4))
##         
##              No    Yes
##   Female 0.7989 0.2011
##   Male   0.7699 0.2301
library(ggplot2)

df_prop_dq <- as.data.frame(prop_by_dq)
colnames(df_prop_dq) <- c("DietQuality", "PartTimeJob", "Proportion")

ggplot(df_prop_dq, aes(x = DietQuality, y = Proportion, fill = PartTimeJob)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(aes(label = scales::percent(Proportion, accuracy = 0.1)),
            position = position_dodge(width = 0.9),
            vjust = -0.3,
            size = 3.5) +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Tỷ lệ sinh viên có/không có việc làm theo chất lượng chế độ ăn",
       x = "Chất lượng chế độ ăn",
       y = "Tỷ lệ (%)",
       fill = "Việc làm part-time") +
  theme_minimal(base_size = 13)

Biểu đồ thể hiện tỷ lệ sinh viên làm và không làm part-time theo hai mức chất lượng chế độ ăn “Fair” và “Good”. Phần lớn sinh viên không làm part-time, với 79,6% ở nhóm “Fair” và 77,0% ở nhóm “Good”. Tỷ lệ làm part-time ở nhóm “Good” (23,0%) cao hơn nhóm “Fair” (20,4%) khoảng 2,6 điểm phần trăm, cho thấy sinh viên có chế độ ăn tốt hơn có xu hướng làm thêm nhiều hơn.

4.3.3. Kiểm định Thống kê

chi_test3 <- chisq.test(table_diet_pj)
chi_test3
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_diet_pj
## X-squared = 0.83264, df = 1, p-value = 0.3615
chi_sq_value3 <- round(chi_test3$statistic, 4)
df_value3 <- chi_test3$parameter
p_value3 <- round(chi_test3$p.value, 4)
  • Giá trị thống kê Chi-bình phương: 0.8326

  • Bậc tự do (df): 1

  • Giá trị p: p_value = 0.3615

  • Với mức ý nghĩa \(\alpha = 0.05\), `r ifelse(p_value1 > 0.05, “vì p_value > 0.05, ta không đủ cơ sở bác bỏ giả thuyết H₀, tức là không có mối quan hệ đáng kể giữa chế độ ăn và mức độ có việc làm.”,

Nhận xét: Kết quả kiểm định cho thấy không có sự khác biệt rõ rệt về chế độ ăn uống giữa các nhóm mức độ làm thêm khác nhau trong mẫu dữ liệu. Điều này cho thấy việc sinh viên làm thêm ít hay nhiều không ảnh hưởng đáng kể đến lựa chọn chế độ ăn uống của họ. Tuy nhiên, yếu tố này có thể bị chi phối bởi các biến khác như thời gian rảnh, thu nhập, nhận thức về sức khỏe hoặc thói quen cá nhân. Do đó, cần nghiên cứu thêm với mẫu lớn hơn và kết hợp các biến khác để có đánh giá toàn diện hơn về mối quan hệ giữa chế độ ăn và mức độ làm thêm.

Phần 5. SO SÁNH 2 TỶ LỆ VÀ THƯỚC ĐO MỐI LIÊN HỆ:

5.1. Hiệu hai tỷ lệ (Difference in Proportions):

5.1.1. Bảng chéo 2x2 giữa Gender và Part Time Job:

# Bảng chéo giữa Gender và Part Time Job
gp <- table(dt$gender, dt$part_time_job)
gp
##         
##           No Yes
##   Female 417 105
##   Male   368 110

Kiểm định:

H₀: p₁ - p₂ = 0 (tỷ lệ nữ có việc làm bằng tỷ lệ nam có việc làm)

H₁: p₁ - p₂ < 0 (Tỷ lệ nữ có việc làm nhỏ hơn tỷ lệ nam có việc làm)

# Số người có việc theo từng giới tính
counts <- c(gp["Female", "Yes"], gp["Male", "Yes"])

# Tổng số người theo từng giới tính
totals <- c(sum(gp["Female", ]), sum(gp["Male", ]))

# Kiểm định tỉ lệ giữa nữ và nam (alternative = "less": giả thuyết nữ có tỉ lệ thấp hơn nam)
test <- prop.test(counts, totals, alternative = "less", correct = FALSE)

print(test)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts out of totals
## X-squared = 1.2413, df = 1, p-value = 0.1326
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.01386834
## sample estimates:
##    prop 1    prop 2 
## 0.2011494 0.2301255
  • prop 1 (p1) = 0.2011494 : tỷ lệ nữ sở hữu nhà khoảng 20.11%

  • prop 2 (p2) = 0.2301255 : tỷ lệ nam sở hữu nhà khoảng 23.01%

  • P-value = 0.1326

Giá trị p-value thu được là 0.1326, lớn hơn mức ý nghĩa 0.05. Do đó, chúng ta không đủ bằng chứng để bác bỏ giả thuyết \(H_0: p_1 - p_2 = 0\).

Điều này có nghĩa là, theo dữ liệu hiện tại, không có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ có việc làm của nữ và nam, và không có bằng chứng cho thấy tỷ lệ có việc thấp hơn tỷ lệ nam.

5.1.2. Bảng chéo 2x2 giữa Gender và Diet Quality:

# Bảng chéo giữa Gender và Diet Quality
gq <- table(dt$gender, dt$diet_quality)
gq
##         
##          Fair Good
##   Female  301  221
##   Male    282  196

Kiểm định:

H₀: p₁ - p₂ = 0 (Tỷ lệ nữ có chế độ ăn bằng tỷ lệ nam có chế độ ăn Good)

H₁: p₁ - p₂ < 0 (Tỷ lệ nữ có chế độ ăn nhỏ hơn tỷ lệ có chế độ ăn Good)

counts2 <- c(gq["Female", "Good"], gq["Male", "Good"])   
totals2 <- c(sum(gq["Female", ]), sum(gq["Male", ]))  

test2 <- prop.test(counts2, totals2, alternative = "less", correct = FALSE)
test2
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts2 out of totals2
## X-squared = 0.18236, df = 1, p-value = 0.6653
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.0000000  0.0646577
## sample estimates:
##    prop 1    prop 2 
## 0.4233716 0.4100418
  • prop 1 (p1) = 0.4233716: tỷ lệ nữ sở hữu nhà khoảng 42.33%

  • prop 2 (p2) = 0.4100418: tỷ lệ nam sở hữu nhà khoảng 41%

  • P-value = 0.6653

Giá trị p-value thu được là 0.6653, lớn hơn mức ý nghĩa 0.05. Do đó, chúng ta không đủ bằng chứng để bác bỏ giả thuyết \(H_0: p_1 - p_2 = 0\).

Điều này có nghĩa là, theo dữ liệu hiện tại, không có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ có chế độ ăn của nữ và nam, và không có bằng chứng cho thấy tỷ lệ có chế độ ăn thấp hơn tỷ lệ nam.

5.1.3. Bảng chéo 2x2 giữa Diet Quality và Part Time Job

# Bảng chéo giữa Diet Quality và Part Time Job
dp <- table(dt$diet_quality, dt$part_time_job)
dp
##       
##         No Yes
##   Fair 464 119
##   Good 321  96

Kiểm định:

H₀: p₁ - p₂ = 0 (Tỷ lệ chế độ ăn bằng tỷ lệ có việc làm)

H₁: p₁ - p₂ < 0 (Tỷ lệ chế độ ăn nhỏ hơn tỷ lệ có việc làm)

counts3 <- c(dp["Fair", "Yes"], dp["Good", "Yes"])   
totals3 <- c(sum(dp["Fair", ]), sum(dp["Good", ]))  

test3 <- prop.test(counts3, totals3, alternative = "less", correct = FALSE)
test3
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts3 out of totals3
## X-squared = 0.98118, df = 1, p-value = 0.161
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.00000000  0.01753223
## sample estimates:
##    prop 1    prop 2 
## 0.2041166 0.2302158
  • prop 1 (p1) = 0.2041166: tỷ lệ nữ sở hữu nhà khoảng 20.4%

  • prop 2 (p2) = 0.2302158: tỷ lệ nam sở hữu nhà khoảng 23%

  • P-value = 0.161

Giá trị p-value thu được là 0.587, lớn hơn mức ý nghĩa 0.05. Do đó, chúng ta không đủ bằng chứng để bác bỏ giả thuyết \(H_0: p_1 - p_2 = 0\).

Điều này có nghĩa là, theo dữ liệu hiện tại, không có sự khác biệt có ý nghĩa thống kê giữa chế độ ăn uống và việc làm, và không có bằng chứng cho thấy tchees độ ăn uống ảnh hưởng đến việc có việc làm hay không.

5.2. Tỷ số Nguy cơ (Relative Risk - RR)

5.2.1. Bảng chéo 2x2 giữa Gender và Part Time Job

gp5 <- table(dt$gender, dt$part_time_job)
#Thêm tổng hàng và cột
gp5 
##         
##           No Yes
##   Female 417 105
##   Male   368 110
library(epitools)
riskratio(gp5, method="wald")
## $data
##         
##           No Yes Total
##   Female 417 105   522
##   Male   368 110   478
##   Total  785 215  1000
## 
## $measure
##         risk ratio with 95% C.I.
##          estimate     lower    upper
##   Female 1.000000        NA       NA
##   Male   1.144053 0.9027561 1.449845
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.2666778    0.2811018  0.2652243
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Có 105 nữ và 110 nam làm việc bán thời gian.

  • Tỷ lệ nữ có việc bán thời gian là khoảng 20.1% (105 trên 522).

  • Tỷ lệ nam có việc bán thời gian là khoảng 23.0% (110 trên 478).

Tỷ số rủi ro (Risk Ratio) giữa nam và nữ là 1.144, tức là nam có khả năng làm việc bán thời gian cao hơn nữ khoảng 14.4%. Tuy nhiên, khoảng tin cậy 95% cho tỷ số này là từ 0.903 đến 1.450, nghĩa là sự chênh lệch này có thể do ngẫu nhiên và không đủ chắc chắn để kết luận có sự khác biệt thực sự.

Các phép kiểm định thống kê như kiểm định chi bình phương, kiểm định Fisher, và Mid-p đều cho giá trị p lớn hơn 0.26, vượt ngưỡng thông thường 0.05. Điều này cho thấy không có bằng chứng thống kê đủ mạnh để khẳng định rằng tỷ lệ có việc làm bán thời gian của nam và nữ là khác nhau một cách đáng kể.

5.2.2. Bảng chéo 2x2 giữa Gender và Diet Quality

gd5 <- table(dt$gender, dt$diet_quality)
#Thêm tổng hàng và cột
gd5 
##         
##          Fair Good
##   Female  301  221
##   Male    282  196
riskratio(gd5, method="wald")
## $data
##         
##          Fair Good Total
##   Female  301  221   522
##   Male    282  196   478
##   Total   583  417  1000
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower    upper
##   Female 1.0000000        NA       NA
##   Male   0.9685151 0.8361793 1.121795
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Female         NA           NA         NA
##   Male    0.6701053     0.700197  0.6693486
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Dữ liệu từ bảng chéo cho thấy:

  • Trong tổng số 522 nữ, có 301 người ăn uống ở mức Fair, và 221 người ăn uống ở mức Good.

  • Trong tổng số 478 nam, có 282 người ăn uống ở mức Fair, và 196 người ăn uống ở mức Good.

Tỷ lệ nữ có chế độ ăn uống tốt (Good) là 221 / 522 ≈ 42.3%. Tỷ lệ nam có chế độ ăn uống tốt là 196 / 478 ≈ 41.0%.

Tỷ số rủi ro (Risk Ratio) của nam so với nữ là 0.969, tức là nam có khả năng có chế độ ăn tốt thấp hơn nữ khoảng 3.1%. Tuy nhiên, khoảng tin cậy 95% cho tỷ số này là từ 0.836 đến 1.122, nghĩa là sự khác biệt này không chắc chắn và có thể do ngẫu nhiên. Kết quả kiểm định thống kê cho các phép kiểm định (Mid-p, Fisher, Chi-square) đều cho p-value > 0.66, cao hơn ngưỡng 0.05 thông thường. Điều này cho thấy không có bằng chứng thống kê đủ mạnh để khẳng định có sự khác biệt giữa nam và nữ về tỷ lệ có chế độ ăn uống tốt.

5.2.3. Bảng chéo 2x2 giữa Diet Quality và Part Time Job

dp5 <- table(dt$diet_quality, dt$part_time_job)
#Thêm tổng hàng và cột
dp5 
##       
##         No Yes
##   Fair 464 119
##   Good 321  96
riskratio(dp5, method="wald")
## $data
##        
##          No Yes Total
##   Fair  464 119   583
##   Good  321  96   417
##   Total 785 215  1000
## 
## $measure
##       risk ratio with 95% C.I.
##        estimate     lower    upper
##   Fair 1.000000        NA       NA
##   Good 1.127864 0.8892638 1.430484
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   Fair         NA           NA         NA
##   Good  0.3233459    0.3490117  0.3219066
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Dữ liệu khảo sát cho thấy trong số những người có chế độ ăn uống trung bình (Fair), có 119 người làm việc bán thời gian trên tổng số 583 người, tương đương khoảng 20.4%. Trong khi đó, ở nhóm có chế độ ăn uống tốt (Good), có 96 người làm việc bán thời gian trên tổng số 417 người, tương đương khoảng 23.0%.

Kết quả phân tích cho thấy tỷ số rủi ro (risk ratio) giữa hai nhóm là 1.13, nghĩa là những người có chế độ ăn uống tốt có khả năng làm việc bán thời gian cao hơn khoảng 13% so với nhóm ăn uống trung bình. Tuy nhiên, khoảng tin cậy 95% của tỷ số này là từ 0.89 đến 1.43, bao gồm cả giá trị 1.0. Điều này cho thấy sự khác biệt này có thể chỉ là do ngẫu nhiên và chưa đủ mạnh để khẳng định có sự khác biệt thực sự.

Bên cạnh đó, các kiểm định thống kê như kiểm định chi bình phương, kiểm định Fisher và mid-p đều cho giá trị p lớn hơn 0.32, cao hơn mức ý nghĩa 0.05. Do đó, không có bằng chứng thống kê đủ mạnh để kết luận rằng chất lượng chế độ ăn uống có ảnh hưởng rõ rệt đến việc làm bán thời gian.

5.3. Tỷ số Chênh (Odds Ratio - OR)

5.3.1. Gender và Part Time Job

library(DescTools)
# Tính OR và khoảng tin cậy
or_gh <- OddsRatio(gp5, method = "wald", conf.level = 0.95)
or_gh
## odds ratio     lwr.ci     upr.ci 
##   1.187112   0.877743   1.605521
  • Odds Ratio (OR) = 1.187

  • Khoảng tin cậy 95%: từ 0.878 đến 1.606

Diễn giải:

Giá trị Odds Ratio 1.187 có nghĩa là odds (tỷ lệ cơ hội) có việc làm của nữ cao hơn khoảng 18.7% so với nam. Nói cách khác, nữ có khả năng có việc làm bán thời gian cao hơn nam, nhưng mức độ chênh lệch không lớn.

Tuy nhiên, khoảng tin cậy 95% từ 0.878 đến 1.606 bao gồm giá trị 1.0, nghĩa là sự khác biệt này có thể không thực sự tồn tại mà do ngẫu nhiên.

5.3.2. Gender và Diet Quality

# Tính OR và khoảng tin cậy
or_gh2 <- OddsRatio(gd5, method = "wald", conf.level = 0.95)
or_gh2
## odds ratio     lwr.ci     upr.ci 
##  0.9466320  0.7359664  1.2175993
  • Odds Ratio (OR) = 0.947

  • Khoảng tin cậy 95%: từ 0.736 đến 1.218

Diễn giải:

Giá trị Odds Ratio 0.947 có nghĩa là odds (tỷ lệ cơ hội) có chế độ ăn uống tốt của nữ thấp hơn khoảng 5.3% so với nam. Nói cách khác, nữ có khả năng có chế độ ăn uống tốt hơi thấp hơn nam, nhưng mức chênh lệch rất nhỏ.

5.3.3. Diet Quality và Part Time Job

# Tính OR và khoảng tin cậy
or_gh3 <- OddsRatio(dp5, method = "wald", conf.level = 0.95)
or_gh3
## odds ratio     lwr.ci     upr.ci 
##  1.1661038  0.8602434  1.5807132
  • Odds Ratio (OR) = 1.166

  • Khoảng tin cậy 95%: từ 0.860 đến 1.581

Diễn giải:

Giá trị Odds Ratio 1.166 có nghĩa là odds có việc làm của nhóm có chế độ ăn tốt cao hơn khoảng 16.6% so với nhóm có chế độ ăn kém hơn. Nói cách khác, những người có chế độ ăn tốt có xu hướng có việc làm nhiều hơn những người khác.

Tuy nhiên, khoảng tin cậy 95% từ 0.860 đến 1.581 bao gồm giá trị 1.0, cho thấy sự khác biệt về odds có việc làm giữa các nhóm chế độ ăn có thể là do ngẫu nhiên và không có ý nghĩa thống kê.

Phần 6. KẾT LUẬN

6.1. Đặc điểm chung của sinh viên trong mẫu

Giới tính: Tỷ lệ sinh viên nữ (52.2%) và nam (47.8%) trong mẫu tương đối cân bằng, với nữ giới chiếm ưu thế hơn một chút.

Việc làm part-time: Phần lớn sinh viên (78.5%) không tham gia làm thêm, cho thấy việc học tập có thể là ưu tiên hàng đầu hoặc cơ hội việc làm phù hợp còn hạn chế.

Chất lượng chế độ ăn: Đa số sinh viên tự đánh giá chế độ ăn của mình ở mức “Fair” (Khá - 58.3%) hoặc “Good” (Tốt - 37.8%).

Học vấn phụ huynh: Trình độ học vấn của phụ huynh khá đa dạng, với tỷ lệ đáng kể có trình độ “High School” và “Bachelor”.

Chất lượng Internet: Phần lớn sinh viên được hưởng chất lượng Internet ở mức “Good” (44.7%) hoặc “Average” (39.1%), tạo điều kiện thuận lợi cho học tập.

Hoạt động ngoại khóa: Một tỷ lệ lớn sinh viên (68.2%) không tham gia hoạt động ngoại khóa, cho thấy tiềm năng cần khai thác để phát triển kỹ năng mềm và đời sống tinh thần cho sinh viên.

6.2. Hạn chế và Hướng phát triển

Phân tích này chủ yếu tập trung vào các mối quan hệ hai biến định tính. Việc xem xét đồng thời nhiều yếu tố hoặc các biến định lượng (như study_hours_per_day, exam_score) có thể cung cấp cái nhìn sâu sắc hơn thông qua các mô hình hồi quy.

Nhìn chung, bài phân tích đã cung cấp một cái nhìn tổng quan về đặc điểm sinh viên và bước đầu khám phá các mối liên hệ giữa các yếu tố. Các kết quả cho thấy một số thói quen nhất định (như ít làm thêm, ít tham gia ngoại khóa) là phổ biến, trong khi các mối liên hệ giữa giới tính, chất lượng chế độ ăn và việc làm part-time không thể hiện rõ ràng về mặt thống kê trong mẫu dữ liệu này. Các nghiên cứu sâu hơn với các phương pháp phức tạp hơn có thể làm sáng tỏ thêm các mối quan hệ này.

LS0tDQp0aXRsZTogIk5oaeG7h20gVuG7pSA0Ig0KYXV0aG9yOiAiTmfhu41jIFRyw6JtIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jOiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAnNCcNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KPHN0eWxlPg0KYm9keSB7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgc2Fucy1zZXJpZjsNCiAgZm9udC1zaXplOiAxNnB4Ow0KICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICBsaW5lLWhlaWdodDogMS41Ow0KfQ0KaDIgew0KICBjb2xvcjogb3JhbmdlOw0KfQ0KaDMgew0KICBjb2xvcjogcmVkOw0KfQ0KPC9zdHlsZT4NCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoNCiMgKipQaOG6p24gMS4gVMOMTSBISeG7glUgVsOAIENIVeG6qE4gQuG7iiBE4buuIExJ4buGVSoqDQoNCiMjICoqMS4gxJDhu41jIGZpbGUgZOG7ryBsaeG7h3UqKg0KYGBge3IsIGVjaG89VFJVRX0NCmQgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BDL09uZURyaXZlL03DoXkgdMOtbmgvVE1UL1Ro4buxYyBIw6BuaC5jc3YiKQ0KYGBgDQoNCkLhu5kgZOG7ryBsaeG7h3UgZ+G7k20gMS4wMDAgcXVhbiBzw6F0LCBt4buXaSBxdWFuIHPDoXQgdMawxqFuZyDhu6luZyB24bubaSBt4buZdCBzaW5oIHZpw6puLCBnaGkgbmjhuq1uIHRvw6BuIGRp4buHbiBjw6FjIGtow61hIGPhuqFuaCB0cm9uZyB0aMOzaSBxdWVuIHNpbmggaG/huqF0IGjDoG5nIG5nw6B5IGfhuq9uIGxp4buBbiB24bubaSBxdcOhIHRyw6xuaCBo4buNYyB04bqtcC4gQ8OhYyBiaeG6v24gxJHGsOG7o2MgdGh1IHRo4bqtcCBiYW8gZ+G7k20gdGjhu51pIGdpYW4gaOG7jWMgbeG7l2kgbmfDoHksIHRo4budaSBsxrDhu6NuZyBuZ+G7pywgbeG7qWMgxJHhu5kgc+G7rSBk4bulbmcgbeG6oW5nIHjDoyBo4buZaSwgY2jhuqV0IGzGsOG7o25nIGNo4bq/IMSR4buZIMSDbiB14buRbmcsIHThuqduIHN14bqldCB24bqtbiDEkeG7mW5nIHRo4buDIGNo4bqldCwgbeG7qWMgxJHhu5kgY8SDbmcgdGjhurNuZywgdsOgIMSRw6FuaCBnacOhIHPhu6ljIGto4buPZSB0aW5oIHRo4bqnbi4gTmdvw6BpIHJhLCBk4buvIGxp4buHdSBjw7JuIGJhbyBn4buTbSB0aMO0bmcgdGluIGPDoSBuaMOibiBjxqEgYuG6o24gbmjGsCBnaeG7m2kgdMOtbmggdsOgIG7Eg20gaOG7jWMuIEJp4bq/biBr4bq/dCBxdeG6oyBsw6AgxJFp4buDbSB0aGkgY3Xhu5FpIGvhu7MsIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHBo4bqjbiDDoW5oIGhp4buHdSBzdeG6pXQgaOG7jWMgdOG6rXAgY+G7p2EgdOG7q25nIHNpbmggdmnDqm4uIEThu68gbGnhu4d1IGPDsyBj4bqldSB0csO6YyByw7UgcsOgbmcsIMSR4bqneSDEkeG7pywga2jDtG5nIGNo4bupYSBnacOhIHRy4buLIHRoaeG6v3UgdsOgIHBow7kgaOG7o3AgY2hvIGPDoWMgcGjDom4gdMOtY2ggxJHhu4tuaCBsxrDhu6NuZyBjaHV5w6puIHPDonUuDQoNCg0KIyMgKioyLiBD4bqldSB0csO6YyBi4buZIGThu68gbGnhu4d1KioNCg0KQuG7mSBk4buvIGxp4buHdSAqKlRo4buxYyBow6BuaCoqIGNo4bupYSB04buVbmcgY+G7mW5nICoqMTAwMCBi4bqjbiBnaGkqKiB24bubaSAqKjE2IGJp4bq/bioqIMSR4bq3YyB0csawbmcuDQoNCmBgYHtyfQ0Kc3RyKGQpDQpgYGANCg0KDQpDw6FjIGJp4bq/biB0cm9uZyBi4buZIGThu68gbGnhu4d1IGJhbyBn4buTbToNCg0KLSAqKipzdHVkZW50X2lkKioqOiBtw6Mgc2luaCB2acOqbiwgZOG6oW5nIGNodeG7l2kga8O9IHThu7EgKG3hu5dpIHNpbmggdmnDqm4gY8OzIG3hu5l0IG3DoyBkdXkgbmjhuqV0KS4NCg0KLSAqKiphZ2UqKio6IHR14buVaSBzaW5oIHZpw6puLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKmdlbmRlcioqKjogZ2nhu5tpIHTDrW5oLCBsxrB1IGTGsOG7m2kgZOG6oW5nIGvDvSB04buxICgiTWFsZSIsICJGZW1hbGUiKS4NCg0KLSAqKipzdHVkeV9ob3Vyc19wZXJfZGF5KioqOiBz4buRIGdp4budIGjhu41jIG3hu5dpIG5nw6B5LCBraeG7g3Ugc+G7kSB0aOG7sWMuDQoNCi0gKioqc29jaWFsX21lZGlhX2hvdXJzKioqOiB0aOG7nWkgZ2lhbiBz4butIGThu6VuZyBt4bqhbmcgeMOjIGjhu5lpIHRydW5nIGLDrG5oIG3hu5dpIG5nw6B5LCBraeG7g3Ugc+G7kSB0aOG7sWMuDQoNCi0gKioqbmV0ZmxpeF9ob3VycyoqKjogc+G7kSBnaeG7nSB4ZW0gTmV0ZmxpeCBob+G6t2MgY8OhYyBu4buBbiB04bqjbmcgdMawxqFuZyB04buxIG3hu5dpIG5nw6B5LCBraeG7g3Ugc+G7kSB0aOG7sWMuDQoNCi0gKioqcGFydF90aW1lX2pvYioqKjogc2luaCB2acOqbiBjw7MgxJFpIGzDoG0gdGjDqm0ga2jDtG5nLCBraeG7g3Uga8O9IHThu7EgKCJZZXMiIGhv4bq3YyAiTm8iKS4NCg0KLSAqKiphdHRlbmRhbmNlX3BlcmNlbnRhZ2UqKio6IHThu7cgbOG7hyBjaHV5w6puIGPhuqduIMSR4bq/biBs4bubcCAodMOtbmggdGhlbyAlKSwga2nhu4N1IHPhu5EgdGjhu7FjLg0KDQotICoqKnNsZWVwX2hvdXJzKioqOiBz4buRIGdp4budIG5n4bunIHRydW5nIGLDrG5oIG3hu5dpIG5nw6B5LCBraeG7g3Ugc+G7kSB0aOG7sWMuDQoNCi0gKioqZGlldF9xdWFsaXR5KioqOiBjaOG6pXQgbMaw4bujbmcgY2jhur8gxJHhu5kgxINuIHXhu5FuZywga2nhu4N1IGvDvSB04buxICgiR29vZCIsICJGYWlyIikuDQoNCi0gKioqZXhlcmNpc2VfZnJlcXVlbmN5KioqOiB04bqnbiBzdeG6pXQgdOG6rXAgdGjhu4MgZOG7pWMgbeG7l2kgdHXhuqduLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKnBhcmVudGFsX2VkdWNhdGlvbl9sZXZlbCoqKjogdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGNhbyBuaOG6pXQgY+G7p2EgcGjhu6UgaHV5bmgsIGtp4buDdSBrw70gdOG7sSAoIk5vbmUiLCAiSGlnaCBTY2hvb2wiLCAiQmFjaGVsb3IiLCAiTWFzdGVyIikuDQoNCi0gKioqaW50ZXJuZXRfcXVhbGl0eSoqKjogY2jhuqV0IGzGsOG7o25nIGvhur90IG7hu5FpIEludGVybmV0IHThuqFpIG7GoWkg4bufLCBraeG7g3Uga8O9IHThu7EgKCJBdmVyYWdlIiwgIkdvb2QiKS4NCg0KLSAqKiptZW50YWxfaGVhbHRoX3JhdGluZyoqKjogxJHDoW5oIGdpw6Egc+G7qWMga2jhu49lIHTDom0gdGjhuqduIHRoZW8gdGhhbmcgxJFp4buDbSAodsOtIGThu6U6IHThu6sgMSDEkeG6v24gMTApLCBraeG7g3Ugc+G7kSBuZ3V5w6puLg0KDQotICoqKmV4dHJhY3VycmljdWxhcl9wYXJ0aWNpcGF0aW9uKioqOiBzaW5oIHZpw6puIGPDsyB0aGFtIGdpYSBob+G6oXQgxJHhu5luZyBuZ2/huqFpIGtow7NhIGtow7RuZywga2nhu4N1IGvDvSB04buxICgiWWVzIiBob+G6t2MgIk5vIikuDQoNCi0gKioqZXhhbV9zY29yZSoqKjogxJFp4buDbSBiw6BpIHRoaSBjdeG7kWkga+G7sywga2nhu4N1IHPhu5EgdGjhu7FjLg0KDQojIyAqKjMuIENo4buNbiBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oKioNCg0KYGBge3J9DQpkbGR0IDwtIGMoImdlbmRlciIsICJwYXJ0X3RpbWVfam9iIiwgImRpZXRfcXVhbGl0eSIsICJwYXJlbnRhbF9lZHVjYXRpb25fbGV2ZWwiLCAiaW50ZXJuZXRfcXVhbGl0eSIsImV4dHJhY3VycmljdWxhcl9wYXJ0aWNpcGF0aW9uIikNCmR0IDwtIGRbLCBkbGR0XQ0KYGBgDQoNCiMjICoqNS4gS2nhu4NtIHRyYSBt4buZdCB2w6BpIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQpoZWFkKGR0KQ0KYGBgDQoNCmBgYHtyfQ0KdGFpbChkdCkNCmBgYA0KDQojIyAqKjYuIEtp4buDbSB0cmEgTkEqKg0KDQpgYGB7cn0NCmFueShpcy5uYShkdCkpDQpgYGANCg0KS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHNhdSBraGkga2nhu4NtIHRyYSAiRmFsc2UiIHRhIGPDsyB0aOG7gyBuw7NpIGtow7RuZyBjw7MgZ2nDoSB0cuG7iyBOYSB0cm9uZyBk4buvIGxp4buHdS4NCg0KIyMgKio3LiBLaeG7g20gdHJhIGtp4buDdSBk4buvIGxp4buHdSB2w6AgxJHhu5VpIHbhu4EgZmFjdG9yKioNCg0KYGBge3J9DQojIEtp4buDbSB0cmEga2nhu4N1IGThu68gbGnhu4d1IGPhu6dhIHThu6tuZyBiaeG6v24gdHJvbmcgZGxkdA0Kc2FwcGx5KGR0LCBjbGFzcykgDQpgYGANCg0KICBL4bq/dCBxdeG6oyBraeG7g20gdHJhIGtp4buDdSBk4buvIGxp4buHdSBiYW4gxJHhuqd1IGNobyB0aOG6pXkgY8OhYyBiaeG6v24gKioqZ2VuZGVyLCBwYXJ0X3RpbWVfam9iLCBkaWV0X3F1YWxpdHksIHBhcmVudGFsX2VkdWNhdGlvbl9sZXZlbCwgaW50ZXJuZXRfcXVhbGl0eSoqKiB2w6AgKioqZXh0cmFjdXJyaWN1bGFyX3BhcnRpY2lwYXRpb24gxJHhu4F1KioqIMSRYW5nIOG7nyBraeG7g3UgImNoYXJhY3RlciIsIHThu6ljIGzDoCBjaHXhu5dpIGvDvSB04buxLiDEkMOieSBsw6AgZOG6pXUgaGnhu4d1IGNobyB0aOG6pXkgZOG7ryBsaeG7h3UgY2jGsGEgxJHGsOG7o2MgeOG7rSBsw70gxJHDum5nIGtp4buDdSwgxJHhurdjIGJp4buHdCBraGkgY8OhYyBiaeG6v24gbsOgeSDEkeG7gXUgbWFuZyB0w61uaCBwaMOibiBsb+G6oWkuDQoNCiAgQ+G7pSB0aOG7gywgKioqZ2VuZGVyKioqIGzDoCBiaeG6v24gxJHhu4tuaCB0w61uaCBuw6puIGPhuqduIMSRxrDhu6NjIGNodXnhu4NuIHNhbmcga2nhu4N1IGZhY3RvciDEkeG7gyBwaOG7pWMgduG7pSBjaG8gcGjDom4gdMOtY2ggdGjhu5FuZyBrw6ogdGhlbyBuaMOzbSBnaeG7m2kgdMOtbmguIEPDoWMgYmnhur9uIG5o4buLIHBow6JuIG5oxrAgKioqcGFydF90aW1lX2pvYioqKiB2w6AgKioqZXh0cmFjdXJyaWN1bGFyX3BhcnRpY2lwYXRpb24qKiogY8WpbmcgbsOqbiBjaHV54buDbiB0aMOgbmggZmFjdG9yIHbhu5tpIGhhaSBt4bupYyAiWWVzIiB2w6AgIk5vIi4gxJDhu5FpIHbhu5tpIGPDoWMgYmnhur9uIGPDsyB0aOG7qSB04buxIG5oxrAgKioqZGlldF9xdWFsaXR5KioqLCAqKippbnRlcm5ldF9xdWFsaXR5KioqIHbDoCAqKipwYXJlbnRhbF9lZHVjYXRpb25fbGV2ZWwqKiosIHZp4buHYyBjaHV54buDbiBzYW5nIGtp4buDdSBvcmRlcmVkIGZhY3RvciBsw6AgY+G6p24gdGhp4bq/dCBuaOG6sW0gdGjhu4MgaGnhu4duIMSRw7puZyBi4bqjbiBjaOG6pXQgY+G7p2EgZOG7ryBsaeG7h3UgdsOgIGNobyBwaMOpcCDDoXAgZOG7pW5nIGPDoWMgcGjGsMahbmcgcGjDoXAgcGjDom4gdMOtY2ggdGjhu6kgYuG6rWMuDQoNCiAgTuG6v3UgY8OhYyBiaeG6v24gcGjDom4gbG/huqFpIG7DoHkgduG6q24gZ2nhu68g4bufIGThuqFuZyBjaHXhu5dpIGvDvSB04buxLCBxdcOhIHRyw6xuaCBwaMOibiB0w61jaCBzYXUgbsOgeSBz4bq9IGfhurdwIG5oaeG7gXUgaOG6oW4gY2jhur8sIMSR4bq3YyBiaeG7h3QgdHJvbmcgdmnhu4djIHRy4buxYyBxdWFuIGjDs2EsIHTDrW5oIHRvw6FuIHThuqduIHN14bqldCwgaG/hurdjIHjDonkgZOG7sW5nIG3DtCBow6xuaCBo4buNYyBtw6F5LiBEbyDEkcOzLCB2aeG7h2MgY2h1eeG7g24gxJHhu5VpIMSRw7puZyBraeG7g3UgZOG7ryBsaeG7h3UgbMOgIG3hu5l0IGLGsOG7m2MgdGnhu4FuIHjhu60gbMO9IHF1YW4gdHLhu41uZywgZ8OzcCBwaOG6p24gxJHhuqNtIGLhuqNvIHTDrW5oIGNow61uaCB4w6FjIHbDoCBoaeG7h3UgcXXhuqMgY+G7p2EgdG/DoG4gYuG7mSBxdXkgdHLDrG5oIHBow6JuIHTDrWNoLg0KDQoNCmBgYHtyLCBlY2hvPVRSVUV9DQpkdCA8LSBkYXRhLmZyYW1lKGxhcHBseShkdCwgYXMuZmFjdG9yKSkNCmBgYA0KDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KIyAqKlBo4bqnbiAyLiBQSMOCTiBUw41DSCBNw5QgVOG6oiBN4buYVCBCSeG6vk4gxJDhu4pOSCBUw41OSCoqDQoNCiMjICoqMi4xLiBCaeG6v24gR2VuZGVyKioNCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIEdlbmRlcg0KdGFibGUoZHQkZ2VuZGVyKS9zdW0obnJvdyhkdCkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gR2VuZGVyDQp0YWJsZShkdCRnZW5kZXIpDQpgYGANCg0KLSBW4bqteSB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGByIHRhYmxlKGR0JGdlbmRlcilbMV0vc3VtKG5yb3coZHQpKSoxMDBgIFwlIG7hu68gdsOgICBgciB0YWJsZShkdCRnZW5kZXIpWzJdL3N1bShucm93KGR0KSkqMTAwYFwlIG5hbS4NCg0KKioqQmnhu4N1IMSR4buTKioqDQoNCmBgYHtyfQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKHRhYmxlKGR0JGdlbmRlcikgLA0KICAgIG1haW4gICA9ICJU4bu3IGzhu4cgZ2nhu5tpIHTDrW5oIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXModGFibGUoZHQkZ2VuZGVyKSksDQogICAgICAgICAgICAgICAgICAgICIgKCIsIHJvdW5kKHRhYmxlKGR0JGdlbmRlcikvc3VtKG5yb3coZHQpKSAqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygiYmx1ZSIsICJyZWQiKSkNCg0KYGBgDQoNCkJp4buDdSDEkeG7kyB0csOqbiBwaOG6o24gw6FuaCBjxqEgY+G6pXUgZ2nhu5tpIHTDrW5oIGPhu6dhIHNpbmggdmnDqm4gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3Uga2jhuqNvIHPDoXQuIEvhur90IHF14bqjIGNobyB0aOG6pXk6DQoNCi0gIFNpbmggdmnDqm4gbuG7ryAoRmVtYWxlKSBjaGnhur9tIHThu7cgbOG7hyA1Mi4yJQ0KDQotICBTaW5oIHZpw6puIG5hbSAoTWFsZSkgY2hp4bq/bSA0Ny44JQ0KDQpU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIG5ow7NtIGtow7RuZyBxdcOhIGzhu5tuLCB0dXkgbmhpw6puIGPDsyB0aOG7gyB0aOG6pXkgbuG7ryBnaeG7m2kgY2hp4bq/bSDGsHUgdGjhur8gbmjhurkgdHJvbmcgdOG7lW5nIHRo4buDIG3huqt1LiDEkGnhu4F1IG7DoHkgcGjhuqduIG7DoG8gcGjhuqNuIMOhbmggc+G7sSBoaeG7h24gZGnhu4duIG5nw6B5IGPDoG5nIMSRw7RuZyDEkeG6o28gY+G7p2EgbuG7ryBzaW5oIHRyb25nIG3DtGkgdHLGsOG7nW5nIGdpw6FvIGThu6VjLg0KDQojIyAqKjIuMi4gQmnhur9uIFBhcnQgdGltZSBqb2IqKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gcGFydF90aW1lX2pvYg0KdGFibGUoZHQkcGFydF90aW1lX2pvYikvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgYmnhur9uIHBhcnRfdGltZV9qb2INCnRhYmxlKGR0JHBhcnRfdGltZV9qb2IpDQpgYGANCg0KVuG6rXkgdHJvbmcgZGF0YSBuw6B5IGPDsyBgciB0YWJsZShkJHBhcnRfdGltZV9qb2IpWzFdL3N1bShucm93KGQpKSoxMDBgJSBzaW5oIHZpw6puIGtow7RuZyDEkWkgbMOgbSB0aMOqbSB2w6AgYHIgdGFibGUoZCRwYXJ0X3RpbWVfam9iKVsyXS9zdW0obnJvdyhkKSkqMTAwYCUgc2luaCB2acOqbiDEkWkgbMOgbSB0aMOqbQ0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKHRhYmxlKGR0JHBhcnRfdGltZV9qb2IpICwNCiAgICBtYWluICAgPSAiU2luaCB2acOqbiBjw7Mgdmnhu4djIGzDoG0gcGFydGltZSIsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKHRhYmxlKGR0JHBhcnRfdGltZV9qb2IpKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQodGFibGUoZHQkcGFydF90aW1lX2pvYikvc3VtKG5yb3coZHQpKSAqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygibGlnaHRncmVlbiIsICJsaWdodGNvcmFsIikpDQpgYGANCg0KICBCaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIHThu7cgbOG7hyBzaW5oIHZpw6puIGPDsyB2aeG7h2MgbMOgbSBwYXJ0LXRpbWUuIFRoZW8gYmnhu4N1IMSR4buTLCBwaOG6p24gbOG7m24gc2luaCB2acOqbiBraMO0bmcgY8OzIHZp4buHYyBsw6BtIHBhcnQtdGltZSwgY2hp4bq/bSB04bu3IGzhu4cgNzguNSUuIFRyb25nIGtoaSDEkcOzLCBjaOG7iSBjw7MgMjEuNSUgc2luaCB2acOqbiDEkWFuZyBsw6BtIHRow6ptIG5nb8OgaSBnaeG7nSBo4buNYy4gU+G7sSBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDIG7DoHkgY2hvIHRo4bqleSDEkWEgc+G7kSBzaW5oIHZpw6puIHbhuqtuIMawdSB0acOqbiB2aeG7h2MgaOG7jWMgaMahbiBsw6AgxJFpIGzDoG0gdGjDqm0sIGhv4bq3YyBjw7MgdGjhu4MgZ+G6t3Aga2jDsyBraMSDbiB0cm9uZyB2aeG7h2MgdMOsbSB2aeG7h2MgbMOgbSBwaMO5IGjhu6NwIHbhu5tpIGzhu4tjaCBo4buNYy4NCg0KDQojIyAqKjIuMy4gQmnhur9uIERpZXQgUXVhbGl0eSoqDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBkaWV0X3F1YWxpdHkNCnRhYmxlKGR0JGRpZXRfcXVhbGl0eSkvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCioqQuG6o25nIHThuqduIHPhu5EqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgYmnhur9uIGRpZXRfcXVhbGl0eQ0KdGFibGUoZHQkZGlldF9xdWFsaXR5KQ0KYGBgDQoNCioqKkJp4buDdSDEkeG7kyoqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSDEkeG7gyB24bq9IG5ow6NuDQpmcmVxX3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkZGlldF9xdWFsaXR5KSkNCmNvbG5hbWVzKGZyZXFfdGFibGUpIDwtIGMoImRpZXRfcXVhbGl0eSIsICJmcmVxdWVuY3kiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTDQpnZ3Bsb3QoZnJlcV90YWJsZSwgYWVzKHggPSBkaWV0X3F1YWxpdHksIHkgPSBmcmVxdWVuY3ksIGZpbGwgPSBkaWV0X3F1YWxpdHkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZyZXF1ZW5jeSksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDQpICsgICMgTmjDo24gZ2hpIGNow7oNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiRmFpciIgPSAiI0ZGRDcwMCIsICJHb29kIiA9ICIjMzJDRDMyIikpICsgIA0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBjaOG6pXQgbMaw4bujbmcgY2jhur8gxJHhu5kgxINuIHXhu5FuZyBj4bunYSBzaW5oIHZpw6puIiwNCiAgICAgICB4ID0gIkNo4bqldCBsxrDhu6NuZyBjaOG6vyDEkeG7mSDEg24gdeG7kW5nIiwNCiAgICAgICB5ID0gIlThuqduIHPhu5EiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgDQoNCg0KYGBgDQoNCkJp4buDdSDEkeG7kyB0csOqbiB0aOG7gyBoaeG7h24gdOG6p24gc3XhuqV0IMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBjaOG6vyDEkeG7mSDEg24gdeG7kW5nIGPhu6dhIHNpbmggdmnDqm4gdGhlbyBoYWkgbeG7qWMgxJHhu5k6IEZhaXIgKEtow6EpLCBHb29kIChU4buRdCkuDQoNCi0gTeG7qWMgKioqRmFpcioqKiBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu5tpIDU4MyBzaW5oIHZpw6puLCBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBzaW5oIHZpw6puIGNobyBy4bqxbmcgY2jhur8gxJHhu5kgxINuIGPhu6dhIGjhu40g4bufIG3hu6ljIHThuqFtIOG7lW4gbmjGsG5nIGNoxrBhIHRo4buxYyBz4buxIHThu5F0Lg0KDQotIE3hu6ljICoqKkdvb2QqKiogY8OzIDQxNyBzaW5oIHZpw6puIMSRw6FuaCBnacOhIHBo4bqjbiDDoW5oIG3hu5l0IG5ow7NtIMSRw6FuZyBr4buDIHNpbmggdmnDqm4gY8OzIGNo4bq/IMSR4buZIMSDbiB14buRbmcgdMawxqFuZyDEkeG7kWkgdOG7kXQuDQoNClThu6sga+G6v3QgcXXhuqMgbsOgeSwgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgxJFhIHPhu5Egc2luaCB2acOqbiBjaMawYSBjw7MgY2jhur8gxJHhu5kgxINuIHXhu5FuZyDEkeG6oXQgY2jhuqV0IGzGsOG7o25nLiDEkGnhu4F1IG7DoHkgxJHhurd0IHJhIHnDqnUgY+G6p3UgY+G6p24gbsOibmcgY2FvIG5o4bqtbiB0aOG7qWMgZGluaCBkxrDhu6FuZyB0cm9uZyBzaW5oIHZpw6puLCDEkeG7k25nIHRo4budaSBjw7MgdGjhu4MgY8OibiBuaOG6r2MgY8OhYyBnaeG6o2kgcGjDoXAgaOG7lyB0cuG7oyBi4buvYSDEg24gaOG7o3AgbMO9IHThuqFpIHRyxrDhu51uZyBo4buNYyBuaOG6sW0gY+G6o2kgdGhp4buHbiBz4bupYyBraOG7j2UgdsOgIGhp4buHdSBxdeG6oyBo4buNYyB04bqtcC4NCg0KIyMgKioyLjQuIEJp4bq/biBQYXJlbnRhbCBFZHVjYXRpb24gTGV2ZWwqKg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gcGFyZW50YWxfZWR1Y2F0aW9uX2xldmVsDQp0YWJsZShkdCRwYXJlbnRhbF9lZHVjYXRpb25fbGV2ZWwpL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biBwYXJlbnRhbF9lZHVjYXRpb25fbGV2ZWwNCnRhYmxlKGR0JHBhcmVudGFsX2VkdWNhdGlvbl9sZXZlbCkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpmcmVxX3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkcGFyZW50YWxfZWR1Y2F0aW9uX2xldmVsKSkNCmNvbG5hbWVzKGZyZXFfdGFibGUpIDwtIGMoInBhcmVudGFsX2VkdWNhdGlvbl9sZXZlbCIsICJmcmVxdWVuY3kiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTDQpnZ3Bsb3QoZnJlcV90YWJsZSwgYWVzKHggPSBwYXJlbnRhbF9lZHVjYXRpb25fbGV2ZWwsIHkgPSBmcmVxdWVuY3ksIGZpbGwgPSBwYXJlbnRhbF9lZHVjYXRpb25fbGV2ZWwpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZyZXF1ZW5jeSksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTm9uZSIgPSAiI0ZGOTk5OSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpZ2ggU2Nob29sIiA9ICIjOTlDQ0ZGIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFjaGVsb3IiID0gIiM2NkMyQTUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXN0ZXIiID0gIiNGRkQ3MDAiKSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gaOG7jWMgduG6pW4gY+G7p2EgUGjhu6UgSHV5bmgiLA0KICAgICAgIHggPSAiVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIGNoYSBt4bq5IiwNCiAgICAgICB5ID0gIlThuqduIHPhu5EiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KYGBgDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5EgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGPhu6dhIHBo4bulIGh1eW5oIHRyb25nIGLhu5kgZOG7ryBsaeG7h3Uga2jhuqNvIHPDoXQuIFRyb25nIMSRw7MsIHBo4bqnbiBs4bubbiBwaOG7pSBodXluaCBjw7MgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIHThu6sgYuG6rWMgdHJ1bmcgaOG7jWMgcGjhu5UgdGjDtG5nIHRy4bufIGzDqm4uIEPhu6UgdGjhu4MsIG5ow7NtIGPDsyB0csOsbmggxJHhu5kgdHJ1bmcgaOG7jWMgcGjhu5UgdGjDtG5nIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgduG7m2kgMzkyIG5nxrDhu51pLCB0aGVvIHNhdSBsw6AgbmjDs20gY+G7rSBuaMOibiB24bubaSAzNTAgbmfGsOG7nWkuIFPhu5EgbMaw4bujbmcgcGjhu6UgaHV5bmggY8OzIHRyw6xuaCDEkeG7mSB0aOG6oWMgc8SpIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDLCBjaOG7iSAxNjcgbmfGsOG7nWksIHRyb25nIGtoaSBuaMOzbSBraMO0bmcgY8OzIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBjaGnhur9tIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0IHbhu5tpIDkxIG5nxrDhu51pLiBT4buxIGNow6puaCBs4buHY2ggbsOgeSBjaG8gdGjhuqV5IG7hu4FuIHThuqNuZyBo4buNYyB24bqlbiBj4bunYSBwaOG7pSBodXluaCBwaOG6p24gbOG7m24g4bufIG3hu6ljIHRydW5nIGLDrG5oIMSR4bq/biBraMOhLA0KDQoNCiMjICoqMi41LiBCaeG6v24gSW50ZXJuZXQgUXVhbGl0eSoqDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBpbnRlcm5ldF9xdWFsaXR5DQp0YWJsZShkdCRpbnRlcm5ldF9xdWFsaXR5KS9zdW0obnJvdyhkdCkpDQpgYGANCg0KKipC4bqjbmcgdOG6p24gc+G7kSoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gaW50ZXJuZXRfcXVhbGl0eQ0KdGFibGUoZHQkaW50ZXJuZXRfcXVhbGl0eSkNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSDEkeG7gyB0cuG7sWMgcXVhbiBow7NhDQpmcmVxX3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZHQkaW50ZXJuZXRfcXVhbGl0eSkpDQpjb2xuYW1lcyhmcmVxX3RhYmxlKSA8LSBjKCJpbnRlcm5ldF9xdWFsaXR5IiwgImZyZXF1ZW5jeSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQNCmdncGxvdChmcmVxX3RhYmxlLCBhZXMoeCA9IGludGVybmV0X3F1YWxpdHksIHkgPSBmcmVxdWVuY3ksIGZpbGwgPSBpbnRlcm5ldF9xdWFsaXR5KSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmcmVxdWVuY3kpLCB2anVzdCA9IC0wLjMsIHNpemUgPSA0KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlBvb3IiID0gIiNGRjk5OTkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdmVyYWdlIiA9ICIjRkZENzAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR29vZCIgPSAiIzY2QzJBNSIpKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGNo4bqldCBsxrDhu6NuZyBr4bq/dCBu4buRaSBJbnRlcm5ldCIsDQogICAgICAgeCA9ICJDaOG6pXQgbMaw4bujbmcgSW50ZXJuZXQiLA0KICAgICAgIHkgPSAiVOG6p24gc+G7kSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpgYGANCg0KQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgxJFhIHPhu5Egc2luaCB2acOqbiDEkcaw4bujYyBraOG6o28gc8OhdCBjw7MgY2jhuqV0IGzGsOG7o25nIGvhur90IG7hu5FpIEludGVybmV0IOG7nyBt4bupYyBHb29kICh04buRdCksIGNoaeG6v20gNDQ3IG5nxrDhu51pLCB0aeG6v3AgdGhlbyBsw6AgbeG7qWMgQXZlcmFnZSAodHJ1bmcgYsOsbmgpIHbhu5tpIDM5MSBuZ8aw4budaS4gTmjDs20gY8OzIGNo4bqldCBsxrDhu6NuZyBr4bq/dCBu4buRaSBQb29yIChrw6ltKSBjaOG7iSBjw7MgMTYyIG5nxrDhu51pLg0KDQrEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBwaOG6p24gbOG7m24gc2luaCB2acOqbiDEkcaw4bujYyBraOG6o28gc8OhdCBjw7MgxJFp4buBdSBraeG7h24gaOG7jWMgdOG6rXAgdHLhu7FjIHR1eeG6v24gdMawxqFuZyDEkeG7kWkgdGh14bqtbiBs4bujaSBuaOG7nSB2w6BvIGvhur90IG7hu5FpIEludGVybmV0IOG7lW4gxJHhu4tuaC4gVHV5IG5oacOqbiwgduG6q24gY8OybiBt4buZdCBi4buZIHBo4bqtbiBraMO0bmcgbmjhu48gKGtob+G6o25nIDE2LjclKSBn4bq3cCBraMOzIGtoxINuIGRvIGvhur90IG7hu5FpIGvDqW0sIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgdGnDqnUgY+G7sWMgxJHhur9uIGhp4buHdSBxdeG6oyBo4buNYyB04bqtcCB2w6AgY+G6p24gxJHGsOG7o2MgeGVtIHjDqXQgxJHhu4MgY8OzIGdp4bqjaSBwaMOhcCBo4buXIHRy4bujIHBow7kgaOG7o3AuDQoNCg0KIyMgKioyLjYuIEJp4bq/biBFeHRyYWN1cnJpY3VsYXIgUGFydGljaXBhdGlvbioqDQoNCioqQuG6o25nIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBleHRyYWN1cnJpY3VsYXJfcGFydGljaXBhdGlvbg0KdGFibGUoZHQkZXh0cmFjdXJyaWN1bGFyX3BhcnRpY2lwYXRpb24pL3N1bShucm93KGR0KSkNCmBgYA0KDQoqKkLhuqNuZyB04bqnbiBz4buRKioNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biBleHRyYWN1cnJpY3VsYXJfcGFydGljaXBhdGlvbg0KdGFibGUoZHQkZXh0cmFjdXJyaWN1bGFyX3BhcnRpY2lwYXRpb24pDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZSh0YWJsZShkdCRleHRyYWN1cnJpY3VsYXJfcGFydGljaXBhdGlvbikgLA0KICAgIG1haW4gICA9ICJTaW5oIHZpw6puIHRoYW0gZ2lhIGhv4bqhdCDEkeG7mW5nIG5nb+G6oWkga2jDs2EiLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyh0YWJsZShkdCRleHRyYWN1cnJpY3VsYXJfcGFydGljaXBhdGlvbikpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZCh0YWJsZShkdCRleHRyYWN1cnJpY3VsYXJfcGFydGljaXBhdGlvbikvc3VtKG5yb3coZHQpKSAqMTAwLCAxKSwgIiUpIiksDQogICAgY29sICAgID0gYygibGlnaHRncmVlbiIsICJsaWdodGNvcmFsIikpDQpgYGANCg0KQmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiBy4bqxbmcgY2jhu4kgY8OzIDMxLjglIHNpbmggdmnDqm4gdGhhbSBnaWEgY8OhYyBob+G6oXQgxJHhu5luZyBuZ2/huqFpIGtow7NhLCB0cm9uZyBraGkgxJHDsyA2OC4yJSBraMO0bmcgdGhhbSBnaWEuIFThu7cgbOG7hyBzaW5oIHZpw6puIGtow7RuZyB0aGFtIGdpYSBraMOhIGNhbywgcGjhuqNuIMOhbmggdGjhu7FjIHRy4bqhbmcgcuG6sW5nIHBo4bqnbiBs4bubbiBzaW5oIHZpw6puIGNoxrBhIGNo4bunIMSR4buZbmcgaG/hurdjIGNoxrBhIGPDsyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBjw6FjIGhv4bqhdCDEkeG7mW5nIGLDqm4gbmdvw6BpIGzhu5twIGjhu41jLiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIHh14bqldCBwaMOhdCB04burIMOhcCBs4buxYyBo4buNYyB04bqtcCwgdGhp4bq/dSB0aMO0bmcgdGluLCBob+G6t2MgdGhp4bq/dSDEkeG7mW5nIGzhu7FjLiBWaeG7h2Mga2h1eeG6v24ga2jDrWNoIHNpbmggdmnDqm4gdGhhbSBnaWEgbmhp4buBdSBoxqFuIHbDoG8gY8OhYyBob+G6oXQgxJHhu5luZyBuZ2/huqFpIGtow7NhIGzDoCBj4bqnbiB0aGnhur90IHbDrCDEkcOieSBsw6AgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcgZ2nDunAgcsOobiBsdXnhu4duIGvhu7kgbsSDbmcgbeG7gW0sIHjDonkgZOG7sW5nIG3hu5FpIHF1YW4gaOG7hyB4w6MgaOG7mWkgdsOgIHBow6F0IHRyaeG7g24gdG/DoG4gZGnhu4duLg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCiMgKipQaOG6p24gMy4gxq/hu5pDIEzGr+G7ok5HIEtIT+G6ok5HIFbDgCBLSeG7gk0gxJDhu4pOSCBHSeG6oiBUSFVZ4bq+VCBDSE8gVOG7tiBM4buGIChN4buYVCBCSeG6vk4pKioNCg0KIyMgKiozLjEuIEdlbmRlciAoTuG7rykqKg0KDQoqKsav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkqKg0KYGBge3J9DQojIFPhu5EgbmfGsOG7nWkgbuG7ryAoZ2VuZGVyID0gIkZlbWFsZSIpIHbDoCB04buVbmcgc+G7kSBxdWFuIHPDoXQNCm5fZmVtYWxlIDwtIHN1bShkdCRnZW5kZXIgPT0gIkZlbWFsZSIpDQpuX3RvdGFsICA8LSBucm93KGR0KQ0KDQojIFTDrW5oIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdsOgIGtp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90IHbhu5tpIHThu7cgbOG7hyBr4buzIHbhu41uZyBwID0gMC41DQp0ZXN0X2ZlbWFsZSA8LSBwcm9wLnRlc3Qobl9mZW1hbGUsIG5fdG90YWwsIHAgPSAwLjUsIGNvcnJlY3QgPSBGQUxTRSkNCnRlc3RfZmVtYWxlDQpgYGANCg0KLSBU4bu3IGzhu4cgbuG7ryB0cm9uZyBk4buvIGxp4buHdSBsw6AgYHIgcm91bmQobl9mZW1hbGUgLyBuX3RvdGFsLCA0KWAuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG7DoHkgbMOgIHThu6sgYHIgcm91bmQodGVzdF9mZW1hbGUkY29uZi5pbnRbMV0sIDQpYCDEkeG6v24gYHIgcm91bmQodGVzdF9mZW1hbGUkY29uZi5pbnRbMl0sIDQpYC4NCg0KKipLaeG7g20gxJHhu4tuaCBnaeG6oyB0aHV54bq/dCoqDQoNCkdp4bqjIHRodXnhur90IMSR4bq3dCByYSBuaMawIHNhdToNCg0KLSAqKkjigoAqKjogcCA9IDAuNSAoVOG7tyBs4buHIG7hu68gbMOgIHNpbmggdmnDqm4gZ2VuZGVyIGzDoCA1MCUpDQoNCi0gKipI4oKBKio6IHAg4omgIDAuNSAoVOG7tyBs4buHIG7hu68gbMOgIHNpbmggdmnDqm4gZ2VuZGVyIGtow6FjIDUwJSkNCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgY2hvIHRo4bqleSBwLXZhbHVlID0gMC4yMjk1LCBs4bubbiBoxqFuIG3hu6ljIMO9IG5naMSpYSB0aMO0bmcgdGjGsOG7nW5nIM6xID0gMC4wNS4gRG8gxJHDsywgY2jDum5nIHRhIGtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIChI4oKAKSwgdOG7qWMgbMOgIGNoxrBhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBraOG6s25nIMSR4buLbmggcuG6sW5nIHThu7cgbOG7hyBu4buvIHRyb25nIHThu5VuZyB0aOG7gyBraMOhYyA1MCUuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBu4buvIGzDoCB04burIDQ5LjElIMSR4bq/biA1NS4zJSwgdHJvbmcgxJHDsyBjw7MgY2jhu6lhIGdpw6EgdHLhu4sgNTAlLiDEkGnhu4F1IG7DoHkgY8OgbmcgY+G7p25nIGPhu5Ega+G6v3QgbHXhuq1uIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgdOG7tyBs4buHIG7hu68gdHJvbmcgbeG6q3UgKDUyLjIlKSB2w6AgbeG7qWMgZ2nhuqMgxJHhu4tuaCA1MCUga2jDtG5nIMSR4bunIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDigJQgbmhp4buBdSBraOG6oyBuxINuZyDEkcOieSBjaOG7iSBsw6Aga+G6v3QgcXXhuqMgY+G7p2Egc+G7sSBiaeG6v24gxJHhu5luZyBuZ+G6q3Ugbmhpw6puIHRyb25nIHF1w6EgdHLDrG5oIGNo4buNbiBt4bqrdS4NCg0KICAqKlTDs20gbOG6oWkqKjogbeG6t2MgZMO5IHThu7cgbOG7hyBu4buvIHF1YW4gc8OhdCDEkcaw4bujYyB0cm9uZyBt4bqrdSBsw6AgNTIuMiUsIG5oxrBuZyB24bubaSBwLXZhbHVlIGzhu5tuIHbDoCBraG/huqNuZyB0aW4gY+G6rXkgYmFvIGfhu5NtIDUwJSwgY2jDum5nIHRhIGtow7RuZyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBu4buvIHRyb25nIHThu5VuZyB0aOG7gyBraMOhYyBiaeG7h3QgbeG7mXQgY8OhY2ggY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBzbyB24bubaSA1MCUuDQoNCiMjICoqMy4yLiBQYXJ0IFRpbWUgSm9iIChZZXMpKioNCg0KKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15KioNCg0KYGBge3J9DQojIFPhu5EgbmfGsOG7nWkgbuG7ryAoZ2VuZGVyID0gIkZlbWFsZSIpIHbDoCB04buVbmcgc+G7kSBxdWFuIHPDoXQNCm5feWVzIDwtIHN1bShkdCRwYXJ0X3RpbWVfam9iID09ICJZZXMiKQ0Kbl90b3RhbDEgIDwtIG5yb3coZHQpDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPhuq15IDk1JSB2w6Aga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgduG7m2kgdOG7tyBs4buHIGvhu7MgduG7jW5nIHAgPSAwLjUNCnRlc3RfeWVzIDwtIHByb3AudGVzdChuX3llcywgbl90b3RhbDEsIHAgPSAwLjUsIGNvcnJlY3QgPSBGQUxTRSkNCnRlc3RfeWVzDQpgYGANCg0KVOG7tyBs4buHIGNo4buNbiAiWWVzIiB0cm9uZyBt4bqrdSBsw6AgYHIgcm91bmQobl95ZXMgLyBuX3RvdGFsMSwgNClgLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbsOgeSBsw6AgdOG7qyBgciByb3VuZCh0ZXN0X3llcyRjb25mLmludFsxXSwgNClgIMSR4bq/biBgciByb3VuZCh0ZXN0X3llcyRjb25mLmludFsyXSwgNClgLg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KioNCg0KR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmggxJHGsOG7o2MgxJHhurd0IHJhIG5oxrAgc2F1Og0KDQotICoqSOKCgCoqOiBwID0gMC41IChU4bu3IGzhu4cgc2luaCB2acOqbiBjw7Mgdmnhu4djICJZZXMiIGzDoCA1MCUpDQoNCi0gKipI4oKBKio6IHAg4omgIDAuNSAoVOG7tyBs4buHIHNpbmggdmnDqm4ga2jDtG5nIGPDsyB2aeG7h2MgIlllcyIga2jDoWMgNTAlKQ0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAyLjJlLTE2LCBuaOG7jyBoxqFuIHLhuqV0IG5oaeG7gXUgc28gduG7m2kgbeG7qWMgw70gbmdoxKlhIM6xID0gMC4wNS4gRG8gxJHDsywgY2jDum5nIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBraMO0bmcgKEjigoApLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgY2jhu41uICJZZXMiIHRyb25nIHThu5VuZyB0aOG7gyBraMOhYyB24bubaSA1MCUuIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBjaOG7jW4gIlllcyIgbMOgIHThu6sgMTkuMDclIMSR4bq/biAyNC4xNSUsIGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyAwLjUsIGPDoG5nIGPhu6duZyBj4buRIHRow6ptIHZp4buHYyBiw6FjIGLhu48gSOKCgC4NCg0KKipUw7NtIGzhuqFpKio6IFThu7cgbOG7hyBjaOG7jW4gIlllcyIgdHJvbmcgbeG6q3UgbMOgIDIxLjUlLiBW4bubaSBwLXZhbHVlIHLhuqV0IG5o4buPIChwIDwgMi4yZS0xNikgdsOgIGtob+G6o25nIHRpbiBj4bqteSBraMO0bmcgY2jhu6lhIDUwJSwga+G6v3QgcXXhuqMgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBzbyB24bubaSB04bu3IGzhu4cgNTAlIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBU4bu3IGzhu4cgbsOgeSB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBt4bupYyBnaeG6oyDEkeG7i25oIGJhbiDEkeG6p3UsIHbDoCBraMO0bmcgdGjhu4MgxJHGsOG7o2MgeGVtIGzDoCBuZ+G6q3Ugbmhpw6puLg0KDQoNCiMjICoqMy4yLiBEaWV0IFF1YWxpdHkgKEdvb2QpKioNCg0KKirGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15KioNCmBgYHtyfQ0KIyBT4buRIG5nxrDhu51pIG7hu68gKGRpZXRfcXVhbGl0eSA9ICJHb29kIikgdsOgIHThu5VuZyBz4buRIHF1YW4gc8OhdA0Kbl9nb29kIDwtIHN1bShkdCRkaWV0X3F1YWxpdHkgPT0gIkdvb2QiKQ0Kbl90b3RhbDIgIDwtIG5yb3coZHQpDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPhuq15IDk1JSB2w6Aga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgduG7m2kgdOG7tyBs4buHIGvhu7MgduG7jW5nIHAgPSAwLjUNCnRlc3RfZ29vZCA8LSBwcm9wLnRlc3Qobl9nb29kLCBuX3RvdGFsMiwgcCA9IDAuNSwgY29ycmVjdCA9IEZBTFNFKQ0KdGVzdF9nb29kDQpgYGANCg0KVOG7tyBs4buHIMSRw6FuaCBnacOhICJHb29kIiB0cm9uZyBt4bqrdSBsw6AgYHIgcm91bmQobl9nb29kIC8gbl90b3RhbDIsIDQpYC4NCg0KS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG7DoHkgbMOgIHThu6sgYHIgcm91bmQodGVzdF9nb29kJGNvbmYuaW50WzFdLCA0KWAgxJHhur9uIGByIHJvdW5kKHRlc3RfZ29vZCRjb25mLmludFsyXSwgNClgLg0KDQoqKktp4buDbSDEkeG7i25oIGdp4bqjIHRodXnhur90KioNCg0KR2nhuqMgdGh1eeG6v3QgxJHGsOG7o2MgxJHhurd0IHJhIG5oxrAgc2F1Og0KDQotICoqSOKCgCoqOiBwID0gMC41IChU4bu3IGzhu4cgxJHDoW5oIGdpw6EgIkdvb2QiIGzDoCA1MCUpDQoNCi0gKipI4oKBKio6IHAg4omgIDAuNSAoVOG7tyBs4buHIMSRw6FuaCBnacOhICJHb29kIiBraMOhYyA1MCUpDQoNCkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkgcC12YWx1ZSA9IDEuMjAxZS0xNCwgbmjhu48gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSDOsSA9IDAuMDUuIERvIMSRw7MsIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIChI4oKAKS4gS+G6v3QgcXXhuqMgbsOgeSBjaOG7iSByYSBy4bqxbmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIHThu7cgbOG7hyDEkcOhbmggZ2nDoSAiR29vZCIgcXVhbiBzw6F0IMSRxrDhu6NjIHRyb25nIG3huqt1IHbDoCB04bu3IGzhu4cgZ2nhuqMgxJHhu4tuaCBsw6AgNTAlLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbsOgeSBsw6AgdOG7qyAzOC43JSDEkeG6v24gNDQuOCUsIGtow7RuZyBiYW8gZ+G7k20gNTAlLCBjw6BuZyBj4bunbmcgY+G7kSB0aMOqbSBr4bq/dCBsdeG6rW4gYsOhYyBi4buPIEjigoAuDQoNCioqVMOzbSBs4bqhaSoqOiBU4bu3IGzhu4cgxJHDoW5oIGdpw6EgIkdvb2QiIHRyb25nIG3huqt1IGzDoCA0MS43JS4gVuG7m2kgcC12YWx1ZSBy4bqldCBuaOG7jyAoMS41MjZlLTA3NCkgdsOgIGtob+G6o25nIHRpbiBj4bqteSBraMO0bmcgY2jhu6lhIGdpw6EgdHLhu4sgNTAlLCBjaMO6bmcgdGEgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgdOG7tyBs4buHIMSRw6FuaCBnacOhICJHb29kIiB0cm9uZyB04buVbmcgdGjhu4Mga2jDoWMgbeG7mXQgY8OhY2ggxJHDoW5nIGvhu4Mgc28gduG7m2kgNTAlLiBU4bu3IGzhu4cgbsOgeSB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBt4bupYyBr4buzIHbhu41uZyBiYW4gxJHhuqd1LCBjaG8gdGjhuqV5IHh1IGjGsOG7m25nIMSRw6FuaCBnacOhICJHb29kIiBraMO0bmcgY2hp4bq/bSDEkWEgc+G7kSB0cm9uZyB04buVbmcgdGjhu4MuDQoNCg0KIyMgKiozLjMuIEV4dHJhY3VycmljdWxhciBQcGFydGljaXBhdGlvbiAoWWVzKSoqDQoNCioqxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSoqDQpgYGB7cn0NCiMgU+G7kSBuZ8aw4budaSBu4buvIChleHRyYWN1cnJpY3VsYXJfcGFydGljaXBhdGlvbiA9ICJZZXMiKSB2w6AgdOG7lW5nIHPhu5EgcXVhbiBzw6F0DQpuX3llczEgPC0gc3VtKGR0JGV4dHJhY3VycmljdWxhcl9wYXJ0aWNpcGF0aW9uID09ICJZZXMiKQ0Kbl90b3RhbDMgIDwtIG5yb3coZHQpDQoNCiMgVMOtbmgga2hv4bqjbmcgdGluIGPhuq15IDk1JSB2w6Aga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgduG7m2kgdOG7tyBs4buHIGvhu7MgduG7jW5nIHAgPSAwLjUNCnRlc3RfeWVzMSA8LSBwcm9wLnRlc3Qobl95ZXMxLCBuX3RvdGFsMSwgcCA9IDAuNSwgY29ycmVjdCA9IEZBTFNFKQ0KdGVzdF95ZXMxDQoNCmBgYA0KDQpU4bu3IGzhu4cgY2jhu41uICJZZXMiIHRyb25nIG3huqt1IGzDoCBgciByb3VuZChuX3llczEgLyBuX3RvdGFsMSwgNClgLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbsOgeSBsw6AgdOG7qyBgciByb3VuZCh0ZXN0X3llczEkY29uZi5pbnRbMV0sIDQpYCDEkeG6v24gYHIgcm91bmQodGVzdF95ZXMxJGNvbmYuaW50WzJdLCA0KWAuDQoNCioqS2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QqKg0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KLSAqKkjigoAqKjogcCA9IDAuNSAoVOG7tyBs4buHIGNo4buNbiAiWWVzIiBsw6AgNTAlKQ0KDQotICoqSOKCgSoqOiBwIOKJoCAwLjUgKFThu7cgbOG7hyBjaOG7jW4gIlllcyIga2jDoWMgNTAlKQ0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHAtdmFsdWUgPCAyLjJlLTE2LCBy4bqldCBuaOG7jyBzbyB24bubaSBt4bupYyDDvSBuZ2jEqWEgzrEgPSAwLjA1LiBEbyDEkcOzLCBjaMO6bmcgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyAoSOKCgCkuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiBt4bqhbmggbeG6vSBy4bqxbmcgdOG7tyBs4buHIGNo4buNbiAiWWVzIiBraMOhYyB24bubaSA1MCUuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NSUgbMOgIHThu6sgMjguOTklIMSR4bq/biAzNC43NSUsIGtow7RuZyBjaOG7qWEgZ2nDoSB0cuG7iyA1MCUsIGPDoG5nIGto4bqzbmcgxJHhu4tuaCBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoqKlTDs20gbOG6oWkqKjogVOG7tyBs4buHIGNo4buNbiAiWWVzIiB0cm9uZyBt4bqrdSBsw6AgMzEuOCUuIFbhu5tpIHAtdmFsdWUgY+G7sWMgbmjhu48gdsOgIGtob+G6o25nIHRpbiBj4bqteSBraMO0bmcgY2jhu6lhIDUwJSwgY2jDum5nIHRhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBjaOG7jW4gIlllcyIgdHJvbmcgdOG7lW5nIHRo4buDIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIDUwJS4gxJDDonkga2jDtG5nIHBo4bqjaSBsw6Aga+G6v3QgcXXhuqMgbmfhuqt1IG5oacOqbiwgbcOgIGzDoCBt4buZdCBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLDtSBy4buHdC4NCg0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCiMgKipQaOG6p24gNC4gUEjDgk4gVMONQ0ggTeG7kEkgUVVBTiBI4buGIEdJ4buuQSBIQUkgQknhur5OIMSQ4buKTkggVMONTkgqKg0KDQojIyAqKjQuMS4gR2VuZGVyIHbDoCBQYXJ0IFRpbWUgSm9iKioNCg0KIyMjICoqNC4xLjEuIELhuqNuZyB04bqnbiBz4buRKioNCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBz4buRIGNow6lvIChjcm9zcy10YWJ1bGF0aW9uKSBnaeG7r2EgR2VuZGVyIHbDoCBQYXJ0IFRpbWUgSm9iDQp0YWJsZV9nZW5kZXJfam9iIDwtIHRhYmxlKGR0JGdlbmRlciwgZHQkcGFydF90aW1lX2pvYikNCnRhYmxlX2dlbmRlcl9qb2INCmBgYA0KDQoNCg0KYGBge3J9DQpkaWZmX2NvdW50IDwtIHRhYmxlX2dlbmRlcl9qb2JbIkZlbWFsZSIsICJZZXMiXSAtIHRhYmxlX2dlbmRlcl9qb2JbIk1hbGUiLCAiWWVzIl0NCmRpZmZfbm90X293bmVyX2NvdW50IDwtIHRhYmxlX2dlbmRlcl9qb2JbIkZlbWFsZSIsICJObyJdIC0gdGFibGVfZ2VuZGVyX2pvYlsiTWFsZSIsICJObyJdDQoNCmNhdCgiTuG7ryBjw7Mgdmnhu4djIG5oaeG7gXUgaMahbiBuYW06IiwgZGlmZl9jb3VudCwgIm5nxrDhu51pXG4iKQ0KY2F0KCJO4buvIGtow7RuZyBjw7Mgdmnhu4djIG5oaeG7gXUgaMahbiBuYW06IiwgZGlmZl9ub3Rfb3duZXJfY291bnQsICJuZ8aw4budaVxuIikNCmBgYA0KDQojIyMgKio0LjEuMi4gQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KDQojIFThu5VuZyBz4buRIG3huqt1DQp0b3RhbF9zYW1wbGVzIDwtIG5yb3coZHQpDQoNCiMgVOG7tyBs4buHIHR1eeG7h3QgxJHhu5FpIHRyw6puIHThu5VuZyBz4buRIG3huqt1DQpwcm9wX2FicyA8LSB0YWJsZV9nZW5kZXJfam9iIC8gdG90YWxfc2FtcGxlcw0KDQojIFThu7cgbOG7hyB0xrDGoW5nIMSR4buRaSB0cm9uZyB04burbmcgZ2nhu5tpIHTDrW5oICh0aGVvIGjDoG5nKQ0KcHJvcF9ieV9nZW5kZXIgPC0gcHJvcC50YWJsZSh0YWJsZV9nZW5kZXJfam9iLCBtYXJnaW4gPSAxKSAjdMOtbmggdOG7tyBs4buHIGNobyB04burbmcgaMOgbmcsIHThu6ljIGzDoCBjaGlhIHThu6tuZyBnacOhIHRy4buLIHRyb25nIGjDoG5nIMSRw7MgY2hvIHThu5VuZyBj4bunYSBow6BuZyDEkcOzLg0KDQojIEluIHThu7cgbOG7hyB0dXnhu4d0IMSR4buRaSB0csOqbiB04buVbmcgc+G7kSBt4bqrdQ0KcHJpbnQoIlThu7cgbOG7hyB0dXnhu4d0IMSR4buRaSAodHLDqm4gdOG7lW5nIHPhu5EgbeG6q3UpOiIpDQpwcmludChyb3VuZChwcm9wX2FicywgNCkpDQpgYGANCmBgYHtyfQ0KDQojIMSQxrBhIGThu68gbGnhu4d1IHbhu4EgZOG6oW5nIGxvbmcgxJHhu4MgduG6vQ0KZGZfcHJvcCA8LSBhcy5kYXRhLmZyYW1lKHByb3BfYnlfZ2VuZGVyKQ0KY29sbmFtZXMoZGZfcHJvcCkgPC0gYygiR2VuZGVyIiwgIlBhcnR0aW1lSm9iIiwgIlByb3BvcnRpb24iKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IG5ow7NtDQpnZ3Bsb3QoZGZfcHJvcCwgYWVzKHggPSBHZW5kZXIsIHkgPSBQcm9wb3J0aW9uLCBmaWxsID0gUGFydHRpbWVKb2IpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KFByb3BvcnRpb24sIGFjY3VyYWN5ID0gMC4xKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHMgPSBjKDAsIDEpKSArDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIHNpbmggdmnDqm4gY8OzL2tow7RuZyBjw7Mgdmnhu4djIGzDoG0gcGFydC10aW1lIHRoZW8gZ2nhu5tpIHTDrW5oIiwNCiAgICAgICB4ID0gIkdp4bubaSB0w61uaCIsIHkgPSAiVOG7tyBs4buHICglKSIsIGZpbGwgPSAiVmnhu4djIGzDoG0gcGFydC10aW1lIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCkJp4buDdSDEkeG7kyBj4buZdCBuaMOzbSB0aOG7gyBoaeG7h24gdOG7tyBs4buHIHNpbmggdmnDqm4gbmFtIHbDoCBu4buvIGPDsyBob+G6t2Mga2jDtG5nICoqKmPDsyoqKiB2aeG7h2MgbMOgbSBwYXJ0LXRpbWUsIGNobyB0aOG6pXkgcGjhuqduIGzhu5tuIHNpbmggdmnDqm4g4bufIGPhuqMgaGFpIGdp4bubaSDEkeG7gXUga2jDtG5nIGzDoG0gdGjDqm0sIHbhu5tpIHThu7cgbOG7hyAqKipraMO0bmcqKiogbMOgbSBwYXJ0LXRpbWUgbOG6p24gbMaw4bujdCBsw6AgNzksOSUg4bufIG7hu68gdsOgIDc3LDAlIOG7nyBuYW0uIFThu7cgbOG7hyBzaW5oIHZpw6puIG5hbSBsw6BtIHZp4buHYyBwYXJ0LXRpbWUgY2FvIGjGoW4gbuG7ryBt4buZdCBjaMO6dCwgbOG6p24gbMaw4bujdCBsw6AgMjMsMCUgc28gduG7m2kgMjAsMSUsIGNobyB0aOG6pXkgbmFtIGdp4bubaSBjw7MgeHUgaMaw4bubbmcgdGhhbSBnaWEgdmnhu4djIGzDoG0gdGjDqm0gbmhp4buBdSBoxqFuIGtob+G6o25nIDIsOSDEkWnhu4NtIHBo4bqnbiB0csSDbS4gTeG6t2MgZMO5IGPDsyBz4buxIGtow6FjIGJp4buHdCBuaOG7jyBuw6B5LCBtw7QgaMOsbmggY2h1bmcgY2hvIHRo4bqleSDGsHUgdGnDqm4gaOG7jWMgdOG6rXAgdG/DoG4gdGjhu51pIGdpYW4gduG6q24gY2hp4bq/bSDEkWEgc+G7kSB2w6Agdmnhu4djIGzDoG0gcGFydC10aW1lIGtow7RuZyBwaOG7lSBiaeG6v24g4bufIGPhuqMgaGFpIG5ow7NtLiBT4buxIGNow6puaCBs4buHY2ggbsOgeSBjw7MgdGjhu4MgcGjhuqNuIMOhbmgga2jDoWMgYmnhu4d0IHbhu4EgY8ahIGjhu5lpIHZp4buHYyBsw6BtLCBuaHUgY+G6p3UgdMOgaSBjaMOtbmggaG/hurdjIHPhu58gdGjDrWNoLCBuaMawbmcgxJHhu4MgeMOhYyDEkeG7i25oIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBj4bunYSBz4buxIGtow6FjIGJp4buHdCBj4bqnbiB0aOG7sWMgaGnhu4duIGPDoWMga2nhu4NtIMSR4buLbmggY2h1ecOqbiBzw6J1LiBU4buVbmcgdGjhu4MsIGJp4buDdSDEkeG7kyBtaW5oIGjhu41hIHLDtSBy4bqxbmcgdmnhu4djIGzDoG0gcGFydC10aW1lIGtow7RuZyBwaOG6o2kgbMOgIGhv4bqhdCDEkeG7mW5nIHBo4buVIGJp4bq/biB0cm9uZyBzaW5oIHZpw6puLCBkw7kgbmFtIGdp4bubaSBjw7MgeHUgaMaw4bubbmcgbMOgbSB0aMOqbSBuaGnhu4F1IGjGoW4gbuG7ry4NCg0KDQojIyMgKio0LjEuMy4gS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6ogKioNCg0KYGBge3J9DQpjaGlfdGVzdCA8LSBjaGlzcS50ZXN0KHRhYmxlX2dlbmRlcl9qb2IpDQpjaGlfdGVzdA0KYGBgDQoNCmBgYHtyfQ0KY2hpX3NxX3ZhbHVlIDwtIHJvdW5kKGNoaV90ZXN0JHN0YXRpc3RpYywgNCkNCmRmX3ZhbHVlIDwtIGNoaV90ZXN0JHBhcmFtZXRlcg0KcF92YWx1ZSA8LSByb3VuZChjaGlfdGVzdCRwLnZhbHVlLCA0KQ0KYGBgDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktYsOsbmggcGjGsMahbmc6IGByIGNoaV9zcV92YWx1ZWANCg0KLSBC4bqtYyB04buxIGRvIChkZik6IGByIGRmX3ZhbHVlYA0KDQotIEdpw6EgdHLhu4sgcDogcF92YWx1ZSA9IGByIHBfdmFsdWVgDQoNCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGEgPSAwLjA1JCwgYHIgaWZlbHNlKHBfdmFsdWUxID4gMC4wNSwgDQogICJ2w6wgcF92YWx1ZSA+IDAuMDUsIHRhIGtow7RuZyDEkeG7pyBjxqEgc+G7nyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCwgdOG7qWMgbMOgIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHIMSRw6FuZyBr4buDIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIG5naOG7gSBuZ2hp4buHcC4iLCANCg0KKioqTmjhuq1uIHjDqXQqKio6IEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIHBow6JuIGLhu5Egbmdo4buBIG5naGnhu4dwIGdp4buvYSBuYW0gdsOgIG7hu68gdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UgbsOgeS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgZ2nhu5tpIHTDrW5oIGtow7RuZyBwaOG6o2kgbMOgIHnhur91IHThu5EgcXV54bq/dCDEkeG7i25oIHLDtSByw6BuZyDEkeG7kWkgduG7m2kgbmdo4buBIG5naGnhu4dwIHRyb25nIG5ow7NtIHF1YW4gc8OhdCBoaeG7h24gdOG6oWkuIFR1eSBuaGnDqm4sIGvhur90IHF14bqjIGPDsyB0aOG7gyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIHF1eSBtw7QgbeG6q3UgaG/hurdjIGPDoWMgeeG6v3UgdOG7kSB4w6MgaOG7mWksIHbEg24gaMOzYSwga2luaCB04bq/IHBo4bupYyB04bqhcCBraMOhYyBjaMawYSDEkcaw4bujYyB4ZW0geMOpdC4gRG8gxJHDsywgY+G6p24gY8OzIHRow6ptIGPDoWMgbmdoacOqbiBj4bupdSB24bubaSBk4buvIGxp4buHdSBs4bubbiBoxqFuIGhv4bq3YyBwaMOibiB0w61jaCBzw6J1IGjGoW4gY8OhYyB54bq/dSB04buRIGxpw6puIHF1YW4gxJHhu4MgY8OzIGPDoWkgbmjDrG4gdG/DoG4gZGnhu4duIGjGoW4gduG7gSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCB2w6Agbmdo4buBIG5naGnhu4dwLg0KDQojIyAqKjQuMi4gR2VuZGVyIHbDoCAgRGlldCBRdWFsaXR5KioNCg0KIyMjICoqNC4yLjEuIELhuqNuZyB04bqnbiBz4buRKioNCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBz4buRIGNow6lvIChjcm9zcy10YWJ1bGF0aW9uKSBnaeG7r2EgR2VuZGVyIHbDoCBEaWV0IFF1YWxpdHkNCnRhYmxlX2dlbmRlcl9kcSA8LSB0YWJsZShkdCRnZW5kZXIsIGR0JGRpZXRfcXVhbGl0eSkNCnRhYmxlX2dlbmRlcl9kcQ0KYGBgDQoNCmBgYHtyfQ0KZGlmZl9mYWlyIDwtIHRhYmxlX2dlbmRlcl9kcVsiRmVtYWxlIiwgIkZhaXIiXSAtIHRhYmxlX2dlbmRlcl9kcVsiTWFsZSIsICJGYWlyIl0NCmRpZmZfZ29vZCA8LSB0YWJsZV9nZW5kZXJfZHFbIkZlbWFsZSIsICJHb29kIl0gLSB0YWJsZV9nZW5kZXJfZHFbIk1hbGUiLCAiR29vZCJdDQoNCmNhdCgiTuG7ryBjw7MgY2jhur8gxJHhu5kgxINuIEZhaXIgbmhp4buBdSBoxqFuIG5hbToiLCBkaWZmX2ZhaXIsICJuZ8aw4budaVxuIikNCmNhdCgiTuG7ryBjw7MgY2jhur8gxJHhu5kgxINuIEdvb2Qgbmhp4buBdSBoxqFuIG5hbToiLCBkaWZmX2dvb2QsICJuZ8aw4budaVxuIikNCg0KYGBgDQoNCiMjIyAqKjQuMi4yLiBC4bqjbmcgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojIFThu5VuZyBz4buRIG3huqt1DQp0b3RhbF9zYW1wbGVzMiA8LSBucm93KGR0KQ0KDQojIFThu7cgbOG7hyB0dXnhu4d0IMSR4buRaSB0csOqbiB04buVbmcgc+G7kSBt4bqrdQ0KcHJvcF9hYnMyIDwtIHRhYmxlX2dlbmRlcl9kcSAvIHRvdGFsX3NhbXBsZXMyDQoNCiMgVOG7tyBs4buHIHTGsMahbmcgxJHhu5FpIHRyb25nIHThu6tuZyBnaeG7m2kgdMOtbmggKHRoZW8gaMOgbmcpDQpwcm9wX2J5X2dlbmRlcjIgPC0gcHJvcC50YWJsZSh0YWJsZV9nZW5kZXJfZHEsIG1hcmdpbiA9IDEpICN0w61uaCB04bu3IGzhu4cgY2hvIHThu6tuZyBow6BuZywgdOG7qWMgbMOgIGNoaWEgdOG7q25nIGdpw6EgdHLhu4sgdHJvbmcgaMOgbmcgxJHDsyBjaG8gdOG7lW5nIGPhu6dhIGjDoG5nIMSRw7MuDQoNCiMgSW4gdOG7tyBs4buHIHR1eeG7h3QgxJHhu5FpIHRyw6puIHThu5VuZyBz4buRIG3huqt1DQpwcmludCgiVOG7tyBs4buHIHR1eeG7h3QgxJHhu5FpICh0csOqbiB04buVbmcgc+G7kSBt4bqrdSk6IikNCnByaW50KHJvdW5kKHByb3BfYWJzMiwgNCkpDQpgYGANCg0KDQpgYGB7cn0NCmRmIDwtIGFzLmRhdGEuZnJhbWUodGFibGVfZ2VuZGVyX2RxKQ0KY29sbmFtZXMoZGYpIDwtIGMoIkdlbmRlciIsICJEaWV0UXVhbGl0eSIsICJDb3VudCIpDQoNCmdncGxvdChkZiwgYWVzKHggPSBEaWV0UXVhbGl0eSwgeSA9IENvdW50LCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB2anVzdCA9IC0wLjMsIHNpemUgPSAzLjUpICsNCiAgbGFicyh0aXRsZSA9ICJT4buRIGzGsOG7o25nIHRoZW8gZ2nhu5tpIHTDrW5oIHbDoCBt4bupYyDEkeG7mSBjaOG6vyDEkeG7mSDEg24iLA0KICAgICAgIHggPSAiTeG7qWMgxJHhu5kgY2jhur8gxJHhu5kgxINuIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmciLA0KICAgICAgIGZpbGwgPSAiR2nhu5tpIHTDrW5oIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCkJp4buDdSDEkeG7kyBj4buZdCBuaMOzbSBuw6B5IGzDoCBt4buZdCBtaW5oIGjhu41hIHRy4buxYyBxdWFuIHbDoCBzaW5oIMSR4buZbmcgduG7gSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIG3hu6ljIMSR4buZIGNo4bqldCBsxrDhu6NuZyBjaOG6vyDEkeG7mSDEg24gdHJvbmcgbmjDs20gc2luaCB2acOqbiDEkcaw4bujYyBraOG6o28gc8OhdC4gQmEgbeG7qWMgxJHDoW5oIGdpw6EgY2jhuqV0IGzGsOG7o25nIGNo4bq/IMSR4buZIMSDbiDigJMgIkdvb2QiIChU4buRdCksICJGYWlyIiAoS2jDoSkg4oCTIMSRxrDhu6NjIHRo4buDIGhp4buHbiBk4buNYyB0aGVvIHRy4bulYyBob8OgbmgsIHRyb25nIGtoaSB0cuG7pWMgdHVuZyBiaeG7g3UgdGjhu4sgc+G7kSBsxrDhu6NuZyBzaW5oIHZpw6puIHRodeG7mWMgdOG7q25nIG5ow7NtLiBNw6B1IHPhuq9jIMSRxrDhu6NjIHPhu60gZOG7pW5nIGhp4buHdSBxdeG6oyDEkeG7gyBwaMOibiBiaeG7h3QgZ2nhu5tpIHTDrW5oOiBu4buvIHNpbmggxJHGsOG7o2MgYmnhu4N1IHRo4buLIGLhurFuZyBj4buZdCBtw6B1IMSR4buPIGNhbSwgY8OybiBuYW0gc2luaCBi4bqxbmcgbcOgdSB4YW5oIG5n4buNYy4gVmnhu4djIGfhuq9uIHPhu5EgbGnhu4d1IGPhu6UgdGjhu4MgbMOqbiBt4buXaSBj4buZdCBnacO6cCBuZ8aw4budaSB4ZW0gbmhhbmggY2jDs25nIG7huq9tIGLhuq90IMSRxrDhu6NjIHF1eSBtw7QgdOG7q25nIG5ow7NtLg0KDQpE4buvIGxp4buHdSBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBzaW5oIHZpw6puIGPDsyBjaOG6vyDEkeG7mSDEg24g4bufIG3hu6ljIHRydW5nIGLDrG5oIGhv4bq3YyB04buRdC4gTmjDs20gIkZhaXIiIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQg4bufIGPhuqMgaGFpIGdp4bubaSwgduG7m2kgMzAxIG7hu68gc2luaCB2w6AgMjIxIG5hbSBzaW5oIOKAkyBjaG8gdGjhuqV5IMSRw6J5IGzDoCBt4bupYyBwaOG7lSBiaeG6v24gbmjhuqV0LiBOaMOzbSAiR29vZCIgY8WpbmcgY8OzIHPhu5EgbMaw4bujbmcgxJHDoW5nIGvhu4MsIHbhu5tpIDI4MiBu4buvIHbDoCAxOTYgbmFtLCBwaOG6o24gw6FuaCBy4bqxbmcgduG6q24gY8OzIG3hu5l0IHThu4kgbOG7hyBs4bubbiBzaW5oIHZpw6puIGR1eSB0csOsIMSRxrDhu6NjIGNo4bq/IMSR4buZIMSDbiB0w61jaCBj4buxYy4NCg0KDQojIyMgKio0LjIuMy4gS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6ogKioNCg0KYGBge3J9DQpjaGlfdGVzdDIgPC0gY2hpc3EudGVzdCh0YWJsZV9nZW5kZXJfZHEpDQpjaGlfdGVzdDINCmBgYA0KDQpgYGB7cn0NCmNoaV9zcV92YWx1ZTIgPC0gcm91bmQoY2hpX3Rlc3QyJHN0YXRpc3RpYywgNCkNCmRmX3ZhbHVlMiA8LSBjaGlfdGVzdDIkcGFyYW1ldGVyDQpwX3ZhbHVlMiA8LSByb3VuZChjaGlfdGVzdDIkcC52YWx1ZSwgNCkNCmBgYA0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLWLDrG5oIHBoxrDGoW5nOiBgciBjaGlfc3FfdmFsdWUyYA0KDQotIELhuq1jIHThu7EgZG8gKGRmKTogYHIgZGZfdmFsdWUyYA0KDQotIEdpw6EgdHLhu4sgcDogcF92YWx1ZSA9IGByIHBfdmFsdWUyYA0KDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhID0gMC4wNSQsIGByIGlmZWxzZShwX3ZhbHVlMSA+IDAuMDUsIA0KICAidsOsIHBfdmFsdWUgPiAwLjA1LCB0YSBraMO0bmcgxJHhu6cgY8ahIHPhu58gYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAsIHThu6ljIGzDoCBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hyDEkcOhbmcga+G7gyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBjaOG6pXQgbMaw4bujbmcgxINuIHXhu5FuZy4iLCANCg0KKioqTmjhuq1uIHjDqXQqKio6IEvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIGNo4bq/IMSR4buZIMSDbiB14buRbmcgZ2nhu69hIG5hbSB2w6AgbuG7ryB0cm9uZyBuaMOzbSBzaW5oIHZpw6puIMSRxrDhu6NjIGto4bqjbyBzw6F0LiBOw7NpIGPDoWNoIGtow6FjLCB4dSBoxrDhu5tuZyBs4buxYSBjaOG7jW4gY8OhYyBjaOG6vyDEkeG7mSDEg24gbmjGsCBHb29kLCBGYWlsLCBQb29yIGtow7RuZyBwaOG7pSB0aHXhu5ljIHLDtSByw6BuZyB2w6BvIGdp4bubaSB0w61uaC4gxJBp4buBdSBuw6B5IGfhu6NpIMO9IHLhurFuZyBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGNo4bq/IMSR4buZIMSDbiB14buRbmcgY+G7p2Egc2luaCB2acOqbiBjw7MgdGjhu4MgxJHhur9uIHThu6sgbmjhu69uZyBraMOtYSBj4bqhbmgga2jDoWMgbmjGsCBuaOG6rW4gdGjhu6ljIHbhu4Egc+G7qWMga2jhu49lLCDhuqNuaCBoxrDhu59uZyB4w6MgaOG7mWksIMSRaeG7gXUga2nhu4duIHTDoGkgY2jDrW5oLCBoYXkgdGjDs2kgcXVlbiBjw6EgbmjDom4g4oCUIGjGoW4gbMOgIHThu6sgZ2nhu5tpIHTDrW5oLiDEkOG7gyBjw7MgY8OhaSBuaMOsbiDEkeG6p3kgxJHhu6cgdsOgIHPDonUgc+G6r2MgaMahbiwgY+G6p24gY8OzIHRow6ptIGPDoWMgbmdoacOqbiBj4bupdSBr4bq/dCBo4bujcCBuaGnhu4F1IGJp4bq/biBz4buRIHbDoCBt4bqrdSBk4buvIGxp4buHdSBs4bubbiBoxqFuLg0KDQojIyAqKjQuMy4gIERpZXQgUXVhbGl0eSB2w6AgUGFydCBUaW1lIEpvYioqDQoNCiMjIyAqKjQuMy4xLiBC4bqjbmcgdOG6p24gc+G7kSoqDQoNCmBgYHtyfQ0KIyBC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyAoY3Jvc3MtdGFidWxhdGlvbikgZ2nhu69hIGRpZXRfcXVhbGl0eSB2w6AgcGFydF90aW1lX2pvYg0KdGFibGVfZGlldF9waiA8LSB0YWJsZShkdCRkaWV0X3F1YWxpdHksIGR0JHBhcnRfdGltZV9qb2IpDQp0YWJsZV9kaWV0X3BqDQpgYGANCg0KYGBge3J9DQojIFNvIHPDoW5oIGdp4buvYSBHb29kIHbDoCBGYWlyDQpkaWZmX3llc19nb29kX2ZhaXIgPC0gdGFibGVfZGlldF9walsiR29vZCIsICJZZXMiXSAtIHRhYmxlX2RpZXRfcGpbIkZhaXIiLCAiWWVzIl0NCmRpZmZfbm9fZ29vZF9mYWlyIDwtIHRhYmxlX2RpZXRfcGpbIkdvb2QiLCAiTm8iXSAtIHRhYmxlX2RpZXRfcGpbIkZhaXIiLCAiTm8iXQ0KDQpjYXQoIkNo4bq/IMSR4buZIMSDbiBHb29kIGPDsyB2aeG7h2Mgbmhp4buBdSBoxqFuIEZhaXI6IiwgZGlmZl95ZXNfZ29vZF9mYWlyLCAibmfGsOG7nWlcbiIpDQpjYXQoIkNo4bq/IMSR4buZIMSDbiBHb29kIGtow7RuZyBjw7Mgdmnhu4djIG5oaeG7gXUgaMahbiBGYWlyOiIsIGRpZmZfbm9fZ29vZF9mYWlyLCAibmfGsOG7nWlcbiIpDQoNCmBgYA0KDQojIyMgKio0LjMuMi4gQuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KDQojIFThu5VuZyBz4buRIG3huqt1DQp0b3RhbF9zYW1wbGVzMyA8LSBucm93KGR0KQ0KDQojIFThu7cgbOG7hyB0dXnhu4d0IMSR4buRaSB0csOqbiB04buVbmcgc+G7kSBt4bqrdQ0KcHJvcF9hYnMzIDwtIHRhYmxlX2RpZXRfcGogLyB0b3RhbF9zYW1wbGVzMw0KDQojIFThu7cgbOG7hyB0xrDGoW5nIMSR4buRaSB0cm9uZyB04burbmcgZ2nhu5tpIHTDrW5oICh0aGVvIGjDoG5nKQ0KcHJvcF9ieV9kcTwtIHByb3AudGFibGUodGFibGVfZGlldF9waiwgbWFyZ2luID0gMSkgI3TDrW5oIHThu7cgbOG7hyBjaG8gdOG7q25nIGjDoG5nLCB04bupYyBsw6AgY2hpYSB04burbmcgZ2nDoSB0cuG7iyB0cm9uZyBow6BuZyDEkcOzIGNobyB04buVbmcgY+G7p2EgaMOgbmcgxJHDsy4NCg0KIyBJbiB04bu3IGzhu4cgdHV54buHdCDEkeG7kWkgdHLDqm4gdOG7lW5nIHPhu5EgbeG6q3UNCnByaW50KCJU4bu3IGzhu4cgdHV54buHdCDEkeG7kWkgKHRyw6puIHThu5VuZyBz4buRIG3huqt1KToiKQ0KcHJpbnQocm91bmQocHJvcF9hYnMzLCA0KSkNCmBgYA0KDQpgYGB7cn0NCiMgSW4gdOG7tyBs4buHIHTGsMahbmcgxJHhu5FpIHRyb25nIHThu6tuZyBnaeG7m2kgdMOtbmgNCnByaW50KCJU4bu3IGzhu4cgdMawxqFuZyDEkeG7kWkgdHJvbmcgdOG7q25nIGdp4bubaSB0w61uaDoiKQ0KcHJpbnQocm91bmQocHJvcF9ieV9nZW5kZXIsIDQpKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmRmX3Byb3BfZHEgPC0gYXMuZGF0YS5mcmFtZShwcm9wX2J5X2RxKQ0KY29sbmFtZXMoZGZfcHJvcF9kcSkgPC0gYygiRGlldFF1YWxpdHkiLCAiUGFydFRpbWVKb2IiLCAiUHJvcG9ydGlvbiIpDQoNCmdncGxvdChkZl9wcm9wX2RxLCBhZXMoeCA9IERpZXRRdWFsaXR5LCB5ID0gUHJvcG9ydGlvbiwgZmlsbCA9IFBhcnRUaW1lSm9iKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoUHJvcG9ydGlvbiwgYWNjdXJhY3kgPSAwLjEpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMC4zLA0KICAgICAgICAgICAgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArDQogIGxhYnModGl0bGUgPSAiVOG7tyBs4buHIHNpbmggdmnDqm4gY8OzL2tow7RuZyBjw7Mgdmnhu4djIGzDoG0gdGhlbyBjaOG6pXQgbMaw4bujbmcgY2jhur8gxJHhu5kgxINuIiwNCiAgICAgICB4ID0gIkNo4bqldCBsxrDhu6NuZyBjaOG6vyDEkeG7mSDEg24iLA0KICAgICAgIHkgPSAiVOG7tyBs4buHICglKSIsDQogICAgICAgZmlsbCA9ICJWaeG7h2MgbMOgbSBwYXJ0LXRpbWUiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpDQoNCmBgYA0KDQpCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHThu7cgbOG7hyBzaW5oIHZpw6puIGzDoG0gdsOgIGtow7RuZyBsw6BtIHBhcnQtdGltZSB0aGVvIGhhaSBt4bupYyBjaOG6pXQgbMaw4bujbmcgY2jhur8gxJHhu5kgxINuICJGYWlyIiB2w6AgIkdvb2QiLiBQaOG6p24gbOG7m24gc2luaCB2acOqbiBraMO0bmcgbMOgbSBwYXJ0LXRpbWUsIHbhu5tpIDc5LDYlIOG7nyBuaMOzbSAiRmFpciIgdsOgIDc3LDAlIOG7nyBuaMOzbSAiR29vZCIuIFThu7cgbOG7hyBsw6BtIHBhcnQtdGltZSDhu58gbmjDs20gIkdvb2QiICgyMywwJSkgY2FvIGjGoW4gbmjDs20gIkZhaXIiICgyMCw0JSkga2hv4bqjbmcgMiw2IMSRaeG7g20gcGjhuqduIHRyxINtLCBjaG8gdGjhuqV5IHNpbmggdmnDqm4gY8OzIGNo4bq/IMSR4buZIMSDbiB04buRdCBoxqFuIGPDsyB4dSBoxrDhu5tuZyBsw6BtIHRow6ptIG5oaeG7gXUgaMahbi4NCg0KDQojIyMgKio0LjMuMy4gS2nhu4NtIMSR4buLbmggVGjhu5FuZyBrw6ogKioNCg0KYGBge3J9DQpjaGlfdGVzdDMgPC0gY2hpc3EudGVzdCh0YWJsZV9kaWV0X3BqKQ0KY2hpX3Rlc3QzDQoNCmBgYA0KDQpgYGB7cn0NCmNoaV9zcV92YWx1ZTMgPC0gcm91bmQoY2hpX3Rlc3QzJHN0YXRpc3RpYywgNCkNCmRmX3ZhbHVlMyA8LSBjaGlfdGVzdDMkcGFyYW1ldGVyDQpwX3ZhbHVlMyA8LSByb3VuZChjaGlfdGVzdDMkcC52YWx1ZSwgNCkNCmBgYA0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLWLDrG5oIHBoxrDGoW5nOiBgciBjaGlfc3FfdmFsdWUzYA0KDQotIELhuq1jIHThu7EgZG8gKGRmKTogYHIgZGZfdmFsdWUzYA0KDQotIEdpw6EgdHLhu4sgcDogcF92YWx1ZSA9IGByIHBfdmFsdWUzYA0KDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhID0gMC4wNSQsIGByIGlmZWxzZShwX3ZhbHVlMSA+IDAuMDUsIA0KICAidsOsIHBfdmFsdWUgPiAwLjA1LCB0YSBraMO0bmcgxJHhu6cgY8ahIHPhu58gYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAsIHThu6ljIGzDoCBraMO0bmcgY8OzIG3hu5FpIHF1YW4gaOG7hyDEkcOhbmcga+G7gyBnaeG7r2EgY2jhur8gxJHhu5kgxINuIHbDoCBt4bupYyDEkeG7mSBjw7Mgdmnhu4djIGzDoG0uIiwgDQoNCioqKk5o4bqtbiB4w6l0KioqOiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IHbhu4EgY2jhur8gxJHhu5kgxINuIHXhu5FuZyBnaeG7r2EgY8OhYyBuaMOzbSBt4bupYyDEkeG7mSBsw6BtIHRow6ptIGtow6FjIG5oYXUgdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHZp4buHYyBzaW5oIHZpw6puIGzDoG0gdGjDqm0gw610IGhheSBuaGnhu4F1IGtow7RuZyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24gbOG7sWEgY2jhu41uIGNo4bq/IMSR4buZIMSDbiB14buRbmcgY+G7p2EgaOG7jS4gVHV5IG5oacOqbiwgeeG6v3UgdOG7kSBuw6B5IGPDsyB0aOG7gyBi4buLIGNoaSBwaOG7kWkgYuG7n2kgY8OhYyBiaeG6v24ga2jDoWMgbmjGsCB0aOG7nWkgZ2lhbiBy4bqjbmgsIHRodSBuaOG6rXAsIG5o4bqtbiB0aOG7qWMgduG7gSBz4bupYyBraOG7j2UgaG/hurdjIHRow7NpIHF1ZW4gY8OhIG5ow6JuLiBEbyDEkcOzLCBj4bqnbiBuZ2hpw6puIGPhu6l1IHRow6ptIHbhu5tpIG3huqt1IGzhu5tuIGjGoW4gdsOgIGvhur90IGjhu6NwIGPDoWMgYmnhur9uIGtow6FjIMSR4buDIGPDsyDEkcOhbmggZ2nDoSB0b8OgbiBkaeG7h24gaMahbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY2jhur8gxJHhu5kgxINuIHbDoCBt4bupYyDEkeG7mSBsw6BtIHRow6ptLg0KDQojICoqUGjhuqduIDUuIFNPIFPDgU5IIDIgVOG7tiBM4buGIFbDgCBUSMav4buaQyDEkE8gTeG7kEkgTEnDik4gSOG7hjoqKg0KDQojIyAqKjUuMS4gSGnhu4d1IGhhaSB04bu3IGzhu4cgKERpZmZlcmVuY2UgaW4gUHJvcG9ydGlvbnMpOioqDQoNCg0KIyMjICoqNS4xLjEuIELhuqNuZyBjaMOpbyAyeDIgZ2nhu69hIEdlbmRlciB2w6AgUGFydCBUaW1lIEpvYjoqKg0KDQpgYGB7cn0NCiMgQuG6o25nIGNow6lvIGdp4buvYSBHZW5kZXIgdsOgIFBhcnQgVGltZSBKb2INCmdwIDwtIHRhYmxlKGR0JGdlbmRlciwgZHQkcGFydF90aW1lX2pvYikNCmdwDQpgYGANCg0KS2nhu4NtIMSR4buLbmg6DQoNCkjigoA6IHDigoEgLSBw4oKCID0gMCAodOG7tyBs4buHIG7hu68gY8OzIHZp4buHYyBsw6BtIGLhurFuZyB04bu3IGzhu4cgbmFtIGPDsyB2aeG7h2MgbMOgbSkNCg0KSOKCgTogcOKCgSAtIHDigoIgPCAwIChU4bu3IGzhu4cgbuG7ryBjw7Mgdmnhu4djIGzDoG0gbmjhu48gaMahbiB04bu3IGzhu4cgbmFtIGPDsyB2aeG7h2MgbMOgbSkNCg0KYGBge3J9DQojIFPhu5EgbmfGsOG7nWkgY8OzIHZp4buHYyB0aGVvIHThu6tuZyBnaeG7m2kgdMOtbmgNCmNvdW50cyA8LSBjKGdwWyJGZW1hbGUiLCAiWWVzIl0sIGdwWyJNYWxlIiwgIlllcyJdKQ0KDQojIFThu5VuZyBz4buRIG5nxrDhu51pIHRoZW8gdOG7q25nIGdp4bubaSB0w61uaA0KdG90YWxzIDwtIGMoc3VtKGdwWyJGZW1hbGUiLCBdKSwgc3VtKGdwWyJNYWxlIiwgXSkpDQoNCiMgS2nhu4NtIMSR4buLbmggdOG7iSBs4buHIGdp4buvYSBu4buvIHbDoCBuYW0gKGFsdGVybmF0aXZlID0gImxlc3MiOiBnaeG6oyB0aHV54bq/dCBu4buvIGPDsyB04buJIGzhu4cgdGjhuqVwIGjGoW4gbmFtKQ0KdGVzdCA8LSBwcm9wLnRlc3QoY291bnRzLCB0b3RhbHMsIGFsdGVybmF0aXZlID0gImxlc3MiLCBjb3JyZWN0ID0gRkFMU0UpDQoNCnByaW50KHRlc3QpDQoNCmBgYA0KDQotIHByb3AgMSAocDEpID0gMC4yMDExNDk0IDogdOG7tyBs4buHIG7hu68gc+G7nyBo4buvdSBuaMOgIGtob+G6o25nIDIwLjExJQ0KDQotIHByb3AgMiAocDIpID0gMC4yMzAxMjU1IDogdOG7tyBs4buHIG5hbSBz4bufIGjhu691IG5ow6Aga2hv4bqjbmcgMjMuMDElDQoNCi0gUC12YWx1ZSA9IDAuMTMyNiANCg0KR2nDoSB0cuG7iyBwLXZhbHVlIHRodSDEkcaw4bujYyBsw6AgMC4xMzI2LCBs4bubbiBoxqFuIG3hu6ljIMO9IG5naMSpYSAwLjA1LiBEbyDEkcOzLCBjaMO6bmcgdGEgKipraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFwoSF8wOiBwXzEgLSBwXzIgPSAwXCkqKi4gDQoNCsSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCwgdGhlbyBk4buvIGxp4buHdSBoaeG7h24gdOG6oWksIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdOG7tyBs4buHIGPDsyB2aeG7h2MgbMOgbSBj4bunYSBu4buvIHbDoCBuYW0sIHbDoCBraMO0bmcgY8OzIGLhurFuZyBjaOG7qW5nIGNobyB0aOG6pXkgdOG7tyBs4buHIGPDsyB2aeG7h2MgdGjhuqVwIGjGoW4gdOG7tyBs4buHIG5hbS4NCg0KDQoNCiMjIyAqKjUuMS4yLiBC4bqjbmcgY2jDqW8gMngyIGdp4buvYSBHZW5kZXIgdsOgICBEaWV0IFF1YWxpdHk6KioNCg0KDQpgYGB7cn0NCiMgQuG6o25nIGNow6lvIGdp4buvYSBHZW5kZXIgdsOgIERpZXQgUXVhbGl0eQ0KZ3EgPC0gdGFibGUoZHQkZ2VuZGVyLCBkdCRkaWV0X3F1YWxpdHkpDQpncQ0KYGBgDQpLaeG7g20gxJHhu4tuaDoNCg0KSOKCgDogcOKCgSAtIHDigoIgPSAwIChU4bu3IGzhu4cgbuG7ryBjw7MgY2jhur8gxJHhu5kgxINuIGLhurFuZyB04bu3IGzhu4cgbmFtIGPDsyBjaOG6vyDEkeG7mSDEg24gR29vZCkNCg0KSOKCgTogcOKCgSAtIHDigoIgPCAwIChU4bu3IGzhu4cgbuG7ryBjw7MgY2jhur8gxJHhu5kgxINuIG5o4buPIGjGoW4gdOG7tyBs4buHIGPDsyBjaOG6vyDEkeG7mSDEg24gR29vZCkNCg0KDQpgYGB7cn0NCmNvdW50czIgPC0gYyhncVsiRmVtYWxlIiwgIkdvb2QiXSwgZ3FbIk1hbGUiLCAiR29vZCJdKSAgIA0KdG90YWxzMiA8LSBjKHN1bShncVsiRmVtYWxlIiwgXSksIHN1bShncVsiTWFsZSIsIF0pKSAgDQoNCnRlc3QyIDwtIHByb3AudGVzdChjb3VudHMyLCB0b3RhbHMyLCBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgY29ycmVjdCA9IEZBTFNFKQ0KdGVzdDINCg0KYGBgDQoNCi0gcHJvcCAxIChwMSkgPSAwLjQyMzM3MTY6IHThu7cgbOG7hyBu4buvIHPhu58gaOG7r3UgbmjDoCBraG/huqNuZyA0Mi4zMyUNCg0KLSBwcm9wIDIgKHAyKSA9IDAuNDEwMDQxODogdOG7tyBs4buHIG5hbSBz4bufIGjhu691IG5ow6Aga2hv4bqjbmcgNDElDQoNCi0gUC12YWx1ZSA9IDAuNjY1MyANCg0KR2nDoSB0cuG7iyBwLXZhbHVlIHRodSDEkcaw4bujYyBsw6AgMC42NjUzLCBs4bubbiBoxqFuIG3hu6ljIMO9IG5naMSpYSAwLjA1LiBEbyDEkcOzLCBjaMO6bmcgdGEgKipraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFwoSF8wOiBwXzEgLSBwXzIgPSAwXCkqKi4gDQoNCsSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCwgdGhlbyBk4buvIGxp4buHdSBoaeG7h24gdOG6oWksIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdOG7tyBs4buHIGPDsyBjaOG6vyDEkeG7mSDEg24gY+G7p2EgbuG7ryB2w6AgbmFtLCB2w6Aga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyBjaG8gdGjhuqV5IHThu7cgbOG7hyBjw7MgY2jhur8gxJHhu5kgxINuIHRo4bqlcCBoxqFuIHThu7cgbOG7hyBuYW0uDQoNCg0KIyMjICoqNS4xLjMuIELhuqNuZyBjaMOpbyAyeDIgZ2nhu69hIERpZXQgUXVhbGl0eSB2w6AgUGFydCBUaW1lIEpvYioqDQoNCg0KYGBge3J9DQojIELhuqNuZyBjaMOpbyBnaeG7r2EgRGlldCBRdWFsaXR5IHbDoCBQYXJ0IFRpbWUgSm9iDQpkcCA8LSB0YWJsZShkdCRkaWV0X3F1YWxpdHksIGR0JHBhcnRfdGltZV9qb2IpDQpkcA0KYGBgDQpLaeG7g20gxJHhu4tuaDoNCg0KSOKCgDogcOKCgSAtIHDigoIgPSAwIChU4bu3IGzhu4cgY2jhur8gxJHhu5kgxINuIGLhurFuZyB04bu3IGzhu4cgY8OzIHZp4buHYyBsw6BtKQ0KDQpI4oKBOiBw4oKBIC0gcOKCgiA8IDAgKFThu7cgbOG7hyBjaOG6vyDEkeG7mSDEg24gbmjhu48gaMahbiB04bu3IGzhu4cgY8OzIHZp4buHYyBsw6BtKQ0KDQoNCmBgYHtyfQ0KY291bnRzMyA8LSBjKGRwWyJGYWlyIiwgIlllcyJdLCBkcFsiR29vZCIsICJZZXMiXSkgICANCnRvdGFsczMgPC0gYyhzdW0oZHBbIkZhaXIiLCBdKSwgc3VtKGRwWyJHb29kIiwgXSkpICANCg0KdGVzdDMgPC0gcHJvcC50ZXN0KGNvdW50czMsIHRvdGFsczMsIGFsdGVybmF0aXZlID0gImxlc3MiLCBjb3JyZWN0ID0gRkFMU0UpDQp0ZXN0Mw0KDQpgYGANCg0KLSBwcm9wIDEgKHAxKSA9IDAuMjA0MTE2NjogdOG7tyBs4buHIG7hu68gc+G7nyBo4buvdSBuaMOgIGtob+G6o25nIDIwLjQlDQoNCi0gcHJvcCAyIChwMikgPSAwLjIzMDIxNTg6IHThu7cgbOG7hyBuYW0gc+G7nyBo4buvdSBuaMOgIGtob+G6o25nIDIzJQ0KDQotIFAtdmFsdWUgPSAwLjE2MSANCg0KR2nDoSB0cuG7iyBwLXZhbHVlIHRodSDEkcaw4bujYyBsw6AgMC41ODcsIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUuIERvIMSRw7MsIGNow7puZyB0YSAqKmtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgXChIXzA6IHBfMSAtIHBfMiA9IDBcKSoqLiANCg0KxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgLCB0aGVvIGThu68gbGnhu4d1IGhp4buHbiB04bqhaSwga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBjaOG6vyDEkeG7mSDEg24gdeG7kW5nIHbDoCB2aeG7h2MgbMOgbSwgdsOgIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgY2hvIHRo4bqleSB0Y2hlZXMgxJHhu5kgxINuIHXhu5FuZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gdmnhu4djIGPDsyB2aeG7h2MgbMOgbSBoYXkga2jDtG5nLg0KDQoNCiMjICoqNS4yLiBU4bu3IHPhu5EgTmd1eSBjxqEgKFJlbGF0aXZlIFJpc2sgLSBSUikqKg0KDQojIyMgKio1LjIuMS4gQuG6o25nIGNow6lvIDJ4MiBnaeG7r2EgR2VuZGVyIHbDoCBQYXJ0IFRpbWUgSm9iKioNCg0KYGBge3J9DQpncDUgPC0gdGFibGUoZHQkZ2VuZGVyLCBkdCRwYXJ0X3RpbWVfam9iKQ0KI1Row6ptIHThu5VuZyBow6BuZyB2w6AgY+G7mXQNCmdwNSANCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpyaXNrcmF0aW8oZ3A1LCBtZXRob2Q9IndhbGQiKQ0KYGBgDQoNCkPDsyAxMDUgbuG7ryB2w6AgMTEwIG5hbSBsw6BtIHZp4buHYyBiw6FuIHRo4budaSBnaWFuLg0KDQotIFThu7cgbOG7hyBu4buvIGPDsyB2aeG7h2MgYsOhbiB0aOG7nWkgZ2lhbiBsw6Aga2hv4bqjbmcgMjAuMSUgKDEwNSB0csOqbiA1MjIpLg0KDQotIFThu7cgbOG7hyBuYW0gY8OzIHZp4buHYyBiw6FuIHRo4budaSBnaWFuIGzDoCBraG/huqNuZyAyMy4wJSAoMTEwIHRyw6puIDQ3OCkuDQoNClThu7cgc+G7kSBy4bunaSBybyAoUmlzayBSYXRpbykgZ2nhu69hIG5hbSB2w6AgbuG7ryBsw6AgMS4xNDQsIHThu6ljIGzDoCBuYW0gY8OzIGto4bqjIG7Eg25nIGzDoG0gdmnhu4djIGLDoW4gdGjhu51pIGdpYW4gY2FvIGjGoW4gbuG7ryBraG/huqNuZyAxNC40JS4gVHV5IG5oacOqbiwga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBz4buRIG7DoHkgbMOgIHThu6sgMC45MDMgxJHhur9uIDEuNDUwLCBuZ2jEqWEgbMOgIHPhu7EgY2jDqm5oIGzhu4djaCBuw6B5IGPDsyB0aOG7gyBkbyBuZ+G6q3Ugbmhpw6puIHbDoCBraMO0bmcgxJHhu6cgY2jhuq9jIGNo4bqvbiDEkeG7gyBr4bq/dCBsdeG6rW4gY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHRo4buxYyBz4buxLg0KDQpDw6FjIHBow6lwIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIG5oxrAga2nhu4NtIMSR4buLbmggY2hpIGLDrG5oIHBoxrDGoW5nLCBraeG7g20gxJHhu4tuaCBGaXNoZXIsIHbDoCBNaWQtcCDEkeG7gXUgY2hvIGdpw6EgdHLhu4sgcCBs4bubbiBoxqFuIDAuMjYsIHbGsOG7o3QgbmfGsOG7oW5nIHRow7RuZyB0aMaw4budbmcgMC4wNS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7pyBt4bqhbmggxJHhu4Mga2jhurNuZyDEkeG7i25oIHLhurFuZyB04bu3IGzhu4cgY8OzIHZp4buHYyBsw6BtIGLDoW4gdGjhu51pIGdpYW4gY+G7p2EgbmFtIHbDoCBu4buvIGzDoCBraMOhYyBuaGF1IG3hu5l0IGPDoWNoIMSRw6FuZyBr4buDLg0KDQoNCiMjIyAqKjUuMi4yLiBC4bqjbmcgY2jDqW8gMngyIGdp4buvYSBHZW5kZXIgdsOgICBEaWV0IFF1YWxpdHkqKg0KDQpgYGB7cn0NCmdkNSA8LSB0YWJsZShkdCRnZW5kZXIsIGR0JGRpZXRfcXVhbGl0eSkNCiNUaMOqbSB04buVbmcgaMOgbmcgdsOgIGPhu5l0DQpnZDUgDQpgYGANCg0KDQpgYGB7cn0NCnJpc2tyYXRpbyhnZDUsIG1ldGhvZD0id2FsZCIpDQpgYGANCg0KROG7ryBsaeG7h3UgdOG7qyBi4bqjbmcgY2jDqW8gY2hvIHRo4bqleToNCg0KLSBUcm9uZyB04buVbmcgc+G7kSA1MjIgbuG7rywgY8OzIDMwMSBuZ8aw4budaSDEg24gdeG7kW5nIOG7nyBt4bupYyBGYWlyLCB2w6AgMjIxIG5nxrDhu51pIMSDbiB14buRbmcg4bufIG3hu6ljIEdvb2QuDQoNCi0gVHJvbmcgdOG7lW5nIHPhu5EgNDc4IG5hbSwgY8OzIDI4MiBuZ8aw4budaSDEg24gdeG7kW5nIOG7nyBt4bupYyBGYWlyLCB2w6AgMTk2IG5nxrDhu51pIMSDbiB14buRbmcg4bufIG3hu6ljIEdvb2QuDQoNClThu7cgbOG7hyBu4buvIGPDsyBjaOG6vyDEkeG7mSDEg24gdeG7kW5nIHThu5F0IChHb29kKSBsw6AgMjIxIC8gNTIyIOKJiCA0Mi4zJS4NClThu7cgbOG7hyBuYW0gY8OzIGNo4bq/IMSR4buZIMSDbiB14buRbmcgdOG7kXQgbMOgIDE5NiAvIDQ3OCDiiYggNDEuMCUuDQoNClThu7cgc+G7kSBy4bunaSBybyAoUmlzayBSYXRpbykgY+G7p2EgbmFtIHNvIHbhu5tpIG7hu68gbMOgIDAuOTY5LCB04bupYyBsw6AgbmFtIGPDsyBraOG6oyBuxINuZyBjw7MgY2jhur8gxJHhu5kgxINuIHThu5F0IHRo4bqlcCBoxqFuIG7hu68ga2hv4bqjbmcgMy4xJS4gVHV5IG5oacOqbiwga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBz4buRIG7DoHkgbMOgIHThu6sgMC44MzYgxJHhur9uIDEuMTIyLCBuZ2jEqWEgbMOgIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkga2jDtG5nIGNo4bqvYyBjaOG6r24gdsOgIGPDsyB0aOG7gyBkbyBuZ+G6q3Ugbmhpw6puLiBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiBjaG8gY8OhYyBwaMOpcCBraeG7g20gxJHhu4tuaCAoTWlkLXAsIEZpc2hlciwgQ2hpLXNxdWFyZSkgxJHhu4F1IGNobyBwLXZhbHVlID4gMC42NiwgY2FvIGjGoW4gbmfGsOG7oW5nIDAuMDUgdGjDtG5nIHRoxrDhu51uZy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7pyBt4bqhbmggxJHhu4Mga2jhurNuZyDEkeG7i25oIGPDsyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgbmFtIHbDoCBu4buvIHbhu4EgdOG7tyBs4buHIGPDsyBjaOG6vyDEkeG7mSDEg24gdeG7kW5nIHThu5F0Lg0KDQoNCg0KDQojIyMgKio1LjIuMy4gQuG6o25nIGNow6lvIDJ4MiBnaeG7r2EgRGlldCBRdWFsaXR5IHbDoCBQYXJ0IFRpbWUgSm9iKioNCg0KYGBge3J9DQpkcDUgPC0gdGFibGUoZHQkZGlldF9xdWFsaXR5LCBkdCRwYXJ0X3RpbWVfam9iKQ0KI1Row6ptIHThu5VuZyBow6BuZyB2w6AgY+G7mXQNCmRwNSANCmBgYA0KDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKGRwNSwgbWV0aG9kPSJ3YWxkIikNCmBgYA0KDQoNCkThu68gbGnhu4d1IGto4bqjbyBzw6F0IGNobyB0aOG6pXkgdHJvbmcgc+G7kSBuaOG7r25nIG5nxrDhu51pIGPDsyBjaOG6vyDEkeG7mSDEg24gdeG7kW5nIHRydW5nIGLDrG5oIChGYWlyKSwgY8OzIDExOSBuZ8aw4budaSBsw6BtIHZp4buHYyBiw6FuIHRo4budaSBnaWFuIHRyw6puIHThu5VuZyBz4buRIDU4MyBuZ8aw4budaSwgdMawxqFuZyDEkcawxqFuZyBraG/huqNuZyAyMC40JS4gVHJvbmcga2hpIMSRw7MsIOG7nyBuaMOzbSBjw7MgY2jhur8gxJHhu5kgxINuIHXhu5FuZyB04buRdCAoR29vZCksIGPDsyA5NiBuZ8aw4budaSBsw6BtIHZp4buHYyBiw6FuIHRo4budaSBnaWFuIHRyw6puIHThu5VuZyBz4buRIDQxNyBuZ8aw4budaSwgdMawxqFuZyDEkcawxqFuZyBraG/huqNuZyAyMy4wJS4NCg0KS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY2hvIHRo4bqleSB04bu3IHPhu5EgcuG7p2kgcm8gKHJpc2sgcmF0aW8pIGdp4buvYSBoYWkgbmjDs20gbMOgIDEuMTMsIG5naMSpYSBsw6Agbmjhu69uZyBuZ8aw4budaSBjw7MgY2jhur8gxJHhu5kgxINuIHXhu5FuZyB04buRdCBjw7Mga2jhuqMgbsSDbmcgbMOgbSB2aeG7h2MgYsOhbiB0aOG7nWkgZ2lhbiBjYW8gaMahbiBraG/huqNuZyAxMyUgc28gduG7m2kgbmjDs20gxINuIHXhu5FuZyB0cnVuZyBiw6xuaC4gVHV5IG5oacOqbiwga2hv4bqjbmcgdGluIGPhuq15IDk1JSBj4bunYSB04bu3IHPhu5EgbsOgeSBsw6AgdOG7qyAwLjg5IMSR4bq/biAxLjQzLCBiYW8gZ+G7k20gY+G6oyBnacOhIHRy4buLIDEuMC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7MgdGjhu4MgY2jhu4kgbMOgIGRvIG5n4bqrdSBuaGnDqm4gdsOgIGNoxrBhIMSR4bunIG3huqFuaCDEkeG7gyBraOG6s25nIMSR4buLbmggY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHRo4buxYyBz4buxLg0KDQpCw6puIGPhuqFuaCDEkcOzLCBjw6FjIGtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIG5oxrAga2nhu4NtIMSR4buLbmggY2hpIGLDrG5oIHBoxrDGoW5nLCBraeG7g20gxJHhu4tuaCBGaXNoZXIgdsOgIG1pZC1wIMSR4buBdSBjaG8gZ2nDoSB0cuG7iyBwIGzhu5tuIGjGoW4gMC4zMiwgY2FvIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUuIERvIMSRw7MsIGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu6cgbeG6oW5oIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgY2jhuqV0IGzGsOG7o25nIGNo4bq/IMSR4buZIMSDbiB14buRbmcgY8OzIOG6o25oIGjGsOG7n25nIHLDtSBy4buHdCDEkeG6v24gdmnhu4djIGzDoG0gYsOhbiB0aOG7nWkgZ2lhbi4NCg0KDQojIyAqKjUuMy4gVOG7tyBz4buRIENow6puaCAoT2RkcyBSYXRpbyAtIE9SKSoqDQoNCiMjIyAqKjUuMy4xLiBHZW5kZXIgdsOgIFBhcnQgVGltZSBKb2IqKg0KDQpgYGB7cn0NCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KIyBUw61uaCBPUiB2w6Aga2hv4bqjbmcgdGluIGPhuq15DQpvcl9naCA8LSBPZGRzUmF0aW8oZ3A1LCBtZXRob2QgPSAid2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0Kb3JfZ2gNCmBgYA0KDQotIE9kZHMgUmF0aW8gKE9SKSA9IDEuMTg3DQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JTogdOG7qyAwLjg3OCDEkeG6v24gMS42MDYNCg0KRGnhu4VuIGdp4bqjaToNCg0KR2nDoSB0cuG7iyBPZGRzIFJhdGlvIDEuMTg3IGPDsyBuZ2jEqWEgbMOgIG9kZHMgKHThu7cgbOG7hyBjxqEgaOG7mWkpIGPDsyB2aeG7h2MgbMOgbSBj4bunYSBu4buvIGNhbyBoxqFuIGtob+G6o25nIDE4LjclIHNvIHbhu5tpIG5hbS4gTsOzaSBjw6FjaCBraMOhYywgbuG7ryBjw7Mga2jhuqMgbsSDbmcgY8OzIHZp4buHYyBsw6BtIGLDoW4gdGjhu51pIGdpYW4gY2FvIGjGoW4gbmFtLCBuaMawbmcgbeG7qWMgxJHhu5kgY2jDqm5oIGzhu4djaCBraMO0bmcgbOG7m24uDQoNClR1eSBuaGnDqm4sIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjg3OCDEkeG6v24gMS42MDYgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMS4wLCBuZ2jEqWEgbMOgIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY8OzIHRo4buDIGtow7RuZyB0aOG7sWMgc+G7sSB04buTbiB04bqhaSBtw6AgZG8gbmfhuqt1IG5oacOqbi4NCg0KDQojIyMgKio1LjMuMi4gR2VuZGVyIHbDoCAgRGlldCBRdWFsaXR5KioNCg0KYGBge3J9DQojIFTDrW5oIE9SIHbDoCBraG/huqNuZyB0aW4gY+G6rXkNCm9yX2doMiA8LSBPZGRzUmF0aW8oZ2Q1LCBtZXRob2QgPSAid2FsZCIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0Kb3JfZ2gyDQpgYGANCg0KLSBPZGRzIFJhdGlvIChPUikgPSAwLjk0Nw0KDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSU6IHThu6sgMC43MzYgxJHhur9uIDEuMjE4DQoNCkRp4buFbiBnaeG6o2k6DQoNCkdpw6EgdHLhu4sgT2RkcyBSYXRpbyAwLjk0NyBjw7MgbmdoxKlhIGzDoCBvZGRzICh04bu3IGzhu4cgY8ahIGjhu5lpKSBjw7MgY2jhur8gxJHhu5kgxINuIHXhu5FuZyB04buRdCBj4bunYSBu4buvIHRo4bqlcCBoxqFuIGtob+G6o25nIDUuMyUgc28gduG7m2kgbmFtLiBOw7NpIGPDoWNoIGtow6FjLCBu4buvIGPDsyBraOG6oyBuxINuZyBjw7MgY2jhur8gxJHhu5kgxINuIHXhu5FuZyB04buRdCBoxqFpIHRo4bqlcCBoxqFuIG5hbSwgbmjGsG5nIG3hu6ljIGNow6puaCBs4buHY2ggcuG6pXQgbmjhu48uDQoNCg0KIyMjICoqNS4zLjMuIERpZXQgUXVhbGl0eSB2w6AgIFBhcnQgVGltZSBKb2IqKg0KDQpgYGB7cn0NCiMgVMOtbmggT1IgdsOgIGtob+G6o25nIHRpbiBj4bqteQ0Kb3JfZ2gzIDwtIE9kZHNSYXRpbyhkcDUsIG1ldGhvZCA9ICJ3YWxkIiwgY29uZi5sZXZlbCA9IDAuOTUpDQpvcl9naDMNCmBgYA0KDQotIE9kZHMgUmF0aW8gKE9SKSA9IDEuMTY2DQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JTogdOG7qyAwLjg2MCDEkeG6v24gMS41ODENCg0KRGnhu4VuIGdp4bqjaToNCg0KR2nDoSB0cuG7iyBPZGRzIFJhdGlvIDEuMTY2IGPDsyBuZ2jEqWEgbMOgIG9kZHMgY8OzIHZp4buHYyBsw6BtIGPhu6dhIG5ow7NtIGPDsyBjaOG6vyDEkeG7mSDEg24gdOG7kXQgY2FvIGjGoW4ga2hv4bqjbmcgMTYuNiUgc28gduG7m2kgbmjDs20gY8OzIGNo4bq/IMSR4buZIMSDbiBrw6ltIGjGoW4uIE7Ds2kgY8OhY2gga2jDoWMsIG5o4buvbmcgbmfGsOG7nWkgY8OzIGNo4bq/IMSR4buZIMSDbiB04buRdCBjw7MgeHUgaMaw4bubbmcgY8OzIHZp4buHYyBsw6BtIG5oaeG7gXUgaMahbiBuaOG7r25nIG5nxrDhu51pIGtow6FjLg0KDQpUdXkgbmhpw6puLCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIHThu6sgMC44NjAgxJHhur9uIDEuNTgxIGJhbyBn4buTbSBnacOhIHRy4buLIDEuMCwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCB24buBIG9kZHMgY8OzIHZp4buHYyBsw6BtIGdp4buvYSBjw6FjIG5ow7NtIGNo4bq/IMSR4buZIMSDbiBjw7MgdGjhu4MgbMOgIGRvIG5n4bqrdSBuaGnDqm4gdsOgIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQoNCiMgKipQaOG6p24gNi4gS+G6vlQgTFXhuqxOKioNCg0KDQojIyAqKjYuMS4gxJDhurdjIMSRaeG7g20gY2h1bmcgY+G7p2Egc2luaCB2acOqbiB0cm9uZyBt4bqrdSoqDQoNCkdp4bubaSB0w61uaDogVOG7tyBs4buHIHNpbmggdmnDqm4gbuG7ryAoNTIuMiUpIHbDoCBuYW0gKDQ3LjglKSB0cm9uZyBt4bqrdSB0xrDGoW5nIMSR4buRaSBjw6JuIGLhurFuZywgduG7m2kgbuG7ryBnaeG7m2kgY2hp4bq/bSDGsHUgdGjhur8gaMahbiBt4buZdCBjaMO6dC4NCg0KVmnhu4djIGzDoG0gcGFydC10aW1lOiBQaOG6p24gbOG7m24gc2luaCB2acOqbiAoNzguNSUpIGtow7RuZyB0aGFtIGdpYSBsw6BtIHRow6ptLCBjaG8gdGjhuqV5IHZp4buHYyBo4buNYyB04bqtcCBjw7MgdGjhu4MgbMOgIMawdSB0acOqbiBow6BuZyDEkeG6p3UgaG/hurdjIGPGoSBo4buZaSB2aeG7h2MgbMOgbSBwaMO5IGjhu6NwIGPDsm4gaOG6oW4gY2jhur8uDQoNCkNo4bqldCBsxrDhu6NuZyBjaOG6vyDEkeG7mSDEg246IMSQYSBz4buRIHNpbmggdmnDqm4gdOG7sSDEkcOhbmggZ2nDoSBjaOG6vyDEkeG7mSDEg24gY+G7p2EgbcOsbmgg4bufIG3hu6ljICJGYWlyIiAoS2jDoSAtIDU4LjMlKSBob+G6t2MgIkdvb2QiIChU4buRdCAtIDM3LjglKS4NCg0KSOG7jWMgduG6pW4gcGjhu6UgaHV5bmg6IFRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBwaOG7pSBodXluaCBraMOhIMSRYSBk4bqhbmcsIHbhu5tpIHThu7cgbOG7hyDEkcOhbmcga+G7gyBjw7MgdHLDrG5oIMSR4buZICJIaWdoIFNjaG9vbCIgdsOgICJCYWNoZWxvciIuDQoNCkNo4bqldCBsxrDhu6NuZyBJbnRlcm5ldDogUGjhuqduIGzhu5tuIHNpbmggdmnDqm4gxJHGsOG7o2MgaMaw4bufbmcgY2jhuqV0IGzGsOG7o25nIEludGVybmV0IOG7nyBt4bupYyAiR29vZCIgKDQ0LjclKSBob+G6t2MgIkF2ZXJhZ2UiICgzOS4xJSksIHThuqFvIMSRaeG7gXUga2nhu4duIHRodeG6rW4gbOG7o2kgY2hvIGjhu41jIHThuq1wLg0KDQpIb+G6oXQgxJHhu5luZyBuZ2/huqFpIGtow7NhOiBN4buZdCB04bu3IGzhu4cgbOG7m24gc2luaCB2acOqbiAoNjguMiUpIGtow7RuZyB0aGFtIGdpYSBob+G6oXQgxJHhu5luZyBuZ2/huqFpIGtow7NhLCBjaG8gdGjhuqV5IHRp4buBbSBuxINuZyBj4bqnbiBraGFpIHRow6FjIMSR4buDIHBow6F0IHRyaeG7g24ga+G7uSBuxINuZyBt4buBbSB2w6AgxJHhu51pIHPhu5FuZyB0aW5oIHRo4bqnbiBjaG8gc2luaCB2acOqbi4NCg0KDQoNCiMjICoqNi4yLiBI4bqhbiBjaOG6vyB2w6AgSMaw4bubbmcgcGjDoXQgdHJp4buDbioqDQoNClBow6JuIHTDrWNoIG7DoHkgY2jhu6cgeeG6v3UgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjIG3hu5FpIHF1YW4gaOG7hyBoYWkgYmnhur9uIMSR4buLbmggdMOtbmguIFZp4buHYyB4ZW0geMOpdCDEkeG7k25nIHRo4budaSBuaGnhu4F1IHnhur91IHThu5EgaG/hurdjIGPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgKG5oxrAgc3R1ZHlfaG91cnNfcGVyX2RheSwgZXhhbV9zY29yZSkgY8OzIHRo4buDIGN1bmcgY+G6pXAgY8OhaSBuaMOsbiBzw6J1IHPhuq9jIGjGoW4gdGjDtG5nIHF1YSBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkuDQoNCk5ow6xuIGNodW5nLCBiw6BpIHBow6JuIHTDrWNoIMSRw6MgY3VuZyBj4bqlcCBt4buZdCBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbhu4EgxJHhurdjIMSRaeG7g20gc2luaCB2acOqbiB2w6AgYsaw4bubYyDEkeG6p3Uga2jDoW0gcGjDoSBjw6FjIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGPDoWMgeeG6v3UgdOG7kS4gQ8OhYyBr4bq/dCBxdeG6oyBjaG8gdGjhuqV5IG3hu5l0IHPhu5EgdGjDs2kgcXVlbiBuaOG6pXQgxJHhu4tuaCAobmjGsCDDrXQgbMOgbSB0aMOqbSwgw610IHRoYW0gZ2lhIG5nb+G6oWkga2jDs2EpIGzDoCBwaOG7lSBiaeG6v24sIHRyb25nIGtoaSBjw6FjIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCwgY2jhuqV0IGzGsOG7o25nIGNo4bq/IMSR4buZIMSDbiB2w6Agdmnhu4djIGzDoG0gcGFydC10aW1lIGtow7RuZyB0aOG7gyBoaeG7h24gcsO1IHLDoG5nIHbhu4EgbeG6t3QgdGjhu5FuZyBrw6ogdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UgbsOgeS4gQ8OhYyBuZ2hpw6puIGPhu6l1IHPDonUgaMahbiB24bubaSBjw6FjIHBoxrDGoW5nIHBow6FwIHBo4bupYyB04bqhcCBoxqFuIGPDsyB0aOG7gyBsw6BtIHPDoW5nIHThu48gdGjDqm0gY8OhYyBt4buRaSBxdWFuIGjhu4cgbsOgeS4NCg0KDQo=