1 Project proposal

The purpose of this project is to demonstrate my R skills in data manipulation and structuring, as well as an analysis of the presented data. With that in mind, I’ll leave most of the code exposed, but not all so it doesn’t get too repetitive. I must point out that although present in some tables, the “yellow or indigenous” ethnicity will not be presented in the final report, since there are a large number of outliers and that end up biasing the analysis.

During the analysis, I will make several population predictions, as not all tables present data from 2019. For population prediction, I will base myself on the arithmetic method present in the book by Marcos Von Sperling (Von Sperling 2014).

Arithmetic Method

This method assumes a constant growth rate for the following years, based on known data, for example, the population of the last census. Mathematically, it can be represented as follows:

\[\frac{dP}{dt} = k_a\]

where dP/dt represents the population change (P) per unit time (t), and ka is a constant. Considering that P1 is the population of the penultimate census (year t1) and P2, the population of the last census (year t2), we have:

\[\int_{P_2}^{P_1} = k_a\int_{t_1}^{t_2}dt\]

Integrating between the defined limits, we have:

\[P_2-P_1 = k_a(t_2-t_1)\] \[k_a = \frac{P_2-P_1}{t_2-t_1}\]

Using the equation, we arrive at the general expression of the arithmetic method:

\[P=P_2 + k_n(t-t_2)\]

where t represents the year of the projection.

This method admits that the population varies linearly with time and can be used for population forecasting for a short period, from 1 to 5 years. For a forecast for a very long period, the discrepancy with historical reality becomes accentuated, since growth is an unlimited assumption.

To apply this arithmetic method formula, I will use this function below.

formula <- function(P2, t2, P0, t0, t) {
  Ka <- (P2 - P0) / (t2 - t0)
  Pt <- P2 + Ka * (t - t2)
  return(Pt)
}

1.1 Preparing the R Environment

First of all, I’m going to load the packages that I’m going to use to manipulate the data, do the analysis and generate this report.

knitr::opts_chunk$set(cache=TRUE, warning=FALSE, message=FALSE)
library(foreign)
library(lmtest)
library(readxl)
library(writexl)
library(stringi)
library(purrr)
library(tidyverse)
library(knitr)
library(markdown)
library(kableExtra)
library(htmltools)
library(rstatix)
library(emmeans)

2 The INFOPEN

“Infopen is a statistical information system of the Brazilian penitentiary system. The system, updated by the managers of the establishments since 2004, summarizes information about penal establishments and the prison population. In 2014, DEPEN reformulated the methodology used, with a view to modernizing the collection instrument and expand the range of information collected. The treatment of the data allowed a broad diagnosis of the studied reality, but which did not exhaust, in any way, all the possibilities of analysis.”

2.1 Loading Initial Data Step by Step

First I’m going to create a dictionary of states that I’m going to use. I did this in order to standardize the names of the states, as some tables show the full names, others show only the abbreviations of the states.

head(state_dict, 20)
##                Acre             Alagoas               Amapá            Amazonas 
##                "AC"                "AL"                "AP"                "AM" 
##               Bahia               Ceará    Distrito Federal      Espírito Santo 
##                "BA"                "CE"                "DF"                "ES" 
##               Goiás            Maranhão         Mato Grosso  Mato Grosso do Sul 
##                "GO"                "MA"                "MT"                "MS" 
##        Minas Gerais                Pará             Paraíba              Paraná 
##                "MG"                "PA"                "PB"                "PR" 
##          Pernambuco               Piauí      Rio de Janeiro Rio Grande do Norte 
##                "PE"                "PI"                "RJ"                "RN"

Here is the list of columns that I will extract from the INFOPEN tables. I created this list using manipulation with Excel.

Loop through INFOPEN table files and list their names

Match directory to file name

infopen_files <- str_c("INFOPEN/tabelas excel/",infopen_file_name)

Name each vector element

names(infopen_files) <- gsub("\\.xlsx$", "", infopen_file_name)

Apply the read_excel function to each vector element, thus importing all files at once

infopen<- map_df(.x = infopen_files, .f = read_excel, .id = "data") %>%
   select("state" = "UF", date = data, all_of(columns))

2.2 Recognizing the Table

INFOPEN tables present panel data, where each individual is represented more than once.

Each INFOPEN table contains more than 1300 columns and approximately 1500 rows.

jun_2017 <- read_excel("INFOPEN/tabelas excel/jun 2017.xlsx")

Number of columns: 1332 Number of rows: 1514

After analyzing each table, I decided to filter only the most interesting columns for my analysis and the result was a table with 8932 rows and 328 columns.

2.3 Starting to manipulate the dataframe

After grouping all the tables and choosing only the columns that I’m going to use, the next step will be to transform the format from wide to long. Long format facilitates some manipulations, and wide format others. In the course of this analysis I will use both formats.

infopen_2_long_format <-infopen%>%
   gather(variable , quantity, - c(state,date)) %>%
   drop_na()

I will summarize the values so that the repeated lines are removed and the total of each variable is obtained

infopen_3_summary <- infopen_2_long_format %>%
   group_by(state, date, variable) %>%
   mutate(date = gsub("dez", "dec", date))%>% ## I needed to use "dec" so that the program understood that it referred to the month of December
   summarise(prisoners = sum(quantity, na.rm = TRUE)) %>%
   merge(state_region, by = 'state', all.x = TRUE)

2.4 Create the Variables I’m Going to Work With

After summarizing the data and removing the ‘NAs’, it’s time to separate the data into columns that I will use.

infopen_4 <- infopen_3_summary %>%
   rowwise() %>% ## defines the scope of the following operations, to be worked by row and not columns
   filter(!str_detect(variable, "not_informed|not_informed|no information"))%>% ## remove variables that will not be needed
   mutate( ## here I start to define the columns that I will use. I will extract the new columns from the variable column
     gender = case_when(
       str_detect(variable, "(female)") ~ "female",
       str_detect(variable, "(male)") ~ "male",
       TRUE ~ NA_character_),
     variable = gsub("_male|_female|", "", variable), ## at this point I need to remove the gender string to avoid conflicts later in the code
     ethnicity = ifelse(grepl("ethnicity_", variable),
                    sub("ethnicity_", "", variable), NA),
     ethnicity = if_else(ethnicity == "white", "white",
                     if_else(ethnicity %in% c("black", "brown"), "black or brown",
                             ifelse(ethnicity %in% c('yellow','indigenous'), 'yellow or indigenous',NA))),
     level_of_education = ifelse(grepl("level_of_education_", variable),
                                sub("level_of_education_","", variable), NA),
     wage = ifelse(grepl("wage_", variable),
                          sub("wage_","",variable),NA),
     age_range = ifelse(grepl("age_range_", variable),
                           sub("age_range_","",variable),NA))%>%
   mutate_at(vars(-prisoners), as.factor) %>%
   ungroup() %>%
   select("date","region","state", "gender","ethnicity",
          "level_of_education", "age_range", "wage","prisoners") %>% ## I used select() only because I would like to view the columns in that order
   filter(!is.na(gender))

2.5 Generation of the Tables

Regarding the quantity of prisoners, this is the most reliable table because not all detention centers are able to collect all data. So, with the other tables I will work only with the percentage of prisoners in relation to the total and extract the corresponding value from here.

2.5.1 Table with the total prison population

prison_population <-infopen_3_summary %>%
   filter(str_detect(variable, "prison_population"))%>%
   rowwise() %>%
   mutate(
     gender = case_when(
       str_detect(variable, "female") ~ "female",
       str_detect(variable, "male") ~ "male",
       TRUE ~ NA_character_)) %>%
   select(region, state, date, gender, prisoners) %>%
   drop_na() %>%
   ungroup()

prison_population_2_summary <- prison_population %>%
   filter(grepl("^dec", date) | date == "jun 2019") %>% ## after some analysis I decided to use only 1 reference per year, instead of an average of the values.
   group_by(region, state, date) %>%
   mutate(year = str_replace(date, "\\D*(\\d{4}).*", "\\1")) %>% ## removing the first 4 characters from the values in column 'year'
   ungroup() %>%
   group_by(year, region, state) %>%
   summarise(total_prisoners = sum(prisoners)) %>%
   ungroup() %>%
   select(year, region, state, total_prisoners)

I’ll just leave this example of code, because for the creation of the other tables, there is not much difference in relation to the process of this one. What can change are some punctual adjustments, but nothing that deserves mention.

infopen_age_range <-infopen_4 %>%
  select(region,state,date,gender, age_range, prisoners) %>% ## select columns
  mutate(age_range = gsub("_", " ", age_range)) %>% ## remove the "_" to make it easier to read and export to csv
  mutate_at(vars(-prisoners), as.factor) %>% ## convert all columns to factor -prisoners
  drop_na() ## remove NA

infopen_age_range_2_percentage <- infopen_age_range %>%
  filter(grepl("^dec", date) | date == "jun 2019") %>%
  group_by(region, state, date) %>%
  mutate(year = str_replace(date, "\\D*(\\d{4}).*", "\\1"),
         total_prisoners = sum(prisoners, na.rm = TRUE), # total sum of prisoners by region, state, gender and year
         percentage_prisoners = round(((prisoners / total_prisoners) * 100),2),
         state = as.factor(state),
         year = as.character(year)) %>%
  ungroup() %>%
  select(year, region, state, gender, age_range, percentage_prisoners)

infopen_age_range_3_final <- infopen_age_range_2_percentage %>%
  left_join(prison_population_2_summary, by = c("year", "region", "state")) %>%
  mutate(prisoners = round(((percentage_prisoners / 100) * total_prisoners), 0)) %>%
  select(year, region, state, gender, age_range, prisoners)

infopen_age_range_4 <- infopen_age_range_3_final %>%
  group_by(year, age_range) %>%
  summarise(prisoners = sum(prisoners)) %>%
  mutate(year = as.numeric(year))

2.6 INFOPEN Data Visualization

Here are the INFOPEN tables that I will be using. Note that I combined several tables, rearranged the columns and extracted 5 different tables, with panel data.

2.6.1 Prison population

region state date gender prisoners
Southeast SP jun 2019 male 134002
Southeast SP dec 2018 male 129255
Southeast SP jun 2018 male 124912
Southeast SP dec 2017 male 121808
Southeast SP jun 2017 male 120332
Southeast SP dec 2016 male 119372
Southeast SP dec 2016 male 56185
Southeast SP jun 2017 male 54000
Southeast SP dec 2017 male 51915
Southeast SP jun 2018 male 51270

2.6.2 Ethnicity

year region state ethnicity prisoners
2019 Southeast SP black or brown 136560
2018 Southeast SP black or brown 132756
2016 Southeast SP black or brown 129392
2017 Southeast SP black or brown 128026
2016 Southeast SP white 100415
2019 Southeast SP white 96821
2017 Southeast SP white 95929
2018 Southeast SP white 94901
2018 Southeast MG black or brown 57401
2019 Southeast MG black or brown 56458

2.6.3 Education Level

year region state gender level_of_education prisoners
2019 Southeast SP male elementary school incomplete 99346
2017 Southeast SP male elementary school incomplete 98797
2018 Southeast SP male elementary school incomplete 97082
2016 Southeast SP male elementary school incomplete 96434
2019 Southeast SP male high school incomplete 47265
2018 Southeast SP male high school incomplete 46693
2017 Southeast SP male high school incomplete 43707
2016 Southeast SP male high school incomplete 42049
2018 Southeast MG male elementary school incomplete 41789
2019 Southeast MG male elementary school incomplete 40967

2.6.4 Age range

year age_range prisoners
2016 18 to 24 years old 214624
2018 18 to 24 years old 206467
2019 18 to 24 years old 204917
2017 18 to 24 years old 202629
2019 25 to 29 years old 178737
2018 25 to 29 years old 173891
2016 25 to 29 years old 169540
2017 25 to 29 years old 168851
2019 35 to 45 years old 157032
2018 35 to 45 years old 145968

2.6.5 Pay range

year region state wage prisoners
2016 Southeast SP between 3/4 and 1 monthly minimum wage 230152
2019 Southeast SP less than 3/4 of the monthly minimum wage 155026
2018 Southeast SP less than 3/4 of the monthly minimum wage 106953
2018 Southeast SP does not receive 94809
2017 Southeast RJ between 3/4 and 1 monthly minimum wage 51132
2019 Southeast RJ does not receive 49260
2019 Southeast SP between 3/4 and 1 monthly minimum wage 47639
2019 Southeast MG does not receive 46006
2016 Southeast RJ between 3/4 and 1 monthly minimum wage 38273
2016 Southeast MG does not receive 37727

3 Table IBGE Level of Education

The purpose of this analysis is to compare data from the prison population with data from the IBGE, and make a correlation between them. The data I will use here are part of the National Household Sample Survey Continues (PNADC) and can be found on the IBGE.

Here I start working on the second table that will be used. This single table has several sheets that I will extract and manipulate the data. The table “PNAD_Continua_2018_Educacao.xls” has data regarding the education of the population. There are several pieces of information, including: educational level by region, gender and ethnicity. This table also presents panel data. Yellow and Indigenous are included in the Total

I’m going to skip the table import part and go directly to the dataframe.

Visualization of the PNAD Table
indicator territorial_level territorial_opening variable_1 category_1 variable_2 category_2 2016 2017 2018
População (mil pessoas) País Brasil Sexo Total Grupos de idade Total 204325.470 205999.691 207651.621
População (mil pessoas) País Brasil Sexo Total Grupos de idade 0 a 3 anos 10223.229 10141.908 10171.730
População (mil pessoas) País Brasil Sexo Total Grupos de idade 4 e 5 anos 5262.563 5268.945 5350.024
População (mil pessoas) País Brasil Sexo Total Grupos de idade 6 a 9 anos 11100.370 10962.806 10947.352
População (mil pessoas) País Brasil Sexo Total Grupos de idade 10 a 14 anos 15445.672 15363.810 15023.146
População (mil pessoas) País Brasil Sexo Total Grupos de idade 15 a 17 anos 10617.588 10426.076 9752.471
População (mil pessoas) País Brasil Sexo Total Grupos de idade 18 a 24 anos 22234.284 22727.774 22703.814
População (mil pessoas) País Brasil Sexo Total Grupos de idade 25 a 29 anos 15306.030 15138.452 14890.647
População (mil pessoas) País Brasil Sexo Total Grupos de idade 30 a 39 anos 32134.993 32462.937 32597.356
População (mil pessoas) País Brasil Sexo Total Grupos de idade 40 a 59 anos 52417.780 53172.422 54100.608

This dataframe gathers data from all tabs of the “PNAD_Continua_2018_Educacao.xls” file, there is still a lot of manipulation to be done.

3.1 Data Manipulation

First, I’m going to transpose the data so that I can transform it into long format, just like in the previous model, with the INFOPEN table.

pnad_2_long_format <- pivot_longer(pnad, 8:10,
                                      names_to="year",
                                      values_to = "value",
                                      values_drop_na = TRUE)

I’ll multiply the value in the ‘value’ column by 1000 if the ‘indicator’ column contains the string ‘(mil pessoas)’‘(thousand people)’ and then remove it. Then I’ll create a ‘region’ variable to store the region of each state.

pnad_3_with_regions <- pnad_2_long_format %>%
   mutate(value = ifelse(grepl("(mil pessoas)", indicator), value * 1000, value),
          indicator = gsub("\\s*\\(mil pessoas\\)", "", indicator),
          region = case_when(territorial_opening %in% c("Acre", "Amazonas", "Amapá", "Pará", "Rondônia", "Roraima", "Tocantins") ~ "North",
                             territorial_opening %in% c("Maranhão", "Piauí", "Ceará", "Rio Grande do Norte", "Paraíba", "Pernambuco", "Alagoas", "Sergipe", "Bahia") ~ "Northeast",
                             territorial_opening %in% c("Minas Gerais", "Espírito Santo", "Rio de Janeiro", "São Paulo") ~ "Southeast",
                             territorial_opening %in% c("Paraná", "Santa Catarina", "Rio Grande do Sul") ~ "South",
                             territorial_opening %in% c("Mato Grosso", "Mato Grosso do Sul", "Goiás", "Distrito Federal") ~ "Midwest",
                             TRUE ~ NA_character_))

3.1.1 PNAD table Population aged 18 or over

I’m going to combine this IBGE table with the first INFOPEN table that concerns the prison population, thus also being able to correlate the total number of prisoners with people aged 18 or over, but in a summarized way.

Here we can have an idea of the data present in this table.

## # A tibble: 6 × 4
## # Groups:   year, region [2]
##   year  region  state   total
##   <chr> <chr>   <chr>   <dbl>
## 1 2016  Midwest DF    2884713
## 2 2016  Midwest GO    6712470
## 3 2016  Midwest MS    2614076
## 4 2016  Midwest MT    3299360
## 5 2016  North   AC     826731
## 6 2016  North   AM    3789354

This table has data from 2016 to 2018. The first step will be to calculate the total number of people for each variable in the year 2019, using the arithmetic method described at the beginning of this analysis.

3.2 Using Arithmetic Method to Estimate a Population

I’ll start by transforming this data into a wide format, then I’ll apply the function with the formula and finally return the table to a long format.

population_18_years_or_over_3 <- pivot_wider(population_18_years_and_over_2,
                                             names_from = year,
                                             values_from = total)

population_18_years_or_over_4 <- population_18_years_or_over_3 %>%
  mutate(
    `2019` = round(formula(`2018`,2018,`2016`,2016,2019))
  )

population_18_years_or_over_5 <- pivot_longer(population_18_years_or_over_4, cols = -c(state,region),names_to = "year",values_to = "population") %>%
   mutate(across(-population, as.factor))

I will now combine this table with the INFOPEN prison population.

year region state prisoners population
2016 Midwest DF 14958 2884713
2016 Midwest GO 18626 6712470
2016 Midwest MS 18320 2614076
2016 Midwest MT 11642 3299360
2016 North AC 6100 826731
2016 North AM 10241 3789354
2016 North AP 2937 786591
2016 North PA 14886 8281744
2016 North RO 12018 1705323
2016 North RR 2503 476787

3.3 Table PNAD Education Data

I’m going to repeat basically the same process in the table with data on the population. This table, however, considers people aged 14 or over, as can be seen from the indicator.

alphabetization_population <- pnad_3_with_regions %>%
   filter(indicator =="Pessoas de 14 anos ou mais de idade",
          territorial_level == "Unidade da Federação",
          category_1 %in% c("Homem", "Mulher", "Branca", "Preta ou Parda", "Total¹"),
          variable_2 == "Nível de instrução",
          !(category_2 %in% c("Total"))) %>%
  filter(!str_detect(category_1,"Branca|Preta ou Parda|Total¹")) %>% 
   mutate(year = as.numeric(year),
     gender = recode(category_1,
       "Homem" = "male",
       "Mulher" = "female"),
          state = state_dict[as.character(territorial_opening)]) %>%
   select(region, state, gender, level_of_education = category_2, year, total = value) %>%
   drop_na()

Same process to calculate the population in the year 2019.

alphabetization_population_2 <- pivot_wider(alphabetization_population,
                                             names_from = year,
                                             values_from = total)

alphabetization_population_3 <- alphabetization_population_2 %>%
  mutate(
     `2019` = round(formula(`2018`,2018,`2016`,2016,2019))
   )

alphabetization_population_4 <- pivot_longer(alphabetization_population_3, cols = -c(region:level_of_education),names_to = "year",values_to = "population") %>%
   mutate(across(-population, as.factor))
## # A tibble: 6 × 6
##   region state gender level_of_education                        year  population
##   <fct>  <fct> <fct>  <fct>                                     <fct>      <dbl>
## 1 North  RO    male   No education                              2016       51545
## 2 North  RO    male   No education                              2017       45943
## 3 North  RO    male   No education                              2018       44963
## 4 North  RO    male   No education                              2019       41672
## 5 North  RO    male   Incomplete Elementary School (or equival… 2016      265952
## 6 North  RO    male   Incomplete Elementary School (or equival… 2017      277958

As you can imagine, the education level distributions are not standardized. I’m going to use a function to create this pattern between the PNAD table and the INFOPEN table.

standardize_level_of_education <- function(grade) {
   simplified_grade <- gsub(" \\(or equivalent\\)", "", grade)
   recode(simplified_grade,
          "No education" = "illiterate",
          "Incomplete Elementary School" = "elementary school incomplete",
          "Complete Elementary School" = "elementary school complete",
          "Incomplete High School" = "high school incomplete",
          "Complete High School" = "high school complete",
          "Incomplete College/University" = "college or university incomplete",
          "Complete College/University" = "college or university complete",
          "Literacy without regular courses" = "elementary school incomplete
")
}

after running the function on both tables, here is the result:

3.4 PNADC and INFOPEN Standardized Tables

3.4.1 Literacy of the population

year region state gender level_of_education population
2016 Midwest DF female college or university complete 326836
2016 Midwest DF female college or university incomplete 81125
2016 Midwest DF female elementary school complete 115600
2016 Midwest DF female elementary school incomplete 243841
2016 Midwest DF female high school complete 361021
2016 Midwest DF female high school incomplete 79367
2016 Midwest DF female illiterate 36913
2016 Midwest DF male college or university complete 269837
2016 Midwest DF male college or university incomplete 80959
2016 Midwest DF male elementary school complete 112742

3.4.2 Literacy of prisoners

year region state gender level_of_education prisoners
2016 Midwest DF female college or university complete 10
2016 Midwest DF female college or university incomplete 39
2016 Midwest DF female elementary school complete 34
2016 Midwest DF female elementary school incomplete 317
2016 Midwest DF female high school complete 127
2016 Midwest DF female high school incomplete 118
2016 Midwest DF female illiterate 12
2016 Midwest DF male college or university complete 78
2016 Midwest DF male college or university incomplete 238
2016 Midwest DF male elementary school complete 1496

3.5 Missing data in INFOPEN table

I noticed that after all the standardizations, the tables came back with different number of observations. The infopen_level_of_education_31_standard table has 1509 observations, while alphabetization_population_5 has 1512 observations. I decided to investigate using anti_join and found that the infopen table does not have the observations of the table created below.

## # A tibble: 3 × 6
##   year  region    state gender level_of_education             population
##   <fct> <fct>     <fct> <fct>  <chr>                               <dbl>
## 1 2016  North     RR    female college or university complete      30467
## 2 2017  Northeast MA    female college or university complete     199776
## 3 2016  Northeast SE    female college or university complete     101357

In order not to leave these values blank, I decided to use a simple average of the number of prisoners in other years for each missing observation, use this average as the value and only then combine the PNADC tables with INFOPEN.

Now the INFOPEN table contains 1512 columns, just like the PNAD table, so I can combine them.

3.6 PNADC Table - INFOPEN Level of Education

year region state gender level_of_education prisoners population
2016 Midwest DF female college or university complete 10 326836
2016 Midwest DF female college or university incomplete 39 81125
2016 Midwest DF female elementary school complete 34 115600
2016 Midwest DF female elementary school incomplete 317 243841
2016 Midwest DF female high school complete 127 361021
2016 Midwest DF female high school incomplete 118 79367
2016 Midwest DF female illiterate 12 36913
2016 Midwest DF male college or university complete 78 269837
2016 Midwest DF male college or university incomplete 238 80959
2016 Midwest DF male elementary school complete 1496 112742

4 IBGE Ethnicity Table

This Table has the ethnic percentage distribution of the Brazilian population by state. The file to be worked on here is called “PNADc/Tabela 1.1 DIST PERCET RACA.xls”, and can be found on the IBGE website.

I’ll skip the data reading part as it doesn’t differ at all from the previous tables.

year state Total White Black Brown
2018 RO 1747.154 29.47056 6.710325 62.40118
2018 AC 853.023 21.02601 5.346175 72.31678
2018 AM 3921.508 16.80872 2.989718 77.40833
2018 RR 513.466 23.69004 7.674129 60.86162
2018 PA 8472.029 17.83819 8.171171 72.69580
2018 AP 821.545 17.42855 6.996881 74.26081

This table has data from 2012 to 2018. I’m going to use the formula we discussed at the beginning to estimate the population in 2019. I’ll start by transforming the data in the table, as the number present in the total column must still be multiplied by 1000, and the ethnicity values are in percentage in relation to the total.

population_distribution_by_ethnicity_and_region_3 <- population_distribution_by_ethnicity_and_region_2 %>%
   mutate(
     Total = round(Total*1000),
     White = round(White*Total/100),
     Black = round(Black*Total/100),
     Brown = round(Brown*Total/100))

Finally, the table that we will use to match that of INFOPEN

4.1 Ethnic Distribution of the Brazilian Population

year region state ethnicity population
2016 North AC black or brown 674372
2016 North AC white 149493
2016 Northeast AL black or brown 2470246
2016 Northeast AL white 788828
2016 North AM black or brown 3034052
2016 North AM white 679764
2016 North AP black or brown 619211
2016 North AP white 162565
2016 Northeast BA black or brown 11944048
2016 Northeast BA white 2608310

4.2 Missing Observations in the INFOPEN Table

After manipulating the data from this IBGE table, I will combine it with the INFOPEN table, in order to correlate the total number of prisoners and the population for each variable. However, when combining the dataframes, I discovered that there are missing observations in the infopen_etnia_3_final table because it has fewer rows than the PNAD table. I will use anti-join to find them and linear regression to calculate them

These are the missing observations in the INFOPEN table

head(difference_infopen_population_ethnicity)
## # A tibble: 2 × 4
## # Groups:   year, state, region [1]
##    year region    state ethnicity     
##   <dbl> <chr>     <chr> <chr>         
## 1  2019 Northeast SE    black or brown
## 2  2019 Northeast SE    white

After some calculations, I arrived at this result of predicting prisoners and each observation:

head(predictions_2019_infopen_ethnicity)
## # A tibble: 2 × 5
## # Groups:   region, state, ethnicity [2]
##   region    state ethnicity      prisoners  year
##   <chr>     <chr> <chr>              <dbl> <dbl>
## 1 Northeast SE    black or brown      5124  2019
## 2 Northeast SE    white                457  2019

Now it is enough to combine the tables with data on the ethnicity of the total Brazilian population with the prison population and then we will arrive at this table:

4.3 PNADC Table - INFOPEN Ethnicity

year region state ethnicity prisoners population
2016 Midwest DF black or brown 12357 1753738
2016 Midwest DF white 2513 1113132
2016 Midwest GO black or brown 14286 4253442
2016 Midwest GO white 4266 2426334
2016 Midwest MS black or brown 12555 1452699
2016 Midwest MS white 5481 1130769
2016 Midwest MT black or brown 8900 2211143
2016 Midwest MT white 2655 1076121
2016 North AC black or brown 5306 674372
2016 North AC white 506 149493

5 IBGE Age Range Table

The file to be worked on here is called “Tabela 1.2 DIST POP ETARIA.xls”, and can be found on the IBGE website.

This table has data on the age group distribution of the population by ethnicity. Indigenous people, Asians and people with no declaration of color or race are included in the total.

age_range total cv_total white cv_white black_brown cv_black_brown proportion_white cv_proportion_white proportion_black_brown cv_proportion_black_brown year
0 to 4 years old 13124.30 0.88427169197711608 6076.469 1.451866 6939.813 1.155815 46.29937 1.021138 52.87758 0.8912887 2018
5 to 9 years old 13645.48 0.85759498658148692 5629.184 1.409402 7899.687 1.121951 41.25310 1.074214 57.89233 0.7720677 2018
10 to 14 years old 14923.04 0.77302798278891072 5756.714 1.359373 9039.822 1.043748 38.57603 1.111292 60.57629 0.7071651 2018
15 to 19 years old 16442.07 0.75758111621423652 6010.282 1.296194 10293.966 1.031182 36.55429 1.105113 62.60748 0.6485969 2018
20 to 24 years old 16048.18 0.75135656586436339 6348.342 1.308184 9541.958 1.019381 39.55802 1.057401 59.45820 0.7094211 2018
25 to 29 years old 15006.06 0.83216738688741987 6160.098 1.441365 8686.275 1.068971 41.05073 1.082387 57.88510 0.7691143 2018
30 to 34 years old 16071.92 0.84090771846315848 6600.026 1.448793 9274.408 1.043940 41.06559 1.057334 57.70568 0.7619637 2018
35 to 39 years old 16905.90 0.82142719564900768 7026.611 1.517426 9688.656 1.026723 41.56308 1.113020 57.30932 0.8102016 2018
40 to 44 years old 15186.72 0.78765297599262696 6390.305 1.356850 8621.957 1.049632 42.07823 1.035301 56.77299 0.7678529 2018
45 to 49 years old 13519.07 0.83775955165508598 5857.937 1.412991 7506.854 1.127709 43.33091 1.061985 55.52788 0.8343097 2018

Like the previous table, this one only has data from 2012 to 2018, so I will use the same formula to predict the population in 2019.

5.1 Standardization of Age Ranges

As you can see below, although we now have data from 2016 to 2019, the age groups are not exactly the same as those from INFOPEN, but they are very close.
age_range year population
25 to 29 years old 2018 15006064
25 to 29 years old 2017 15361348
25 to 29 years old 2016 15417271
25 to 29 years old 2019 14834679
30 to 34 years old 2018 16071915
30 to 34 years old 2017 16187827
30 to 34 years old 2016 16565123
30 to 34 years old 2019 16054589
35 to 39 years old 2018 16905898
35 to 39 years old 2017 16504662

What I’m going to do is create a function that adjusts the age groups to be in accordance with those of INFOPEN

adjust_age_range <- function(range) {
   if (range %in% c("25 to 29 years old")) {
     return("25 to 29 years old")
   } else if (range %in% c("30 to 34 years old")) {
     return("30 to 34 years old")
   } else if (range %in% c("35 to 39 years old", "40 to 44 years old")) {
     return("35 to 45 years old")
   } else if (range %in% c("45 to 49 years old", "50 to 54 years old", "55 to 59 years old")) {
     return("46 to 60 years old")
   } else if (range %in% c("60 to 64 years old", "65 to 69 years old")) {
     return("61 to 70 years old")
   } else if (range %in% c("70 to 74 years old", "75 to 79 years old", "80 years old and over")) {
     return("over 70 years old")
   } else {
     return(NA)
   }
}
Here you can have a visualization of the table that I have until then.
year age_range population
2016 25 to 29 years old 15417271
2016 30 to 34 years old 16565123
2016 35 to 45 years old 30697363
2016 46 to 60 years old 37633650
2016 61 to 70 years old 16444403
2016 over 70 years old 12997738
2017 25 to 29 years old 15361348
2017 30 to 34 years old 16187827
2017 35 to 45 years old 31462107
2017 46 to 60 years old 37959837

It may be noted that I do not have the 18 to 24 year old population. I’m going to extract this age range from another PNAD table, which we’ve worked on before.

population_18_to_24_years <- pnad_4_population_age %>%
   filter(grepl("18 a 24 anos", age_group),
          grepl("Total¹", ethnicity)) %>%
   select(-gender) %>% # I will remove gender to remove duplicates (because I have gender and ethnicity)
   rename(age_range = age_group,
          population = value)%>%
   group_by(year, age_range, ethnicity) %>%
   summarise(population = sum(population)) %>%
   select(-ethnicity) %>% # finally I remove the ethnicity column that only contains 'Total'
   drop_na()

As previously demonstrated, I will use arithmetic to predict the population in 2019.

5.2 Distribution of the Age Range of the Brazilian Population

Finally, the table with all age groups equal to INFOPEN
age_range year population
18 to 24 years old 2016 22234284
25 to 29 years old 2016 15417271
30 to 34 years old 2016 16565123
35 to 45 years old 2016 30697363
46 to 60 years old 2016 37633650
61 to 70 years old 2016 16444403
over 70 years old 2016 12997738
18 to 24 years old 2017 22727774
25 to 29 years old 2017 15361348
30 to 34 years old 2017 16187827

Now it remains only to combine the age range tables.

population_infopen_age_range <- as.data.frame(left_join(infopen_age_range_4,
                                             population_age_range,
                                             by = join_by(year, age_range))) %>%
   mutate(age_range = as.factor(age_range))

5.3 PNADC Table - INFOPEN by Age Group

year age_range prisoners population
2016 18 to 24 years old 214624 22234284
2016 25 to 29 years old 169540 15417271
2016 30 to 34 years old 127187 16565123
2016 35 to 45 years old 133083 30697363
2016 46 to 60 years old 49033 37633650
2016 61 to 70 years old 7527 16444403
2016 over 70 years old 1376 12997738
2017 18 to 24 years old 202629 22727774
2017 25 to 29 years old 168851 15361348
2017 30 to 34 years old 130889 16187827

6 IBGE Income Table

6.1 Total population aged 14 and over.

I need this table with the general population over 14 years old, as the IBGE income table only considers this age group. The table on education, which we have already used, considers this range of the population.

6.1.1 Table of Total Population aged 14 or Over.

region state year population
Midwest DF 2016 2335338
Midwest DF 2017 2391985
Midwest DF 2018 2452741
Midwest DF 2019 2511443
Midwest GO 2016 5384235
Midwest GO 2017 5505555
Midwest GO 2018 5599123
Midwest GO 2019 5706569
Midwest MS 2016 2073359
Midwest MS 2017 2109297

6.2 Data Explanation

This table has the income distribution of the Brazilian population. The IBGE itself released an informative on the income distribution of the Brazilian population between 2012 and 2019.

I will only work with a fraction of the data available in this table: income usually received, at average prices and only for people aged 14 and over. According to the IBGE, usual income is defined as follows:

” The usual income consists of the monthly income received by employees, employers and self-employed workers, without extraordinary increases or sporadic discounts. For the employee, the monthly income usually received excludes all installments that are not continuous (annual bonus, salary late, overtime, annual profit sharing, 13th salary, 14th salary, salary advance, etc.) and does not consider occasional discounts (absences, part of the 13th salary anticipated, possible damage caused to the enterprise, etc.).

If the income received from an employee, self-employed worker and employer is variable, the usual income is considered to be the average income received by the person in the period in which he/she carried out the declared work in the reference week. When remuneration varies depending on the period or season of the year, the monthly income that the person usually earns in that seasonal period is considered.” see it

6.3 Data Exploration

This table is very simple. In the ‘class’ column, we have the percentage class of people by income, and in the other columns, the usual income of this class of people.

I will use a table already present in the IBGE report to better exemplify the use of the table

Source: IBGE, Directorate of Research, Coordination of Work and Income, Continuous National Household Sample Survey 2012-2019.   Notes:     1. Usual income, at 2019 average prices.     2. Income raised only for people aged 14 or over. In the first line ‘2012’, in the column ‘More than 80% up to 90%’, we have the value 3 351, which represents a monthly income of R$ 3,351.00. That is, 90% of Brazilians receive up to this amount, only 10% receive more than that.

6.4 Data Manipulating

So that I can standardize the PNAD and INFOPEN income tables, I will need an adjustment according to the minimum wage. For this I will create a table with the values of the years 2016 to 2019.

year <- c(2019, 2018, 2017, 2016)
minimum_salary <- c(998.00, 954.00, 937.00, 880.00)
minimum_salary_2016_to_2019 <- data.frame(year, minimum_salary)

This table considers only the percentage of people with some income. The IBGE considers unemployed people who are looking for work during the sample period. However, it does not consider people without income who were not looking for a job as unemployed. This portion of people without income is the one we are going to deal with here.

To extract this data, I will use the same table already used, which also has this information. The ‘PNAD_Continua_2019_Rendimento_de_Todas_as_Fontes’ table has the “Percentage of people with income” as an indicator, so I will extract ‘100%’ from this value and obtain the percentage of people without income.

percentage_employed <-population_income %>%
    filter(`Abertura geográfica` == "Brasil",
         Tipo == "Valor",
         sub.classe %in% c("Todas as fontes¹"   ),
         ind == "Percentual de pessoas com rendimento, na população residente") %>% 
  select(sub.classe, '2016','2017','2018','2019') %>% 
  unique()

percentage_employed_2_long_format <- pivot_longer(percentage_employed,
                                                  cols = c("2016", "2017","2018", "2019"),
                                                  names_to="year", 
                                                values_to="population_percentage_with_income")

percentage_pp_without_income <- percentage_employed_2_long_format %>%
   mutate(population_without_income = (100 - population_percentage_with_income),
          income = 0,
          wage_range = "does not receive",
          year = as.factor(year))

no_income <- left_join(percentage_pp_without_income, population_total_14_years_old_or_over, by = join_by(year)) %>%
   mutate(population = (population_without_income*population)/100,) %>%
   group_by(year, wage_range) %>%
   summarise(population = sum(population)) %>%
   select(year, wage_range, population)

Before merging the tables, I still need to standardize the variables.

# Creating the new column with the categories
population_wage_range_3 <- population_wage_range_2 %>%
   mutate(wage_range = case_when(
     income >= minimum_salary & income < 2 * minimum_salary ~ "between 1 and 2 monthly minimum wages",
     income >= 3/4 * minimum_salary & income < minimum_salary ~ "between 3/4 and 1 monthly minimum wage",
     income >= 2 * minimum_salary ~ "over 2 monthly minimum wages",
     income > 0 & income< 3/4 * minimum_salary ~ "less than 3/4 of the monthly minimum wage"
   )) %>%
   select(sub.class, year, population_percentage, income,wage_range)


population_wage_range_4 <-merge(population_wage_range_3,
                                 population_total_14_years_old_or_over, by = "year") %>%
   mutate(paid_population = round((population * population_percentage)/100)) %>%
   select(year, wage_range, paid_population) %>%
   rename(population = paid_population)

population_wage_range_5 <- population_wage_range_4 %>%
   group_by(year, wage_range) %>%
   summarise(population = sum(population)) %>%
   mutate(year = as.factor(year))
# Set the correct order of yields
income_range_order <- c("does not receive",
                                "less than 3/4 of the monthly minimum wage",
                                "between 3/4 and 1 monthly minimum wage",
                                "between 1 and 2 monthly minimum wages",
                                "over 2 monthly minimum wages")

population_remuneration_6 <- rbind(population_wage_range_5, no_income)%>%
   mutate(wage_range = as.factor(wage_range),
          wage_range = factor(wage_range, levels = income_range_order))

Finally, an overview of the distribution of income in the country:

6.5 Population distribution with and without income

year wage_range population
2016 does not receive 64375850
2017 does not receive 65298473
2018 does not receive 64819488
2019 does not receive 63997726
2016 less than 3/4 of the monthly minimum wage 16549064
2017 less than 3/4 of the monthly minimum wage 33486396
2018 less than 3/4 of the monthly minimum wage 33848303
2019 less than 3/4 of the monthly minimum wage 34223380
2016 between 3/4 and 1 monthly minimum wage 33098128
2017 between 3/4 and 1 monthly minimum wage 16743198

Before merging the dataframes, I noticed that the Infopen table does not have data on prisoner pay in 2017 for the state of Sao Paulo. I will use linear interpolation (Larson 1988)to predict this data.

# Subset of data for the state of São Paulo
infopen_sp <- infopen_wage_3_final[infopen_wage_3_final$state == 'SP', ]

Function to predict the missing data on the remuneration of prisoners in Sao Paulo in 2017

predict_mv <- function(year, prisoners) {
   complete_cases <- !is.na(prisoners)
   approx(x = as.numeric(year[complete_cases]),
          y = prisoners[complete_cases],
          xout = as.numeric(year))$y
}

Apply the function for each gender and compensation combination

infopen_sp <- infopen_sp %>%
   group_by(wage) %>%
   mutate(prisoners = round(predict_mv(year, prisoners))) %>%
   ungroup()

Replace the original data for Sao Paulo with the new populated data

infopen_wage_3_final[infopen_wage_3_final$state == 'SP', ] <- infopen_sp

Finally the final table the estimated amount of prisoners by remuneration

infopen_wage_4 <- infopen_wage_3_final %>%
   group_by(year, wage) %>%
   mutate(year = as.factor(year)) %>%
   summarise(prisoners = sum(prisoners)) %>% 
    rename(wage_range = wage)

After all the manipulations, I can finally combine the tables.

6.6 PNADC Table - INFOPEN wage range

year wage_range prisoners population
2016 between 1 and 2 monthly minimum wages 45996 66196256
2016 between 3/4 and 1 monthly minimum wage 383948 33098128
2016 does not receive 174533 64375850
2016 less than 3/4 of the monthly minimum wage 81645 16549064
2016 over 2 monthly minimum wages 16286 49647190
2017 between 1 and 2 monthly minimum wages 40861 66972792
2017 between 3/4 and 1 monthly minimum wage 289068 16743198
2017 does not receive 251953 65298473
2017 less than 3/4 of the monthly minimum wage 120993 33486396
2017 over 2 monthly minimum wages 2858 50229594

7 Presentation of Collected and Manipulated Data:

7.1 PNAD Table - INFOPEN Total

year region state prisoners population
2016 Midwest DF 14958 2884713
2016 Midwest GO 18626 6712470
2016 Midwest MS 18320 2614076
2016 Midwest MT 11642 3299360
2016 North AC 6100 826731
2016 North AM 10241 3789354
2016 North AP 2937 786591
2016 North PA 14886 8281744
2016 North RO 12018 1705323
2016 North RR 2503 476787

7.2 PNADC Table - INFOPEN Level of Education

year region state gender level_of_education prisoners population
2016 Midwest DF female college or university complete 10 326836
2016 Midwest DF female college or university incomplete 39 81125
2016 Midwest DF female elementary school complete 34 115600
2016 Midwest DF female elementary school incomplete 317 243841
2016 Midwest DF female high school complete 127 361021
2016 Midwest DF female high school incomplete 118 79367
2016 Midwest DF female illiterate 12 36913
2016 Midwest DF male college or university complete 78 269837
2016 Midwest DF male college or university incomplete 238 80959
2016 Midwest DF male elementary school complete 1496 112742

7.3 PNADC Table - INFOPEN Ethnicity

year region state ethnicity prisoners population
2016 Midwest DF black or brown 12357 1753738
2016 Midwest DF white 2513 1113132
2016 Midwest GO black or brown 14286 4253442
2016 Midwest GO white 4266 2426334
2016 Midwest MS black or brown 12555 1452699
2016 Midwest MS white 5481 1130769
2016 Midwest MT black or brown 8900 2211143
2016 Midwest MT white 2655 1076121
2016 North AC black or brown 5306 674372
2016 North AC white 506 149493

7.4 PNADC table - INFOPEN Age Range

7.5 PNADC Table - INFOPEN Wage Range

year region state gender level_of_education prisoners population
2016 Midwest DF female college or university complete 10 326836
2016 Midwest DF female college or university incomplete 39 81125
2016 Midwest DF female elementary school complete 34 115600
2016 Midwest DF female elementary school incomplete 317 243841
2016 Midwest DF female high school complete 127 361021
2016 Midwest DF female high school incomplete 118 79367
2016 Midwest DF female illiterate 12 36913
2016 Midwest DF male college or university complete 78 269837
2016 Midwest DF male college or university incomplete 238 80959
2016 Midwest DF male elementary school complete 1496 112742

8 Analyzes and Correlations.

Most of the project proposal has already been passed. From this point on, I focus more on presenting some correlations found in the tables we set up and present a little above.

I’ll start by creating a column that relates the number of prisoners to the total population, and then I’ll plot some graphs that illustrate the correlation between each variable

8.1 Ethnicity Dataframe

The variation in the percentage of prisoners in relation to population by ethnicity shows that in practically all states, there is a higher incidence of brown and black prisoners compared to the population. This does not indicate causality, as there are other factors that could influence individuals to commit crimes and end up in jail. However, it is a fact that requires further investigation. It would be ideal to assess additional variables, such as potential racism within the judiciary, as well as education and income, as we are doing here. In the following graphs, I present some correlations between these variables.

8.2 Age Range Dataframe

Here we can observe a decrease in the rate of prisoners in the age group of 18 to 24 years over time. This can happen for several reasons, among them the aging of the prison population. However, if we take all other age groups, we have a considerable increase in the number of prisoners in what we call “working age”, which comprises the population up to 61 years of age. It’s really frustrating to realize that our “Bill Gates”, “Zuckerbergs”, and “Elon Musks” are behind bars. The population that should be in college is trapped, by numerous factors, among which the young age, along with low education and lack of money. It would really be a dream not to have so many young people arrested.

8.3 Education Level Dataframe

This table shows the distribution of prisoners by level of education. Clearly, the key turns in incomplete secondary education, since from then on, the percentage of prisoners over the population drops drastically. It is no longer a mystery that a population with low education usually has a high degree of violence as a response, take countries like norway, netherlands and japan for example where there are very few prisoners, and compare the level of access to higher education with that of Brazil.

8.4 Incomes Dataframe

Here we can observe that most of the prison population are people who receive up to 1 monthly minimum wage. This amount between 3/4 and 1 monthly minimum wage includes several people who receive government aid such as “Bolsa Família” or others. They cannot be, according to the IBGE, classified as without income or unemployed.

The Inter-Union Department of Statistics and Socioeconomic Studies (Dieese), monthly publishes the value of the cost of the Basic Food Basket which, according to the body, would be “sufficient for the sustenance and well-being of an adult worker, containing balanced amounts of protein, calories, iron calcium and phosphorus.(DIEESE 2019a)”. In 2019, the average value of the national Food Parcel was BRL 422.19, which represents almost half the minimum wage at the time (BRL 998.00). ### Minimum Wage Required

The Constitution of Brazil, enacted in October 1988, mandates that the minimum wage should be a legally defined and uniform amount nationwide. It should be sufficient to meet the basic needs of a worker and their family, including housing, food, education, health, leisure, clothing, hygiene, transportation, and social security. The Constitution also requires periodic adjustments to maintain the purchasing power of the minimum wage (Article 7, IV of the Federal Constitution of Brazil).

DIEESE, when calculating the Minimum Necessary Wage, adheres to these constitutional provisions. They base their calculations on Decree Law No. 399, which stipulates that the cost of food for an adult worker should not be lower than the expense of the Basic Food Basket.

In these calculations, DIEESE considers a family model consisting of two adults and two children, assuming that the children’s consumption is equivalent to that of an adult.

The method for calculating a family’s food expenses begins with the cost of the most expensive Basic Food Basket among the 27 Brazilian capitals, which is then multiplied by three.

(DIEESE 2019b) conducted the Family Budget Survey (POF) in São Paulo during the period of 94/95. The results revealed that food accounted for 35.71% of the expenses of families in the lowest income bracket. By comparing the cost of food for a family (the most expensive basket multiplied by three) with the proportion of these families’ budget allocated to food (35.71%), it is possible to calculate the total budget required to cover other expenses such as housing, clothing, transportation, and more.

Therefore, the formula for calculating the Minimum Required Wage can be summarized as follows: \[F.F.C. = 3(CC)\]

\[\frac{F.F.C.}{X} = \frac{0.3571}{1.00}\] Using rule of 3, we have: \[F.F.C. = X(0.3571)\] so: \[ X = \frac{F.F.C.}{0.3571} \] Where: F.F.C. = Family Food Cost and C.C. = Cost of the highest value Food Parcel

The Necessary Minimum Wage, which is calculated monthly as an assessment of what the current minimum wage should be, also serves as a tool that workers’ unions use to expose the violation of the constitutional principle that defines the parameters for determining the lowest allowable wage. in the country.

We have below the value of what would be the ideal salary of the worker, provided for by law, to cover all monthly costs of his residence.

Month Minimum Wage Necessary Wage
December 998 4342.57
November 998 4021.39
October 998 3978.63
September 998 3980.82
August 998 4044.58
July 998 4143.55
June 998 4214.62
May 998 4259.90
April 998 4385.75
March 998 4277.04

Through these data, we can see the discrepancy between the minimum values and those necessary for the maintenance of the home in Brazil. The demand for political and economic reforms in Brazil is not recent. Still in the 1970s, the group “Legião Urbana” already raised protest with the song “What country is this?”. In the following decade, we can see the singer Cazuza protesting the song “Brasil”, which clearly would denounce the nation’s poverty.

The prison population says a lot about the country. Young, poor, low-educated and dark-skinned people are at the top of the statistics, which signals an omission on the part of the government. The Penal Code, in its article 135, describes the crime of omission of help, which consists of the attitude of failing to help people in a vulnerable situation, such as abandoned or lost children, disabled people, with injuries, or in a situation of risk or danger. For that reason, the government should also be behind bars.

Biography

DIEESE. 2019a. “Metodologia Da Cesta Básica de Alimentos.” https://www.dieese.org.br/metodologia/metodologiaCestaBasica/?page=1.
———. 2019b. “Pesquisa Nacional Da Cesta Básica de Alimentos.” https://www.dieese.org.br/analisecestabasica/salarioMinimo.html#2019.
Larson, David R. 1988. “Reflexivity, Algebraic Reflexivity and Linear Interpolation.” American Journal of Mathematics 110 (2): 283–99.
Von Sperling, M. 2014. Princípios Do Tratamento Biológico de Águas Residuárias. Vol. 1. Introdução à Qualidade Das Águas e Ao Tratamento de Esgotos. 4th ed. Editora UFMG.
LS0tCnRpdGxlOiAiRGF0YSBNYW5pcHVsYXRpb24gVXNpbmcgUiIKYXV0aG9yOiAiV2V2ZXJzb24gTm9zc2VpcyIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlCiAgICBpbmNsdWRlczoKICAgICAgaW5faGVhZGVyOiAiaGVhZGVyLmh0bWwiCiAgICB0aGVtZTogZmxhdGx5CiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKICAgICAgc21vb3RoX3Njcm9sbDogbm8KYmlibGlvZ3JhcGh5OiByZWZlcmVuY2lhcy5iaWIKLS0tCgojIFByb2plY3QgcHJvcG9zYWwKICAKVGhlIHB1cnBvc2Ugb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGRlbW9uc3RyYXRlIG15IFIgc2tpbGxzIGluIGRhdGEgbWFuaXB1bGF0aW9uIGFuZCBzdHJ1Y3R1cmluZywgYXMgd2VsbCBhcyBhbiBhbmFseXNpcyBvZiB0aGUgcHJlc2VudGVkIGRhdGEuIFdpdGggdGhhdCBpbiBtaW5kLCBJJ2xsIGxlYXZlIG1vc3Qgb2YgdGhlIGNvZGUgZXhwb3NlZCwgYnV0IG5vdCBhbGwgc28gaXQgZG9lc24ndCBnZXQgdG9vIHJlcGV0aXRpdmUuIEkgbXVzdCBwb2ludCBvdXQgdGhhdCBhbHRob3VnaCBwcmVzZW50IGluIHNvbWUgdGFibGVzLCB0aGUgInllbGxvdyBvciBpbmRpZ2Vub3VzIiBldGhuaWNpdHkgd2lsbCBub3QgYmUgcHJlc2VudGVkIGluIHRoZSBmaW5hbCByZXBvcnQsIHNpbmNlIHRoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiBvdXRsaWVycyBhbmQgdGhhdCBlbmQgdXAgYmlhc2luZyB0aGUgYW5hbHlzaXMuCiAgCkR1cmluZyB0aGUgYW5hbHlzaXMsIEkgd2lsbCBtYWtlIHNldmVyYWwgcG9wdWxhdGlvbiBwcmVkaWN0aW9ucywgYXMgbm90IGFsbCB0YWJsZXMgcHJlc2VudCBkYXRhIGZyb20gMjAxOS4gRm9yIHBvcHVsYXRpb24gcHJlZGljdGlvbiwgSSB3aWxsIGJhc2UgbXlzZWxmIG9uIHRoZSAqYXJpdGhtZXRpYyBtZXRob2QqIHByZXNlbnQgaW4gdGhlIGJvb2sgYnkgTWFyY29zIFZvbiBTcGVybGluZyBbQFZvblNwZXJsaW5nMjAxNF0uCgoqKkFyaXRobWV0aWMgTWV0aG9kKioKICAKVGhpcyBtZXRob2QgYXNzdW1lcyBhIGNvbnN0YW50IGdyb3d0aCByYXRlIGZvciB0aGUgZm9sbG93aW5nIHllYXJzLCBiYXNlZCBvbiBrbm93biBkYXRhLCBmb3IgZXhhbXBsZSwgdGhlIHBvcHVsYXRpb24gb2YgdGhlIGxhc3QgY2Vuc3VzLiBNYXRoZW1hdGljYWxseSwgaXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6CgokJFxmcmFje2RQfXtkdH0gPSBrX2EkJCAKCndoZXJlIGRQL2R0IHJlcHJlc2VudHMgdGhlIHBvcHVsYXRpb24gY2hhbmdlIChQKSBwZXIgdW5pdCB0aW1lICh0KSwgYW5kIGthIGlzIGEgY29uc3RhbnQuIENvbnNpZGVyaW5nIHRoYXQgUDEgaXMgdGhlIHBvcHVsYXRpb24gb2YgdGhlIHBlbnVsdGltYXRlIGNlbnN1cyAoeWVhciB0MSkgYW5kIFAyLCB0aGUgcG9wdWxhdGlvbiBvZiB0aGUgbGFzdCBjZW5zdXMgKHllYXIgdDIpLCB3ZSBoYXZlOgogIAokJFxpbnRfe1BfMn1ee1BfMX0gPSBrX2FcaW50X3t0XzF9Xnt0XzJ9ZHQkJAoKSW50ZWdyYXRpbmcgYmV0d2VlbiB0aGUgZGVmaW5lZCBsaW1pdHMsIHdlIGhhdmU6CiAgCiQkUF8yLVBfMSA9IGtfYSh0XzItdF8xKSQkCiQka19hID0gXGZyYWN7UF8yLVBfMX17dF8yLXRfMX0kJAoKVXNpbmcgdGhlIGVxdWF0aW9uLCB3ZSBhcnJpdmUgYXQgdGhlIGdlbmVyYWwgZXhwcmVzc2lvbiBvZiB0aGUgYXJpdGhtZXRpYyBtZXRob2Q6CgokJFA9UF8yICsga19uKHQtdF8yKSQkCgp3aGVyZSB0IHJlcHJlc2VudHMgdGhlIHllYXIgb2YgdGhlIHByb2plY3Rpb24uCiAgClRoaXMgbWV0aG9kIGFkbWl0cyB0aGF0IHRoZSBwb3B1bGF0aW9uIHZhcmllcyBsaW5lYXJseSB3aXRoIHRpbWUgYW5kIGNhbiBiZSB1c2VkIGZvciBwb3B1bGF0aW9uIGZvcmVjYXN0aW5nIGZvciBhIHNob3J0IHBlcmlvZCwgZnJvbSAxIHRvIDUgeWVhcnMuIEZvciBhIGZvcmVjYXN0IGZvciBhIHZlcnkgbG9uZyBwZXJpb2QsIHRoZSBkaXNjcmVwYW5jeSB3aXRoIGhpc3RvcmljYWwgcmVhbGl0eSBiZWNvbWVzIGFjY2VudHVhdGVkLCBzaW5jZSBncm93dGggaXMgYW4gdW5saW1pdGVkIGFzc3VtcHRpb24uCiAgClRvIGFwcGx5IHRoaXMgYXJpdGhtZXRpYyBtZXRob2QgZm9ybXVsYSwgSSB3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIGJlbG93LgoKYGBge3IgZm9ybXVsYSBhcml0aG1ldGljIG1ldGhvZH0KZm9ybXVsYSA8LSBmdW5jdGlvbihQMiwgdDIsIFAwLCB0MCwgdCkgewogIEthIDwtIChQMiAtIFAwKSAvICh0MiAtIHQwKQogIFB0IDwtIFAyICsgS2EgKiAodCAtIHQyKQogIHJldHVybihQdCkKfQpgYGAKCgojIyBQcmVwYXJpbmcgdGhlIFIgRW52aXJvbm1lbnQKCkZpcnN0IG9mIGFsbCwgSSdtIGdvaW5nIHRvIGxvYWQgdGhlIHBhY2thZ2VzIHRoYXQgSSdtIGdvaW5nIHRvIHVzZSB0byBtYW5pcHVsYXRlIHRoZSBkYXRhLCBkbyB0aGUgYW5hbHlzaXMgYW5kIGdlbmVyYXRlIHRoaXMgcmVwb3J0LgpgYGB7ciBQYWNrZXQgTG9hZGluZywgbWVzc2FnZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGU9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSkKbGlicmFyeShmb3JlaWduKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkod3JpdGV4bCkKbGlicmFyeShzdHJpbmdpKQpsaWJyYXJ5KHB1cnJyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrbml0cikKbGlicmFyeShtYXJrZG93bikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGh0bWx0b29scykKbGlicmFyeShyc3RhdGl4KQpsaWJyYXJ5KGVtbWVhbnMpCgpgYGAKCiMgVGhlIElORk9QRU4KICAKIkluZm9wZW4gaXMgYSBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBzeXN0ZW0gb2YgdGhlIEJyYXppbGlhbiBwZW5pdGVudGlhcnkgc3lzdGVtLiBUaGUgc3lzdGVtLCB1cGRhdGVkIGJ5IHRoZSBtYW5hZ2VycyBvZiB0aGUgZXN0YWJsaXNobWVudHMgc2luY2UgMjAwNCwgc3VtbWFyaXplcyBpbmZvcm1hdGlvbiBhYm91dCBwZW5hbCBlc3RhYmxpc2htZW50cyBhbmQgdGhlIHByaXNvbiBwb3B1bGF0aW9uLiBJbiAyMDE0LCBERVBFTiByZWZvcm11bGF0ZWQgdGhlIG1ldGhvZG9sb2d5IHVzZWQsIHdpdGggYSB2aWV3IHRvIG1vZGVybml6aW5nIHRoZSBjb2xsZWN0aW9uIGluc3RydW1lbnQgYW5kIGV4cGFuZCB0aGUgcmFuZ2Ugb2YgaW5mb3JtYXRpb24gY29sbGVjdGVkLiBUaGUgdHJlYXRtZW50IG9mIHRoZSBkYXRhIGFsbG93ZWQgYSBicm9hZCBkaWFnbm9zaXMgb2YgdGhlIHN0dWRpZWQgcmVhbGl0eSwgYnV0IHdoaWNoIGRpZCBub3QgZXhoYXVzdCwgaW4gYW55IHdheSwgYWxsIHRoZSBwb3NzaWJpbGl0aWVzIG9mIGFuYWx5c2lzLiIKCiMjIExvYWRpbmcgSW5pdGlhbCBEYXRhIFN0ZXAgYnkgU3RlcAoKRmlyc3QgSSdtIGdvaW5nIHRvIGNyZWF0ZSBhIGRpY3Rpb25hcnkgb2Ygc3RhdGVzIHRoYXQgSSdtIGdvaW5nIHRvIHVzZS4gSSBkaWQgdGhpcyBpbiBvcmRlciB0byBzdGFuZGFyZGl6ZSB0aGUgbmFtZXMgb2YgdGhlIHN0YXRlcywgYXMgc29tZSB0YWJsZXMgc2hvdyB0aGUgZnVsbCBuYW1lcywgb3RoZXJzIHNob3cgb25seSB0aGUgYWJicmV2aWF0aW9ucyBvZiB0aGUgc3RhdGVzLgoKYGBgIHtyIHN0YXRlcyBkaWN0aW9uYXJpZXMsIGluY2x1ZGUgPSBGQUxTRX0Kc3RhdGVfZGljdCA8LSBjKCJBY3JlIiA9ICJBQyIsCiAgICAgICAgICAgICAiQWxhZ29hcyIgPSAiQUwiLAogICAgICAgICAgICAgIkFtYXDDoSIgPSAiQVAiLAogICAgICAgICAgICAgIkFtYXpvbmFzIiA9ICJBTSIsCiAgICAgICAgICAgICAiQmFoaWEiID0gIkJBIiwKICAgICAgICAgICAgICJDZWFyw6EiID0gIkNFIiwKICAgICAgICAgICAgICJEaXN0cml0byBGZWRlcmFsIiA9ICJERiIsCiAgICAgICAgICAgICAiRXNww61yaXRvIFNhbnRvIiA9ICJFUyIsCiAgICAgICAgICAgICAiR29pw6FzIiA9ICJHTyIsCiAgICAgICAgICAgICAiTWFyYW5ow6NvIiA9ICJNQSIsCiAgICAgICAgICAgICAiTWF0byBHcm9zc28iID0gIk1UIiwKICAgICAgICAgICAgICJNYXRvIEdyb3NzbyBkbyBTdWwiID0gIk1TIiwKICAgICAgICAgICAgICJNaW5hcyBHZXJhaXMiID0gIk1HIiwKICAgICAgICAgICAgICJQYXLDoSIgPSAiUEEiLAogICAgICAgICAgICAgIlBhcmHDrWJhIiA9ICJQQiIsCiAgICAgICAgICAgICAiUGFyYW7DoSIgPSAiUFIiLAogICAgICAgICAgICAgIlBlcm5hbWJ1Y28iID0gIlBFIiwKICAgICAgICAgICAgICJQaWF1w60iID0gIlBJIiwKICAgICAgICAgICAgICJSaW8gZGUgSmFuZWlybyIgPSAiUkoiLAogICAgICAgICAgICAgIlJpbyBHcmFuZGUgZG8gTm9ydGUiID0gIlJOIiwKICAgICAgICAgICAgICJSaW8gR3JhbmRlIGRvIFN1bCIgPSAiUlMiLAogICAgICAgICAgICAgIlJvbmTDtG5pYSIgPSAiUk8iLAogICAgICAgICAgICAgIlJvcmFpbWEiID0gIlJSIiwKICAgICAgICAgICAgICJTYW50YSBDYXRhcmluYSIgPSAiU0MiLAogICAgICAgICAgICAgIlPDo28gUGF1bG8iID0gIlNQIiwKICAgICAgICAgICAgICJTZXJnaXBlIiA9ICJTRSIsCiAgICAgICAgICAgICAiVG9jYW50aW5zIiA9ICJUTyIpCgpzdGF0ZV9yZWdpb24gPC0gZGF0YS5mcmFtZSgKICBzdGF0ZSA9IGMoIlJPIiwgIkFDIiwgIkFNIiwgIlJSIiwgIlBBIiwgIkFQIiwgIlRPIiwgIk1BIiwgIlBJIiwgIkNFIiwgIlJOIiwgIlBCIiwgIlBFIiwgIkFMIiwgIlNFIiwgIkJBIiwgIk1HIiwgIkVTIiwgIlJKIiwgIlNQIiwgIlBSIiwgIlNDIiwgIlJTIiwgIk1TIiwgIk1UIiwgIkdPIiwgIkRGIiksCiAgcmVnaW9uID0gYyhyZXAoIk5vcnRoIiwgNyksIHJlcCgiTm9ydGhlYXN0IiwgOSksIHJlcCgiU291dGhlYXN0IiwgNCksIHJlcCgiU291dGgiLCAzKSwgcmVwKCJNaWR3ZXN0IiwgNCkpCikKYGBgCgpgYGB7ciBoZWFkIHN0YXRlX2RpY3R9CmhlYWQoc3RhdGVfZGljdCwgMjApCmBgYAoKSGVyZSBpcyB0aGUgbGlzdCBvZiBjb2x1bW5zIHRoYXQgSSB3aWxsIGV4dHJhY3QgZnJvbSB0aGUgSU5GT1BFTiB0YWJsZXMuIEkgY3JlYXRlZCB0aGlzIGxpc3QgdXNpbmcgbWFuaXB1bGF0aW9uIHdpdGggRXhjZWwuCgpgYGB7ciBjb2x1bW5zIGZvciBJTkZPUEVOLCBpbmNsdWRlID0gRkFMU0V9CmNvbHVtbnMgPC0gYyhwcmlzb25fcG9wdWxhdGlvbl9wcm92aXNpb25hbF9wcmlzb25lcnNfd2l0aG91dF9zZW50ZW5jZV9zdGF0ZV9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgSnVzdGnDp2EgRXN0YWR1YWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX2ZlZGVyYWxfanVzdGljZV9tYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX2ZlZGVyYWxfanVzdGljZV9mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgSnVzdGnDp2EgRmVkZXJhbCBGZW1pbmlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9wcm92aXNpb25hbF9wcmlzb25lcnNfd2l0aG91dF9zZW50ZW5jZV9vdGhlcl9qdXN0X2NpdmlsX3dvcmtfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHByb3Zpc8OzcmlvcyAoc2VtIGNvbmRlbmHDp8OjbykgfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX290aGVyX2p1c3RfY2l2aWxfd29ya19mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX3RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IFRvdGFsIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcl9jbG9zZWRfcmVnaW1lX3N0YXRlX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgSnVzdGnDp2EgRXN0YWR1YWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcl9jbG9zZWRfcmVnaW1lX3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBKdXN0acOnYSBFc3RhZHVhbCBGZW1pbmlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfcHJpc29uZXJfY2xvc2VkX3JlZ2ltZV9mZWRlcmFsX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgSnVzdGnDp2EgRmVkZXJhbCBNYXNjdWxpbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3ByaXNvbmVyX2Nsb3NlZF9yZWdpbWVfZmVkZXJhbF9qdXN0aWNlX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgSnVzdGnDp2EgRmVkZXJhbCBGZW1pbmlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfcHJpc29uZXJfY2xvc2VkX3JlZ2ltZV9vdGhlcmp1c3RfY2l2aWxfd29ya19tYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcl9jbG9zZWRfcmVnaW1lX290aGVyanVzdF9jaXZpbF93b3JrX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcl9jbG9zZWRfcmVnaW1lX3RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBUb3RhbCIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfc2VtaV9vcGVuX3JlZ2ltZV9zdGF0ZV9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IEp1c3Rpw6dhIEVzdGFkdWFsIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfc2VtaV9vcGVuX3JlZ2ltZV9zdGF0ZV9qdXN0aWNlX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBzZW1pYWJlcnRvIHwgSnVzdGnDp2EgRXN0YWR1YWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3NlbWlfb3Blbl9yZWdpbWVfZmVkZXJhbF9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9zZW1pX29wZW5fcmVnaW1lX2ZlZGVyYWxfanVzdGljZV9mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IEp1c3Rpw6dhIEZlZGVyYWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3NlbWlfb3Blbl9yZWdpbWVfb3RoZXJfanVzdGljZV9tYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIHNlbWlhYmVydG8gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9zZW1pX29wZW5fcmVnaW1lX290aGVyX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIHNlbWlhYmVydG8gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3NlbWlfb3Blbl9yZWdpbWVfdG90YWwJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IFRvdGFsIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcnNfb3Blbl9yZWdpbWVfc3RhdGVfanVzdGljZV9tYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IEp1c3Rpw6dhIEVzdGFkdWFsIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfcHJpc29uZXJzX29wZW5fcmVnaW1lX3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcnNfb3Blbl9yZWdpbWVfZmVkZXJhbF9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgYWJlcnRvIHwgSnVzdGnDp2EgRmVkZXJhbCBNYXNjdWxpbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3ByaXNvbmVyc19vcGVuX3JlZ2ltZV9mZWRlcmFsX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IEp1c3Rpw6dhIEZlZGVyYWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3ByaXNvbmVyc19vcGVuX3JlZ2ltZV9vdGhlcl9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgYWJlcnRvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfcHJpc29uZXJzX29wZW5fcmVnaW1lX290aGVyX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IE91dHJvcyhKdXN0LiBUcmFiLiwgY8OtdmVsKSBGZW1pbmlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfb3Blbl9yZWdpbWVfdG90YWwJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgYWJlcnRvIHwgVG90YWwiCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9pbnRlcm5tZW50X3N0YXRlX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBKdXN0acOnYSBFc3RhZHVhbCBNYXNjdWxpbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9pbnRlcm5tZW50X3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIGludGVybmHDp8OjbyB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfaW50ZXJubWVudF9zdGF0ZV9mZWRlcmFsX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBKdXN0acOnYSBGZWRlcmFsIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZWN1cml0eV9tZWFzdXJlX2ludGVybm1lbnRfc3RhdGVfZmVkZXJhbF9qdXN0aWNlX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBKdXN0acOnYSBGZWRlcmFsIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfaW50ZXJubWVudF9vdGhlcl9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gaW50ZXJuYcOnw6NvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZWN1cml0eV9tZWFzdXJlX2ludGVybm1lbnRfb3RoZXJfanVzdGljZV9mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gaW50ZXJuYcOnw6NvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfaW50ZXJubWVudF90b3RhbAk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBUb3RhbCIJLApwcmlzb25fcG9wdWxhdGlvbl9zZWN1cml0eV9tZWFzdXJlX2FtYnVsYXRvcnlfdHJlYXRtZW50X3N0YXRlX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IEp1c3Rpw6dhIEVzdGFkdWFsIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZWN1cml0eV9tZWFzdXJlX2FtYnVsYXRvcnlfdHJlYXRtZW50X3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIHRyYXRhbWVudG8gYW1idWxhdG9yaWFsIHwgSnVzdGnDp2EgRXN0YWR1YWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9hbWJ1bGF0b3J5X3RyZWF0bWVudF9mZWRlcmFsX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfYW1idWxhdG9yeV90cmVhdG1lbnRfZmVkZXJhbF9qdXN0aWNlX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IEp1c3Rpw6dhIEZlZGVyYWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9hbWJ1bGF0b3J5X3RyZWF0bWVudF9vdGhlcl9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gdHJhdGFtZW50byBhbWJ1bGF0b3JpYWwgfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfYW1idWxhdG9yeV90cmVhdG1lbnRfb3RoZXJfanVzdGljZV9mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gdHJhdGFtZW50byBhbWJ1bGF0b3JpYWwgfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9hbWJ1bGF0b3J5X3RyZWF0bWVudF90b3RhbAk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IFRvdGFsIgksCnByaXNvbl9wb3B1bGF0aW9uX3RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBUb3RhbCIJLAphZ2VfcmFuZ2VfMThfdG9fMjRfeWVhcnNfb2xkX21hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAxOCBhIDI0IGFub3MgfCBNYXNjdWxpbm8iCSwKYWdlX3JhbmdlXzE4X3RvXzI0X3llYXJzX29sZF9mZW1hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAxOCBhIDI0IGFub3MgfCBGZW1pbmlubyIJLAphZ2VfcmFuZ2VfMThfdG9fMjRfeWVhcnNfb2xkX3RvdGFsCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMTggYSAyNCBhbm9zIHwgVG90YWwiCSwKYWdlX3JhbmdlXzI1X3RvXzI5X3llYXJzX29sZF9tYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMjUgYSAyOSBhbm9zIHwgTWFzY3VsaW5vIgksCmFnZV9yYW5nZV8yNV90b18yOV95ZWFyc19vbGRfZmVtYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMjUgYSAyOSBhbm9zIHwgRmVtaW5pbm8iCSwKYWdlX3JhbmdlXzI1X3RvXzI5X3llYXJzX29sZF90b3RhbAk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDI1IGEgMjkgYW5vcyB8IFRvdGFsIgksCmFnZV9yYW5nZV8zMF90b18zNF95ZWFyc19vbGRfbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDMwIGEgMzQgYW5vcyB8IE1hc2N1bGlubyIJLAphZ2VfcmFuZ2VfMzBfdG9fMzRfeWVhcnNfb2xkX2ZlbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDMwIGEgMzQgYW5vcyB8IEZlbWluaW5vIgksCmFnZV9yYW5nZV8zMF90b18zNF95ZWFyc19vbGRfdG90YWwJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAzMCBhIDM0IGFub3MgfCBUb3RhbCIJLAphZ2VfcmFuZ2VfMzVfdG9fNDVfeWVhcnNfb2xkX21hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAzNSBhIDQ1IGFub3MgfCBNYXNjdWxpbm8iCSwKYWdlX3JhbmdlXzM1X3RvXzQ1X3llYXJzX29sZF9mZW1hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAzNSBhIDQ1IGFub3MgfCBGZW1pbmlubyIJLAphZ2VfcmFuZ2VfMzVfdG9fNDVfeWVhcnNfb2xkX3RvdGFsCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMzUgYSA0NSBhbm9zIHwgVG90YWwiCSwKYWdlX3JhbmdlXzQ2X3RvXzYwX3llYXJzX29sZF9tYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgNDYgYSA2MCBhbm9zIHwgTWFzY3VsaW5vIgksCmFnZV9yYW5nZV80Nl90b182MF95ZWFyc19vbGRfZmVtYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgNDYgYSA2MCBhbm9zIHwgRmVtaW5pbm8iCSwKYWdlX3JhbmdlXzQ2X3RvXzYwX3llYXJzX29sZF90b3RhbAk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDQ2IGEgNjAgYW5vcyB8IFRvdGFsIgksCmFnZV9yYW5nZV82MV90b183MF95ZWFyc19vbGRfbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDYxIGEgNzAgYW5vcyB8IE1hc2N1bGlubyIJLAphZ2VfcmFuZ2VfNjFfdG9fNzBfeWVhcnNfb2xkX2ZlbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDYxIGEgNzAgYW5vcyB8IEZlbWluaW5vIgksCmFnZV9yYW5nZV82MV90b183MF95ZWFyc19vbGRfdG90YWwJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCA2MSBhIDcwIGFub3MgfCBUb3RhbCIJLAphZ2VfcmFuZ2Vfb3Zlcl83MF95ZWFyc19vbGRfbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IE1haXMgZGUgNzAgYW5vcyB8IE1hc2N1bGlubyIJLAphZ2VfcmFuZ2Vfb3Zlcl83MF95ZWFyc19vbGRfZmVtYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgTWFpcyBkZSA3MCBhbm9zIHwgRmVtaW5pbm8iCSwKYWdlX3JhbmdlX21vcmVfb2ZfNzBfeWVhcnNfb2xkX3RvdGFsCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgTWFpcyBkZSA3MCBhbm9zIHwgVG90YWwiCSwKYWdlX3JhbmdlX25vdF9pbmZvcm1lZF9tYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgTsOjbyBpbmZvcm1hZG8gfCBNYXNjdWxpbm8iCSwKYWdlX3JhbmdlX25vdF9pbmZvcm1lZF9mZW1hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCBOw6NvIGluZm9ybWFkbyB8IEZlbWluaW5vIgksCmV0aG5pY2l0eV93aGl0ZV9tYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEJyYW5jYSB8IE1hc2N1bGlubyIJLApldGhuaWNpdHlfd2hpdGVfZmVtYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEJyYW5jYSB8IEZlbWluaW5vIgksCmV0aG5pY2l0eV93aGl0ZV90b3RhbAk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBCcmFuY2EgfCBUb3RhbCIJLApldGhuaWNpdHlfYmxhY2tfbWFsZQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBQcmV0YSB8IE1hc2N1bGlubyIJLApldGhuaWNpdHlfYmxhY2tfZmVtYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IFByZXRhIHwgRmVtaW5pbm8iCSwKZXRobmljaXR5X2JsYWNrX3RvdGFsCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IFByZXRhIHwgVG90YWwiCSwKZXRobmljaXR5X2Jyb3duX21hbGUJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgUGFyZGEgfCBNYXNjdWxpbm8iCSwKZXRobmljaXR5X2Jyb3duX2ZlbWFsZQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBQYXJkYSB8IEZlbWluaW5vIgksCmV0aG5pY2l0eV9icm93bl90b3RhbAk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBQYXJkYSB8IFRvdGFsIgksCmV0aG5pY2l0eV95ZWxsb3dfbWFsZQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBBbWFyZWxhIHwgTWFzY3VsaW5vIgksCmV0aG5pY2l0eV95ZWxsb3dfZmVtYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEFtYXJlbGEgfCBGZW1pbmlubyIJLApldGhuaWNpdHlfeWVsbG93X3RvdGFsCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEFtYXJlbGEgfCBUb3RhbCIJLApldGhuaWNpdHlfaW5kaWdlbm91c19tYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEluZMOtZ2VuYSB8IE1hc2N1bGlubyIJLApldGhuaWNpdHlfaW5kaWdlbm91c19mZW1hbGUJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgSW5kw61nZW5hIHwgRmVtaW5pbm8iCSwKZXRobmljaXR5X2luZGlnZW5vdXNfdG90YWwJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgSW5kw61nZW5hIHwgVG90YWwiCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2lsbGl0ZXJhdGVfbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEFuYWxmYWJldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2lsbGl0ZXJhdGVfZmVtYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQW5hbGZhYmV0byB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9pbGxpdGVyYXRlX3RvdGFsCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQW5hbGZhYmV0byB8IFRvdGFsIgksCmxldmVsX29mX2VkdWNhdGlvbl9saXRlcmF0ZV93aXRob3V0X3JlZ3VsYXJfY291cnNlc19tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQWxmYWJldGl6YWRvIChzZW0gY3Vyc29zIHJlZ3VsYXJlcykgfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2xpdGVyYXRlX3dpdGhvdXRfcmVndWxhcl9jb3Vyc2VzX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEFsZmFiZXRpemFkbyAoc2VtIGN1cnNvcyByZWd1bGFyZXMpIHwgRmVtaW5pbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2xpdGVyYXRlX3dpdGhvdXRfcmVndWxhcl9jb3Vyc2VzX3RvdGFsCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQWxmYWJldGl6YWRvIChzZW0gY3Vyc29zIHJlZ3VsYXJlcykgfCBUb3RhbCIJLApsZXZlbF9vZl9lZHVjYXRpb25fZWxlbWVudGFyeV9zY2hvb2xfaW5jb21wbGV0ZV9tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIEZ1bmRhbWVudGFsIEluY29tcGxldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2VsZW1lbnRhcnlfc2Nob29sX2luY29tcGxldGVfZmVtYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIEZ1bmRhbWVudGFsIEluY29tcGxldG8gfCBGZW1pbmlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fZWxlbWVudGFyeV9zY2hvb2xfaW5jb21wbGV0ZV90b3RhbAk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBGdW5kYW1lbnRhbCBJbmNvbXBsZXRvIHwgVG90YWwiCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2VsZW1lbnRhcnlfc2Nob29sX2NvbXBsZXRlX21hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gRnVuZGFtZW50YWwgQ29tcGxldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2VsZW1lbnRhcnlfc2Nob29sX2NvbXBsZXRlX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBGdW5kYW1lbnRhbCBDb21wbGV0byB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9lbGVtZW50YXJ5X3NjaG9vbF9jb21wbGV0ZV90b3RhbAk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBGdW5kYW1lbnRhbCBDb21wbGV0byB8IFRvdGFsIgksCmxldmVsX29mX2VkdWNhdGlvbl9oaWdoX3NjaG9vbF9pbmNvbXBsZXRlX21hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gTcOpZGlvIEluY29tcGxldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2hpZ2hfc2Nob29sX2luY29tcGxldGVfZmVtYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIE3DqWRpbyBJbmNvbXBsZXRvIHwgRmVtaW5pbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2hpZ2hfc2Nob29sX2luY29tcGxldGVfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gTcOpZGlvIEluY29tcGxldG8gfCBUb3RhbCIJLApsZXZlbF9vZl9lZHVjYXRpb25faGlnaF9zY2hvb2xfY29tcGxldGVfbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBNw6lkaW8gQ29tcGxldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2hpZ2hfc2Nob29sX2NvbXBsZXRlX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBNw6lkaW8gQ29tcGxldG8gfCBGZW1pbmlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25faGlnaF9zY2hvb2xfY29tcGxldGVfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gTcOpZGlvIENvbXBsZXRvIHwgVG90YWwiCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2NvbGxlZ2Vfb3JfdW5pdmVyc2l0eV9pbmNvbXBsZXRlX21hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gU3VwZXJpb3IgSW5jb21wbGV0byB8IE1hc2N1bGlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fY29sbGVnZV9vcl91bml2ZXJzaXR5X2luY29tcGxldGVfZmVtYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIFN1cGVyaW9yIEluY29tcGxldG8gfCBGZW1pbmlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fY29sbGVnZV9vcl91bml2ZXJzaXR5X2luY29tcGxldGVfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gU3VwZXJpb3IgSW5jb21wbGV0byB8IFRvdGFsIgksCmxldmVsX29mX2VkdWNhdGlvbl9jb2xsZWdlX29yX3VuaXZlcnNpdHlfY29tcGxldGVfbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBTdXBlcmlvciBDb21wbGV0byB8IE1hc2N1bGlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fY29sbGVnZV9vcl91bml2ZXJzaXR5X2NvbXBsZXRlX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBTdXBlcmlvciBDb21wbGV0byB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9jb2xsZWdlX29yX3VuaXZlcnNpdHlfY29tcGxldGVfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gU3VwZXJpb3IgQ29tcGxldG8gfCBUb3RhbCIJLApsZXZlbF9vZl9lZHVjYXRpb25fZWR1Y2F0aW9uX2Fib3ZlX2NvbGxlZ2Vfb3JfdW5pdmVyc2l0eV9jb21wbGV0ZV9tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIGFjaW1hIGRlIFN1cGVyaW9yIENvbXBsZXRvIHwgTWFzY3VsaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9lZHVjYXRpb25fYWJvdmVfY29sbGVnZV9vcl91bml2ZXJzaXR5X2NvbXBsZXRlX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBhY2ltYSBkZSBTdXBlcmlvciBDb21wbGV0byB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9lZHVjYXRpb25fYWJvdmVfY29sbGVnZV9vcl91bml2ZXJzaXR5X2NvbXBsZXRlX3RvdGFsCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIGFjaW1hIGRlIFN1cGVyaW9yIENvbXBsZXRvIHwgVG90YWwiCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX25vdF9pbmZvcm1lZF9tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgTsOjbyBJbmZvcm1hZG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX25vdF9pbmZvcm1lZF9mZW1hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBOw6NvIEluZm9ybWFkbyB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9ub3RfaW5mb3JtZWRfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBOw6NvIEluZm9ybWFkbyB8IFRvdGFsIgksCmxldmVsX29mX2VkdWNhdGlvbl9tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgTWFzY3VsaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9mZW1hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBGZW1pbmlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBUb3RhbCIJLAp0aW1lX29mX3NlbnRlbmNlX3VwX3RvXzZfbW9udGhzX21hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgQXTDqSA2IG1lc2VzIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfb2Zfc2VudGVuY2VfdXBfdG9fNl9tb250aHNfZmVtYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IEF0w6kgNiBtZXNlcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl82X21vbnRoc191cF90b18xX3llYXJfbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDYgbWVzZXMgYXTDqSAxIGFubyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfNl9tb250aHNfdXBfdG9fMV95ZWFyX2ZlbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDYgbWVzZXMgYXTDqSAxIGFubyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl8xX3llYXJfdXBfdG9fMl95ZWFyc19tYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMSBhbm8gYXTDqSAyIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzFfeWVhcl91cF90b18yX3llYXJzX2ZlbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDEgYW5vIGF0w6kgMiBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzJfdXBfdG9fNF95ZWFyc19tYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMiBhdMOpIDQgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfMl91cF90b180X3llYXJzX2ZlbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDIgYXTDqSA0IGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfNF91cF90b184X3llYXJzX21hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA0IGF0w6kgOCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl80X3VwX3RvXzhfeWVhcnNfZmVtYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgNCBhdMOpIDggYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl84X3VwX3RvXzE1X3llYXJzX21hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA4IGF0w6kgMTUgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfOF91cF90b18xNV95ZWFyc19mZW1hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA4IGF0w6kgMTUgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl8xNV91cF90b18yMF95ZWFyc19tYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMTUgYXTDqSAyMCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl8xNV91cF90b18yMF95ZWFyc19mZW1hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAxNSBhdMOpIDIwIGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfMjBfdXBfdG9fMzBfeWVhcnNfbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDIwIGF0w6kgMzAgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfMjBfdXBfdG9fMzBfeWVhcnNfZmVtYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMjAgYXTDqSAzMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzMwX3VwX3RvXzUwX3llYXJzX21hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAzMCBhdMOpIDUwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzMwX3VwX3RvXzUwX3llYXJzX2ZlbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDMwIGF0w6kgNTAgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl81MF91cF90b18xMDBfeWVhcnNfbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDUwIGF0w6kgMTAwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzUwX3VwX3RvXzEwMF95ZWFyc19mZW1hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA1MCBhdMOpIDEwMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzEwMF95ZWFyc19tYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMTAwIGFub3MgfCBNYXNjdWxpbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzEwMF95ZWFyc19mZW1hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAxMDAgYW5vcyB8IEZlbWluaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX3VwX3RvXzZfbW9udGhzX21hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBBdMOpIDYgbWVzZXMgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2VfdXBfdG9fNl9tb250aHNfZmVtYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgQXTDqSA2IG1lc2VzIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl82X21vbnRoc191cF90b18xX3llYXJfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNiBtZXNlcyBhdMOpIDEgYW5vIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfNl9tb250aHNfdXBfdG9fMV95ZWFyX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNiBtZXNlcyBhdMOpIDEgYW5vIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8xX3VwX3RvXzJfeWVhcnNfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMSBhbm8gYXTDqSAyIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8xX3VwX3RvXzJfeWVhcnNfZmVtYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAxIGFubyBhdMOpIDIgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMl91cF90b180X3llYXJzX21hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDIgYXTDqSA0IGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8yX3VwX3RvXzRfeWVhcnNfZmVtYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAyIGF0w6kgNCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl80X3VwX3RvXzhfeWVhcnNfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNCBhdMOpIDggYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzRfdXBfdG9fOF95ZWFyc19mZW1hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDQgYXTDqSA4IGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzhfdXBfdG9fMTVfeWVhcnNfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgOCBhdMOpIDE1IGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl84X3VwX3RvXzE1X3llYXJzX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgOCBhdMOpIDE1IGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzE1X3VwX3RvXzIwX3llYXJzX21hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDE1IGF0w6kgMjAgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzE1X3VwX3RvXzIwX3llYXJzX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMTUgYXTDqSAyMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8yMF91cF90b18zMF95ZWFyc19tYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAyMCBhdMOpIDMwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8yMF91cF90b18zMF95ZWFyc19mZW1hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDIwIGF0w6kgMzAgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMzBfdXBfdG9fNTBfeWVhcnNfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMzAgYXTDqSA1MCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMzBfdXBfdG9fNTBfeWVhcnNfZmVtYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAzMCBhdMOpIDUwIGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzUwX3VwX3RvXzEwMF95ZWFyc19tYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSA1MCBhdMOpIDEwMCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfNTBfdXBfdG9fMTAwX3llYXJzX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNTAgYXTDqSAxMDAgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMTAwX3llYXJzX21hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDEwMCBhbm9zIHwgTWFzY3VsaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMTAwX3llYXJzX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMTAwIGFub3MgfCBGZW1pbmlubyIJLApjcmltZV9ob21pY2lkZV9zaW1wbGVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBIb21pY8OtZGlvIHNpbXBsZXMgKEFydC4gMTIxLCBjYXB1dCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfaG9taWNpZGVfc2ltcGxlX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBIb21pY8OtZGlvIHNpbXBsZXMgKEFydC4gMTIxLCBjYXB1dCkgfCBGZW1pbmlubyIJLApjcmltZV9ob21pY2lkZV9zaW1wbGVfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWRpbyBzaW1wbGVzIChBcnQuIDEyMSwgY2FwdXQpIHwgVG90YWwiCSwKY3JpbWVfbWFuc2xhdWdodGVyX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWxpbyBjdWxwb3NvIChBcnQuIDEyMSwgwqcgM8KwKSB8IE1hc2N1bGlubyIJLApjcmltZV9tYW5zbGF1Z2h0ZXJfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IEhvbWljw61saW8gY3VscG9zbyAoQXJ0LiAxMjEsIMKnIDPCsCkgfCBGZW1pbmlubyIJLApjcmltZV9tYW5zbGF1Z2h0ZXJfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWxpbyBjdWxwb3NvIChBcnQuIDEyMSwgwqcgM8KwKSB8IFRvdGFsIgksCmNyaW1lX2hvbWljaWRlX3F1YWxpZmllZF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IEhvbWljw61kaW8gcXVhbGlmaWNhZG8gKEFydC4gMTIxLCDCpyAywrApIHwgTWFzY3VsaW5vIgksCmNyaW1lX2hvbWljaWRlX3F1YWxpZmllZF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWRpbyBxdWFsaWZpY2FkbyAoQXJ0LiAxMjEsIMKnIDLCsCkgfCBGZW1pbmlubyIJLApjcmltZV9ob21pY2lkZV9xdWFsaWZpZWRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWRpbyBxdWFsaWZpY2FkbyAoQXJ0LiAxMjEsIMKnIDLCsCkgfCBUb3RhbCIJLApjcmltZV9hYm9ydGlvbl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IEFib3J0byAoQXJ0LiAxMjQsIDEyNSwgMTI2IGUgMTI3KSB8IE1hc2N1bGlubyIJLApjcmltZV9hYm9ydGlvbl9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgQWJvcnRvIChBcnQuIDEyNCwgMTI1LCAxMjYgZSAxMjcpIHwgRmVtaW5pbm8iCSwKY3JpbWVfYWJvcnRpb25fdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgQWJvcnRvIChBcnQuIDEyNCwgMTI1LCAxMjYgZSAxMjcpIHwgVG90YWwiCSwKY3JpbWVfYm9keV9pbmp1cnlfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBMZXPDo28gY29ycG9yYWwgKEFydC4gMTI5LCBjYXB1dCBlIMKnIDHCsCwgMsKwLCAzwrAgZSA2wrApIHwgTWFzY3VsaW5vIgksCmNyaW1lX2JvZHlfaW5qdXJ5X2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBMZXPDo28gY29ycG9yYWwgKEFydC4gMTI5LCBjYXB1dCBlIMKnIDHCsCwgMsKwLCAzwrAgZSA2wrApIHwgRmVtaW5pbm8iCSwKY3JpbWVfYm9keV9pbmp1cnlfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgTGVzw6NvIGNvcnBvcmFsIChBcnQuIDEyOSwgY2FwdXQgZSDCpyAxwrAsIDLCsCwgM8KwIGUgNsKwKSB8IFRvdGFsIgksCmNyaW1lX2RvbWVzdGljX3Zpb2xlbmNlX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgVmlvbMOqbmNpYSBkb23DqXN0aWNhIChBcnQuIDEyOSwgIMKnIDnCsCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfZG9tZXN0aWNfdmlvbGVuY2VfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IFZpb2zDqm5jaWEgZG9tw6lzdGljYSAoQXJ0LiAxMjksICDCpyA5wrApIHwgRmVtaW5pbm8iCSwKY3JpbWVfZG9tZXN0aWNfdmlvbGVuY2VfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgVmlvbMOqbmNpYSBkb23DqXN0aWNhIChBcnQuIDEyOSwgIMKnIDnCsCkgfCBUb3RhbCIJLApjcmltZV9raWRuYXBwaW5nX2FuZF9wcml2YXRlX2ltcHJpc29ubWVudF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IFNlcXVlc3RybyBlIGPDoXJjZXJlIHByaXZhZG8gKEFydC4gMTQ4KSB8IE1hc2N1bGlubyIJLApjcmltZV9raWRuYXBwaW5nX2FuZF9wcml2YXRlX2ltcHJpc29ubWVudF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgU2VxdWVzdHJvIGUgY8OhcmNlcmUgcHJpdmFkbyAoQXJ0LiAxNDgpIHwgRmVtaW5pbm8iCSwKY3JpbWVfa2lkbmFwcGluZ19hbmRfcHJpdmF0ZV9pbXByaXNvbm1lbnRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgU2VxdWVzdHJvIGUgY8OhcmNlcmUgcHJpdmFkbyAoQXJ0LiAxNDgpIHwgVG90YWwiCSwKY3JpbWVfb3RoZXJfbm90X2xpc3RlZF9hYm92ZV9hbW9uZ19hcnRpY2xlc18xMjJfYW5kXzE1NF9hX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDEyMiBlIDE1NC1BIHwgTWFzY3VsaW5vIgksCmNyaW1lX290aGVyX25vdF9saXN0ZWRfYWJvdmVfYW1vbmdfYXJ0aWNsZXNfMTIyX2FuZF8xNTRfYV9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDEyMiBlIDE1NC1BIHwgRmVtaW5pbm8iCSwKY3JpbWVfb3RoZXJzX25vdF9saXN0ZWRfYWJvdmVfYW1vbmdfYXJ0aWNsZXNfMTIyX2FuZF8xNTRfYV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBPdXRyb3MgLSBuw6NvIGxpc3RhZG9zIGFjaW1hIGVudHJlIG9zIGFydGlnb3MgMTIyIGUgMTU0LUEgfCBUb3RhbCIJLApjcmltZV90aGVmdF9zaW1wbGVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHNpbXBsZXMgKEFydC4gMTU1KSB8IE1hc2N1bGlubyIJLApjcmltZV90aGVmdF9zaW1wbGVfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRnVydG8gc2ltcGxlcyAoQXJ0LiAxNTUpIHwgRmVtaW5pbm8iCSwKY3JpbWVfdGhlZnRfc2ltcGxlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRnVydG8gc2ltcGxlcyAoQXJ0LiAxNTUpIHwgVG90YWwiCSwKY3JpbWVfdGhlZnRfcXVhbGlmaWVkX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBGdXJ0byBxdWFsaWZpY2FkbyAoQXJ0LiAxNTUsIMKnIDTCsCBlIDXCsCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfdGhlZnRfcXVhbGlmaWVkX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHF1YWxpZmljYWRvIChBcnQuIDE1NSwgwqcgNMKwIGUgNcKwKSB8IEZlbWluaW5vIgksCmNyaW1lX3RoZWZ0X3F1YWxpZmllZF90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHF1YWxpZmljYWRvIChBcnQuIDE1NSwgwqcgNMKwIGUgNcKwKSB8IFRvdGFsIgksCmNyaW1lX3JvYmJlcnlfc2ltcGxlX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSb3VibyBzaW1wbGVzIChBcnQuIDE1NykgfCBNYXNjdWxpbm8iCSwKY3JpbWVfcm9iYmVyeV9zaW1wbGVfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUm91Ym8gc2ltcGxlcyAoQXJ0LiAxNTcpIHwgRmVtaW5pbm8iCSwKY3JpbWVfcm9iYmVyeV9zaW1wbGVfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSb3VibyBzaW1wbGVzIChBcnQuIDE1NykgfCBUb3RhbCIJLApjcmltZV9yb2JiZXJ5X3F1YWxpZmllZF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUm91Ym8gcXVhbGlmaWNhZG8gKEFydC4gMTU3LCDCpyAywrAgfCBNYXNjdWxpbm8iCSwKY3JpbWVfcm9iYmVyeV9xdWFsaWZpZWRfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUm91Ym8gcXVhbGlmaWNhZG8gKEFydC4gMTU3LCDCpyAywrAgfCBGZW1pbmlubyIJLApjcmltZV9yb2JiZXJ5X3F1YWxpZmllZF90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJvdWJvIHF1YWxpZmljYWRvIChBcnQuIDE1NywgwqcgMsKwIHwgVG90YWwiCSwKY3JpbWVfZmVsb255X211cmRlcl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgTGF0cm9jw61uaW8gKEFydC4gMTU3LCDCpyAzwrApIHwgTWFzY3VsaW5vIgksCmNyaW1lX2ZlbG9ueV9tdXJkZXJfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgTGF0cm9jw61uaW8gKEFydC4gMTU3LCDCpyAzwrApIHwgRmVtaW5pbm8iCSwKY3JpbWVfZmVsb255X211cmRlcl90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IExhdHJvY8OtbmlvIChBcnQuIDE1NywgwqcgM8KwKSB8IFRvdGFsIgksCmNyaW1lX2V4dG9ydGlvbl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXh0b3Jzw6NvIChBcnQuIDE1OCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfZXh0b3J0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEV4dG9yc8OjbyAoQXJ0LiAxNTgpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZXh0b3J0aW9uX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXh0b3Jzw6NvIChBcnQuIDE1OCkgfCBUb3RhbCIJLApjcmltZV9leHRvcnRpb25fdGhyb3VnaF9raWRuYXBwaW5nX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFeHRvcnPDo28gbWVkaWFudGUgc2VxdWVzdHJvIChBcnQuIDE1OSkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfZXh0b3J0aW9uX3Rocm91Z2hfa2lkbmFwcGluZ19mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFeHRvcnPDo28gbWVkaWFudGUgc2VxdWVzdHJvIChBcnQuIDE1OSkgfCBGZW1pbmlubyIJLApjcmltZV9leHRvcnRpb25fdGhyb3VnaF9raWRuYXBwaW5nX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXh0b3Jzw6NvIG1lZGlhbnRlIHNlcXVlc3RybyAoQXJ0LiAxNTkpIHwgVG90YWwiCSwKY3JpbWVfbWlzYXBwcm9wcmlhdGlvbl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgQXByb3ByaWHDp8OjbyBpbmTDqWJpdGEgKEFydC4gMTY4KSB8IE1hc2N1bGlubyIJLApjcmltZV9taXNhcHByb3ByaWF0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIChBcnQuIDE2OCkgfCBGZW1pbmlubyIJLApjcmltZV9taXNhcHByb3ByaWF0aW9uX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgQXByb3ByaWHDp8OjbyBpbmTDqWJpdGEgKEFydC4gMTY4KSB8IFRvdGFsIgksCmNyaW1lX21pc2FwcHJvcHJpYXRpb25fc29jaWFsX3NlY3VyaXR5X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBBcHJvcHJpYcOnw6NvIGluZMOpYml0YSBwcmV2aWRlbmNpw6FyaWEgKEFydC4gMTY4LUEpIHwgTWFzY3VsaW5vIgksCmNyaW1lX21pc2FwcHJvcHJpYXRpb25fc29jaWFsX3NlY3VyaXR5X2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIHByZXZpZGVuY2nDoXJpYSAoQXJ0LiAxNjgtQSkgfCBGZW1pbmlubyIJLApjcmltZV9taXNhcHByb3ByaWF0aW9uX3NvY2lhbF9zZWN1cml0eV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIHByZXZpZGVuY2nDoXJpYSAoQXJ0LiAxNjgtQSkgfCBUb3RhbCIJLApjcmltZV9mcmF1ZF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXN0ZWxpb25hdG8gKEFydC4gMTcxKSB8IE1hc2N1bGlubyIJLApjcmltZV9mcmF1ZF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFc3RlbGlvbmF0byAoQXJ0LiAxNzEpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZnJhdWRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFc3RlbGlvbmF0byAoQXJ0LiAxNzEpIHwgVG90YWwiCSwKY3JpbWVfcmVjZWl2aW5nX3N0b2xlbl9wcm9wZXJ0eV9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUmVjZXB0YcOnw6NvIChBcnQuIDE4MCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfcmVjZWl2aW5nX3N0b2xlbl9wcm9wZXJ0eV9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSZWNlcHRhw6fDo28gKEFydC4gMTgwKSB8IEZlbWluaW5vIgksCmNyaW1lX3JlY2VpdmluZ19zdG9sZW5fcHJvcGVydHlfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSZWNlcHRhw6fDo28gKEFydC4gMTgwKSB8IFRvdGFsIgksCmNyaW1lX3F1YWxpZmllZF9yZWNlaXZpbmdfc3RvbGVuX3Byb3BlcnR5X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSZWNlcHRhw6fDo28gcXVhbGlmaWNhZGEgKEFydC4gMTgwLCDCpyAxwrApIHwgTWFzY3VsaW5vIgksCmNyaW1lX3F1YWxpZmllZF9yZWNlaXZpbmdfc3RvbGVuX3Byb3BlcnR5X2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJlY2VwdGHDp8OjbyBxdWFsaWZpY2FkYSAoQXJ0LiAxODAsIMKnIDHCsCkgfCBGZW1pbmlubyIJLApjcmltZV9xdWFsaWZpZWRfcmVjZWl2aW5nX3N0b2xlbl9wcm9wZXJ0eV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJlY2VwdGHDp8OjbyBxdWFsaWZpY2FkYSAoQXJ0LiAxODAsIMKnIDHCsCkgfCBUb3RhbCIJLApjcmltZV9vdGhlcl9ub3RfbGlzdGVkX2Fib3ZlX2Ftb25nX2FydGljbGVzXzE1Nl9hbmRfMTc5X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBPdXRyb3MgLSBuw6NvIGxpc3RhZG9zIGFjaW1hIGVudHJlIG9zIGFydGlnb3MgMTU2IGUgMTc5IHwgTWFzY3VsaW5vIgksCmNyaW1lX290aGVyX25vdF9saXN0ZWRfYWJvdmVfYW1vbmdfYXJ0aWNsZXNfMTU2X2FuZF8xNzlfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDE1NiBlIDE3OSB8IEZlbWluaW5vIgksCmNyaW1lX290aGVyc19ub3RfbGlzdGVkX2Fib3ZlX2Ftb25nX2FydGljbGVzXzE1Nl9hbmRfMTc5X3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDE1NiBlIDE3OSB8IFRvdGFsIgksCmNyaW1lX3JhcGVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgRXN0dXBybyAoQXJ0LiAyMTMpIHwgTWFzY3VsaW5vIgksCmNyaW1lX3JhcGVfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIChBcnQuIDIxMykgfCBGZW1pbmlubyIJLApjcmltZV9yYXBlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIChBcnQuIDIxMykgfCBUb3RhbCIJLApjcmltZV9pbmRlY2VudF9hc3NhdWx0X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEF0ZW50YWRvIHZpb2xlbnRvIGFvIHB1ZG9yIChBcnQuIDIxNCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfaW5kZWNlbnRfYXNzYXVsdF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEF0ZW50YWRvIHZpb2xlbnRvIGFvIHB1ZG9yIChBcnQuIDIxNCkgfCBGZW1pbmlubyIJLApjcmltZV9pbmRlY2VudF9hc3NhdWx0X3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBBdGVudGFkbyB2aW9sZW50byBhbyBwdWRvciAoQXJ0LiAyMTQpIHwgVG90YWwiCSwKY3JpbWVfcmFwZV9vZl92dWxuZXJhYmxlX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEVzdHVwcm8gZGUgdnVsbmVyw6F2ZWwgKEFydC4gMjE3LUEpIHwgTWFzY3VsaW5vIgksCmNyaW1lX3JhcGVfb2ZfdnVsbmVyYWJsZV9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEVzdHVwcm8gZGUgdnVsbmVyw6F2ZWwgKEFydC4gMjE3LUEpIHwgRmVtaW5pbm8iCSwKY3JpbWVfcmFwZV9vZl92dWxuZXJhYmxlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIGRlIHZ1bG5lcsOhdmVsIChBcnQuIDIxNy1BKSB8IFRvdGFsIgksCmNyaW1lX2NvcnJ1cHRpb25fb2ZfYV9taW5vcl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBDb3JydXDDp8OjbyBkZSBtZW5vcmVzIChBcnQuIDIxOCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfY29ycnVwdGlvbl9vZl9hX21pbm9yX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgQ29ycnVww6fDo28gZGUgbWVub3JlcyAoQXJ0LiAyMTgpIHwgRmVtaW5pbm8iCSwKY3JpbWVfY29ycnVwdGlvbl9vZl9hX21pbm9yX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBDb3JydXDDp8OjbyBkZSBtZW5vcmVzIChBcnQuIDIxOCkgfCBUb3RhbCIJLApjcmltZV9pbnRlcm5hdGlvbmFsX3RyYWZmaWNraW5nX29mX3BlcnNvbl9mb3JfcHVycG9zZV9vZl9zZXh1YWxfZXhwbG9pdGF0aW9uX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgcGVzc29hIHBhcmEgZmltIGRlIGV4cGxvcmHDp8OjbyBzZXh1YWwgKEFydC4gMjMxKSB8IE1hc2N1bGlubyIJLApjcmltZV9pbnRlcm5hdGlvbmFsX3RyYWZmaWNraW5nX29mX3BlcnNvbl9mb3JfcHVycG9zZV9vZl9zZXh1YWxfZXhwbG9pdGF0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBwZXNzb2EgcGFyYSBmaW0gZGUgZXhwbG9yYcOnw6NvIHNleHVhbCAoQXJ0LiAyMzEpIHwgRmVtaW5pbm8iCSwKY3JpbWVfaW50ZXJuYXRpb25hbF90cmFmZmlja2luZ19vZl9wZXJzb25fZm9yX3B1cnBvc2Vfb2Zfc2V4dWFsX2V4cGxvaXRhdGlvbl90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBwZXNzb2EgcGFyYSBmaW0gZGUgZXhwbG9yYcOnw6NvIHNleHVhbCAoQXJ0LiAyMzEpIHwgVG90YWwiCSwKbWFsZWNyaW1lX2ludGVybmFsX3RyYWZmaWNraW5nX29mX3BlcnNvbl9mb3JfcHVycG9zZV9vZl9zZXh1YWxfZXhwbG9pdGF0aW9uX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IFRyw6FmaWNvIGludGVybm8gZGUgcGVzc29hIHBhcmEgZmltIGRlIGV4cGxvcmHDp8OjbyBzZXh1YWwgKEFydC4gMjMxLUEpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2ludGVybmFsX3RyYWZmaWNraW5nX29mX3BlcnNvbl9mb3JfcHVycG9zZV9vZl9zZXh1YWxfZXhwbG9pdGF0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgVHLDoWZpY28gaW50ZXJubyBkZSBwZXNzb2EgcGFyYSBmaW0gZGUgZXhwbG9yYcOnw6NvIHNleHVhbCAoQXJ0LiAyMzEtQSkgfCBGZW1pbmlubyIJLApjcmltZV9pbnRlcm5hbF90cmFmZmlja2luZ19vZl9wZXJzb25fZm9yX3B1cnBvc2Vfb2Zfc2V4dWFsX2V4cGxvaXRhdGlvbl90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgVHLDoWZpY28gaW50ZXJubyBkZSBwZXNzb2EgcGFyYSBmaW0gZGUgZXhwbG9yYcOnw6NvIHNleHVhbCAoQXJ0LiAyMzEtQSkgfCBUb3RhbCIJLApjcmltZV9vdGhlcl9hcnRpY2xlc18yMTVfMjE2X2FfMjE4X2FfMjE4X2JfMjI3XzIyOF8yMjlfMjMwX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IE91dHJvcyAoQXJ0aWdvcyAyMTUsIDIxNi1BLCAyMTgtQSwgMjE4LUIsIDIyNywgMjI4LCAyMjksIDIzMCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfb3RoZXJfYXJ0aWNsZXNfMjE1XzIxNl9hXzIxOF9hXzIxOF9iXzIyN18yMjhfMjI5XzIzMF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IE91dHJvcyAoQXJ0aWdvcyAyMTUsIDIxNi1BLCAyMTgtQSwgMjE4LUIsIDIyNywgMjI4LCAyMjksIDIzMCkgfCBGZW1pbmlubyIJLApjcmltZV9vdGhlcnNfYXJ0aWNsZXNfMjE1XzIxNl9hXzIxOF9hXzIxOF9iXzIyN18yMjhfMjI5XzIzMF90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgT3V0cm9zIChBcnRpZ29zIDIxNSwgMjE2LUEsIDIxOC1BLCAyMTgtQiwgMjI3LCAyMjgsIDIyOSwgMjMwKSB8IFRvdGFsIgksCmNyaW1lX2dhbmdfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwYXogcMO6YmxpY2EgfCBRdWFkcmlsaGEgb3UgYmFuZG8gKEFydC4gMjg4KSB8IE1hc2N1bGlubyIJLApjcmltZV9nYW5nX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwYXogcMO6YmxpY2EgfCBRdWFkcmlsaGEgb3UgYmFuZG8gKEFydC4gMjg4KSB8IEZlbWluaW5vIgksCmNyaW1lX2dhbmdfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGF6IHDDumJsaWNhIHwgUXVhZHJpbGhhIG91IGJhbmRvIChBcnQuIDI4OCkgfCBUb3RhbCIJLApjcmltZV9jb3VudGVyZmVpdF9jdXJyZW5jeV9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IE1vZWRhIGZhbHNhIChBcnQuIDI4OSkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfY291bnRlcmZlaXRfY3VycmVuY3lfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IE1vZWRhIGZhbHNhIChBcnQuIDI4OSkgfCBGZW1pbmlubyIJLApjcmltZV9jb3VudGVyZmVpdF9jdXJyZW5jeV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBNb2VkYSBmYWxzYSAoQXJ0LiAyODkpIHwgVG90YWwiCSwKY3JpbWVfZmFsc2lmaWNhdGlvbl9vZl9wYXBlcnNfc2VhbHNfc2lnbl9hbmRfcHVibGljX2RvY3VtZW50c19tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IEZhbHNpZmljYcOnw6NvIGRlIHBhcMOpaXMsIHNlbG9zLCBzaW5hbCBlIGRvY3VtZW50b3MgcMO6YmxpY29zICggQXJ0LiAyOTMgYSAyOTcpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2ZhbHNpZmljYXRpb25fb2ZfcGFwZXJzX3NlYWxzX3NpZ25fYW5kX3B1YmxpY19kb2N1bWVudHNfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IEZhbHNpZmljYcOnw6NvIGRlIHBhcMOpaXMsIHNlbG9zLCBzaW5hbCBlIGRvY3VtZW50b3MgcMO6YmxpY29zICggQXJ0LiAyOTMgYSAyOTcpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZmFsc2lmaWNhdGlvbl9vZl9wYXBlcnNfc2VhbHNfc2lnbl9hbmRfcHVibGljX2RvY3VtZW50c190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBGYWxzaWZpY2HDp8OjbyBkZSBwYXDDqWlzLCBzZWxvcywgc2luYWwgZSBkb2N1bWVudG9zIHDDumJsaWNvcyAoIEFydC4gMjkzIGEgMjk3KSB8IFRvdGFsIgksCmNyaW1lX2lkZW9sb2dpY2FsX2ZhbHNlaG9vZF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IEZhbHNpZGFkZSBpZGVvbMOzZ2ljYSAoQXJ0LiAyOTkpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2lkZW9sb2dpY2FsX2ZhbHNlaG9vZF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgRmFsc2lkYWRlIGlkZW9sw7NnaWNhIChBcnQuIDI5OSkgfCBGZW1pbmlubyIJLApjcmltZV9pZGVvbG9naWNhbF9mYWxzZWhvb2RfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgRmFsc2lkYWRlIGlkZW9sw7NnaWNhIChBcnQuIDI5OSkgfCBUb3RhbCIJLApjcmltZV91c2Vfb2ZfZmFsc2VfZG9jdW1lbnRfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBVc28gZGUgZG9jdW1lbnRvIGZhbHNvIChBcnQuIDMwNCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfdXNlX29mX2ZhbHNlX2RvY3VtZW50X2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBVc28gZGUgZG9jdW1lbnRvIGZhbHNvIChBcnQuIDMwNCkgfCBGZW1pbmlubyIJLApjcmltZV91c2Vfb2ZfZmFsc2VfZG9jdW1lbnRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgVXNvIGRlIGRvY3VtZW50byBmYWxzbyAoQXJ0LiAzMDQpIHwgVG90YWwiCSwKY3JpbWVfZW1iZXp6bGVtZW50X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgUGVjdWxhdG8gKEFydC4gMzEyIGUgMzEzKSB8IE1hc2N1bGlubyIJLApjcmltZV9lbWJlenpsZW1lbnRfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IFBlY3VsYXRvIChBcnQuIDMxMiBlIDMxMykgfCBGZW1pbmlubyIJLApjcmltZV9lbWJlenpsZW1lbnRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgUGVjdWxhdG8gKEFydC4gMzEyIGUgMzEzKSB8IFRvdGFsIgksCmNyaW1lX2NvbmN1c3Npb25fYW5kX2V4Y2Vzc19leGFjdGlvbl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvbmN1c3PDo28gZSBleGNlc3NvIGRlIGV4YcOnw6NvIChBcnQuIDMxNikgfCBNYXNjdWxpbm8iCSwKY3JpbWVfY29uY3Vzc2lvbl9hbmRfZXhjZXNzX2V4YWN0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb25jdXNzw6NvIGUgZXhjZXNzbyBkZSBleGHDp8OjbyAoQXJ0LiAzMTYpIHwgRmVtaW5pbm8iCSwKY3JpbWVfY29uY3Vzc2lvbl9hbmRfZXhjZXNzX2V4YWN0aW9uX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvbmN1c3PDo28gZSBleGNlc3NvIGRlIGV4YcOnw6NvIChBcnQuIDMxNikgfCBUb3RhbCIJLApjcmltZV9wYXNzaXZlX2NvcnJ1cHRpb25fbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb3JydXDDp8OjbyBwYXNzaXZhIChBcnQuIDMxNykgfCBNYXNjdWxpbm8iCSwKY3JpbWVfcGFzc2l2ZV9jb3JydXB0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb3JydXDDp8OjbyBwYXNzaXZhIChBcnQuIDMxNykgfCBGZW1pbmlubyIJLApjcmltZV9wYXNzaXZlX2NvcnJ1cHRpb25fdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29ycnVww6fDo28gcGFzc2l2YSAoQXJ0LiAzMTcpIHwgVG90YWwiCSwKY3JpbWVfYWN0aXZlX2NvcnJ1cHRpb25fbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBwcmF0aWNhZG9zIHBvciBwYXJ0aWN1bGFyIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvcnJ1cMOnw6NvIGF0aXZhIChBcnQuIDMzMykgfCBNYXNjdWxpbm8iCSwKY3JpbWVfYWN0aXZlX2NvcnJ1cHRpb25fZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIHByYXRpY2Fkb3MgcG9yIHBhcnRpY3VsYXIgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29ycnVww6fDo28gYXRpdmEgKEFydC4gMzMzKSB8IEZlbWluaW5vIgksCmNyaW1lX2FjdGl2ZV9jb3JydXB0aW9uX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIHByYXRpY2Fkb3MgcG9yIHBhcnRpY3VsYXIgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29ycnVww6fDo28gYXRpdmEgKEFydC4gMzMzKSB8IFRvdGFsIgksCmNyaW1lX3NtdWdnbGluZ19vcl9taXNhcHByb3ByaWF0aW9uX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgcHJhdGljYWRvcyBwb3IgcGFydGljdWxhciBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb250cmFiYW5kbyBvdSBkZXNjYW1pbmhvIChBcnQuIDMzNCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfc211Z2dsaW5nX29yX21pc2FwcHJvcHJpYXRpb25fZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIHByYXRpY2Fkb3MgcG9yIHBhcnRpY3VsYXIgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29udHJhYmFuZG8gb3UgZGVzY2FtaW5obyAoQXJ0LiAzMzQpIHwgRmVtaW5pbm8iCSwKY3JpbWVfc211Z2dsaW5nX29yX21pc2FwcHJvcHJpYXRpb25fdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgcHJhdGljYWRvcyBwb3IgcGFydGljdWxhciBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb250cmFiYW5kbyBvdSBkZXNjYW1pbmhvIChBcnQuIDMzNCkgfCBUb3RhbCIJLApjcmltZV9kcnVnX3RyYWZmaWNraW5nX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IERyb2dhcyAoTGVpIDYuMzY4Lzc2IGUgTGVpIDExLjM0My8wNikgfCBUcsOhZmljbyBkZSBkcm9nYXMgKEFydC4gMTIgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBkYSBMZWkgMTEuMzQzLzA2KSB8IE1hc2N1bGlubyIJLApjcmltZV9kcnVnX3RyYWZmaWNraW5nX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGRlIGRyb2dhcyAoQXJ0LiAxMiBkYSBMZWkgNi4zNjgvNzYgZSBBcnQuIDMzIGRhIExlaSAxMS4zNDMvMDYpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZHJ1Z190cmFmZmlja2luZ190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGRlIGRyb2dhcyAoQXJ0LiAxMiBkYSBMZWkgNi4zNjgvNzYgZSBBcnQuIDMzIGRhIExlaSAxMS4zNDMvMDYpIHwgVG90YWwiCSwKY3JpbWVfYXNzb2NpYXRpb25fZm9yX3RyYWZmaWNraW5nX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IERyb2dhcyAoTGVpIDYuMzY4Lzc2IGUgTGVpIDExLjM0My8wNikgfCBBc3NvY2lhw6fDo28gcGFyYSBvIHRyw6FmaWNvIChBcnQuIDE0IGRhIExlaSA2LjM2OC83NiBlIEFydC4gMzUgZGEgTGVpIDExLjM0My8wNikgfCBNYXNjdWxpbm8iCSwKY3JpbWVfYXNzb2NpYXRpb25fZm9yX3RyYWZmaWNraW5nX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IEFzc29jaWHDp8OjbyBwYXJhIG8gdHLDoWZpY28gKEFydC4gMTQgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzNSBkYSBMZWkgMTEuMzQzLzA2KSB8IEZlbWluaW5vIgksCmNyaW1lX2Fzc29jaWF0aW9uX2Zvcl90cmFmZmlja2luZ190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IEFzc29jaWHDp8OjbyBwYXJhIG8gdHLDoWZpY28gKEFydC4gMTQgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzNSBkYSBMZWkgMTEuMzQzLzA2KSB8IFRvdGFsIgksCmNyaW1lX2ludGVybmF0aW9uYWxfZHJ1Z190cmFmZmlja2luZ19tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBEcm9nYXMgKExlaSA2LjM2OC83NiBlIExlaSAxMS4zNDMvMDYpIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBkcm9nYXMgKEFydC4gMTggZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBlIDQwLCBpbmNpc28gSSBkYSBMZWkgMTEuMzQzLzA2KSB8IE1hc2N1bGlubyIJLApjcmltZV9pbnRlcm5hdGlvbmFsX2RydWdfdHJhZmZpY2tpbmdfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBEcm9nYXMgKExlaSA2LjM2OC83NiBlIExlaSAxMS4zNDMvMDYpIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBkcm9nYXMgKEFydC4gMTggZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBlIDQwLCBpbmNpc28gSSBkYSBMZWkgMTEuMzQzLzA2KSB8IEZlbWluaW5vIgksCmNyaW1lX2ludGVybmF0aW9uYWxfZHJ1Z190cmFmZmlja2luZ190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgZHJvZ2FzIChBcnQuIDE4IGRhIExlaSA2LjM2OC83NiBlIEFydC4gMzMgZSA0MCwgaW5jaXNvIEkgZGEgTGVpIDExLjM0My8wNikgfCBUb3RhbCIJLApjcmltZV9pbGxlZ2FsX2NhcnJ5aW5nX2FfZmlyZWFybV9wZXJtaXR0ZWRfdG9fdXNlX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBQb3J0ZSBpbGVnYWwgZGUgYXJtYSBkZSBmb2dvIGRlIHVzbyBwZXJtaXRpZG8gKEFydC4gMTQpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2lsbGVnYWxfY2FycnlpbmdfYV9maXJlYXJtX3Blcm1pdHRlZF90b191c2VfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcGVybWl0aWRvIChBcnQuIDE0KSB8IEZlbWluaW5vIgksCmNyaW1lX2lsbGVnYWxfY2Fycnlpbmdfb2ZfZmlyZWFybV9wZXJtaXR0ZWRfdG9fdXNlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcGVybWl0aWRvIChBcnQuIDE0KSB8IFRvdGFsIgksCmNyaW1lX2ZpcmVfZ3VuX3Nob290aW5nX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBEaXNwYXJvIGRlIGFybWEgZGUgZm9nbyAoQXJ0LiAxNSkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfZmlyZV9ndW5fc2hvb3RpbmdfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgRGlzcGFybyBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTUpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZmlyZV9ndW5fc2hvb3RpbmdfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBEaXNwYXJvIGRlIGFybWEgZGUgZm9nbyAoQXJ0LiAxNSkgfCBUb3RhbCIJLApjcmltZV9wb3NzZXNzaW9uX29yX2lsbGVnYWxfcG9ydF9vZl9maXJlYXJtX3dpdGhfcmVzdHJpY3RlZF91c2VfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFBvc3NlIG91IHBvcnRlIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gZGUgdXNvIHJlc3RyaXRvIChBcnQuIDE2KSB8IE1hc2N1bGlubyIJLApjcmltZV9wb3NzZXNzaW9uX29yX2lsbGVnYWxfcG9ydF9vZl9maXJlYXJtX3dpdGhfcmVzdHJpY3RlZF91c2VfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9zc2Ugb3UgcG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcmVzdHJpdG8gKEFydC4gMTYpIHwgRmVtaW5pbm8iCSwKY3JpbWVfcG9zc2Vzc2lvbl9vcl9pbGxlZ2FsX3BvcnRfb2ZfZmlyZWFybV93aXRoX3Jlc3RyaWN0ZWRfdXNlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9zc2Ugb3UgcG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcmVzdHJpdG8gKEFydC4gMTYpIHwgVG90YWwiCSwKY3JpbWVfaWxsZWdhbF90cmFkZV9vZl9maXJlYXJtc19tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgQ29tw6lyY2lvIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTcpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2lsbGVnYWxfdHJhZGVfb2ZfZmlyZWFybXNfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgQ29tw6lyY2lvIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTcpIHwgRmVtaW5pbm8iCSwKY3JpbWVfaWxsZWdhbF90cmFkZV9vZl9maXJlYXJtc190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IENvbcOpcmNpbyBpbGVnYWwgZGUgYXJtYSBkZSBmb2dvIChBcnQuIDE3KSB8IFRvdGFsIgksCmNyaW1lX2ludGVybmF0aW9uYWxfdHJhZmZpY2tpbmdfb2ZfZmlyZWFybXNfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgYXJtYSBkZSBmb2dvIChBcnQuIDE4KSB8IE1hc2N1bGlubyIJLApjcmltZV9pbnRlcm5hdGlvbmFsX3RyYWZmaWNraW5nX29mX2ZpcmVhcm1zX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgYXJtYSBkZSBmb2dvIChBcnQuIDE4KSB8IEZlbWluaW5vIgksCmNyaW1lX2ludGVybmF0aW9uYWxfdHJhZmZpY2tpbmdfb2ZfZmlyZWFybXNfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBUcsOhZmljbyBpbnRlcm5hY2lvbmFsIGRlIGFybWEgZGUgZm9nbyAoQXJ0LiAxOCkgfCBUb3RhbCIJLApjcmltZV9tYW5zbGF1Z2h0ZXJfYnlfZHJpdmluZ19hX21vdG9yX3ZlaGljbGVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogQ3JpbWVzIGRlIFRyw6Juc2l0byAoTGVpIDkuNTAzLCBkZSAyMy8wOS8xOTk3KSB8IEhvbWljw61kaW8gY3VscG9zbyBuYSBjb25kdcOnw6NvIGRlIHZlw61jdWxvIGF1dG9tb3RvciAoQXJ0LiAzMDIpIHwgTWFzY3VsaW5vIgksCmNyaW1lX21hbnNsYXVnaHRlcl9ieV9kcml2aW5nX2FfbW90b3JfdmVoaWNsZV9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IENyaW1lcyBkZSBUcsOibnNpdG8gKExlaSA5LjUwMywgZGUgMjMvMDkvMTk5NykgfCBIb21pY8OtZGlvIGN1bHBvc28gbmEgY29uZHXDp8OjbyBkZSB2ZcOtY3VsbyBhdXRvbW90b3IgKEFydC4gMzAyKSB8IEZlbWluaW5vIgksCmNyaW1lX21hbnNsYXVnaHRlcl9ieV9kcml2aW5nX2FfbW90b3JfdmVoaWNsZV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogQ3JpbWVzIGRlIFRyw6Juc2l0byAoTGVpIDkuNTAzLCBkZSAyMy8wOS8xOTk3KSB8IEhvbWljw61kaW8gY3VscG9zbyBuYSBjb25kdcOnw6NvIGRlIHZlw61jdWxvIGF1dG9tb3RvciAoQXJ0LiAzMDIpIHwgVG90YWwiCSwKY3JpbWVfb3RoZXJfYXJ0aWNsZV8zMDNfYV8zMTJfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgT3V0cm9zIChBcnQuIDMwMyBhIDMxMikgfCBNYXNjdWxpbm8iCSwKY3JpbWVfb3RoZXJfYXJ0aWNsZV8zMDNfYV8zMTJfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBPdXRyb3MgKEFydC4gMzAzIGEgMzEyKSB8IEZlbWluaW5vIgksCmNyaW1lX290aGVyX2FydGljbGVfMzAzX2FfMzEyX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBPdXRyb3MgKEFydC4gMzAzIGEgMzEyKSB8IFRvdGFsIgksCmNyaW1lX3N0YXR1dGVfb2ZfdGhlX2NoaWxkX2FuZF9hZG9sZXNjZW50X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IEVzdGF0dXRvIGRhIENyaWFuw6dhIGUgZG8gQWRvbGVzY2VudGUgKExlaSA4LjA2OSwgZGUgMTMvMDEvMTk5MCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfc3RhdHV0ZV9vZl90aGVfY2hpbGRfYW5kX2Fkb2xlc2NlbnRfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBFc3RhdHV0byBkYSBDcmlhbsOnYSBlIGRvIEFkb2xlc2NlbnRlIChMZWkgOC4wNjksIGRlIDEzLzAxLzE5OTApIHwgRmVtaW5pbm8iCSwKY3JpbWVfc3RhdHV0ZV9vZl90aGVfY2hpbGRfYW5kX2Fkb2xlc2NlbnRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IEVzdGF0dXRvIGRhIENyaWFuw6dhIGUgZG8gQWRvbGVzY2VudGUgKExlaSA4LjA2OSwgZGUgMTMvMDEvMTk5MCkgfCBUb3RhbCIJLApjcmltZV9nZW5vY2lkZV9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBHZW5vY8OtZGlvIChMZWkgMi44ODksIGRlIDAxLzEwLzE5NTYpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2dlbm9jaWRlX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgR2Vub2PDrWRpbyAoTGVpIDIuODg5LCBkZSAwMS8xMC8xOTU2KSB8IEZlbWluaW5vIgksCmNyaW1lX2dlbm9jaWRlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBHZW5vY8OtZGlvIChMZWkgMi44ODksIGRlIDAxLzEwLzE5NTYpIHwgVG90YWwiCSwKY3JpbWVfY3JpbWVzX29mX3RvcnR1cmVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgQ3JpbWVzIGRlIHRvcnR1cmEgKExlaSA5LjQ1NSwgZGUgMDcvMDQvMTk5NykgfCBNYXNjdWxpbm8iCSwKY3JpbWVfY3JpbWVzX29mX3RvcnR1cmVfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgZGUgdG9ydHVyYSAoTGVpIDkuNDU1LCBkZSAwNy8wNC8xOTk3KSB8IEZlbWluaW5vIgksCmNyaW1lX2NyaW1lc19vZl90b3J0dXJlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgZGUgdG9ydHVyYSAoTGVpIDkuNDU1LCBkZSAwNy8wNC8xOTk3KSB8IFRvdGFsIgksCmNyaW1lX2NyaW1lc19hZ2FpbnN0X3RoZV9lbnZpcm9ubWVudF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgY29udHJhIG8gTWVpbyBBbWJpZW50ZSAoTGVpIDkuNjA1LCBkZSAxMi8wMi8xOTk4KSB8IE1hc2N1bGlubyIJLApjcmltZV9jcmltZXNfYWdhaW5zdF90aGVfZW52aXJvbm1lbnRfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgY29udHJhIG8gTWVpbyBBbWJpZW50ZSAoTGVpIDkuNjA1LCBkZSAxMi8wMi8xOTk4KSB8IEZlbWluaW5vIgksCmNyaW1lX2NyaW1lc19hZ2FpbnN0X3RoZV9lbnZpcm9ubWVudF90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgQ3JpbWVzIGNvbnRyYSBvIE1laW8gQW1iaWVudGUgKExlaSA5LjYwNSwgZGUgMTIvMDIvMTk5OCkgfCBUb3RhbCIJLAp3YWdlX2RvZXNfbm90X3JlY2VpdmVkX21hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBOw6NvIHJlY2ViZSB8IE1hc2N1bGlubyIJLAp3YWdlX2RvZXNfbm90X3JlY2VpdmVfZmVtYWxlCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgTsOjbyByZWNlYmUgfCBGZW1pbmlubyIJLAp3YWdlX2xlc3NfdGhhbl8zXzRfb2ZfdGhlX21vbnRobHlfbWluaW11bV93YWdlX21hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBNZW5vcyBkbyBxdWUgMy80IGRvIHNhbMOhcmlvIG3DrW5pbW8gbWVuc2FsIHwgTWFzY3VsaW5vIgksCndhZ2VfbGVzc190aGFuXzNfNF9vZl90aGVfbW9udGhseV9taW5pbXVtX3dhZ2VfZmVtYWxlCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgTWVub3MgZG8gcXVlIDMvNCBkbyBzYWzDoXJpbyBtw61uaW1vIG1lbnNhbCB8IEZlbWluaW5vIgksCndhZ2VfYmV0d2Vlbl8zXzRfYW5kXzFfbW9udGhseV9taW5pbXVtX3dhZ2VfbWFsZQk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IEVudHJlIDMvNCBlIDEgc2Fsw6FyaW8gbcOtbmltbyBtZW5zYWwgfCBNYXNjdWxpbm8iCSwKd2FnZV9iZXR3ZWVuXzNfNF9hbmRfMV9tb250aGx5X21pbmltdW1fd2FnZV9mZW1hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBFbnRyZSAzLzQgZSAxIHNhbMOhcmlvIG3DrW5pbW8gbWVuc2FsIHwgRmVtaW5pbm8iCSwKd2FnZV9iZXR3ZWVuXzFfYW5kXzJfbW9udGhseV9taW5pbXVtX3dhZ2VzX21hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBFbnRyZSAxIGUgMiBzYWzDoXJpb3MgbcOtbmltb3MgbWVuc2FpcyB8IE1hc2N1bGlubyIJLAp3YWdlX2JldHdlZW5fMV9hbmRfMl9tb250aGx5X21pbmltdW1fd2FnZXNfZmVtYWxlCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgRW50cmUgMSBlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMgfCBGZW1pbmlubyIJLAp3YWdlX292ZXJfMl9tb250aGx5X21pbmltdW1fd2FnZXNfbWFsZQk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IE1haXMgcXVlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMgfCBNYXNjdWxpbm8iCSwKd2FnZV9vdmVyXzJfbW9udGhseV9taW5pbXVtX3dhZ2VzX2ZlbWFsZQk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IE1haXMgcXVlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMgfCBGZW1pbmlubyIJLAp3YWdlX25vX2luZm9ybWF0aW9uX21hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBTZW0gaW5mb3JtYcOnw6NvIHwgTWFzY3VsaW5vIgksCndhZ2Vfbm9faW5mb3JtYXRpb25fZmVtYWxlCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgU2VtIGluZm9ybWHDp8OjbyB8IEZlbWluaW5vIgkpCgpgYGAKCgpMb29wIHRocm91Z2ggSU5GT1BFTiB0YWJsZSBmaWxlcyBhbmQgbGlzdCB0aGVpciBuYW1lcwpgYGB7ciBpbmZvcGVuX2ZpbGVfbmFtZSwgaW5jbHVkZT1GQUxTRX0KaW5mb3Blbl9maWxlX25hbWUgPC0gbGlzdC5maWxlcyhwYXRoID0gIklORk9QRU4vdGFiZWxhcyBleGNlbC8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIioueGxzeCoiKQpgYGAKCk1hdGNoIGRpcmVjdG9yeSB0byBmaWxlIG5hbWUKYGBge3IgZmlsZXNfaW5mb3BlbiB9CmluZm9wZW5fZmlsZXMgPC0gc3RyX2MoIklORk9QRU4vdGFiZWxhcyBleGNlbC8iLGluZm9wZW5fZmlsZV9uYW1lKQpgYGAKCk5hbWUgZWFjaCB2ZWN0b3IgZWxlbWVudApgYGB7ciBuYW1lc30KbmFtZXMoaW5mb3Blbl9maWxlcykgPC0gZ3N1YigiXFwueGxzeCQiLCAiIiwgaW5mb3Blbl9maWxlX25hbWUpCmBgYAoKQXBwbHkgdGhlIHJlYWRfZXhjZWwgZnVuY3Rpb24gdG8gZWFjaCB2ZWN0b3IgZWxlbWVudCwgdGh1cyBpbXBvcnRpbmcgYWxsIGZpbGVzIGF0IG9uY2UKYGBge3IgY3JlYXRlIGluZm9wZW4gdGFibGV9CmluZm9wZW48LSBtYXBfZGYoLnggPSBpbmZvcGVuX2ZpbGVzLCAuZiA9IHJlYWRfZXhjZWwsIC5pZCA9ICJkYXRhIikgJT4lCiAgIHNlbGVjdCgic3RhdGUiID0gIlVGIiwgZGF0ZSA9IGRhdGEsIGFsbF9vZihjb2x1bW5zKSkKYGBgCgojIyBSZWNvZ25pemluZyB0aGUgVGFibGUKCklORk9QRU4gdGFibGVzIHByZXNlbnQgcGFuZWwgZGF0YSwgd2hlcmUgZWFjaCBpbmRpdmlkdWFsIGlzIHJlcHJlc2VudGVkIG1vcmUgdGhhbiBvbmNlLgogIApFYWNoIElORk9QRU4gdGFibGUgY29udGFpbnMgbW9yZSB0aGFuIDEzMDAgY29sdW1ucyBhbmQgYXBwcm94aW1hdGVseSAxNTAwIHJvd3MuCmBgYHtyIGV4YW1wbGUgb2YgYW4gSU5GT1BFTiB0YWJsZSB9Cmp1bl8yMDE3IDwtIHJlYWRfZXhjZWwoIklORk9QRU4vdGFiZWxhcyBleGNlbC9qdW4gMjAxNy54bHN4IikKYGBgCk51bWJlciBvZiBjb2x1bW5zOiBgciBuY29sKGp1bl8yMDE3KWAKTnVtYmVyIG9mIHJvd3M6IGByIG5yb3coanVuXzIwMTcpYAogIApBZnRlciBhbmFseXppbmcgZWFjaCB0YWJsZSwgSSBkZWNpZGVkIHRvIGZpbHRlciBvbmx5IHRoZSBtb3N0IGludGVyZXN0aW5nIGNvbHVtbnMgZm9yIG15IGFuYWx5c2lzIGFuZCB0aGUgcmVzdWx0IHdhcyBhIHRhYmxlIHdpdGggYHIgbnJvdyhpbmZvcGVuKWAgcm93cyBhbmQgYHIgbmNvbChpbmZvcGVuKWAgY29sdW1ucy4KCiMjIFN0YXJ0aW5nIHRvIG1hbmlwdWxhdGUgdGhlIGRhdGFmcmFtZQoKQWZ0ZXIgZ3JvdXBpbmcgYWxsIHRoZSB0YWJsZXMgYW5kIGNob29zaW5nIG9ubHkgdGhlIGNvbHVtbnMgdGhhdCBJJ20gZ29pbmcgdG8gdXNlLCB0aGUgbmV4dCBzdGVwIHdpbGwgYmUgdG8gdHJhbnNmb3JtIHRoZSBmb3JtYXQgZnJvbSB3aWRlIHRvIGxvbmcuIExvbmcgZm9ybWF0IGZhY2lsaXRhdGVzIHNvbWUgbWFuaXB1bGF0aW9ucywgYW5kIHdpZGUgZm9ybWF0IG90aGVycy4gSW4gdGhlIGNvdXJzZSBvZiB0aGlzIGFuYWx5c2lzIEkgd2lsbCB1c2UgYm90aCBmb3JtYXRzLgpgYGB7ciBpbmZvcGVuIGxvbmcgZm9ybWF0fQppbmZvcGVuXzJfbG9uZ19mb3JtYXQgPC1pbmZvcGVuJT4lCiAgIGdhdGhlcih2YXJpYWJsZSAsIHF1YW50aXR5LCAtIGMoc3RhdGUsZGF0ZSkpICU+JQogICBkcm9wX25hKCkKYGBgCgpJIHdpbGwgc3VtbWFyaXplIHRoZSB2YWx1ZXMgc28gdGhhdCB0aGUgcmVwZWF0ZWQgbGluZXMgYXJlIHJlbW92ZWQgYW5kIHRoZSB0b3RhbCBvZiBlYWNoIHZhcmlhYmxlIGlzIG9idGFpbmVkCmBgYHtyIHN1bW1hcml6ZWQgaW5mb3BlbiB0YWJsZX0KaW5mb3Blbl8zX3N1bW1hcnkgPC0gaW5mb3Blbl8yX2xvbmdfZm9ybWF0ICU+JQogICBncm91cF9ieShzdGF0ZSwgZGF0ZSwgdmFyaWFibGUpICU+JQogICBtdXRhdGUoZGF0ZSA9IGdzdWIoImRleiIsICJkZWMiLCBkYXRlKSklPiUgIyMgSSBuZWVkZWQgdG8gdXNlICJkZWMiIHNvIHRoYXQgdGhlIHByb2dyYW0gdW5kZXJzdG9vZCB0aGF0IGl0IHJlZmVycmVkIHRvIHRoZSBtb250aCBvZiBEZWNlbWJlcgogICBzdW1tYXJpc2UocHJpc29uZXJzID0gc3VtKHF1YW50aXR5LCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgbWVyZ2Uoc3RhdGVfcmVnaW9uLCBieSA9ICdzdGF0ZScsIGFsbC54ID0gVFJVRSkKYGBgCgojIyBDcmVhdGUgdGhlIFZhcmlhYmxlcyBJJ20gR29pbmcgdG8gV29yayBXaXRoCgpBZnRlciBzdW1tYXJpemluZyB0aGUgZGF0YSBhbmQgcmVtb3ZpbmcgdGhlICdOQXMnLCBpdCdzIHRpbWUgdG8gc2VwYXJhdGUgdGhlIGRhdGEgaW50byBjb2x1bW5zIHRoYXQgSSB3aWxsIHVzZS4KYGBge3IgaW5mb3BlbiBmaW5hbCB0YWJsZX0KaW5mb3Blbl80IDwtIGluZm9wZW5fM19zdW1tYXJ5ICU+JQogICByb3d3aXNlKCkgJT4lICMjIGRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucywgdG8gYmUgd29ya2VkIGJ5IHJvdyBhbmQgbm90IGNvbHVtbnMKICAgZmlsdGVyKCFzdHJfZGV0ZWN0KHZhcmlhYmxlLCAibm90X2luZm9ybWVkfG5vdF9pbmZvcm1lZHxubyBpbmZvcm1hdGlvbiIpKSU+JSAjIyByZW1vdmUgdmFyaWFibGVzIHRoYXQgd2lsbCBub3QgYmUgbmVlZGVkCiAgIG11dGF0ZSggIyMgaGVyZSBJIHN0YXJ0IHRvIGRlZmluZSB0aGUgY29sdW1ucyB0aGF0IEkgd2lsbCB1c2UuIEkgd2lsbCBleHRyYWN0IHRoZSBuZXcgY29sdW1ucyBmcm9tIHRoZSB2YXJpYWJsZSBjb2x1bW4KICAgICBnZW5kZXIgPSBjYXNlX3doZW4oCiAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCAiKGZlbWFsZSkiKSB+ICJmZW1hbGUiLAogICAgICAgc3RyX2RldGVjdCh2YXJpYWJsZSwgIihtYWxlKSIpIH4gIm1hbGUiLAogICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgIHZhcmlhYmxlID0gZ3N1YigiX21hbGV8X2ZlbWFsZXwiLCAiIiwgdmFyaWFibGUpLCAjIyBhdCB0aGlzIHBvaW50IEkgbmVlZCB0byByZW1vdmUgdGhlIGdlbmRlciBzdHJpbmcgdG8gYXZvaWQgY29uZmxpY3RzIGxhdGVyIGluIHRoZSBjb2RlCiAgICAgZXRobmljaXR5ID0gaWZlbHNlKGdyZXBsKCJldGhuaWNpdHlfIiwgdmFyaWFibGUpLAogICAgICAgICAgICAgICAgICAgIHN1YigiZXRobmljaXR5XyIsICIiLCB2YXJpYWJsZSksIE5BKSwKICAgICBldGhuaWNpdHkgPSBpZl9lbHNlKGV0aG5pY2l0eSA9PSAid2hpdGUiLCAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKGV0aG5pY2l0eSAlaW4lIGMoImJsYWNrIiwgImJyb3duIiksICJibGFjayBvciBicm93biIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSAlaW4lIGMoJ3llbGxvdycsJ2luZGlnZW5vdXMnKSwgJ3llbGxvdyBvciBpbmRpZ2Vub3VzJyxOQSkpKSwKICAgICBsZXZlbF9vZl9lZHVjYXRpb24gPSBpZmVsc2UoZ3JlcGwoImxldmVsX29mX2VkdWNhdGlvbl8iLCB2YXJpYWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKCJsZXZlbF9vZl9lZHVjYXRpb25fIiwiIiwgdmFyaWFibGUpLCBOQSksCiAgICAgd2FnZSA9IGlmZWxzZShncmVwbCgid2FnZV8iLCB2YXJpYWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKCJ3YWdlXyIsIiIsdmFyaWFibGUpLE5BKSwKICAgICBhZ2VfcmFuZ2UgPSBpZmVsc2UoZ3JlcGwoImFnZV9yYW5nZV8iLCB2YXJpYWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YigiYWdlX3JhbmdlXyIsIiIsdmFyaWFibGUpLE5BKSklPiUKICAgbXV0YXRlX2F0KHZhcnMoLXByaXNvbmVycyksIGFzLmZhY3RvcikgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgc2VsZWN0KCJkYXRlIiwicmVnaW9uIiwic3RhdGUiLCAiZ2VuZGVyIiwiZXRobmljaXR5IiwKICAgICAgICAgICJsZXZlbF9vZl9lZHVjYXRpb24iLCAiYWdlX3JhbmdlIiwgIndhZ2UiLCJwcmlzb25lcnMiKSAlPiUgIyMgSSB1c2VkIHNlbGVjdCgpIG9ubHkgYmVjYXVzZSBJIHdvdWxkIGxpa2UgdG8gdmlldyB0aGUgY29sdW1ucyBpbiB0aGF0IG9yZGVyCiAgIGZpbHRlcighaXMubmEoZ2VuZGVyKSkKYGBgCgoKIyMgR2VuZXJhdGlvbiBvZiB0aGUgVGFibGVzCgpSZWdhcmRpbmcgdGhlIHF1YW50aXR5IG9mIHByaXNvbmVycywgdGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB0YWJsZSBiZWNhdXNlIG5vdCBhbGwgZGV0ZW50aW9uIGNlbnRlcnMgYXJlIGFibGUgdG8gY29sbGVjdCBhbGwgZGF0YS4gU28sIHdpdGggdGhlIG90aGVyIHRhYmxlcyBJIHdpbGwgd29yayBvbmx5IHdpdGggdGhlIHBlcmNlbnRhZ2Ugb2YgcHJpc29uZXJzIGluIHJlbGF0aW9uIHRvIHRoZSB0b3RhbCBhbmQgZXh0cmFjdCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIGhlcmUuCgoKIyMjIFRhYmxlIHdpdGggdGhlIHRvdGFsIHByaXNvbiBwb3B1bGF0aW9uCmBgYHtyIHByaXNvbl9wb3B1bGF0aW9uLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwcmlzb25fcG9wdWxhdGlvbiA8LWluZm9wZW5fM19zdW1tYXJ5ICU+JQogICBmaWx0ZXIoc3RyX2RldGVjdCh2YXJpYWJsZSwgInByaXNvbl9wb3B1bGF0aW9uIikpJT4lCiAgIHJvd3dpc2UoKSAlPiUKICAgbXV0YXRlKAogICAgIGdlbmRlciA9IGNhc2Vfd2hlbigKICAgICAgIHN0cl9kZXRlY3QodmFyaWFibGUsICJmZW1hbGUiKSB+ICJmZW1hbGUiLAogICAgICAgc3RyX2RldGVjdCh2YXJpYWJsZSwgIm1hbGUiKSB+ICJtYWxlIiwKICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSkgJT4lCiAgIHNlbGVjdChyZWdpb24sIHN0YXRlLCBkYXRlLCBnZW5kZXIsIHByaXNvbmVycykgJT4lCiAgIGRyb3BfbmEoKSAlPiUKICAgdW5ncm91cCgpCgpwcmlzb25fcG9wdWxhdGlvbl8yX3N1bW1hcnkgPC0gcHJpc29uX3BvcHVsYXRpb24gJT4lCiAgIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGUpIHwgZGF0ZSA9PSAianVuIDIwMTkiKSAlPiUgIyMgYWZ0ZXIgc29tZSBhbmFseXNpcyBJIGRlY2lkZWQgdG8gdXNlIG9ubHkgMSByZWZlcmVuY2UgcGVyIHllYXIsIGluc3RlYWQgb2YgYW4gYXZlcmFnZSBvZiB0aGUgdmFsdWVzLgogICBncm91cF9ieShyZWdpb24sIHN0YXRlLCBkYXRlKSAlPiUKICAgbXV0YXRlKHllYXIgPSBzdHJfcmVwbGFjZShkYXRlLCAiXFxEKihcXGR7NH0pLioiLCAiXFwxIikpICU+JSAjIyByZW1vdmluZyB0aGUgZmlyc3QgNCBjaGFyYWN0ZXJzIGZyb20gdGhlIHZhbHVlcyBpbiBjb2x1bW4gJ3llYXInCiAgIHVuZ3JvdXAoKSAlPiUKICAgZ3JvdXBfYnkoeWVhciwgcmVnaW9uLCBzdGF0ZSkgJT4lCiAgIHN1bW1hcmlzZSh0b3RhbF9wcmlzb25lcnMgPSBzdW0ocHJpc29uZXJzKSkgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgc2VsZWN0KHllYXIsIHJlZ2lvbiwgc3RhdGUsIHRvdGFsX3ByaXNvbmVycykKYGBgCgpJJ2xsIGp1c3QgbGVhdmUgdGhpcyBleGFtcGxlIG9mIGNvZGUsIGJlY2F1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgb3RoZXIgdGFibGVzLCB0aGVyZSBpcyBub3QgbXVjaCBkaWZmZXJlbmNlIGluIHJlbGF0aW9uIHRvIHRoZSBwcm9jZXNzIG9mIHRoaXMgb25lLiBXaGF0IGNhbiBjaGFuZ2UgYXJlIHNvbWUgcHVuY3R1YWwgYWRqdXN0bWVudHMsIGJ1dCBub3RoaW5nIHRoYXQgZGVzZXJ2ZXMgbWVudGlvbi4KYGBgIHtyIENyZWF0aW5nIGFnZSByYW5nZSB0YWJsZX0KaW5mb3Blbl9hZ2VfcmFuZ2UgPC1pbmZvcGVuXzQgJT4lCiAgc2VsZWN0KHJlZ2lvbixzdGF0ZSxkYXRlLGdlbmRlciwgYWdlX3JhbmdlLCBwcmlzb25lcnMpICU+JSAjIyBzZWxlY3QgY29sdW1ucwogIG11dGF0ZShhZ2VfcmFuZ2UgPSBnc3ViKCJfIiwgIiAiLCBhZ2VfcmFuZ2UpKSAlPiUgIyMgcmVtb3ZlIHRoZSAiXyIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCBhbmQgZXhwb3J0IHRvIGNzdgogIG11dGF0ZV9hdCh2YXJzKC1wcmlzb25lcnMpLCBhcy5mYWN0b3IpICU+JSAjIyBjb252ZXJ0IGFsbCBjb2x1bW5zIHRvIGZhY3RvciAtcHJpc29uZXJzCiAgZHJvcF9uYSgpICMjIHJlbW92ZSBOQQoKaW5mb3Blbl9hZ2VfcmFuZ2VfMl9wZXJjZW50YWdlIDwtIGluZm9wZW5fYWdlX3JhbmdlICU+JQogIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGUpIHwgZGF0ZSA9PSAianVuIDIwMTkiKSAlPiUKICBncm91cF9ieShyZWdpb24sIHN0YXRlLCBkYXRlKSAlPiUKICBtdXRhdGUoeWVhciA9IHN0cl9yZXBsYWNlKGRhdGUsICJcXEQqKFxcZHs0fSkuKiIsICJcXDEiKSwKICAgICAgICAgdG90YWxfcHJpc29uZXJzID0gc3VtKHByaXNvbmVycywgbmEucm0gPSBUUlVFKSwgIyB0b3RhbCBzdW0gb2YgcHJpc29uZXJzIGJ5IHJlZ2lvbiwgc3RhdGUsIGdlbmRlciBhbmQgeWVhcgogICAgICAgICBwZXJjZW50YWdlX3ByaXNvbmVycyA9IHJvdW5kKCgocHJpc29uZXJzIC8gdG90YWxfcHJpc29uZXJzKSAqIDEwMCksMiksCiAgICAgICAgIHN0YXRlID0gYXMuZmFjdG9yKHN0YXRlKSwKICAgICAgICAgeWVhciA9IGFzLmNoYXJhY3Rlcih5ZWFyKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCh5ZWFyLCByZWdpb24sIHN0YXRlLCBnZW5kZXIsIGFnZV9yYW5nZSwgcGVyY2VudGFnZV9wcmlzb25lcnMpCgppbmZvcGVuX2FnZV9yYW5nZV8zX2ZpbmFsIDwtIGluZm9wZW5fYWdlX3JhbmdlXzJfcGVyY2VudGFnZSAlPiUKICBsZWZ0X2pvaW4ocHJpc29uX3BvcHVsYXRpb25fMl9zdW1tYXJ5LCBieSA9IGMoInllYXIiLCAicmVnaW9uIiwgInN0YXRlIikpICU+JQogIG11dGF0ZShwcmlzb25lcnMgPSByb3VuZCgoKHBlcmNlbnRhZ2VfcHJpc29uZXJzIC8gMTAwKSAqIHRvdGFsX3ByaXNvbmVycyksIDApKSAlPiUKICBzZWxlY3QoeWVhciwgcmVnaW9uLCBzdGF0ZSwgZ2VuZGVyLCBhZ2VfcmFuZ2UsIHByaXNvbmVycykKCmluZm9wZW5fYWdlX3JhbmdlXzQgPC0gaW5mb3Blbl9hZ2VfcmFuZ2VfM19maW5hbCAlPiUKICBncm91cF9ieSh5ZWFyLCBhZ2VfcmFuZ2UpICU+JQogIHN1bW1hcmlzZShwcmlzb25lcnMgPSBzdW0ocHJpc29uZXJzKSkgJT4lCiAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQpgYGAKCmBgYCB7ciBDcmVhdGluZyB0aGUgb3RoZXIgSU5GT1BFTiB0YWJsZXMsIGluY2x1ZGUgPSBGQUxTRX0KaW5mb3Blbl9ldGhuaWNpdHkgPC0gaW5mb3Blbl80ICU+JQogICBzZWxlY3QocmVnaW9uLHN0YXRlLGRhdGUsZ2VuZGVyLCBldGhuaWNpdHksIHByaXNvbmVycykgJT4lCiAgIG11dGF0ZShldGhuaWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBldGhuaWNpdHkpKSAlPiUKICAgbXV0YXRlX2F0KHZhcnMoLXByaXNvbmVycyksIGFzLmZhY3RvcikgJT4lCiAgIGdyb3VwX2J5KHJlZ2lvbixzdGF0ZSxkYXRlLGdlbmRlciwgZXRobmljaXR5KSAlPiUKICAgc3VtbWFyaXNlKHByaXNvbmVycyA9IHN1bShwcmlzb25lcnMpKSAlPiUKICAgZHJvcF9uYSgpCgppbmZvcGVuX2V0aG5pY2l0eV8yX3BlcmNlbnRhZ2UgPC0gaW5mb3Blbl9ldGhuaWNpdHkgJT4lCiAgIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGUpIHwgZGF0ZSA9PSAianVuIDIwMTkiKSAlPiUKICAgZ3JvdXBfYnkocmVnaW9uLCBzdGF0ZSwgZGF0ZSkgJT4lCiAgIG11dGF0ZSh5ZWFyID0gc3RyX3JlcGxhY2UoZGF0ZSwgIlxcRCooXFxkezR9KS4qIiwgIlxcMSIpLAogICAgICAgICAgdG90YWxfcHJpc29uZXJzID0gc3VtKHByaXNvbmVycywgbmEucm0gPSBUUlVFKSwgIyB0b3RhbCBzdW0gb2YgcHJpc29uZXJzIGJ5IHJlZ2lvbiwgc3RhdGUsIGdlbmRlciBhbmQgeWVhcgogICAgICAgICAgcGVyY2VudGFnZV9wcmlzb25lcnMgPSByb3VuZCgoKHByaXNvbmVycyAvIHRvdGFsX3ByaXNvbmVycykgKiAxMDApLDIpLAogICAgICAgICAgc3RhdGUgPSBhcy5mYWN0b3Ioc3RhdGUpLAogICAgICAgICAgeWVhciA9IGFzLmNoYXJhY3Rlcih5ZWFyKSkgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgc2VsZWN0KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlciwgZXRobmljaXR5LCBwZXJjZW50YWdlX3ByaXNvbmVycykKCmluZm9wZW5fZXRobmljaXR5XzNfZmluYWwgPC0gaW5mb3Blbl9ldGhuaWNpdHlfMl9wZXJjZW50YWdlICU+JQogICBsZWZ0X2pvaW4ocHJpc29uX3BvcHVsYXRpb25fMl9zdW1tYXJ5LCBieSA9IGMoInllYXIiLCAicmVnaW9uIiwgInN0YXRlIikpICU+JQogIGZpbHRlcighc3RyX2RldGVjdChldGhuaWNpdHksInllbGxvdyBvciBpbmRpZ2Vub3VzIikpICU+JSAKICAgbXV0YXRlKHByaXNvbmVycyA9IHJvdW5kKCgocGVyY2VudGFnZV9wcmlzb25lcnMgLyAxMDApICogdG90YWxfcHJpc29uZXJzKSwgMCksCiAgICAgICAgICBldGhuaWNpdHkgPSB0b2xvd2VyKGV0aG5pY2l0eSksCiAgICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkgJT4lCiAgIGdyb3VwX2J5KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGV0aG5pY2l0eSwpICU+JQogICBzdW1tYXJpc2UocHJpc29uZXJzID0gc3VtKHByaXNvbmVycykpICU+JQogICBzZWxlY3QoeWVhciwgcmVnaW9uLCBzdGF0ZSwgZXRobmljaXR5LCBwcmlzb25lcnMpCgojIGFycmVzdGVkIGFjY29yZGluZyB0byByZW11bmVyYXRpb24uIE9mIGFsbCB0aGUgdGFibGVzLCB0aGlzIGlzIHRoZSBvbmUgd2l0aCB0aGUgbW9zdCBkYXRhLgoKaW5mb3Blbl93YWdlIDwtaW5mb3Blbl80ICU+JQogICBzZWxlY3QocmVnaW9uLCBzdGF0ZSwgZGF0ZSwgZ2VuZGVyLCB3YWdlLCBwcmlzb25lcnMpICU+JQogICBtdXRhdGUod2FnZSA9IGdzdWIoIl8iLCAiICIsIHdhZ2UpLAogICAgICAgICAgd2FnZSA9IGdzdWIoIjMuNCIsICIzLzQiLCB3YWdlKSwKICAgICAgICAgIHdhZ2UgPSBnc3ViKCJkb2VzIG5vdCByZWNlaXZlZCIsImRvZXMgbm90IHJlY2VpdmUiLCB3YWdlKSkgJT4lCiAgIG11dGF0ZV9hdCh2YXJzKC1wcmlzb25lcnMpLCBhcy5mYWN0b3IpICU+JQogICBkcm9wX25hKCkKCmluZm9wZW5fd2FnZV8yX3BlcmNlbnRhZ2UgPC0gaW5mb3Blbl93YWdlICU+JQogICBmaWx0ZXIoZ3JlcGwoIl5kZWMiLCBkYXRlKSB8IGRhdGUgPT0gImp1biAyMDE5IiwKICAgICAgICAgICFncmVwbCgibm8gaW5mb3JtYXRpb24iLCB3YWdlKSkgJT4lCiAgIGdyb3VwX2J5KHJlZ2lvbiwgc3RhdGUsIGRhdGUpICU+JQogICBtdXRhdGUoeWVhciA9IHN0cl9yZXBsYWNlKGRhdGUsICJcXEQqKFxcZHs0fSkuKiIsICJcXDEiKSwKICAgICAgICAgIHRvdGFsX3ByaXNvbmVycyA9IHN1bShwcmlzb25lcnMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICBwZXJjZW50YWdlX3ByaXNvbmVycyA9IHJvdW5kKCgocHJpc29uZXJzIC8gdG90YWxfcHJpc29uZXJzKSAqIDEwMCksMiksCiAgICAgICAgICBzdGF0ZSA9IGFzLmZhY3RvcihzdGF0ZSksCiAgICAgICAgICB5ZWFyID0gYXMuY2hhcmFjdGVyKHllYXIpKSAlPiUKICAgdW5ncm91cCgpICU+JQogICBzZWxlY3QoeWVhciwgcmVnaW9uLCBzdGF0ZSwgZ2VuZGVyLCB3YWdlLCBwZXJjZW50YWdlX3ByaXNvbmVycykKCmluZm9wZW5fd2FnZV8zX2ZpbmFsIDwtIGluZm9wZW5fd2FnZV8yX3BlcmNlbnRhZ2UgJT4lCiAgIGxlZnRfam9pbihwcmlzb25fcG9wdWxhdGlvbl8yX3N1bW1hcnksIGJ5ID0gYygieWVhciIsICJyZWdpb24iLCAic3RhdGUiKSkgJT4lCiAgIG11dGF0ZShwcmlzb25lcnMgPSByb3VuZCgoKHBlcmNlbnRhZ2VfcHJpc29uZXJzIC8gMTAwKSAqIHRvdGFsX3ByaXNvbmVycyksIDApKSAlPiUKICAgc2VsZWN0KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlciwgd2FnZSwgcHJpc29uZXJzKSAlPiUKICAgZ3JvdXBfYnkoeWVhciwgcmVnaW9uLCBzdGF0ZSwgd2FnZSwpICU+JQogICBzdW1tYXJpc2UocHJpc29uZXJzID0gc3VtKHByaXNvbmVycykpCgojIEZpbmFsbHksIHRoZSBsZXZlbCBvZiBlZHVjYXRpb24gdGFibGUsIHdoaWNoIHdpbGwgc3RpbGwgcmVjZWl2ZSBhbm90aGVyIHRyZWF0bWVudCBsYXRlciBvbgoKaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24gPC1pbmZvcGVuXzQgJT4lCiAgIHNlbGVjdChyZWdpb24sc3RhdGUsZGF0ZSxnZW5kZXIsIGxldmVsX29mX2VkdWNhdGlvbiwgcHJpc29uZXJzKSAlPiUKICAgbXV0YXRlKGxldmVsX29mX2VkdWNhdGlvbiA9IGdzdWIoIl8iLCAiICIsIGxldmVsX29mX2VkdWNhdGlvbikpICU+JQogICBtdXRhdGVfYXQodmFycygtcHJpc29uZXJzKSwgYXMuZmFjdG9yKSAlPiUKICAgZHJvcF9uYSgpCgppbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8yX3BlcmNlbnRhZ2UgPC0gaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24gJT4lCiAgIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGUpIHwgZGF0ZSA9PSAianVuIDIwMTkiKSAlPiUKICAgZ3JvdXBfYnkocmVnaW9uLCBzdGF0ZSwgZGF0ZSkgJT4lCiAgIG11dGF0ZSh5ZWFyID0gc3RyX3JlcGxhY2UoZGF0ZSwgIlxcRCooXFxkezR9KS4qIiwgIlxcMSIpLAogICAgICAgICAgdG90YWxfcHJpc29uZXJzID0gc3VtKHByaXNvbmVycywgbmEucm0gPSBUUlVFKSwgIyB0b3RhbCBzdW0gb2YgcHJpc29uZXJzIGJ5IHJlZ2lvbiwgc3RhdGUsIGdlbmRlciBhbmQgeWVhcgogICAgICAgICAgcGVyY2VudGFnZV9wcmlzb25lcnMgPSByb3VuZCgoKHByaXNvbmVycyAvIHRvdGFsX3ByaXNvbmVycykgKiAxMDApLDIpLAogICAgICAgICAgc3RhdGUgPSBhcy5mYWN0b3Ioc3RhdGUpLAogICAgICAgICAgeWVhciA9IGFzLmNoYXJhY3Rlcih5ZWFyKSkgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgc2VsZWN0KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlciwgbGV2ZWxfb2ZfZWR1Y2F0aW9uLCBwZXJjZW50YWdlX3ByaXNvbmVycykKCmluZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uXzNfZmluYWwgPC0gaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fMl9wZXJjZW50YWdlICU+JQogICBsZWZ0X2pvaW4ocHJpc29uX3BvcHVsYXRpb25fMl9zdW1tYXJ5LCBieSA9IGMoInllYXIiLCAicmVnaW9uIiwgInN0YXRlIikpICU+JQogICBtdXRhdGUocHJpc29uZXJzID0gcm91bmQoKChwZXJjZW50YWdlX3ByaXNvbmVycyAvIDEwMCkgKiB0b3RhbF9wcmlzb25lcnMpLCAwKSkgJT4lCiAgIHNlbGVjdCh5ZWFyLCByZWdpb24sIHN0YXRlLCBnZW5kZXIsIGxldmVsX29mX2VkdWNhdGlvbiwgcHJpc29uZXJzKQpgYGAKCgojIyBJTkZPUEVOIERhdGEgVmlzdWFsaXphdGlvbiB7LnRhYnNldCAudGFic2V0LWZhZGV9CgpIZXJlIGFyZSB0aGUgSU5GT1BFTiB0YWJsZXMgdGhhdCBJIHdpbGwgYmUgdXNpbmcuIE5vdGUgdGhhdCBJIGNvbWJpbmVkIHNldmVyYWwgdGFibGVzLCByZWFycmFuZ2VkIHRoZSBjb2x1bW5zIGFuZCBleHRyYWN0ZWQgNSBkaWZmZXJlbnQgdGFibGVzLCB3aXRoIHBhbmVsIGRhdGEuCgojIyMgUHJpc29uIHBvcHVsYXRpb24KYGBgIHtyIFByaXNvbiBwb3B1bGF0aW9uLCBlY2hvID0gRkFMU0UgfQpzdW1tYXJ5X3ByaXNvbl9wb3B1bGF0aW9uIDwtIHByaXNvbl9wb3B1bGF0aW9uICU+JQogICAgIGFycmFuZ2UoZGVzYyhwcmlzb25lcnMpKQoKa2FibGUoaGVhZChzdW1tYXJ5X3ByaXNvbl9wb3B1bGF0aW9uLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpCgpgYGAKICAKIyMjIEV0aG5pY2l0eQpgYGAge3IgRXRobmljaXR5LCBlY2hvID0gRkFMU0UgfQpzdW1tYXJ5X2V0aG5pY2l0eSA8LSBpbmZvcGVuX2V0aG5pY2l0eV8zX2ZpbmFsICU+JQogICAgIGFycmFuZ2UoZGVzYyhwcmlzb25lcnMpKQoKa2FibGUoaGVhZChzdW1tYXJ5X2V0aG5pY2l0eSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQpgYGAKCiMjIyBFZHVjYXRpb24gTGV2ZWwKYGBgIHtyIEVkdWNhdGlvbiBsZXZlbCAsIGVjaG8gPSBGQUxTRSB9CnN1bW1hcnlfaW5zdHJ1Y3Rpb24gPC0gaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fM19maW5hbCAlPiUKICAgYXJyYW5nZShkZXNjKHByaXNvbmVycykpCgprYWJsZShoZWFkKHN1bW1hcnlfaW5zdHJ1Y3Rpb24sMTApKSAlPiUKICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpCmBgYAoKIyMjIEFnZSByYW5nZQpgYGAge3IgQWdlIFJhbmdlICwgZWNobyA9IEZBTFNFIH0Kc3VtbWFyeV9hZ2UgPC0gaW5mb3Blbl9hZ2VfcmFuZ2VfNCAlPiUKICAgYXJyYW5nZShkZXNjKHByaXNvbmVycykpCgprYWJsZShoZWFkKHN1bW1hcnlfYWdlLDEwKSkgJT4lCiAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQpgYGAKCiMjIyBQYXkgcmFuZ2UKYGBgIHtyIFBheSBSYW5nZSAsIGVjaG8gPSBGQUxTRSB9CnN1bW1hcnlfd2FnZSA8LSBpbmZvcGVuX3dhZ2VfM19maW5hbCAlPiUKICAgYXJyYW5nZShkZXNjKHByaXNvbmVycykpCgprYWJsZShoZWFkKHN1bW1hcnlfd2FnZSwxMCkpICU+JQogICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkKYGBgCgojIFRhYmxlIElCR0UgTGV2ZWwgb2YgRWR1Y2F0aW9uClRoZSBwdXJwb3NlIG9mIHRoaXMgYW5hbHlzaXMgaXMgdG8gY29tcGFyZSBkYXRhIGZyb20gdGhlIHByaXNvbiBwb3B1bGF0aW9uIHdpdGggZGF0YSBmcm9tIHRoZSBJQkdFLCBhbmQgbWFrZSBhIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlbS4gVGhlIGRhdGEgSSB3aWxsIHVzZSBoZXJlIGFyZSBwYXJ0IG9mIHRoZSBOYXRpb25hbCBIb3VzZWhvbGQgU2FtcGxlIFN1cnZleSBDb250aW51ZXMgKFBOQURDKSBhbmQgY2FuIGJlIGZvdW5kIG9uIHRoZSBbSUJHRV0oaHR0cHM6Ly93d3cuaWJnZS5nb3YuYnIvZXN0YXRpc3RpY2FzL2Rvd25sb2Fkcy1lc3RhdGlzdGljYXMuIGh0bWwpLgogIApIZXJlIEkgc3RhcnQgd29ya2luZyBvbiB0aGUgc2Vjb25kIHRhYmxlIHRoYXQgd2lsbCBiZSB1c2VkLiBUaGlzIHNpbmdsZSB0YWJsZSBoYXMgc2V2ZXJhbCBzaGVldHMgdGhhdCBJIHdpbGwgZXh0cmFjdCBhbmQgbWFuaXB1bGF0ZSB0aGUgZGF0YS4gVGhlIHRhYmxlICJQTkFEX0NvbnRpbnVhXzIwMThfRWR1Y2FjYW8ueGxzIiBoYXMgZGF0YSByZWdhcmRpbmcgdGhlIGVkdWNhdGlvbiBvZiB0aGUgcG9wdWxhdGlvbi4gVGhlcmUgYXJlIHNldmVyYWwgcGllY2VzIG9mIGluZm9ybWF0aW9uLCBpbmNsdWRpbmc6IGVkdWNhdGlvbmFsIGxldmVsIGJ5IHJlZ2lvbiwgZ2VuZGVyIGFuZCBldGhuaWNpdHkuIFRoaXMgdGFibGUgYWxzbyBwcmVzZW50cyBwYW5lbCBkYXRhLgoqWWVsbG93IGFuZCBJbmRpZ2Vub3VzIGFyZSBpbmNsdWRlZCBpbiB0aGUgVG90YWwqCgoKSSdtIGdvaW5nIHRvIHNraXAgdGhlIHRhYmxlIGltcG9ydCBwYXJ0IGFuZCBnbyBkaXJlY3RseSB0byB0aGUgZGF0YWZyYW1lLgpgYGB7ciBQTkFEX0NvbnRpbnVhXzIwMThfRWR1Y2F0aW9uLCBpbmNsdWRlPUZBTFNFfQojIHNldCBwYXRoIHRvIGV4Y2VsIGZpbGUKcG5hZF9maWxlX3BhdGggPC0gIlBOQURjL1BOQURfQ29udGludWFfMjAxOF9FZHVjYWNhby54bHMiCgojIGdldCB0aGUgbmFtZXMgb2YgdGhlIHNoZWV0cyB0aGF0IHdpbGwgYmUgdXNlZApwbmFkX3NoZWV0X25hbWVzIDwtIGV4Y2VsX3NoZWV0cyhwbmFkX2ZpbGVfcGF0aCkKCiMgcmVtb3ZlIHRoZSBmaXJzdCB0d28gc2hlZXRzCnBuYWRfc2hlZXRfbmFtZXMgPC0gcG5hZF9zaGVldF9uYW1lc1stYygxLCAyKV0KCiMgY3JlYXRlIGFuIGVtcHR5IGRhdGEgZnJhbWUKcG5hZCA8LSBkYXRhLmZyYW1lKCkKCiMgbG9vcCB0aHJvdWdoIGFsbCB0aGUgc2hlZXRzIGFuZCBhZGQgdGhlbSB0byB0aGUgZW1wdHkgZGF0YWZyYW1lCmZvciAoaSBpbiBzZXFfYWxvbmcocG5hZF9zaGVldF9uYW1lcykpIHsKICAgcG5hZF9zaGVldCA8LSByZWFkX2V4Y2VsKHBuYWRfZmlsZV9wYXRoLCBzaGVldCA9IHBuYWRfc2hlZXRfbmFtZXNbaV0sIHNraXAgPSA3KQogICBwbmFkIDwtIGJpbmRfcm93cyhwbmFkLCBwbmFkX3NoZWV0KQp9CgojIHRvIGF2b2lkIGRpc3RyYWN0aW9ucywgSSdtIGdvaW5nIHRvIHJlbW92ZSB0aGUgcG5hZF9sZWFmIHZhcmlhYmxlIHRoYXQgd2FzIGNyZWF0ZWQgdG8gbG9vcCBpbiB0aGUgcG5hZCBkYXRhZnJhbWUKcm0oc2hlZXRfcG5hZCkKCiMgcmVuYW1lIHRoZSBjb2x1bW5zIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCB0aGVtCmNvbG5hbWVzKHBuYWQpPC0gYygiaW5kaWNhdG9yIiwgInRlcnJpdG9yaWFsX2xldmVsIiwKICAgICAgICAgICAgICAgICAgICAidGVycml0b3JpYWxfb3BlbmluZyIsInZhcmlhYmxlXzEiLAogICAgICAgICAgICAgICAgICAgICJjYXRlZ29yeV8xIiwgInZhcmlhYmxlXzIiLAogICAgICAgICAgICAgICAgICAgICJjYXRlZ29yeV8yIiwiMjAxNiIsIjIwMTciLCIyMDE4IikKCiNyZW1vdmUgZHVwbGljYXRlIGxpbmVzIGJlY2F1c2UgbGV2ZWwgYnJhc2lsIGlzIHByZXNlbnQgaW4gYWxsIHNoZWV0cwpwbmFkIDwtIHBuYWRbIWR1cGxpY2F0ZWQocG5hZCksIF0KYGBgCiAgClZpc3VhbGl6YXRpb24gb2YgdGhlIFBOQUQgVGFibGUKYGBge3IgdmlzdWFsaXphdGlvbiBvZiB0aGUgUE5BRCB0YWJsZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwbmFkLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKClRoaXMgZGF0YWZyYW1lIGdhdGhlcnMgZGF0YSBmcm9tIGFsbCB0YWJzIG9mIHRoZSAiUE5BRF9Db250aW51YV8yMDE4X0VkdWNhY2FvLnhscyIgZmlsZSwgdGhlcmUgaXMgc3RpbGwgYSBsb3Qgb2YgbWFuaXB1bGF0aW9uIHRvIGJlIGRvbmUuCgojIyBEYXRhIE1hbmlwdWxhdGlvbgoKRmlyc3QsIEknbSBnb2luZyB0byB0cmFuc3Bvc2UgdGhlIGRhdGEgc28gdGhhdCBJIGNhbiB0cmFuc2Zvcm0gaXQgaW50byBsb25nIGZvcm1hdCwganVzdCBsaWtlIGluIHRoZSBwcmV2aW91cyBtb2RlbCwgd2l0aCB0aGUgSU5GT1BFTiB0YWJsZS4KYGBge3IgdHJhbnNmb3JtIHBuYWQgdGFibGUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBuYWRfMl9sb25nX2Zvcm1hdCA8LSBwaXZvdF9sb25nZXIocG5hZCwgODoxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190bz0ieWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpCmBgYAoKSSdsbCBtdWx0aXBseSB0aGUgdmFsdWUgaW4gdGhlICd2YWx1ZScgY29sdW1uIGJ5IDEwMDAgaWYgdGhlICdpbmRpY2F0b3InIGNvbHVtbiBjb250YWlucyB0aGUgc3RyaW5nICcobWlsIHBlc3NvYXMpJycodGhvdXNhbmQgcGVvcGxlKScgYW5kIHRoZW4gcmVtb3ZlIGl0LiBUaGVuIEknbGwgY3JlYXRlIGEgJ3JlZ2lvbicgdmFyaWFibGUgdG8gc3RvcmUgdGhlIHJlZ2lvbiBvZiBlYWNoIHN0YXRlLgpgYGB7ciBwbmFkXzNfd2l0aF9yZWdpb25zfQpwbmFkXzNfd2l0aF9yZWdpb25zIDwtIHBuYWRfMl9sb25nX2Zvcm1hdCAlPiUKICAgbXV0YXRlKHZhbHVlID0gaWZlbHNlKGdyZXBsKCIobWlsIHBlc3NvYXMpIiwgaW5kaWNhdG9yKSwgdmFsdWUgKiAxMDAwLCB2YWx1ZSksCiAgICAgICAgICBpbmRpY2F0b3IgPSBnc3ViKCJcXHMqXFwobWlsIHBlc3NvYXNcXCkiLCAiIiwgaW5kaWNhdG9yKSwKICAgICAgICAgIHJlZ2lvbiA9IGNhc2Vfd2hlbih0ZXJyaXRvcmlhbF9vcGVuaW5nICVpbiUgYygiQWNyZSIsICJBbWF6b25hcyIsICJBbWFww6EiLCAiUGFyw6EiLCAiUm9uZMO0bmlhIiwgIlJvcmFpbWEiLCAiVG9jYW50aW5zIikgfiAiTm9ydGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJpdG9yaWFsX29wZW5pbmcgJWluJSBjKCJNYXJhbmjDo28iLCAiUGlhdcOtIiwgIkNlYXLDoSIsICJSaW8gR3JhbmRlIGRvIE5vcnRlIiwgIlBhcmHDrWJhIiwgIlBlcm5hbWJ1Y28iLCAiQWxhZ29hcyIsICJTZXJnaXBlIiwgIkJhaGlhIikgfiAiTm9ydGhlYXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyaXRvcmlhbF9vcGVuaW5nICVpbiUgYygiTWluYXMgR2VyYWlzIiwgIkVzcMOtcml0byBTYW50byIsICJSaW8gZGUgSmFuZWlybyIsICJTw6NvIFBhdWxvIikgfiAiU291dGhlYXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyaXRvcmlhbF9vcGVuaW5nICVpbiUgYygiUGFyYW7DoSIsICJTYW50YSBDYXRhcmluYSIsICJSaW8gR3JhbmRlIGRvIFN1bCIpIH4gIlNvdXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyaXRvcmlhbF9vcGVuaW5nICVpbiUgYygiTWF0byBHcm9zc28iLCAiTWF0byBHcm9zc28gZG8gU3VsIiwgIkdvacOhcyIsICJEaXN0cml0byBGZWRlcmFsIikgfiAiTWlkd2VzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pKQpgYGAKCmBgYHtyIFBvcHVsYXRpb24gZmluYWwgdGFibGVzIGJ5IHJlZ2lvbiBhbmQgYWdlIDE0IGFuZCBvdmVyLCBpbmNsdWRlPUZBTFNFfQpwbmFkXzRfcG9wdWxhdGlvbl9hZ2UgPC0gcG5hZF8zX3dpdGhfcmVnaW9ucyAlPiUKICAgZmlsdGVyKGluZGljYXRvciA9PSJQb3B1bGHDp8OjbyIsCiAgICAgICAgICB0ZXJyaXRvcmlhbF9sZXZlbCA9PSAiVW5pZGFkZSBkYSBGZWRlcmHDp8OjbyIsCiAgICAgICAgICBjYXRlZ29yeV8xICVpbiUgYygiSG9tZW0iLCAiTXVsaGVyIiwiQnJhbmNhIiwiUHJldGEgb3UgcGFyZGEiLCJUb3RhbMK5IiksCiAgICAgICAgICBjYXRlZ29yeV8yICE9IlRvdGFsIikgJT4lCiAgIG11dGF0ZShnZW5kZXIgPSBpZmVsc2UoY2F0ZWdvcnlfMSAlaW4lIGMoIkhvbWVtIiwgIk11bGhlciIpLCBjYXRlZ29yeV8xLCBOQSksCiAgICAgICAgICBldGhuaWNpdHkgPSBpZmVsc2UoY2F0ZWdvcnlfMSAlaW4lIGMoIkJyYW5jYSIsIlByZXRhIG91IHBhcmRhIiwiVG90YWzCuSIpLCBjYXRlZ29yeV8xLCBOQSksCiAgICAgICAgICBzdGF0ZSA9IHN0YXRlX2RpY3RbYXMuY2hhcmFjdGVyKHRlcnJpdG9yaWFsX29wZW5pbmcpXSkgJT4lCiAgIHNlbGVjdChyZWdpb24sIHN0YXRlLCBnZW5kZXIsIGV0aG5pY2l0eSwgImFnZV9ncm91cCIgPSBjYXRlZ29yeV8yLCB5ZWFyLCB2YWx1ZSkKYGBgCgoKYGBge3IgcG5hZF80X3BvcHVsYXRpb25fYWdlIHRyYXNsYXRlLCBpbmNsdWRlPUZBTFNFfQoKcG5hZF80X3BvcHVsYXRpb25fYWdlIDwtIHBuYWRfNF9wb3B1bGF0aW9uX2FnZSAlPiUgCiAgbXV0YXRlKCBnZW5kZXIgPSByZWNvZGUoZ2VuZGVyLCAgCiAgICAiSG9tZW0iID0gICJtYWxlIiwKICAgICJNdWxoZXIiID0gImZlbWFsZSIpLAogICAgICAgICAgZXRobmljaXR5ID0gcmVjb2RlKGV0aG5pY2l0eSwKICAgICJCcmFuY2EiPSJ3aGl0ZSIsCiAgICAiUHJldGEgb3UgcGFyZGEiID0gImJsYWNrIG9yIGJyb3duIiksCiAgICAgICAgICBhZ2VfZ3JvdXAgPSByZWNvZGUoYWdlX2dyb3VwLAogICAgIihbMC05XSspIGEgKFswLTldKykgYW5vcyIgPSAiXFwxIHRvIFxcMiB5ZWFycyBvbGQiLAogICAgIihbMC05XSspIGUgKFswLTldKykgYW5vcyIgPSAiXFwxIGFuZCBcXDIgeWVhcnMgb2xkIiwKICAgICIoWzAtOV0rKSBhbm9zIG91IG1haXMiID0gIlxcMSB5ZWFycyBvbGQgYW5kIG92ZXIiKQogICAgKQoKCmBgYAoKCiMjIyBQTkFEIHRhYmxlIFBvcHVsYXRpb24gYWdlZCAxOCBvciBvdmVyCgpJJ20gZ29pbmcgdG8gY29tYmluZSB0aGlzIElCR0UgdGFibGUgd2l0aCB0aGUgZmlyc3QgSU5GT1BFTiB0YWJsZSB0aGF0IGNvbmNlcm5zIHRoZSBwcmlzb24gcG9wdWxhdGlvbiwgdGh1cyBhbHNvIGJlaW5nIGFibGUgdG8gY29ycmVsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgcHJpc29uZXJzIHdpdGggcGVvcGxlIGFnZWQgMTggb3Igb3ZlciwgYnV0IGluIGEgc3VtbWFyaXplZCB3YXkuCgpgYGB7ciBwcmlzb24gcG9wdWxhdGlvbiB2cyBCcmF6aWxpYW4gcG9wdWxhdGlvbiBhZ2VkIDE4IGFuZCBvdmVyLCBpbmNsdWRlPUZBTFNFfQpwb3B1bGF0aW9uXzE4X3llYXJzX2FuZF9vdmVyIDwtIHBuYWRfNF9wb3B1bGF0aW9uX2FnZSAlPiUKICAgc2VsZWN0KC1ldGhuaWNpdHkpICU+JQogICBmaWx0ZXIoIXN0cl9kZXRlY3QoYWdlX2dyb3VwLCAiMCB0byAzIHllYXJzIG9sZHw0IGFuZCA1IHllYXJzIG9sZHw2IHRvIDkgeWVhcnMgb2xkfDEwIHRvIDE0IHllYXJzIG9sZHwxNSB0byAxNyB5ZWFycyBvbGQiKSkgJT4lCiAgIG5hLm9taXQoKQoKcG9wdWxhdGlvbl8xOF95ZWFyc19hbmRfb3Zlcl8yIDwtIHBvcHVsYXRpb25fMThfeWVhcnNfYW5kX292ZXIgJT4lCiAgIGdyb3VwX2J5KHllYXIsIHJlZ2lvbiwgc3RhdGUpICU+JQogICBzdW1tYXJpc2UodmFsdWUgPSBzdW0odmFsdWUpKSAlPiUKICAgcmVuYW1lKHRvdGFsID0gdmFsdWUpCmBgYAoKSGVyZSB3ZSBjYW4gaGF2ZSBhbiBpZGVhIG9mIHRoZSBkYXRhIHByZXNlbnQgaW4gdGhpcyB0YWJsZS4KYGBge3IgaGVhZChwb3B1bGF0aW9uXzE4X3llYXJzX2FuZF9vdmVyXzIpLCBlY2hvPUZBTFNFfQpoZWFkKHBvcHVsYXRpb25fMThfeWVhcnNfYW5kX292ZXJfMikKYGBgCgpUaGlzIHRhYmxlIGhhcyBkYXRhIGZyb20gMjAxNiB0byAyMDE4LiBUaGUgZmlyc3Qgc3RlcCB3aWxsIGJlIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBlb3BsZSBmb3IgZWFjaCB2YXJpYWJsZSBpbiB0aGUgeWVhciAyMDE5LCB1c2luZyB0aGUgYXJpdGhtZXRpYyBtZXRob2QgZGVzY3JpYmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBhbmFseXNpcy4KCiMjIFVzaW5nIEFyaXRobWV0aWMgTWV0aG9kIHRvIEVzdGltYXRlIGEgUG9wdWxhdGlvbgoKSSdsbCBzdGFydCBieSB0cmFuc2Zvcm1pbmcgdGhpcyBkYXRhIGludG8gYSB3aWRlIGZvcm1hdCwgdGhlbiBJJ2xsIGFwcGx5IHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBmb3JtdWxhIGFuZCBmaW5hbGx5IHJldHVybiB0aGUgdGFibGUgdG8gYSBsb25nIGZvcm1hdC4KCmBgYHtyIHBvcHVsYXRpb24gb3ZlciAxOCB5ZWFycyBvbGQgcG9wdWxhdGlvbiBzdGF0aXN0aWNzfQoKcG9wdWxhdGlvbl8xOF95ZWFyc19vcl9vdmVyXzMgPC0gcGl2b3Rfd2lkZXIocG9wdWxhdGlvbl8xOF95ZWFyc19hbmRfb3Zlcl8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19mcm9tID0geWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSB0b3RhbCkKCnBvcHVsYXRpb25fMThfeWVhcnNfb3Jfb3Zlcl80IDwtIHBvcHVsYXRpb25fMThfeWVhcnNfb3Jfb3Zlcl8zICU+JQogIG11dGF0ZSgKICAgIGAyMDE5YCA9IHJvdW5kKGZvcm11bGEoYDIwMThgLDIwMTgsYDIwMTZgLDIwMTYsMjAxOSkpCiAgKQoKcG9wdWxhdGlvbl8xOF95ZWFyc19vcl9vdmVyXzUgPC0gcGl2b3RfbG9uZ2VyKHBvcHVsYXRpb25fMThfeWVhcnNfb3Jfb3Zlcl80LCBjb2xzID0gLWMoc3RhdGUscmVnaW9uKSxuYW1lc190byA9ICJ5ZWFyIix2YWx1ZXNfdG8gPSAicG9wdWxhdGlvbiIpICU+JQogICBtdXRhdGUoYWNyb3NzKC1wb3B1bGF0aW9uLCBhcy5mYWN0b3IpKQpgYGAKCkkgd2lsbCBub3cgY29tYmluZSB0aGlzIHRhYmxlIHdpdGggdGhlIElORk9QRU4gcHJpc29uIHBvcHVsYXRpb24uCmBgYHtyIHBvcHVsYXRpb25faW5mb3Blbl90b3RhbCwgaW5jbHVkZT1GQUxTRX0KcG9wdWxhdGlvbl9pbmZvcGVuX3RvdGFsIDwtIGxlZnRfam9pbihwcmlzb25fcG9wdWxhdGlvbl8yX3N1bW1hcnksIHBvcHVsYXRpb25fMThfeWVhcnNfb3Jfb3Zlcl81LCBieSA9IGpvaW5fYnkoeWVhciwgcmVnaW9uLCBzdGF0ZSkgKSAlPiUKICAgcmVuYW1lKHByaXNvbmVycyA9IHRvdGFsX3ByaXNvbmVycykKCmBgYAoKCmBgYHtyIHBvcHVsYXRpb24gdmlld19pbmZvcGVuX3RvdGFsICwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2luZm9wZW5fdG90YWwsMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKCiMjIFRhYmxlIFBOQUQgRWR1Y2F0aW9uIERhdGEKICAKSSdtIGdvaW5nIHRvIHJlcGVhdCBiYXNpY2FsbHkgdGhlIHNhbWUgcHJvY2VzcyBpbiB0aGUgdGFibGUgd2l0aCBkYXRhIG9uIHRoZSBwb3B1bGF0aW9uLiBUaGlzIHRhYmxlLCBob3dldmVyLCBjb25zaWRlcnMgcGVvcGxlIGFnZWQgMTQgb3Igb3ZlciwgYXMgY2FuIGJlIHNlZW4gZnJvbSB0aGUgaW5kaWNhdG9yLgpgYGB7ciBhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbiB9CmFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uIDwtIHBuYWRfM193aXRoX3JlZ2lvbnMgJT4lCiAgIGZpbHRlcihpbmRpY2F0b3IgPT0iUGVzc29hcyBkZSAxNCBhbm9zIG91IG1haXMgZGUgaWRhZGUiLAogICAgICAgICAgdGVycml0b3JpYWxfbGV2ZWwgPT0gIlVuaWRhZGUgZGEgRmVkZXJhw6fDo28iLAogICAgICAgICAgY2F0ZWdvcnlfMSAlaW4lIGMoIkhvbWVtIiwgIk11bGhlciIsICJCcmFuY2EiLCAiUHJldGEgb3UgUGFyZGEiLCAiVG90YWzCuSIpLAogICAgICAgICAgdmFyaWFibGVfMiA9PSAiTsOtdmVsIGRlIGluc3RydcOnw6NvIiwKICAgICAgICAgICEoY2F0ZWdvcnlfMiAlaW4lIGMoIlRvdGFsIikpKSAlPiUKICBmaWx0ZXIoIXN0cl9kZXRlY3QoY2F0ZWdvcnlfMSwiQnJhbmNhfFByZXRhIG91IFBhcmRhfFRvdGFswrkiKSkgJT4lIAogICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhciksCiAgICAgZ2VuZGVyID0gcmVjb2RlKGNhdGVnb3J5XzEsCiAgICAgICAiSG9tZW0iID0gIm1hbGUiLAogICAgICAgIk11bGhlciIgPSAiZmVtYWxlIiksCiAgICAgICAgICBzdGF0ZSA9IHN0YXRlX2RpY3RbYXMuY2hhcmFjdGVyKHRlcnJpdG9yaWFsX29wZW5pbmcpXSkgJT4lCiAgIHNlbGVjdChyZWdpb24sIHN0YXRlLCBnZW5kZXIsIGxldmVsX29mX2VkdWNhdGlvbiA9IGNhdGVnb3J5XzIsIHllYXIsIHRvdGFsID0gdmFsdWUpICU+JQogICBkcm9wX25hKCkKYGBgCiAgCiAgCmBgYHtyIGFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uIHRyYW5zbGF0aW9uLCBpbmNsdWRlPUZBTFNFfQoKCmFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uIDwtIGFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uICU+JQogIG11dGF0ZShsZXZlbF9vZl9lZHVjYXRpb24gPSByZWNvZGUobGV2ZWxfb2ZfZWR1Y2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbSBpbnN0cnXDp8OjbyIgPSAiTm8gZWR1Y2F0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5kYW1lbnRhbCBpbmNvbXBsZXRvIChvdSBjdXJzbyBlcXVpdmFsZW50ZSkiID0gIkluY29tcGxldGUgRWxlbWVudGFyeSBTY2hvb2wgKG9yIGVxdWl2YWxlbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5kYW1lbnRhbCBjb21wbGV0byAob3UgY3Vyc28gZXF1aXZhbGVudGUpIiA9ICJDb21wbGV0ZSBFbGVtZW50YXJ5IFNjaG9vbCAob3IgZXF1aXZhbGVudCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk3DqWRpbyBpbmNvbXBsZXRvIChvdSBjdXJzbyBlcXVpdmFsZW50ZSkiID0gIkluY29tcGxldGUgSGlnaCBTY2hvb2wgKG9yIGVxdWl2YWxlbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNw6lkaW8gY29tcGxldG8gKG91IGN1cnNvIGVxdWl2YWxlbnRlKSIgPSAiQ29tcGxldGUgSGlnaCBTY2hvb2wgKG9yIGVxdWl2YWxlbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdXBlcmlvciBpbmNvbXBsZXRvIChvdSBjdXJzbyBlcXVpdmFsZW50ZSkiID0gIkluY29tcGxldGUgQ29sbGVnZS9Vbml2ZXJzaXR5IChvciBlcXVpdmFsZW50KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VwZXJpb3IgY29tcGxldG8iID0gIkNvbXBsZXRlIENvbGxlZ2UvVW5pdmVyc2l0eSIpKQoKCgoKYGBgCiAgCiAgClNhbWUgcHJvY2VzcyB0byBjYWxjdWxhdGUgdGhlIHBvcHVsYXRpb24gaW4gdGhlIHllYXIgMjAxOS4KYGBge3IgbGl0ZXJhY3lfcG9wdWxhdGlvbiBzdGF0aXN0aWNzIHBvcHVsYXRpb259CmFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uXzIgPC0gcGl2b3Rfd2lkZXIoYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB5ZWFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHRvdGFsKQoKYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fMyA8LSBhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl8yICU+JQogIG11dGF0ZSgKICAgICBgMjAxOWAgPSByb3VuZChmb3JtdWxhKGAyMDE4YCwyMDE4LGAyMDE2YCwyMDE2LDIwMTkpKQogICApCgphbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl80IDwtIHBpdm90X2xvbmdlcihhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl8zLCBjb2xzID0gLWMocmVnaW9uOmxldmVsX29mX2VkdWNhdGlvbiksbmFtZXNfdG8gPSAieWVhciIsdmFsdWVzX3RvID0gInBvcHVsYXRpb24iKSAlPiUKICAgbXV0YXRlKGFjcm9zcygtcG9wdWxhdGlvbiwgYXMuZmFjdG9yKSkKYGBgCgpgYGB7ciB2aXN1YWxpemF0aW9uIG9mIHRhYmxlIGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzQsIGVjaG89RkFMU0V9CmhlYWQoYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fNCkKYGBgCgpBcyB5b3UgY2FuIGltYWdpbmUsIHRoZSBlZHVjYXRpb24gbGV2ZWwgZGlzdHJpYnV0aW9ucyBhcmUgbm90IHN0YW5kYXJkaXplZC4gSSdtIGdvaW5nIHRvIHVzZSBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGlzIHBhdHRlcm4gYmV0d2VlbiB0aGUgUE5BRCB0YWJsZSBhbmQgdGhlIElORk9QRU4gdGFibGUuCgpgYGB7UiBGdW5jdGlvbiB0byBzdGFuZGFyZGl6ZSBlZHVjYXRpb24gbGV2ZWx9CnN0YW5kYXJkaXplX2xldmVsX29mX2VkdWNhdGlvbiA8LSBmdW5jdGlvbihncmFkZSkgewogICBzaW1wbGlmaWVkX2dyYWRlIDwtIGdzdWIoIiBcXChvciBlcXVpdmFsZW50XFwpIiwgIiIsIGdyYWRlKQogICByZWNvZGUoc2ltcGxpZmllZF9ncmFkZSwKICAgICAgICAgICJObyBlZHVjYXRpb24iID0gImlsbGl0ZXJhdGUiLAogICAgICAgICAgIkluY29tcGxldGUgRWxlbWVudGFyeSBTY2hvb2wiID0gImVsZW1lbnRhcnkgc2Nob29sIGluY29tcGxldGUiLAogICAgICAgICAgIkNvbXBsZXRlIEVsZW1lbnRhcnkgU2Nob29sIiA9ICJlbGVtZW50YXJ5IHNjaG9vbCBjb21wbGV0ZSIsCiAgICAgICAgICAiSW5jb21wbGV0ZSBIaWdoIFNjaG9vbCIgPSAiaGlnaCBzY2hvb2wgaW5jb21wbGV0ZSIsCiAgICAgICAgICAiQ29tcGxldGUgSGlnaCBTY2hvb2wiID0gImhpZ2ggc2Nob29sIGNvbXBsZXRlIiwKICAgICAgICAgICJJbmNvbXBsZXRlIENvbGxlZ2UvVW5pdmVyc2l0eSIgPSAiY29sbGVnZSBvciB1bml2ZXJzaXR5IGluY29tcGxldGUiLAogICAgICAgICAgIkNvbXBsZXRlIENvbGxlZ2UvVW5pdmVyc2l0eSIgPSAiY29sbGVnZSBvciB1bml2ZXJzaXR5IGNvbXBsZXRlIiwKICAgICAgICAgICJMaXRlcmFjeSB3aXRob3V0IHJlZ3VsYXIgY291cnNlcyIgPSAiZWxlbWVudGFyeSBzY2hvb2wgaW5jb21wbGV0ZQoiKQp9CmBgYAoKCmBgYHtyIHN0YW5kYXJkaXplZCBjb2x1bW5zLCBpbmNsdWRlPUZBTFNFfQojIEZpcnN0IHRoZSBQTkFEIHRhYmxlCmFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uXzUgPC0gYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fNCAlPiUKICAgbXV0YXRlKGxldmVsX29mX2VkdWNhdGlvbiA9IG1hcF9jaHIobGV2ZWxfb2ZfZWR1Y2F0aW9uLCBzdGFuZGFyZGl6ZV9sZXZlbF9vZl9lZHVjYXRpb24pKSAlPiUKICAgc2VsZWN0KCJ5ZWFyIiwgInJlZ2lvbiIsICJzdGF0ZSIsICJnZW5kZXIiLCAibGV2ZWxfb2ZfZWR1Y2F0aW9uIiwgInBvcHVsYXRpb24iKQoKIyBBbmQgdGhlbiB0aGUgSU5GT1BFTiB0YWJsZQppbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCA8LSBpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zX2ZpbmFsICU+JQogIG11dGF0ZShsZXZlbF9vZl9lZHVjYXRpb24gPSAgcmVjb2RlKGxldmVsX29mX2VkdWNhdGlvbiwKICAgImVkdWNhdGlvbiBhYm92ZSBjb2xsZWdlIG9yIHVuaXZlcnNpdHkgY29tcGxldGUiID0gImNvbGxlZ2Ugb3IgdW5pdmVyc2l0eSBjb21wbGV0ZSIsCiAgICJsaXRlcmF0ZSB3aXRob3V0IHJlZ3VsYXIgY291cnNlcyIgPSAiZWxlbWVudGFyeSBzY2hvb2wgaW5jb21wbGV0ZSIgKSklPiUKICAgZ3JvdXBfYnkoeWVhciwgcmVnaW9uLCBzdGF0ZSwgZ2VuZGVyLCBsZXZlbF9vZl9lZHVjYXRpb24pJT4lCiAgIHN1bW1hcmlzZShwcmlzb25lcnMgPSBzdW0ocHJpc29uZXJzKSkgJT4lCiAgIHNlbGVjdCgieWVhciIsICJyZWdpb24iLCAic3RhdGUiLCAiZ2VuZGVyIiwgImxldmVsX29mX2VkdWNhdGlvbiIsICJwcmlzb25lcnMiKQoKYGBgCgphZnRlciBydW5uaW5nIHRoZSBmdW5jdGlvbiBvbiBib3RoIHRhYmxlcywgaGVyZSBpcyB0aGUgcmVzdWx0OgoKIyMgUE5BREMgYW5kIElORk9QRU4gU3RhbmRhcmRpemVkIFRhYmxlcyB7LnRhYnNldCAudGFic2V0LWZhZGV9CgojIyMgTGl0ZXJhY3kgb2YgdGhlIHBvcHVsYXRpb24KCmBgYHtyIHN0YW5kYXJkaXplZCBhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl81IHZpc3VhbGl6YXRpb24sIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoYXJyYW5nZShhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl81LHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlcixsZXZlbF9vZl9lZHVjYXRpb24sIHBvcHVsYXRpb24pLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIyBMaXRlcmFjeSBvZiBwcmlzb25lcnMKYGBge3IgdmlldyBpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCBwYXR0ZXJuLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGluZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uXzMxX3N0YW5kYXJkLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIE1pc3NpbmcgZGF0YSBpbiBJTkZPUEVOIHRhYmxlCgpJIG5vdGljZWQgdGhhdCBhZnRlciBhbGwgdGhlIHN0YW5kYXJkaXphdGlvbnMsIHRoZSB0YWJsZXMgY2FtZSBiYWNrIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBvYnNlcnZhdGlvbnMuIFRoZSBpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCB0YWJsZSBoYXMgYHIgbnJvdyhpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZClgIG9ic2VydmF0aW9ucywgd2hpbGUgYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fNSBoYXMgYHIgbnJvdyhhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl81KWAgb2JzZXJ2YXRpb25zLiBJIGRlY2lkZWQgdG8gaW52ZXN0aWdhdGUgdXNpbmcgYW50aV9qb2luIGFuZCBmb3VuZCB0aGF0IHRoZSBpbmZvcGVuIHRhYmxlIGRvZXMgbm90IGhhdmUgdGhlIG9ic2VydmF0aW9ucyBvZiB0aGUgdGFibGUgY3JlYXRlZCBiZWxvdy4KCmBgYHtyIG1pc3Npbmdfb2JzZXJ2YXRpb25zLCBpbmNsdWRlPUZBTFNFfQptaXNzaW5nX29ic2VydmF0aW9ucyA8LSBhbnRpX2pvaW4oYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fMzFfc3RhbmRhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygieWVhciIsICJzdGF0ZSIsICJnZW5kZXIiLCAicmVnaW9uIiwgImxldmVsX29mX2VkdWNhdGlvbiIpKQpgYGAKICAKYGBge3IgaGVhZChtaXNzaW5nX29ic2VydmF0aW9ucyksIGVjaG89RkFMU0V9CmhlYWQobWlzc2luZ19vYnNlcnZhdGlvbnMpCmBgYAoKSW4gb3JkZXIgbm90IHRvIGxlYXZlIHRoZXNlIHZhbHVlcyBibGFuaywgSSBkZWNpZGVkIHRvIHVzZSBhIHNpbXBsZSBhdmVyYWdlIG9mIHRoZSBudW1iZXIgb2YgcHJpc29uZXJzIGluIG90aGVyIHllYXJzIGZvciBlYWNoIG1pc3Npbmcgb2JzZXJ2YXRpb24sIHVzZSB0aGlzIGF2ZXJhZ2UgYXMgdGhlIHZhbHVlIGFuZCBvbmx5IHRoZW4gY29tYmluZSB0aGUgUE5BREMgdGFibGVzIHdpdGggSU5GT1BFTi4KCmBgYHtyIEZpbHRlciBncm91cCBhbmQgYXZlcmFnZSBwcmlzb25lcnMgcGVyIGdyb3VwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQphdmVyYWdlc19ieV9ncm91cCA8LSBpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCAlPiUKICAgZmlsdGVyKHllYXIgJWluJSBjKCIyMDE2IiwgIjIwMTgiLCAiMjAxOSIpIHwgeWVhciAlaW4lIGMoIjIwMTciLCAiMjAxOCIsICIyMDE5IikpICU+JQogICBncm91cF9ieShzdGF0ZSwgZ2VuZGVyLCByZWdpb24sIGxldmVsX29mX2VkdWNhdGlvbikgJT4lCiAgIHN1bW1hcmlzZShhdmVyYWdlX3ByaXNvbmVycyA9IG1lYW4ocHJpc29uZXJzKSkKCiMgVXBkYXRlIHRoZSBtaXNzaW5nX29ic2VydmF0aW9ucyBkYXRhZnJhbWUgd2l0aCBlc3RpbWF0ZWQgcHJpc29uZXIgdmFsdWVzCm1pc3Npbmdfb2JzZXJ2YXRpb25zXzJfdXBkYXRlZCA8LSBtZXJnZShtaXNzaW5nX29ic2VydmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2VzX2J5X2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJnZW5kZXIiLCJyZWdpb24iLCJsZXZlbF9vZl9lZHVjYXRpb24iKSxhbGwueCA9IFRSVUUsIGFsbC55ID0gRkFMU0UpCmBgYAoKYGBge3IgaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fNF9maW5hbCwgaW5jbHVkZT1GQUxTRX0KaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fNF9maW5hbCA8LSByYmluZChpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nX29ic2VydmF0aW9uc18yX3VwZGF0ZWQpICU+JQogICBtdXRhdGUocHJpc29uZXJzID0gaWZlbHNlKGlzLm5hKHByaXNvbmVycyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZV9wcmlzb25lcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpc29uZXJzKSwKICAgICAgICAgIHByaXNvbmVycyA9IHJvdW5kKHByaXNvbmVycywgMCkpICU+JQogICBzZWxlY3QoLWMoYXZlcmFnZV9wcmlzb25lcnMsIHBvcHVsYXRpb24pKQpgYGAKCk5vdyB0aGUgSU5GT1BFTiB0YWJsZSBjb250YWlucyBgciBucm93KGluZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uXzRfZmluYWwpYCBjb2x1bW5zLCBqdXN0IGxpa2UgdGhlIFBOQUQgdGFibGUsIHNvIEkgY2FuIGNvbWJpbmUgdGhlbS4KCmBgYHtyIFNldCB0aGUgY29ycmVjdCBvcmRlciBvZiBkZWdyZWVzIG9mIGVkdWNhdGlvbiwgaW5jbHVkZT1GQUxTRX0KZWR1Y2F0aW9uX2xldmVsX2NvcnJlY3Rfb3JkZXIgPC0gYygiaWxsaXRlcmF0ZSIsICJlbGVtZW50YXJ5IHNjaG9vbCBpbmNvbXBsZXRlIiwgImVsZW1lbnRhcnkgc2Nob29sIGNvbXBsZXRlIiwgImhpZ2ggc2Nob29sIGluY29tcGxldGUiLCAiaGlnaCBzY2hvb2wgY29tcGxldGUiLCAiY29sbGVnZSBvciB1bml2ZXJzaXR5IGluY29tcGxldGUiLCAiY29sbGVnZSBvciB1bml2ZXJzaXR5IGNvbXBsZXRlIikKCgpwb3B1bGF0aW9uX2luZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uIDwtIGFzLmRhdGEuZnJhbWUobGVmdF9qb2luKGluZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uXzRfZmluYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl81LAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBqb2luX2J5KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlciwgbGV2ZWxfb2ZfZWR1Y2F0aW9uKSkpICU+JQogICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpICU+JQogICBtdXRhdGVfYXQodmFycygtYyhwcmlzb25lcnMsIHBvcHVsYXRpb24sIHllYXIpKSwgYXMuZmFjdG9yKSAlPiUKICAgbXV0YXRlKGxldmVsX29mX2VkdWNhdGlvbiA9IGZhY3RvcihsZXZlbF9vZl9lZHVjYXRpb24sIGxldmVscyA9IGVkdWNhdGlvbl9sZXZlbF9jb3JyZWN0X29yZGVyKSkKYGBgCgojIyBQTkFEQyBUYWJsZSAtIElORk9QRU4gTGV2ZWwgb2YgRWR1Y2F0aW9uCgpgYGB7ciB2aWV3IHBvcHVsYWNhb19pbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbiAsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhdGlvbl9pbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbiwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIElCR0UgRXRobmljaXR5IFRhYmxlCgpUaGlzIFRhYmxlIGhhcyB0aGUgZXRobmljIHBlcmNlbnRhZ2UgZGlzdHJpYnV0aW9uIG9mIHRoZSBCcmF6aWxpYW4gcG9wdWxhdGlvbiBieSBzdGF0ZS4gVGhlIGZpbGUgdG8gYmUgd29ya2VkIG9uIGhlcmUgaXMgY2FsbGVkICJQTkFEYy9UYWJlbGEgMS4xIERJU1QgUEVSQ0VUIFJBQ0EueGxzIiwgYW5kIGNhbiBiZSBmb3VuZCBvbiB0aGUgW0lCR0VdKGh0dHBzOi8vd3d3LmliZ2UuZ292LmJyL2VzdGF0aXN0aWNhcy9kb3dubG9hZHMtZXN0YXRpc3RpY2FzLmh0bWwpIHdlYnNpdGUuCiAKSSdsbCBza2lwIHRoZSBkYXRhIHJlYWRpbmcgcGFydCBhcyBpdCBkb2Vzbid0IGRpZmZlciBhdCBhbGwgZnJvbSB0aGUgcHJldmlvdXMgdGFibGVzLgpgYGB7ciBUYWJsZSAxLjEgRElTVCBQRVJDRVQgUkFDQSwgaW5jbHVkZT1GQUxTRX0KIyBHZXQgdGhlIG5hbWUgb2YgYWxsIHNoZWV0cyBpbiB0aGUgZmlsZQpzaGVldF9uYW1lc19ldGhuaWFfcmVnaW9uX3RhYmVsYV8xLjEgPC0gZXhjZWxfc2hlZXRzKCJQTkFEYy9UYWJlbGEgMS4xIERJU1QgUEVSQ0VUIFJBQ0EueGxzIikKCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBkYXRhZnJhbWUKcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb24gPC0gZGF0YS5mcmFtZSgpCgojIExvb3AgdG8gcmVhZCBlYWNoIHNoZWV0IGFuZCBhZGQgdG8gZGF0YWZyYW1lIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uCmZvciAoc2hlZXRfbmFtZV90YWJsZV8xLjEgaW4gc2hlZXRfbmFtZXNfZXRobmlhX3JlZ2lvbl90YWJlbGFfMS4xKSB7CiAgICMgUmVhZCB0aGUgY3VycmVudCBzaGVldAogICBjdXJyZW50X3NoZWV0X3RhYmxlXzEuMSA8LSByZWFkX3hscygiUE5BRGMvVGFiZWxhIDEuMSBESVNUIFBFUkNFVCBSQUNBLnhscyIsIHNoZWV0ID0gc2hlZXRfbmFtZV90YWJsZV8xLjEsIHJhbmdlID0gIkE1OkszNyIpCiAgCiAgICMgQWRkIGEgJ3llYXInIGNvbHVtbiB3aXRoIHRoZSBzaGVldCBuYW1lCiAgIGN1cnJlbnRfc2hlZXRfdGFibGVfMS4xJHllYXIgPC0gc2hlZXRfbmFtZV90YWJsZV8xLjEKICAKICAgIyBSZW5hbWUgY29sdW1ucwogICBjb2xuYW1lcyhjdXJyZW50X3NoZWV0X3RhYmxlXzEuMSkgPC0gYygic3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbCIsICJjdl90b3RhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoaXRlIiwgImN2X2JyYW5jYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJsYWNrIiwgImN2X2JsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJvd24iLCAiY3ZfQnJvd24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZWxsb3dfaW5kaWdlbm91cyIsICJjdl9ZZWxsb3dfaW5kaWdlbm91cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInllYXIiKQogIAogICAjIHJlbW92ZSB0aGUgZmlyc3QgbGluZQogICBjdXJyZW50X3NoZWV0X3RhYmxlXzEuMSA8LSBjdXJyZW50X3NoZWV0X3RhYmxlXzEuMVstMSxdCiAgCiAgICMgQWRkIHRoZSBjdXJyZW50IHNoZWV0IHRvIHRoZSBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbiBkYXRhZnJhbWUKICAgcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb24gPC0gYmluZF9yb3dzKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uLCBjdXJyZW50X3NoZWV0X3RhYmxlXzEuMSkKfQoKIyMgcmVtb3ZpbmcgY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uIGNvbHVtbnMKcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fMiA8LSBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbiAlPiUKICAgc2VsZWN0KHllYXIsIHN0YXRlLCBUb3RhbCwgV2hpdGUsCiAgICAgICAgICBCbGFjaywgQnJvd24pICU+JQogICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhciksCiAgICAgICAgICBzdGF0ZSA9IHN0YXRlX2RpY3RbYXMuY2hhcmFjdGVyKHN0YXRlKV0sICMjIHVzaW5nIHRoZSBzdGF0ZSBkaWN0aW9uYXJ5IHRvIGZpbHRlciByZWdpb25zCiAgICAgICAgICBzdGF0ZSA9IGFzLmZhY3RvcihzdGF0ZSkpICU+JQogICBuYS5vbWl0KCkKCnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzIgPC0gYXMuZGF0YS5mcmFtZShwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl8yKQoKYGBgCgpgYGB7ciB2aWV3IGRpc3QgZXRobmljaXR5IGFuZCByZWdpb24sIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fMikpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgpUaGlzIHRhYmxlIGhhcyBkYXRhIGZyb20gMjAxMiB0byAyMDE4LiBJJ20gZ29pbmcgdG8gdXNlIHRoZSBmb3JtdWxhIHdlIGRpc2N1c3NlZCBhdCB0aGUgYmVnaW5uaW5nIHRvIGVzdGltYXRlIHRoZSBwb3B1bGF0aW9uIGluIDIwMTkuCkknbGwgc3RhcnQgYnkgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIGluIHRoZSB0YWJsZSwgYXMgdGhlIG51bWJlciBwcmVzZW50IGluIHRoZSB0b3RhbCBjb2x1bW4gbXVzdCBzdGlsbCBiZSBtdWx0aXBsaWVkIGJ5IDEwMDAsIGFuZCB0aGUgZXRobmljaXR5IHZhbHVlcyBhcmUgaW4gcGVyY2VudGFnZSBpbiByZWxhdGlvbiB0byB0aGUgdG90YWwuCgpgYGB7ciB0dXJuIHBlcmNlbnRhZ2VzIGludG8gdmFsdWVzfQpwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl8zIDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzIgJT4lCiAgIG11dGF0ZSgKICAgICBUb3RhbCA9IHJvdW5kKFRvdGFsKjEwMDApLAogICAgIFdoaXRlID0gcm91bmQoV2hpdGUqVG90YWwvMTAwKSwKICAgICBCbGFjayA9IHJvdW5kKEJsYWNrKlRvdGFsLzEwMCksCiAgICAgQnJvd24gPSByb3VuZChCcm93bipUb3RhbC8xMDApKQoKYGBgCgoKYGBge3IgcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fMyBjYWxjdWxhdGUgdmFsdWVzIGZvciAyMDE5LCBpbmNsdWRlPUZBTFNFfQpwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl80IDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzMgJT4lCiAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB5ZWFyLCB2YWx1ZXNfZnJvbSA9IFRvdGFsOkJyb3duKQoKcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fNSA8LSBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl80ICU+JQogICBtdXRhdGUoCiAgICAgVG90YWxfMjAxOSA9IHJvdW5kKGZvcm11bGEoVG90YWxfMjAxOCwyMDE4LFRvdGFsXzIwMTIsMjAxMiwyMDE5KSksCiAgICAgV2hpdGVfMjAxOSA9IHJvdW5kKGZvcm11bGEoV2hpdGVfMjAxOCwyMDE4LFdoaXRlXzIwMTIsMjAxMiwyMDE5KSksCiAgICAgQnJvd25fMjAxOSA9IHJvdW5kKGZvcm11bGEoQnJvd25fMjAxOCwyMDE4LEJyb3duXzIwMTIsMjAxMiwyMDE5KSksCiAgICAgQmxhY2tfMjAxOSA9IHJvdW5kKGZvcm11bGEoQmxhY2tfMjAxOCwyMDE4LEJsYWNrXzIwMTIsMjAxMiwyMDE5KSkpCgpwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl82IDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzUgJT4lCiAgIHBpdm90X2xvbmdlcihjb2xzID0gLXN0YXRlLCBuYW1lc190byA9IGMoIi52YWx1ZSIsICJ5ZWFyIiksIG5hbWVzX3NlcCA9ICJfIikgJT4lCiAgIGZpbHRlcih5ZWFyICVpbiUgYygiMjAxNiIsIjIwMTciLCIyMDE4IiwiMjAxOSIpKSAlPiUKICAgc2VsZWN0KC1Ub3RhbCkKCnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzcgPC0gcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fNiAlPiUKICAgICBwaXZvdF9sb25nZXIoY29scyA9IGMoIkJsYWNrIiwgIldoaXRlIiwgIkJyb3duIiksCiAgICAgICAgICAgICAgICBuYW1lc190bz0iZXRobmljaXR5IiwKICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwb3B1bGF0aW9uIikKCmBgYAoKRmluYWxseSwgdGhlIHRhYmxlIHRoYXQgd2Ugd2lsbCB1c2UgdG8gbWF0Y2ggdGhhdCBvZiBJTkZPUEVOCmBgYHtyIHRhYmxlIHBvcHVsYXRpb25fZXRobmljaXR5LGluY2x1ZGU9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBvcHVsYXRpb25fZXRobmljaXR5IDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzcgJT4lCiAgIG1lcmdlKHN0YXRlX3JlZ2lvbiwgYnkgPSAic3RhdGUiLCBhbGwueCA9IFRSVUUpICU+JQogICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhciksCiAgICAgZXRobmljaXR5ID0gaWZfZWxzZShldGhuaWNpdHkgPT0gIldoaXRlIiwgIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShldGhuaWNpdHkgJWluJSBjKCJCbGFjayIsICJCcm93biIpLCAiYmxhY2sgb3IgYnJvd24iLE5BKSkpICU+JQogICBncm91cF9ieSh5ZWFyLCBzdGF0ZSwgcmVnaW9uLCBldGhuaWNpdHkpICU+JQogICBzdW1tYXJpc2UocG9wdWxhdGlvbiA9IHN1bShwb3B1bGF0aW9uKSkgJT4lCiAgIHNlbGVjdCh5ZWFyLCByZWdpb24sIHN0YXRlLCBldGhuaWNpdHksIHBvcHVsYXRpb24pCgpgYGAKCgojIyBFdGhuaWMgRGlzdHJpYnV0aW9uIG9mIHRoZSBCcmF6aWxpYW4gUG9wdWxhdGlvbgoKYGBge3IgdmlldyBvZiBwb3B1bGF0aW9uX2V0aG5pY2l0eSB0YWJsZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2V0aG5pY2l0eSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIyBNaXNzaW5nIE9ic2VydmF0aW9ucyBpbiB0aGUgSU5GT1BFTiBUYWJsZQpBZnRlciBtYW5pcHVsYXRpbmcgdGhlIGRhdGEgZnJvbSB0aGlzIElCR0UgdGFibGUsIEkgd2lsbCBjb21iaW5lIGl0IHdpdGggdGhlIElORk9QRU4gdGFibGUsIGluIG9yZGVyIHRvIGNvcnJlbGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHByaXNvbmVycyBhbmQgdGhlIHBvcHVsYXRpb24gZm9yIGVhY2ggdmFyaWFibGUuIEhvd2V2ZXIsIHdoZW4gY29tYmluaW5nIHRoZSBkYXRhZnJhbWVzLCBJIGRpc2NvdmVyZWQgdGhhdCB0aGVyZSBhcmUgbWlzc2luZyBvYnNlcnZhdGlvbnMgaW4gdGhlIGluZm9wZW5fZXRuaWFfM19maW5hbCB0YWJsZSBiZWNhdXNlIGl0IGhhcyBmZXdlciByb3dzIHRoYW4gdGhlIFBOQUQgdGFibGUuIEkgd2lsbCB1c2UgYW50aS1qb2luIHRvIGZpbmQgdGhlbSBhbmQgbGluZWFyIHJlZ3Jlc3Npb24gdG8gY2FsY3VsYXRlIHRoZW0KCmBgYHtyIGRpZmZlcmVuY2VfaW5mb3Blbl9wb3B1bGF0aW9uX2V0aG5pY2l0eSwgaW5jbHVkZT1GQUxTRX0KZGlmZmVyZW5jZV9pbmZvcGVuX3BvcHVsYXRpb25fZXRobmljaXR5IDwtIGFudGlfam9pbihwb3B1bGF0aW9uX2V0aG5pY2l0eSwgaW5mb3Blbl9ldGhuaWNpdHlfM19maW5hbCwgYnkgPSBqb2luX2J5KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGV0aG5pY2l0eSkpICU+JQogICBtdXRhdGUoc3RhdGUgPSBhcy5jaGFyYWN0ZXIoc3RhdGUpKSAlPiUKICAgc2VsZWN0KC1wb3B1bGF0aW9uKQpgYGAKClRoZXNlIGFyZSB0aGUgbWlzc2luZyBvYnNlcnZhdGlvbnMgaW4gdGhlIElORk9QRU4gdGFibGUKYGBge3IgaGVhZChkaWZmZXJlbmNlX2luZm9wZW5fcG9wdWxhdGlvbl9ldGhuaWNpdHkpfQpoZWFkKGRpZmZlcmVuY2VfaW5mb3Blbl9wb3B1bGF0aW9uX2V0aG5pY2l0eSkKYGBgCgpgYGB7ciBzZXJnaXBlX2V0aG5pY2l0eSwgaW5jbHVkZT1GQUxTRX0Kc2VyZ2lwZV9ldGhuaWNpdHkgPC0gaW5mb3Blbl9ldGhuaWNpdHlfM19maW5hbCAlPiUKICAgZmlsdGVyKHN0YXRlID09IlNFIiwgeWVhciA8IDIwMTkpCgoKIyBmdW5jdGlvbiB0byBwcmVkaWN0IHRoZSB5ZWFyIDIwMTkKcHJlZGljdF9pbmZvcGVuX2V0aG5pY2l0eSA8LSBmdW5jdGlvbihkYXRhKSB7CiAgIG1vZGVsIDwtIGxtKHByaXNvbmVycyB+IHllYXIsIGRhdGEgPSBkYXRhKQogICBwcmVkaWN0KG1vZGVsLCBuZXdkYXRhID0gZGF0YS5mcmFtZSh5ZWFyID0gMjAxOSkpCn0KCiMjIGZvcmVjYXN0IGZvciAyMDE5CnByZWRpY3Rpb25zXzIwMTlfaW5mb3Blbl9ldGhuaWNpdHkgPC0gc2VyZ2lwZV9ldGhuaWNpdHkgJT4lCiAgIGdyb3VwX2J5KHJlZ2lvbiwgc3RhdGUsIGV0aG5pY2l0eSkgJT4lCiAgIG5lc3QoKSAlPiUKICAgbXV0YXRlKHByaXNvbmVycyA9IHJvdW5kKG1hcF9kYmwoZGF0YSwgcHJlZGljdF9pbmZvcGVuX2V0aG5pY2l0eSkpLAogICAgICAgICAgeWVhciA9IDIwMTkpICU+JSAjYWRkIHRoZSB5ZWFyIGNvbHVtbiB3aXRoIHRoZSB2YWx1ZSAyMDE5CiAgIHNlbGVjdCgtZGF0YSkKYGBgCgpBZnRlciBzb21lIGNhbGN1bGF0aW9ucywgSSBhcnJpdmVkIGF0IHRoaXMgcmVzdWx0IG9mIHByZWRpY3RpbmcgcHJpc29uZXJzIGFuZCBlYWNoIG9ic2VydmF0aW9uOgpgYGB7ciBoZWFkKDIwMTlfcHJlZGljdGlvbnNfaW5mb3Blbl9ldGhuaWNpdHkpfQpoZWFkKHByZWRpY3Rpb25zXzIwMTlfaW5mb3Blbl9ldGhuaWNpdHkpCmBgYAogIApOb3cgaXQgaXMgZW5vdWdoIHRvIGNvbWJpbmUgdGhlIHRhYmxlcyB3aXRoIGRhdGEgb24gdGhlIGV0aG5pY2l0eSBvZiB0aGUgdG90YWwgQnJhemlsaWFuIHBvcHVsYXRpb24gd2l0aCB0aGUgcHJpc29uIHBvcHVsYXRpb24gYW5kIHRoZW4gd2Ugd2lsbCBhcnJpdmUgYXQgdGhpcyB0YWJsZToKYGBge3IgY29tYmluZSBldGhuaWNpdHkgaW5mb3BlbiB0YWJsZXMgd2l0aCBtaXNzaW5nIGRhdGEsIGluY2x1ZGU9RkFMU0V9CnNlcmdpcGVfZXRobmljaXR5IDwtcmJpbmQoc2VyZ2lwZV9ldGhuaWNpdHksIHByZWRpY3Rpb25zXzIwMTlfaW5mb3Blbl9ldGhuaWNpdHkpCgojIyBmaW5hbGx5IHRoZSBjb21wbGV0ZSBpbmZvcGVuIHRhYmxlCmluZm9wZW5fZXRobmljaXR5XzQgPC0gcmJpbmQoaW5mb3Blbl9ldGhuaWNpdHlfM19maW5hbCwgc2VyZ2lwZV9ldGhuaWNpdHkpICU+JQogICBkaXN0aW5jdCgpCgojIyB0YWJsZSB3aXRoIGRhdGEgY29tYmluYXRpb24KcG9wdWxhdGlvbl9pbmZvcGVuX2V0aG5pY2l0eSA8LSBhcy5kYXRhLmZyYW1lKGxlZnRfam9pbihpbmZvcGVuX2V0aG5pY2l0eV80LCBwb3B1bGF0aW9uX2V0aG5pY2l0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gam9pbl9ieSh5ZWFyLCByZWdpb24sIHN0YXRlLCBldGhuaWNpdHkpKSkgJT4lCiAgIG11dGF0ZV9hdCh2YXJzKC1jKHByaXNvbmVycywgcG9wdWxhdGlvbiwgeWVhcikpLCBhcy5mYWN0b3IpICU+JQogICBtdXRhdGUocHJpc29uZXJzID0gYXMubnVtZXJpYyhwcmlzb25lcnMpKQoKYGBgCiAgCiMjIFBOQURDIFRhYmxlIC0gSU5GT1BFTiBFdGhuaWNpdHkKICAKYGBge3IgdmlldyBvZiBwb3B1bGF0aW9uX2luZm9wZW5fZXRobmljaXR5IHRhYmxlLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25faW5mb3Blbl9ldGhuaWNpdHksMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKIyBJQkdFIEFnZSBSYW5nZSBUYWJsZQoKVGhlIGZpbGUgdG8gYmUgd29ya2VkIG9uIGhlcmUgaXMgY2FsbGVkICJUYWJlbGEgMS4yIERJU1QgUE9QIEVUQVJJQS54bHMiLCBhbmQgY2FuIGJlIGZvdW5kIG9uIHRoZSBbSUJHRV0oaHR0cHM6Ly93d3cuaWJnZS5nb3YuYnIvZXN0YXRpc3RpY2FzL2Rvd25sb2Fkcy1lc3RhdGlzdGljYXMuaHRtbCkgd2Vic2l0ZS4KICAKVGhpcyB0YWJsZSBoYXMgZGF0YSBvbiB0aGUgYWdlIGdyb3VwIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcG9wdWxhdGlvbiBieSBldGhuaWNpdHkuCipJbmRpZ2Vub3VzIHBlb3BsZSwgQXNpYW5zIGFuZCBwZW9wbGUgd2l0aCBubyBkZWNsYXJhdGlvbiBvZiBjb2xvciBvciByYWNlIGFyZSBpbmNsdWRlZCBpbiB0aGUgdG90YWwuKgoKYGBge3IgVGFibGUgMS4yIERJU1QgUE9QIEVUQVJJQSwgaW5jbHVkZT1GQUxTRX0KCiMgR2V0IHRoZSBuYW1lIG9mIGFsbCBzaGVldHMgaW4gdGhlIGZpbGUKbmFtZXNfc2hlZXRzX3BvcHVsYXRpb25fYnlfYWdlX3RhYmxlXzEuMiA8LSBleGNlbF9zaGVldHMoIlBOQURjL1RhYmVsYSAxLjIgRElTVCBQT1AgRVRBUklBLnhscyIpCgojIEluaXRpYWxpemUgYW4gZW1wdHkgZGF0YWZyYW1lCnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZSA8LSBkYXRhLmZyYW1lKCkKCiMgTG9vcCB0byByZWFkIGVhY2ggc2hlZXQgYW5kIGFkZCB0byBkYXRhZnJhbWUgZGlzdHJpYnV0aW9uX3BvcHVsYXRpb25fYnlfYWdlCmZvciAoc2hlZXRfbmFtZV90YWJsZV8xLjIgaW4gbmFtZXNfc2hlZXRzX3BvcHVsYXRpb25fYnlfYWdlX3RhYmxlXzEuMikgewogICAjIFJlYWQgdGhlIGN1cnJlbnQgc2hlZXQKICAgY3VycmVudF9zaGVldF90YWJsZV8xLjIgPC0gcmVhZF94bHMoIlBOQURjL1RhYmVsYSAxLjIgRElTVCBQT1AgRVRBUklBLnhscyIsIHNoZWV0ID0gc2hlZXRfbmFtZV90YWJsZV8xLjIsIHJhbmdlID0gIkE1OksyMyIpCiAgCiAgICMgQWRkIGEgJ3llYXInIGNvbHVtbiB3aXRoIHRoZSBzaGVldCBuYW1lCiAgIGN1cnJlbnRfc2hlZXRfdGFibGVfMS4yJHllYXIgPC0gc2hlZXRfbmFtZV90YWJsZV8xLjIKICAKICAgIyBSZW5hbWUgY29sdW1ucwogICBjb2xuYW1lcyhjdXJyZW50X3NoZWV0X3RhYmxlXzEuMikgPC0gYygiYWdlX3JhbmdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwiLCAiY3ZfdG90YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGl0ZSIsICJjdl93aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsYWNrX2Jyb3duIiwgImN2X2JsYWNrX2Jyb3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcG9ydGlvbl93aGl0ZSIsICJjdl9wcm9wb3J0aW9uX3doaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcG9ydGlvbl9ibGFja19icm93biIsICJjdl9wcm9wb3J0aW9uX2JsYWNrX2Jyb3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVhciIpCiAgCiAgICMgcmVtb3ZlIHRoZSBmaXJzdCBsaW5lCiAgIGN1cnJlbnRfc2hlZXRfdGFibGVfMS4yIDwtIGN1cnJlbnRfc2hlZXRfdGFibGVfMS4yWy0xLF0KICAKICAgIyBBZGQgdGhlIGN1cnJlbnQgc2hlZXQgdG8gZGF0YWZyYW1lIGRpc3RyaWJ1dGlvbl9wb3B1bGF0aW9uX2J5X2FnZQogICBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2UgPC0gYmluZF9yb3dzKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZSwgY3VycmVudF9zaGVldF90YWJsZV8xLjIpICU+JQogICAgIG11dGF0ZShhZ2VfcmFuZ2UgPSBjYXNlX3doZW4oCiAgICBzdHJfZGV0ZWN0KGFnZV9yYW5nZSwgIlxcZCsgYSBcXGQrIGFub3MiKSB+IHN0cl9yZXBsYWNlKGFnZV9yYW5nZSwgIihcXGQrKSBhIChcXGQrKSBhbm9zIiwgIlxcMSB0byBcXDIgeWVhcnMgb2xkIiksCiAgICBhZ2VfcmFuZ2UgPT0gIjgwIGFub3MgZSBtYWlzIiB+ICI4MCB5ZWFycyBvbGQgYW5kIG92ZXIiLAogICAgVFJVRSB+IGFnZV9yYW5nZSkpCiAgIAp9CmBgYAoKYGBge3IgdGFibGUgdmlldyBUYWJsZSAxLjIgUE9QIEVUQVJJQSBESVNULCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgpgYGB7ciBmaWx0ZXJpbmcgYW5kIG9yZ2FuaXppbmcgdGhlIGRhdGEgSSB3aWxsIG5lZWQsIGluY2x1ZGU9RkFMU0V9CnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV8yIDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZSAlPiUKICAgc2VsZWN0KHllYXIsIGFnZV9yYW5nZSx0b3RhbCkgJT4lCiAgIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSwKICAgICAgICAgIGFnZV9yYW5nZSA9IGFzLmZhY3RvcihhZ2VfcmFuZ2UpLAogICAgICAgICAgdG90YWwgPSB0b3RhbCoxMDAwKSAlPiUKICAgICBmaWx0ZXIoIXN0cl9kZXRlY3QoYWdlX3JhbmdlLCAiMCB0byA0IHllYXJzIG9sZHw1IHRvIDkgeWVhcnMgb2xkfDEwIHRvIDE0IHllYXJzIG9sZHwxNSB0byAxOSB5ZWFycyBvbGR8MjAgdG8gMjQgeWVhcnMgb2xkIikpCgpgYGAKCkxpa2UgdGhlIHByZXZpb3VzIHRhYmxlLCB0aGlzIG9uZSBvbmx5IGhhcyBkYXRhIGZyb20gMjAxMiB0byAyMDE4LCBzbyBJIHdpbGwgdXNlIHRoZSBzYW1lIGZvcm11bGEgdG8gcHJlZGljdCB0aGUgcG9wdWxhdGlvbiBpbiAyMDE5LgoKYGBge3IgcmFuZ2VfYWdlIHdpZGUsIGluY2x1ZGU9RkFMU0V9CnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV8zIDwtIHBpdm90X3dpZGVyKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV8yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IHllYXIsIHZhbHVlc19mcm9tID0gdG90YWwpCgpwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfMyA8LSBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfMyAlPiUKICAgbXV0YXRlKAogICAgIGAyMDE5YCA9IHJvdW5kKGZvcm11bGEoYDIwMThgLDIwMTgsYDIwMTJgLDIwMTIsMjAxOSkpCiAgICkKCnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV80IDwtIHBpdm90X2xvbmdlcihwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IC1hZ2VfcmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvPSJ5ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBvcHVsYXRpb24iKSAlPiUKICAgZmlsdGVyKHllYXIgJWluJSBjKCIyMDE2IiwiMjAxNyIsIjIwMTgiLCIyMDE5IikpCmBgYAoKCiMjIFN0YW5kYXJkaXphdGlvbiBvZiBBZ2UgUmFuZ2VzCiAgCkFzIHlvdSBjYW4gc2VlIGJlbG93LCBhbHRob3VnaCB3ZSBub3cgaGF2ZSBkYXRhIGZyb20gMjAxNiB0byAyMDE5LCB0aGUgYWdlIGdyb3VwcyBhcmUgbm90IGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhvc2UgZnJvbSBJTkZPUEVOLCBidXQgdGhleSBhcmUgdmVyeSBjbG9zZS4KYGBge3IgdGFibGUgdmlldyB3aXRoIGRhdGEgMjAxMiB0byAyMDE5LCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV80LDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKV2hhdCBJJ20gZ29pbmcgdG8gZG8gaXMgY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBhZGp1c3RzIHRoZSBhZ2UgZ3JvdXBzIHRvIGJlIGluIGFjY29yZGFuY2Ugd2l0aCB0aG9zZSBvZiBJTkZPUEVOCmBgYHtyIGZ1bmN0aW9uIHRoYXQgYWRqdXN0cyB0aGUgYWdlIHJhbmdlfQphZGp1c3RfYWdlX3JhbmdlIDwtIGZ1bmN0aW9uKHJhbmdlKSB7CiAgIGlmIChyYW5nZSAlaW4lIGMoIjI1IHRvIDI5IHllYXJzIG9sZCIpKSB7CiAgICAgcmV0dXJuKCIyNSB0byAyOSB5ZWFycyBvbGQiKQogICB9IGVsc2UgaWYgKHJhbmdlICVpbiUgYygiMzAgdG8gMzQgeWVhcnMgb2xkIikpIHsKICAgICByZXR1cm4oIjMwIHRvIDM0IHllYXJzIG9sZCIpCiAgIH0gZWxzZSBpZiAocmFuZ2UgJWluJSBjKCIzNSB0byAzOSB5ZWFycyBvbGQiLCAiNDAgdG8gNDQgeWVhcnMgb2xkIikpIHsKICAgICByZXR1cm4oIjM1IHRvIDQ1IHllYXJzIG9sZCIpCiAgIH0gZWxzZSBpZiAocmFuZ2UgJWluJSBjKCI0NSB0byA0OSB5ZWFycyBvbGQiLCAiNTAgdG8gNTQgeWVhcnMgb2xkIiwgIjU1IHRvIDU5IHllYXJzIG9sZCIpKSB7CiAgICAgcmV0dXJuKCI0NiB0byA2MCB5ZWFycyBvbGQiKQogICB9IGVsc2UgaWYgKHJhbmdlICVpbiUgYygiNjAgdG8gNjQgeWVhcnMgb2xkIiwgIjY1IHRvIDY5IHllYXJzIG9sZCIpKSB7CiAgICAgcmV0dXJuKCI2MSB0byA3MCB5ZWFycyBvbGQiKQogICB9IGVsc2UgaWYgKHJhbmdlICVpbiUgYygiNzAgdG8gNzQgeWVhcnMgb2xkIiwgIjc1IHRvIDc5IHllYXJzIG9sZCIsICI4MCB5ZWFycyBvbGQgYW5kIG92ZXIiKSkgewogICAgIHJldHVybigib3ZlciA3MCB5ZWFycyBvbGQiKQogICB9IGVsc2UgewogICAgIHJldHVybihOQSkKICAgfQp9CmBgYAoKYGBge3IgQWRqdXN0aW5nIGFnZSByYW5nZXMsIGluY2x1ZGU9RkFMU0V9CnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV80JGFnZV9yYW5nZSA8LSBzYXBwbHkocG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfYWdlXzQkYWdlX3JhbmdlLCBhZGp1c3RfYWdlX3JhbmdlKQpgYGAKCgpgYGB7ciB0YWJsZSBvcmdhbml6YXRpb24gYW5kIGRhdGEgc3VtbWFyaXphdGlvbiwgaW5jbHVkZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfYWdlXzUgPC0gcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfYWdlXzQgJT4lCiAgIGdyb3VwX2J5KHllYXIsIGFnZV9yYW5nZSkgJT4lCiAgIHN1bW1hcmlzZShwb3B1bGF0aW9uID0gc3VtKHBvcHVsYXRpb24pKQpgYGAKCkhlcmUgeW91IGNhbiBoYXZlIGEgdmlzdWFsaXphdGlvbiBvZiB0aGUgdGFibGUgdGhhdCBJIGhhdmUgdW50aWwgdGhlbi4KYGBge3IgdmlldyBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfNSB0YWJsZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfNSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCkl0IG1heSBiZSBub3RlZCB0aGF0IEkgZG8gbm90IGhhdmUgdGhlIDE4IHRvIDI0IHllYXIgb2xkIHBvcHVsYXRpb24uIEknbSBnb2luZyB0byBleHRyYWN0IHRoaXMgYWdlIHJhbmdlIGZyb20gYW5vdGhlciBQTkFEIHRhYmxlLCB3aGljaCB3ZSd2ZSB3b3JrZWQgb24gYmVmb3JlLgoKYGBge3IgcG9wdWxhdGlvbl8xOF90b18yNF95ZWFycyBvbGQsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBvcHVsYXRpb25fMThfdG9fMjRfeWVhcnMgPC0gcG5hZF80X3BvcHVsYXRpb25fYWdlICU+JQogICBmaWx0ZXIoZ3JlcGwoIjE4IGEgMjQgYW5vcyIsIGFnZV9ncm91cCksCiAgICAgICAgICBncmVwbCgiVG90YWzCuSIsIGV0aG5pY2l0eSkpICU+JQogICBzZWxlY3QoLWdlbmRlcikgJT4lICMgSSB3aWxsIHJlbW92ZSBnZW5kZXIgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgKGJlY2F1c2UgSSBoYXZlIGdlbmRlciBhbmQgZXRobmljaXR5KQogICByZW5hbWUoYWdlX3JhbmdlID0gYWdlX2dyb3VwLAogICAgICAgICAgcG9wdWxhdGlvbiA9IHZhbHVlKSU+JQogICBncm91cF9ieSh5ZWFyLCBhZ2VfcmFuZ2UsIGV0aG5pY2l0eSkgJT4lCiAgIHN1bW1hcmlzZShwb3B1bGF0aW9uID0gc3VtKHBvcHVsYXRpb24pKSAlPiUKICAgc2VsZWN0KC1ldGhuaWNpdHkpICU+JSAjIGZpbmFsbHkgSSByZW1vdmUgdGhlIGV0aG5pY2l0eSBjb2x1bW4gdGhhdCBvbmx5IGNvbnRhaW5zICdUb3RhbCcKICAgZHJvcF9uYSgpCmBgYAoKQXMgcHJldmlvdXNseSBkZW1vbnN0cmF0ZWQsIEkgd2lsbCB1c2UgYXJpdGhtZXRpYyB0byBwcmVkaWN0IHRoZSBwb3B1bGF0aW9uIGluIDIwMTkuCmBgYHtyIHBvcHVsYXRpb25fMThfdG9fMjRfeWVhcnMgMjAxNiB0byAyMDE5LGluY2x1ZGU9RkFMU0V9CnBvcHVsYXRpb25fMThfdG9fMjRfeWVhcnNfd2lkZSA8LSBwaXZvdF93aWRlcihwb3B1bGF0aW9uXzE4X3RvXzI0X3llYXJzLCBuYW1lc19mcm9tID0geWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHBvcHVsYXRpb24pCgpwb3B1bGF0aW9uXzE4X3RvXzI0X3llYXJzXzIgPC0gcG9wdWxhdGlvbl8xOF90b18yNF95ZWFyc193aWRlICU+JQogICBtdXRhdGUoCiAgICAgYDIwMTlgID0gcm91bmQoZm9ybXVsYShgMjAxOGAsMjAxOCxgMjAxNmAsMjAxNiwyMDE5KSkKICAgKQoKcG9wdWxhdGlvbl8xOF90b18yNF95ZWFyc18zIDwtIHBpdm90X2xvbmdlcihwb3B1bGF0aW9uXzE4X3RvXzI0X3llYXJzXzIsIGNvbHMgPSAtYWdlX3JhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190bz0ieWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwb3B1bGF0aW9uIikgJT4lIAogIG11dGF0ZShhZ2VfcmFuZ2UgPSBjYXNlX3doZW4oYWdlX3JhbmdlID09ICIxOCBhIDI0IGFub3MiIH4gIjE4IHRvIDI0IHllYXJzIG9sZCIpKQpgYGAKCmBgYHtyIHBvcHVsYXRpb25fYWdlX3JhbmdlXywgZWNobz1GQUxTRX0KcG9wdWxhdGlvbl9hZ2VfcmFuZ2UgPC0gcmJpbmQocG9wdWxhdGlvbl8xOF90b18yNF95ZWFyc18zLCBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfNSkgJT4lIG11dGF0ZSgKICAgeWVhciA9IGFzLm51bWVyaWMoeWVhciksCiAgIGFnZV9yYW5nZSA9IGFzLmZhY3RvcihhZ2VfcmFuZ2UpLAopCmBgYAogIAojIyBEaXN0cmlidXRpb24gb2YgdGhlIEFnZSBSYW5nZSBvZiB0aGUgQnJhemlsaWFuIFBvcHVsYXRpb24KICAKRmluYWxseSwgdGhlIHRhYmxlIHdpdGggYWxsIGFnZSBncm91cHMgZXF1YWwgdG8gSU5GT1BFTgpgYGB7ciB2aWV3IHBvcHVsYXRpb25fYWdlX3JhbmdlIHRhYmxlLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGFycmFuZ2UocG9wdWxhdGlvbl9hZ2VfcmFuZ2UseWVhciksMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAogIApOb3cgaXQgcmVtYWlucyBvbmx5IHRvIGNvbWJpbmUgdGhlIGFnZSByYW5nZSB0YWJsZXMuCmBgYHtyIGNvbWJpbmUgSU5GT1BFTiBhbmQgUE5BRCBhZ2UgZ3JvdXAgdGFibGVzIH0KcG9wdWxhdGlvbl9pbmZvcGVuX2FnZV9yYW5nZSA8LSBhcy5kYXRhLmZyYW1lKGxlZnRfam9pbihpbmZvcGVuX2FnZV9yYW5nZV80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW9uX2FnZV9yYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBqb2luX2J5KHllYXIsIGFnZV9yYW5nZSkpKSAlPiUKICAgbXV0YXRlKGFnZV9yYW5nZSA9IGFzLmZhY3RvcihhZ2VfcmFuZ2UpKQoKYGBgCgoKIyMgUE5BREMgVGFibGUgLSBJTkZPUEVOIGJ5IEFnZSBHcm91cAoKYGBge3IgdmlldyB0aGUgdGFibGUgcG9wdWxhY2FvX2luZm9wZW5fZmFpeGFfZXRhcmlhLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGFycmFuZ2UocG9wdWxhdGlvbl9pbmZvcGVuX2FnZV9yYW5nZSx5ZWFyKSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIElCR0UgSW5jb21lIFRhYmxlCgojIyBUb3RhbCBwb3B1bGF0aW9uIGFnZWQgMTQgYW5kIG92ZXIuCgpJIG5lZWQgdGhpcyB0YWJsZSB3aXRoIHRoZSBnZW5lcmFsIHBvcHVsYXRpb24gb3ZlciAxNCB5ZWFycyBvbGQsIGFzIHRoZSBJQkdFIGluY29tZSB0YWJsZSBvbmx5IGNvbnNpZGVycyB0aGlzIGFnZSBncm91cC4gVGhlIHRhYmxlIG9uIGVkdWNhdGlvbiwgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHVzZWQsIGNvbnNpZGVycyB0aGlzIHJhbmdlIG9mIHRoZSBwb3B1bGF0aW9uLgoKYGBge3IgdG90YWxfcG9wdWxhdGlvbl8xNF95ZWFyc19vcl9tb3JlLCBpbmNsdWRlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwb3B1bGF0aW9uX3RvdGFsXzE0X3llYXJzX29sZF9vcl9vdmVyIDwtIGFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uXzUgJT4lCiAgIGdyb3VwX2J5KHJlZ2lvbixzdGF0ZSx5ZWFyKSAlPiUKICAgc3VtbWFyaXplKHBvcHVsYXRpb24gPSBzdW0ocG9wdWxhdGlvbikpCmBgYAoKIyMjIFRhYmxlIG9mIFRvdGFsIFBvcHVsYXRpb24gYWdlZCAxNCBvciBPdmVyLgpgYGB7ciB2aWV3IFRvdGFsIHBvcHVsYXRpb24gYWdlZCAxNCBhbmQgb3ZlciwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX3RvdGFsXzE0X3llYXJzX29sZF9vcl9vdmVyLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIERhdGEgRXhwbGFuYXRpb24KClRoaXMgdGFibGUgaGFzIHRoZSBpbmNvbWUgZGlzdHJpYnV0aW9uIG9mIHRoZSBCcmF6aWxpYW4gcG9wdWxhdGlvbi4KVGhlIElCR0UgaXRzZWxmIHJlbGVhc2VkIGFuIFtpbmZvcm1hdGl2ZV0oaHR0cHM6Ly9iaWJsaW90ZWNhLmliZ2UuZ292LmJyL3Zpc3VhbGl6YWNhby9saXZyb3MvbGl2MTAxNzA5X2luZm9ybWF0aXZvLnBkZikgb24gdGhlIGluY29tZSBkaXN0cmlidXRpb24gb2YgdGhlIEJyYXppbGlhbiBwb3B1bGF0aW9uIGJldHdlZW4gMjAxMiBhbmQgMjAxOS4KCkkgd2lsbCBvbmx5IHdvcmsgd2l0aCBhIGZyYWN0aW9uIG9mIHRoZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGlzIHRhYmxlOiBpbmNvbWUgdXN1YWxseSByZWNlaXZlZCwgYXQgYXZlcmFnZSBwcmljZXMgYW5kIG9ubHkgZm9yIHBlb3BsZSBhZ2VkIDE0IGFuZCBvdmVyLgpBY2NvcmRpbmcgdG8gdGhlIElCR0UsIHVzdWFsIGluY29tZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CiAgCiIgVGhlIHVzdWFsIGluY29tZSBjb25zaXN0cyBvZiB0aGUgbW9udGhseSBpbmNvbWUgcmVjZWl2ZWQgYnkgZW1wbG95ZWVzLCBlbXBsb3llcnMgYW5kIHNlbGYtZW1wbG95ZWQgd29ya2Vycywgd2l0aG91dCBleHRyYW9yZGluYXJ5IGluY3JlYXNlcyBvciBzcG9yYWRpYyBkaXNjb3VudHMuIEZvciB0aGUgZW1wbG95ZWUsIHRoZSBtb250aGx5IGluY29tZSB1c3VhbGx5IHJlY2VpdmVkIGV4Y2x1ZGVzIGFsbCBpbnN0YWxsbWVudHMgdGhhdCBhcmUgbm90IGNvbnRpbnVvdXMgKGFubnVhbCBib251cywgc2FsYXJ5IGxhdGUsIG92ZXJ0aW1lLCBhbm51YWwgcHJvZml0IHNoYXJpbmcsIDEzdGggc2FsYXJ5LCAxNHRoIHNhbGFyeSwgc2FsYXJ5IGFkdmFuY2UsIGV0Yy4pIGFuZCBkb2VzIG5vdCBjb25zaWRlciBvY2Nhc2lvbmFsIGRpc2NvdW50cyAoYWJzZW5jZXMsIHBhcnQgb2YgdGhlIDEzdGggc2FsYXJ5IGFudGljaXBhdGVkLCBwb3NzaWJsZSBkYW1hZ2UgY2F1c2VkIHRvIHRoZSBlbnRlcnByaXNlLCBldGMuKS4KICAKSWYgdGhlIGluY29tZSByZWNlaXZlZCBmcm9tIGFuIGVtcGxveWVlLCBzZWxmLWVtcGxveWVkIHdvcmtlciBhbmQgZW1wbG95ZXIgaXMgdmFyaWFibGUsIHRoZSB1c3VhbCBpbmNvbWUgaXMgY29uc2lkZXJlZCB0byBiZSB0aGUgYXZlcmFnZSBpbmNvbWUgcmVjZWl2ZWQgYnkgdGhlIHBlcnNvbiBpbiB0aGUgcGVyaW9kIGluIHdoaWNoIGhlL3NoZSBjYXJyaWVkIG91dCB0aGUgZGVjbGFyZWQgd29yayBpbiB0aGUgcmVmZXJlbmNlIHdlZWsuIFdoZW4gcmVtdW5lcmF0aW9uIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIHBlcmlvZCBvciBzZWFzb24gb2YgdGhlIHllYXIsIHRoZSBtb250aGx5IGluY29tZSB0aGF0IHRoZSBwZXJzb24gdXN1YWxseSBlYXJucyBpbiB0aGF0IHNlYXNvbmFsIHBlcmlvZCBpcyBjb25zaWRlcmVkLiIgW3NlZSBpdF0oaHR0cDovL2Z0cC5pYmdlLmdvdi5ici9UcmFiYWxob19lX1JlbmRpbWVudG8vUGVzcXVpc2FfTmFjaW9uYWxfcG9yX0Ftb3N0cmFfZGVfRG9taWNpbGlvc19jb250aW51YS9NZW5zYWwvZ2xvc3NhcmlvX3BuYWRjX21lbnNhbC5wZGYpCgojIyBEYXRhIEV4cGxvcmF0aW9uCgpgYGB7ciBQTkFEX0NvbnRpbnVhXzIwMTlfaW5jb21lc19hbGxfc291cmNlcywgaW5jbHVkZT1GQUxTRX0KaW5jb21lX2ZpbGVfcGF0aCA8LSAiUE5BRGMvUE5BRF9Db250aW51YV8yMDE5X1JlbmRpbWVudG9fZGVfVG9kYXNfYXNfRm9udGVzLnhsc3giCnNoZWV0X3VzZWQgPC0gIlJEUEMgKFRyYWIgaGFiK091dHJvcyBlZmV0aXZvKSIKCnBvcHVsYXRpb25faW5jb21lIDwtIHJlYWRfZXhjZWwoaW5jb21lX2ZpbGVfcGF0aCwgc2hlZXQgPSBzaGVldF91c2VkLCBza2lwID0gMTIpCgpwb3B1bGF0aW9uX3dhZ2VfcmFuZ2UgPC1wb3B1bGF0aW9uX2luY29tZSAlPiUKICAgZmlsdGVyKGBBYmVydHVyYSBnZW9ncsOhZmljYWAgPT0gIkJyYXNpbCIsCiAgICAgICAgIFRpcG8gPT0gIlZhbG9yIiwKICAgICAgICAgc3ViLmNsYXNzZSAlaW4lIGMoImF0w6kgNSUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgNSUgYXTDqSAxMCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgMTAlIGF0w6kgMjAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDIwJSBhdMOpIDMwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSAzMCUgYXTDqSA0MCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgNDAlIGF0w6kgNTAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDUwJSBhdMOpIDYwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSA2MCUgYXTDqSA3MCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgNzAlIGF0w6kgODAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDgwJSBhdMOpIDkwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSA5MCUgYXTDqSA5NSUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgOTUlIGF0w6kgOTklIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDk5JSBhdMOpIDEwMCUiCSksCiAgICAgICAgIGluZCA9PSAiUmVuZGltZW50byBtw6lkaW8gbWVuc2FsIHJlYWwgZGFzIHBlc3NvYXMgZGUgMTQgYW5vcyBvdSBtYWlzIGRlIGlkYWRlLCBkZSB0b2RvcyBvcyB0cmFiYWxob3MsIGEgcHJlw6dvcyBtw6lkaW9zIGRvIGFubyIpICU+JSAKICBzZWxlY3Qoc3ViLmNsYXNzZSwgJzIwMTYnLCcyMDE3JywnMjAxOCcsJzIwMTknKSAlPiUKICBtdXRhdGUoc3ViLmNsYXNzID0gZ3N1YigiYXTDqSA1JSIsICJtYWlzIGRlIDAlIGF0w6kgNSUiLCBzdWIuY2xhc3NlKSkgJT4lCiAgc2VsZWN0KC1zdWIuY2xhc3NlKSAlPiUKICAgIG11dGF0ZShzdWIuY2xhc3MgPSBpZmVsc2Uoc3RyX2RldGVjdChzdWIuY2xhc3MsICJebWFpcyBkZSBcXGQrJSBhdMOpIFxcZCslJCIpLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZShzdWIuY2xhc3MsICJtYWlzIGRlIChcXGQrKSUgYXTDqSAoXFxkKyklIiwgIm1vcmUgdGhhbiBcXDElIHVwIHRvIFxcMiUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgc3ViLmNsYXNzKSkgJT4lIAogIHVuaXF1ZSgpCgpgYGAKVGhpcyB0YWJsZSBpcyB2ZXJ5IHNpbXBsZS4gSW4gdGhlICdjbGFzcycgY29sdW1uLCB3ZSBoYXZlIHRoZSBwZXJjZW50YWdlIGNsYXNzIG9mIHBlb3BsZSBieSBpbmNvbWUsIGFuZCBpbiB0aGUgb3RoZXIgY29sdW1ucywgdGhlIHVzdWFsIGluY29tZSBvZiB0aGlzIGNsYXNzIG9mIHBlb3BsZS4KICAKSSB3aWxsIHVzZSBhIHRhYmxlIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgSUJHRSByZXBvcnQgdG8gYmV0dGVyIGV4ZW1wbGlmeSB0aGUgdXNlIG9mIHRoZSB0YWJsZQoKIVtTb3VyY2U6IElCR0UsIERpcmVjdG9yYXRlIG9mIFJlc2VhcmNoLCBDb29yZGluYXRpb24gb2YgV29yayBhbmQgSW5jb21lLCBDb250aW51b3VzIE5hdGlvbmFsIEhvdXNlaG9sZCBTYW1wbGUgU3VydmV5IDIwMTItMjAxOS48YnI+Jm5ic3A7Jm5ic3A7Tm90ZXM6PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzEuIFVzdWFsIGluY29tZSwgYXQgMjAxOSBhdmVyYWdlIHByaWNlcy48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4gSW5jb21lIHJhaXNlZCBvbmx5IGZvciBwZW9wbGUgYWdlZCAxNCBvciBvdmVyLl0oaHR0cHM6Ly9pLmliYi5jby9CdExRSDNYL1NjcmVlbnNob3QtMjAyMy0wNi0xMC1hdC0xOS0zOS0yNi1jb3B5LnBuZykKSW4gdGhlIGZpcnN0IGxpbmUgJzIwMTInLCBpbiB0aGUgY29sdW1uICdNb3JlIHRoYW4gODAlIHVwIHRvIDkwJScsIHdlIGhhdmUgdGhlIHZhbHVlIDMgMzUxLCB3aGljaCByZXByZXNlbnRzIGEgbW9udGhseSBpbmNvbWUgb2YgUiQgMywzNTEuMDAuIFRoYXQgaXMsIDkwJSBvZiBCcmF6aWxpYW5zIHJlY2VpdmUgdXAgdG8gdGhpcyBhbW91bnQsIG9ubHkgMTAlIHJlY2VpdmUgbW9yZSB0aGFuIHRoYXQuCgojIyBEYXRhIE1hbmlwdWxhdGluZwogIApTbyB0aGF0IEkgY2FuIHN0YW5kYXJkaXplIHRoZSBQTkFEIGFuZCBJTkZPUEVOIGluY29tZSB0YWJsZXMsIEkgd2lsbCBuZWVkIGFuIGFkanVzdG1lbnQgYWNjb3JkaW5nIHRvIHRoZSBtaW5pbXVtIHdhZ2UuIEZvciB0aGlzIEkgd2lsbCBjcmVhdGUgYSB0YWJsZSB3aXRoIHRoZSB2YWx1ZXMgb2YgdGhlIHllYXJzIDIwMTYgdG8gMjAxOS4KCmBgYHtyIG1pbmltdW1fc2FsYXJ5XzIwMTZfdG9fMjAxOX0KeWVhciA8LSBjKDIwMTksIDIwMTgsIDIwMTcsIDIwMTYpCm1pbmltdW1fc2FsYXJ5IDwtIGMoOTk4LjAwLCA5NTQuMDAsIDkzNy4wMCwgODgwLjAwKQptaW5pbXVtX3NhbGFyeV8yMDE2X3RvXzIwMTkgPC0gZGF0YS5mcmFtZSh5ZWFyLCBtaW5pbXVtX3NhbGFyeSkKYGBgCgpgYGB7ciBjb21iaW5lIHZhbHVlcyBvZiBtaW5pbXVtIHNhbGFyeSB3aXRoIHBvcHVsYXRpb24gc2FsYXJ5IHJhbmdlLCBpbmNsdWRlPUZBTFNFfQpwb3B1bGF0aW9uX3dhZ2VfcmFuZ2VfMiA8LSBwaXZvdF9sb25nZXIocG9wdWxhdGlvbl93YWdlX3JhbmdlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IGMoIjIwMTYiLCAiMjAxNyIsICIyMDE4IiwgIjIwMTkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInllYXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImluY29tZSIpJT4lCiAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpLAogICAgIHBvcHVsYXRpb25fcGVyY2VudGFnZSA9IGFzLm51bWVyaWMoY2FzZV93aGVuKAogICAgIHN1Yi5jbGFzcyA9PSJtb3JlIHRoYW4gMCUgdXAgdG8gNSUiIH4gIjUiICwKICAgICBzdWIuY2xhc3MgPT0ibW9yZSB0aGFuIDUlIHVwIHRvIDEwJSIgfiAiNSIgLAogICAgIHN1Yi5jbGFzcyA9PSJtb3JlIHRoYW4gMTAlIHVwIHRvIDIwJSIgfiAiMTAiICwKICAgICBzdWIuY2xhc3MgPT0ibW9yZSB0aGFuIDIwJSB1cCB0byAzMCUiIH4gIjEwIiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiAzMCUgdXAgdG8gNDAlIiB+ICIxMCIgLAogICAgIHN1Yi5jbGFzcyA9PSJtb3JlIHRoYW4gNDAlIHVwIHRvIDUwJSIgfiAiMTAiICwKICAgICBzdWIuY2xhc3MgPT0ibW9yZSB0aGFuIDUwJSB1cCB0byA2MCUiIH4gIjEwIiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiA2MCUgdXAgdG8gNzAlIiB+ICIxMCIgLAogICAgIHN1Yi5jbGFzcyA9PSJtb3JlIHRoYW4gNzAlIHVwIHRvIDgwJSIgfiAiMTAiICwKICAgICBzdWIuY2xhc3MgPT0ibW9yZSB0aGFuIDgwJSB1cCB0byA5MCUiIH4gIjEwIiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiA5MCUgdXAgdG8gOTUlIiB+ICI1IiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiA5NSUgdXAgdG8gOTklIiB+ICI0IiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiA5OSUgdXAgdG8gMTAwJSIgfiAiMSIgLAogICApKSkgJT4lCiAgIGxlZnRfam9pbihtaW5pbXVtX3NhbGFyeV8yMDE2X3RvXzIwMTksIGJ5ID0gInllYXIiKQoKYGBgCgpUaGlzIHRhYmxlIGNvbnNpZGVycyBvbmx5IHRoZSBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoIHNvbWUgaW5jb21lLiBUaGUgSUJHRSBjb25zaWRlcnMgdW5lbXBsb3llZCBwZW9wbGUgd2hvIGFyZSBsb29raW5nIGZvciB3b3JrIGR1cmluZyB0aGUgc2FtcGxlIHBlcmlvZC4gSG93ZXZlciwgaXQgZG9lcyBub3QgY29uc2lkZXIgcGVvcGxlIHdpdGhvdXQgaW5jb21lIHdobyB3ZXJlIG5vdCBsb29raW5nIGZvciBhIGpvYiBhcyB1bmVtcGxveWVkLiBUaGlzIHBvcnRpb24gb2YgcGVvcGxlIHdpdGhvdXQgaW5jb21lIGlzIHRoZSBvbmUgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aCBoZXJlLgogIApUbyBleHRyYWN0IHRoaXMgZGF0YSwgSSB3aWxsIHVzZSB0aGUgc2FtZSB0YWJsZSBhbHJlYWR5IHVzZWQsIHdoaWNoIGFsc28gaGFzIHRoaXMgaW5mb3JtYXRpb24uClRoZSAnUE5BRF9Db250aW51YV8yMDE5X1JlbmRpbWVudG9fZGVfVG9kYXNfYXNfRm9udGVzJyB0YWJsZSBoYXMgdGhlICJQZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoIGluY29tZSIgYXMgYW4gaW5kaWNhdG9yLCBzbyBJIHdpbGwgZXh0cmFjdCAnMTAwJScgZnJvbSB0aGlzIHZhbHVlIGFuZCBvYnRhaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhvdXQgaW5jb21lLgoKYGBge3IgYWRkIHRoZSBudW1iZXIgb2Ygbm9faW5jb21lLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwZXJjZW50YWdlX2VtcGxveWVkIDwtcG9wdWxhdGlvbl9pbmNvbWUgJT4lCiAgICBmaWx0ZXIoYEFiZXJ0dXJhIGdlb2dyw6FmaWNhYCA9PSAiQnJhc2lsIiwKICAgICAgICAgVGlwbyA9PSAiVmFsb3IiLAogICAgICAgICBzdWIuY2xhc3NlICVpbiUgYygiVG9kYXMgYXMgZm9udGVzwrkiCSksCiAgICAgICAgIGluZCA9PSAiUGVyY2VudHVhbCBkZSBwZXNzb2FzIGNvbSByZW5kaW1lbnRvLCBuYSBwb3B1bGHDp8OjbyByZXNpZGVudGUiKSAlPiUgCiAgc2VsZWN0KHN1Yi5jbGFzc2UsICcyMDE2JywnMjAxNycsJzIwMTgnLCcyMDE5JykgJT4lIAogIHVuaXF1ZSgpCgpwZXJjZW50YWdlX2VtcGxveWVkXzJfbG9uZ19mb3JtYXQgPC0gcGl2b3RfbG9uZ2VyKHBlcmNlbnRhZ2VfZW1wbG95ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IGMoIjIwMTYiLCAiMjAxNyIsIjIwMTgiLCAiMjAxOSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvPSJ5ZWFyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190bz0icG9wdWxhdGlvbl9wZXJjZW50YWdlX3dpdGhfaW5jb21lIikKCnBlcmNlbnRhZ2VfcHBfd2l0aG91dF9pbmNvbWUgPC0gcGVyY2VudGFnZV9lbXBsb3llZF8yX2xvbmdfZm9ybWF0ICU+JQogICBtdXRhdGUocG9wdWxhdGlvbl93aXRob3V0X2luY29tZSA9ICgxMDAgLSBwb3B1bGF0aW9uX3BlcmNlbnRhZ2Vfd2l0aF9pbmNvbWUpLAogICAgICAgICAgaW5jb21lID0gMCwKICAgICAgICAgIHdhZ2VfcmFuZ2UgPSAiZG9lcyBub3QgcmVjZWl2ZSIsCiAgICAgICAgICB5ZWFyID0gYXMuZmFjdG9yKHllYXIpKQoKbm9faW5jb21lIDwtIGxlZnRfam9pbihwZXJjZW50YWdlX3BwX3dpdGhvdXRfaW5jb21lLCBwb3B1bGF0aW9uX3RvdGFsXzE0X3llYXJzX29sZF9vcl9vdmVyLCBieSA9IGpvaW5fYnkoeWVhcikpICU+JQogICBtdXRhdGUocG9wdWxhdGlvbiA9IChwb3B1bGF0aW9uX3dpdGhvdXRfaW5jb21lKnBvcHVsYXRpb24pLzEwMCwpICU+JQogICBncm91cF9ieSh5ZWFyLCB3YWdlX3JhbmdlKSAlPiUKICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0ocG9wdWxhdGlvbikpICU+JQogICBzZWxlY3QoeWVhciwgd2FnZV9yYW5nZSwgcG9wdWxhdGlvbikKCmBgYAoKQmVmb3JlIG1lcmdpbmcgdGhlIHRhYmxlcywgSSBzdGlsbCBuZWVkIHRvIHN0YW5kYXJkaXplIHRoZSB2YXJpYWJsZXMuCmBgYHtyIGRlZmF1bHQgeWllbGQgdmFyaWFibGVzLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKIyBDcmVhdGluZyB0aGUgbmV3IGNvbHVtbiB3aXRoIHRoZSBjYXRlZ29yaWVzCnBvcHVsYXRpb25fd2FnZV9yYW5nZV8zIDwtIHBvcHVsYXRpb25fd2FnZV9yYW5nZV8yICU+JQogICBtdXRhdGUod2FnZV9yYW5nZSA9IGNhc2Vfd2hlbigKICAgICBpbmNvbWUgPj0gbWluaW11bV9zYWxhcnkgJiBpbmNvbWUgPCAyICogbWluaW11bV9zYWxhcnkgfiAiYmV0d2VlbiAxIGFuZCAyIG1vbnRobHkgbWluaW11bSB3YWdlcyIsCiAgICAgaW5jb21lID49IDMvNCAqIG1pbmltdW1fc2FsYXJ5ICYgaW5jb21lIDwgbWluaW11bV9zYWxhcnkgfiAiYmV0d2VlbiAzLzQgYW5kIDEgbW9udGhseSBtaW5pbXVtIHdhZ2UiLAogICAgIGluY29tZSA+PSAyICogbWluaW11bV9zYWxhcnkgfiAib3ZlciAyIG1vbnRobHkgbWluaW11bSB3YWdlcyIsCiAgICAgaW5jb21lID4gMCAmIGluY29tZTwgMy80ICogbWluaW11bV9zYWxhcnkgfiAibGVzcyB0aGFuIDMvNCBvZiB0aGUgbW9udGhseSBtaW5pbXVtIHdhZ2UiCiAgICkpICU+JQogICBzZWxlY3Qoc3ViLmNsYXNzLCB5ZWFyLCBwb3B1bGF0aW9uX3BlcmNlbnRhZ2UsIGluY29tZSx3YWdlX3JhbmdlKQoKCnBvcHVsYXRpb25fd2FnZV9yYW5nZV80IDwtbWVyZ2UocG9wdWxhdGlvbl93YWdlX3JhbmdlXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb25fdG90YWxfMTRfeWVhcnNfb2xkX29yX292ZXIsIGJ5ID0gInllYXIiKSAlPiUKICAgbXV0YXRlKHBhaWRfcG9wdWxhdGlvbiA9IHJvdW5kKChwb3B1bGF0aW9uICogcG9wdWxhdGlvbl9wZXJjZW50YWdlKS8xMDApKSAlPiUKICAgc2VsZWN0KHllYXIsIHdhZ2VfcmFuZ2UsIHBhaWRfcG9wdWxhdGlvbikgJT4lCiAgIHJlbmFtZShwb3B1bGF0aW9uID0gcGFpZF9wb3B1bGF0aW9uKQoKcG9wdWxhdGlvbl93YWdlX3JhbmdlXzUgPC0gcG9wdWxhdGlvbl93YWdlX3JhbmdlXzQgJT4lCiAgIGdyb3VwX2J5KHllYXIsIHdhZ2VfcmFuZ2UpICU+JQogICBzdW1tYXJpc2UocG9wdWxhdGlvbiA9IHN1bShwb3B1bGF0aW9uKSkgJT4lCiAgIG11dGF0ZSh5ZWFyID0gYXMuZmFjdG9yKHllYXIpKQoKYGBgCgpgYGB7ciBzZXR0aW5nIGNvcnJlY3QgeWllbGQgb3JkZXJ9CiMgU2V0IHRoZSBjb3JyZWN0IG9yZGVyIG9mIHlpZWxkcwppbmNvbWVfcmFuZ2Vfb3JkZXIgPC0gYygiZG9lcyBub3QgcmVjZWl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlc3MgdGhhbiAzLzQgb2YgdGhlIG1vbnRobHkgbWluaW11bSB3YWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmV0d2VlbiAzLzQgYW5kIDEgbW9udGhseSBtaW5pbXVtIHdhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZXR3ZWVuIDEgYW5kIDIgbW9udGhseSBtaW5pbXVtIHdhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3ZlciAyIG1vbnRobHkgbWluaW11bSB3YWdlcyIpCgpwb3B1bGF0aW9uX3JlbXVuZXJhdGlvbl82IDwtIHJiaW5kKHBvcHVsYXRpb25fd2FnZV9yYW5nZV81LCBub19pbmNvbWUpJT4lCiAgIG11dGF0ZSh3YWdlX3JhbmdlID0gYXMuZmFjdG9yKHdhZ2VfcmFuZ2UpLAogICAgICAgICAgd2FnZV9yYW5nZSA9IGZhY3Rvcih3YWdlX3JhbmdlLCBsZXZlbHMgPSBpbmNvbWVfcmFuZ2Vfb3JkZXIpKQoKYGBgCgpGaW5hbGx5LCBhbiBvdmVydmlldyBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIGluY29tZSBpbiB0aGUgY291bnRyeToKCiMjIFBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIHdpdGggYW5kIHdpdGhvdXQgaW5jb21lCgpgYGB7ciB2aWV3IHBvcHVsYXRpb24gd2l0aCBhbmQgd2l0aG91dCBpbmNvbWUsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoYXJyYW5nZShwb3B1bGF0aW9uX3JlbXVuZXJhdGlvbl82LHdhZ2VfcmFuZ2UseWVhciksMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKQmVmb3JlIG1lcmdpbmcgdGhlIGRhdGFmcmFtZXMsIEkgbm90aWNlZCB0aGF0IHRoZSBJbmZvcGVuIHRhYmxlIGRvZXMgbm90IGhhdmUgZGF0YSBvbiBwcmlzb25lciBwYXkgaW4gMjAxNyBmb3IgdGhlIHN0YXRlIG9mIFNhbyBQYXVsby4gSSB3aWxsIHVzZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBbQGxhcnNvbjE5ODhyZWZsZXhpdml0eV10byBwcmVkaWN0IHRoaXMgZGF0YS4gCgpgYGB7ciByZW11bmVyYXRpb24gb2YgcHJpc29uZXJzIGluIFNQIDIwMTd9CiMgU3Vic2V0IG9mIGRhdGEgZm9yIHRoZSBzdGF0ZSBvZiBTw6NvIFBhdWxvCmluZm9wZW5fc3AgPC0gaW5mb3Blbl93YWdlXzNfZmluYWxbaW5mb3Blbl93YWdlXzNfZmluYWwkc3RhdGUgPT0gJ1NQJywgXQpgYGAKICAKRnVuY3Rpb24gdG8gcHJlZGljdCB0aGUgbWlzc2luZyBkYXRhIG9uIHRoZSByZW11bmVyYXRpb24gb2YgcHJpc29uZXJzIGluIFNhbyBQYXVsbyBpbiAyMDE3CmBgYHtyIEZ1bmN0aW9uIHRvIHByZWRpY3QgbWlzc2luZyB2YWx1ZXMgb24gdGhlIHJlbXVuZXJhdGlvbiBvZiBwcmlzb25lcnMgaW4gU2FvIFBhdWxvfQpwcmVkaWN0X212IDwtIGZ1bmN0aW9uKHllYXIsIHByaXNvbmVycykgewogICBjb21wbGV0ZV9jYXNlcyA8LSAhaXMubmEocHJpc29uZXJzKQogICBhcHByb3goeCA9IGFzLm51bWVyaWMoeWVhcltjb21wbGV0ZV9jYXNlc10pLAogICAgICAgICAgeSA9IHByaXNvbmVyc1tjb21wbGV0ZV9jYXNlc10sCiAgICAgICAgICB4b3V0ID0gYXMubnVtZXJpYyh5ZWFyKSkkeQp9CmBgYAogIApBcHBseSB0aGUgZnVuY3Rpb24gZm9yIGVhY2ggZ2VuZGVyIGFuZCBjb21wZW5zYXRpb24gY29tYmluYXRpb24KYGBge3IgQXBwbHkgYSBmdW5jdGlvbiBmb3IgZWFjaCBnZW5kZXIgYW5kIGNvbXBlbnNhdGlvbiBjb21iaW5hdGlvbn0KaW5mb3Blbl9zcCA8LSBpbmZvcGVuX3NwICU+JQogICBncm91cF9ieSh3YWdlKSAlPiUKICAgbXV0YXRlKHByaXNvbmVycyA9IHJvdW5kKHByZWRpY3RfbXYoeWVhciwgcHJpc29uZXJzKSkpICU+JQogICB1bmdyb3VwKCkKYGBgCgpSZXBsYWNlIHRoZSBvcmlnaW5hbCBkYXRhIGZvciBTYW8gUGF1bG8gd2l0aCB0aGUgbmV3IHBvcHVsYXRlZCBkYXRhCmBgYHtyIGRhdGEgZmlsbGVkIGlufQppbmZvcGVuX3dhZ2VfM19maW5hbFtpbmZvcGVuX3dhZ2VfM19maW5hbCRzdGF0ZSA9PSAnU1AnLCBdIDwtIGluZm9wZW5fc3AKCmBgYAogIApGaW5hbGx5IHRoZSBmaW5hbCB0YWJsZSB0aGUgZXN0aW1hdGVkIGFtb3VudCBvZiBwcmlzb25lcnMgYnkgcmVtdW5lcmF0aW9uCmBgYHtyIGZpbmFsIHRhYmxlIGluZm9wZW5fd2FnZX0KaW5mb3Blbl93YWdlXzQgPC0gaW5mb3Blbl93YWdlXzNfZmluYWwgJT4lCiAgIGdyb3VwX2J5KHllYXIsIHdhZ2UpICU+JQogICBtdXRhdGUoeWVhciA9IGFzLmZhY3Rvcih5ZWFyKSkgJT4lCiAgIHN1bW1hcmlzZShwcmlzb25lcnMgPSBzdW0ocHJpc29uZXJzKSkgJT4lIAogICAgcmVuYW1lKHdhZ2VfcmFuZ2UgPSB3YWdlKQpgYGAKCkFmdGVyIGFsbCB0aGUgbWFuaXB1bGF0aW9ucywgSSBjYW4gZmluYWxseSBjb21iaW5lIHRoZSB0YWJsZXMuCgpgYGB7ciBwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lLCBpbmNsdWRlPUZBTFNFfQpwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lIDwtIGFzLmRhdGEuZnJhbWUobGVmdF9qb2luKGluZm9wZW5fd2FnZV80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb25fcmVtdW5lcmF0aW9uXzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBqb2luX2J5KHllYXIsIHdhZ2VfcmFuZ2UpKSkgJT4lCiAgIG11dGF0ZSh3YWdlX3JhbmdlID0gYXMuZmFjdG9yKHdhZ2VfcmFuZ2UpLAogICAgICAgICAgd2FnZV9yYW5nZSA9IGZhY3Rvcih3YWdlX3JhbmdlLCBsZXZlbHMgPSBpbmNvbWVfcmFuZ2Vfb3JkZXIpLAogICAgICAgICAgeWVhciA9IGFzLmZhY3Rvcih5ZWFyKSkKCmBgYAoKIyMgUE5BREMgVGFibGUgLSBJTkZPUEVOIHdhZ2UgcmFuZ2UKCmBgYHtyIHBvcHVsYXRpb24gdmlld19pbmZvcGVuX2luY29tZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMgUHJlc2VudGF0aW9uIG9mIENvbGxlY3RlZCBhbmQgTWFuaXB1bGF0ZWQgRGF0YTogey50YWJzZXQgLnRhYnNldC1mYWRlfQoKIyMgUE5BRCBUYWJsZSAtIElORk9QRU4gVG90YWwKCmBgYHtyIGZpbmFsIHZpZXcgcG9wdWxhY2FvX2luZm9wZW5fdG90YWwgLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25faW5mb3Blbl90b3RhbCwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCiAgCiMjIFBOQURDIFRhYmxlIC0gSU5GT1BFTiBMZXZlbCBvZiBFZHVjYXRpb24KYGBge3IgZmluYWwgdmlldyBwb3B1bGFjYW9faW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24gLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25faW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24sMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAogIAojIyBQTkFEQyBUYWJsZSAtIElORk9QRU4gRXRobmljaXR5CmBgYHtyIGZpbmFsIHZpZXcgcG9wdWxhdGlvbl9pbmZvcGVuX2V0aG5pY2l0eSB0YWJsZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2luZm9wZW5fZXRobmljaXR5LDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKICAKIyMgUE5BREMgdGFibGUgLSBJTkZPUEVOIEFnZSBSYW5nZQpgYGB7ZmluYWwgdmlzdWFsaXphdGlvbiB0YWJsZSBwb3B1bGFjYW9faW5mb3Blbl9mYWl4YV9ldGFyaWEsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoYXJyYW5nZShwb3B1bGF0aW9uX2luZm9wZW5fYWdlX3JhbmdlLHllYXIpLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKICAKIyMgUE5BREMgVGFibGUgLSBJTkZPUEVOIFdhZ2UgUmFuZ2UKYGBge3IgZmluYWwgdmlldyBwb3B1bGFjYW9faW5mb3Blbl9pbmNvbWUsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhdGlvbl9pbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbiwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIEFuYWx5emVzIGFuZCBDb3JyZWxhdGlvbnMuCgpNb3N0IG9mIHRoZSBwcm9qZWN0IHByb3Bvc2FsIGhhcyBhbHJlYWR5IGJlZW4gcGFzc2VkLiBGcm9tIHRoaXMgcG9pbnQgb24sIEkgZm9jdXMgbW9yZSBvbiBwcmVzZW50aW5nIHNvbWUgY29ycmVsYXRpb25zIGZvdW5kIGluIHRoZSB0YWJsZXMgd2Ugc2V0IHVwIGFuZCBwcmVzZW50IGEgbGl0dGxlIGFib3ZlLgogIAoKSSdsbCBzdGFydCBieSBjcmVhdGluZyBhIGNvbHVtbiB0aGF0IHJlbGF0ZXMgdGhlIG51bWJlciBvZiBwcmlzb25lcnMgdG8gdGhlIHRvdGFsIHBvcHVsYXRpb24sIGFuZCB0aGVuIEknbGwgcGxvdCBzb21lIGdyYXBocyB0aGF0IGlsbHVzdHJhdGUgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gZWFjaCB2YXJpYWJsZQoKIyMgRXRobmljaXR5IERhdGFmcmFtZQoKVGhlIHZhcmlhdGlvbiBpbiB0aGUgcGVyY2VudGFnZSBvZiBwcmlzb25lcnMgaW4gcmVsYXRpb24gdG8gcG9wdWxhdGlvbiBieSBldGhuaWNpdHkgc2hvd3MgdGhhdCBpbiBwcmFjdGljYWxseSBhbGwgc3RhdGVzLCB0aGVyZSBpcyBhIGhpZ2hlciBpbmNpZGVuY2Ugb2YgYnJvd24gYW5kIGJsYWNrIHByaXNvbmVycyBjb21wYXJlZCB0byB0aGUgcG9wdWxhdGlvbi4gVGhpcyBkb2VzIG5vdCBpbmRpY2F0ZSBjYXVzYWxpdHksIGFzIHRoZXJlIGFyZSBvdGhlciBmYWN0b3JzIHRoYXQgY291bGQgaW5mbHVlbmNlIGluZGl2aWR1YWxzIHRvIGNvbW1pdCBjcmltZXMgYW5kIGVuZCB1cCBpbiBqYWlsLiBIb3dldmVyLCBpdCBpcyBhIGZhY3QgdGhhdCByZXF1aXJlcyBmdXJ0aGVyIGludmVzdGlnYXRpb24uIEl0IHdvdWxkIGJlIGlkZWFsIHRvIGFzc2VzcyBhZGRpdGlvbmFsIHZhcmlhYmxlcywgc3VjaCBhcyBwb3RlbnRpYWwgcmFjaXNtIHdpdGhpbiB0aGUganVkaWNpYXJ5LCBhcyB3ZWxsIGFzIGVkdWNhdGlvbiBhbmQgaW5jb21lLCBhcyB3ZSBhcmUgZG9pbmcgaGVyZS4gSW4gdGhlIGZvbGxvd2luZyBncmFwaHMsIEkgcHJlc2VudCBzb21lIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZXNlIHZhcmlhYmxlcy4KCmBgYHtyIHBsb3Qgb2YgZXRobmljaXR5IGJ5IHN0YXRlIGdyYXBocywgZWNobz1GQUxTRX0KZ2dwbG90KHBvcHVsYXRpb25faW5mb3Blbl9ldGhuaWNpdHksIGFlcyh4PXllYXIsIHk9KHByaXNvbmVycy9wb3B1bGF0aW9uKSwgY29sb3I9ZXRobmljaXR5KSkgKwogICBnZW9tX2xpbmUoKSArCiAgIGZhY2V0X3dyYXAofnN0YXRlLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDUpICsKICAgbGFicyh4PSJZZWFyIiwgeT0iVmFsdWUiLCBjb2xvdXI9IkV0aG5pY2l0eSIpICsKICAgdGhlbWVfbWluaW1hbCgpICsKICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkKCmBgYAoKCiMjIEFnZSBSYW5nZSBEYXRhZnJhbWUKCkhlcmUgd2UgY2FuIG9ic2VydmUgYSBkZWNyZWFzZSBpbiB0aGUgcmF0ZSBvZiBwcmlzb25lcnMgaW4gdGhlIGFnZSBncm91cCBvZiAxOCB0byAyNCB5ZWFycyBvdmVyIHRpbWUuIFRoaXMgY2FuIGhhcHBlbiBmb3Igc2V2ZXJhbCByZWFzb25zLCBhbW9uZyB0aGVtIHRoZSBhZ2luZyBvZiB0aGUgcHJpc29uIHBvcHVsYXRpb24uIEhvd2V2ZXIsIGlmIHdlIHRha2UgYWxsIG90aGVyIGFnZSBncm91cHMsIHdlIGhhdmUgYSBjb25zaWRlcmFibGUgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBwcmlzb25lcnMgaW4gd2hhdCB3ZSBjYWxsICJ3b3JraW5nIGFnZSIsIHdoaWNoIGNvbXByaXNlcyB0aGUgcG9wdWxhdGlvbiB1cCB0byA2MSB5ZWFycyBvZiBhZ2UuIEl0J3MgcmVhbGx5IGZydXN0cmF0aW5nIHRvIHJlYWxpemUgdGhhdCBvdXIgIkJpbGwgR2F0ZXMiLCAiWnVja2VyYmVyZ3MiLCBhbmQgIkVsb24gTXVza3MiIGFyZSBiZWhpbmQgYmFycy4gVGhlIHBvcHVsYXRpb24gdGhhdCBzaG91bGQgYmUgaW4gY29sbGVnZSBpcyB0cmFwcGVkLCBieSBudW1lcm91cyBmYWN0b3JzLCBhbW9uZyB3aGljaCB0aGUgeW91bmcgYWdlLCBhbG9uZyB3aXRoIGxvdyBlZHVjYXRpb24gYW5kIGxhY2sgb2YgbW9uZXkuIEl0IHdvdWxkIHJlYWxseSBiZSBhIGRyZWFtIG5vdCB0byBoYXZlIHNvIG1hbnkgeW91bmcgcGVvcGxlIGFycmVzdGVkLgoKYGBge3IgZ2dwbG90IHBvcHVsYXRpb25faW5mb3Blbl9hZ2VfcmFuZ2UsIGVjaG89RkFMU0V9CgpnZ3Bsb3QocG9wdWxhdGlvbl9pbmZvcGVuX2FnZV9yYW5nZSwgYWVzKHg9eWVhciwgeT0ocHJpc29uZXJzL3BvcHVsYXRpb24pLCBjb2xvcj1hZ2VfcmFuZ2UpKSArCiAgIGdlb21fbGluZSgpICsKICAgZmFjZXRfd3JhcCh+YWdlX3JhbmdlLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsKICAgbGFicyh4PSJZZWFyIiwgeT0iVmFsdWUiKSArCiAgIHRoZW1lX21pbmltYWwoKSArCiAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCgojIyBFZHVjYXRpb24gTGV2ZWwgRGF0YWZyYW1lCgpUaGlzIHRhYmxlIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgcHJpc29uZXJzIGJ5IGxldmVsIG9mIGVkdWNhdGlvbi4gQ2xlYXJseSwgdGhlIGtleSB0dXJucyBpbiBpbmNvbXBsZXRlIHNlY29uZGFyeSBlZHVjYXRpb24sIHNpbmNlIGZyb20gdGhlbiBvbiwgdGhlIHBlcmNlbnRhZ2Ugb2YgcHJpc29uZXJzIG92ZXIgdGhlIHBvcHVsYXRpb24gZHJvcHMgZHJhc3RpY2FsbHkuIEl0IGlzIG5vIGxvbmdlciBhIG15c3RlcnkgdGhhdCBhIHBvcHVsYXRpb24gd2l0aCBsb3cgZWR1Y2F0aW9uIHVzdWFsbHkgaGFzIGEgaGlnaCBkZWdyZWUgb2YgdmlvbGVuY2UgYXMgYSByZXNwb25zZSwgdGFrZSBjb3VudHJpZXMgbGlrZSBub3J3YXksIG5ldGhlcmxhbmRzIGFuZCBqYXBhbiBmb3IgZXhhbXBsZSB3aGVyZSB0aGVyZSBhcmUgdmVyeSBmZXcgcHJpc29uZXJzLCBhbmQgY29tcGFyZSB0aGUgbGV2ZWwgb2YgYWNjZXNzIHRvIGhpZ2hlciBlZHVjYXRpb24gd2l0aCB0aGF0IG9mIEJyYXppbC4KCmBgYHtyIGdncGxvdCBwb3B1bGF0aW9uX2luZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoZGF0YSA9IHBvcHVsYXRpb25faW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24sIGFlcyh4ID0gbGV2ZWxfb2ZfZWR1Y2F0aW9uLCB5ID0gKHByaXNvbmVycy9wb3B1bGF0aW9uKSxmaWxsID0gbGV2ZWxfb2ZfZWR1Y2F0aW9uKSkgKwogICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogICBsYWJzKHggPSAiTGV2ZWwgb2YgRWR1Y2F0aW9uIiwgeSA9ICJJbm1hdGVzL1BvcHVsYXRpb24gUmF0aW8iLCBmaWxsID0gIkxldmVsIG9mIEVkdWNhdGlvbiIpICsKICAgZmFjZXRfd3JhcCh+c3RhdGUsIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gNSkrCiAgICAgdGhlbWVfbWluaW1hbCgpICsKICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIEluY29tZXMgRGF0YWZyYW1lCgpIZXJlIHdlIGNhbiBvYnNlcnZlIHRoYXQgbW9zdCBvZiB0aGUgcHJpc29uIHBvcHVsYXRpb24gYXJlIHBlb3BsZSB3aG8gcmVjZWl2ZSB1cCB0byAxIG1vbnRobHkgbWluaW11bSB3YWdlLiBUaGlzIGFtb3VudCBiZXR3ZWVuIDMvNCBhbmQgMSBtb250aGx5IG1pbmltdW0gd2FnZSBpbmNsdWRlcyBzZXZlcmFsIHBlb3BsZSB3aG8gcmVjZWl2ZSBnb3Zlcm5tZW50IGFpZCBzdWNoIGFzICJCb2xzYSBGYW3DrWxpYSIgb3Igb3RoZXJzLiBUaGV5IGNhbm5vdCBiZSwgYWNjb3JkaW5nIHRvIHRoZSBJQkdFLCBjbGFzc2lmaWVkIGFzIHdpdGhvdXQgaW5jb21lIG9yIHVuZW1wbG95ZWQuCgpUaGUgSW50ZXItVW5pb24gRGVwYXJ0bWVudCBvZiBTdGF0aXN0aWNzIGFuZCBTb2Npb2Vjb25vbWljIFN0dWRpZXMgKERpZWVzZSksIG1vbnRobHkgcHVibGlzaGVzIHRoZSB2YWx1ZSBvZiB0aGUgY29zdCBvZiB0aGUgQmFzaWMgRm9vZCBCYXNrZXQgd2hpY2gsIGFjY29yZGluZyB0byB0aGUgYm9keSwgd291bGQgYmUgInN1ZmZpY2llbnQgZm9yIHRoZSBzdXN0ZW5hbmNlIGFuZCB3ZWxsLWJlaW5nIG9mIGFuIGFkdWx0IHdvcmtlciwgY29udGFpbmluZyBiYWxhbmNlZCBhbW91bnRzIG9mIHByb3RlaW4sIGNhbG9yaWVzLCBpcm9uIGNhbGNpdW0gYW5kIHBob3NwaG9ydXMuW0BNZXRvZG9sb2dpYV0iLiBJbiAyMDE5LCB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgbmF0aW9uYWwgRm9vZCBQYXJjZWwgd2FzIEJSTCA0MjIuMTksIHdoaWNoIHJlcHJlc2VudHMgYWxtb3N0IGhhbGYgdGhlIG1pbmltdW0gd2FnZSBhdCB0aGUgdGltZSAoQlJMIDk5OC4wMCkuCmBgYHtyIGdncGxvdCBwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lLCBlY2hvPUZBTFNFIH0KCmdncGxvdChwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lLCBhZXMoeD15ZWFyLCB5PShwcmlzb25lcnMvcG9wdWxhdGlvbiksIGZpbGw9d2FnZV9yYW5nZSkpICsKICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArCiAgIHRoZW1lX21pbmltYWwoKSArCiAgIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIHByaXNvbmVycyBieSB5ZWFyIGFuZCB3YWdlIHJhbmdlIiwKICAgICAgICB4ID0gIlllYXIiLAogICAgICAgIHkgPSAiTnVtYmVyIG9mIFByaXNvbmVycyIsCiAgICAgICAgZmlsbCA9ICJ3YWdlX3JhbmdlIikgKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQoKYGBgCiMjIyBNaW5pbXVtIFdhZ2UgUmVxdWlyZWQKClRoZSBDb25zdGl0dXRpb24gb2YgQnJhemlsLCBlbmFjdGVkIGluIE9jdG9iZXIgMTk4OCwgbWFuZGF0ZXMgdGhhdCB0aGUgbWluaW11bSB3YWdlIHNob3VsZCBiZSBhIGxlZ2FsbHkgZGVmaW5lZCBhbmQgdW5pZm9ybSBhbW91bnQgbmF0aW9ud2lkZS4gSXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gbWVldCB0aGUgYmFzaWMgbmVlZHMgb2YgYSB3b3JrZXIgYW5kIHRoZWlyIGZhbWlseSwgaW5jbHVkaW5nIGhvdXNpbmcsIGZvb2QsIGVkdWNhdGlvbiwgaGVhbHRoLCBsZWlzdXJlLCBjbG90aGluZywgaHlnaWVuZSwgdHJhbnNwb3J0YXRpb24sIGFuZCBzb2NpYWwgc2VjdXJpdHkuIFRoZSBDb25zdGl0dXRpb24gYWxzbyByZXF1aXJlcyBwZXJpb2RpYyBhZGp1c3RtZW50cyB0byBtYWludGFpbiB0aGUgcHVyY2hhc2luZyBwb3dlciBvZiB0aGUgbWluaW11bSB3YWdlIChBcnRpY2xlIDcsIElWIG9mIHRoZSBGZWRlcmFsIENvbnN0aXR1dGlvbiBvZiBCcmF6aWwpLgoKRElFRVNFLCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBNaW5pbXVtIE5lY2Vzc2FyeSBXYWdlLCBhZGhlcmVzIHRvIHRoZXNlIGNvbnN0aXR1dGlvbmFsIHByb3Zpc2lvbnMuIFRoZXkgYmFzZSB0aGVpciBjYWxjdWxhdGlvbnMgb24gRGVjcmVlIExhdyBOby4gMzk5LCB3aGljaCBzdGlwdWxhdGVzIHRoYXQgdGhlIGNvc3Qgb2YgZm9vZCBmb3IgYW4gYWR1bHQgd29ya2VyIHNob3VsZCBub3QgYmUgbG93ZXIgdGhhbiB0aGUgZXhwZW5zZSBvZiB0aGUgQmFzaWMgRm9vZCBCYXNrZXQuCgpJbiB0aGVzZSBjYWxjdWxhdGlvbnMsIERJRUVTRSBjb25zaWRlcnMgYSBmYW1pbHkgbW9kZWwgY29uc2lzdGluZyBvZiB0d28gYWR1bHRzIGFuZCB0d28gY2hpbGRyZW4sIGFzc3VtaW5nIHRoYXQgdGhlIGNoaWxkcmVuJ3MgY29uc3VtcHRpb24gaXMgZXF1aXZhbGVudCB0byB0aGF0IG9mIGFuIGFkdWx0LgoKVGhlIG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgYSBmYW1pbHkncyBmb29kIGV4cGVuc2VzIGJlZ2lucyB3aXRoIHRoZSBjb3N0IG9mIHRoZSBtb3N0IGV4cGVuc2l2ZSBCYXNpYyBGb29kIEJhc2tldCBhbW9uZyB0aGUgMjcgQnJhemlsaWFuIGNhcGl0YWxzLCB3aGljaCBpcyB0aGVuIG11bHRpcGxpZWQgYnkgdGhyZWUuCgpbQERJRUVTRV0gY29uZHVjdGVkIHRoZSBGYW1pbHkgQnVkZ2V0IFN1cnZleSAoUE9GKSBpbiBTw6NvIFBhdWxvIGR1cmluZyB0aGUgcGVyaW9kIG9mIDk0Lzk1LiBUaGUgcmVzdWx0cyByZXZlYWxlZCB0aGF0IGZvb2QgYWNjb3VudGVkIGZvciAzNS43MSUgb2YgdGhlIGV4cGVuc2VzIG9mIGZhbWlsaWVzIGluIHRoZSBsb3dlc3QgaW5jb21lIGJyYWNrZXQuIEJ5IGNvbXBhcmluZyB0aGUgY29zdCBvZiBmb29kIGZvciBhIGZhbWlseSAodGhlIG1vc3QgZXhwZW5zaXZlIGJhc2tldCBtdWx0aXBsaWVkIGJ5IHRocmVlKSB3aXRoIHRoZSBwcm9wb3J0aW9uIG9mIHRoZXNlIGZhbWlsaWVzJyBidWRnZXQgYWxsb2NhdGVkIHRvIGZvb2QgKDM1LjcxJSksIGl0IGlzIHBvc3NpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgYnVkZ2V0IHJlcXVpcmVkIHRvIGNvdmVyIG90aGVyIGV4cGVuc2VzIHN1Y2ggYXMgaG91c2luZywgY2xvdGhpbmcsIHRyYW5zcG9ydGF0aW9uLCBhbmQgbW9yZS4KClRoZXJlZm9yZSwgdGhlIGZvcm11bGEgZm9yIGNhbGN1bGF0aW5nIHRoZSBNaW5pbXVtIFJlcXVpcmVkIFdhZ2UgY2FuIGJlIHN1bW1hcml6ZWQgYXMgZm9sbG93czoKJCRGLkYuQy4gPSAzKENDKSQkCgokJFxmcmFje0YuRi5DLn17WH0gPSBcZnJhY3swLjM1NzF9ezEuMDB9JCQKVXNpbmcgcnVsZSBvZiAzLCB3ZSBoYXZlOgokJEYuRi5DLiA9IFgoMC4zNTcxKSQkCnNvOgokJCBYID0gXGZyYWN7Ri5GLkMufXswLjM1NzF9ICQkCldoZXJlOgpGLkYuQy4gPSBGYW1pbHkgRm9vZCBDb3N0CmFuZCBDLkMuID0gQ29zdCBvZiB0aGUgaGlnaGVzdCB2YWx1ZSBGb29kIFBhcmNlbAoKVGhlIE5lY2Vzc2FyeSBNaW5pbXVtIFdhZ2UsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgbW9udGhseSBhcyBhbiBhc3Nlc3NtZW50IG9mIHdoYXQgdGhlIGN1cnJlbnQgbWluaW11bSB3YWdlIHNob3VsZCBiZSwgYWxzbyBzZXJ2ZXMgYXMgYSB0b29sIHRoYXQgd29ya2VycycgdW5pb25zIHVzZSB0byBleHBvc2UgdGhlIHZpb2xhdGlvbiBvZiB0aGUgY29uc3RpdHV0aW9uYWwgcHJpbmNpcGxlIHRoYXQgZGVmaW5lcyB0aGUgcGFyYW1ldGVycyBmb3IgZGV0ZXJtaW5pbmcgdGhlIGxvd2VzdCBhbGxvd2FibGUgd2FnZS4gaW4gdGhlIGNvdW50cnkuCgpXZSBoYXZlIGJlbG93IHRoZSB2YWx1ZSBvZiB3aGF0IHdvdWxkIGJlIHRoZSBpZGVhbCBzYWxhcnkgb2YgdGhlIHdvcmtlciwgcHJvdmlkZWQgZm9yIGJ5IGxhdywgdG8gY292ZXIgYWxsIG1vbnRobHkgY29zdHMgb2YgaGlzIHJlc2lkZW5jZS4KCmBgYHtyIERJRUVTRSwgaW5jbHVkZT1GQUxTRX0KZGllZXNlXzIwMTlfdXMgPC0gcmVhZF9leGNlbCgiZGllZXNlXzIwMTlfdXMueGxzeCIpCgpgYGAKCmBgYHtyIERJRUVTRSB2aWV3LCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGRpZWVzZV8yMDE5X3VzLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKClRocm91Z2ggdGhlc2UgZGF0YSwgd2UgY2FuIHNlZSB0aGUgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGUgbWluaW11bSB2YWx1ZXMgYW5kIHRob3NlIG5lY2Vzc2FyeSBmb3IgdGhlIG1haW50ZW5hbmNlIG9mIHRoZSBob21lIGluIEJyYXppbC4gVGhlIGRlbWFuZCBmb3IgcG9saXRpY2FsIGFuZCBlY29ub21pYyByZWZvcm1zIGluIEJyYXppbCBpcyBub3QgcmVjZW50LiBTdGlsbCBpbiB0aGUgMTk3MHMsIHRoZSBncm91cCAiTGVnacOjbyBVcmJhbmEiIGFscmVhZHkgcmFpc2VkIHByb3Rlc3Qgd2l0aCB0aGUgc29uZyAiV2hhdCBjb3VudHJ5IGlzIHRoaXM/Ii4gSW4gdGhlIGZvbGxvd2luZyBkZWNhZGUsIHdlIGNhbiBzZWUgdGhlIHNpbmdlciBDYXp1emEgcHJvdGVzdGluZyB0aGUgc29uZyAiQnJhc2lsIiwgd2hpY2ggY2xlYXJseSB3b3VsZCBkZW5vdW5jZSB0aGUgbmF0aW9uJ3MgcG92ZXJ0eS4KClRoZSBwcmlzb24gcG9wdWxhdGlvbiBzYXlzIGEgbG90IGFib3V0IHRoZSBjb3VudHJ5LiBZb3VuZywgcG9vciwgbG93LWVkdWNhdGVkIGFuZCBkYXJrLXNraW5uZWQgcGVvcGxlIGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGF0aXN0aWNzLCB3aGljaCBzaWduYWxzIGFuIG9taXNzaW9uIG9uIHRoZSBwYXJ0IG9mIHRoZSBnb3Zlcm5tZW50LiBUaGUgUGVuYWwgQ29kZSwgaW4gaXRzIGFydGljbGUgMTM1LCBkZXNjcmliZXMgdGhlIGNyaW1lIG9mIG9taXNzaW9uIG9mIGhlbHAsIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBhdHRpdHVkZSBvZiBmYWlsaW5nIHRvIGhlbHAgcGVvcGxlIGluIGEgdnVsbmVyYWJsZSBzaXR1YXRpb24sIHN1Y2ggYXMgYWJhbmRvbmVkIG9yIGxvc3QgY2hpbGRyZW4sIGRpc2FibGVkIHBlb3BsZSwgd2l0aCBpbmp1cmllcywgb3IgaW4gYSBzaXR1YXRpb24gb2YgcmlzayBvciBkYW5nZXIuIEZvciB0aGF0IHJlYXNvbiwgdGhlIGdvdmVybm1lbnQgc2hvdWxkIGFsc28gYmUgYmVoaW5kIGJhcnMuCgoKCiMgQmlvZ3JhcGh5Cgo=