A Short Introduction to Ranking University

Xếp hạng đại học (University ranking) là việc liệt kê danh sách các trường theo một thứ bậc nhất định dựa trên một tổ hợp các chỉ số. Việc xếp hạng có thể dựa trên chất lượng được hiểu một cách chủ quan qua các con số thống kê, kết quả điều tra của các nhà giáo dục, các chuyên gia, giảng viên, sinh viên và các đối tượng khác (Marginson, 2007). Những bảng xếp hạng này được coi là đã “củng cố khái niệm về một thị trường đại học thế giới” (Marginson & Van der Wende, 2007), trong đó các trường đại học được đánh giá theo một quy mô toàn cầu, do đó tạo ra sự cạnh tranh giữa các trường đại học như một mô hình mới ở hầu hết các quốc gia (Altbach, 2006).

Các mô hình xếp hạng thay đổi đáng kể theo mục đích và phạm vi, theo các định nghĩa và theo các mẫu phương pháp luận của chúng (Usher & Savino, 2006). Ví dụ như Bảng xếp hạng học thuật các trường đại học trên thế giới (ARWU) của Đại học Giao thông Thượng Hải (Shanghai Jiaotong University) xem xét các tiêu chí sau:

Mục chủ yếu của việc xếp hạng là để nâng cao hơn nữa chất lượng và tính minh bạch thông tin của các tổ chức giáo dục đại học trong bối cảnh cạnh tranh và toàn cầu hoá, quốc tế hoá diễn ra ngày càng mạnh mẽ trong giáo dục đại học. Giữa xu thế ấy, các cơ quan quản lý nhà nước thường chỉ đóng vai trò kiểm định và phân loại các cơ sở giáo dục đại học. Sân chơi về xếp hạng đại học đa phần đều do các tổ chức độc lập tiến hành.

Problem of Ranking Vietnam Universities

Tuy vậy, ngoài chất lượng, nhiều nhà quản lí giáo dục và cả nhiều trường đại học ở Việt Nam lại đưa ra những chất vấn và nghi ngờ về mục đích của xếp hạng đại học ở Việt Nam có thể không hoặc khó đạt được vì rất nhiều lí do. Một trong những lí do đó là việc giao công việc này cho một đại học cụ thể nào đó có thể vi phạm tính độc lập của tổ chức thực hiện xếp hạng. Chẳng hạn, lo ngại đó có thể là phương pháp thực hiện xếp hạng được sử dụng (như chọn các tiêu chí nào để xếp hạng và với các trọng số là bao nhiêu) có thể “thiên vị” theo hướng có lợi cho một nhóm trường nào đó và không công bằng với các trường còn lại. Vấn đề này có thể tham khảo chi tiết hơn ở đây.

Demand for Ranking Universities in Vietnam

Xếp hạng đại học ở Việt Nam thực sự là một vấn đề quan trọng vì nó liên quan đến rất nhiều vấn đề sau.

  1. Thứ hạng của một đại học gắn liền với thương hiệu và do đó có thể ảnh hưởng nhiều đến danh tiếng, khả năng thu hút fund cho trường và các dự án nghiên cứu. Danh tiếng của trường cũng còn ảnh hưởng đến khả năng thu hút sinh viên. Nhiều trường ĐH ở Việt Nam đang tuyển dưới chỉ tiêu, thậm chí có một số nghành học không tuyển được thí sinh nào.

  2. Nhu cầu về xếp hạng đại học đã được xác định là một nhiệm vụ trọng tâm của bộ Giáo Dục và Đào Tạo. Bạn đọc quan tâm có thể tham khảo kĩ hơn ở đây.

Hiện tại đã có một số nhóm nghiên cứu độc lập thực hiện xếp hạng cho các đại học ở Việt Nam và kết quả là lần đầu tiên có 49 trường được có mặt trong danh sách xếp hạng này. Kết quả (cũng như các tranh luận về sự hợp lí) của bảng xếp hạng này bạn đọc có thể tham khảo ở đây.

A Naive Approach to Ranking Vietnam Universities

Như chúng ta có thể thấy các cách xếp hạng đại học Việt Nam thường là căn cứ vào một trong những phương pháp xếp hạng đại học đã biết với những điều chỉnh cụ thể cho phù hợp với điều kiện của Việt Nam. Cụ thể các hướng điều chỉnh này bao gồm: (1) chọn tiêu chí nào để đánh giá, và (2) gán trọng số cho các tiêu chí đã được chọn.

Cụ thể, đại học Bách Khoa Hà Nội đề xuất 9 tiêu chí với các trọng số để xếp hạng đại học được mô tả chi tiết ở đây.

Vấn đề của tất cả các cách xếp hạng đối với tình huống ở Việt Nam là: rất nhiều tiêu chí khó đo lường, hoặc trong nhiều tính huống thì đo lường các tiêu chí được chọn là không thể thực hiện được với nhiều trường đại học.

Do vậy vấn đề cần giải quyết đầu tiên là nên chọn các tiêu chí nào là phù hợp để đánh giá đại học. Tiêu chí đó phải thỏa mãn ít nhất ba tiêu chuẩn sau: (1) dễ dàng xác minh và đo lường, nguồn dữ liệu để tính các chỉ tiêu này là tin cậy và có thể so sánh - đối chiếu, và (3) sử dụng ít nhất các tiêu chí nhưng vẫn đảm bảo rằng kết quả xếp hạng là đủ tin cậy để sử dụng.

Tương tự như các tổ chức xếp hạng khác, The US News hàng năm cũng thực hiện xếp hạng các đại học trên thế giới căn cứ vào 13 tiêu chí được mô tả chi tiết ở đây.

Người viết bài này đề xuất hướng xếp hạng đại học dựa trên các tiêu chí mà tạp chí này sử dụng nhưng theo hướng giảm các tiêu chí đầu vào. Việc này đặc biệt có ý nghĩa vì rằng nếu sử dụng nguyên 13 tiêu chí này thì với nhiều trường đại học ở Việt Nam là không thể đo lường và xác định.

Mục tiêu của bài viết này là hướng vào trả lời câu hỏi Liệu sử dụng ít biến số hơn (ít tiêu chí đầu vào hơn) thì kết quả xếp hạng có đủ tốt hay không? để từ đó đề xuất sử dụng một bộ các biến số phù hợp khi xếp hạng các đại học trong điều kiện của Việt Nam.

Collecting Data from US News

Trước hết chúng ta thu thập dữ liệu của 300 đại học hàng đầu năm 2018 được xếp hạng bởi US News. Nếu bạn đọc nào không thạo lấy dữ liệu từ Website thì có thể không cần quan tâm nhiều đến các chi tiết kĩ thuật của R codes dưới đây:

#===========================================================================
#   State 1: Stage 1: Scraping Data For The Best 300 Global Universities
#  from https://www.usnews.com/education/best-global-universities/rankings
#===========================================================================

# Load some package: 

library(rvest)
library(tidyverse)
library(magrittr)

# Function gets all university links from a page: 

get_link_from_page <- function(x) {
  x %>% 
    read_html(x) %>% 
    html_nodes("a") %>% 
    html_attr("href") -> k
  
  k1 <- k[str_detect(k, "https://www.usnews.com/education/best-global-universities")]
  return(k1[str_detect(k1, "[0-9$]")])
  
}

# Get all links from 30 pages: 
all_links <- lapply(paste0("https://www.usnews.com/education/best-global-universities/rankings?page=", 1:30), get_link_from_page) %>% 
  unlist()

# A function collects data for an university: 

get_data_for_university <- function(x) {
  
  x %>% 
    read_html() -> html_content
  
  html_content %>% 
    html_nodes('.t-slack.sep div') %>% 
    html_text() %>% 
    str_squish() -> my_raw_data
  
  my_raw_data %>% 
    matrix(ncol = 2, byrow = TRUE) %>% 
    as.data.frame() %>% 
    mutate_all(as.character) -> raw_df1
  
 
  html_content %>% 
    html_nodes('.thumb-left') %>% 
    html_text() %>% 
    str_squish() -> rank_field
  
  rank_field[-c(1:2)] -> rank_field
  
  html_content %>% 
    html_nodes('.t-large a') %>% 
    html_text() %>% 
    str_squish() -> field_name
  
  raw_df2 <- data_frame(field = field_name, rank = rank_field)
  raw_df2 %>% 
    spread(value = "rank", key = "field") -> raw_df2_wide
  
  raw_df1 %>%  
    spread(value = "V1", key = "V2") -> raw_df1_wide
  
  # Get Uni Name + address: 
  
  html_content %>% 
    html_nodes('.h-biggest') %>% 
    html_text() %>% 
    str_squish() -> uni_name
  
  html_content %>% 
    html_nodes('.clearfix .t-slack:nth-child(3)') %>% 
    html_text() %>% 
    str_squish() -> uni_add
  
  full_join(raw_df1_wide %>% mutate(uni_name = uni_name), 
            raw_df2_wide %>% mutate(uni_name = uni_name, uni_add = uni_add), 
            by = "uni_name") -> df_for_university
  
  return(df_for_university)
  
}

# Use above function for collecting data for 300 universities: 
all_data_for_uni <- lapply(all_links[1:300], get_data_for_university)


#====================================
#   State 2: Data Preprocessing
#====================================
# Use Reduce() in conjunction with intersect() for identifying common columns: 

common_columns <- Reduce(intersect, lapply(all_data_for_uni, names))

# Final data frame: 
final_df <- do.call("bind_rows", 
                    lapply(all_data_for_uni, function (x) {x %>% select(common_columns)}))

# Rename for columns and convert some non-numeric ones to numeric: 

names(final_df) <- str_replace_all(names(final_df), " ", "_")

final_df %<>%  
  select(-uni_add, -Best_Global_Universities) %>% 
  mutate(uni_name = str_replace_all(uni_name, "--", "-") %>% as.factor(), Global_score = as.factor(Global_score)) %>% 
  mutate_if(is.character, function(x) {x %>% str_replace_all("[^0-9]", "") %>% as.numeric()}) %>% 
  mutate(Global_score = as.character(Global_score) %>% as.numeric(), uni_name = as.character(uni_name))

Random Forest for Ranking Universities

Trước hết chúng ta có thể thấy, ví dụ, một số chỉ số có tương quan thuận đến thứ hạng của đại học. Một trong các biến số đó là “Number of Publications That Are Among the 10 Percent Most Cited”:

Tương quang giữa “Number of Publications That Are Among the 10 Percent Most Cited” và thứ hạng của đại học là một số âm như ta có thể thấy:

## [1] -0.7553178

Nhìn cái đường dốc xuống có thể có ấn tượng nhầm rằng “Number of Publications That Are Among the 10 Percent Most Cited” và thứ hạng đại học tương quan ngược. Nguyên nhân là “Number of Publications That Are Among the 10 Percent Most Cited” được đo bằng thứ hạng chứ không phải số lượng xuất bản. Như vậy thì thứ hạng càng nhỏ (tức xuất bản thuộc 10 Percent Most Cited càng nhiều) thì trường càng có thứ hạng cao.

Dưới đây chúng ta khảo sát việc sử dụng Random Forest (RF) - một cách tiếp cận của Machine Learning để xếp hạng các đại học dựa trên toàn bộ 13 biến số đầu vào theo cách tiếp cận của tạp chí US News.

Cụ thể, 70% quan sát trong số 300 đại học sẽ được lấy ngẫu nhiên làm dữ liệu huấn luyện RF và 30% dữ liệu còn lại được sử dụng để test khả năng xếp hạng của RF:

Chúng ta thấy rằng kết quả xếp hạng từ RF là rất sát với thực tế:

University Actual_scores Predicted_scores Error_percent
Stanford University 93.8 92.9 0.9
University of California-Berkeley 90.8 89.4 1.5
University of Oxford 87.6 87.9 -0.4
California Institute of Technology 85.9 78.0 9.2
Columbia University 85.6 83.4 2.5
Princeton University 84.7 79.4 6.3
University of Washington 84.6 83.9 0.8
Yale University 84.2 82.5 2.1
University of California-Los Angeles 83.6 82.6 1.2
University of California-San Francisco 83.2 83.0 0.2
Imperial College London 82.3 82.3 0.0
University of Toronto 81.9 82.8 -1.1
University College London 81.6 82.1 -0.6
Duke University 81.2 80.6 0.8
University of Melbourne 77.5 76.3 1.6
Washington University in St. Louis 76.3 76.2 0.1
University of Copenhagen 75.7 76.8 -1.4
University of Minnesota-Twin Cities 74.5 75.9 -1.9
University of Queensland Australia 74.4 73.4 1.3
University of Colorado-Boulder 74.1 72.0 2.8
University of Pittsburgh 74.1 74.5 -0.5
Boston University 74.0 72.1 2.6
University of Munich 74.0 73.5 0.7
University of Maryland-College Park 73.2 71.3 2.6
Monash University 72.2 71.2 1.4
Universite Sorbonne Paris Cite-USPC (ComUE) 72.2 73.8 -2.3
University of Tokyo 72.2 72.8 -0.9
King Abdulaziz University 70.8 68.4 3.3
University of Bristol 70.7 69.6 1.6
Technical University of Munich 70.0 69.4 0.8
Carnegie Mellon University 69.7 66.3 4.8
Lund University 69.1 68.9 0.3
University of Geneva 69.1 67.9 1.8
University of Oslo 68.2 68.3 -0.1
Brown University 68.1 67.3 1.2
University of Hong Kong 67.7 66.1 2.3
Uppsala University 67.7 67.9 -0.3
Queen Mary, University of London 67.2 65.8 2.1
Weizmann Institute of Science 66.8 63.7 4.6
Purdue University-West Lafayette 66.7 66.1 0.9
Stockholm University 66.2 64.4 2.7
Freie Universität Berlin 66.1 67.5 -2.2
Kyoto University 65.6 65.7 -0.2
University of Basel 65.4 64.8 0.9
University of Bologna 65.3 65.0 0.4
Communaute Universite Grenoble Alpes 65.2 64.3 1.4
Sapienza University of Rome 65.2 66.0 -1.2
McMaster University 65.0 65.9 -1.3
University Catholique of Louvain 64.2 62.7 2.3
Shanghai Jiao Tong University 64.1 66.0 -3.0
Universite de Lyon (ComUE) 64.0 63.6 0.6
University of Leeds 63.6 63.9 -0.4
University of Exeter 63.3 62.7 0.9
University of Gothenburg 63.2 63.4 -0.3
University of Freiburg 63.0 62.4 0.9
Pompeu Fabra University 62.6 61.1 2.4
Stony Brook University-SUNY 62.6 61.7 1.4
Delft University of Technology 62.3 60.3 3.2
RWTH Aachen University 61.4 60.8 1.1
Hebrew University of Jerusalem 60.5 60.2 0.5
University of Witwatersrand 59.9 58.6 2.1
University of Tennessee 59.7 60.0 -0.5
Royal Institute of Technology 59.5 59.1 0.7
University of Notre Dame 59.5 58.3 2.0
University of Ottawa 59.5 61.6 -3.5
Osaka University 59.1 60.3 -2.0
Languedoc-Roussillon Universites (ComUE) 59.0 60.0 -1.6
North Carolina State University-Raleigh 59.0 59.0 0.0
Sun Yat-sen University 58.9 61.0 -3.6
University of Naples Federico II 58.8 59.7 -1.5
Tohoku University 58.7 59.7 -1.6
University of Erlangen Nuremberg 58.6 59.8 -2.0
Griffith University 58.1 58.5 -0.6
Lancaster University 58.0 57.7 0.6
James Cook University 57.8 57.9 -0.1
University of Technology Sydney 57.8 57.1 1.1
Brandeis University 57.5 61.7 -7.3
University at Buffalo-SUNY 57.4 58.6 -2.0
University of Trieste 57.4 58.0 -1.1
University of Pavia 56.8 57.2 -0.7
University of Kansas 56.6 58.8 -3.9
Colorado State University 56.3 58.1 -3.2
University of Wollongong 56.2 56.9 -1.2
University of Newcastle 56.0 57.3 -2.4
Polytechnic University of Milan 55.8 57.4 -2.9
University of Georgia 55.8 58.2 -4.3
University of South Florida 55.6 58.6 -5.4
University of Nebraska-Lincoln 55.3 57.1 -3.2
University of Innsbruck 55.1 57.4 -4.2
University of Southern Denmark 55.1 56.5 -2.5

Chúng ta có thể đánh giá mức độ “tương hợp” giữa kết quả dự báo và thực tế bằng công cụ hình ảnh:

Variable Selection

Kết quả trên chỉ ra rằng nếu sử dụng toàn bộ 13 biến số thì kết quả dự báo của RF là rất tốt. Tuy nhiên như đã phân tích, nếu sử dụng cả 13 biến số này như cách làm của The US News để xếp hạng đại học là không thể trong điều kiện của Việt Nam. Vì nhiều biến số trong danh sách này là rất khó tính toán hoặc có thể tính toán nhưng với chi phí rất lớn về thời gian.

Trước hết ta xem lại danh sách 13 biến số này cùng trọng số tương ứng của chúng:

Tabel 1: Indicators that Affect University Ranking by Decreasing Importance proposed by US News
Indicator Weight
Global research reputation 12.5%
Regional research reputation 12.5%
Number of publications that are among the 10 percent most cited 12.5%
Publications 10%
Normalized citation impact 10%
Percentage of total publications that are among the 10 percent most cited 10%
Total citations 7.5%
International collaboration 5%
Percentage of total publications with international collaboration 5%
Number of highly cited papers that are among the top 1 percent most cited in their respective field 5%
Percentage of total publications that are among the top 1 percent most highly cited papers 5%
Books 2.5%
Conferences 2.5%

Chúng ta so sánh “trọng số” của các biến số này theo thuật toán RF:

Tabel 2: Indicators that Affect University Ranking by Decreasing Importance based on RF Model
Indicator Overall
Number of publications that are among the 10 percent most cited 100.000000
Percentage of total publications that are among the 10 percent most cited 99.932522
Number of highly cited papers that are among the top 1 percent most cited 99.662379
Total citations 88.703778
Global research reputation 83.919730
Normalized citation impact 79.973269
Percentage of highly cited papers that are among the top 1 percent most cited 67.924769
Publications 57.425161
Regional research reputation 48.737263
Books 38.401465
Conferences 10.057980
International collaboration 5.214785
Percentage of total publications with international collaboration 0.000000

Kết quả này chỉ ra rằng cách trọng số của các biến - hiểu theo nghĩa là mức độ ảnh hưởng của các biến số này đến khả năng xếp hạng đại học là có chút khác biệt.

Hiện tại, với hiểu biết hạn chế của người viết bài này thì có thể các biến số sau là khó có thể tính toán / thu thập hoặc chúng - nếu được lựa chọn có thể là các biến không phản ánh thực tế thứ hạng trong bối cảnh Việt Nam:

  1. Global research reputation.
  2. Normalized citation impact.
  3. Regional research reputation.
  4. Books.
  5. International collaboration.
  6. Percentage of highly cited papers that are among the top 1 percent most cited.

Chẳng hạn, tiêu chí “Book”. Nhiều đại học ở VN gần như không xuất bản sách, không có nhà in riêng. Một số đại học thì xuất bản rất nhiều sách nhưng trong số đó một lượng lớn là sách dịch của các tác giả có uy tín. Một số trường thì một số tác giả gọi là có sách nhưng chúng có thể được copy là chính từ một đồng nghiệp (nạn đạo sách) từ nước ngoài. Có thể là nguyên cả cuốn sách hoặc cả một chương sách.

Với tiêu chí “Percentage of highly cited papers that are among the top 1 percent most cited” thì gần như không thể có với các đại học Việt Nam nên nếu lấy biến này thì chúng ta sẽ có một biến mà giới thống kê gọi là Near-Zero Variance Variable.

Do vậy, với điều kiện Việt Nam chúng ta có thể loại bỏ các biến này ra khỏi mô hình. Chúng ta xem kết quả dự báo của RF ra sao khi các biến đầu vào được sử dụng chỉ còn 13 - 6 = 7:

Chỉ sử dụng 7 biến số này thì kết quả xếp hạng đại học dự báo từ mô hình RF so với thứ hạng thực tế như sau:

University Actual_scores Predicted_scores Error_percent
Stanford University 93.8 94.1 -0.3
University of California-Berkeley 90.8 88.2 2.9
University of Oxford 87.6 89.5 -2.2
California Institute of Technology 85.9 75.3 12.4
Columbia University 85.6 82.6 3.5
Princeton University 84.7 74.3 12.2
University of Washington 84.6 86.4 -2.1
Yale University 84.2 81.6 3.0
University of California-Los Angeles 83.6 82.3 1.5
University of California-San Francisco 83.2 84.3 -1.4
Imperial College London 82.3 82.3 0.0
University of Toronto 81.9 88.0 -7.5
University College London 81.6 84.6 -3.7
Duke University 81.2 81.3 -0.1
University of Melbourne 77.5 76.2 1.7
Washington University in St. Louis 76.3 75.3 1.3
University of Copenhagen 75.7 79.5 -5.1
University of Minnesota-Twin Cities 74.5 76.6 -2.8
University of Queensland Australia 74.4 74.2 0.3
University of Colorado-Boulder 74.1 71.4 3.7
University of Pittsburgh 74.1 76.4 -3.1
Boston University 74.0 72.0 2.7
University of Munich 74.0 73.2 1.0
University of Maryland-College Park 73.2 70.6 3.5
Monash University 72.2 70.9 1.8
Universite Sorbonne Paris Cite-USPC (ComUE) 72.2 77.3 -7.1
University of Tokyo 72.2 72.7 -0.7
King Abdulaziz University 70.8 70.6 0.3
University of Bristol 70.7 69.6 1.6
Technical University of Munich 70.0 68.7 1.9
Carnegie Mellon University 69.7 63.7 8.6
Lund University 69.1 68.1 1.4
University of Geneva 69.1 69.5 -0.6
University of Oslo 68.2 68.2 0.0
Brown University 68.1 65.5 3.9
University of Hong Kong 67.7 63.4 6.4
Uppsala University 67.7 67.8 -0.2
Queen Mary, University of London 67.2 65.2 3.0
Weizmann Institute of Science 66.8 61.6 7.7
Purdue University-West Lafayette 66.7 64.6 3.2
Stockholm University 66.2 62.7 5.3
Freie Universität Berlin 66.1 67.3 -1.9
Kyoto University 65.6 64.1 2.3
University of Basel 65.4 65.5 -0.2
University of Bologna 65.3 65.1 0.3
Communaute Universite Grenoble Alpes 65.2 66.6 -2.2
Sapienza University of Rome 65.2 65.9 -1.0
McMaster University 65.0 66.0 -1.6
University Catholique of Louvain 64.2 61.7 3.9
Shanghai Jiao Tong University 64.1 67.2 -4.9
Universite de Lyon (ComUE) 64.0 63.4 1.0
University of Leeds 63.6 64.4 -1.2
University of Exeter 63.3 63.7 -0.6
University of Gothenburg 63.2 63.3 -0.2
University of Freiburg 63.0 63.0 -0.1
Pompeu Fabra University 62.6 59.6 4.8
Stony Brook University-SUNY 62.6 61.1 2.4
Delft University of Technology 62.3 59.4 4.7
RWTH Aachen University 61.4 60.7 1.2
Hebrew University of Jerusalem 60.5 58.1 3.9
University of Witwatersrand 59.9 57.3 4.4
University of Tennessee 59.7 60.6 -1.5
Royal Institute of Technology 59.5 59.2 0.6
University of Notre Dame 59.5 57.5 3.4
University of Ottawa 59.5 61.9 -4.0
Osaka University 59.1 59.3 -0.3
Languedoc-Roussillon Universites (ComUE) 59.0 62.2 -5.4
North Carolina State University-Raleigh 59.0 58.5 0.8
Sun Yat-sen University 58.9 61.8 -4.8
University of Naples Federico II 58.8 61.4 -4.4
Tohoku University 58.7 59.2 -0.9
University of Erlangen Nuremberg 58.6 61.1 -4.3
Griffith University 58.1 57.6 0.8
Lancaster University 58.0 56.5 2.6
James Cook University 57.8 56.4 2.5
University of Technology Sydney 57.8 56.5 2.2
Brandeis University 57.5 60.1 -4.5
University at Buffalo-SUNY 57.4 58.5 -1.8
University of Trieste 57.4 57.8 -0.7
University of Pavia 56.8 58.0 -2.2
University of Kansas 56.6 58.9 -4.0
Colorado State University 56.3 58.0 -3.1
University of Wollongong 56.2 56.2 0.1
University of Newcastle 56.0 56.6 -1.0
Polytechnic University of Milan 55.8 57.3 -2.7
University of Georgia 55.8 57.8 -3.5
University of South Florida 55.6 59.1 -6.3
University of Nebraska-Lincoln 55.3 57.1 -3.3
University of Innsbruck 55.1 57.6 -4.5
University of Southern Denmark 55.1 56.9 -3.2

Chúng ta có thể sử dụng công cụ hình ảnh để đánh giá:

Tương quan giữa giá trị thực tế và dự báo (một thước đo thể hiện mức độ chính xác của mô hình khi dự báo thứ hạng đại học) giữa mô hình sử dụng 13 biến so với mô hình sử dụng chỉ 7 biến số là chênh lệch không đáng kể như ta có thể thấy:

## [1] 0.9865711
## [1] 0.9615697

Some Key Conclusions and Recommendations

Từ các kết quả trên chúng ta rút ra các kết luận sau:

  1. Việc sử dụng chỉ hơn 50% biến số so với sử dụng toàn bộ các biến (tiêu chí) như của tạp chí US News đề xuất không làm giảm đáng kể khả năng xếp hạng đại học. Điều này hàm ý rằng xếp hạng các đại học trong bối cảnh Việt Nam có thể chỉ cần sử dụng 7 (hoặc ít hơn) các biến số so với 13 biến nếu áp dụng nguyên cách tiếp cận của US News mà vẫn có thể đảm bảo tích chính xác khi xếp hạng.

  2. Cách thức gán trọng số cho các biến khi đánh giá thứ hạng của đại học của RF so với trọng số được sử dụng bởi US News (có lẽ các chuyên gia giáo dục và quản lí đại học đề xuất các trọng số này cho US News) là khác biệt nhưng kết quả dự báo với trọng số theo kiểu của RF lại rất chính khi dự báo thứ hạng. Chắc chắn việc gán các trọng số cho các biến sử dụng luôn là vấn đề gây tranh cãi giữa các chuyên gia và do đó trọng số của các biến gợi ý bởi RF nên được tham khảo và sử dụng.

LS0tDQp0aXRsZTogIkEgTmFpdmUgQXBwcm9hY2ggdG8gUmFua2luZyBWaWV0bmFtIFVuaXZlcnNpdGllcyIgDQpzdWJ0aXRsZTogIlIgZm9yIFBsZWFzdXJlIg0KYXV0aG9yOiAiTmd1eWVuIENoaSBEdW5nIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgIyBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQ0KYGBgDQoNCiMgQSBTaG9ydCBJbnRyb2R1Y3Rpb24gdG8gUmFua2luZyBVbml2ZXJzaXR5DQoNCljhur9wIGjhuqFuZyDEkeG6oWkgaOG7jWMgKFVuaXZlcnNpdHkgcmFua2luZykgbMOgIHZp4buHYyBsaeG7h3Qga8OqIGRhbmggc8OhY2ggY8OhYyB0csaw4budbmcgdGhlbyBt4buZdCB0aOG7qSBi4bqtYyBuaOG6pXQgxJHhu4tuaCBk4buxYSB0csOqbiBt4buZdCB04buVIGjhu6NwIGPDoWMgY2jhu4kgc+G7kS4gVmnhu4djIHjhur9wIGjhuqFuZyBjw7MgdGjhu4MgZOG7sWEgdHLDqm4gY2jhuqV0IGzGsOG7o25nIMSRxrDhu6NjIGhp4buDdSBt4buZdCBjw6FjaCBjaOG7pyBxdWFuIHF1YSBjw6FjIGNvbiBz4buRIHRo4buRbmcga8OqLCBr4bq/dCBxdeG6oyDEkWnhu4F1IHRyYSBj4bunYSBjw6FjIG5ow6AgZ2nDoW8gZOG7pWMsIGPDoWMgY2h1ecOqbiBnaWEsIGdp4bqjbmcgdmnDqm4sIHNpbmggdmnDqm4gdsOgIGPDoWMgxJHhu5FpIHTGsOG7o25nIGtow6FjIChNYXJnaW5zb24sIDIwMDcpLiBOaOG7r25nIGLhuqNuZyB44bq/cCBo4bqhbmcgbsOgeSDEkcaw4bujYyBjb2kgbMOgIMSRw6MgImPhu6duZyBj4buRIGtow6FpIG5p4buHbSB24buBIG3hu5l0IHRo4buLIHRyxrDhu51uZyDEkeG6oWkgaOG7jWMgdGjhur8gZ2nhu5tpIiAoTWFyZ2luc29uICYgVmFuIGRlciBXZW5kZSwgMjAwNyksIHRyb25nIMSRw7MgY8OhYyB0csaw4budbmcgxJHhuqFpIGjhu41jIMSRxrDhu6NjIMSRw6FuaCBnacOhIHRoZW8gbeG7mXQgcXV5IG3DtCB0b8OgbiBj4bqndSwgZG8gxJHDsyB04bqhbyByYSBz4buxIGPhuqFuaCB0cmFuaCBnaeG7r2EgY8OhYyB0csaw4budbmcgxJHhuqFpIGjhu41jIG5oxrAgbeG7mXQgbcO0IGjDrG5oIG3hu5tpIOG7nyBo4bqndSBo4bq/dCBjw6FjIHF14buRYyBnaWEgKEFsdGJhY2gsIDIwMDYpLg0KDQoNCkPDoWMgbcO0IGjDrG5oIHjhur9wIGjhuqFuZyB0aGF5IMSR4buVaSDEkcOhbmcga+G7gyB0aGVvIG3hu6VjIMSRw61jaCB2w6AgcGjhuqFtIHZpLCB0aGVvIGPDoWMgxJHhu4tuaCBuZ2jEqWEgdsOgIHRoZW8gY8OhYyBt4bqrdSBwaMawxqFuZyBwaMOhcCBsdeG6rW4gY+G7p2EgY2jDum5nIChVc2hlciAmIFNhdmlubywgMjAwNikuIFbDrSBk4bulIG5oxrAgQuG6o25nIHjhur9wIGjhuqFuZyBo4buNYyB0aHXhuq10IGPDoWMgdHLGsOG7nW5nIMSR4bqhaSBo4buNYyB0csOqbiB0aOG6vyBnaeG7m2kgKEFSV1UpIGPhu6dhIMSQ4bqhaSBo4buNYyBHaWFvIHRow7RuZyBUaMaw4bujbmcgSOG6o2kgKFNoYW5naGFpIEppYW90b25nIFVuaXZlcnNpdHkpIHhlbSB4w6l0IGPDoWMgdGnDqnUgY2jDrSBzYXU6IA0KDQohW10oQzovVXNlcnMvWmJvb2svRG9jdW1lbnRzL3hlcF9oYW5nMS5wbmcpDQoNCk3hu6VjIGNo4bunIHnhur91IGPhu6dhIHZp4buHYyB44bq/cCBo4bqhbmcgbMOgIMSR4buDIG7Dom5nIGNhbyBoxqFuIG7hu69hIGNo4bqldCBsxrDhu6NuZyB2w6AgdMOtbmggbWluaCBi4bqhY2ggdGjDtG5nIHRpbiBj4bunYSBjw6FjIHThu5UgY2jhu6ljIGdpw6FvIGThu6VjIMSR4bqhaSBo4buNYyB0cm9uZyBi4buRaSBj4bqjbmggY+G6oW5oIHRyYW5oIHbDoCB0b8OgbiBj4bqndSBob8OhLCBxdeG7kWMgdOG6vyBob8OhIGRp4buFbiByYSBuZ8OgeSBjw6BuZyBt4bqhbmggbeG6vSB0cm9uZyBnacOhbyBk4bulYyDEkeG6oWkgaOG7jWMuIEdp4buvYSB4dSB0aOG6vyDhuqV5LCBjw6FjIGPGoSBxdWFuIHF14bqjbiBsw70gbmjDoCBuxrDhu5tjIHRoxrDhu51uZyBjaOG7iSDEkcOzbmcgdmFpIHRyw7Iga2nhu4NtIMSR4buLbmggdsOgIHBow6JuIGxv4bqhaSBjw6FjIGPGoSBz4bufIGdpw6FvIGThu6VjIMSR4bqhaSBo4buNYy4gU8OibiBjaMahaSB24buBIHjhur9wIGjhuqFuZyDEkeG6oWkgaOG7jWMgxJFhIHBo4bqnbiDEkeG7gXUgZG8gY8OhYyB04buVIGNo4bupYyDEkeG7mWMgbOG6rXAgdGnhur9uIGjDoG5oLiANCg0KIyBQcm9ibGVtIG9mIFJhbmtpbmcgVmlldG5hbSBVbml2ZXJzaXRpZXMNCg0KVHV5IHbhuq15LCBuZ2/DoGkgY2jhuqV0IGzGsOG7o25nLCBuaGnhu4F1IG5ow6AgcXXhuqNuIGzDrSBnacOhbyBk4bulYyB2w6AgY+G6oyBuaGnhu4F1IHRyxrDhu51uZyDEkeG6oWkgaOG7jWMg4bufIFZp4buHdCBOYW0gbOG6oWkgxJHGsGEgcmEgbmjhu69uZyBjaOG6pXQgduG6pW4gdsOgIG5naGkgbmfhu50gduG7gSBt4bulYyDEkcOtY2ggY+G7p2EgeOG6v3AgaOG6oW5nIMSR4bqhaSBo4buNYyDhu58gVmnhu4d0IE5hbSBjw7MgdGjhu4Mga2jDtG5nIGhv4bq3YyBraMOzIMSR4bqhdCDEkcaw4bujYyB2w6wgcuG6pXQgbmhp4buBdSBsw60gZG8uIE3hu5l0IHRyb25nIG5o4buvbmcgbMOtIGRvIMSRw7MgbMOgIHZp4buHYyBnaWFvIGPDtG5nIHZp4buHYyBuw6B5IGNobyBt4buZdCDEkeG6oWkgaOG7jWMgY+G7pSB0aOG7gyBuw6BvIMSRw7MgY8OzIHRo4buDIHZpIHBo4bqhbSB0w61uaCDEkeG7mWMgbOG6rXAgY+G7p2EgdOG7lSBjaOG7qWMgdGjhu7FjIGhp4buHbiB44bq/cCBo4bqhbmcuIENo4bqzbmcgaOG6oW4sIGxvIG5n4bqhaSDEkcOzIGPDsyB0aOG7gyBsw6AgcGjGsMahbmcgcGjDoXAgdGjhu7FjIGhp4buHbiB44bq/cCBo4bqhbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgKG5oxrAgY2jhu41uIGPDoWMgdGnDqnUgY2jDrSBuw6BvIMSR4buDIHjhur9wIGjhuqFuZyB2w6AgduG7m2kgY8OhYyB0cuG7jW5nIHPhu5EgbMOgIGJhbyBuaGnDqnUpIGPDsyB0aOG7gyAidGhpw6puIHbhu4siIHRoZW8gaMaw4bubbmcgY8OzIGzhu6NpIGNobyBt4buZdCBuaMOzbSB0csaw4budbmcgbsOgbyDEkcOzIHbDoCBraMO0bmcgY8O0bmcgYuG6sW5nIHbhu5tpIGPDoWMgdHLGsOG7nW5nIGPDsm4gbOG6oWkuIFbhuqVuIMSR4buBIG7DoHkgY8OzIHRo4buDIHRoYW0ga2jhuqNvIFtjaGkgdGnhur90IGjGoW4g4bufIMSRw6J5XShodHRwczovL2VkdTJyZXZpZXcuY29tL3Jldmlld3MvYmFuZy14ZXAtaGFuZy1kYWktaG9jLW8tdmlldC1uYW0tY28tdGhhdC1zdS1kYW5nLXRpbi1jYXktNTk5MS5odG1sKS4gDQoNCiMgRGVtYW5kIGZvciBSYW5raW5nIFVuaXZlcnNpdGllcyBpbiBWaWV0bmFtDQoNCljhur9wIGjhuqFuZyDEkeG6oWkgaOG7jWMg4bufIFZp4buHdCBOYW0gdGjhu7FjIHPhu7EgbMOgIG3hu5l0IHbhuqVuIMSR4buBIHF1YW4gdHLhu41uZyB2w6wgbsOzIGxpw6puIHF1YW4gxJHhur9uIHLhuqV0IG5oaeG7gXUgduG6pW4gxJHhu4Egc2F1LiANCg0KMS4gVGjhu6kgaOG6oW5nIGPhu6dhIG3hu5l0IMSR4bqhaSBo4buNYyBn4bqvbiBsaeG7gW4gduG7m2kgKip0aMawxqFuZyBoaeG7h3UqKiB2w6AgZG8gxJHDsyBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgbmhp4buBdSDEkeG6v24gZGFuaCB0aeG6v25nLCBraOG6oyBuxINuZyB0aHUgaMO6dCBmdW5kIGNobyB0csaw4budbmcgdsOgIGPDoWMgZOG7sSDDoW4gbmdoacOqbiBj4bupdS4gRGFuaCB0aeG6v25nIGPhu6dhIHRyxrDhu51uZyBjxaluZyBjw7JuIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyB0aHUgaMO6dCBzaW5oIHZpw6puLiAgTmhp4buBdSB0csaw4budbmcgxJBIIOG7nyBWaeG7h3QgTmFtIMSRYW5nIHR1eeG7g24gZMaw4bubaSBjaOG7iSB0acOqdSwgdGjhuq1tIGNow60gY8OzIG3hu5l0IHPhu5Egbmdow6BuaCBo4buNYyBraMO0bmcgdHV54buDbiDEkcaw4bujYyB0aMOtIHNpbmggbsOgby4gDQoNCjIuIE5odSBj4bqndSB24buBIHjhur9wIGjhuqFuZyDEkeG6oWkgaOG7jWMgxJHDoyDEkcaw4bujYyB4w6FjIMSR4buLbmggbMOgIG3hu5l0IG5oaeG7h20gduG7pSB0cuG7jW5nIHTDom0gY+G7p2EgYuG7mSBHacOhbyBE4bulYyB2w6AgxJDDoG8gVOG6oW8uIELhuqFuIMSR4buNYyBxdWFuIHTDom0gY8OzIHRo4buDIHRoYW0ga2jhuqNvIGvEqSBoxqFuIFvhu58gxJHDonldKGh0dHBzOi8vdHVvaXRyZS52bi94ZXAtaGFuZy1kYWktaG9jLWxhLW5oaWVtLXZ1LXRyb25nLXRhbS0yMDE4MDQxMjEwMTcwOTExNi5odG0pLiANCg0KSGnhu4duIHThuqFpIMSRw6MgY8OzIG3hu5l0IHPhu5EgbmjDs20gbmdoacOqbiBj4bupdSDEkeG7mWMgbOG6rXAgdGjhu7FjIGhp4buHbiB44bq/cCBo4bqhbmcgY2hvIGPDoWMgxJHhuqFpIGjhu41jIOG7nyBWaeG7h3QgTmFtIHbDoCBr4bq/dCBxdeG6oyBsw6AgbOG6p24gxJHhuqd1IHRpw6puIGPDsyA0OSB0csaw4budbmcgxJHGsOG7o2MgY8OzIG3hurd0IHRyb25nIGRhbmggc8OhY2ggeOG6v3AgaOG6oW5nIG7DoHkuIEvhur90IHF14bqjIChjxaluZyBuaMawIGPDoWMgdHJhbmggbHXhuq1uIHbhu4Egc+G7sSBo4bujcCBsw60pIGPhu6dhIGLhuqNuZyB44bq/cCBo4bqhbmcgbsOgeSBi4bqhbiDEkeG7jWMgY8OzIHRo4buDIHRoYW0ga2jhuqNvIFvhu58gxJHDonldKGh0dHBzOi8vZHV5dGFuLmVkdS52bi9uZXdzL05ld3NEZXRhaWwuYXNweD9pZD0zOTAxJnBpZD0yMDY4Jmxhbmc9dmktVk4pLiANCg0KIyBBIE5haXZlIEFwcHJvYWNoIHRvIFJhbmtpbmcgVmlldG5hbSBVbml2ZXJzaXRpZXMNCg0KTmjGsCBjaMO6bmcgdGEgY8OzIHRo4buDIHRo4bqleSBjw6FjIGPDoWNoIHjhur9wIGjhuqFuZyDEkeG6oWkgaOG7jWMgVmnhu4d0IE5hbSB0aMaw4budbmcgbMOgIGPEg24gY+G7qSB2w6BvIG3hu5l0IHRyb25nIG5o4buvbmcgcGjGsMahbmcgcGjDoXAgeOG6v3AgaOG6oW5nIMSR4bqhaSBo4buNYyDEkcOjIGJp4bq/dCB24bubaSBuaOG7r25nIMSRaeG7gXUgY2jhu4luaCBj4bulIHRo4buDIGNobyBwaMO5ICBo4bujcCB24bubaSDEkWnhu4F1IGtp4buHbiBj4bunYSBWaeG7h3QgTmFtLiBD4bulIHRo4buDIGPDoWMgaMaw4bubbmcgxJFp4buBdSBjaOG7iW5oIG7DoHkgYmFvIGfhu5NtOiAoMSkgY2jhu41uIHRpw6p1IGNow60gbsOgbyDEkeG7gyDEkcOhbmggZ2nDoSwgdsOgICgyKSBnw6FuIHRy4buNbmcgc+G7kSBjaG8gY8OhYyB0acOqdSBjaMOtIMSRw6MgxJHGsOG7o2MgY2jhu41uLiANCg0KQ+G7pSB0aOG7gywgxJHhuqFpIGjhu41jIELDoWNoIEtob2EgSMOgIE7hu5lpIMSR4buBIHh14bqldCA5IHRpw6p1IGNow60gduG7m2kgY8OhYyB0cuG7jW5nIHPhu5EgxJHhu4MgeOG6v3AgaOG6oW5nIMSR4bqhaSBo4buNYyDEkcaw4bujYyBtw7QgdOG6oyBjaGkgdGnhur90IFvhu58gxJHDonldKGh0dHBzOi8vdm5leHByZXNzLm5ldC9naWFvLWR1Yy9nb2kteS05LXRpZXUtY2hpLXhlcC1oYW5nLWRhaS1ob2MtdmlldC1uYW0tMzc5NTEwOS5odG1sKS4gDQoNClbhuqVuIMSR4buBIGPhu6dhIHThuqV0IGPhuqMgY8OhYyBjw6FjaCB44bq/cCBo4bqhbmcgxJHhu5FpIHbhu5tpIHTDrG5oIGh14buRbmcg4bufIFZp4buHdCBOYW0gbMOgOiBy4bqldCBuaGnhu4F1IHRpw6p1IGNow60ga2jDsyDEkW8gbMaw4budbmcsIGhv4bq3YyB0cm9uZyBuaGnhu4F1IHTDrW5oIGh14buRbmcgdGjDrCDEkW8gbMaw4budbmcgY8OhYyB0acOqdSBjaMOtIMSRxrDhu6NjIGNo4buNbiBsw6Aga2jDtG5nIHRo4buDIHRo4buxYyBoaeG7h24gxJHGsOG7o2MgduG7m2kgbmhp4buBdSB0csaw4budbmcgxJHhuqFpIGjhu41jLiANCg0KRG8gduG6rXkgduG6pW4gxJHhu4EgY+G6p24gZ2nhuqNpIHF1eeG6v3QgxJHhuqd1IHRpw6puIGzDoCBuw6puIGNo4buNbiBjw6FjIHRpw6p1IGNow60gbsOgbyBsw6AgcGjDuSBo4bujcCDEkeG7gyDEkcOhbmggZ2nDoSDEkeG6oWkgaOG7jWMuIFRpw6p1IGNow60gxJHDsyBwaOG6o2kgdGjhu49hIG3Do24gw610IG5o4bqldCBiYSB0acOqdSBjaHXhuqluIHNhdTogKDEpIGThu4UgZMOgbmcgeMOhYyBtaW5oIHbDoCDEkW8gbMaw4budbmcsIG5ndeG7k24gZOG7ryBsaeG7h3UgxJHhu4MgdMOtbmggY8OhYyBjaOG7iSB0acOqdSBuw6B5IGzDoCB0aW4gY+G6rXkgdsOgIGPDsyB0aOG7gyBzbyBzw6FuaCAtIMSR4buRaSBjaGnhur91LCB2w6AgKDMpIHPhu60gZOG7pW5nIMOtdCBuaOG6pXQgY8OhYyB0acOqdSBjaMOtIG5oxrBuZyB24bqrbiDEkeG6o20gYuG6o28gcuG6sW5nIGvhur90IHF14bqjIHjhur9wIGjhuqFuZyBsw6AgxJHhu6cgdGluIGPhuq15IMSR4buDIHPhu60gZOG7pW5nLiANCg0KVMawxqFuZyB04buxIG5oxrAgY8OhYyB04buVIGNo4bupYyB44bq/cCBo4bqhbmcga2jDoWMsIFRoZSBVUyBOZXdzIGjDoG5nIG7Eg20gY8WpbmcgdGjhu7FjIGhp4buHbiB44bq/cCBo4bqhbmcgY8OhYyDEkeG6oWkgaOG7jWMgdHLDqm4gdGjhur8gZ2nhu5tpIGPEg24gY+G7qSB2w6BvIDEzIHRpw6p1IGNow60gxJHGsOG7o2MgbcO0IHThuqMgY2hpIHRp4bq/dCBb4bufIMSRw6J5XShodHRwczovL3d3dy51c25ld3MuY29tL2VkdWNhdGlvbi9iZXN0LWdsb2JhbC11bml2ZXJzaXRpZXMvYXJ0aWNsZXMvbWV0aG9kb2xvZ3kpLiANCg0KTmfGsOG7nWkgdmnhur90IGLDoGkgbsOgeSDEkeG7gSB4deG6pXQgaMaw4bubbmcgeOG6v3AgaOG6oW5nIMSR4bqhaSBo4buNYyBk4buxYSB0csOqbiBjw6FjIHRpw6p1IGNow60gbcOgIHThuqFwIGNow60gbsOgeSBz4butIGThu6VuZyBuaMawbmcgdGhlbyBoxrDhu5tuZyAqKmdp4bqjbSBjw6FjIHRpw6p1IGNow60gxJHhuqd1IHbDoG8qKi4gVmnhu4djIG7DoHkgxJHhurdjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHbDrCBy4bqxbmcgbuG6v3Ugc+G7rSBk4bulbmcgbmd1ecOqbiAxMyB0acOqdSBjaMOtIG7DoHkgdGjDrCB24bubaSBuaGnhu4F1IHRyxrDhu51uZyDEkeG6oWkgaOG7jWMg4bufIFZp4buHdCBOYW0gbMOgIGtow7RuZyB0aOG7gyDEkW8gbMaw4budbmcgdsOgIHjDoWMgxJHhu4tuaC4gDQoNCk3hu6VjIHRpw6p1IGPhu6dhIGLDoGkgdmnhur90IG7DoHkgbMOgIGjGsOG7m25nIHbDoG8gdHLhuqMgbOG7nWkgY8OidSBo4buPaSAqKkxp4buHdSBz4butIGThu6VuZyDDrXQgYmnhur9uIHPhu5EgaMahbiAow610IHRpw6p1IGNow60gxJHhuqd1IHbDoG8gaMahbikgdGjDrCBr4bq/dCBxdeG6oyB44bq/cCBo4bqhbmcgY8OzIMSR4bunIHThu5F0IGhheSBraMO0bmc/KiogxJHhu4MgdOG7qyDEkcOzICoqxJHhu4EgeHXhuqV0IHPhu60gZOG7pW5nIG3hu5l0IGLhu5kgY8OhYyBiaeG6v24gc+G7kSBwaMO5IGjhu6NwIGtoaSB44bq/cCBo4bqhbmcgY8OhYyDEkeG6oWkgaOG7jWMgdHJvbmcgxJFp4buBdSBraeG7h24gY+G7p2EgVmnhu4d0IE5hbSoqLiANCg0KDQojIENvbGxlY3RpbmcgRGF0YSBmcm9tIFVTIE5ld3MNCg0KVHLGsOG7m2MgaOG6v3QgY2jDum5nIHRhIHRodSB0aOG6rXAgZOG7ryBsaeG7h3UgY+G7p2EgMzAwIMSR4bqhaSBo4buNYyBow6BuZyDEkeG6p3UgbsSDbSAyMDE4IMSRxrDhu6NjIHjhur9wIGjhuqFuZyBi4bufaSBVUyBOZXdzLiBO4bq/dSBi4bqhbiDEkeG7jWMgbsOgbyBraMO0bmcgdGjhuqFvIGzhuqV5IGThu68gbGnhu4d1IHThu6sgV2Vic2l0ZSB0aMOsIGPDsyB0aOG7gyBraMO0bmcgY+G6p24gcXVhbiB0w6JtIG5oaeG7gXUgxJHhur9uIGPDoWMgY2hpIHRp4bq/dCBrxKkgdGh14bqtdCBj4bunYSBSIGNvZGVzIGTGsOG7m2kgxJHDonk6IA0KDQoNCmBgYHtyfQ0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAgIFN0YXRlIDE6IFN0YWdlIDE6IFNjcmFwaW5nIERhdGEgRm9yIFRoZSBCZXN0IDMwMCBHbG9iYWwgVW5pdmVyc2l0aWVzDQojICBmcm9tIGh0dHBzOi8vd3d3LnVzbmV3cy5jb20vZWR1Y2F0aW9uL2Jlc3QtZ2xvYmFsLXVuaXZlcnNpdGllcy9yYW5raW5ncw0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIExvYWQgc29tZSBwYWNrYWdlOiANCg0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShtYWdyaXR0cikNCg0KIyBGdW5jdGlvbiBnZXRzIGFsbCB1bml2ZXJzaXR5IGxpbmtzIGZyb20gYSBwYWdlOiANCg0KZ2V0X2xpbmtfZnJvbV9wYWdlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeCAlPiUgDQogICAgcmVhZF9odG1sKHgpICU+JSANCiAgICBodG1sX25vZGVzKCJhIikgJT4lIA0KICAgIGh0bWxfYXR0cigiaHJlZiIpIC0+IGsNCiAgDQogIGsxIDwtIGtbc3RyX2RldGVjdChrLCAiaHR0cHM6Ly93d3cudXNuZXdzLmNvbS9lZHVjYXRpb24vYmVzdC1nbG9iYWwtdW5pdmVyc2l0aWVzIildDQogIHJldHVybihrMVtzdHJfZGV0ZWN0KGsxLCAiWzAtOSRdIildKQ0KICANCn0NCg0KIyBHZXQgYWxsIGxpbmtzIGZyb20gMzAgcGFnZXM6IA0KYWxsX2xpbmtzIDwtIGxhcHBseShwYXN0ZTAoImh0dHBzOi8vd3d3LnVzbmV3cy5jb20vZWR1Y2F0aW9uL2Jlc3QtZ2xvYmFsLXVuaXZlcnNpdGllcy9yYW5raW5ncz9wYWdlPSIsIDE6MzApLCBnZXRfbGlua19mcm9tX3BhZ2UpICU+JSANCiAgdW5saXN0KCkNCg0KIyBBIGZ1bmN0aW9uIGNvbGxlY3RzIGRhdGEgZm9yIGFuIHVuaXZlcnNpdHk6IA0KDQpnZXRfZGF0YV9mb3JfdW5pdmVyc2l0eSA8LSBmdW5jdGlvbih4KSB7DQogIA0KICB4ICU+JSANCiAgICByZWFkX2h0bWwoKSAtPiBodG1sX2NvbnRlbnQNCiAgDQogIGh0bWxfY29udGVudCAlPiUgDQogICAgaHRtbF9ub2RlcygnLnQtc2xhY2suc2VwIGRpdicpICU+JSANCiAgICBodG1sX3RleHQoKSAlPiUgDQogICAgc3RyX3NxdWlzaCgpIC0+IG15X3Jhd19kYXRhDQogIA0KICBteV9yYXdfZGF0YSAlPiUgDQogICAgbWF0cml4KG5jb2wgPSAyLCBieXJvdyA9IFRSVUUpICU+JSANCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lIA0KICAgIG11dGF0ZV9hbGwoYXMuY2hhcmFjdGVyKSAtPiByYXdfZGYxDQogIA0KIA0KICBodG1sX2NvbnRlbnQgJT4lIA0KICAgIGh0bWxfbm9kZXMoJy50aHVtYi1sZWZ0JykgJT4lIA0KICAgIGh0bWxfdGV4dCgpICU+JSANCiAgICBzdHJfc3F1aXNoKCkgLT4gcmFua19maWVsZA0KICANCiAgcmFua19maWVsZFstYygxOjIpXSAtPiByYW5rX2ZpZWxkDQogIA0KICBodG1sX2NvbnRlbnQgJT4lIA0KICAgIGh0bWxfbm9kZXMoJy50LWxhcmdlIGEnKSAlPiUgDQogICAgaHRtbF90ZXh0KCkgJT4lIA0KICAgIHN0cl9zcXVpc2goKSAtPiBmaWVsZF9uYW1lDQogIA0KICByYXdfZGYyIDwtIGRhdGFfZnJhbWUoZmllbGQgPSBmaWVsZF9uYW1lLCByYW5rID0gcmFua19maWVsZCkNCiAgcmF3X2RmMiAlPiUgDQogICAgc3ByZWFkKHZhbHVlID0gInJhbmsiLCBrZXkgPSAiZmllbGQiKSAtPiByYXdfZGYyX3dpZGUNCiAgDQogIHJhd19kZjEgJT4lICANCiAgICBzcHJlYWQodmFsdWUgPSAiVjEiLCBrZXkgPSAiVjIiKSAtPiByYXdfZGYxX3dpZGUNCiAgDQogICMgR2V0IFVuaSBOYW1lICsgYWRkcmVzczogDQogIA0KICBodG1sX2NvbnRlbnQgJT4lIA0KICAgIGh0bWxfbm9kZXMoJy5oLWJpZ2dlc3QnKSAlPiUgDQogICAgaHRtbF90ZXh0KCkgJT4lIA0KICAgIHN0cl9zcXVpc2goKSAtPiB1bmlfbmFtZQ0KICANCiAgaHRtbF9jb250ZW50ICU+JSANCiAgICBodG1sX25vZGVzKCcuY2xlYXJmaXggLnQtc2xhY2s6bnRoLWNoaWxkKDMpJykgJT4lIA0KICAgIGh0bWxfdGV4dCgpICU+JSANCiAgICBzdHJfc3F1aXNoKCkgLT4gdW5pX2FkZA0KICANCiAgZnVsbF9qb2luKHJhd19kZjFfd2lkZSAlPiUgbXV0YXRlKHVuaV9uYW1lID0gdW5pX25hbWUpLCANCiAgICAgICAgICAgIHJhd19kZjJfd2lkZSAlPiUgbXV0YXRlKHVuaV9uYW1lID0gdW5pX25hbWUsIHVuaV9hZGQgPSB1bmlfYWRkKSwgDQogICAgICAgICAgICBieSA9ICJ1bmlfbmFtZSIpIC0+IGRmX2Zvcl91bml2ZXJzaXR5DQogIA0KICByZXR1cm4oZGZfZm9yX3VuaXZlcnNpdHkpDQogIA0KfQ0KDQojIFVzZSBhYm92ZSBmdW5jdGlvbiBmb3IgY29sbGVjdGluZyBkYXRhIGZvciAzMDAgdW5pdmVyc2l0aWVzOiANCmFsbF9kYXRhX2Zvcl91bmkgPC0gbGFwcGx5KGFsbF9saW5rc1sxOjMwMF0sIGdldF9kYXRhX2Zvcl91bml2ZXJzaXR5KQ0KDQoNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgICBTdGF0ZSAyOiBEYXRhIFByZXByb2Nlc3NpbmcNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgVXNlIFJlZHVjZSgpIGluIGNvbmp1bmN0aW9uIHdpdGggaW50ZXJzZWN0KCkgZm9yIGlkZW50aWZ5aW5nIGNvbW1vbiBjb2x1bW5zOiANCg0KY29tbW9uX2NvbHVtbnMgPC0gUmVkdWNlKGludGVyc2VjdCwgbGFwcGx5KGFsbF9kYXRhX2Zvcl91bmksIG5hbWVzKSkNCg0KIyBGaW5hbCBkYXRhIGZyYW1lOiANCmZpbmFsX2RmIDwtIGRvLmNhbGwoImJpbmRfcm93cyIsIA0KICAgICAgICAgICAgICAgICAgICBsYXBwbHkoYWxsX2RhdGFfZm9yX3VuaSwgZnVuY3Rpb24gKHgpIHt4ICU+JSBzZWxlY3QoY29tbW9uX2NvbHVtbnMpfSkpDQoNCiMgUmVuYW1lIGZvciBjb2x1bW5zIGFuZCBjb252ZXJ0IHNvbWUgbm9uLW51bWVyaWMgb25lcyB0byBudW1lcmljOiANCg0KbmFtZXMoZmluYWxfZGYpIDwtIHN0cl9yZXBsYWNlX2FsbChuYW1lcyhmaW5hbF9kZiksICIgIiwgIl8iKQ0KDQpmaW5hbF9kZiAlPD4lICANCiAgc2VsZWN0KC11bmlfYWRkLCAtQmVzdF9HbG9iYWxfVW5pdmVyc2l0aWVzKSAlPiUgDQogIG11dGF0ZSh1bmlfbmFtZSA9IHN0cl9yZXBsYWNlX2FsbCh1bmlfbmFtZSwgIi0tIiwgIi0iKSAlPiUgYXMuZmFjdG9yKCksIEdsb2JhbF9zY29yZSA9IGFzLmZhY3RvcihHbG9iYWxfc2NvcmUpKSAlPiUgDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGZ1bmN0aW9uKHgpIHt4ICU+JSBzdHJfcmVwbGFjZV9hbGwoIlteMC05XSIsICIiKSAlPiUgYXMubnVtZXJpYygpfSkgJT4lIA0KICBtdXRhdGUoR2xvYmFsX3Njb3JlID0gYXMuY2hhcmFjdGVyKEdsb2JhbF9zY29yZSkgJT4lIGFzLm51bWVyaWMoKSwgdW5pX25hbWUgPSBhcy5jaGFyYWN0ZXIodW5pX25hbWUpKQ0KDQpgYGANCg0KDQojIFJhbmRvbSBGb3Jlc3QgZm9yIFJhbmtpbmcgVW5pdmVyc2l0aWVzDQoNClRyxrDhu5tjIGjhur90IGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5LCB2w60gZOG7pSwgbeG7mXQgc+G7kSBjaOG7iSBz4buRIGPDsyB0xrDGoW5nIHF1YW4gdGh14bqtbiDEkeG6v24gdGjhu6kgaOG6oW5nIGPhu6dhIMSR4bqhaSBo4buNYy4gTeG7mXQgdHJvbmcgY8OhYyBiaeG6v24gc+G7kSDEkcOzIGzDoCAiTnVtYmVyIG9mIFB1YmxpY2F0aW9ucyBUaGF0IEFyZSBBbW9uZyB0aGUgMTAgUGVyY2VudCBNb3N0IENpdGVkIjogDQoNCmBgYHtyLCBmaWcuZnVsbHdpZHRoID0gVFJVRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTJ9DQojIE1ha2UgYSBkcmFmdCBwbG90OiANCmxpYnJhcnkoZXh0cmFmb250KQ0KbGlicmFyeShnZ3JlcGVsKQ0KbXlfZm9udCA8LSAiT2ZmaWNpbmFTYW5zSVRDIg0KDQpteV9ncmF5X3RoZW1lIDwtIGZ1bmN0aW9uKC4uLikgew0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Y1ZjVmMiIsIGNvbG9yID0gTkEpKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxNykpICsNCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTUsIGNvbG91ciA9ICJncmF5NDAiKSkgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxNSwgY29sb3IgPSAiZ3JheTUwIikpICsgDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTMsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gImdyYXk1MCIpKSArIA0KICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxNSwgZmFjZSA9ICJib2xkIiwgY29sb3VyID0gImdyYXkyMCIpKQ0KICANCn0NCg0KZmluYWxfZGYgJT4lIA0KICBnZ3Bsb3QoYWVzKE51bWJlcl9vZl9wdWJsaWNhdGlvbnNfdGhhdF9hcmVfYW1vbmdfdGhlXzEwX3BlcmNlbnRfbW9zdF9jaXRlZCwgR2xvYmFsX3Njb3JlKSkgKyANCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSwgc2l6ZSA9IDUsIGNvbG9yID0gImZpcmVicmljayIpICsgDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gZmluYWxfZGYgJT4lIHNsaWNlKDE6MjApLA0KICAgICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHVuaV9uYW1lKSwgZm9yY2UgPSAxOSwgc2l6ZSA9IDQsIGNvbG9yID0gImdyYXkzNSIsIGZhbWlseSA9IG15X2ZvbnQpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZmlsbCA9ICJvcmFuZ2UiLCBjb2xvciA9ICJncmF5NTAiLCBhbHBoYSA9IDAuMikgKyANCiAgc2NhbGVfeF9sb2cxMCgpICsgDQogIG15X2dyYXlfdGhlbWUoKSArIA0KICBsYWJzKHggPSAiUHVibGljYXRpb24gUmFuayIsIHkgPSAiR2xvYmFsIFNjb3JlIiwNCiAgICAgICB0aXRsZSA9ICJUaGUgUmVsYXRpb25zaGlwIEJldHdlZW4gUmFua2luZyBhbmQgUHVibGljYXRpb24gUmFuayBmb3IgVGhlIDEwIFBlcmNlbnQgTW9zdCBDaXRlZCBSZXNlYXJjaCBQYXBlcnMiLA0KICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBodHRwczovL3d3dy51c25ld3MuY29tIikNCmBgYA0KDQpUxrDGoW5nIHF1YW5nIGdp4buvYSAiTnVtYmVyIG9mIFB1YmxpY2F0aW9ucyBUaGF0IEFyZSBBbW9uZyB0aGUgMTAgUGVyY2VudCBNb3N0IENpdGVkIiB2w6AgdGjhu6kgaOG6oW5nIGPhu6dhIMSR4bqhaSBo4buNYyBsw6AgbeG7mXQgc+G7kSDDom0gbmjGsCB0YSBjw7MgdGjhu4MgdGjhuqV5OiANCg0KYGBge3IsIGZpZy5mdWxsd2lkdGggPSBUUlVFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMn0NCiMgQSBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzOiANCmNvcihmaW5hbF9kZiROdW1iZXJfb2ZfcHVibGljYXRpb25zX3RoYXRfYXJlX2Ftb25nX3RoZV8xMF9wZXJjZW50X21vc3RfY2l0ZWQsIGZpbmFsX2RmJEdsb2JhbF9zY29yZSkNCmBgYA0KDQpOaMOsbiBjw6FpIMSRxrDhu51uZyBk4buRYyB4deG7kW5nIGPDsyB0aOG7gyBjw7Mg4bqlbiB0xrDhu6NuZyBuaOG6p20gcuG6sW5nICJOdW1iZXIgb2YgUHVibGljYXRpb25zIFRoYXQgQXJlIEFtb25nIHRoZSAxMCBQZXJjZW50IE1vc3QgQ2l0ZWQiIHbDoCB0aOG7qSBo4bqhbmcgxJHhuqFpIGjhu41jIHTGsMahbmcgcXVhbiBuZ8aw4bujYy4gTmd1ecOqbiBuaMOibiBsw6AgIk51bWJlciBvZiBQdWJsaWNhdGlvbnMgVGhhdCBBcmUgQW1vbmcgdGhlIDEwIFBlcmNlbnQgTW9zdCBDaXRlZCIgxJHGsOG7o2MgxJFvIGLhurFuZyAqKnRo4bupIGjhuqFuZyoqIGNo4bupIGtow7RuZyBwaOG6o2kgc+G7kSBsxrDhu6NuZyB4deG6pXQgYuG6o24uIE5oxrAgduG6rXkgdGjDrCB0aOG7qSBo4bqhbmcgY8Ogbmcgbmjhu48gKHThu6ljIHh14bqldCBi4bqjbiB0aHXhu5ljIDEwIFBlcmNlbnQgTW9zdCBDaXRlZCBjw6BuZyBuaGnhu4F1KSB0aMOsIHRyxrDhu51uZyBjw6BuZyBjw7MgdGjhu6kgaOG6oW5nIGNhby4gDQoNCkTGsOG7m2kgxJHDonkgY2jDum5nIHRhIGto4bqjbyBzw6F0IHZp4buHYyBz4butIGThu6VuZyBSYW5kb20gRm9yZXN0IChSRikgLSBt4buZdCBjw6FjaCB0aeG6v3AgY+G6rW4gY+G7p2EgTWFjaGluZSBMZWFybmluZyDEkeG7gyB44bq/cCBo4bqhbmcgY8OhYyDEkeG6oWkgaOG7jWMgZOG7sWEgdHLDqm4gdG/DoG4gYuG7mSAxMyBiaeG6v24gc+G7kSDEkeG6p3UgdsOgbyB0aGVvIGPDoWNoIHRp4bq/cCBj4bqtbiBj4bunYSB04bqhcCBjaMOtIFVTIE5ld3MuIA0KDQpD4bulIHRo4buDLCA3MCUgcXVhbiBzw6F0IHRyb25nIHPhu5EgMzAwIMSR4bqhaSBo4buNYyBz4bq9IMSRxrDhu6NjIGzhuqV5IG5n4bqrdSBuaGnDqm4gbMOgbSBk4buvIGxp4buHdSBodeG6pW4gbHV54buHbiBSRiB2w6AgMzAlIGThu68gbGnhu4d1IGPDsm4gbOG6oWkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdGVzdCBraOG6oyBuxINuZyB44bq/cCBo4bqhbmcgY+G7p2EgUkY6IA0KDQpgYGB7ciwgZmlnLmZ1bGx3aWR0aCA9IFRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQ0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyAgU3RhZ2UgMzogVXNlIFJhbmRvbSBGb3Jlc3QgZm9yIHJhbmtpbmcgdW5pdmVyc2l0aWVzDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCiMgU3BsaXQgZGF0YTogDQoNCnNldC5zZWVkKDEyMykNCnRyYWluX2RmIDwtIGZpbmFsX2RmICU+JSBzYW1wbGVfZnJhYygwLjcsIHJlcGxhY2UgPSBGQUxTRSkNCnRlc3RfZGYgPC0gZHBseXI6OnNldGRpZmYoZmluYWxfZGYsIHRyYWluX2RmKQ0KDQojIFNldCBjb25kaXRpb25zIGZvciB0cmFpbmluZyBSRiBtb2RlbDogDQpsaWJyYXJ5KGNhcmV0KQ0Kc2V0LnNlZWQoMSkNCnRyYWluLmNvbnRyb2wgPC0gdHJhaW5Db250cm9sKG1ldGhvZCA9ICJyZXBlYXRlZGN2IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0cyA9IDUpDQoNCiMgRnVuY3Rpb24gZm9yIHRyYWluaW5nIFJGOiANCnJmX3dpdGhfaW5wdXRzIDwtIGZ1bmN0aW9uKHRyYWluX2RmX3NlbGVjdGVkKSB7DQogIA0KICBzZXQuc2VlZCgxKQ0KICBteV9yZiA8LSB0cmFpbihHbG9iYWxfc2NvcmUgfi4sIA0KICAgICAgICAgICAgICAgIGRhdGEgPSB0cmFpbl9kZl9zZWxlY3RlZCAlPiUgc2VsZWN0KC11bmlfbmFtZSksIA0KICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJyZiIsIA0KICAgICAgICAgICAgICAgIG1ldHJpYyA9ICJSTVNFIiwgDQogICAgICAgICAgICAgICAgaW1wb3J0YW5jZSA9IFRSVUUsIA0KICAgICAgICAgICAgICAgIHRyYWluQ29udHJvbCA9IHRyYWluLmNvbnRyb2wpDQogIHJldHVybihteV9yZikNCiAgDQp9DQoNCg0KIyBVc2UgdGhpcyBmdW5jdGlvbjogDQpyZl8xMyA8LSByZl93aXRoX2lucHV0cyh0cmFpbl9kZikNCg0KYGBgDQoNCkNow7puZyB0YSB0aOG6pXkgcuG6sW5nIGvhur90IHF14bqjIHjhur9wIGjhuqFuZyB04burIFJGIGzDoCBy4bqldCBzw6F0IHbhu5tpIHRo4buxYyB04bq/OiANCg0KYGBge3J9DQojIEZ1bmN0aW9uIGZvciBwcmVkaWN0aW5nIHJhbmtpbmdzIGFuZCBjb21wYXJpbmc6IA0KDQpzaG93X3Jlc3VsdHMgPC0gZnVuY3Rpb24obW9kZWwsIHRlc3RfZGZfc2VsZWN0ZWQpIHsNCiAgDQogICMgQ3JlYXRlIGEgZGF0YSBmcmFtZSBmb3IgY29tcGFyaW5nIGFjdHVhbHMgYW5kIHByZWRpY3Rpb25zOiANCiAgZGZfY29tcCA8LSBkYXRhX2ZyYW1lKHVuaV9uYW1lID0gdGVzdF9kZl9zZWxlY3RlZCR1bmlfbmFtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICBBY3R1YWxfc2NvcmVzID0gdGVzdF9kZl9zZWxlY3RlZCRHbG9iYWxfc2NvcmUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgUHJlZGljdGVkX3Njb3JlcyA9IHByZWRpY3QobW9kZWwsIHRlc3RfZGZfc2VsZWN0ZWQgJT4lIHNlbGVjdCgtdW5pX25hbWUpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBFcnJvciA9IEFjdHVhbF9zY29yZXMgLSBQcmVkaWN0ZWRfc2NvcmVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yX3BlcmNlbnQgPSAxMDAqRXJyb3IgLyBBY3R1YWxfc2NvcmVzKSAlPiUgDQogICAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZ1bmN0aW9uKHgpIHtyb3VuZCh4LCAxKX0pDQogIA0KICByZXR1cm4oZGZfY29tcCkNCn0NCg0KIyBGdWN0aW9uIGZvciBzaG93IHJlc3VsdHMgYnkgdGFibGU6IA0KDQpteV90YWJsZSA8LSBmdW5jdGlvbihkZikgew0KICBkZiAlPiUgDQogICAgcmVuYW1lKFVuaXZlcnNpdHkgPSB1bmlfbmFtZSkgJT4lIA0KICAgIHNlbGVjdCgtRXJyb3IpICU+JSANCiAgICBrbml0cjo6a2FibGUoKQ0KfQ0KDQojIEFjdHVhbCBhbmQgUHJlZGljdGVkIFJhbmtpbmdzOiAgDQpkZl9jb21wIDwtIHNob3dfcmVzdWx0cyhyZl8xMywgdGVzdF9kZikgDQpkZl9jb21wICU+JSBteV90YWJsZSgpDQpgYGANCg0KQ2jDum5nIHRhIGPDsyB0aOG7gyDEkcOhbmggZ2nDoSBt4bupYyDEkeG7mSAidMawxqFuZyBo4bujcCIgZ2nhu69hIGvhur90IHF14bqjIGThu7EgYsOhbyB2w6AgdGjhu7FjIHThur8gYuG6sW5nIGPDtG5nIGPhu6UgaMOsbmgg4bqjbmg6IA0KDQpgYGB7ciwgZmlnLmZ1bGx3aWR0aCA9IFRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQ0KIyBBZ3JlZW1lbnQgYmV0d2VlbiBhY3R1YWxzIGFuZCBwcmVkaWN0aW9ucyBieSB1c2luZyBzY2F0dGVyIHBsb3Q6IA0KZGZfY29tcCAlPiUgDQogIGdncGxvdChhZXMoQWN0dWFsX3Njb3JlcywgUHJlZGljdGVkX3Njb3JlcykpICsgDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIGNvbG9yID0gImZpcmVicmljayIsIHNpemUgPSAzKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgbGFicyh4ID0gIkFjdHVhbCBTY29yZXMiLCB5ID0gIlByZWRpY3RlZCBTY29yZXMiLCANCiAgICAgICB0aXRsZSA9ICJGaWd1cmUgMTogQ29uY29yZGFuY2UgYmV0d2VlbiBBY3R1YWxzIGFuZCBQcmVkaWN0aW9ucywgMTMgVmFyaWFibGVzIFVzZWQiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBodHRwczovL3d3dy51c25ld3MuY29tIikgKyANCiAgbXlfZ3JheV90aGVtZSgpDQpgYGANCg0KIyBWYXJpYWJsZSBTZWxlY3Rpb24NCg0KS+G6v3QgcXXhuqMgdHLDqm4gY2jhu4kgcmEgcuG6sW5nIG7hur91IHPhu60gZOG7pW5nIHRvw6BuIGLhu5kgMTMgYmnhur9uIHPhu5EgdGjDrCBr4bq/dCBxdeG6oyBk4buxIGLDoW8gY+G7p2EgUkYgbMOgIHLhuqV0IHThu5F0LiBUdXkgbmhpw6puIG5oxrAgxJHDoyBwaMOibiB0w61jaCwgbuG6v3Ugc+G7rSBk4bulbmcgY+G6oyAxMyBiaeG6v24gc+G7kSBuw6B5IG5oxrAgY8OhY2ggbMOgbSBj4bunYSBUaGUgVVMgTmV3cyDEkeG7gyB44bq/cCBo4bqhbmcgxJHhuqFpIGjhu41jIGzDoCBraMO0bmcgdGjhu4MgdHJvbmcgxJFp4buBdSBraeG7h24gY+G7p2EgVmnhu4d0IE5hbS4gIFbDrCBuaGnhu4F1IGJp4bq/biBz4buRIHRyb25nIGRhbmggc8OhY2ggbsOgeSBsw6AgcuG6pXQga2jDsyB0w61uaCB0b8OhbiBob+G6t2MgY8OzIHRo4buDIHTDrW5oIHRvw6FuIG5oxrBuZyB24bubaSBjaGkgcGjDrSBy4bqldCBs4bubbiB24buBIHRo4budaSBnaWFuLg0KDQpUcsaw4bubYyBo4bq/dCB0YSB4ZW0gbOG6oWkgZGFuaCBzw6FjaCAxMyBiaeG6v24gc+G7kSBuw6B5IGPDuW5nIHRy4buNbmcgc+G7kSB0xrDGoW5nIOG7qW5nIGPhu6dhIGNow7puZzogDQoNCmBgYHtyfQ0KIyBWYXJpYWJsZXMgdXNlZCBieSBVUyBOZXdzOiANCg0KcmVhZF9odG1sKCJodHRwczovL3d3dy51c25ld3MuY29tL2VkdWNhdGlvbi9iZXN0LWdsb2JhbC11bml2ZXJzaXRpZXMvYXJ0aWNsZXMvbWV0aG9kb2xvZ3kiKSAlPiUgDQogIGh0bWxfdGFibGUoKSAlPiUgDQogIC5bWzFdXSAlPiUgDQogIHNsaWNlKC0xKSAlPiUgDQogIHJlbmFtZShJbmRpY2F0b3IgPSBYMSwgV2VpZ2h0ID0gWDIpIC0+IHVzX2ZhY3RvcnMNCg0KdXNfZmFjdG9ycyAlPiUgDQogIG11dGF0ZShXZWlnaHQgPSBzdHJfcmVwbGFjZV9hbGwoV2VpZ2h0LCAiW14wLTldIiwgIiIpICU+JSBhcy5udW1lcmljKCkgLyAxMCkgJT4lIA0KICBtdXRhdGUoV2VpZ2h0ID0gY2FzZV93aGVuKFdlaWdodCAlaW4lICBjKDAuNSwgMSkgfiAxMCpXZWlnaHQgLCBUUlVFIH4gV2VpZ2h0KSkgJT4lIA0KICBhcnJhbmdlKC1XZWlnaHQpICU+JSANCiAgbXV0YXRlKFdlaWdodCA9IHBhc3RlMChXZWlnaHQsICIlIikpICU+JSANCiAga25pdHI6OmthYmxlKGNhcHRpb24gPSAiVGFiZWwgMTogSW5kaWNhdG9ycyB0aGF0IEFmZmVjdCBVbml2ZXJzaXR5IFJhbmtpbmcgYnkgRGVjcmVhc2luZyBJbXBvcnRhbmNlIHByb3Bvc2VkIGJ5IFVTIE5ld3MiKQ0KYGBgDQoNCkNow7puZyB0YSBzbyBzw6FuaCAidHLhu41uZyBz4buRIiBj4bunYSBjw6FjIGJp4bq/biBz4buRIG7DoHkgdGhlbyB0aHXhuq10IHRvw6FuIFJGOiANCg0KDQpgYGB7cn0NCnZhckltcChyZl8xMykgJT4lIA0KICAuW1sxXV0gJT4lIA0KICBtdXRhdGUoSW5kaWNhdG9yID0gcm93Lm5hbWVzKC4pICU+JSBzdHJfcmVwbGFjZV9hbGwoIl8iLCAiICIpKSAlPiUgDQogIHNlbGVjdChJbmRpY2F0b3IsIE92ZXJhbGwpICU+JSANCiAgYXJyYW5nZSgtT3ZlcmFsbCkgLT4gdmFyX2ltcG9ydGFuY2VzDQoNCnZhcl9pbXBvcnRhbmNlcyAlPiUgDQogIGtuaXRyOjprYWJsZShjYXB0aW9uID0gIlRhYmVsIDI6IEluZGljYXRvcnMgdGhhdCBBZmZlY3QgVW5pdmVyc2l0eSBSYW5raW5nIGJ5IERlY3JlYXNpbmcgSW1wb3J0YW5jZSBiYXNlZCBvbiBSRiBNb2RlbCIpDQpgYGANCg0KDQpL4bq/dCBxdeG6oyBuw6B5IGNo4buJIHJhIHLhurFuZyBjw6FjaCB0cuG7jW5nIHPhu5EgY+G7p2EgY8OhYyBiaeG6v24gLSBoaeG7g3UgdGhlbyBuZ2jEqWEgbMOgIG3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGPhu6dhIGPDoWMgYmnhur9uIHPhu5EgbsOgeSDEkeG6v24ga2jhuqMgbsSDbmcgeOG6v3AgaOG6oW5nIMSR4bqhaSBo4buNYyBsw6AgY8OzIGNow7p0IGtow6FjIGJp4buHdC4gDQoNCkhp4buHbiB04bqhaSwgduG7m2kgaGnhu4N1IGJp4bq/dCBo4bqhbiBjaOG6vyBj4bunYSBuZ8aw4budaSB2aeG6v3QgYsOgaSBuw6B5IHRow6wgY8OzIHRo4buDIGPDoWMgYmnhur9uIHPhu5Egc2F1IGzDoCBraMOzIGPDsyB0aOG7gyB0w61uaCB0b8OhbiAvIHRodSB0aOG6rXAgaG/hurdjIGNow7puZyAtIG7hur91IMSRxrDhu6NjIGzhu7FhIGNo4buNbiBjw7MgdGjhu4MgbMOgIGPDoWMgYmnhur9uIGtow7RuZyBwaOG6o24gw6FuaCB0aOG7sWMgdOG6vyB0aOG7qSBo4bqhbmcgdHJvbmcgYuG7kWkgY+G6o25oIFZp4buHdCBOYW06IA0KDQoxLiBHbG9iYWwgcmVzZWFyY2ggcmVwdXRhdGlvbi4gDQoyLiBOb3JtYWxpemVkIGNpdGF0aW9uIGltcGFjdC4gDQozLiBSZWdpb25hbCByZXNlYXJjaCByZXB1dGF0aW9uLiANCjQuIEJvb2tzLiANCjUuIEludGVybmF0aW9uYWwgY29sbGFib3JhdGlvbi4gDQo2LiBQZXJjZW50YWdlIG9mIGhpZ2hseSBjaXRlZCBwYXBlcnMgdGhhdCBhcmUgYW1vbmcgdGhlIHRvcCAxIHBlcmNlbnQgbW9zdCBjaXRlZC4gDQoNCkNo4bqzbmcgaOG6oW4sIHRpw6p1IGNow60gIkJvb2siLiBOaGnhu4F1IMSR4bqhaSBo4buNYyDhu58gVk4gZ+G6p24gbmjGsCBraMO0bmcgeHXhuqV0IGLhuqNuIHPDoWNoLCBraMO0bmcgY8OzIG5ow6AgaW4gcmnDqm5nLiBN4buZdCBz4buRIMSR4bqhaSBo4buNYyB0aMOsIHh14bqldCBi4bqjbiBy4bqldCBuaGnhu4F1IHPDoWNoIG5oxrBuZyB0cm9uZyBz4buRIMSRw7MgbeG7mXQgbMaw4bujbmcgbOG7m24gbMOgIHPDoWNoIGThu4tjaCBj4bunYSBjw6FjIHTDoWMgZ2nhuqMgY8OzIHV5IHTDrW4uIE3hu5l0IHPhu5EgdHLGsOG7nW5nIHRow6wgbeG7mXQgc+G7kSB0w6FjIGdp4bqjIGfhu41pIGzDoCBjw7Mgc8OhY2ggbmjGsG5nIGNow7puZyBjw7MgdGjhu4MgxJHGsOG7o2MgY29weSBsw6AgY2jDrW5oIHThu6sgbeG7mXQgxJHhu5NuZyBuZ2hp4buHcCAobuG6oW4gxJHhuqFvIHPDoWNoKSB04burIG7GsOG7m2Mgbmdvw6BpLiBDw7MgdGjhu4MgbMOgIG5ndXnDqm4gY+G6oyBjdeG7kW4gc8OhY2ggaG/hurdjIGPhuqMgbeG7mXQgY2jGsMahbmcgc8OhY2guIA0KDQpW4bubaSB0acOqdSBjaMOtICJQZXJjZW50YWdlIG9mIGhpZ2hseSBjaXRlZCBwYXBlcnMgdGhhdCBhcmUgYW1vbmcgdGhlIHRvcCAxIHBlcmNlbnQgbW9zdCBjaXRlZCIgdGjDrCBn4bqnbiBuaMawIGtow7RuZyB0aOG7gyBjw7MgduG7m2kgY8OhYyDEkeG6oWkgaOG7jWMgVmnhu4d0IE5hbSBuw6puIG7hur91IGzhuqV5IGJp4bq/biBuw6B5IHRow6wgY2jDum5nIHRhIHPhur0gY8OzIG3hu5l0IGJp4bq/biBtw6AgZ2nhu5tpIHRo4buRbmcga8OqIGfhu41pIGzDoCBOZWFyLVplcm8gVmFyaWFuY2UgVmFyaWFibGUuIA0KDQpEbyB24bqteSwgduG7m2kgxJFp4buBdSBraeG7h24gVmnhu4d0IE5hbSBjaMO6bmcgdGEgY8OzIHRo4buDIGxv4bqhaSBi4buPIGPDoWMgYmnhur9uIG7DoHkgcmEga2jhu49pIG3DtCBow6xuaC4gQ2jDum5nIHRhIHhlbSBr4bq/dCBxdeG6oyBk4buxIGLDoW8gY+G7p2EgUkYgcmEgc2FvIGtoaSBjw6FjIGJp4bq/biDEkeG6p3UgdsOgbyDEkcaw4bujYyBz4butIGThu6VuZyBjaOG7iSBjw7JuIDEzIC0gNiA9IDc6IA0KDQpgYGB7cn0NCg0KIyBDw6FjIGJp4bq/biDEkcaw4bujYyBsb+G6oWkgYuG7jzogDQpyZW1vdmVfdmFyaWFibGVzIDwtIGMoIkdsb2JhbCByZXNlYXJjaCByZXB1dGF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgIk5vcm1hbGl6ZWQgY2l0YXRpb24gaW1wYWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgIlJlZ2lvbmFsIHJlc2VhcmNoIHJlcHV0YXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAiQm9va3MiLCANCiAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYXRpb25hbCBjb2xsYWJvcmF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgIlBlcmNlbnRhZ2Ugb2YgaGlnaGx5IGNpdGVkIHBhcGVycyB0aGF0IGFyZSBhbW9uZyB0aGUgdG9wIDEgcGVyY2VudCBtb3N0IGNpdGVkIikNCnJlbW92ZV92YXJpYWJsZXMgJTw+JSBzdHJfcmVwbGFjZV9hbGwoIiAiLCAiXyIpDQoNCiMgROG7ryBsaeG7h3UgY8OybiBs4bqhaToNCnRyYWluX2RmXzcgPC0gdHJhaW5fZGYgJT4lIHNlbGVjdCgtcmVtb3ZlX3ZhcmlhYmxlcykNCnRlc3RfZGZfNyA8LSB0ZXN0X2RmICU+JSBzZWxlY3QoLXJlbW92ZV92YXJpYWJsZXMpDQoNCiMgSHXhuqVuIGx1eeG7h24gbOG6oWkgUkYgbcOgIGtow7RuZyBz4butIGThu6VuZyA2IGJp4bq/biBz4buRIG7DoHk6IA0KcmZfNyA8LSByZl93aXRoX2lucHV0cyh0cmFpbl9kZl83KQ0KYGBgDQoNCiBDaOG7iSBz4butIGThu6VuZyA3IGJp4bq/biBz4buRIG7DoHkgdGjDrCBr4bq/dCBxdeG6oyB44bq/cCBo4bqhbmcgxJHhuqFpIGjhu41jIGThu7EgYsOhbyB04burIG3DtCBow6xuaCBSRiBzbyB24bubaSB0aOG7qSBo4bqhbmcgdGjhu7FjIHThur8gbmjGsCBzYXU6IA0KDQpgYGB7ciwgZmlnLmZ1bGx3aWR0aCA9IFRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQ0KDQojIEFjdHVhbCBhbmQgUHJlZGljdGVkIFJhbmtpbmdzOiAgDQpkZl9jb21wNyA8LSBzaG93X3Jlc3VsdHMocmZfNywgdGVzdF9kZl83KSANCmRmX2NvbXA3ICU+JSBteV90YWJsZSgpDQoNCmBgYA0KDQpDaMO6bmcgdGEgY8OzIHRo4buDIHPhu60gZOG7pW5nIGPDtG5nIGPhu6UgaMOsbmgg4bqjbmggxJHhu4MgxJHDoW5oIGdpw6E6IA0KDQpgYGB7ciwgZmlnLmZ1bGx3aWR0aCA9IFRSVUUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQ0KZGZfY29tcDcgJT4lIA0KICBnZ3Bsb3QoYWVzKEFjdHVhbF9zY29yZXMsIFByZWRpY3RlZF9zY29yZXMpKSArIA0KICBnZW9tX3BvaW50KGFscGhhID0gMC41LCBjb2xvciA9ICJmaXJlYnJpY2siLCBzaXplID0gMykgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIGxhYnMoeCA9ICJBY3R1YWwgU2NvcmVzIiwgeSA9ICJQcmVkaWN0ZWQgU2NvcmVzIiwgDQogICAgICAgdGl0bGUgPSAiRmlndXJlIDI6IENvbmNvcmRhbmNlIGJldHdlZW4gQWN0dWFscyBhbmQgUHJlZGljdGlvbnMsIDcgVmFyaWFibGVzIFVzZWQiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBodHRwczovL3d3dy51c25ld3MuY29tIikgKyANCiAgbXlfZ3JheV90aGVtZSgpDQpgYGANCg0KVMawxqFuZyBxdWFuIGdp4buvYSBnacOhIHRy4buLIHRo4buxYyB04bq/IHbDoCBk4buxIGLDoW8gKG3hu5l0IHRoxrDhu5tjIMSRbyB0aOG7gyBoaeG7h24gbeG7qWMgxJHhu5kgY2jDrW5oIHjDoWMgY+G7p2EgbcO0IGjDrG5oIGtoaSBk4buxIGLDoW8gdGjhu6kgaOG6oW5nIMSR4bqhaSBo4buNYykgZ2nhu69hIG3DtCBow6xuaCBz4butIGThu6VuZyAxMyBiaeG6v24gc28gduG7m2kgbcO0IGjDrG5oIHPhu60gZOG7pW5nIGNo4buJIDcgYmnhur9uIHPhu5EgbMOgIGNow6puaCBs4buHY2gga2jDtG5nIMSRw6FuZyBr4buDIG5oxrAgdGEgY8OzIHRo4buDIHRo4bqleTogDQoNCmBgYHtyfQ0KY29yKGRmX2NvbXAkQWN0dWFsX3Njb3JlcywgZGZfY29tcCRQcmVkaWN0ZWRfc2NvcmVzKQ0KY29yKGRmX2NvbXA3JEFjdHVhbF9zY29yZXMsIGRmX2NvbXA3JFByZWRpY3RlZF9zY29yZXMpDQpgYGANCg0KIyBTb21lIEtleSBDb25jbHVzaW9ucyBhbmQgUmVjb21tZW5kYXRpb25zDQoNClThu6sgY8OhYyBr4bq/dCBxdeG6oyB0csOqbiBjaMO6bmcgdGEgcsO6dCByYSBjw6FjIGvhur90IGx14bqtbiBzYXU6IA0KDQoxLiBWaeG7h2Mgc+G7rSBk4bulbmcgY2jhu4kgaMahbiA1MCUgYmnhur9uIHPhu5Egc28gduG7m2kgc+G7rSBk4bulbmcgdG/DoG4gYuG7mSBjw6FjIGJp4bq/biAodGnDqnUgY2jDrSkgbmjGsCBj4bunYSB04bqhcCBjaMOtIFVTIE5ld3MgxJHhu4EgeHXhuqV0IGtow7RuZyBsw6BtIGdp4bqjbSDEkcOhbmcga+G7gyBraOG6oyBuxINuZyB44bq/cCBo4bqhbmcgxJHhuqFpIGjhu41jLiDEkGnhu4F1IG7DoHkgaMOgbSDDvSBy4bqxbmcgeOG6v3AgaOG6oW5nIGPDoWMgxJHhuqFpIGjhu41jIHRyb25nIGLhu5FpIGPhuqNuaCBWaeG7h3QgTmFtIGPDsyB0aOG7gyBjaOG7iSBj4bqnbiBz4butIGThu6VuZyA3IChob+G6t2Mgw610IGjGoW4pIGPDoWMgYmnhur9uIHPhu5Egc28gduG7m2kgMTMgYmnhur9uIG7hur91IMOhcCBk4bulbmcgbmd1ecOqbiBjw6FjaCB0aeG6v3AgY+G6rW4gY+G7p2EgVVMgTmV3cyBtw6AgduG6q24gY8OzIHRo4buDIMSR4bqjbSBi4bqjbyB0w61jaCBjaMOtbmggeMOhYyBraGkgeOG6v3AgaOG6oW5nLiANCg0KMi4gQ8OhY2ggdGjhu6ljIGfDoW4gdHLhu41uZyBz4buRIGNobyBjw6FjIGJp4bq/biBraGkgxJHDoW5oIGdpw6EgdGjhu6kgaOG6oW5nIGPhu6dhIMSR4bqhaSBo4buNYyBj4bunYSBSRiBzbyB24bubaSB0cuG7jW5nIHPhu5EgxJHGsOG7o2Mgc+G7rSBk4bulbmcgYuG7n2kgVVMgTmV3cyAoY8OzIGzhur0gY8OhYyBjaHV5w6puIGdpYSBnacOhbyBk4bulYyB2w6AgcXXhuqNuIGzDrSDEkeG6oWkgaOG7jWMgxJHhu4EgeHXhuqV0IGPDoWMgdHLhu41uZyBz4buRIG7DoHkgY2hvIFVTIE5ld3MpIGzDoCBraMOhYyBiaeG7h3QgbmjGsG5nIGvhur90IHF14bqjIGThu7EgYsOhbyB24bubaSB0cuG7jW5nIHPhu5EgdGhlbyBraeG7g3UgY+G7p2EgUkYgbOG6oWkgcuG6pXQgY2jDrW5oIGtoaSBk4buxIGLDoW8gdGjhu6kgaOG6oW5nLiBDaOG6r2MgY2jhuq9uIHZp4buHYyBnw6FuIGPDoWMgdHLhu41uZyBz4buRIGNobyBjw6FjIGJp4bq/biBz4butIGThu6VuZyBsdcO0biBsw6AgduG6pW4gxJHhu4EgZ8OieSB0cmFuaCBjw6NpIGdp4buvYSBjw6FjIGNodXnDqm4gZ2lhIHbDoCBkbyDEkcOzIHRy4buNbmcgc+G7kSBj4bunYSBjw6FjIGJp4bq/biBn4bujaSDDvSBi4bufaSBSRiBuw6puIMSRxrDhu6NjIHRoYW0ga2jhuqNvIHbDoCBz4butIGThu6VuZy4gDQoNCg0KDQoNCg0KDQo=