This analysis compares the United States National and Regional trends of child and adult COVID-19 hospitalizations.

Data was acquired through the United States Department of Health and Human Services (HHS)

Helpful FAQ Resource

library(tidyverse)
library(ggplot2)
library(formattable)
library(data.table)
library(DT)

Data Import

Import HHS Hospitalization Counts and Census Data

hhs_data <- read_csv('data/COVID-19_Reported_Patient_Impact_and_Hospital_Capacity_by_State_Timeseries_20210417.csv')

census_data <- read.csv('data/sc-est2020-18+pop-res.csv')

state_abv <- read.delim2('data/state_abv.txt', sep = "|")

Data Pre-Processing

Add full state names to HHS Data

state_abv <- state_abv %>% 
  mutate(State = tolower(STATE_NAME)) %>%
  rename("state_abv" = STUSAB) %>%
  select(state_abv, State)

hhs_data <- hhs_data %>%
  rename("state_abv" = state) %>%
  left_join(., state_abv, by = "state_abv")

Remove US.Territories

hhs_data <- hhs_data %>%
  filter(!state_abv %in% c("GU", "MP", "PR", "VI"))

Clean US Census Data

Calculate new variable POPEST17uNDER2020 for estimated population size of ages \(\leq\) 17.

census_data <- census_data %>% 
  mutate(NAME = tolower(NAME)) %>%
  rename('State' = NAME) %>% 
  mutate(POPEST17Under2020 = POPESTIMATE2020 - POPEST18PLUS2020) %>%
  rename('Region' = 'REGION')

Recode Regions according to the U.S Census

census_data$Region <- recode(census_data$Region, 
                             '0' = 'US', 
                             '1' = 'Northeast', 
                             '2' = 'Midwest', 
                             '3' = 'South', 
                             '4' = 'West')

Add Census data to HHS data

hhs_data <- left_join(hhs_data, census_data, by = 'State')

Convert to date format

hhs_data$date <- as.Date(hhs_data$date)

Remove dates with no data collection

We will remove dates when there was noprevious_day_admission_pediatric_covid_confirmedcases reported for the whole week. Date collection appears to begin on July 15, 2020. However, previous structuring of the HHS had the data collection_week beginning on July 30 (see more note below). To stay consistent, we will remove data prior to July 30th

#View(hhs_data %>% select(date, previous_day_admission_pediatric_covid_confirmed) %>% group_by(date) %>% mutate(sum_date = sum(previous_day_admission_pediatric_covid_confirmed, na.rm = TRUE)) %>% distinct(date, sum_date))

hhs_data <- hhs_data %>% filter(!date < '2020-07-31')

Sum by month

Similar to the original HHS data release, we will sum by month. As described by the original data dictionary:

“For a given entry, the term collection_week signifies the start of the period that is aggregated. For example, a “collection_week” of 2020-11-20 means the average/sum/coverage of the elements captured from that given facility starting and including Friday, November 20, 2020, and ending and including reports for Thursday, November 26, 2020."

To develop a new collection_week variable, we will download the facility level HHS data and map each collection_week to a date_id. We will then group each unique data in the newer version of the data into bins of 7 days that will match the previous old collection_week bins.

facility_level <- read_csv("data/COVID-19_Reported_Patient_Impact_and_Hospital_Capacity_by_Facility_20210329.csv")

facility_level <- facility_level %>% 
  distinct(collection_week) %>%
  mutate(collection_week = as.Date(collection_week)) %>%
  data.frame() %>%
  arrange(collection_week)

# identify unique dates
date_week_id <- facility_level %>% distinct(collection_week) %>% arrange(collection_week)
date_week_id$date_id <- seq.int(nrow(date_week_id))
date_week_id <- date_week_id %>%
  rename("date" = collection_week)

# function to bin all dates every 7 days
all_dates <- hhs_data %>% distinct(date) %>% arrange(date)
all_dates$date_id <- c(0, rep(1:(nrow(all_dates)-1)%/%7))+1

# add the date_ids to main dataset and create new column "collection_week" with the first date for each date_id bin
hhs_data <- hhs_data %>%
  left_join(., all_dates, by = "date") %>% 
  group_by(date_id) %>% 
  mutate(collection_week = min(date)) %>%
  ungroup() %>%
  filter(!collection_week >= "2021-04-16") # remove the latest week due to incomplete data collection at the initial time of running this script

Data quality

In rare cases, if the previous_day_admission column is a negative number, we will replace with a 0

hhs_data <- hhs_data %>%
  mutate(previous_day_admission_pediatric_covid_confirmed = if_else(previous_day_admission_pediatric_covid_confirmed < 0, 0,
                                                                    previous_day_admission_pediatric_covid_confirmed),
         previous_day_admission_adult_covid_confirmed = if_else(previous_day_admission_adult_covid_confirmed < 0, 0,
                                                                previous_day_admission_adult_covid_confirmed))

Select columns of interest

hhs_data <- hhs_data %>% 
  select(collection_week, state_abv, State, Region, POPEST18PLUS2020, POPEST17Under2020,
         previous_day_admission_pediatric_covid_confirmed, previous_day_admission_adult_covid_confirmed)

Calculate Hospitalization Rates

First, we will straify into pediatric and adult datasets

hhs_pediatric_processed <- hhs_data %>%
  group_by(collection_week) %>%
  mutate(hospitalizations = sum(previous_day_admission_pediatric_covid_confirmed, na.rm = TRUE)) %>%
  ungroup() %>%
  group_by(collection_week, Region) %>%
  mutate(hospitalizations_region = sum(previous_day_admission_pediatric_covid_confirmed, na.rm = TRUE)) %>%
  ungroup() %>%
  select(collection_week, state_abv, State, Region, POPEST18PLUS2020, POPEST17Under2020, 
         hospitalizations, hospitalizations_region) %>%
  mutate(population = "pediatric")

hhs_adult_processed <- hhs_data %>%
  group_by(collection_week) %>%
  mutate(hospitalizations = sum(previous_day_admission_adult_covid_confirmed, na.rm = TRUE)) %>%
  ungroup() %>%
  group_by(collection_week, Region) %>%
  mutate(hospitalizations_region = sum(previous_day_admission_adult_covid_confirmed, na.rm = TRUE)) %>%
  ungroup() %>%
  select(collection_week, state_abv, State, Region, POPEST18PLUS2020, POPEST17Under2020,
         hospitalizations, hospitalizations_region) %>%
  mutate(population = "adult")

Combine adult and pediatric hospitalizations

hhs_data_proc <- rbind(hhs_pediatric_processed,
                       hhs_adult_processed)

Standardize Hospitalization Rates

Here we will standardize hospitalizations per 100,000 adults/children throughout the Nation and by Region

pop_adult_nation <- census_data %>% 
  filter(State == "united states") %>% 
  select(POPEST18PLUS2020) %>% 
  as.numeric()

pop_pediatric_nation <- census_data %>% 
  filter(State == "united states") %>% 
  select(POPEST17Under2020) %>% 
  as.numeric()

region_estimates <- hhs_data_proc %>% 
  ungroup() %>%
  distinct(Region, POPEST17Under2020, POPEST18PLUS2020) %>%
  group_by(Region) %>%
  mutate(Region_census_pediatric = sum(POPEST17Under2020),
         Region_census_adult = sum(POPEST18PLUS2020)) %>%
  select(Region, Region_census_pediatric, Region_census_adult) %>%
  distinct()


hhs_data_proc <- hhs_data_proc %>%
  left_join(., region_estimates, by = "Region") %>%
  mutate(hospitalizations_standardized_us = if_else(population == "pediatric", 
                                                    hospitalizations/pop_pediatric_nation*100000,
         hospitalizations/pop_adult_nation*100000)) %>%
  group_by(collection_week, population, Region) %>%
  mutate(hospitalizations_standardized_region = if_else(population == "pediatric", 
                                                    hospitalizations_region/Region_census_pediatric*100000,
         hospitalizations_region/Region_census_adult*100000)) %>%
  ungroup()

Statistics

Total Number of Pediatric and Adult Hospitalizations over data collection

hosp_counts <- hhs_data_proc %>% 
  distinct(population, collection_week, hospitalizations) %>%
  group_by(population) %>%
  mutate(`Total Hospitalizations` = sum(hospitalizations, na.rm = TRUE)) %>%
  ungroup() %>%
  distinct(population, `Total Hospitalizations`)

datatable(hosp_counts)

National Median Weekly Hospitalization Rate

hosp_counts_med <- hhs_data_proc %>% 
  group_by(population) %>%
  distinct(population, collection_week, hospitalizations) %>%
  mutate(Q1 = round(quantile(hospitalizations, 0.25), 1),
         `Median Weekly Hospitalizations` = median(hospitalizations, na.rm = TRUE),
         Q3 = round(quantile(hospitalizations, 0.75), 1),) %>%
  distinct(population, Q1, `Median Weekly Hospitalizations`, Q3)

datatable(hosp_counts_med)

National Median Hospitalization Rate per 100,000 Children/Adults

national_stats <- hhs_data_proc %>% 
  distinct(population, hospitalizations_standardized_us) %>%
  group_by(population) %>%
  mutate(Q1 = round(quantile(hospitalizations_standardized_us, 0.25), 1),
         Median = round(median(hospitalizations_standardized_us), 1),
         Q3 = round(quantile(hospitalizations_standardized_us, 0.75), 1)) %>%
  select(-hospitalizations_standardized_us) %>%
  distinct() %>%
  ungroup() %>%
  as.data.frame()

datatable(national_stats)

Change Point Analysis

source("R/change_point_function.R")
## modify the HHS datast
date_week_id <- hhs_data_proc %>% distinct(collection_week) %>% arrange(collection_week)
date_week_id$date_id <- seq.int(nrow(date_week_id))

hhs_data_proc <- hhs_data_proc %>% left_join(., date_week_id, by = "collection_week")

National Hospitalizations Change Point

set.seed(101)
## adult hosps
adult_hosps <- hhs_data_proc %>% 
  ungroup() %>% 
  filter(population == "adult") %>%
  select(collection_week, hospitalizations_standardized_us) %>% 
  arrange(collection_week) %>%
  distinct(hospitalizations_standardized_us)

adult_hosps_mat <- t(data.matrix(adult_hosps))
row.names(adult_hosps_mat) <- NULL

## pediatric hosps
ped_hosps <- hhs_data_proc %>% 
  ungroup() %>% 
  filter(population == "pediatric") %>%
  select(collection_week, hospitalizations_standardized_us) %>% 
  arrange(collection_week) %>%
  distinct(hospitalizations_standardized_us)

ped_hosps_mat <- t(data.matrix(ped_hosps))
row.names(ped_hosps_mat) <- NULL


cp_nat_adult <- change_point_test(adult_hosps_mat, w = rep(1 / nrow(adult_hosps_mat), nrow(adult_hosps_mat)), 
                              t_range = 2:(ncol(adult_hosps_mat) - 2), boot_num = 10000)


cp_nat_ped <- change_point_test(ped_hosps_mat, w = rep(1 / nrow(ped_hosps_mat), nrow(ped_hosps_mat)), 
                              t_range = 2:(ncol(ped_hosps_mat) - 2), boot_num = 10000)

Hospitalizations Change Point by Region

Midwest

midwest_adult_hosps <- hhs_data_proc %>% 
  distinct(collection_week, Region, population, hospitalizations_standardized_region) %>% 
  arrange(collection_week) %>%
  filter(population == "adult" & Region == "Midwest") %>%
  distinct(hospitalizations_standardized_region) 

midwest_adult_hosps_mat <- t(data.matrix(midwest_adult_hosps))
row.names(midwest_adult_hosps_mat) <- NULL

cp_reg_midwest_adult <- change_point_test(midwest_adult_hosps_mat, w = rep(1 / nrow(midwest_adult_hosps_mat), nrow(midwest_adult_hosps_mat)), 
                              t_range = 2:(ncol(midwest_adult_hosps_mat) - 2), boot_num = 10000)

midwest_ped_hosps <- hhs_data_proc %>%
  distinct(collection_week, Region, population, hospitalizations_standardized_region) %>% 
  arrange(collection_week) %>%
  filter(population == "pediatric" & Region == "Midwest") %>%
  distinct(hospitalizations_standardized_region) 

midwest_ped_hosps_mat <- t(data.matrix(midwest_ped_hosps))
row.names(midwest_ped_hosps_mat) <- NULL


cp_reg_midwest_ped <- change_point_test(midwest_ped_hosps_mat, w = rep(1 / nrow(midwest_ped_hosps_mat), nrow(midwest_ped_hosps_mat)), 
                              t_range = 2:(ncol(midwest_ped_hosps_mat) - 2), boot_num = 10000)

Northeast

northeast_adult_hosps <- hhs_data_proc %>% 
  distinct(collection_week, Region, population, hospitalizations_standardized_region) %>% 
  arrange(collection_week) %>%
  filter(population == "adult" & Region == "Northeast") %>%
  distinct(hospitalizations_standardized_region) 

northeast_adult_hosps_mat <- t(data.matrix(northeast_adult_hosps))
row.names(northeast_adult_hosps_mat) <- NULL

cp_reg_northeast_adult <-change_point_test(northeast_adult_hosps_mat, w = rep(1 / nrow(northeast_adult_hosps_mat), nrow(northeast_adult_hosps_mat)), 
                              t_range = 2:(ncol(northeast_adult_hosps_mat) - 2), boot_num = 10000)

northeast_ped_hosps <- hhs_data_proc %>%
  distinct(collection_week, Region, population, hospitalizations_standardized_region) %>% 
  arrange(collection_week) %>%
  filter(population == "pediatric" & Region == "Northeast") %>%
  distinct(hospitalizations_standardized_region) 

northeast_ped_hosps_mat <- t(data.matrix(northeast_ped_hosps))
row.names(northeast_ped_hosps_mat) <- NULL

cp_reg_northeast_ped <- change_point_test(northeast_ped_hosps_mat, w = rep(1 / nrow(northeast_ped_hosps_mat), nrow(northeast_ped_hosps_mat)), 
                              t_range = 2:(ncol(northeast_ped_hosps_mat) - 2), boot_num = 10000)

South

south_adult_hosps <- hhs_data_proc %>% 
  distinct(collection_week, Region, population, hospitalizations_standardized_region) %>% 
  arrange(collection_week) %>%
  filter(population == "adult" & Region == "South") %>%
  distinct(hospitalizations_standardized_region) 

south_adult_hosps_mat <- t(data.matrix(south_adult_hosps))
row.names(south_adult_hosps_mat) <- NULL

cp_reg_south_adult <-change_point_test(south_adult_hosps_mat, w = rep(1 / nrow(south_adult_hosps_mat), nrow(south_adult_hosps_mat)), 
                              t_range = 2:(ncol(south_adult_hosps_mat) - 2), boot_num = 10000)

south_ped_hosps <- hhs_data_proc %>%
  distinct(collection_week, Region, population, hospitalizations_standardized_region) %>% 
  arrange(collection_week) %>%
  filter(population == "pediatric" & Region == "South") %>%
  distinct(hospitalizations_standardized_region) 

south_ped_hosps_mat <- t(data.matrix(south_ped_hosps))
row.names(south_ped_hosps_mat) <- NULL

cp_reg_south_ped <- change_point_test(south_ped_hosps_mat, w = rep(1 / nrow(south_ped_hosps_mat), nrow(south_ped_hosps_mat)), 
                              t_range = 2:(ncol(south_ped_hosps_mat) - 2), boot_num = 10000)

West

west_adult_hosps <- hhs_data_proc %>% 
  distinct(collection_week, Region, population, hospitalizations_standardized_region) %>% 
  arrange(collection_week) %>%
  filter(population == "adult" & Region == "West") %>%
  distinct(hospitalizations_standardized_region) 

west_adult_hosps_mat <- t(data.matrix(west_adult_hosps))
row.names(west_adult_hosps_mat) <- NULL

cp_reg_west_adult <- change_point_test(west_adult_hosps_mat, w = rep(1 / nrow(west_adult_hosps_mat), nrow(west_adult_hosps_mat)), 
                              t_range = 2:(ncol(west_adult_hosps_mat) - 2), boot_num = 10000)

west_ped_hosps <- hhs_data_proc %>%
  distinct(collection_week, Region, population, hospitalizations_standardized_region) %>% 
  arrange(collection_week) %>%
  filter(population == "pediatric" & Region == "West") %>%
  distinct(hospitalizations_standardized_region) 

west_ped_hosps_mat <- t(data.matrix(west_ped_hosps))
row.names(west_ped_hosps_mat) <- NULL

cp_reg_west_ped <- change_point_test(west_ped_hosps_mat, w = rep(1 / nrow(west_ped_hosps_mat), nrow(west_ped_hosps_mat)), 
                              t_range = 2:(ncol(west_ped_hosps_mat) - 2), boot_num = 10000)

Change Point Results

National Level

cp_nat_adult <- unlist(cp_nat_adult) %>% 
  data.frame()
colnames(cp_nat_adult)[1] <- "National Adult Hospitalizations"

cp_nat_ped <- unlist(cp_nat_ped) %>% 
  data.frame()
colnames(cp_nat_ped)[1] <- "National Pediatric Hospitalizations"

cp_nat_results <- cbind(cp_nat_adult, cp_nat_ped) %>% t() %>% data.frame()

cp_nat_results <- cp_nat_results %>%
  mutate(p.value = round(p.value,4),
         stat = round(stat,1)) %>%
  t()

rownames(cp_nat_results) <- c("Change Point Week", "P-value", "F-Stat")

datatable(cp_nat_results)

Regional Level

cp_reg_midwest_adult <- unlist(cp_reg_midwest_adult) %>% 
  data.frame()
colnames(cp_reg_midwest_adult)[1] <- "Midwest Adult"

cp_reg_midwest_ped <- unlist(cp_reg_midwest_ped) %>% 
  data.frame()
colnames(cp_reg_midwest_ped)[1] <- "Midwest Pediatric"

cp_reg_south_adult <- unlist(cp_reg_south_adult) %>% 
  data.frame()
colnames(cp_reg_south_adult)[1] <- "South Adult"

cp_reg_south_ped <- unlist(cp_reg_south_ped) %>% 
  data.frame()
colnames(cp_reg_south_ped)[1] <- "South Pediatric"

cp_reg_west_adult <- unlist(cp_reg_west_adult) %>% 
  data.frame()
colnames(cp_reg_west_adult)[1] <- "West Adult"

cp_reg_west_ped <- unlist(cp_reg_west_ped) %>% 
  data.frame()
colnames(cp_reg_west_ped)[1] <- "West Pediatric"

cp_reg_northeast_adult <- unlist(cp_reg_northeast_adult) %>% 
  data.frame()
colnames(cp_reg_northeast_adult)[1] <- "Northeast Adult"

cp_reg_northeast_ped <- unlist(cp_reg_northeast_ped) %>% 
  data.frame()
colnames(cp_reg_northeast_ped)[1] <- "Northeast Pediatric"

cp_reg_results <- cbind(cp_reg_midwest_adult, cp_reg_midwest_ped,
                        cp_reg_south_adult, cp_reg_south_ped,
                        cp_reg_west_adult, cp_reg_west_ped,
                        cp_reg_northeast_adult, cp_reg_northeast_ped) %>% 
  t() %>% 
  data.frame()

cp_reg_results <- cp_reg_results %>%
  mutate(p.value = round(p.value,4),
         stat = round(stat,1)) %>%
  t()

rownames(cp_reg_results) <- c("Change Point Week", "P-value", "F-Stat")

datatable(cp_reg_results)

Next, we will annotate plots with change points

#remotes::install_github("mattcowgill/ggannotate")
library(ggannotate) #ggannotate(plot) 
cp_peds <- cp_nat_results %>% 
  data.frame() %>%
  select(National.Pediatric.Hospitalizations) %>% 
  slice(1L) %>%
  as.numeric()

cp_peds_xy <- hhs_data_proc %>% 
  data.frame() %>% 
  distinct(date_id, collection_week, hospitalizations_standardized_us, population) %>% 
  filter(date_id == cp_peds, 
         population == "pediatric")


cp_adults <- cp_nat_results %>% 
  data.frame() %>%
  select(National.Adult.Hospitalizations) %>% 
  slice(1L) %>%
  as.numeric()

cp_adults_xy <- hhs_data_proc %>% 
  data.frame() %>% 
  distinct(date_id, collection_week, hospitalizations_standardized_us, population) %>% 
  filter(date_id == cp_adults, 
         population == "adult")

ggplot(hhs_data_proc %>% 
         mutate(hospitalizations_standardized_us = if_else(population == "pediatric", hospitalizations_standardized_us*10, hospitalizations_standardized_us)) %>% 
       distinct(collection_week, hospitalizations_standardized_us, population),
       aes(x = collection_week, y = hospitalizations_standardized_us, color = population)) + 
  geom_line() + 
  geom_point() +
  scale_color_brewer(palette="Dark2", labels = c("Adult", "Child"), name = "") + 
  ylab("Hospitalizations per 100K Adults") + 
  xlab("") + 
  scale_x_date(date_labels = "%b-%d", date_breaks = "1 month") + 
  scale_y_continuous(sec.axis = sec_axis(~ ./10, name = "Hospitalizations per 100K Children")) + 
  geom_text(data = data.frame(x = cp_adults_xy$collection_week,
                              y = cp_adults_xy$hospitalizations_standardized_us,
                              label = "*"),
            mapping = aes(x = x, y = y, label = label),
            size = 12, hjust = 0.45, vjust = 0.75, colour = "#1B9E77", inherit.aes = FALSE) + 
  geom_text(data = data.frame(x = cp_peds_xy$collection_week,
                              y = cp_peds_xy$hospitalizations_standardized_us*10, 
                              label = "*"),
            mapping = aes(x = x, y = y, label = label),
            size = 12, hjust = 0.5, vjust = 0.75, colour = "#D95F02", inherit.aes = FALSE) + 
  theme_bw() + 
  theme(plot.title = element_text(""),
        legend.title = element_text(face = "bold", size = 15),
        legend.text = element_text(size=15),
        legend.position = "top",
        legend.direction = "horizontal",
        axis.text.x = element_text(face = "bold", size = 10),
        axis.title.y = element_text(face = "bold", size = 13, color = "#1B9E77", margin=margin(0,10,0,0)),
        axis.text.y.left = element_text(face = "bold",  size = 13, color = "#1B9E77"),
        axis.title.y.right = element_text(face = "bold", size = 13, color='#D95F02', margin=margin(0,0,0,10)),
        axis.text.y.right = element_text(face = "bold", size = 13, color='#D95F02'))

cp_peds <- cp_reg_results %>% 
  data.frame() %>%
  select(contains("Pediatric")) %>% 
  slice(1L) %>%
  t() 

region_col <- data.frame(Region = c("Midwest", "South", "West", "Northeast"))

cp_peds <- cbind(cp_peds, region_col)
rownames(cp_peds) <- NULL


cp_adults <- cp_reg_results %>% 
  data.frame() %>%
  select(contains("Adult")) %>% 
  slice(1L) %>%
  t() 

cp_adults <- cbind(cp_adults, region_col)
rownames(cp_adults) <- NULL

cp_peds_xy <- hhs_data_proc %>% 
  data.frame() %>% 
  left_join(., cp_peds, by = "Region") %>% 
  distinct(date_id, collection_week, hospitalizations_standardized_region, population, Region, `Change Point Week`)

cp_adults_xy <- hhs_data_proc %>% 
  data.frame() %>% 
  left_join(., cp_adults, by = "Region") %>% 
  distinct(date_id, collection_week, hospitalizations_standardized_region, population, Region, `Change Point Week`)



ggplot(hhs_data_proc %>%
         mutate(hospitalizations_standardized_region = if_else(population == "pediatric", 
                                                 hospitalizations_standardized_region*10, hospitalizations_standardized_region)) %>%
         distinct(collection_week, Region, population, hospitalizations_standardized_region),
       aes(x = collection_week, y = hospitalizations_standardized_region, color = population)) + 
  geom_point() +
  geom_line(alpha=0.9) +
  # midwest change point identifier
  geom_text(data = data.frame(x = cp_adults_xy %>% 
                                filter(Region == "Midwest" & population == "adult",
                                       date_id == `Change Point Week`) %>% 
                                select(collection_week) %>%
                                rename('x' = collection_week),
                              y = cp_adults_xy %>% 
                                filter(Region == "Midwest" & population == "adult",
                                       date_id == `Change Point Week`) %>% select(hospitalizations_standardized_region) %>%
                                rename('y' = hospitalizations_standardized_region), 
                              label = "*", Region = "Midwest"),
            mapping = aes(x = x, y = y, label = label),
            colour = "#1B9E77", size = 11, hjust = 0.5, vjust = 0.8, inherit.aes = FALSE) + 
  geom_text(data = data.frame(x = cp_peds_xy %>% 
                                filter(Region == "Midwest" & population == "pediatric",
                                       date_id == `Change Point Week`) %>% 
                                select(collection_week) %>%
                                rename('x' = collection_week),
                              y = cp_peds_xy %>% 
                                filter(Region == "Midwest" & population == "pediatric",
                                       date_id == `Change Point Week`) %>%
                                select(hospitalizations_standardized_region) %>%
                                mutate(hospitalizations_standardized_region = hospitalizations_standardized_region*10) %>%
                                rename('y' = hospitalizations_standardized_region),
                              label = "*", Region = "Midwest"),
            mapping = aes(x = x, y = y, label = label),
            colour = "#D95F02", size = 11, hjust = 0.5, vjust = 0.8, inherit.aes = FALSE) + 
  # Northeast change point identifier
  geom_text(data = data.frame(x = cp_adults_xy %>% 
                                filter(Region == "Northeast" & population == "adult",
                                       date_id == `Change Point Week`) %>% 
                                select(collection_week) %>%
                                rename('x' = collection_week),
                              y = cp_adults_xy %>% 
                                filter(Region == "Northeast" & population == "adult",
                                       date_id == `Change Point Week`) %>%
                                select(hospitalizations_standardized_region) %>%
                                rename('y' = hospitalizations_standardized_region), 
                              label = "*", Region = "Northeast"),
            mapping = aes(x = x, y = y, label = label),
            colour = "#1B9E77", size = 11, hjust = 0.5, vjust = 0.8, inherit.aes = FALSE) + 
  geom_text(data = data.frame(x = cp_peds_xy %>% 
                                filter(Region == "Northeast" & population == "pediatric",
                                       date_id == `Change Point Week`) %>% 
                                select(collection_week) %>%
                                rename('x' = collection_week),
                              y = cp_peds_xy %>% 
                                filter(Region == "Northeast" & population == "pediatric",
                                       date_id == `Change Point Week`) %>%
                                select(hospitalizations_standardized_region) %>%
                                mutate(hospitalizations_standardized_region = hospitalizations_standardized_region*10) %>%
                                rename('y' = hospitalizations_standardized_region),
                              label = "*", Region = "Northeast"),
            mapping = aes(x = x, y = y, label = label),
            colour = "#D95F02", size = 11, hjust = 0.5, vjust = 0.8, inherit.aes = FALSE) + 
  # South change point identifier
  geom_text(data = data.frame(x = cp_adults_xy %>% 
                                filter(Region == "South" & population == "adult",
                                       date_id == `Change Point Week`) %>% 
                                select(collection_week) %>%
                                rename('x' = collection_week),
                              y = cp_adults_xy %>% 
                                filter(Region == "South" & population == "adult",
                                       date_id == `Change Point Week`) %>%
                                select(hospitalizations_standardized_region) %>%
                                rename('y' = hospitalizations_standardized_region), 
                              label = "*", Region = "South"),
            mapping = aes(x = x, y = y, label = label),
            colour = "#1B9E77", size = 11, hjust = 0.5, vjust = 0.8, inherit.aes = FALSE) + 
  geom_text(data = data.frame(x = cp_peds_xy %>% 
                                filter(Region == "South" & population == "pediatric",
                                       date_id == `Change Point Week`) %>% 
                                select(collection_week) %>%
                                rename('x' = collection_week),
                              y = cp_peds_xy %>% 
                                filter(Region == "South" & population == "pediatric",
                                       date_id == `Change Point Week`) %>%
                                select(hospitalizations_standardized_region) %>%
                                mutate(hospitalizations_standardized_region = hospitalizations_standardized_region*10) %>%
                                rename('y' = hospitalizations_standardized_region),
                              label = "*", Region = "South"),
            mapping = aes(x = x, y = y, label = label),
            colour = "#D95F02", size = 11, hjust = 0.5, vjust = 0.8, inherit.aes = FALSE) +
  # West change point identifier
  geom_text(data = data.frame(x = cp_adults_xy %>% 
                                filter(Region == "West" & population == "adult",
                                       date_id == `Change Point Week`) %>%
                                select(collection_week) %>%
                                rename('x' = collection_week),
                              y = cp_adults_xy %>% 
                                filter(Region == "West" & population == "adult",
                                       date_id == `Change Point Week`) %>%
                                select(hospitalizations_standardized_region) %>%
                                rename('y' = hospitalizations_standardized_region), 
                              label = "*", Region = "West"),
            mapping = aes(x = x, y = y, label = label),
            colour = "#1B9E77", size = 11, hjust = 0.5, vjust = 0.8, inherit.aes = FALSE) + 
  geom_text(data = data.frame(x = cp_peds_xy %>% 
                                filter(Region == "West" & population == "pediatric",
                                       date_id == `Change Point Week`) %>% 
                                select(collection_week) %>%
                                rename('x' = collection_week),
                              y = cp_peds_xy %>% 
                                filter(Region == "West" & population == "pediatric",
                                       date_id == `Change Point Week`) %>%
                                select(hospitalizations_standardized_region) %>%
                                mutate(hospitalizations_standardized_region = hospitalizations_standardized_region*10) %>%
                                rename('y' = hospitalizations_standardized_region),
                              label = "*", Region = "West"),
            mapping = aes(x = x, y = y, label = label),
            colour = "#D95F02", size = 11, hjust = 0.5, vjust = 0.8, inherit.aes = FALSE) +
  scale_color_brewer(palette="Dark2", labels = c("Adult", "Child"), name = "") + 
  ylab("Hospitalizations per 100k Adults") + 
  xlab("") + 
  scale_x_date(date_labels = "%b", date_breaks = "1 month") + 
  scale_y_continuous(sec.axis = sec_axis(~ ./10, name = "Hospitalizations per 100k Children")) + 
  theme_bw() +
  theme(plot.title = element_text(""),
        legend.title = element_text(face = "bold", size = 15),
        legend.text = element_text(size=15),
        legend.position = "top",
        legend.direction = "horizontal",
        axis.text.x = element_text(face = "bold", size = 10),
        axis.title.y = element_text(face = "bold", size = 13, color = "#1B9E77", margin=margin(0,10,0,0)),
        axis.text.y.left = element_text(face = "bold",  size = 13, color = "#1B9E77"),
        axis.title.y.right = element_text(face = "bold", size = 13, color='#D95F02', margin=margin(0,0,0,10)),
        axis.text.y.right = element_text(face = "bold", size = 13, color='#D95F02')) + 
  facet_wrap(~Region, scales = "fixed") + 
  theme(strip.text.x = element_text(size = 18))  

LS0tDQp0aXRsZTogIkNPVklELTE5IEhvc3BpdGFsaXphdGlvbiBUcmVuZHMiDQphdXRob3I6ICJNZWdoYW4gSHV0Y2gsIE1vbGVpIExpdSwgUGF1bCBBdmlsbGFjaCwgWXVhbiBMdW8sIEZsb3JlbmNlIEJvdXJnZW9pcyINCmRhdGU6ICIyLzI0LzIwMjEiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQoqKlRoaXMgYW5hbHlzaXMgY29tcGFyZXMgdGhlIFVuaXRlZCBTdGF0ZXMgTmF0aW9uYWwgYW5kIFJlZ2lvbmFsIHRyZW5kcyBvZiBjaGlsZCBhbmQgYWR1bHQgQ09WSUQtMTkgaG9zcGl0YWxpemF0aW9ucy4qKg0KDQpEYXRhIHdhcyBhY3F1aXJlZCB0aHJvdWdoIHRoZSBbVW5pdGVkIFN0YXRlcyBEZXBhcnRtZW50IG9mIEhlYWx0aCBhbmQgSHVtYW4gU2VydmljZXMgKEhIUyldKGh0dHBzOi8vaGVhbHRoZGF0YS5nb3YvSG9zcGl0YWwvQ09WSUQtMTktUmVwb3J0ZWQtUGF0aWVudC1JbXBhY3QtYW5kLUhvc3BpdGFsLUNhcGEvZzYyaC1zeWVoKQ0KDQpbSGVscGZ1bCBGQVEgUmVzb3VyY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9DYXJlU2V0L0NPVklEX0hvc3BpdGFsX1BVRj9zcmM9aGQpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZm9ybWF0dGFibGUpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KERUKQ0KYGBgDQoNCiMjICoqRGF0YSBJbXBvcnQqKg0KDQoqKkltcG9ydCBISFMgSG9zcGl0YWxpemF0aW9uIENvdW50cyBhbmQgQ2Vuc3VzIERhdGEqKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaGhzX2RhdGEgPC0gcmVhZF9jc3YoJ2RhdGEvQ09WSUQtMTlfUmVwb3J0ZWRfUGF0aWVudF9JbXBhY3RfYW5kX0hvc3BpdGFsX0NhcGFjaXR5X2J5X1N0YXRlX1RpbWVzZXJpZXNfMjAyMTA0MTcuY3N2JykNCg0KY2Vuc3VzX2RhdGEgPC0gcmVhZC5jc3YoJ2RhdGEvc2MtZXN0MjAyMC0xOCtwb3AtcmVzLmNzdicpDQoNCnN0YXRlX2FidiA8LSByZWFkLmRlbGltMignZGF0YS9zdGF0ZV9hYnYudHh0Jywgc2VwID0gInwiKQ0KYGBgDQoNCiMjICoqRGF0YSBQcmUtUHJvY2Vzc2luZyoqDQoNCioqQWRkIGZ1bGwgc3RhdGUgbmFtZXMgdG8gSEhTIERhdGEqKg0KDQpgYGB7cn0NCnN0YXRlX2FidiA8LSBzdGF0ZV9hYnYgJT4lIA0KICBtdXRhdGUoU3RhdGUgPSB0b2xvd2VyKFNUQVRFX05BTUUpKSAlPiUNCiAgcmVuYW1lKCJzdGF0ZV9hYnYiID0gU1RVU0FCKSAlPiUNCiAgc2VsZWN0KHN0YXRlX2FidiwgU3RhdGUpDQoNCmhoc19kYXRhIDwtIGhoc19kYXRhICU+JQ0KICByZW5hbWUoInN0YXRlX2FidiIgPSBzdGF0ZSkgJT4lDQogIGxlZnRfam9pbiguLCBzdGF0ZV9hYnYsIGJ5ID0gInN0YXRlX2FidiIpDQpgYGANCg0KKipSZW1vdmUgVVMuVGVycml0b3JpZXMqKg0KDQpgYGB7cn0NCmhoc19kYXRhIDwtIGhoc19kYXRhICU+JQ0KICBmaWx0ZXIoIXN0YXRlX2FidiAlaW4lIGMoIkdVIiwgIk1QIiwgIlBSIiwgIlZJIikpDQpgYGANCg0KKipDbGVhbiBVUyBDZW5zdXMgRGF0YSoqDQoNCkNhbGN1bGF0ZSBuZXcgdmFyaWFibGUgYGBgUE9QRVNUMTd1TkRFUjIwMjBgYGAgZm9yIGVzdGltYXRlZCBwb3B1bGF0aW9uIHNpemUgb2YgYWdlcyAkXGxlcSQgMTcuDQoNCmBgYHtyfQ0KY2Vuc3VzX2RhdGEgPC0gY2Vuc3VzX2RhdGEgJT4lIA0KICBtdXRhdGUoTkFNRSA9IHRvbG93ZXIoTkFNRSkpICU+JQ0KICByZW5hbWUoJ1N0YXRlJyA9IE5BTUUpICU+JSANCiAgbXV0YXRlKFBPUEVTVDE3VW5kZXIyMDIwID0gUE9QRVNUSU1BVEUyMDIwIC0gUE9QRVNUMThQTFVTMjAyMCkgJT4lDQogIHJlbmFtZSgnUmVnaW9uJyA9ICdSRUdJT04nKQ0KYGBgDQoNClJlY29kZSBSZWdpb25zIGFjY29yZGluZyB0byB0aGUgW1UuUyBDZW5zdXNdKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZ2VvZ3JhcGhpZXMvcmVmZXJlbmNlLW1hcHMvMjAxMC9nZW8vMjAxMC1jZW5zdXMtcmVnaW9ucy1hbmQtZGl2aXNpb25zLW9mLXRoZS11bml0ZWQtc3RhdGVzLmh0bWwpDQoNCmBgYHtyfQ0KY2Vuc3VzX2RhdGEkUmVnaW9uIDwtIHJlY29kZShjZW5zdXNfZGF0YSRSZWdpb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMCcgPSAnVVMnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnID0gJ05vcnRoZWFzdCcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicgPSAnTWlkd2VzdCcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycgPSAnU291dGgnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnID0gJ1dlc3QnKQ0KYGBgDQoNCioqQWRkIENlbnN1cyBkYXRhIHRvIEhIUyBkYXRhKioNCg0KYGBge3J9DQpoaHNfZGF0YSA8LSBsZWZ0X2pvaW4oaGhzX2RhdGEsIGNlbnN1c19kYXRhLCBieSA9ICdTdGF0ZScpDQpgYGANCg0KKipDb252ZXJ0IHRvIGRhdGUgZm9ybWF0KioNCg0KYGBge3J9DQpoaHNfZGF0YSRkYXRlIDwtIGFzLkRhdGUoaGhzX2RhdGEkZGF0ZSkNCmBgYA0KDQoqKlJlbW92ZSBkYXRlcyB3aXRoIG5vIGRhdGEgY29sbGVjdGlvbioqDQoNCldlIHdpbGwgcmVtb3ZlIGRhdGVzIHdoZW4gdGhlcmUgd2FzIG5vYGBgcHJldmlvdXNfZGF5X2FkbWlzc2lvbl9wZWRpYXRyaWNfY292aWRfY29uZmlybWVkYGBgY2FzZXMgcmVwb3J0ZWQgZm9yIHRoZSB3aG9sZSB3ZWVrLiBEYXRlIGNvbGxlY3Rpb24gYXBwZWFycyB0byBiZWdpbiBvbiBKdWx5IDE1LCAyMDIwLiBIb3dldmVyLCBwcmV2aW91cyBzdHJ1Y3R1cmluZyBvZiB0aGUgSEhTIGhhZCB0aGUgZGF0YSBjb2xsZWN0aW9uX3dlZWsgYmVnaW5uaW5nIG9uIEp1bHkgMzAgKHNlZSBtb3JlIG5vdGUgYmVsb3cpLiBUbyBzdGF5IGNvbnNpc3RlbnQsIHdlIHdpbGwgcmVtb3ZlIGRhdGEgcHJpb3IgdG8gSnVseSAzMHRoDQoNCmBgYHtyfQ0KI1ZpZXcoaGhzX2RhdGEgJT4lIHNlbGVjdChkYXRlLCBwcmV2aW91c19kYXlfYWRtaXNzaW9uX3BlZGlhdHJpY19jb3ZpZF9jb25maXJtZWQpICU+JSBncm91cF9ieShkYXRlKSAlPiUgbXV0YXRlKHN1bV9kYXRlID0gc3VtKHByZXZpb3VzX2RheV9hZG1pc3Npb25fcGVkaWF0cmljX2NvdmlkX2NvbmZpcm1lZCwgbmEucm0gPSBUUlVFKSkgJT4lIGRpc3RpbmN0KGRhdGUsIHN1bV9kYXRlKSkNCg0KaGhzX2RhdGEgPC0gaGhzX2RhdGEgJT4lIGZpbHRlcighZGF0ZSA8ICcyMDIwLTA3LTMxJykNCmBgYA0KDQoqKlN1bSBieSBtb250aCoqDQoNClNpbWlsYXIgdG8gdGhlIG9yaWdpbmFsIEhIUyBkYXRhIHJlbGVhc2UsIHdlIHdpbGwgc3VtIGJ5IG1vbnRoLiBBcyBkZXNjcmliZWQgYnkgdGhlIG9yaWdpbmFsIGRhdGEgZGljdGlvbmFyeToNCg0KIkZvciBhIGdpdmVuIGVudHJ5LCB0aGUgdGVybSBgYGBjb2xsZWN0aW9uX3dlZWtgYGAgc2lnbmlmaWVzIHRoZSBzdGFydCBvZiB0aGUgcGVyaW9kIHRoYXQgaXMgYWdncmVnYXRlZC4gRm9yIGV4YW1wbGUsIGEg4oCcY29sbGVjdGlvbl93ZWVr4oCdIG9mIDIwMjAtMTEtMjAgbWVhbnMgdGhlIGF2ZXJhZ2Uvc3VtL2NvdmVyYWdlIG9mIHRoZSBlbGVtZW50cyBjYXB0dXJlZCBmcm9tIHRoYXQgZ2l2ZW4gZmFjaWxpdHkgc3RhcnRpbmcgYW5kIGluY2x1ZGluZyBGcmlkYXksIE5vdmVtYmVyIDIwLCAyMDIwLCBhbmQgZW5kaW5nIGFuZCBpbmNsdWRpbmcgcmVwb3J0cyBmb3IgVGh1cnNkYXksIE5vdmVtYmVyIDI2LCAyMDIwLiINCg0KVG8gZGV2ZWxvcCBhIG5ldyBgYGBjb2xsZWN0aW9uX3dlZWtgYGAgdmFyaWFibGUsIHdlIHdpbGwgZG93bmxvYWQgdGhlIGZhY2lsaXR5IGxldmVsIEhIUyBkYXRhIGFuZCBtYXAgZWFjaCBgYGBjb2xsZWN0aW9uX3dlZWtgYGAgdG8gYSBgYGBkYXRlX2lkYGBgLiBXZSB3aWxsIHRoZW4gZ3JvdXAgZWFjaCB1bmlxdWUgZGF0YSBpbiB0aGUgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgZGF0YSBpbnRvIGJpbnMgb2YgNyBkYXlzIHRoYXQgd2lsbCBtYXRjaCB0aGUgcHJldmlvdXMgb2xkIGNvbGxlY3Rpb25fd2VlayBiaW5zLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZmFjaWxpdHlfbGV2ZWwgPC0gcmVhZF9jc3YoImRhdGEvQ09WSUQtMTlfUmVwb3J0ZWRfUGF0aWVudF9JbXBhY3RfYW5kX0hvc3BpdGFsX0NhcGFjaXR5X2J5X0ZhY2lsaXR5XzIwMjEwMzI5LmNzdiIpDQoNCmZhY2lsaXR5X2xldmVsIDwtIGZhY2lsaXR5X2xldmVsICU+JSANCiAgZGlzdGluY3QoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgbXV0YXRlKGNvbGxlY3Rpb25fd2VlayA9IGFzLkRhdGUoY29sbGVjdGlvbl93ZWVrKSkgJT4lDQogIGRhdGEuZnJhbWUoKSAlPiUNCiAgYXJyYW5nZShjb2xsZWN0aW9uX3dlZWspDQoNCiMgaWRlbnRpZnkgdW5pcXVlIGRhdGVzDQpkYXRlX3dlZWtfaWQgPC0gZmFjaWxpdHlfbGV2ZWwgJT4lIGRpc3RpbmN0KGNvbGxlY3Rpb25fd2VlaykgJT4lIGFycmFuZ2UoY29sbGVjdGlvbl93ZWVrKQ0KZGF0ZV93ZWVrX2lkJGRhdGVfaWQgPC0gc2VxLmludChucm93KGRhdGVfd2Vla19pZCkpDQpkYXRlX3dlZWtfaWQgPC0gZGF0ZV93ZWVrX2lkICU+JQ0KICByZW5hbWUoImRhdGUiID0gY29sbGVjdGlvbl93ZWVrKQ0KDQojIGZ1bmN0aW9uIHRvIGJpbiBhbGwgZGF0ZXMgZXZlcnkgNyBkYXlzDQphbGxfZGF0ZXMgPC0gaGhzX2RhdGEgJT4lIGRpc3RpbmN0KGRhdGUpICU+JSBhcnJhbmdlKGRhdGUpDQphbGxfZGF0ZXMkZGF0ZV9pZCA8LSBjKDAsIHJlcCgxOihucm93KGFsbF9kYXRlcyktMSklLyU3KSkrMQ0KDQojIGFkZCB0aGUgZGF0ZV9pZHMgdG8gbWFpbiBkYXRhc2V0IGFuZCBjcmVhdGUgbmV3IGNvbHVtbiAiY29sbGVjdGlvbl93ZWVrIiB3aXRoIHRoZSBmaXJzdCBkYXRlIGZvciBlYWNoIGRhdGVfaWQgYmluDQpoaHNfZGF0YSA8LSBoaHNfZGF0YSAlPiUNCiAgbGVmdF9qb2luKC4sIGFsbF9kYXRlcywgYnkgPSAiZGF0ZSIpICU+JSANCiAgZ3JvdXBfYnkoZGF0ZV9pZCkgJT4lIA0KICBtdXRhdGUoY29sbGVjdGlvbl93ZWVrID0gbWluKGRhdGUpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBmaWx0ZXIoIWNvbGxlY3Rpb25fd2VlayA+PSAiMjAyMS0wNC0xNiIpICMgcmVtb3ZlIHRoZSBsYXRlc3Qgd2VlayBkdWUgdG8gaW5jb21wbGV0ZSBkYXRhIGNvbGxlY3Rpb24gYXQgdGhlIGluaXRpYWwgdGltZSBvZiBydW5uaW5nIHRoaXMgc2NyaXB0DQpgYGANCg0KDQoqKkRhdGEgcXVhbGl0eSoqDQoNCkluIHJhcmUgY2FzZXMsIGlmIHRoZSBwcmV2aW91c19kYXlfYWRtaXNzaW9uIGNvbHVtbiBpcyBhIG5lZ2F0aXZlIG51bWJlciwgd2Ugd2lsbCByZXBsYWNlIHdpdGggYSAwDQoNCmBgYHtyfQ0KaGhzX2RhdGEgPC0gaGhzX2RhdGEgJT4lDQogIG11dGF0ZShwcmV2aW91c19kYXlfYWRtaXNzaW9uX3BlZGlhdHJpY19jb3ZpZF9jb25maXJtZWQgPSBpZl9lbHNlKHByZXZpb3VzX2RheV9hZG1pc3Npb25fcGVkaWF0cmljX2NvdmlkX2NvbmZpcm1lZCA8IDAsIDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2RheV9hZG1pc3Npb25fcGVkaWF0cmljX2NvdmlkX2NvbmZpcm1lZCksDQogICAgICAgICBwcmV2aW91c19kYXlfYWRtaXNzaW9uX2FkdWx0X2NvdmlkX2NvbmZpcm1lZCA9IGlmX2Vsc2UocHJldmlvdXNfZGF5X2FkbWlzc2lvbl9hZHVsdF9jb3ZpZF9jb25maXJtZWQgPCAwLCAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2RheV9hZG1pc3Npb25fYWR1bHRfY292aWRfY29uZmlybWVkKSkNCmBgYA0KDQoqKlNlbGVjdCBjb2x1bW5zIG9mIGludGVyZXN0KioNCg0KYGBge3J9DQpoaHNfZGF0YSA8LSBoaHNfZGF0YSAlPiUgDQogIHNlbGVjdChjb2xsZWN0aW9uX3dlZWssIHN0YXRlX2FidiwgU3RhdGUsIFJlZ2lvbiwgUE9QRVNUMThQTFVTMjAyMCwgUE9QRVNUMTdVbmRlcjIwMjAsDQogICAgICAgICBwcmV2aW91c19kYXlfYWRtaXNzaW9uX3BlZGlhdHJpY19jb3ZpZF9jb25maXJtZWQsIHByZXZpb3VzX2RheV9hZG1pc3Npb25fYWR1bHRfY292aWRfY29uZmlybWVkKQ0KYGBgDQoNCioqQ2FsY3VsYXRlIEhvc3BpdGFsaXphdGlvbiBSYXRlcyoqDQoNCkZpcnN0LCB3ZSB3aWxsIHN0cmFpZnkgaW50byBwZWRpYXRyaWMgYW5kIGFkdWx0IGRhdGFzZXRzDQoNCmBgYHtyfQ0KaGhzX3BlZGlhdHJpY19wcm9jZXNzZWQgPC0gaGhzX2RhdGEgJT4lDQogIGdyb3VwX2J5KGNvbGxlY3Rpb25fd2VlaykgJT4lDQogIG11dGF0ZShob3NwaXRhbGl6YXRpb25zID0gc3VtKHByZXZpb3VzX2RheV9hZG1pc3Npb25fcGVkaWF0cmljX2NvdmlkX2NvbmZpcm1lZCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZ3JvdXBfYnkoY29sbGVjdGlvbl93ZWVrLCBSZWdpb24pICU+JQ0KICBtdXRhdGUoaG9zcGl0YWxpemF0aW9uc19yZWdpb24gPSBzdW0ocHJldmlvdXNfZGF5X2FkbWlzc2lvbl9wZWRpYXRyaWNfY292aWRfY29uZmlybWVkLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoY29sbGVjdGlvbl93ZWVrLCBzdGF0ZV9hYnYsIFN0YXRlLCBSZWdpb24sIFBPUEVTVDE4UExVUzIwMjAsIFBPUEVTVDE3VW5kZXIyMDIwLCANCiAgICAgICAgIGhvc3BpdGFsaXphdGlvbnMsIGhvc3BpdGFsaXphdGlvbnNfcmVnaW9uKSAlPiUNCiAgbXV0YXRlKHBvcHVsYXRpb24gPSAicGVkaWF0cmljIikNCg0KaGhzX2FkdWx0X3Byb2Nlc3NlZCA8LSBoaHNfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgbXV0YXRlKGhvc3BpdGFsaXphdGlvbnMgPSBzdW0ocHJldmlvdXNfZGF5X2FkbWlzc2lvbl9hZHVsdF9jb3ZpZF9jb25maXJtZWQsIG5hLnJtID0gVFJVRSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGdyb3VwX2J5KGNvbGxlY3Rpb25fd2VlaywgUmVnaW9uKSAlPiUNCiAgbXV0YXRlKGhvc3BpdGFsaXphdGlvbnNfcmVnaW9uID0gc3VtKHByZXZpb3VzX2RheV9hZG1pc3Npb25fYWR1bHRfY292aWRfY29uZmlybWVkLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoY29sbGVjdGlvbl93ZWVrLCBzdGF0ZV9hYnYsIFN0YXRlLCBSZWdpb24sIFBPUEVTVDE4UExVUzIwMjAsIFBPUEVTVDE3VW5kZXIyMDIwLA0KICAgICAgICAgaG9zcGl0YWxpemF0aW9ucywgaG9zcGl0YWxpemF0aW9uc19yZWdpb24pICU+JQ0KICBtdXRhdGUocG9wdWxhdGlvbiA9ICJhZHVsdCIpDQpgYGANCg0KKipDb21iaW5lIGFkdWx0IGFuZCBwZWRpYXRyaWMgaG9zcGl0YWxpemF0aW9ucyoqDQoNCmBgYHtyfQ0KaGhzX2RhdGFfcHJvYyA8LSByYmluZChoaHNfcGVkaWF0cmljX3Byb2Nlc3NlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgaGhzX2FkdWx0X3Byb2Nlc3NlZCkNCmBgYA0KDQoqKlN0YW5kYXJkaXplIEhvc3BpdGFsaXphdGlvbiBSYXRlcyoqDQoNCkhlcmUgd2Ugd2lsbCBzdGFuZGFyZGl6ZSBob3NwaXRhbGl6YXRpb25zIHBlciAxMDAsMDAwIGFkdWx0cy9jaGlsZHJlbiB0aHJvdWdob3V0IHRoZSBOYXRpb24gYW5kIGJ5IFJlZ2lvbg0KDQpgYGB7cn0NCnBvcF9hZHVsdF9uYXRpb24gPC0gY2Vuc3VzX2RhdGEgJT4lIA0KICBmaWx0ZXIoU3RhdGUgPT0gInVuaXRlZCBzdGF0ZXMiKSAlPiUgDQogIHNlbGVjdChQT1BFU1QxOFBMVVMyMDIwKSAlPiUgDQogIGFzLm51bWVyaWMoKQ0KDQpwb3BfcGVkaWF0cmljX25hdGlvbiA8LSBjZW5zdXNfZGF0YSAlPiUgDQogIGZpbHRlcihTdGF0ZSA9PSAidW5pdGVkIHN0YXRlcyIpICU+JSANCiAgc2VsZWN0KFBPUEVTVDE3VW5kZXIyMDIwKSAlPiUgDQogIGFzLm51bWVyaWMoKQ0KDQpyZWdpb25fZXN0aW1hdGVzIDwtIGhoc19kYXRhX3Byb2MgJT4lIA0KICB1bmdyb3VwKCkgJT4lDQogIGRpc3RpbmN0KFJlZ2lvbiwgUE9QRVNUMTdVbmRlcjIwMjAsIFBPUEVTVDE4UExVUzIwMjApICU+JQ0KICBncm91cF9ieShSZWdpb24pICU+JQ0KICBtdXRhdGUoUmVnaW9uX2NlbnN1c19wZWRpYXRyaWMgPSBzdW0oUE9QRVNUMTdVbmRlcjIwMjApLA0KICAgICAgICAgUmVnaW9uX2NlbnN1c19hZHVsdCA9IHN1bShQT1BFU1QxOFBMVVMyMDIwKSkgJT4lDQogIHNlbGVjdChSZWdpb24sIFJlZ2lvbl9jZW5zdXNfcGVkaWF0cmljLCBSZWdpb25fY2Vuc3VzX2FkdWx0KSAlPiUNCiAgZGlzdGluY3QoKQ0KDQoNCmhoc19kYXRhX3Byb2MgPC0gaGhzX2RhdGFfcHJvYyAlPiUNCiAgbGVmdF9qb2luKC4sIHJlZ2lvbl9lc3RpbWF0ZXMsIGJ5ID0gIlJlZ2lvbiIpICU+JQ0KICBtdXRhdGUoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMgPSBpZl9lbHNlKHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3BpdGFsaXphdGlvbnMvcG9wX3BlZGlhdHJpY19uYXRpb24qMTAwMDAwLA0KICAgICAgICAgaG9zcGl0YWxpemF0aW9ucy9wb3BfYWR1bHRfbmF0aW9uKjEwMDAwMCkpICU+JQ0KICBncm91cF9ieShjb2xsZWN0aW9uX3dlZWssIHBvcHVsYXRpb24sIFJlZ2lvbikgJT4lDQogIG11dGF0ZShob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24gPSBpZl9lbHNlKHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3BpdGFsaXphdGlvbnNfcmVnaW9uL1JlZ2lvbl9jZW5zdXNfcGVkaWF0cmljKjEwMDAwMCwNCiAgICAgICAgIGhvc3BpdGFsaXphdGlvbnNfcmVnaW9uL1JlZ2lvbl9jZW5zdXNfYWR1bHQqMTAwMDAwKSkgJT4lDQogIHVuZ3JvdXAoKQ0KYGBgDQoNCiMjICoqU3RhdGlzdGljcyoqDQoNCioqVG90YWwgTnVtYmVyIG9mIFBlZGlhdHJpYyBhbmQgQWR1bHQgSG9zcGl0YWxpemF0aW9ucyBvdmVyIGRhdGEgY29sbGVjdGlvbioqDQoNCmBgYHtyfQ0KaG9zcF9jb3VudHMgPC0gaGhzX2RhdGFfcHJvYyAlPiUgDQogIGRpc3RpbmN0KHBvcHVsYXRpb24sIGNvbGxlY3Rpb25fd2VlaywgaG9zcGl0YWxpemF0aW9ucykgJT4lDQogIGdyb3VwX2J5KHBvcHVsYXRpb24pICU+JQ0KICBtdXRhdGUoYFRvdGFsIEhvc3BpdGFsaXphdGlvbnNgID0gc3VtKGhvc3BpdGFsaXphdGlvbnMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGRpc3RpbmN0KHBvcHVsYXRpb24sIGBUb3RhbCBIb3NwaXRhbGl6YXRpb25zYCkNCg0KZGF0YXRhYmxlKGhvc3BfY291bnRzKQ0KYGBgDQoNCioqTmF0aW9uYWwgTWVkaWFuIFdlZWtseSBIb3NwaXRhbGl6YXRpb24gUmF0ZSoqDQoNCmBgYHtyfQ0KaG9zcF9jb3VudHNfbWVkIDwtIGhoc19kYXRhX3Byb2MgJT4lIA0KICBncm91cF9ieShwb3B1bGF0aW9uKSAlPiUNCiAgZGlzdGluY3QocG9wdWxhdGlvbiwgY29sbGVjdGlvbl93ZWVrLCBob3NwaXRhbGl6YXRpb25zKSAlPiUNCiAgbXV0YXRlKFExID0gcm91bmQocXVhbnRpbGUoaG9zcGl0YWxpemF0aW9ucywgMC4yNSksIDEpLA0KICAgICAgICAgYE1lZGlhbiBXZWVrbHkgSG9zcGl0YWxpemF0aW9uc2AgPSBtZWRpYW4oaG9zcGl0YWxpemF0aW9ucywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgIFEzID0gcm91bmQocXVhbnRpbGUoaG9zcGl0YWxpemF0aW9ucywgMC43NSksIDEpLCkgJT4lDQogIGRpc3RpbmN0KHBvcHVsYXRpb24sIFExLCBgTWVkaWFuIFdlZWtseSBIb3NwaXRhbGl6YXRpb25zYCwgUTMpDQoNCmRhdGF0YWJsZShob3NwX2NvdW50c19tZWQpDQpgYGANCg0KKipOYXRpb25hbCBNZWRpYW4gSG9zcGl0YWxpemF0aW9uIFJhdGUgcGVyIDEwMCwwMDAgQ2hpbGRyZW4vQWR1bHRzKioNCg0KYGBge3J9DQpuYXRpb25hbF9zdGF0cyA8LSBoaHNfZGF0YV9wcm9jICU+JSANCiAgZGlzdGluY3QocG9wdWxhdGlvbiwgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMpICU+JQ0KICBncm91cF9ieShwb3B1bGF0aW9uKSAlPiUNCiAgbXV0YXRlKFExID0gcm91bmQocXVhbnRpbGUoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMsIDAuMjUpLCAxKSwNCiAgICAgICAgIE1lZGlhbiA9IHJvdW5kKG1lZGlhbihob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF91cyksIDEpLA0KICAgICAgICAgUTMgPSByb3VuZChxdWFudGlsZShob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF91cywgMC43NSksIDEpKSAlPiUNCiAgc2VsZWN0KC1ob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF91cykgJT4lDQogIGRpc3RpbmN0KCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQoNCmRhdGF0YWJsZShuYXRpb25hbF9zdGF0cykNCmBgYA0KDQojIyAqKk5hdGlvbmFsIEhvc3BpdGFsaXphdGlvbiBUcmVuZHMqKg0KDQpgYGB7cn0NCmdncGxvdChoaHNfZGF0YV9wcm9jICU+JSANCiAgICAgICAgIG11dGF0ZShob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF91cyA9IGlmX2Vsc2UocG9wdWxhdGlvbiA9PSAicGVkaWF0cmljIiwgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMqMTAsIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3VzKSkgJT4lIA0KICAgICAgIGRpc3RpbmN0KGNvbGxlY3Rpb25fd2VlaywgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMsIHBvcHVsYXRpb24pLA0KICAgICAgIGFlcyh4ID0gY29sbGVjdGlvbl93ZWVrLCB5ID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMsIGNvbG9yID0gcG9wdWxhdGlvbikpICsgDQogIGdlb21fbGluZSgpICsgDQogIGdlb21fcG9pbnQoKSArDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIsIGxhYmVscyA9IGMoIkFkdWx0IiwgIkNoaWxkIiksIG5hbWUgPSAiIikgKyANCiAgeWxhYigiSG9zcGl0YWxpemF0aW9ucyBwZXIgMTAwSyBBZHVsdHMiKSArIA0KICB4bGFiKCIiKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWItJWQiLCBkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHNlYy5heGlzID0gc2VjX2F4aXMofiAuLzEwLCBuYW1lID0gIkhvc3BpdGFsaXphdGlvbnMgcGVyIDEwMEsgQ2hpbGRyZW4iKSkgKyANCiAgdGhlbWVfYncoKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KCIiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNSksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwNCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMywgY29sb3IgPSAiIzFCOUU3NyIsIG1hcmdpbj1tYXJnaW4oMCwxMCwwLDApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkubGVmdCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCAgc2l6ZSA9IDEzLCBjb2xvciA9ICIjMUI5RTc3IiksDQogICAgICAgIGF4aXMudGl0bGUueS5yaWdodCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTMsIGNvbG9yPScjRDk1RjAyJywgbWFyZ2luPW1hcmdpbigwLDAsMCwxMCkpLA0KICAgICAgICBheGlzLnRleHQueS5yaWdodCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTMsIGNvbG9yPScjRDk1RjAyJykpDQpgYGANCg0KIyMjICoqTmF0aW9uYWwgSG9zcGl0YWxpemF0aW9ucyBSYXRlcyoqDQoNClJhdGVzIGFyZSBleHByZXNzZWQgYXMgcGVyIDEwMCwwMDAgYWR1bHRzIG9yIGNoaWxkcmVuDQoNCmBgYHtyfQ0KbmF0X3RhYmxlIDwtIGhoc19kYXRhX3Byb2MgJT4lIA0KICBkaXN0aW5jdChjb2xsZWN0aW9uX3dlZWssIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3VzLCBwb3B1bGF0aW9uKSAlPiUgDQogIG11dGF0ZShob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF91cyA9IHJvdW5kKGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3VzLCAyKSkgJT4lDQogIGFycmFuZ2UoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHBvcHVsYXRpb24sIHZhbHVlc19mcm9tID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMpICU+JQ0KICByZW5hbWUoIldlZWsiID0gY29sbGVjdGlvbl93ZWVrLCANCiAgICAgICAgIGBDaGlsZCBIb3NwaXRhbGl6YXRpb25zYCA9IHBlZGlhdHJpYywgDQogICAgICAgICBgQWR1bHQgSG9zcGl0YWxpemF0aW9uc2AgPSBhZHVsdCkNCg0KbG93VmFsdWUgPSAiI2ZmZmZmZiINCmN1c3RvbU9yYW5nZSA9ICIjRDk1RjAyIg0KY3VzdG9tR3JlZW4gPSAiIzFCOUU3NyINCg0KYXMuZGF0YXRhYmxlKA0KICBmb3JtYXR0YWJsZShuYXRfdGFibGUsIGFsaWduID0gYygnYycsICdjJywnYycpLCAgbGlzdCgNCiAgICAgICAgICAgIGBJbmRpY2F0b3IgTmFtZWAgPSBmb3JtYXR0ZXIoInNwYW4iLCBzdHlsZSA9IH4gc3R5bGUoY29sb3IgPSAiZ3JleSIsZm9udC53ZWlnaHQgPSAiYm9sZCIpKSwNCiAgICAgICAgICAgIGBDaGlsZCBIb3NwaXRhbGl6YXRpb25zYD0gY29sb3JfdGlsZShsb3dWYWx1ZSwgY3VzdG9tT3JhbmdlKSwNCiAgICAgICAgICAgIGBBZHVsdCBIb3NwaXRhbGl6YXRpb25zYD0gY29sb3JfdGlsZShsb3dWYWx1ZSwgY3VzdG9tR3JlZW4pKSkNCiAgKQ0KYGBgDQoNCiMjICoqUmVnaW9uYWwgSG9zcGl0YWxpemF0aW9uIFRyZW5kcyoqDQoNCioqUmVnaW9uYWwgTWVkaWFuIEhvc3BpdGFsaXphdGlvbiBSYXRlcyBwZXIgMTAwLDAwMCBDaGlsZHJlbi9BZHVsdHMqKg0KDQpgYGB7cn0NCnJlZ2lvbmFsX3N0YXRzIDwtIGhoc19kYXRhX3Byb2MgJT4lIA0KICBkaXN0aW5jdChwb3B1bGF0aW9uLCBSZWdpb24sIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgJT4lDQogIGdyb3VwX2J5KHBvcHVsYXRpb24sIFJlZ2lvbikgJT4lDQogIG11dGF0ZShRMSA9IHJvdW5kKHF1YW50aWxlKGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiwgMC4yNSksIDEpLA0KICAgICAgICAgTWVkaWFuID0gcm91bmQobWVkaWFuKGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiksIDEpLA0KICAgICAgICAgUTMgPSByb3VuZChxdWFudGlsZShob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24sIDAuNzUpLCAxKSkgJT4lDQogIHNlbGVjdCgtaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSAlPiUNCiAgZGlzdGluY3QoKSAlPiUNCiAgYXJyYW5nZShSZWdpb24pICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KDQpkYXRhdGFibGUocmVnaW9uYWxfc3RhdHMpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoaGhzX2RhdGFfcHJvYyAlPiUNCiAgICAgICAgIG11dGF0ZShob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24gPSBpZl9lbHNlKHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbioxMCwgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSkgJT4lDQogICAgICAgICBkaXN0aW5jdChjb2xsZWN0aW9uX3dlZWssIFJlZ2lvbiwgcG9wdWxhdGlvbiwgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSwNCiAgICAgICBhZXMoeCA9IGNvbGxlY3Rpb25fd2VlaywgeSA9IGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiwgY29sb3IgPSBwb3B1bGF0aW9uKSkgKyANCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9saW5lKGFscGhhPTAuOSkgKyANCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IkRhcmsyIiwgbGFiZWxzID0gYygiQWR1bHQiLCAiQ2hpbGQiKSwgbmFtZSA9ICIiKSArIA0KICB5bGFiKCJIb3NwaXRhbGl6YXRpb25zIHBlciAxMDBrIEFkdWx0cyIpICsgDQogIHhsYWIoIiIpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlYiIsIGRhdGVfYnJlYWtzID0gIjEgbW9udGgiKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4vMTAsIG5hbWUgPSAiSG9zcGl0YWxpemF0aW9ucyBwZXIgMTAwayBDaGlsZHJlbiIpKSArIA0KICB0aGVtZV9idygpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgiIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTUpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsDQogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTMsIGNvbG9yID0gIiMxQjlFNzciLCBtYXJnaW49bWFyZ2luKDAsMTAsMCwwKSksDQogICAgICAgIGF4aXMudGV4dC55LmxlZnQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgIHNpemUgPSAxMywgY29sb3IgPSAiIzFCOUU3NyIpLA0KICAgICAgICBheGlzLnRpdGxlLnkucmlnaHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEzLCBjb2xvcj0nI0Q5NUYwMicsIG1hcmdpbj1tYXJnaW4oMCwwLDAsMTApKSwNCiAgICAgICAgYXhpcy50ZXh0LnkucmlnaHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEzLCBjb2xvcj0nI0Q5NUYwMicpKSArIA0KICBmYWNldF93cmFwKH5SZWdpb24sIHNjYWxlcyA9ICJmaXhlZCIpICsgDQogIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKQ0KYGBgDQoNCiMjIyAqKkhvc3BpdGFsaXphdGlvbnMgUmF0ZXMgYnkgUmVnaW9uKioNCg0KUmF0ZXMgYXJlIGV4cHJlc3NlZCBhcyBwZXIgMTAwLDAwMCBhZHVsdHMgb3IgY2hpbGRyZW4NCg0KYGBge3J9DQpsb3dWYWx1ZSA9ICIjZmZmZmZmIg0KY3VzdG9tT3JhbmdlID0gIiNEOTVGMDIiDQpjdXN0b21HcmVlbiA9ICIjMUI5RTc3Ig0KDQpyZWdpb25fdGFibGUgPC0gaGhzX2RhdGFfcHJvYyAlPiUgDQogIGRpc3RpbmN0KGNvbGxlY3Rpb25fd2VlaywgUmVnaW9uLCBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24sIHBvcHVsYXRpb24pICU+JSANCiAgbXV0YXRlKGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiA9IHJvdW5kKGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiwgMikpICU+JQ0KICBhcnJhbmdlKGNvbGxlY3Rpb25fd2VlaykgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBwb3B1bGF0aW9uLCB2YWx1ZXNfZnJvbSA9IGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgJT4lDQogIHJlbmFtZSgiV2VlayIgPSBjb2xsZWN0aW9uX3dlZWssIA0KICAgICAgICAgYENoaWxkIEhvc3BpdGFsaXphdGlvbnNgID0gcGVkaWF0cmljLCANCiAgICAgICAgIGBBZHVsdCBIb3NwaXRhbGl6YXRpb25zYCA9IGFkdWx0KQ0KYGBgDQoNCg0KIyMjICoqTWlkd2VzdCoqDQoNCmBgYHtyfQ0KYXMuZGF0YXRhYmxlKA0KICBmb3JtYXR0YWJsZShyZWdpb25fdGFibGUgJT4lIGZpbHRlcihSZWdpb24gPT0gIk1pZHdlc3QiKSAlPiUgc2VsZWN0KC1SZWdpb24pLCBhbGlnbiA9IGMoJ2MnLCAnYycsJ2MnKSwgIGxpc3QoDQogICAgICAgICAgICBgSW5kaWNhdG9yIE5hbWVgID0gZm9ybWF0dGVyKCJzcGFuIiwgc3R5bGUgPSB+IHN0eWxlKGNvbG9yID0gImdyZXkiLGZvbnQud2VpZ2h0ID0gImJvbGQiKSksDQogICAgICAgICAgICBgQ2hpbGQgSG9zcGl0YWxpemF0aW9uc2A9IGNvbG9yX3RpbGUobG93VmFsdWUsIGN1c3RvbU9yYW5nZSksDQogICAgICAgICAgICBgQWR1bHQgSG9zcGl0YWxpemF0aW9uc2A9IGNvbG9yX3RpbGUobG93VmFsdWUsIGN1c3RvbUdyZWVuKSkpDQogICkNCmBgYA0KDQojIyMgKipOb3J0aGVhc3QqKg0KDQpgYGB7cn0NCmFzLmRhdGF0YWJsZSgNCiAgZm9ybWF0dGFibGUocmVnaW9uX3RhYmxlICU+JSBmaWx0ZXIoUmVnaW9uID09ICJOb3J0aGVhc3QiKSAlPiUgc2VsZWN0KC1SZWdpb24pLCBhbGlnbiA9IGMoJ2MnLCAnYycsJ2MnKSwgIGxpc3QoDQogICAgICAgICAgICBgSW5kaWNhdG9yIE5hbWVgID0gZm9ybWF0dGVyKCJzcGFuIiwgc3R5bGUgPSB+IHN0eWxlKGNvbG9yID0gImdyZXkiLGZvbnQud2VpZ2h0ID0gImJvbGQiKSksDQogICAgICAgICAgICBgQ2hpbGQgSG9zcGl0YWxpemF0aW9uc2A9IGNvbG9yX3RpbGUobG93VmFsdWUsIGN1c3RvbU9yYW5nZSksDQogICAgICAgICAgICBgQWR1bHQgSG9zcGl0YWxpemF0aW9uc2A9IGNvbG9yX3RpbGUobG93VmFsdWUsIGN1c3RvbUdyZWVuKSkpDQogICkNCmBgYA0KDQojIyMgKipTb3V0aCoqDQoNCmBgYHtyfQ0KYXMuZGF0YXRhYmxlKA0KICBmb3JtYXR0YWJsZShyZWdpb25fdGFibGUgJT4lIGZpbHRlcihSZWdpb24gPT0gIlNvdXRoIikgJT4lIHNlbGVjdCgtUmVnaW9uKSwgYWxpZ24gPSBjKCdjJywgJ2MnLCdjJyksICBsaXN0KA0KICAgICAgICAgICAgYEluZGljYXRvciBOYW1lYCA9IGZvcm1hdHRlcigic3BhbiIsIHN0eWxlID0gfiBzdHlsZShjb2xvciA9ICJncmV5Iixmb250LndlaWdodCA9ICJib2xkIikpLA0KICAgICAgICAgICAgYENoaWxkIEhvc3BpdGFsaXphdGlvbnNgPSBjb2xvcl90aWxlKGxvd1ZhbHVlLCBjdXN0b21PcmFuZ2UpLA0KICAgICAgICAgICAgYEFkdWx0IEhvc3BpdGFsaXphdGlvbnNgPSBjb2xvcl90aWxlKGxvd1ZhbHVlLCBjdXN0b21HcmVlbikpKQ0KICApDQpgYGANCg0KIyMjICoqV2VzdCoqDQoNCmBgYHtyfQ0KYXMuZGF0YXRhYmxlKA0KICBmb3JtYXR0YWJsZShyZWdpb25fdGFibGUgJT4lIGZpbHRlcihSZWdpb24gPT0gIldlc3QiKSAlPiUgc2VsZWN0KC1SZWdpb24pLCBhbGlnbiA9IGMoJ2MnLCAnYycsJ2MnKSwgIGxpc3QoDQogICAgICAgICAgICBgSW5kaWNhdG9yIE5hbWVgID0gZm9ybWF0dGVyKCJzcGFuIiwgc3R5bGUgPSB+IHN0eWxlKGNvbG9yID0gImdyZXkiLGZvbnQud2VpZ2h0ID0gImJvbGQiKSksDQogICAgICAgICAgICBgQ2hpbGQgSG9zcGl0YWxpemF0aW9uc2A9IGNvbG9yX3RpbGUobG93VmFsdWUsIGN1c3RvbU9yYW5nZSksDQogICAgICAgICAgICBgQWR1bHQgSG9zcGl0YWxpemF0aW9uc2A9IGNvbG9yX3RpbGUobG93VmFsdWUsIGN1c3RvbUdyZWVuKSkpDQogICkNCmBgYA0KDQojIyAqKkNoYW5nZSBQb2ludCBBbmFseXNpcyoqDQoNCmBgYHtyfQ0Kc291cmNlKCJSL2NoYW5nZV9wb2ludF9mdW5jdGlvbi5SIikNCmBgYA0KDQpgYGB7cn0NCiMjIG1vZGlmeSB0aGUgSEhTIGRhdGFzdA0KZGF0ZV93ZWVrX2lkIDwtIGhoc19kYXRhX3Byb2MgJT4lIGRpc3RpbmN0KGNvbGxlY3Rpb25fd2VlaykgJT4lIGFycmFuZ2UoY29sbGVjdGlvbl93ZWVrKQ0KZGF0ZV93ZWVrX2lkJGRhdGVfaWQgPC0gc2VxLmludChucm93KGRhdGVfd2Vla19pZCkpDQoNCmhoc19kYXRhX3Byb2MgPC0gaGhzX2RhdGFfcHJvYyAlPiUgbGVmdF9qb2luKC4sIGRhdGVfd2Vla19pZCwgYnkgPSAiY29sbGVjdGlvbl93ZWVrIikNCmBgYA0KDQojIyMgTmF0aW9uYWwgSG9zcGl0YWxpemF0aW9ucyBDaGFuZ2UgUG9pbnQgDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTAxKQ0KYGBgDQoNCg0KYGBge3J9DQojIyBhZHVsdCBob3Nwcw0KYWR1bHRfaG9zcHMgPC0gaGhzX2RhdGFfcHJvYyAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGZpbHRlcihwb3B1bGF0aW9uID09ICJhZHVsdCIpICU+JQ0KICBzZWxlY3QoY29sbGVjdGlvbl93ZWVrLCBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF91cykgJT4lIA0KICBhcnJhbmdlKGNvbGxlY3Rpb25fd2VlaykgJT4lDQogIGRpc3RpbmN0KGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3VzKQ0KDQphZHVsdF9ob3Nwc19tYXQgPC0gdChkYXRhLm1hdHJpeChhZHVsdF9ob3NwcykpDQpyb3cubmFtZXMoYWR1bHRfaG9zcHNfbWF0KSA8LSBOVUxMDQoNCiMjIHBlZGlhdHJpYyBob3Nwcw0KcGVkX2hvc3BzIDwtIGhoc19kYXRhX3Byb2MgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBmaWx0ZXIocG9wdWxhdGlvbiA9PSAicGVkaWF0cmljIikgJT4lDQogIHNlbGVjdChjb2xsZWN0aW9uX3dlZWssIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3VzKSAlPiUgDQogIGFycmFuZ2UoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgZGlzdGluY3QoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMpDQoNCnBlZF9ob3Nwc19tYXQgPC0gdChkYXRhLm1hdHJpeChwZWRfaG9zcHMpKQ0Kcm93Lm5hbWVzKHBlZF9ob3Nwc19tYXQpIDwtIE5VTEwNCg0KDQpjcF9uYXRfYWR1bHQgPC0gY2hhbmdlX3BvaW50X3Rlc3QoYWR1bHRfaG9zcHNfbWF0LCB3ID0gcmVwKDEgLyBucm93KGFkdWx0X2hvc3BzX21hdCksIG5yb3coYWR1bHRfaG9zcHNfbWF0KSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9yYW5nZSA9IDI6KG5jb2woYWR1bHRfaG9zcHNfbWF0KSAtIDIpLCBib290X251bSA9IDEwMDAwKQ0KDQoNCmNwX25hdF9wZWQgPC0gY2hhbmdlX3BvaW50X3Rlc3QocGVkX2hvc3BzX21hdCwgdyA9IHJlcCgxIC8gbnJvdyhwZWRfaG9zcHNfbWF0KSwgbnJvdyhwZWRfaG9zcHNfbWF0KSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9yYW5nZSA9IDI6KG5jb2wocGVkX2hvc3BzX21hdCkgLSAyKSwgYm9vdF9udW0gPSAxMDAwMCkNCmBgYA0KDQojIyMgSG9zcGl0YWxpemF0aW9ucyBDaGFuZ2UgUG9pbnQgYnkgUmVnaW9uDQoNCioqTWlkd2VzdCoqDQoNCmBgYHtyfQ0KbWlkd2VzdF9hZHVsdF9ob3NwcyA8LSBoaHNfZGF0YV9wcm9jICU+JSANCiAgZGlzdGluY3QoY29sbGVjdGlvbl93ZWVrLCBSZWdpb24sIHBvcHVsYXRpb24sIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgJT4lIA0KICBhcnJhbmdlKGNvbGxlY3Rpb25fd2VlaykgJT4lDQogIGZpbHRlcihwb3B1bGF0aW9uID09ICJhZHVsdCIgJiBSZWdpb24gPT0gIk1pZHdlc3QiKSAlPiUNCiAgZGlzdGluY3QoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSANCg0KbWlkd2VzdF9hZHVsdF9ob3Nwc19tYXQgPC0gdChkYXRhLm1hdHJpeChtaWR3ZXN0X2FkdWx0X2hvc3BzKSkNCnJvdy5uYW1lcyhtaWR3ZXN0X2FkdWx0X2hvc3BzX21hdCkgPC0gTlVMTA0KDQpjcF9yZWdfbWlkd2VzdF9hZHVsdCA8LSBjaGFuZ2VfcG9pbnRfdGVzdChtaWR3ZXN0X2FkdWx0X2hvc3BzX21hdCwgdyA9IHJlcCgxIC8gbnJvdyhtaWR3ZXN0X2FkdWx0X2hvc3BzX21hdCksIG5yb3cobWlkd2VzdF9hZHVsdF9ob3Nwc19tYXQpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3JhbmdlID0gMjoobmNvbChtaWR3ZXN0X2FkdWx0X2hvc3BzX21hdCkgLSAyKSwgYm9vdF9udW0gPSAxMDAwMCkNCg0KbWlkd2VzdF9wZWRfaG9zcHMgPC0gaGhzX2RhdGFfcHJvYyAlPiUNCiAgZGlzdGluY3QoY29sbGVjdGlvbl93ZWVrLCBSZWdpb24sIHBvcHVsYXRpb24sIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgJT4lIA0KICBhcnJhbmdlKGNvbGxlY3Rpb25fd2VlaykgJT4lDQogIGZpbHRlcihwb3B1bGF0aW9uID09ICJwZWRpYXRyaWMiICYgUmVnaW9uID09ICJNaWR3ZXN0IikgJT4lDQogIGRpc3RpbmN0KGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgDQoNCm1pZHdlc3RfcGVkX2hvc3BzX21hdCA8LSB0KGRhdGEubWF0cml4KG1pZHdlc3RfcGVkX2hvc3BzKSkNCnJvdy5uYW1lcyhtaWR3ZXN0X3BlZF9ob3Nwc19tYXQpIDwtIE5VTEwNCg0KDQpjcF9yZWdfbWlkd2VzdF9wZWQgPC0gY2hhbmdlX3BvaW50X3Rlc3QobWlkd2VzdF9wZWRfaG9zcHNfbWF0LCB3ID0gcmVwKDEgLyBucm93KG1pZHdlc3RfcGVkX2hvc3BzX21hdCksIG5yb3cobWlkd2VzdF9wZWRfaG9zcHNfbWF0KSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9yYW5nZSA9IDI6KG5jb2wobWlkd2VzdF9wZWRfaG9zcHNfbWF0KSAtIDIpLCBib290X251bSA9IDEwMDAwKQ0KYGBgDQoNCioqTm9ydGhlYXN0KioNCg0KYGBge3J9DQpub3J0aGVhc3RfYWR1bHRfaG9zcHMgPC0gaGhzX2RhdGFfcHJvYyAlPiUgDQogIGRpc3RpbmN0KGNvbGxlY3Rpb25fd2VlaywgUmVnaW9uLCBwb3B1bGF0aW9uLCBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pICU+JSANCiAgYXJyYW5nZShjb2xsZWN0aW9uX3dlZWspICU+JQ0KICBmaWx0ZXIocG9wdWxhdGlvbiA9PSAiYWR1bHQiICYgUmVnaW9uID09ICJOb3J0aGVhc3QiKSAlPiUNCiAgZGlzdGluY3QoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSANCg0Kbm9ydGhlYXN0X2FkdWx0X2hvc3BzX21hdCA8LSB0KGRhdGEubWF0cml4KG5vcnRoZWFzdF9hZHVsdF9ob3NwcykpDQpyb3cubmFtZXMobm9ydGhlYXN0X2FkdWx0X2hvc3BzX21hdCkgPC0gTlVMTA0KDQpjcF9yZWdfbm9ydGhlYXN0X2FkdWx0IDwtY2hhbmdlX3BvaW50X3Rlc3Qobm9ydGhlYXN0X2FkdWx0X2hvc3BzX21hdCwgdyA9IHJlcCgxIC8gbnJvdyhub3J0aGVhc3RfYWR1bHRfaG9zcHNfbWF0KSwgbnJvdyhub3J0aGVhc3RfYWR1bHRfaG9zcHNfbWF0KSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9yYW5nZSA9IDI6KG5jb2wobm9ydGhlYXN0X2FkdWx0X2hvc3BzX21hdCkgLSAyKSwgYm9vdF9udW0gPSAxMDAwMCkNCg0Kbm9ydGhlYXN0X3BlZF9ob3NwcyA8LSBoaHNfZGF0YV9wcm9jICU+JQ0KICBkaXN0aW5jdChjb2xsZWN0aW9uX3dlZWssIFJlZ2lvbiwgcG9wdWxhdGlvbiwgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSAlPiUgDQogIGFycmFuZ2UoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgZmlsdGVyKHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIgJiBSZWdpb24gPT0gIk5vcnRoZWFzdCIpICU+JQ0KICBkaXN0aW5jdChob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pIA0KDQpub3J0aGVhc3RfcGVkX2hvc3BzX21hdCA8LSB0KGRhdGEubWF0cml4KG5vcnRoZWFzdF9wZWRfaG9zcHMpKQ0Kcm93Lm5hbWVzKG5vcnRoZWFzdF9wZWRfaG9zcHNfbWF0KSA8LSBOVUxMDQoNCmNwX3JlZ19ub3J0aGVhc3RfcGVkIDwtIGNoYW5nZV9wb2ludF90ZXN0KG5vcnRoZWFzdF9wZWRfaG9zcHNfbWF0LCB3ID0gcmVwKDEgLyBucm93KG5vcnRoZWFzdF9wZWRfaG9zcHNfbWF0KSwgbnJvdyhub3J0aGVhc3RfcGVkX2hvc3BzX21hdCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfcmFuZ2UgPSAyOihuY29sKG5vcnRoZWFzdF9wZWRfaG9zcHNfbWF0KSAtIDIpLCBib290X251bSA9IDEwMDAwKQ0KYGBgDQoNCioqU291dGgqKg0KDQpgYGB7cn0NCnNvdXRoX2FkdWx0X2hvc3BzIDwtIGhoc19kYXRhX3Byb2MgJT4lIA0KICBkaXN0aW5jdChjb2xsZWN0aW9uX3dlZWssIFJlZ2lvbiwgcG9wdWxhdGlvbiwgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSAlPiUgDQogIGFycmFuZ2UoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgZmlsdGVyKHBvcHVsYXRpb24gPT0gImFkdWx0IiAmIFJlZ2lvbiA9PSAiU291dGgiKSAlPiUNCiAgZGlzdGluY3QoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSANCg0Kc291dGhfYWR1bHRfaG9zcHNfbWF0IDwtIHQoZGF0YS5tYXRyaXgoc291dGhfYWR1bHRfaG9zcHMpKQ0Kcm93Lm5hbWVzKHNvdXRoX2FkdWx0X2hvc3BzX21hdCkgPC0gTlVMTA0KDQpjcF9yZWdfc291dGhfYWR1bHQgPC1jaGFuZ2VfcG9pbnRfdGVzdChzb3V0aF9hZHVsdF9ob3Nwc19tYXQsIHcgPSByZXAoMSAvIG5yb3coc291dGhfYWR1bHRfaG9zcHNfbWF0KSwgbnJvdyhzb3V0aF9hZHVsdF9ob3Nwc19tYXQpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3JhbmdlID0gMjoobmNvbChzb3V0aF9hZHVsdF9ob3Nwc19tYXQpIC0gMiksIGJvb3RfbnVtID0gMTAwMDApDQoNCnNvdXRoX3BlZF9ob3NwcyA8LSBoaHNfZGF0YV9wcm9jICU+JQ0KICBkaXN0aW5jdChjb2xsZWN0aW9uX3dlZWssIFJlZ2lvbiwgcG9wdWxhdGlvbiwgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSAlPiUgDQogIGFycmFuZ2UoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgZmlsdGVyKHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIgJiBSZWdpb24gPT0gIlNvdXRoIikgJT4lDQogIGRpc3RpbmN0KGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgDQoNCnNvdXRoX3BlZF9ob3Nwc19tYXQgPC0gdChkYXRhLm1hdHJpeChzb3V0aF9wZWRfaG9zcHMpKQ0Kcm93Lm5hbWVzKHNvdXRoX3BlZF9ob3Nwc19tYXQpIDwtIE5VTEwNCg0KY3BfcmVnX3NvdXRoX3BlZCA8LSBjaGFuZ2VfcG9pbnRfdGVzdChzb3V0aF9wZWRfaG9zcHNfbWF0LCB3ID0gcmVwKDEgLyBucm93KHNvdXRoX3BlZF9ob3Nwc19tYXQpLCBucm93KHNvdXRoX3BlZF9ob3Nwc19tYXQpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3JhbmdlID0gMjoobmNvbChzb3V0aF9wZWRfaG9zcHNfbWF0KSAtIDIpLCBib290X251bSA9IDEwMDAwKQ0KYGBgDQoNCioqV2VzdCoqDQoNCmBgYHtyfQ0Kd2VzdF9hZHVsdF9ob3NwcyA8LSBoaHNfZGF0YV9wcm9jICU+JSANCiAgZGlzdGluY3QoY29sbGVjdGlvbl93ZWVrLCBSZWdpb24sIHBvcHVsYXRpb24sIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgJT4lIA0KICBhcnJhbmdlKGNvbGxlY3Rpb25fd2VlaykgJT4lDQogIGZpbHRlcihwb3B1bGF0aW9uID09ICJhZHVsdCIgJiBSZWdpb24gPT0gIldlc3QiKSAlPiUNCiAgZGlzdGluY3QoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSANCg0Kd2VzdF9hZHVsdF9ob3Nwc19tYXQgPC0gdChkYXRhLm1hdHJpeCh3ZXN0X2FkdWx0X2hvc3BzKSkNCnJvdy5uYW1lcyh3ZXN0X2FkdWx0X2hvc3BzX21hdCkgPC0gTlVMTA0KDQpjcF9yZWdfd2VzdF9hZHVsdCA8LSBjaGFuZ2VfcG9pbnRfdGVzdCh3ZXN0X2FkdWx0X2hvc3BzX21hdCwgdyA9IHJlcCgxIC8gbnJvdyh3ZXN0X2FkdWx0X2hvc3BzX21hdCksIG5yb3cod2VzdF9hZHVsdF9ob3Nwc19tYXQpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3JhbmdlID0gMjoobmNvbCh3ZXN0X2FkdWx0X2hvc3BzX21hdCkgLSAyKSwgYm9vdF9udW0gPSAxMDAwMCkNCg0Kd2VzdF9wZWRfaG9zcHMgPC0gaGhzX2RhdGFfcHJvYyAlPiUNCiAgZGlzdGluY3QoY29sbGVjdGlvbl93ZWVrLCBSZWdpb24sIHBvcHVsYXRpb24sIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgJT4lIA0KICBhcnJhbmdlKGNvbGxlY3Rpb25fd2VlaykgJT4lDQogIGZpbHRlcihwb3B1bGF0aW9uID09ICJwZWRpYXRyaWMiICYgUmVnaW9uID09ICJXZXN0IikgJT4lDQogIGRpc3RpbmN0KGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgDQoNCndlc3RfcGVkX2hvc3BzX21hdCA8LSB0KGRhdGEubWF0cml4KHdlc3RfcGVkX2hvc3BzKSkNCnJvdy5uYW1lcyh3ZXN0X3BlZF9ob3Nwc19tYXQpIDwtIE5VTEwNCg0KY3BfcmVnX3dlc3RfcGVkIDwtIGNoYW5nZV9wb2ludF90ZXN0KHdlc3RfcGVkX2hvc3BzX21hdCwgdyA9IHJlcCgxIC8gbnJvdyh3ZXN0X3BlZF9ob3Nwc19tYXQpLCBucm93KHdlc3RfcGVkX2hvc3BzX21hdCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfcmFuZ2UgPSAyOihuY29sKHdlc3RfcGVkX2hvc3BzX21hdCkgLSAyKSwgYm9vdF9udW0gPSAxMDAwMCkNCmBgYA0KDQojIyMgQ2hhbmdlIFBvaW50IFJlc3VsdHMNCg0KKipOYXRpb25hbCBMZXZlbCoqDQoNCmBgYHtyfQ0KY3BfbmF0X2FkdWx0IDwtIHVubGlzdChjcF9uYXRfYWR1bHQpICU+JSANCiAgZGF0YS5mcmFtZSgpDQpjb2xuYW1lcyhjcF9uYXRfYWR1bHQpWzFdIDwtICJOYXRpb25hbCBBZHVsdCBIb3NwaXRhbGl6YXRpb25zIg0KDQpjcF9uYXRfcGVkIDwtIHVubGlzdChjcF9uYXRfcGVkKSAlPiUgDQogIGRhdGEuZnJhbWUoKQ0KY29sbmFtZXMoY3BfbmF0X3BlZClbMV0gPC0gIk5hdGlvbmFsIFBlZGlhdHJpYyBIb3NwaXRhbGl6YXRpb25zIg0KDQpjcF9uYXRfcmVzdWx0cyA8LSBjYmluZChjcF9uYXRfYWR1bHQsIGNwX25hdF9wZWQpICU+JSB0KCkgJT4lIGRhdGEuZnJhbWUoKQ0KDQpjcF9uYXRfcmVzdWx0cyA8LSBjcF9uYXRfcmVzdWx0cyAlPiUNCiAgbXV0YXRlKHAudmFsdWUgPSByb3VuZChwLnZhbHVlLDQpLA0KICAgICAgICAgc3RhdCA9IHJvdW5kKHN0YXQsMSkpICU+JQ0KICB0KCkNCg0Kcm93bmFtZXMoY3BfbmF0X3Jlc3VsdHMpIDwtIGMoIkNoYW5nZSBQb2ludCBXZWVrIiwgIlAtdmFsdWUiLCAiRi1TdGF0IikNCg0KZGF0YXRhYmxlKGNwX25hdF9yZXN1bHRzKQ0KYGBgDQoNCioqUmVnaW9uYWwgTGV2ZWwqKg0KDQpgYGB7cn0NCmNwX3JlZ19taWR3ZXN0X2FkdWx0IDwtIHVubGlzdChjcF9yZWdfbWlkd2VzdF9hZHVsdCkgJT4lIA0KICBkYXRhLmZyYW1lKCkNCmNvbG5hbWVzKGNwX3JlZ19taWR3ZXN0X2FkdWx0KVsxXSA8LSAiTWlkd2VzdCBBZHVsdCINCg0KY3BfcmVnX21pZHdlc3RfcGVkIDwtIHVubGlzdChjcF9yZWdfbWlkd2VzdF9wZWQpICU+JSANCiAgZGF0YS5mcmFtZSgpDQpjb2xuYW1lcyhjcF9yZWdfbWlkd2VzdF9wZWQpWzFdIDwtICJNaWR3ZXN0IFBlZGlhdHJpYyINCg0KY3BfcmVnX3NvdXRoX2FkdWx0IDwtIHVubGlzdChjcF9yZWdfc291dGhfYWR1bHQpICU+JSANCiAgZGF0YS5mcmFtZSgpDQpjb2xuYW1lcyhjcF9yZWdfc291dGhfYWR1bHQpWzFdIDwtICJTb3V0aCBBZHVsdCINCg0KY3BfcmVnX3NvdXRoX3BlZCA8LSB1bmxpc3QoY3BfcmVnX3NvdXRoX3BlZCkgJT4lIA0KICBkYXRhLmZyYW1lKCkNCmNvbG5hbWVzKGNwX3JlZ19zb3V0aF9wZWQpWzFdIDwtICJTb3V0aCBQZWRpYXRyaWMiDQoNCmNwX3JlZ193ZXN0X2FkdWx0IDwtIHVubGlzdChjcF9yZWdfd2VzdF9hZHVsdCkgJT4lIA0KICBkYXRhLmZyYW1lKCkNCmNvbG5hbWVzKGNwX3JlZ193ZXN0X2FkdWx0KVsxXSA8LSAiV2VzdCBBZHVsdCINCg0KY3BfcmVnX3dlc3RfcGVkIDwtIHVubGlzdChjcF9yZWdfd2VzdF9wZWQpICU+JSANCiAgZGF0YS5mcmFtZSgpDQpjb2xuYW1lcyhjcF9yZWdfd2VzdF9wZWQpWzFdIDwtICJXZXN0IFBlZGlhdHJpYyINCg0KY3BfcmVnX25vcnRoZWFzdF9hZHVsdCA8LSB1bmxpc3QoY3BfcmVnX25vcnRoZWFzdF9hZHVsdCkgJT4lIA0KICBkYXRhLmZyYW1lKCkNCmNvbG5hbWVzKGNwX3JlZ19ub3J0aGVhc3RfYWR1bHQpWzFdIDwtICJOb3J0aGVhc3QgQWR1bHQiDQoNCmNwX3JlZ19ub3J0aGVhc3RfcGVkIDwtIHVubGlzdChjcF9yZWdfbm9ydGhlYXN0X3BlZCkgJT4lIA0KICBkYXRhLmZyYW1lKCkNCmNvbG5hbWVzKGNwX3JlZ19ub3J0aGVhc3RfcGVkKVsxXSA8LSAiTm9ydGhlYXN0IFBlZGlhdHJpYyINCg0KY3BfcmVnX3Jlc3VsdHMgPC0gY2JpbmQoY3BfcmVnX21pZHdlc3RfYWR1bHQsIGNwX3JlZ19taWR3ZXN0X3BlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNwX3JlZ19zb3V0aF9hZHVsdCwgY3BfcmVnX3NvdXRoX3BlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNwX3JlZ193ZXN0X2FkdWx0LCBjcF9yZWdfd2VzdF9wZWQsDQogICAgICAgICAgICAgICAgICAgICAgICBjcF9yZWdfbm9ydGhlYXN0X2FkdWx0LCBjcF9yZWdfbm9ydGhlYXN0X3BlZCkgJT4lIA0KICB0KCkgJT4lIA0KICBkYXRhLmZyYW1lKCkNCg0KY3BfcmVnX3Jlc3VsdHMgPC0gY3BfcmVnX3Jlc3VsdHMgJT4lDQogIG11dGF0ZShwLnZhbHVlID0gcm91bmQocC52YWx1ZSw0KSwNCiAgICAgICAgIHN0YXQgPSByb3VuZChzdGF0LDEpKSAlPiUNCiAgdCgpDQoNCnJvd25hbWVzKGNwX3JlZ19yZXN1bHRzKSA8LSBjKCJDaGFuZ2UgUG9pbnQgV2VlayIsICJQLXZhbHVlIiwgIkYtU3RhdCIpDQoNCmRhdGF0YWJsZShjcF9yZWdfcmVzdWx0cykNCmBgYA0KDQoqKk5leHQsIHdlIHdpbGwgYW5ub3RhdGUgcGxvdHMgd2l0aCBjaGFuZ2UgcG9pbnRzKioNCg0KYGBge3J9DQojcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIm1hdHRjb3dnaWxsL2dnYW5ub3RhdGUiKQ0KbGlicmFyeShnZ2Fubm90YXRlKSAjZ2dhbm5vdGF0ZShwbG90KSANCmBgYA0KDQoNCmBgYHtyfQ0KY3BfcGVkcyA8LSBjcF9uYXRfcmVzdWx0cyAlPiUgDQogIGRhdGEuZnJhbWUoKSAlPiUNCiAgc2VsZWN0KE5hdGlvbmFsLlBlZGlhdHJpYy5Ib3NwaXRhbGl6YXRpb25zKSAlPiUgDQogIHNsaWNlKDFMKSAlPiUNCiAgYXMubnVtZXJpYygpDQoNCmNwX3BlZHNfeHkgPC0gaGhzX2RhdGFfcHJvYyAlPiUgDQogIGRhdGEuZnJhbWUoKSAlPiUgDQogIGRpc3RpbmN0KGRhdGVfaWQsIGNvbGxlY3Rpb25fd2VlaywgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMsIHBvcHVsYXRpb24pICU+JSANCiAgZmlsdGVyKGRhdGVfaWQgPT0gY3BfcGVkcywgDQogICAgICAgICBwb3B1bGF0aW9uID09ICJwZWRpYXRyaWMiKQ0KDQoNCmNwX2FkdWx0cyA8LSBjcF9uYXRfcmVzdWx0cyAlPiUgDQogIGRhdGEuZnJhbWUoKSAlPiUNCiAgc2VsZWN0KE5hdGlvbmFsLkFkdWx0Lkhvc3BpdGFsaXphdGlvbnMpICU+JSANCiAgc2xpY2UoMUwpICU+JQ0KICBhcy5udW1lcmljKCkNCg0KY3BfYWR1bHRzX3h5IDwtIGhoc19kYXRhX3Byb2MgJT4lIA0KICBkYXRhLmZyYW1lKCkgJT4lIA0KICBkaXN0aW5jdChkYXRlX2lkLCBjb2xsZWN0aW9uX3dlZWssIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3VzLCBwb3B1bGF0aW9uKSAlPiUgDQogIGZpbHRlcihkYXRlX2lkID09IGNwX2FkdWx0cywgDQogICAgICAgICBwb3B1bGF0aW9uID09ICJhZHVsdCIpDQoNCmdncGxvdChoaHNfZGF0YV9wcm9jICU+JSANCiAgICAgICAgIG11dGF0ZShob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF91cyA9IGlmX2Vsc2UocG9wdWxhdGlvbiA9PSAicGVkaWF0cmljIiwgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMqMTAsIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3VzKSkgJT4lIA0KICAgICAgIGRpc3RpbmN0KGNvbGxlY3Rpb25fd2VlaywgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMsIHBvcHVsYXRpb24pLA0KICAgICAgIGFlcyh4ID0gY29sbGVjdGlvbl93ZWVrLCB5ID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfdXMsIGNvbG9yID0gcG9wdWxhdGlvbikpICsgDQogIGdlb21fbGluZSgpICsgDQogIGdlb21fcG9pbnQoKSArDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIsIGxhYmVscyA9IGMoIkFkdWx0IiwgIkNoaWxkIiksIG5hbWUgPSAiIikgKyANCiAgeWxhYigiSG9zcGl0YWxpemF0aW9ucyBwZXIgMTAwSyBBZHVsdHMiKSArIA0KICB4bGFiKCIiKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWItJWQiLCBkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHNlYy5heGlzID0gc2VjX2F4aXMofiAuLzEwLCBuYW1lID0gIkhvc3BpdGFsaXphdGlvbnMgcGVyIDEwMEsgQ2hpbGRyZW4iKSkgKyANCiAgZ2VvbV90ZXh0KGRhdGEgPSBkYXRhLmZyYW1lKHggPSBjcF9hZHVsdHNfeHkkY29sbGVjdGlvbl93ZWVrLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGNwX2FkdWx0c194eSRob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF91cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIioiKSwNCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYmVsKSwNCiAgICAgICAgICAgIHNpemUgPSAxMiwgaGp1c3QgPSAwLjQ1LCB2anVzdCA9IDAuNzUsIGNvbG91ciA9ICIjMUI5RTc3IiwgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyANCiAgZ2VvbV90ZXh0KGRhdGEgPSBkYXRhLmZyYW1lKHggPSBjcF9wZWRzX3h5JGNvbGxlY3Rpb25fd2VlaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjcF9wZWRzX3h5JGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3VzKjEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIioiKSwNCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYmVsKSwNCiAgICAgICAgICAgIHNpemUgPSAxMiwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMC43NSwgY29sb3VyID0gIiNEOTVGMDIiLCBpbmhlcml0LmFlcyA9IEZBTFNFKSArIA0KICB0aGVtZV9idygpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoIiIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1KSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLA0KICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEzLCBjb2xvciA9ICIjMUI5RTc3IiwgbWFyZ2luPW1hcmdpbigwLDEwLDAsMCkpLA0KICAgICAgICBheGlzLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsICBzaXplID0gMTMsIGNvbG9yID0gIiMxQjlFNzciKSwNCiAgICAgICAgYXhpcy50aXRsZS55LnJpZ2h0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMywgY29sb3I9JyNEOTVGMDInLCBtYXJnaW49bWFyZ2luKDAsMCwwLDEwKSksDQogICAgICAgIGF4aXMudGV4dC55LnJpZ2h0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMywgY29sb3I9JyNEOTVGMDInKSkNCmBgYA0KDQpgYGB7cn0NCmNwX3BlZHMgPC0gY3BfcmVnX3Jlc3VsdHMgJT4lIA0KICBkYXRhLmZyYW1lKCkgJT4lDQogIHNlbGVjdChjb250YWlucygiUGVkaWF0cmljIikpICU+JSANCiAgc2xpY2UoMUwpICU+JQ0KICB0KCkgDQoNCnJlZ2lvbl9jb2wgPC0gZGF0YS5mcmFtZShSZWdpb24gPSBjKCJNaWR3ZXN0IiwgIlNvdXRoIiwgIldlc3QiLCAiTm9ydGhlYXN0IikpDQoNCmNwX3BlZHMgPC0gY2JpbmQoY3BfcGVkcywgcmVnaW9uX2NvbCkNCnJvd25hbWVzKGNwX3BlZHMpIDwtIE5VTEwNCg0KDQpjcF9hZHVsdHMgPC0gY3BfcmVnX3Jlc3VsdHMgJT4lIA0KICBkYXRhLmZyYW1lKCkgJT4lDQogIHNlbGVjdChjb250YWlucygiQWR1bHQiKSkgJT4lIA0KICBzbGljZSgxTCkgJT4lDQogIHQoKSANCg0KY3BfYWR1bHRzIDwtIGNiaW5kKGNwX2FkdWx0cywgcmVnaW9uX2NvbCkNCnJvd25hbWVzKGNwX2FkdWx0cykgPC0gTlVMTA0KDQpjcF9wZWRzX3h5IDwtIGhoc19kYXRhX3Byb2MgJT4lIA0KICBkYXRhLmZyYW1lKCkgJT4lIA0KICBsZWZ0X2pvaW4oLiwgY3BfcGVkcywgYnkgPSAiUmVnaW9uIikgJT4lIA0KICBkaXN0aW5jdChkYXRlX2lkLCBjb2xsZWN0aW9uX3dlZWssIGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiwgcG9wdWxhdGlvbiwgUmVnaW9uLCBgQ2hhbmdlIFBvaW50IFdlZWtgKQ0KDQpjcF9hZHVsdHNfeHkgPC0gaGhzX2RhdGFfcHJvYyAlPiUgDQogIGRhdGEuZnJhbWUoKSAlPiUgDQogIGxlZnRfam9pbiguLCBjcF9hZHVsdHMsIGJ5ID0gIlJlZ2lvbiIpICU+JSANCiAgZGlzdGluY3QoZGF0ZV9pZCwgY29sbGVjdGlvbl93ZWVrLCBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24sIHBvcHVsYXRpb24sIFJlZ2lvbiwgYENoYW5nZSBQb2ludCBXZWVrYCkNCg0KDQoNCmdncGxvdChoaHNfZGF0YV9wcm9jICU+JQ0KICAgICAgICAgbXV0YXRlKGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiA9IGlmX2Vsc2UocG9wdWxhdGlvbiA9PSAicGVkaWF0cmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKjEwLCBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pKSAlPiUNCiAgICAgICAgIGRpc3RpbmN0KGNvbGxlY3Rpb25fd2VlaywgUmVnaW9uLCBwb3B1bGF0aW9uLCBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pLA0KICAgICAgIGFlcyh4ID0gY29sbGVjdGlvbl93ZWVrLCB5ID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uLCBjb2xvciA9IHBvcHVsYXRpb24pKSArIA0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2xpbmUoYWxwaGE9MC45KSArDQogICMgbWlkd2VzdCBjaGFuZ2UgcG9pbnQgaWRlbnRpZmllcg0KICBnZW9tX3RleHQoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IGNwX2FkdWx0c194eSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihSZWdpb24gPT0gIk1pZHdlc3QiICYgcG9wdWxhdGlvbiA9PSAiYWR1bHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9pZCA9PSBgQ2hhbmdlIFBvaW50IFdlZWtgKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChjb2xsZWN0aW9uX3dlZWspICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUoJ3gnID0gY29sbGVjdGlvbl93ZWVrKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjcF9hZHVsdHNfeHkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoUmVnaW9uID09ICJNaWR3ZXN0IiAmIHBvcHVsYXRpb24gPT0gImFkdWx0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfaWQgPT0gYENoYW5nZSBQb2ludCBXZWVrYCkgJT4lIHNlbGVjdChob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUoJ3knID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIqIiwgUmVnaW9uID0gIk1pZHdlc3QiKSwNCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYmVsKSwNCiAgICAgICAgICAgIGNvbG91ciA9ICIjMUI5RTc3Iiwgc2l6ZSA9IDExLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLjgsIGluaGVyaXQuYWVzID0gRkFMU0UpICsgDQogIGdlb21fdGV4dChkYXRhID0gZGF0YS5mcmFtZSh4ID0gY3BfcGVkc194eSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihSZWdpb24gPT0gIk1pZHdlc3QiICYgcG9wdWxhdGlvbiA9PSAicGVkaWF0cmljIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfaWQgPT0gYENoYW5nZSBQb2ludCBXZWVrYCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKCd4JyA9IGNvbGxlY3Rpb25fd2VlayksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gY3BfcGVkc194eSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihSZWdpb24gPT0gIk1pZHdlc3QiICYgcG9wdWxhdGlvbiA9PSAicGVkaWF0cmljIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfaWQgPT0gYENoYW5nZSBQb2ludCBXZWVrYCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKjEwKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKCd5JyA9IGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIqIiwgUmVnaW9uID0gIk1pZHdlc3QiKSwNCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYmVsKSwNCiAgICAgICAgICAgIGNvbG91ciA9ICIjRDk1RjAyIiwgc2l6ZSA9IDExLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLjgsIGluaGVyaXQuYWVzID0gRkFMU0UpICsgDQogICMgTm9ydGhlYXN0IGNoYW5nZSBwb2ludCBpZGVudGlmaWVyDQogIGdlb21fdGV4dChkYXRhID0gZGF0YS5mcmFtZSh4ID0gY3BfYWR1bHRzX3h5ICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFJlZ2lvbiA9PSAiTm9ydGhlYXN0IiAmIHBvcHVsYXRpb24gPT0gImFkdWx0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfaWQgPT0gYENoYW5nZSBQb2ludCBXZWVrYCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKCd4JyA9IGNvbGxlY3Rpb25fd2VlayksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gY3BfYWR1bHRzX3h5ICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFJlZ2lvbiA9PSAiTm9ydGhlYXN0IiAmIHBvcHVsYXRpb24gPT0gImFkdWx0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfaWQgPT0gYENoYW5nZSBQb2ludCBXZWVrYCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUoJ3knID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIqIiwgUmVnaW9uID0gIk5vcnRoZWFzdCIpLA0KICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0geCwgeSA9IHksIGxhYmVsID0gbGFiZWwpLA0KICAgICAgICAgICAgY29sb3VyID0gIiMxQjlFNzciLCBzaXplID0gMTEsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuOCwgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyANCiAgZ2VvbV90ZXh0KGRhdGEgPSBkYXRhLmZyYW1lKHggPSBjcF9wZWRzX3h5ICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFJlZ2lvbiA9PSAiTm9ydGhlYXN0IiAmIHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlX2lkID09IGBDaGFuZ2UgUG9pbnQgV2Vla2ApICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGNvbGxlY3Rpb25fd2VlaykgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSgneCcgPSBjb2xsZWN0aW9uX3dlZWspLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGNwX3BlZHNfeHkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoUmVnaW9uID09ICJOb3J0aGVhc3QiICYgcG9wdWxhdGlvbiA9PSAicGVkaWF0cmljIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfaWQgPT0gYENoYW5nZSBQb2ludCBXZWVrYCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKjEwKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKCd5JyA9IGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIqIiwgUmVnaW9uID0gIk5vcnRoZWFzdCIpLA0KICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0geCwgeSA9IHksIGxhYmVsID0gbGFiZWwpLA0KICAgICAgICAgICAgY29sb3VyID0gIiNEOTVGMDIiLCBzaXplID0gMTEsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuOCwgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyANCiAgIyBTb3V0aCBjaGFuZ2UgcG9pbnQgaWRlbnRpZmllcg0KICBnZW9tX3RleHQoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IGNwX2FkdWx0c194eSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihSZWdpb24gPT0gIlNvdXRoIiAmIHBvcHVsYXRpb24gPT0gImFkdWx0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfaWQgPT0gYENoYW5nZSBQb2ludCBXZWVrYCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKCd4JyA9IGNvbGxlY3Rpb25fd2VlayksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gY3BfYWR1bHRzX3h5ICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFJlZ2lvbiA9PSAiU291dGgiICYgcG9wdWxhdGlvbiA9PSAiYWR1bHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9pZCA9PSBgQ2hhbmdlIFBvaW50IFdlZWtgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSgneScgPSBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIioiLCBSZWdpb24gPSAiU291dGgiKSwNCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYmVsKSwNCiAgICAgICAgICAgIGNvbG91ciA9ICIjMUI5RTc3Iiwgc2l6ZSA9IDExLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLjgsIGluaGVyaXQuYWVzID0gRkFMU0UpICsgDQogIGdlb21fdGV4dChkYXRhID0gZGF0YS5mcmFtZSh4ID0gY3BfcGVkc194eSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihSZWdpb24gPT0gIlNvdXRoIiAmIHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlX2lkID09IGBDaGFuZ2UgUG9pbnQgV2Vla2ApICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGNvbGxlY3Rpb25fd2VlaykgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSgneCcgPSBjb2xsZWN0aW9uX3dlZWspLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGNwX3BlZHNfeHkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoUmVnaW9uID09ICJTb3V0aCIgJiBwb3B1bGF0aW9uID09ICJwZWRpYXRyaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9pZCA9PSBgQ2hhbmdlIFBvaW50IFdlZWtgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24gPSBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24qMTApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUoJ3knID0gaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIioiLCBSZWdpb24gPSAiU291dGgiKSwNCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHgsIHkgPSB5LCBsYWJlbCA9IGxhYmVsKSwNCiAgICAgICAgICAgIGNvbG91ciA9ICIjRDk1RjAyIiwgc2l6ZSA9IDExLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAwLjgsIGluaGVyaXQuYWVzID0gRkFMU0UpICsNCiAgIyBXZXN0IGNoYW5nZSBwb2ludCBpZGVudGlmaWVyDQogIGdlb21fdGV4dChkYXRhID0gZGF0YS5mcmFtZSh4ID0gY3BfYWR1bHRzX3h5ICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFJlZ2lvbiA9PSAiV2VzdCIgJiBwb3B1bGF0aW9uID09ICJhZHVsdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlX2lkID09IGBDaGFuZ2UgUG9pbnQgV2Vla2ApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoY29sbGVjdGlvbl93ZWVrKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKCd4JyA9IGNvbGxlY3Rpb25fd2VlayksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gY3BfYWR1bHRzX3h5ICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFJlZ2lvbiA9PSAiV2VzdCIgJiBwb3B1bGF0aW9uID09ICJhZHVsdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlX2lkID09IGBDaGFuZ2UgUG9pbnQgV2Vla2ApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKCd5JyA9IGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiKiIsIFJlZ2lvbiA9ICJXZXN0IiksDQogICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSB4LCB5ID0geSwgbGFiZWwgPSBsYWJlbCksDQogICAgICAgICAgICBjb2xvdXIgPSAiIzFCOUU3NyIsIHNpemUgPSAxMSwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMC44LCBpbmhlcml0LmFlcyA9IEZBTFNFKSArIA0KICBnZW9tX3RleHQoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IGNwX3BlZHNfeHkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoUmVnaW9uID09ICJXZXN0IiAmIHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlX2lkID09IGBDaGFuZ2UgUG9pbnQgV2Vla2ApICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGNvbGxlY3Rpb25fd2VlaykgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSgneCcgPSBjb2xsZWN0aW9uX3dlZWspLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGNwX3BlZHNfeHkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoUmVnaW9uID09ICJXZXN0IiAmIHBvcHVsYXRpb24gPT0gInBlZGlhdHJpYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlX2lkID09IGBDaGFuZ2UgUG9pbnQgV2Vla2ApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoaG9zcGl0YWxpemF0aW9uc19zdGFuZGFyZGl6ZWRfcmVnaW9uKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbiA9IGhvc3BpdGFsaXphdGlvbnNfc3RhbmRhcmRpemVkX3JlZ2lvbioxMCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSgneScgPSBob3NwaXRhbGl6YXRpb25zX3N0YW5kYXJkaXplZF9yZWdpb24pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiKiIsIFJlZ2lvbiA9ICJXZXN0IiksDQogICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSB4LCB5ID0geSwgbGFiZWwgPSBsYWJlbCksDQogICAgICAgICAgICBjb2xvdXIgPSAiI0Q5NUYwMiIsIHNpemUgPSAxMSwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMC44LCBpbmhlcml0LmFlcyA9IEZBTFNFKSArDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJEYXJrMiIsIGxhYmVscyA9IGMoIkFkdWx0IiwgIkNoaWxkIiksIG5hbWUgPSAiIikgKyANCiAgeWxhYigiSG9zcGl0YWxpemF0aW9ucyBwZXIgMTAwayBBZHVsdHMiKSArIA0KICB4bGFiKCIiKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWIiLCBkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHNlYy5heGlzID0gc2VjX2F4aXMofiAuLzEwLCBuYW1lID0gIkhvc3BpdGFsaXphdGlvbnMgcGVyIDEwMGsgQ2hpbGRyZW4iKSkgKyANCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoIiIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1KSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLA0KICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEzLCBjb2xvciA9ICIjMUI5RTc3IiwgbWFyZ2luPW1hcmdpbigwLDEwLDAsMCkpLA0KICAgICAgICBheGlzLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsICBzaXplID0gMTMsIGNvbG9yID0gIiMxQjlFNzciKSwNCiAgICAgICAgYXhpcy50aXRsZS55LnJpZ2h0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMywgY29sb3I9JyNEOTVGMDInLCBtYXJnaW49bWFyZ2luKDAsMCwwLDEwKSksDQogICAgICAgIGF4aXMudGV4dC55LnJpZ2h0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMywgY29sb3I9JyNEOTVGMDInKSkgKyANCiAgZmFjZXRfd3JhcCh+UmVnaW9uLCBzY2FsZXMgPSAiZml4ZWQiKSArIA0KICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkgIA0KYGBgDQoNCg==