# Main Notebook is here.
 警告メッセージ: 
1:  options(opt) で:  'PCRE_study' has no effect with PCRE2
2:  options(opt) で: 
  'options(stringsAsFactors = TRUE)' is deprecated and will be disabled
# https://dsx5wcobth.github.io/2012_to_2022/

# Supplementary Notebook is here.
# https://dsx5wcobth.github.io/2012_to_2022/RI_article_supplementary_20220715.nb.html

# All sorce code is here.
# https://github.com/DSx5WcObth/2012_to_2022

# The recommended  execution environment to run the code is as follows.
# OS version : Ubuntu20.04 or macOS12
# R version : 4.0.34.0.3
# RStudio version : v1.4.1717
# tidyverse version : 1.3.1

Initialized and library loaded.

options(warn=-1)
# Initialized.
rm(list=ls())

# Library loaded.
library(tidyr)
library(dplyr)
library(ggplot2)
library(lubridate)
library(stringr)
library(readr)
library(openxlsx)
library(ggrepel)
library(furrr)

Data loaded.

options(warn=-1)
# CSV data loaded.
fdata <- c(
  "./merge_csv/2012_rep.csv",
  "./merge_csv/2013_rep.csv",
  "./merge_csv/2014_rep.csv",
  "./merge_csv/2015_rep.csv",
  "./merge_csv/2016_rep.csv",
  "./merge_csv/2017_rep.csv",
  "./merge_csv/2018_rep.csv",
  "./merge_csv/2019_rep.csv",
  "./merge_csv/2020_1_rep.csv"
)

# plan(multisession, workers = 8) 
data_2020_all_1 <- furrr::future_map_dfr(fdata, ~ readr::read_csv(.x, col_types=cols(.default = "c")))
New names:
• `` -> `...1`New names:
• `` -> `...1`New names:
• `` -> `...1`New names:
• `` -> `...1`New names:
• `` -> `...1`New names:
• `` -> `...1`New names:
• `` -> `...1`New names:
• `` -> `...1`New names:
• `` -> `...1`
rm(fdata)

# data_2020_all_2 <- readr::read_csv("./merge_csv/csv_archive/2020_2_archive.csv", col_types=cols(.default = "c"))
fdata <- c(
  "./merge_csv/2020_2_rep.csv",
  "./merge_csv/2021_rep.csv",
  "./merge_csv/2022_rep.csv"

)
data_2020_all_2 <- furrr::future_map_dfr(fdata, ~ readr::read_csv(.x, col_types=cols(.default = "c")))
New names:
• `` -> `...1`New names:
• `` -> `...1`New names:
• `` -> `...1`
# "No" column in the data was converted to integer
data_2020_all_1[c("No")] <- data_2020_all_1[c("No")] %>% furrr::future_map( ~ as.integer(.x))
data_2020_all_2[c("No")] <- data_2020_all_2[c("No")] %>% furrr::future_map( ~ as.integer(.x))

Pre processing

Data conjoin and Columns select

options(warn=-1)
#### Information on Prefecture was not used due to as it is at low data quality.
data_all_1 <- data_2020_all_1 %>%
  select(
    "No", "都道府県", "市町村", "area", "Market",
    "食品カテゴリ", "Category", "Category_2",
    "品目名", "Item", "その他", "Others",
    "食品分類", "Food_classfication",
    "Inspection_instrument",
    "Sampling_Date", "Sampling_Date_fix",
    "Results_Obtained_Date", "Result_Date_fix",
    "Press_Release_Date", "Press_Release_Date_fix",
    "Sampling_Year", "Result_Year", "Press_Release_Year", "File_Year",
    "Cesium_134", "Cs_134_fix", "Cs_134_ND",
    "Cesium_137", "Cs_137_fix", "Cs_137_ND",
    "Cesium_total", "Cs_total_fix", "Cs_total_ND", "exceed_action_levels")
data_all_2 <- data_2020_all_2 %>%
  select(
    "No", "都道府県", "市町村", "area", "Market",
    "食品カテゴリ", "Category", "Category_2",
    "品目名", "Item", "養殖_天然", "Farmed_Wild",
    "食品分類",  "Food_classfication",
    "Inspection_instrument",
    "Sampling_Date", "Sampling_Date_fix",
    "Results_Obtained_Date", "Result_Date_fix",
    "Press_Release_Date", "Press_Release_Date_fix",
    "Sampling_Year", "Result_Year", "Press_Release_Year", "File_Year",
    "Cesium_134", "Cs_134_fix", "Cs_134_ND",
    "Cesium_137", "Cs_137_fix", "Cs_137_ND",
    "Cesium_total", "Cs_total_fix", "Cs_total_ND", "exceed_action_levels")
colnames(data_all_2) <- c("No", "都道府県", "市町村", "area", "Market",
                          "食品カテゴリ", "Category", "Category_2",
                          "品目名", "Item", "その他", "Others",
                          "食品分類", "Food_classfication",
                          "Inspection_instrument",
                          "Sampling_Date", "Sampling_Date_fix",
                          "Results_Obtained_Date", "Result_Date_fix",
                          "Press_Release_Date", "Press_Release_Date_fix",
                          "Sampling_Year", "Result_Year", "Press_Release_Year", "File_Year",
                          "Cesium_134", "Cs_134_fix", "Cs_134_ND",
                          "Cesium_137", "Cs_137_fix", "Cs_137_ND",
                          "Cesium_total", "Cs_total_fix", "Cs_total_ND", "exceed_action_levels")

data_all_ <- rbind(data_all_1, data_all_2)
rm(data_2020_all_1, data_2020_all_2)
rm(data_all_1, data_all_2)

Data Cleaning , Columns add and Type conversion

options(warn=-1)
data_2012_2020_fix_ <- data_all_
data_2012_2020_fix_ <- data_2012_2020_fix_ %>% drop_na(No)

# Market column data cleaned.
txt_pattern <- c("-|―")
txt_replace <- c("Not applicable")
data_2012_2020_fix_$Market <- purrr::reduce2(txt_pattern, txt_replace, .init=data_2012_2020_fix_$Market, str_replace)

# Undefined data in food category was changed to “others” and recategorized as "not applicable."
txt_pattern <- c("Others")
txt_replace <- c("Not applicable")
data_2012_2020_fix_$Category <- purrr::reduce2(txt_pattern, txt_replace, .init=data_2012_2020_fix_$Category, str_replace)
data_2012_2020_fix_$Category <- data_2012_2020_fix_$Category %>% str_trim()

# "Sampling_Date_fix", "Result_Date_fix" and "Press_Release_Date_fix" columns were created using the data in "Sampling_Date", "Result_Date" and "Press_Release_Date" columns, and the date format were fixed.
txt_pattern <- c("年|月")
txt_replace <- c("-")
column_fix <- c("Sampling_Date_fix", "Result_Date_fix", "Press_Release_Date_fix")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern, txt_replace)})

txt_pattern <- c("-$")
txt_replace <- c("-01")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern, txt_replace)})

txt_pattern <- c("^-01")
txt_replace <- c("-")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern, txt_replace)})

column_fix <- c("Sampling_Date_fix", "Result_Date_fix", "Press_Release_Date_fix")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_sub(start=1, end=10)})

# Sampling_Year data were cleaned.
txt_pattern <- c("-|-|―| | |-|―|−|─|-|nan|不明")
txt_replace <- c("-")
column_fix <- c("Sampling_Year")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern, txt_replace)})

# Sampling_Year data were cleaned.
txt_pattern <- c("-|-|―| | |-|―|−|─|-|nan|不明")
txt_replace <- c("-")
column_fix <- c("Sampling_Year")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern, txt_replace)})

# Inspection_instrument data were cleaned.
column_fix <- c("Inspection_instrument")
data_2012_2020_fix_[[column_fix]] <- data_2012_2020_fix_[[column_fix]] %>%
  sapply(function(x) {x %>% str_trim() %>% str_trunc(2, "right", ellipsis="")})

txt_pattern_1 <- c("^N.*")
txt_pattern_2 <- c("^N.*")
txt_replace <- c("NaI")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern_1 , txt_replace)})
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern_2 , txt_replace)})

txt_pattern_1 <- "^G.*"
txt_pattern_2 <- "^G.*"
txt_replace <- "Ge"
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern_1 , txt_replace)})
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern_2 , txt_replace)})

txt_pattern_1 <- c("^C.*")
txt_pattern_2 <- c("^C.*")
txt_replace <- "CsI"
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern_1 , txt_replace)})
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern_2 , txt_replace)})

# Data in “Cesium_total” were cleaned, and the fixed data were saved in “Cs_total_fix data” column.
data_2012_2020_fix_ <- data_2012_2020_fix_ %>%
  mutate(
    Cs_fix=case_when(
      Cesium_134=="<.0598" ~ "0598",
      TRUE ~ Cs_134_fix
    )
  )
data_2012_2020_fix_["Cs_134_fix"] <- data_2012_2020_fix_["Cs_fix"]
data_2012_2020_fix_ <- data_2012_2020_fix_ %>%
  mutate(
    Cs_fix=case_when(
      Cesium_137=="<.881" ~ "0.881",
      Cesium_137=="<.12" ~ "0.12",
      Cesium_137=="<\\.0441" ~ "0.0441",
      TRUE ~ Cs_137_fix
    )
  )
data_2012_2020_fix_["Cs_137_fix"] <- data_2012_2020_fix_["Cs_fix"]
data_2012_2020_fix_ <- data_2012_2020_fix_ %>%
  mutate(
    Cs_fix=case_when(
      Cesium_total=="<164" ~ "16.4",
      Cesium_total=="^0$" ~ "25",
      TRUE ~ Cs_total_fix
    )
  )
data_2012_2020_fix_["Cs_total_fix"] <- data_2012_2020_fix_["Cs_fix"]

txt_pattern <- c("^0.0$")
txt_replace <- c("NotDetected")
column_fix <- c("Cs_total_ND")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern, txt_replace)})

txt_pattern <- c("<\\.|<\\.|^\\.|\\'|\\n|\\*|\\.$|N\\.D\\.|\\(|\\)|(|)|^\\.|\\.$")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_remove(txt_pattern)})

txt_pattern <- c("±")
txt_replace <- c("          ")
column_fix <- c("Cs_134_fix", "Cs_137_fix", "Cs_total_fix")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>%
      str_replace(txt_pattern, txt_replace) %>% str_sub(start=1, end=6)})

txt_pattern <- c("\\.\\.|,|.|\\.,|,\\.")
txt_replace <- c(".")
column_fix <- c("Cs_134_fix", "Cs_137_fix", "Cs_total_fix")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern, txt_replace)})

# Cs values were converted to numeric data.
column_fix <- c("Cs_134_fix", "Cs_137_fix", "Cs_total_fix")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_trim() %>% as.numeric()})



# Over JML was determined from Cs values.
data_2012_2020_fix_ <- data_2012_2020_fix_ %>%
  mutate(
    Exceed=case_when(
      Category_2 %in% "General foods" & Cs_total_ND=="Detected" & Cs_total_fix>100 ~ "Ex",
      Category_2 %in% "Milk, infant foods" & Cs_total_ND=="Detected" & Cs_total_fix>50 ~ "Ex",
      Category_2 %in% "Drinking water" & Cs_total_ND=="Detected" & Cs_total_fix>10 ~ "Ex"
      )
    )

# Cs detection was determined from Cs values.
data_2012_2020_fix_ <- data_2012_2020_fix_ %>%
  mutate(
    Gene_food_ND=case_when(
      Category_2 %in% "General foods" & Cs_total_fix>25 ~ "Detected",
      Category_2 %in% "General foods" & !Cs_total_fix>25 ~ "NotDetected",
      Category_2 %in% "Milk, infant foods" & Cs_total_fix>25 ~ "Detected",
      Category_2 %in% "Milk, infant foods" & !Cs_total_fix>25 ~ "NotDetected",
      Category_2 %in% "Drinking water" & Cs_total_fix>10 ~ "Detected",
      Category_2 %in% "Drinking water" & !Cs_total_fix>10 ~ "NotDetected",
      is.na(Cs_total_fix) ~ "NotDetected"
      )
    )

data_2012_2020_fix_ <- data_2012_2020_fix_ %>%
  mutate(
    Cs_condition=case_when(
      Cs_total_fix>100 ~ "Warning", 
      Cs_total_fix>50 ~ "Caution", 
      Cs_total_fix>25 ~ "Notice", 
      Cs_total_fix<=25 ~ "Info", 
      is.na(Cs_total_fix) ~ "NoData"
      )
    )

# The data in “exceed_action_levels” column were changed to “TRUE” when over JML.
txt_pattern <- c("1")
txt_replace <- c("TRUE")
column_fix <- c("exceed_action_levels")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  sapply(function(x) {x %>% str_replace(txt_pattern, txt_replace)})

# Data in "character" type were converted into "factor" type.
column_fix <- c(
  # "Prefecture", "Market", "Inspection_instrument",
  "Market", "Inspection_instrument",
  "Category", "Category_2", "Food_classfication",
  "Cs_134_ND", "Cs_137_ND", "Cs_total_ND", "Cs_condition",
  "exceed_action_levels", "Exceed",
  "Sampling_Year", "Result_Year", "Press_Release_Year",
  "File_Year"
)

data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  lapply(as.factor) %>% data.frame()

column_fix <- c("Sampling_Date_fix",
                "Result_Date_fix",
                "Press_Release_Date_fix")
data_2012_2020_fix_[, column_fix] <- data_2012_2020_fix_[, column_fix] %>%
  lapply(function(x) {x %>% as.Date()})

# Prefecture translate english.
data_2012_2020_fix_ <- data_2012_2020_fix_ %>% merge(readr::read_csv("./csv/Prefecture_english.csv"), by="都道府県", all.x = T)
Rows: 54 Columns: 2
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): 都道府県, Prefecture

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Data from "Sampling_Year" were basically used. Otherwise, "Result_Year," "Press_Release_Year," or year recorded to save the data file, 
data_2012_2020_total_ <- data_2012_2020_fix_ %>%
  mutate(Integration_Year=case_when(
         Sampling_Year=="2012" | Sampling_Year=="2013" | Sampling_Year=="2014" |
         Sampling_Year=="2015" | Sampling_Year=="2016" | Sampling_Year=="2017" |
         Sampling_Year=="2018" | Sampling_Year=="2019" | Sampling_Year=="2020" |
         Sampling_Year=="2021" | Sampling_Year=="2022" ~ Sampling_Year,
         Sampling_Year!="2012" & Sampling_Year!="2013" & Sampling_Year!="2014" &
         Sampling_Year!="2015" & Sampling_Year!="2016" & Sampling_Year!="2017" &
         Sampling_Year!="2018" & Sampling_Year!="2019" & Sampling_Year!="2020" &
         Sampling_Year!="2021" & Sampling_Year!="2022" & !is.na(Result_Year) ~ Result_Year,
         TRUE ~ File_Year
          ) 
  )

# Translation mistakes from Japanese to English were corrected.
data_Fishery_ <- data_2012_2020_total_ %>%
  filter(Category=="Fishery products")
data_Fishery_$Item <- data_Fishery_$Item %>%
  str_replace(pattern="Japanese persimmon", replacement="Oyster")
data_Fishery_$Food_classfication <- data_Fishery_$Food_classfication %>%
  str_replace(pattern="Fruits_including_nuts", replacement="Marine_products(invertebrate)")
data_Fishery_$食品分類 <- data_Fishery_$食品分類 %>%
  str_replace(pattern="果実類(種実類含む)", replacement="水産物(無脊椎)")
data_NotFishery_ <- data_2012_2020_total_ %>% filter(Category!="Fishery products")
data_2012_2020_total_ <- data_Fishery_ %>% rbind(data_NotFishery_)
rm(data_Fishery_, data_NotFishery_)

# Food classfication to “No_Data” and “Confirming” was corrected and grouped into "Other".
data_Others_ <- data_2012_2020_total_ %>%
  filter(is.na(Food_classfication) | Food_classfication=="No_Data" | Food_classfication=="Confirming")
data_Others_$Food_classfication <- "Other"

data_NotOthers_ <- data_2012_2020_total_ %>%
  filter(!is.na(Food_classfication) & Food_classfication!="No_Data" & Food_classfication!="Confirming")
data_2012_2020_total_ <- data_Others_ %>% rbind(data_NotOthers_)
rm(data_Others_, data_NotOthers_)

data_2012_2020_total_$食品分類 <- data_2012_2020_total_$食品分類 %>%
  str_replace(pattern="該当なし", replacement="その他")

data_Fiscal_Year_ <- data_2012_2020_total_ %>%
  mutate(Year_Month=str_sub(Sampling_Date, start = 1, end = 8)) %>%
  merge(
    readr::read_csv("./csv/Sampling_Year_Month.csv" )[c("Year_Month", "Fiscal_Year", "Month")],
    by="Year_Month", all.x=T)
Rows: 3902 Columns: 4
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (4): Year_Month, Day, Month, Fiscal_Year

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Year_Sampling <- data_Fiscal_Year_ %>%
  filter(Fiscal_Year!="-" & !is.na(Fiscal_Year))
Year_Result <- data_Fiscal_Year_ %>%
  filter(Fiscal_Year=="-" | is.na(Fiscal_Year)) %>%
  select(-c(Year_Month, Fiscal_Year, Month)) %>%
  mutate(Year_Month=str_sub(Results_Obtained_Date, start = 1, end = 8)) %>%
  merge(
    readr::read_csv("./csv/Results_Year_Month.csv" )[c("Year_Month", "Fiscal_Year", "Month")],
    by="Year_Month", all.x=T)
Rows: 2880 Columns: 4
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (4): Year_Month, Day, Month, Fiscal_Year

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Year_Press <- Year_Result %>% filter(Fiscal_Year=="-" | is.na(Fiscal_Year))
Year_Result <- Year_Result %>% filter(Fiscal_Year!="-" & !is.na(Fiscal_Year))
Year_Press <- Year_Press %>%
  filter(Fiscal_Year=="-" | is.na(Fiscal_Year)) %>%
  select(-c(Year_Month, Fiscal_Year, Month)) %>%
  mutate(Year_Month=str_sub(Press_Release_Date, start = 1, end = 8)) %>%
  merge(
    readr::read_csv("./csv/Press_Year_Month.csv" )[c("Year_Month", "Fiscal_Year", "Month")],
    by="Year_Month", all.x=T)
Rows: 600 Columns: 4
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (4): Year_Month, Day, Month, Fiscal_Year

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
data_Fiscal_Year_ <- rbind(Year_Sampling %>% select(-c(Year_Month, Cs_fix)),
                           Year_Result %>% select(-c(Year_Month, Cs_fix)),
                           Year_Press %>% select(-c(Year_Month, Cs_fix)))

data_2012_2020_total_ <- data_Fiscal_Year_
rm(Year_Sampling, Year_Result, Year_Press)
rm(data_Fiscal_Year_, data_all_, data_2012_2020_fix_, data_Fishery_)

Table 1. Summary of 134,137Cs monitoring data from FY 2012 to 2021

# Data analysis on the sample data and the year reported.
# Data using Cs detection instruments reported, “Ge”, “CsI”, “NaI” and  “-,” were used for analysis.

# The sample data and the year reported were read.
data_0 <- data_2012_2020_total_ %>%
  count(Fiscal_Year)

# Data analysis on the marketed/non-marketed sample and the year reported.
data_1 <- data_2012_2020_total_ %>%
  count(Fiscal_Year, Market) %>%
  spread(Market, n)
data_1 <- data_0 %>%
  merge(data_1[c("Fiscal_Year",
                 "Market products", "Produce for sales",
                 "Non market products", "Produce not for sales",
                 "Not applicable")],
        "Fiscal_Year")

# Rate calculated out of all data
data_2 <- data_0["Fiscal_Year"] %>%
  mutate(Market_products_Rate=round(data_1$`Market products`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Produce_for_sales_Rate=round(data_1$`Produce for sales`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Non_market_products_Rate=round(data_1$`Non market products`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Produce_not_for_sales_Rate=round(data_1$`Produce not for sales`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Not_applicable_Rate=round(data_1$`Not applicable`/count(data_2012_2020_total_)$n, 6)*100)

Table1_1 <- data_1 %>%
  merge(data_2, by="Fiscal_Year") %>%
  select("Fiscal_Year", "n",
         "Market products", "Market_products_Rate",
         "Non market products", "Non_market_products_Rate",
         "Produce for sales", "Produce_for_sales_Rate",
         "Produce not for sales", "Produce_not_for_sales_Rate",
         "Not applicable", "Not_applicable_Rate"
         ) %>% print()

# Data analysis on the food category data and the year reported.
data_3 <- data_2012_2020_total_ %>%
  count(Fiscal_Year, Category) %>%
  spread(Category, n)
data_3 <- data_3[c("Fiscal_Year", "Fishery products",
                   "Livestock products", "Agricultural products",
                   "Wild animal meat", "Milk, infant formula",
                   "Drinking water", "Not applicable")]

data_4 <- data_0[1] %>%
  mutate(Fishery_products_Rate=round(data_3$`Fishery products`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Livestock_products_Rate=round(data_3$`Livestock products`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Agricultural_products_Rate=round(data_3$`Agricultural products`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Wild_animal_meat_Rate=round(data_3$`Wild animal meat`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Milk_infant_formula_Rate=round(data_3$`Milk, infant formula`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Drinking_water_Rate=round(data_3$`Drinking water`/count(data_2012_2020_total_)$n, 4)*100) %>%
  mutate(Not_applicable_Rate=round(data_3$`Not applicable`/count(data_2012_2020_total_)$n, 4)*100)

Table1_2 <- data_3 %>%
  merge(data_4, by="Fiscal_Year") %>%
  select("Fiscal_Year",
         "Fishery products", "Fishery_products_Rate",
         "Livestock products", "Livestock_products_Rate",
         "Agricultural products", "Agricultural_products_Rate",
         "Wild animal meat", "Wild_animal_meat_Rate",
         "Milk, infant formula", "Milk_infant_formula_Rate",
         "Drinking water", "Drinking_water_Rate",
         "Not applicable", "Not_applicable_Rate"
         ) %>% print()

# Data analysis on the samples with Cs detected/Cs non-detected and the year reported.
data_5 <- data_2012_2020_total_ %>%
  count(Fiscal_Year, Cs_total_ND) %>%
  spread(Cs_total_ND, n)

data_6 <- data_0[1] %>%
  mutate(Detected_Rate=round(data_5$Detected/count(data_2012_2020_total_)$n*100, 4)) %>%
  mutate(NotDetected_Rate=round(data_5$NotDetected/count(data_2012_2020_total_)$n*100, 4))

Table1_3 <- data_5 %>%
  merge(data_6, by="Fiscal_Year") %>%
  select("Fiscal_Year",
         "Detected", "Detected_Rate",
         "NotDetected", "NotDetected_Rate"
         ) %>% print()

# Data analysis on the Cs concentration data and the year reported.
data_7 <- data_2012_2020_total_ %>%
  count(Fiscal_Year, Cs_condition) %>%
  spread(Cs_condition, n)
data_7_Plus <- data_7[c("Fiscal_Year", "Warning", "Caution", "Notice", "Info")]
data_7_Plus <- data_7_Plus %>%
  mutate(Info=replace_na(data_7$Info,0) +
              replace_na(data_7$NoData, 0) #+
              # replace_na(data_7$NotDetected, 0)
         )

data_8 <- data_0["Fiscal_Year"] %>%
  mutate(Warning_Rate=round(data_7_Plus$Warning/count(data_2012_2020_total_)$n*100, 4)) %>%
  mutate(Caution_Rate=round(data_7_Plus$Caution/count(data_2012_2020_total_)$n*100, 4)) %>%
  mutate(Notice_Rate=round(data_7_Plus$Notice/count(data_2012_2020_total_)$n*100, 4)) %>%
  mutate(Info_Rate=round(data_7_Plus$Info/count(data_2012_2020_total_)$n*100, 4))

Table1_4 <- data_7_Plus %>%
  filter(Fiscal_Year!="-" & Fiscal_Year!="2011") %>%
  merge(data_8, by="Fiscal_Year") %>%
  mutate() %>%
  select("Fiscal_Year",
         "Warning", "Warning_Rate",
         "Caution", "Caution_Rate",
         "Notice", "Notice_Rate",
         "Info", "Info_Rate"
         ) %>% print()


rm(data_0, data_1, data_2, data_3, data_4, data_5, data_6, data_7, data_8, data_7_Plus)

Table 2. Origin of the examined fishery food products that were reported to exceed 100 Bq/kg*

# Data using Cs detection instruments reported, “Ge”, “CsI”, “NaI” and  “-,” were used for analysis.
data_2012_2020_fish_ <- data_2012_2020_total_ %>%
  filter(Category=="Fishery products" & !is.na(Fiscal_Year)) %>%
  mutate(
    Marine_Water = case_when(Food_classfication=="Marine_products(freshwater)" ~ "Freshwater",
                             Food_classfication!="Marine_products(freshwater)" ~ "Marine")
    ) %>%
  mutate(Period=case_when(
      Fiscal_Year==2012 | Fiscal_Year==2013 | Fiscal_Year==2014 | Fiscal_Year==2015 ~ "Early",
      Fiscal_Year==2016 | Fiscal_Year==2017 | Fiscal_Year==2018 | Fiscal_Year==2019 ~ "Middle",
      Fiscal_Year==2020 | Fiscal_Year==2021 ~ "Later",
      TRUE ~ "Others"
    )
  ) %>%
  mutate(Farmed_Wild=case_when(
      str_detect(品目名, "養殖") & !str_detect(その他, "養殖ではない") ~ "Farmed",
      str_detect(その他, "養殖") & !str_detect(その他, "養殖ではない") ~ "Farmed",
      !str_detect(その他, "養殖") | str_detect(その他, "養殖ではない") ~ "Wild",
      !str_detect(その他, "養殖") | str_detect(その他, "養殖ではない") ~ "Wild",
      TRUE ~ "-"
    )
  ) %>%
  mutate(Fresh_Farmed=case_when(
      Food_classfication=="Marine_products(freshwater)" & Farmed_Wild=="Wild" ~ "Freshwater, wild",
      Food_classfication!="Marine_products(freshwater)" & Farmed_Wild=="Wild" ~ "Marine, wild",
      Food_classfication=="Marine_products(freshwater)" & Farmed_Wild=="Farmed" ~ "Freshwater, aquaculture",
      Food_classfication!="Marine_products(freshwater)" & Farmed_Wild=="Farmed" ~ "Marine, aquaculture",
      TRUE ~ "-"
    )
  ) %>%
  mutate(Ex_Detect=case_when(
    Cs_total_fix>100 ~ "Ex",
    Cs_total_fix>25 ~ "Detect",
    !Cs_total_fix>100 ~ "ND"
  ))

# Farmed, Freshwater fishery foodstuffs
Table2_1 <- data_2012_2020_fish_ %>%
  filter(Farmed_Wild=="Farmed") %>%
  filter(Food_classfication=="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  replace_na(list(Ex=0)) %>%
  mutate(Examined=Ex+`<NA>`) %>%
  mutate(Ratio=Ex/(Examined)*100) %>%
  select("Fiscal_Year", "Examined", "Ex", "Ratio") %>%
  print()

# Farmed, Marine fishery foodstuffs
Table2_2 <- data_2012_2020_fish_ %>%
  filter(Farmed_Wild=="Farmed") %>%
  filter(Food_classfication!="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  # replace_na(list(Ex=0)) %>%
  mutate(Ex=0) %>%
  mutate(Examined=Ex+`<NA>`) %>%
  mutate(Ratio=Ex/(Examined)*100) %>%
  select("Fiscal_Year", "Examined", "Ex", "Ratio") %>%
  print()

# Wild, Freshwater fishery foodstuffs
Table2_3 <- data_2012_2020_fish_ %>%
  filter(Farmed_Wild!="Farmed") %>%
  filter(Food_classfication=="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  replace_na(list(Ex=0)) %>%
  mutate(Examined=Ex+`<NA>`) %>%
  mutate(Ratio=Ex/(Examined)*100) %>%
  select("Fiscal_Year", "Examined", "Ex", "Ratio") %>%
  print()

# Wild, Marine fishery foodstuffs
Table2_4 <- data_2012_2020_fish_ %>%
  filter(Farmed_Wild!="Farmed") %>%
  filter(Food_classfication!="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  replace_na(list(Ex=0)) %>%
  mutate(Examined=Ex+`<NA>`) %>%
  mutate(Ratio=Ex/(Examined)*100) %>%
  select("Fiscal_Year", "Examined", "Ex", "Ratio") %>%
  print()

rm(data_2012_2020_fish_)

Fig 1. The general foodsuffs examined from FY 2012 - 2021 and reported above the threshold value (100 Bq/kg)

# Data using Cs detection instruments reported, “Ge”, “CsI”, “NaI” and  “-,” were used for analysis.

Fig1 <- data_2012_2020_total_ %>%
  filter(Item!="Cattle meat" & !str_detect(その他,"全頭検査")) %>%
  filter(Item!="Cattle meat" & !str_detect(その他,"全島検査")) %>%
  filter(Fiscal_Year!="-") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  mutate(Total=Ex+`<NA>`) %>%
  mutate(Year_Rate=Total/sum(Total)*100) %>%
  mutate(Ex_Rate=Ex/Total*100) %>%
  print()
NA

Fig.3 Results of Cs concentration data analyzed for marine or fresh water products

Fig.3 (A)

# Data using Cs detection instrument reported, “Ge,” were used for analysis.

# Other fishery foodstuffs except freshwater fishery foodstuffs were defined as marine fishery foodstuffs.

# Samples marketed or non-marketed foodstuffs were summarized.

# "Marine products(freshwater)" are the freshwater fishery products.

# The foodstuffs that were marketed and produced for sales were counted.

Fig3_A <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market=="Market products") %>%
  filter(Food_classfication!="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  replace_na(list(Ex=0, `<NA>`=0)) %>%
  mutate(Inspect=Ex+`<NA>`) %>%
  rename(c(Market_Ex=Ex, Market_NA=`<NA>`, Market_Inspect=Inspect)) %>%
  mutate(Market_Rate=Market_Ex/Market_Inspect*100)
Fig3_A%>%
  select("Fiscal_Year", "Market_Ex", "Market_Inspect", "Market_Rate") %>% print()
NA

Fig.3 (B)

# Data using Cs detection instrument reported, “Ge,” were used for analysis.

# Other fishery foodstuffs except freshwater fishery foodstuffs were defined as marine fishery foodstuffs.

# "Marine products(freshwater)" are the freshwater fishery products.

# Wild or aquaculture fishery foodstuffs were counted.
Non_Market_0 <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market!="Market products") %>%
  filter(Food_classfication!="Marine_products(freshwater)") %>%
  count(Fiscal_Year) %>%
  rename(Total=n)
Non_Market <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market=="Non market products") %>%
  filter(Food_classfication!="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  rename(c(Non_Market_Ex=Ex, Non_Market_NA=`<NA>`))
For_Sales <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market=="Produce for sales") %>%
  filter(Food_classfication!="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  mutate(Ex=0) %>%
  rename(c(For_Sale_Ex=Ex, For_Sale_NA=`<NA>`))
Not_For_Sales <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market=="Produce not for sales") %>%
  filter(Food_classfication!="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  rename(c(Not_For_Sale_Ex=Ex, Not_For_Sale_NA=`<NA>`))
Fig3_B <- Non_Market_0 %>%
  merge(Non_Market, by="Fiscal_Year", all.x=T) %>%
  merge(For_Sales, by="Fiscal_Year", all.x=T) %>%
  merge(Not_For_Sales, by="Fiscal_Year", all.x=T) %>%
  replace_na(
    list(Non_Market_Ex=0, Non_Market_NA=0,
         For_Sale_Ex=0, For_Sale_NA=0,
         Not_For_Sale_Ex=0, Not_For_Sale_NA=0)
  ) %>%
  mutate(Non_Market_Inspect=Non_Market_Ex+Non_Market_NA,
         For_Sale_Inspect=For_Sale_Ex+For_Sale_NA,
         Not_For_Sale_Inspect=Not_For_Sale_Ex+Not_For_Sale_NA) %>%
  mutate(Rate=(Non_Market_Ex + For_Sale_Ex + Not_For_Sale_Ex)/Total*100)
Fig3_B %>%
  select("Fiscal_Year", "Non_Market_Ex", "Non_Market_Inspect",
                        "For_Sale_Ex", "For_Sale_Inspect",
                        "Not_For_Sale_Ex", "Not_For_Sale_Inspect",
                        "Rate","Total") %>% print()

rm(Non_Market_0, Non_Market, For_Sales, Not_For_Sales)

Fig.3 (C)

# Data using Cs detection instrument reported, “Ge,” were used for analysis.

# Freshwater fishery foodstuffs were summarized.

# Samples marketed or non-marketed foodstuffs were summarized.

# "Marine products(freshwater)" are the freshwater fishery products.

# The foodstuffs that were marketed and produced for sales were counted.
Fig3_C <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market=="Market products") %>%
  filter(Food_classfication=="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  replace_na(list(Ex=0, `<NA>`=0)) %>%
  mutate(Inspect=Ex+`<NA>`) %>%
  rename(c(Market_Ex=Ex, Market_NA=`<NA>`, Market_Inspect=Inspect)) %>%
  mutate(Market_Rate=Market_Ex/Market_Inspect*100)
Fig3_C %>%
  select("Fiscal_Year", "Market_Ex", "Market_Inspect", "Market_Rate") %>% print()
NA
NA

Fig.3 (D)

# Data using Cs detection instrument reported, “Ge,” were used for analysis.

# Freshwater fishery foodstuffs were summarized.

# "Marine products(freshwater)" are the freshwater fishery products.

# Wild or aquaculture fishery foodstuffs were counted.
Non_Market_0 <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market!="Market products") %>%
  filter(Food_classfication=="Marine_products(freshwater)") %>%
  count(Fiscal_Year) %>%
  rename(Total=n)
Non_Market <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market=="Non market products") %>%
  filter(Food_classfication=="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  rename(c(Non_Market_Ex=Ex, Non_Market_NA=`<NA>`))
For_Sales <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market=="Produce for sales") %>%
  filter(Food_classfication=="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  mutate(Ex=0) %>%
  rename(c(For_Sale_Ex=Ex, For_Sale_NA=`<NA>`))
Not_For_Sales <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge" & Category=="Fishery products") %>%
  filter(Market=="Produce not for sales") %>%
  filter(Food_classfication=="Marine_products(freshwater)") %>%
  count(Fiscal_Year, Exceed) %>%
  spread(Exceed, n) %>%
  rename(c(Not_For_Sale_Ex=Ex, Not_For_Sale_NA=`<NA>`))
Fig3_D <- Non_Market_0 %>%
  merge(Non_Market, by="Fiscal_Year", all.x=T) %>%
  merge(For_Sales, by="Fiscal_Year", all.x=T) %>%
  merge(Not_For_Sales, by="Fiscal_Year", all.x=T) %>%
  replace_na(
    list(Non_Market_Ex=0, Non_Market_NA=0,
         For_Sale_Ex=0, For_Sale_NA=0,
         Not_For_Sale_Ex=0, Not_For_Sale_NA=0)
  ) %>%
  mutate(Non_Market_Inspect=Non_Market_Ex+Non_Market_NA,
         For_Sale_Inspect=For_Sale_Ex+For_Sale_NA,
         Not_For_Sale_Inspect=Not_For_Sale_Ex+Not_For_Sale_NA) %>%
  mutate(Rate=(Non_Market_Ex + For_Sale_Ex + Not_For_Sale_Ex)/Total*100)
Fig3_D %>%
  select("Fiscal_Year", "Non_Market_Ex", "Non_Market_Inspect",
                   "For_Sale_Ex", "For_Sale_Inspect",
                   "Not_For_Sale_Ex", "Not_For_Sale_Inspect",
                   "Rate","Total") %>% print()

rm(Non_Market_0, Non_Market, For_Sales, Not_For_Sales)

fig.4 Comparison of the number of marine and fresh water foodstuffs having Cs detected and above the threshold concentration between year FY 2016 - 2021

# Data using Cs detection instrument reported, “Ge,” were used for analysis.

# "Marine products(freshwater)" are the freshwater fishery products.

data_2012_2020_fish_ <- data_2012_2020_total_ %>%
  filter(Inspection_instrument=="Ge") %>%
  filter(Category=="Fishery products" & !is.na(Fiscal_Year)) %>%
  mutate(
    Marine_Water = case_when(Food_classfication=="Marine_products(freshwater)" ~ "Freshwater",
                             Food_classfication!="Marine_products(freshwater)" ~ "Marine")
    ) %>%
  mutate(Period=case_when(
      Fiscal_Year==2012 | Fiscal_Year==2013 | Fiscal_Year==2014 | Fiscal_Year==2015 ~ "Early",
      Fiscal_Year==2016 | Fiscal_Year==2017 | Fiscal_Year==2018 | Fiscal_Year==2019 ~ "Middle",
      Fiscal_Year==2020 | Fiscal_Year==2021 ~ "Later",
      TRUE ~ "Others"
    )
  ) %>%
  mutate(Farmed_Wild=case_when(
      str_detect(品目名, "養殖") & !str_detect(その他, "養殖ではない") ~ "Farmed",
      str_detect(その他, "養殖") & !str_detect(その他, "養殖ではない") ~ "Farmed",
      !str_detect(その他, "養殖") | str_detect(その他, "養殖ではない") ~ "Wild",
      !str_detect(その他, "養殖") | str_detect(その他, "養殖ではない") ~ "Wild",
      TRUE ~ "Wild"
    )
  ) %>%
  mutate(Fresh_Farmed=case_when(
      Food_classfication=="Marine_products(freshwater)" & Farmed_Wild=="Wild" ~ "Freshwater, wild",
      Food_classfication!="Marine_products(freshwater)" & Farmed_Wild=="Wild" ~ "Marine, wild",
      Food_classfication=="Marine_products(freshwater)" & Farmed_Wild=="Farmed" ~ "Freshwater, aquaculture",
      Food_classfication!="Marine_products(freshwater)" & Farmed_Wild=="Farmed" ~ "Marine, aquaculture",
      TRUE ~ "-"
    )
  ) %>%
  mutate(Ex_Detect=case_when(
    Cs_total_fix>100 ~ "Ex",
    Cs_total_fix>25 ~ "Detect",
    !Cs_total_fix>100 ~ "ND"
  ))

data_Fishery_ <- data_2012_2020_fish_ %>% filter(Period!="Early")
data_Fishery_ %>%
  count(Fresh_Farmed) %>%
  rename(Examined=n) %>%
  merge(
    data_Fishery_ %>%
      filter(Cs_total_fix>25) %>%
      count(Fresh_Farmed) %>%
      rename(Detected=n),
    by="Fresh_Farmed", all.x = T
  ) %>%
  merge(
    data_Fishery_ %>%
      filter(Cs_total_fix>100) %>%
      count(Fresh_Farmed) %>%
      rename(Exceed=n),
    by="Fresh_Farmed", all.x = T
  ) %>%
  replace_na(list(Fresh_Farmed="Others", Examined=0, Detected=0, Exceed=0)) %>%
  mutate(Detect_Rate=Detected/Examined*100) %>%
  mutate(Ex_Rate=Exceed/Examined*100) %>%
  print()

rm(data_Fishery_, data_2012_2020_fish_)
LS0tCnRpdGxlOiAiUkkgYXJ0aWNsZSBtYWluIE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0KIyBNYWluIE5vdGVib29rIGlzIGhlcmUuCiMgaHR0cHM6Ly9kc3g1d2NvYnRoLmdpdGh1Yi5pby8yMDEyX3RvXzIwMjIvCgojIFN1cHBsZW1lbnRhcnkgTm90ZWJvb2sgaXMgaGVyZS4KIyBodHRwczovL2RzeDV3Y29idGguZ2l0aHViLmlvLzIwMTJfdG9fMjAyMi9SSV9hcnRpY2xlX3N1cHBsZW1lbnRhcnlfMjAyMjA3MTUubmIuaHRtbAoKIyBBbGwgc29yY2UgY29kZSBpcyBoZXJlLgojIGh0dHBzOi8vZ2l0aHViLmNvbS9EU3g1V2NPYnRoLzIwMTJfdG9fMjAyMgoKIyBUaGUgcmVjb21tZW5kZWQgIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB0byBydW4gdGhlIGNvZGUgaXMgYXMgZm9sbG93cy4KIyBPUyB2ZXJzaW9uIDogVWJ1bnR1MjAuMDQgb3IgbWFjT1MxMgojIFIgdmVyc2lvbiA6IDQuMC4zNC4wLjMKIyBSU3R1ZGlvIHZlcnNpb24gOiB2MS40LjE3MTcKIyB0aWR5dmVyc2UgdmVyc2lvbiA6IDEuMy4xCgpgYGAKCiMjIyBJbml0aWFsaXplZCBhbmQgbGlicmFyeSBsb2FkZWQuCmBgYHtyfQpvcHRpb25zKHdhcm49LTEpCiMgSW5pdGlhbGl6ZWQuCnJtKGxpc3Q9bHMoKSkKCiMgTGlicmFyeSBsb2FkZWQuCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShyZWFkcikKbGlicmFyeShvcGVueGxzeCkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KGZ1cnJyKQoKYGBgCgo8IS0tIOODh+ODvOOCv+iqreOBv+i+vOOBvyAtLT4KIyMjIERhdGEgbG9hZGVkLgpgYGB7cn0Kb3B0aW9ucyh3YXJuPS0xKQojIENTViBkYXRhIGxvYWRlZC4KZmRhdGEgPC0gYygKICAiLi9tZXJnZV9jc3YvMjAxMl9yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAxM19yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAxNF9yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAxNV9yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAxNl9yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAxN19yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAxOF9yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAxOV9yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAyMF8xX3JlcC5jc3YiCikKCiMgcGxhbihtdWx0aXNlc3Npb24sIHdvcmtlcnMgPSA4KSAKZGF0YV8yMDIwX2FsbF8xIDwtIGZ1cnJyOjpmdXR1cmVfbWFwX2RmcihmZGF0YSwgfiByZWFkcjo6cmVhZF9jc3YoLngsIGNvbF90eXBlcz1jb2xzKC5kZWZhdWx0ID0gImMiKSkpCnJtKGZkYXRhKQoKIyBkYXRhXzIwMjBfYWxsXzIgPC0gcmVhZHI6OnJlYWRfY3N2KCIuL21lcmdlX2Nzdi9jc3ZfYXJjaGl2ZS8yMDIwXzJfYXJjaGl2ZS5jc3YiLCBjb2xfdHlwZXM9Y29scyguZGVmYXVsdCA9ICJjIikpCmZkYXRhIDwtIGMoCiAgIi4vbWVyZ2VfY3N2LzIwMjBfMl9yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAyMV9yZXAuY3N2IiwKICAiLi9tZXJnZV9jc3YvMjAyMl9yZXAuY3N2IgoKKQpkYXRhXzIwMjBfYWxsXzIgPC0gZnVycnI6OmZ1dHVyZV9tYXBfZGZyKGZkYXRhLCB+IHJlYWRyOjpyZWFkX2NzdigueCwgY29sX3R5cGVzPWNvbHMoLmRlZmF1bHQgPSAiYyIpKSkKCiMgIk5vIiBjb2x1bW4gaW4gdGhlIGRhdGEgd2FzIGNvbnZlcnRlZCB0byBpbnRlZ2VyCmRhdGFfMjAyMF9hbGxfMVtjKCJObyIpXSA8LSBkYXRhXzIwMjBfYWxsXzFbYygiTm8iKV0gJT4lIGZ1cnJyOjpmdXR1cmVfbWFwKCB+IGFzLmludGVnZXIoLngpKQpkYXRhXzIwMjBfYWxsXzJbYygiTm8iKV0gPC0gZGF0YV8yMDIwX2FsbF8yW2MoIk5vIildICU+JSBmdXJycjo6ZnV0dXJlX21hcCggfiBhcy5pbnRlZ2VyKC54KSkKCmBgYAoKIyMgUHJlIHByb2Nlc3NpbmcKPCEtLSAyMDIwIDTmnIjku6XpmY0g6YCj57WQIOW/heimgeOCq+ODqeODoOaKveWHuiAtLT4KIyMjIyBEYXRhIGNvbmpvaW4gYW5kIENvbHVtbnMgc2VsZWN0CmBgYHtyfQpvcHRpb25zKHdhcm49LTEpCiMjIyMgSW5mb3JtYXRpb24gb24gUHJlZmVjdHVyZSB3YXMgbm90IHVzZWQgZHVlIHRvIGFzIGl0IGlzIGF0IGxvdyBkYXRhIHF1YWxpdHkuCmRhdGFfYWxsXzEgPC0gZGF0YV8yMDIwX2FsbF8xICU+JQogIHNlbGVjdCgKICAgICJObyIsICLpg73pgZPlupznnIwiLCAi5biC55S65p2RIiwgImFyZWEiLCAiTWFya2V0IiwKICAgICLpo5/lk4Hjgqvjg4bjgrTjg6oiLCAiQ2F0ZWdvcnkiLCAiQ2F0ZWdvcnlfMiIsCiAgICAi5ZOB55uu5ZCNIiwgIkl0ZW0iLCAi44Gd44Gu5LuWIiwgIk90aGVycyIsCiAgICAi6aOf5ZOB5YiG6aGeIiwgIkZvb2RfY2xhc3NmaWNhdGlvbiIsCiAgICAiSW5zcGVjdGlvbl9pbnN0cnVtZW50IiwKICAgICJTYW1wbGluZ19EYXRlIiwgIlNhbXBsaW5nX0RhdGVfZml4IiwKICAgICJSZXN1bHRzX09idGFpbmVkX0RhdGUiLCAiUmVzdWx0X0RhdGVfZml4IiwKICAgICJQcmVzc19SZWxlYXNlX0RhdGUiLCAiUHJlc3NfUmVsZWFzZV9EYXRlX2ZpeCIsCiAgICAiU2FtcGxpbmdfWWVhciIsICJSZXN1bHRfWWVhciIsICJQcmVzc19SZWxlYXNlX1llYXIiLCAiRmlsZV9ZZWFyIiwKICAgICJDZXNpdW1fMTM0IiwgIkNzXzEzNF9maXgiLCAiQ3NfMTM0X05EIiwKICAgICJDZXNpdW1fMTM3IiwgIkNzXzEzN19maXgiLCAiQ3NfMTM3X05EIiwKICAgICJDZXNpdW1fdG90YWwiLCAiQ3NfdG90YWxfZml4IiwgIkNzX3RvdGFsX05EIiwgImV4Y2VlZF9hY3Rpb25fbGV2ZWxzIikKZGF0YV9hbGxfMiA8LSBkYXRhXzIwMjBfYWxsXzIgJT4lCiAgc2VsZWN0KAogICAgIk5vIiwgIumDvemBk+W6nOecjCIsICLluILnlLrmnZEiLCAiYXJlYSIsICJNYXJrZXQiLAogICAgIumjn+WTgeOCq+ODhuOCtOODqiIsICJDYXRlZ29yeSIsICJDYXRlZ29yeV8yIiwKICAgICLlk4Hnm67lkI0iLCAiSXRlbSIsICLppIrmrpZf5aSp54S2IiwgIkZhcm1lZF9XaWxkIiwKICAgICLpo5/lk4HliIbpoZ4iLCAgIkZvb2RfY2xhc3NmaWNhdGlvbiIsCiAgICAiSW5zcGVjdGlvbl9pbnN0cnVtZW50IiwKICAgICJTYW1wbGluZ19EYXRlIiwgIlNhbXBsaW5nX0RhdGVfZml4IiwKICAgICJSZXN1bHRzX09idGFpbmVkX0RhdGUiLCAiUmVzdWx0X0RhdGVfZml4IiwKICAgICJQcmVzc19SZWxlYXNlX0RhdGUiLCAiUHJlc3NfUmVsZWFzZV9EYXRlX2ZpeCIsCiAgICAiU2FtcGxpbmdfWWVhciIsICJSZXN1bHRfWWVhciIsICJQcmVzc19SZWxlYXNlX1llYXIiLCAiRmlsZV9ZZWFyIiwKICAgICJDZXNpdW1fMTM0IiwgIkNzXzEzNF9maXgiLCAiQ3NfMTM0X05EIiwKICAgICJDZXNpdW1fMTM3IiwgIkNzXzEzN19maXgiLCAiQ3NfMTM3X05EIiwKICAgICJDZXNpdW1fdG90YWwiLCAiQ3NfdG90YWxfZml4IiwgIkNzX3RvdGFsX05EIiwgImV4Y2VlZF9hY3Rpb25fbGV2ZWxzIikKY29sbmFtZXMoZGF0YV9hbGxfMikgPC0gYygiTm8iLCAi6YO96YGT5bqc55yMIiwgIuW4gueUuuadkSIsICJhcmVhIiwgIk1hcmtldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIumjn+WTgeOCq+ODhuOCtOODqiIsICJDYXRlZ29yeSIsICJDYXRlZ29yeV8yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAi5ZOB55uu5ZCNIiwgIkl0ZW0iLCAi44Gd44Gu5LuWIiwgIk90aGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIumjn+WTgeWIhumhniIsICJGb29kX2NsYXNzZmljYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJJbnNwZWN0aW9uX2luc3RydW1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGluZ19EYXRlIiwgIlNhbXBsaW5nX0RhdGVfZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzdWx0c19PYnRhaW5lZF9EYXRlIiwgIlJlc3VsdF9EYXRlX2ZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZXNzX1JlbGVhc2VfRGF0ZSIsICJQcmVzc19SZWxlYXNlX0RhdGVfZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxpbmdfWWVhciIsICJSZXN1bHRfWWVhciIsICJQcmVzc19SZWxlYXNlX1llYXIiLCAiRmlsZV9ZZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2VzaXVtXzEzNCIsICJDc18xMzRfZml4IiwgIkNzXzEzNF9ORCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlc2l1bV8xMzciLCAiQ3NfMTM3X2ZpeCIsICJDc18xMzdfTkQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJDZXNpdW1fdG90YWwiLCAiQ3NfdG90YWxfZml4IiwgIkNzX3RvdGFsX05EIiwgImV4Y2VlZF9hY3Rpb25fbGV2ZWxzIikKCmRhdGFfYWxsXyA8LSByYmluZChkYXRhX2FsbF8xLCBkYXRhX2FsbF8yKQpybShkYXRhXzIwMjBfYWxsXzEsIGRhdGFfMjAyMF9hbGxfMikKcm0oZGF0YV9hbGxfMSwgZGF0YV9hbGxfMikKCgpgYGAKCgo8IS0tIOODh+ODvOOCv+OCr+ODquODvOODi+ODs+OCsCwg44Kr44Op44Og6L+95YqgIOOBiuOCiOOBsyDlnovlpInmj5sgLS0+CiMjIyMgRGF0YSBDbGVhbmluZyAsIENvbHVtbnMgYWRkIGFuZCBUeXBlIGNvbnZlcnNpb24KYGBge3J9Cm9wdGlvbnMod2Fybj0tMSkKZGF0YV8yMDEyXzIwMjBfZml4XyA8LSBkYXRhX2FsbF8KZGF0YV8yMDEyXzIwMjBfZml4XyA8LSBkYXRhXzIwMTJfMjAyMF9maXhfICU+JSBkcm9wX25hKE5vKQoKIyBNYXJrZXQgY29sdW1uIGRhdGEgY2xlYW5lZC4KdHh0X3BhdHRlcm4gPC0gYygiLXzigJUiKQp0eHRfcmVwbGFjZSA8LSBjKCJOb3QgYXBwbGljYWJsZSIpCmRhdGFfMjAxMl8yMDIwX2ZpeF8kTWFya2V0IDwtIHB1cnJyOjpyZWR1Y2UyKHR4dF9wYXR0ZXJuLCB0eHRfcmVwbGFjZSwgLmluaXQ9ZGF0YV8yMDEyXzIwMjBfZml4XyRNYXJrZXQsIHN0cl9yZXBsYWNlKQoKIyBVbmRlZmluZWQgZGF0YSBpbiBmb29kIGNhdGVnb3J5IHdhcyBjaGFuZ2VkIHRvIOKAnG90aGVyc+KAnSBhbmQgcmVjYXRlZ29yaXplZCBhcyAibm90IGFwcGxpY2FibGUuIgp0eHRfcGF0dGVybiA8LSBjKCJPdGhlcnMiKQp0eHRfcmVwbGFjZSA8LSBjKCJOb3QgYXBwbGljYWJsZSIpCmRhdGFfMjAxMl8yMDIwX2ZpeF8kQ2F0ZWdvcnkgPC0gcHVycnI6OnJlZHVjZTIodHh0X3BhdHRlcm4sIHR4dF9yZXBsYWNlLCAuaW5pdD1kYXRhXzIwMTJfMjAyMF9maXhfJENhdGVnb3J5LCBzdHJfcmVwbGFjZSkKZGF0YV8yMDEyXzIwMjBfZml4XyRDYXRlZ29yeSA8LSBkYXRhXzIwMTJfMjAyMF9maXhfJENhdGVnb3J5ICU+JSBzdHJfdHJpbSgpCgojICJTYW1wbGluZ19EYXRlX2ZpeCIsICJSZXN1bHRfRGF0ZV9maXgiIGFuZCAiUHJlc3NfUmVsZWFzZV9EYXRlX2ZpeCIgY29sdW1ucyB3ZXJlIGNyZWF0ZWQgdXNpbmcgdGhlIGRhdGEgaW4gIlNhbXBsaW5nX0RhdGUiLCAiUmVzdWx0X0RhdGUiIGFuZCAiUHJlc3NfUmVsZWFzZV9EYXRlIiBjb2x1bW5zLCBhbmQgdGhlIGRhdGUgZm9ybWF0IHdlcmUgZml4ZWQuCnR4dF9wYXR0ZXJuIDwtIGMoIuW5tHzmnIgiKQp0eHRfcmVwbGFjZSA8LSBjKCItIikKY29sdW1uX2ZpeCA8LSBjKCJTYW1wbGluZ19EYXRlX2ZpeCIsICJSZXN1bHRfRGF0ZV9maXgiLCAiUHJlc3NfUmVsZWFzZV9EYXRlX2ZpeCIpCmRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSA8LSBkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gJT4lCiAgc2FwcGx5KGZ1bmN0aW9uKHgpIHt4ICU+JSBzdHJfcmVwbGFjZSh0eHRfcGF0dGVybiwgdHh0X3JlcGxhY2UpfSkKCnR4dF9wYXR0ZXJuIDwtIGMoIi0kIikKdHh0X3JlcGxhY2UgPC0gYygiLTAxIikKZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSAlPiUKICBzYXBwbHkoZnVuY3Rpb24oeCkge3ggJT4lIHN0cl9yZXBsYWNlKHR4dF9wYXR0ZXJuLCB0eHRfcmVwbGFjZSl9KQoKdHh0X3BhdHRlcm4gPC0gYygiXi0wMSIpCnR4dF9yZXBsYWNlIDwtIGMoIi0iKQpkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdICU+JQogIHNhcHBseShmdW5jdGlvbih4KSB7eCAlPiUgc3RyX3JlcGxhY2UodHh0X3BhdHRlcm4sIHR4dF9yZXBsYWNlKX0pCgpjb2x1bW5fZml4IDwtIGMoIlNhbXBsaW5nX0RhdGVfZml4IiwgIlJlc3VsdF9EYXRlX2ZpeCIsICJQcmVzc19SZWxlYXNlX0RhdGVfZml4IikKZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSAlPiUKICBzYXBwbHkoZnVuY3Rpb24oeCkge3ggJT4lIHN0cl9zdWIoc3RhcnQ9MSwgZW5kPTEwKX0pCgojIFNhbXBsaW5nX1llYXIgZGF0YSB3ZXJlIGNsZWFuZWQuCnR4dF9wYXR0ZXJuIDwtIGMoIi1877yNfOKAlXzjgIB8IHwtfOKAlXziiJJ84pSAfO+8jXxuYW585LiN5piOIikKdHh0X3JlcGxhY2UgPC0gYygiLSIpCmNvbHVtbl9maXggPC0gYygiU2FtcGxpbmdfWWVhciIpCmRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSA8LSBkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gJT4lCiAgc2FwcGx5KGZ1bmN0aW9uKHgpIHt4ICU+JSBzdHJfcmVwbGFjZSh0eHRfcGF0dGVybiwgdHh0X3JlcGxhY2UpfSkKCiMgU2FtcGxpbmdfWWVhciBkYXRhIHdlcmUgY2xlYW5lZC4KdHh0X3BhdHRlcm4gPC0gYygiLXzvvI184oCVfOOAgHwgfC184oCVfOKIknzilIB877yNfG5hbnzkuI3mmI4iKQp0eHRfcmVwbGFjZSA8LSBjKCItIikKY29sdW1uX2ZpeCA8LSBjKCJTYW1wbGluZ19ZZWFyIikKZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSAlPiUKICBzYXBwbHkoZnVuY3Rpb24oeCkge3ggJT4lIHN0cl9yZXBsYWNlKHR4dF9wYXR0ZXJuLCB0eHRfcmVwbGFjZSl9KQoKIyBJbnNwZWN0aW9uX2luc3RydW1lbnQgZGF0YSB3ZXJlIGNsZWFuZWQuCmNvbHVtbl9maXggPC0gYygiSW5zcGVjdGlvbl9pbnN0cnVtZW50IikKZGF0YV8yMDEyXzIwMjBfZml4X1tbY29sdW1uX2ZpeF1dIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bW2NvbHVtbl9maXhdXSAlPiUKICBzYXBwbHkoZnVuY3Rpb24oeCkge3ggJT4lIHN0cl90cmltKCkgJT4lIHN0cl90cnVuYygyLCAicmlnaHQiLCBlbGxpcHNpcz0iIil9KQoKdHh0X3BhdHRlcm5fMSA8LSBjKCJeTi4qIikKdHh0X3BhdHRlcm5fMiA8LSBjKCJe77yuLioiKQp0eHRfcmVwbGFjZSA8LSBjKCJOYUkiKQpkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdICU+JQogIHNhcHBseShmdW5jdGlvbih4KSB7eCAlPiUgc3RyX3JlcGxhY2UodHh0X3BhdHRlcm5fMSAsIHR4dF9yZXBsYWNlKX0pCmRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSA8LSBkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gJT4lCiAgc2FwcGx5KGZ1bmN0aW9uKHgpIHt4ICU+JSBzdHJfcmVwbGFjZSh0eHRfcGF0dGVybl8yICwgdHh0X3JlcGxhY2UpfSkKCnR4dF9wYXR0ZXJuXzEgPC0gIl5HLioiCnR4dF9wYXR0ZXJuXzIgPC0gIl7vvKcuKiIKdHh0X3JlcGxhY2UgPC0gIkdlIgpkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdICU+JQogIHNhcHBseShmdW5jdGlvbih4KSB7eCAlPiUgc3RyX3JlcGxhY2UodHh0X3BhdHRlcm5fMSAsIHR4dF9yZXBsYWNlKX0pCmRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSA8LSBkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gJT4lCiAgc2FwcGx5KGZ1bmN0aW9uKHgpIHt4ICU+JSBzdHJfcmVwbGFjZSh0eHRfcGF0dGVybl8yICwgdHh0X3JlcGxhY2UpfSkKCnR4dF9wYXR0ZXJuXzEgPC0gYygiXu+8oy4qIikKdHh0X3BhdHRlcm5fMiA8LSBjKCJeQy4qIikKdHh0X3JlcGxhY2UgPC0gIkNzSSIKZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSAlPiUKICBzYXBwbHkoZnVuY3Rpb24oeCkge3ggJT4lIHN0cl9yZXBsYWNlKHR4dF9wYXR0ZXJuXzEgLCB0eHRfcmVwbGFjZSl9KQpkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdICU+JQogIHNhcHBseShmdW5jdGlvbih4KSB7eCAlPiUgc3RyX3JlcGxhY2UodHh0X3BhdHRlcm5fMiAsIHR4dF9yZXBsYWNlKX0pCgojIERhdGEgaW4g4oCcQ2VzaXVtX3RvdGFs4oCdIHdlcmUgY2xlYW5lZCwgYW5kIHRoZSBmaXhlZCBkYXRhIHdlcmUgc2F2ZWQgaW4g4oCcQ3NfdG90YWxfZml4IGRhdGHigJ0gY29sdW1uLgpkYXRhXzIwMTJfMjAyMF9maXhfIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF8gJT4lCiAgbXV0YXRlKAogICAgQ3NfZml4PWNhc2Vfd2hlbigKICAgICAgQ2VzaXVtXzEzND09IjwuMDU5OCIgfiAiMDU5OCIsCiAgICAgIFRSVUUgfiBDc18xMzRfZml4CiAgICApCiAgKQpkYXRhXzIwMTJfMjAyMF9maXhfWyJDc18xMzRfZml4Il0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1siQ3NfZml4Il0KZGF0YV8yMDEyXzIwMjBfZml4XyA8LSBkYXRhXzIwMTJfMjAyMF9maXhfICU+JQogIG11dGF0ZSgKICAgIENzX2ZpeD1jYXNlX3doZW4oCiAgICAgIENlc2l1bV8xMzc9PSI8Ljg4MSIgfiAiMC44ODEiLAogICAgICBDZXNpdW1fMTM3PT0iPC4xMiIgfiAiMC4xMiIsCiAgICAgIENlc2l1bV8xMzc9PSI8XFwuMDQ0MSIgfiAiMC4wNDQxIiwKICAgICAgVFJVRSB+IENzXzEzN19maXgKICAgICkKICApCmRhdGFfMjAxMl8yMDIwX2ZpeF9bIkNzXzEzN19maXgiXSA8LSBkYXRhXzIwMTJfMjAyMF9maXhfWyJDc19maXgiXQpkYXRhXzIwMTJfMjAyMF9maXhfIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF8gJT4lCiAgbXV0YXRlKAogICAgQ3NfZml4PWNhc2Vfd2hlbigKICAgICAgQ2VzaXVtX3RvdGFsPT0iPDE2NCIgfiAiMTYuNCIsCiAgICAgIENlc2l1bV90b3RhbD09Il4wJCIgfiAiMjUiLAogICAgICBUUlVFIH4gQ3NfdG90YWxfZml4CiAgICApCiAgKQpkYXRhXzIwMTJfMjAyMF9maXhfWyJDc190b3RhbF9maXgiXSA8LSBkYXRhXzIwMTJfMjAyMF9maXhfWyJDc19maXgiXQoKdHh0X3BhdHRlcm4gPC0gYygiXjAuMCQiKQp0eHRfcmVwbGFjZSA8LSBjKCJOb3REZXRlY3RlZCIpCmNvbHVtbl9maXggPC0gYygiQ3NfdG90YWxfTkQiKQpkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdICU+JQogIHNhcHBseShmdW5jdGlvbih4KSB7eCAlPiUgc3RyX3JlcGxhY2UodHh0X3BhdHRlcm4sIHR4dF9yZXBsYWNlKX0pCgp0eHRfcGF0dGVybiA8LSBjKCI8XFwufDxcXC58XlxcLnxcXCd8XFxufFxcKnxcXC4kfE5cXC5EXFwufFxcKHxcXCl877yIfO+8iXxeXFwufFxcLiQiKQpkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdICU+JQogIHNhcHBseShmdW5jdGlvbih4KSB7eCAlPiUgc3RyX3JlbW92ZSh0eHRfcGF0dGVybil9KQoKdHh0X3BhdHRlcm4gPC0gYygiwrEiKQp0eHRfcmVwbGFjZSA8LSBjKCIgICAgICAgICAgIikKY29sdW1uX2ZpeCA8LSBjKCJDc18xMzRfZml4IiwgIkNzXzEzN19maXgiLCAiQ3NfdG90YWxfZml4IikKZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSAlPiUKICBzYXBwbHkoZnVuY3Rpb24oeCkge3ggJT4lCiAgICAgIHN0cl9yZXBsYWNlKHR4dF9wYXR0ZXJuLCB0eHRfcmVwbGFjZSkgJT4lIHN0cl9zdWIoc3RhcnQ9MSwgZW5kPTYpfSkKCnR4dF9wYXR0ZXJuIDwtIGMoIlxcLlxcLnwsfO+8jnxcXC4sfCxcXC4iKQp0eHRfcmVwbGFjZSA8LSBjKCIuIikKY29sdW1uX2ZpeCA8LSBjKCJDc18xMzRfZml4IiwgIkNzXzEzN19maXgiLCAiQ3NfdG90YWxfZml4IikKZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSAlPiUKICBzYXBwbHkoZnVuY3Rpb24oeCkge3ggJT4lIHN0cl9yZXBsYWNlKHR4dF9wYXR0ZXJuLCB0eHRfcmVwbGFjZSl9KQoKIyBDcyB2YWx1ZXMgd2VyZSBjb252ZXJ0ZWQgdG8gbnVtZXJpYyBkYXRhLgpjb2x1bW5fZml4IDwtIGMoIkNzXzEzNF9maXgiLCAiQ3NfMTM3X2ZpeCIsICJDc190b3RhbF9maXgiKQpkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdICU+JQogIHNhcHBseShmdW5jdGlvbih4KSB7eCAlPiUgc3RyX3RyaW0oKSAlPiUgYXMubnVtZXJpYygpfSkKCgoKIyBPdmVyIEpNTCB3YXMgZGV0ZXJtaW5lZCBmcm9tIENzIHZhbHVlcy4KZGF0YV8yMDEyXzIwMjBfZml4XyA8LSBkYXRhXzIwMTJfMjAyMF9maXhfICU+JQogIG11dGF0ZSgKICAgIEV4Y2VlZD1jYXNlX3doZW4oCiAgICAgIENhdGVnb3J5XzIgJWluJSAiR2VuZXJhbCBmb29kcyIgJiBDc190b3RhbF9ORD09IkRldGVjdGVkIiAmIENzX3RvdGFsX2ZpeD4xMDAgfiAiRXgiLAogICAgICBDYXRlZ29yeV8yICVpbiUgIk1pbGssIGluZmFudCBmb29kcyIgJiBDc190b3RhbF9ORD09IkRldGVjdGVkIiAmIENzX3RvdGFsX2ZpeD41MCB+ICJFeCIsCiAgICAgIENhdGVnb3J5XzIgJWluJSAiRHJpbmtpbmcgd2F0ZXIiICYgQ3NfdG90YWxfTkQ9PSJEZXRlY3RlZCIgJiBDc190b3RhbF9maXg+MTAgfiAiRXgiCiAgICAgICkKICAgICkKCiMgQ3MgZGV0ZWN0aW9uIHdhcyBkZXRlcm1pbmVkIGZyb20gQ3MgdmFsdWVzLgpkYXRhXzIwMTJfMjAyMF9maXhfIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF8gJT4lCiAgbXV0YXRlKAogICAgR2VuZV9mb29kX05EPWNhc2Vfd2hlbigKICAgICAgQ2F0ZWdvcnlfMiAlaW4lICJHZW5lcmFsIGZvb2RzIiAmIENzX3RvdGFsX2ZpeD4yNSB+ICJEZXRlY3RlZCIsCiAgICAgIENhdGVnb3J5XzIgJWluJSAiR2VuZXJhbCBmb29kcyIgJiAhQ3NfdG90YWxfZml4PjI1IH4gIk5vdERldGVjdGVkIiwKICAgICAgQ2F0ZWdvcnlfMiAlaW4lICJNaWxrLCBpbmZhbnQgZm9vZHMiICYgQ3NfdG90YWxfZml4PjI1IH4gIkRldGVjdGVkIiwKICAgICAgQ2F0ZWdvcnlfMiAlaW4lICJNaWxrLCBpbmZhbnQgZm9vZHMiICYgIUNzX3RvdGFsX2ZpeD4yNSB+ICJOb3REZXRlY3RlZCIsCiAgICAgIENhdGVnb3J5XzIgJWluJSAiRHJpbmtpbmcgd2F0ZXIiICYgQ3NfdG90YWxfZml4PjEwIH4gIkRldGVjdGVkIiwKICAgICAgQ2F0ZWdvcnlfMiAlaW4lICJEcmlua2luZyB3YXRlciIgJiAhQ3NfdG90YWxfZml4PjEwIH4gIk5vdERldGVjdGVkIiwKICAgICAgaXMubmEoQ3NfdG90YWxfZml4KSB+ICJOb3REZXRlY3RlZCIKICAgICAgKQogICAgKQoKZGF0YV8yMDEyXzIwMjBfZml4XyA8LSBkYXRhXzIwMTJfMjAyMF9maXhfICU+JQogIG11dGF0ZSgKICAgIENzX2NvbmRpdGlvbj1jYXNlX3doZW4oCiAgICAgIENzX3RvdGFsX2ZpeD4xMDAgfiAiV2FybmluZyIsIAogICAgICBDc190b3RhbF9maXg+NTAgfiAiQ2F1dGlvbiIsIAogICAgICBDc190b3RhbF9maXg+MjUgfiAiTm90aWNlIiwgCiAgICAgIENzX3RvdGFsX2ZpeDw9MjUgfiAiSW5mbyIsIAogICAgICBpcy5uYShDc190b3RhbF9maXgpIH4gIk5vRGF0YSIKICAgICAgKQogICAgKQoKIyBUaGUgZGF0YSBpbiDigJxleGNlZWRfYWN0aW9uX2xldmVsc+KAnSBjb2x1bW4gd2VyZSBjaGFuZ2VkIHRvIOKAnFRSVUXigJ0gd2hlbiBvdmVyIEpNTC4KdHh0X3BhdHRlcm4gPC0gYygiMSIpCnR4dF9yZXBsYWNlIDwtIGMoIlRSVUUiKQpjb2x1bW5fZml4IDwtIGMoImV4Y2VlZF9hY3Rpb25fbGV2ZWxzIikKZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSAlPiUKICBzYXBwbHkoZnVuY3Rpb24oeCkge3ggJT4lIHN0cl9yZXBsYWNlKHR4dF9wYXR0ZXJuLCB0eHRfcmVwbGFjZSl9KQoKIyBEYXRhIGluICJjaGFyYWN0ZXIiIHR5cGUgd2VyZSBjb252ZXJ0ZWQgaW50byAiZmFjdG9yIiB0eXBlLgpjb2x1bW5fZml4IDwtIGMoCiAgIyAiUHJlZmVjdHVyZSIsICJNYXJrZXQiLCAiSW5zcGVjdGlvbl9pbnN0cnVtZW50IiwKICAiTWFya2V0IiwgIkluc3BlY3Rpb25faW5zdHJ1bWVudCIsCiAgIkNhdGVnb3J5IiwgIkNhdGVnb3J5XzIiLCAiRm9vZF9jbGFzc2ZpY2F0aW9uIiwKICAiQ3NfMTM0X05EIiwgIkNzXzEzN19ORCIsICJDc190b3RhbF9ORCIsICJDc19jb25kaXRpb24iLAogICJleGNlZWRfYWN0aW9uX2xldmVscyIsICJFeGNlZWQiLAogICJTYW1wbGluZ19ZZWFyIiwgIlJlc3VsdF9ZZWFyIiwgIlByZXNzX1JlbGVhc2VfWWVhciIsCiAgIkZpbGVfWWVhciIKKQoKZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdIDwtIGRhdGFfMjAxMl8yMDIwX2ZpeF9bLCBjb2x1bW5fZml4XSAlPiUKICBsYXBwbHkoYXMuZmFjdG9yKSAlPiUgZGF0YS5mcmFtZSgpCgpjb2x1bW5fZml4IDwtIGMoIlNhbXBsaW5nX0RhdGVfZml4IiwKICAgICAgICAgICAgICAgICJSZXN1bHRfRGF0ZV9maXgiLAogICAgICAgICAgICAgICAgIlByZXNzX1JlbGVhc2VfRGF0ZV9maXgiKQpkYXRhXzIwMTJfMjAyMF9maXhfWywgY29sdW1uX2ZpeF0gPC0gZGF0YV8yMDEyXzIwMjBfZml4X1ssIGNvbHVtbl9maXhdICU+JQogIGxhcHBseShmdW5jdGlvbih4KSB7eCAlPiUgYXMuRGF0ZSgpfSkKCiMgUHJlZmVjdHVyZSB0cmFuc2xhdGUgZW5nbGlzaC4KZGF0YV8yMDEyXzIwMjBfZml4XyA8LSBkYXRhXzIwMTJfMjAyMF9maXhfICU+JSBtZXJnZShyZWFkcjo6cmVhZF9jc3YoIi4vY3N2L1ByZWZlY3R1cmVfZW5nbGlzaC5jc3YiKSwgYnk9IumDvemBk+W6nOecjCIsIGFsbC54ID0gVCkKCiMgRGF0YSBmcm9tICJTYW1wbGluZ19ZZWFyIiB3ZXJlIGJhc2ljYWxseSB1c2VkLiBPdGhlcndpc2UsICJSZXN1bHRfWWVhciwiICJQcmVzc19SZWxlYXNlX1llYXIsIiBvciB5ZWFyIHJlY29yZGVkIHRvIHNhdmUgdGhlIGRhdGEgZmlsZSwgCmRhdGFfMjAxMl8yMDIwX3RvdGFsXyA8LSBkYXRhXzIwMTJfMjAyMF9maXhfICU+JQogIG11dGF0ZShJbnRlZ3JhdGlvbl9ZZWFyPWNhc2Vfd2hlbigKICAgICAgICAgU2FtcGxpbmdfWWVhcj09IjIwMTIiIHwgU2FtcGxpbmdfWWVhcj09IjIwMTMiIHwgU2FtcGxpbmdfWWVhcj09IjIwMTQiIHwKICAgICAgICAgU2FtcGxpbmdfWWVhcj09IjIwMTUiIHwgU2FtcGxpbmdfWWVhcj09IjIwMTYiIHwgU2FtcGxpbmdfWWVhcj09IjIwMTciIHwKICAgICAgICAgU2FtcGxpbmdfWWVhcj09IjIwMTgiIHwgU2FtcGxpbmdfWWVhcj09IjIwMTkiIHwgU2FtcGxpbmdfWWVhcj09IjIwMjAiIHwKICAgICAgICAgU2FtcGxpbmdfWWVhcj09IjIwMjEiIHwgU2FtcGxpbmdfWWVhcj09IjIwMjIiIH4gU2FtcGxpbmdfWWVhciwKICAgICAgICAgU2FtcGxpbmdfWWVhciE9IjIwMTIiICYgU2FtcGxpbmdfWWVhciE9IjIwMTMiICYgU2FtcGxpbmdfWWVhciE9IjIwMTQiICYKICAgICAgICAgU2FtcGxpbmdfWWVhciE9IjIwMTUiICYgU2FtcGxpbmdfWWVhciE9IjIwMTYiICYgU2FtcGxpbmdfWWVhciE9IjIwMTciICYKICAgICAgICAgU2FtcGxpbmdfWWVhciE9IjIwMTgiICYgU2FtcGxpbmdfWWVhciE9IjIwMTkiICYgU2FtcGxpbmdfWWVhciE9IjIwMjAiICYKICAgICAgICAgU2FtcGxpbmdfWWVhciE9IjIwMjEiICYgU2FtcGxpbmdfWWVhciE9IjIwMjIiICYgIWlzLm5hKFJlc3VsdF9ZZWFyKSB+IFJlc3VsdF9ZZWFyLAogICAgICAgICBUUlVFIH4gRmlsZV9ZZWFyCiAgICAgICAgICApIAogICkKCiMgVHJhbnNsYXRpb24gbWlzdGFrZXMgZnJvbSBKYXBhbmVzZSB0byBFbmdsaXNoIHdlcmUgY29ycmVjdGVkLgpkYXRhX0Zpc2hlcnlfIDwtIGRhdGFfMjAxMl8yMDIwX3RvdGFsXyAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnk9PSJGaXNoZXJ5IHByb2R1Y3RzIikKZGF0YV9GaXNoZXJ5XyRJdGVtIDwtIGRhdGFfRmlzaGVyeV8kSXRlbSAlPiUKICBzdHJfcmVwbGFjZShwYXR0ZXJuPSJKYXBhbmVzZSBwZXJzaW1tb24iLCByZXBsYWNlbWVudD0iT3lzdGVyIikKZGF0YV9GaXNoZXJ5XyRGb29kX2NsYXNzZmljYXRpb24gPC0gZGF0YV9GaXNoZXJ5XyRGb29kX2NsYXNzZmljYXRpb24gJT4lCiAgc3RyX3JlcGxhY2UocGF0dGVybj0iRnJ1aXRzX2luY2x1ZGluZ19udXRzIiwgcmVwbGFjZW1lbnQ9Ik1hcmluZV9wcm9kdWN0cyhpbnZlcnRlYnJhdGUpIikKZGF0YV9GaXNoZXJ5XyTpo5/lk4HliIbpoZ4gPC0gZGF0YV9GaXNoZXJ5XyTpo5/lk4HliIbpoZ4gJT4lCiAgc3RyX3JlcGxhY2UocGF0dGVybj0i5p6c5a6f6aGe77yI56iu5a6f6aGe5ZCr44KA77yJIiwgcmVwbGFjZW1lbnQ9IuawtOeUo+eJqSjnhKHohIrmpI4pIikKZGF0YV9Ob3RGaXNoZXJ5XyA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lIGZpbHRlcihDYXRlZ29yeSE9IkZpc2hlcnkgcHJvZHVjdHMiKQpkYXRhXzIwMTJfMjAyMF90b3RhbF8gPC0gZGF0YV9GaXNoZXJ5XyAlPiUgcmJpbmQoZGF0YV9Ob3RGaXNoZXJ5XykKcm0oZGF0YV9GaXNoZXJ5XywgZGF0YV9Ob3RGaXNoZXJ5XykKCiMgRm9vZCBjbGFzc2ZpY2F0aW9uIHRvIOKAnE5vX0RhdGHigJ0gYW5kIOKAnENvbmZpcm1pbmfigJ0gd2FzIGNvcnJlY3RlZCBhbmQgZ3JvdXBlZCBpbnRvICJPdGhlciIuCmRhdGFfT3RoZXJzXyA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgZmlsdGVyKGlzLm5hKEZvb2RfY2xhc3NmaWNhdGlvbikgfCBGb29kX2NsYXNzZmljYXRpb249PSJOb19EYXRhIiB8IEZvb2RfY2xhc3NmaWNhdGlvbj09IkNvbmZpcm1pbmciKQpkYXRhX090aGVyc18kRm9vZF9jbGFzc2ZpY2F0aW9uIDwtICJPdGhlciIKCmRhdGFfTm90T3RoZXJzXyA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgZmlsdGVyKCFpcy5uYShGb29kX2NsYXNzZmljYXRpb24pICYgRm9vZF9jbGFzc2ZpY2F0aW9uIT0iTm9fRGF0YSIgJiBGb29kX2NsYXNzZmljYXRpb24hPSJDb25maXJtaW5nIikKZGF0YV8yMDEyXzIwMjBfdG90YWxfIDwtIGRhdGFfT3RoZXJzXyAlPiUgcmJpbmQoZGF0YV9Ob3RPdGhlcnNfKQpybShkYXRhX090aGVyc18sIGRhdGFfTm90T3RoZXJzXykKCmRhdGFfMjAxMl8yMDIwX3RvdGFsXyTpo5/lk4HliIbpoZ4gPC0gZGF0YV8yMDEyXzIwMjBfdG90YWxfJOmjn+WTgeWIhumhniAlPiUKICBzdHJfcmVwbGFjZShwYXR0ZXJuPSLoqbLlvZPjgarjgZciLCByZXBsYWNlbWVudD0i44Gd44Gu5LuWIikKCmRhdGFfRmlzY2FsX1llYXJfIDwtIGRhdGFfMjAxMl8yMDIwX3RvdGFsXyAlPiUKICBtdXRhdGUoWWVhcl9Nb250aD1zdHJfc3ViKFNhbXBsaW5nX0RhdGUsIHN0YXJ0ID0gMSwgZW5kID0gOCkpICU+JQogIG1lcmdlKAogICAgcmVhZHI6OnJlYWRfY3N2KCIuL2Nzdi9TYW1wbGluZ19ZZWFyX01vbnRoLmNzdiIgKVtjKCJZZWFyX01vbnRoIiwgIkZpc2NhbF9ZZWFyIiwgIk1vbnRoIildLAogICAgYnk9IlllYXJfTW9udGgiLCBhbGwueD1UKQpZZWFyX1NhbXBsaW5nIDwtIGRhdGFfRmlzY2FsX1llYXJfICU+JQogIGZpbHRlcihGaXNjYWxfWWVhciE9Ii0iICYgIWlzLm5hKEZpc2NhbF9ZZWFyKSkKWWVhcl9SZXN1bHQgPC0gZGF0YV9GaXNjYWxfWWVhcl8gJT4lCiAgZmlsdGVyKEZpc2NhbF9ZZWFyPT0iLSIgfCBpcy5uYShGaXNjYWxfWWVhcikpICU+JQogIHNlbGVjdCgtYyhZZWFyX01vbnRoLCBGaXNjYWxfWWVhciwgTW9udGgpKSAlPiUKICBtdXRhdGUoWWVhcl9Nb250aD1zdHJfc3ViKFJlc3VsdHNfT2J0YWluZWRfRGF0ZSwgc3RhcnQgPSAxLCBlbmQgPSA4KSkgJT4lCiAgbWVyZ2UoCiAgICByZWFkcjo6cmVhZF9jc3YoIi4vY3N2L1Jlc3VsdHNfWWVhcl9Nb250aC5jc3YiIClbYygiWWVhcl9Nb250aCIsICJGaXNjYWxfWWVhciIsICJNb250aCIpXSwKICAgIGJ5PSJZZWFyX01vbnRoIiwgYWxsLng9VCkKWWVhcl9QcmVzcyA8LSBZZWFyX1Jlc3VsdCAlPiUgZmlsdGVyKEZpc2NhbF9ZZWFyPT0iLSIgfCBpcy5uYShGaXNjYWxfWWVhcikpClllYXJfUmVzdWx0IDwtIFllYXJfUmVzdWx0ICU+JSBmaWx0ZXIoRmlzY2FsX1llYXIhPSItIiAmICFpcy5uYShGaXNjYWxfWWVhcikpClllYXJfUHJlc3MgPC0gWWVhcl9QcmVzcyAlPiUKICBmaWx0ZXIoRmlzY2FsX1llYXI9PSItIiB8IGlzLm5hKEZpc2NhbF9ZZWFyKSkgJT4lCiAgc2VsZWN0KC1jKFllYXJfTW9udGgsIEZpc2NhbF9ZZWFyLCBNb250aCkpICU+JQogIG11dGF0ZShZZWFyX01vbnRoPXN0cl9zdWIoUHJlc3NfUmVsZWFzZV9EYXRlLCBzdGFydCA9IDEsIGVuZCA9IDgpKSAlPiUKICBtZXJnZSgKICAgIHJlYWRyOjpyZWFkX2NzdigiLi9jc3YvUHJlc3NfWWVhcl9Nb250aC5jc3YiIClbYygiWWVhcl9Nb250aCIsICJGaXNjYWxfWWVhciIsICJNb250aCIpXSwKICAgIGJ5PSJZZWFyX01vbnRoIiwgYWxsLng9VCkKZGF0YV9GaXNjYWxfWWVhcl8gPC0gcmJpbmQoWWVhcl9TYW1wbGluZyAlPiUgc2VsZWN0KC1jKFllYXJfTW9udGgsIENzX2ZpeCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyX1Jlc3VsdCAlPiUgc2VsZWN0KC1jKFllYXJfTW9udGgsIENzX2ZpeCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyX1ByZXNzICU+JSBzZWxlY3QoLWMoWWVhcl9Nb250aCwgQ3NfZml4KSkpCgpkYXRhXzIwMTJfMjAyMF90b3RhbF8gPC0gZGF0YV9GaXNjYWxfWWVhcl8Kcm0oWWVhcl9TYW1wbGluZywgWWVhcl9SZXN1bHQsIFllYXJfUHJlc3MpCnJtKGRhdGFfRmlzY2FsX1llYXJfLCBkYXRhX2FsbF8sIGRhdGFfMjAxMl8yMDIwX2ZpeF8sIGRhdGFfRmlzaGVyeV8pCgoKYGBgCgoKCjwhLS0gVG90YWxpemF0aW9uIC0tPgojIFRhYmxlIDEuIFN1bW1hcnkgb2YgMTM0LDEzN0NzIG1vbml0b3JpbmcgZGF0YSBmcm9tIEZZIDIwMTIgdG8gMjAyMQpgYGB7cn0KIyBEYXRhIGFuYWx5c2lzIG9uIHRoZSBzYW1wbGUgZGF0YSBhbmQgdGhlIHllYXIgcmVwb3J0ZWQuCiMgRGF0YSB1c2luZyBDcyBkZXRlY3Rpb24gaW5zdHJ1bWVudHMgcmVwb3J0ZWQsIOKAnEdl4oCdLCDigJxDc0nigJ0sIOKAnE5hSeKAnSBhbmQgIOKAnC0s4oCdIHdlcmUgdXNlZCBmb3IgYW5hbHlzaXMuCgojIFRoZSBzYW1wbGUgZGF0YSBhbmQgdGhlIHllYXIgcmVwb3J0ZWQgd2VyZSByZWFkLgpkYXRhXzAgPC0gZGF0YV8yMDEyXzIwMjBfdG90YWxfICU+JQogIGNvdW50KEZpc2NhbF9ZZWFyKQoKIyBEYXRhIGFuYWx5c2lzIG9uIHRoZSBtYXJrZXRlZC9ub24tbWFya2V0ZWQgc2FtcGxlIGFuZCB0aGUgeWVhciByZXBvcnRlZC4KZGF0YV8xIDwtIGRhdGFfMjAxMl8yMDIwX3RvdGFsXyAlPiUKICBjb3VudChGaXNjYWxfWWVhciwgTWFya2V0KSAlPiUKICBzcHJlYWQoTWFya2V0LCBuKQpkYXRhXzEgPC0gZGF0YV8wICU+JQogIG1lcmdlKGRhdGFfMVtjKCJGaXNjYWxfWWVhciIsCiAgICAgICAgICAgICAgICAgIk1hcmtldCBwcm9kdWN0cyIsICJQcm9kdWNlIGZvciBzYWxlcyIsCiAgICAgICAgICAgICAgICAgIk5vbiBtYXJrZXQgcHJvZHVjdHMiLCAiUHJvZHVjZSBub3QgZm9yIHNhbGVzIiwKICAgICAgICAgICAgICAgICAiTm90IGFwcGxpY2FibGUiKV0sCiAgICAgICAgIkZpc2NhbF9ZZWFyIikKCiMgUmF0ZSBjYWxjdWxhdGVkIG91dCBvZiBhbGwgZGF0YQpkYXRhXzIgPC0gZGF0YV8wWyJGaXNjYWxfWWVhciJdICU+JQogIG11dGF0ZShNYXJrZXRfcHJvZHVjdHNfUmF0ZT1yb3VuZChkYXRhXzEkYE1hcmtldCBwcm9kdWN0c2AvY291bnQoZGF0YV8yMDEyXzIwMjBfdG90YWxfKSRuLCA0KSoxMDApICU+JQogIG11dGF0ZShQcm9kdWNlX2Zvcl9zYWxlc19SYXRlPXJvdW5kKGRhdGFfMSRgUHJvZHVjZSBmb3Igc2FsZXNgL2NvdW50KGRhdGFfMjAxMl8yMDIwX3RvdGFsXykkbiwgNCkqMTAwKSAlPiUKICBtdXRhdGUoTm9uX21hcmtldF9wcm9kdWN0c19SYXRlPXJvdW5kKGRhdGFfMSRgTm9uIG1hcmtldCBwcm9kdWN0c2AvY291bnQoZGF0YV8yMDEyXzIwMjBfdG90YWxfKSRuLCA0KSoxMDApICU+JQogIG11dGF0ZShQcm9kdWNlX25vdF9mb3Jfc2FsZXNfUmF0ZT1yb3VuZChkYXRhXzEkYFByb2R1Y2Ugbm90IGZvciBzYWxlc2AvY291bnQoZGF0YV8yMDEyXzIwMjBfdG90YWxfKSRuLCA0KSoxMDApICU+JQogIG11dGF0ZShOb3RfYXBwbGljYWJsZV9SYXRlPXJvdW5kKGRhdGFfMSRgTm90IGFwcGxpY2FibGVgL2NvdW50KGRhdGFfMjAxMl8yMDIwX3RvdGFsXykkbiwgNikqMTAwKQoKVGFibGUxXzEgPC0gZGF0YV8xICU+JQogIG1lcmdlKGRhdGFfMiwgYnk9IkZpc2NhbF9ZZWFyIikgJT4lCiAgc2VsZWN0KCJGaXNjYWxfWWVhciIsICJuIiwKICAgICAgICAgIk1hcmtldCBwcm9kdWN0cyIsICJNYXJrZXRfcHJvZHVjdHNfUmF0ZSIsCiAgICAgICAgICJOb24gbWFya2V0IHByb2R1Y3RzIiwgIk5vbl9tYXJrZXRfcHJvZHVjdHNfUmF0ZSIsCiAgICAgICAgICJQcm9kdWNlIGZvciBzYWxlcyIsICJQcm9kdWNlX2Zvcl9zYWxlc19SYXRlIiwKICAgICAgICAgIlByb2R1Y2Ugbm90IGZvciBzYWxlcyIsICJQcm9kdWNlX25vdF9mb3Jfc2FsZXNfUmF0ZSIsCiAgICAgICAgICJOb3QgYXBwbGljYWJsZSIsICJOb3RfYXBwbGljYWJsZV9SYXRlIgogICAgICAgICApICU+JSBwcmludCgpCgojIERhdGEgYW5hbHlzaXMgb24gdGhlIGZvb2QgY2F0ZWdvcnkgZGF0YSBhbmQgdGhlIHllYXIgcmVwb3J0ZWQuCmRhdGFfMyA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgY291bnQoRmlzY2FsX1llYXIsIENhdGVnb3J5KSAlPiUKICBzcHJlYWQoQ2F0ZWdvcnksIG4pCmRhdGFfMyA8LSBkYXRhXzNbYygiRmlzY2FsX1llYXIiLCAiRmlzaGVyeSBwcm9kdWN0cyIsCiAgICAgICAgICAgICAgICAgICAiTGl2ZXN0b2NrIHByb2R1Y3RzIiwgIkFncmljdWx0dXJhbCBwcm9kdWN0cyIsCiAgICAgICAgICAgICAgICAgICAiV2lsZCBhbmltYWwgbWVhdCIsICJNaWxrLCBpbmZhbnQgZm9ybXVsYSIsCiAgICAgICAgICAgICAgICAgICAiRHJpbmtpbmcgd2F0ZXIiLCAiTm90IGFwcGxpY2FibGUiKV0KCmRhdGFfNCA8LSBkYXRhXzBbMV0gJT4lCiAgbXV0YXRlKEZpc2hlcnlfcHJvZHVjdHNfUmF0ZT1yb3VuZChkYXRhXzMkYEZpc2hlcnkgcHJvZHVjdHNgL2NvdW50KGRhdGFfMjAxMl8yMDIwX3RvdGFsXykkbiwgNCkqMTAwKSAlPiUKICBtdXRhdGUoTGl2ZXN0b2NrX3Byb2R1Y3RzX1JhdGU9cm91bmQoZGF0YV8zJGBMaXZlc3RvY2sgcHJvZHVjdHNgL2NvdW50KGRhdGFfMjAxMl8yMDIwX3RvdGFsXykkbiwgNCkqMTAwKSAlPiUKICBtdXRhdGUoQWdyaWN1bHR1cmFsX3Byb2R1Y3RzX1JhdGU9cm91bmQoZGF0YV8zJGBBZ3JpY3VsdHVyYWwgcHJvZHVjdHNgL2NvdW50KGRhdGFfMjAxMl8yMDIwX3RvdGFsXykkbiwgNCkqMTAwKSAlPiUKICBtdXRhdGUoV2lsZF9hbmltYWxfbWVhdF9SYXRlPXJvdW5kKGRhdGFfMyRgV2lsZCBhbmltYWwgbWVhdGAvY291bnQoZGF0YV8yMDEyXzIwMjBfdG90YWxfKSRuLCA0KSoxMDApICU+JQogIG11dGF0ZShNaWxrX2luZmFudF9mb3JtdWxhX1JhdGU9cm91bmQoZGF0YV8zJGBNaWxrLCBpbmZhbnQgZm9ybXVsYWAvY291bnQoZGF0YV8yMDEyXzIwMjBfdG90YWxfKSRuLCA0KSoxMDApICU+JQogIG11dGF0ZShEcmlua2luZ193YXRlcl9SYXRlPXJvdW5kKGRhdGFfMyRgRHJpbmtpbmcgd2F0ZXJgL2NvdW50KGRhdGFfMjAxMl8yMDIwX3RvdGFsXykkbiwgNCkqMTAwKSAlPiUKICBtdXRhdGUoTm90X2FwcGxpY2FibGVfUmF0ZT1yb3VuZChkYXRhXzMkYE5vdCBhcHBsaWNhYmxlYC9jb3VudChkYXRhXzIwMTJfMjAyMF90b3RhbF8pJG4sIDQpKjEwMCkKClRhYmxlMV8yIDwtIGRhdGFfMyAlPiUKICBtZXJnZShkYXRhXzQsIGJ5PSJGaXNjYWxfWWVhciIpICU+JQogIHNlbGVjdCgiRmlzY2FsX1llYXIiLAogICAgICAgICAiRmlzaGVyeSBwcm9kdWN0cyIsICJGaXNoZXJ5X3Byb2R1Y3RzX1JhdGUiLAogICAgICAgICAiTGl2ZXN0b2NrIHByb2R1Y3RzIiwgIkxpdmVzdG9ja19wcm9kdWN0c19SYXRlIiwKICAgICAgICAgIkFncmljdWx0dXJhbCBwcm9kdWN0cyIsICJBZ3JpY3VsdHVyYWxfcHJvZHVjdHNfUmF0ZSIsCiAgICAgICAgICJXaWxkIGFuaW1hbCBtZWF0IiwgIldpbGRfYW5pbWFsX21lYXRfUmF0ZSIsCiAgICAgICAgICJNaWxrLCBpbmZhbnQgZm9ybXVsYSIsICJNaWxrX2luZmFudF9mb3JtdWxhX1JhdGUiLAogICAgICAgICAiRHJpbmtpbmcgd2F0ZXIiLCAiRHJpbmtpbmdfd2F0ZXJfUmF0ZSIsCiAgICAgICAgICJOb3QgYXBwbGljYWJsZSIsICJOb3RfYXBwbGljYWJsZV9SYXRlIgogICAgICAgICApICU+JSBwcmludCgpCgojIERhdGEgYW5hbHlzaXMgb24gdGhlIHNhbXBsZXMgd2l0aCBDcyBkZXRlY3RlZC9DcyBub24tZGV0ZWN0ZWQgYW5kIHRoZSB5ZWFyIHJlcG9ydGVkLgpkYXRhXzUgPC0gZGF0YV8yMDEyXzIwMjBfdG90YWxfICU+JQogIGNvdW50KEZpc2NhbF9ZZWFyLCBDc190b3RhbF9ORCkgJT4lCiAgc3ByZWFkKENzX3RvdGFsX05ELCBuKQoKZGF0YV82IDwtIGRhdGFfMFsxXSAlPiUKICBtdXRhdGUoRGV0ZWN0ZWRfUmF0ZT1yb3VuZChkYXRhXzUkRGV0ZWN0ZWQvY291bnQoZGF0YV8yMDEyXzIwMjBfdG90YWxfKSRuKjEwMCwgNCkpICU+JQogIG11dGF0ZShOb3REZXRlY3RlZF9SYXRlPXJvdW5kKGRhdGFfNSROb3REZXRlY3RlZC9jb3VudChkYXRhXzIwMTJfMjAyMF90b3RhbF8pJG4qMTAwLCA0KSkKClRhYmxlMV8zIDwtIGRhdGFfNSAlPiUKICBtZXJnZShkYXRhXzYsIGJ5PSJGaXNjYWxfWWVhciIpICU+JQogIHNlbGVjdCgiRmlzY2FsX1llYXIiLAogICAgICAgICAiRGV0ZWN0ZWQiLCAiRGV0ZWN0ZWRfUmF0ZSIsCiAgICAgICAgICJOb3REZXRlY3RlZCIsICJOb3REZXRlY3RlZF9SYXRlIgogICAgICAgICApICU+JSBwcmludCgpCgojIERhdGEgYW5hbHlzaXMgb24gdGhlIENzIGNvbmNlbnRyYXRpb24gZGF0YSBhbmQgdGhlIHllYXIgcmVwb3J0ZWQuCmRhdGFfNyA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgY291bnQoRmlzY2FsX1llYXIsIENzX2NvbmRpdGlvbikgJT4lCiAgc3ByZWFkKENzX2NvbmRpdGlvbiwgbikKZGF0YV83X1BsdXMgPC0gZGF0YV83W2MoIkZpc2NhbF9ZZWFyIiwgIldhcm5pbmciLCAiQ2F1dGlvbiIsICJOb3RpY2UiLCAiSW5mbyIpXQpkYXRhXzdfUGx1cyA8LSBkYXRhXzdfUGx1cyAlPiUKICBtdXRhdGUoSW5mbz1yZXBsYWNlX25hKGRhdGFfNyRJbmZvLDApICsKICAgICAgICAgICAgICByZXBsYWNlX25hKGRhdGFfNyROb0RhdGEsIDApICMrCiAgICAgICAgICAgICAgIyByZXBsYWNlX25hKGRhdGFfNyROb3REZXRlY3RlZCwgMCkKICAgICAgICAgKQoKZGF0YV84IDwtIGRhdGFfMFsiRmlzY2FsX1llYXIiXSAlPiUKICBtdXRhdGUoV2FybmluZ19SYXRlPXJvdW5kKGRhdGFfN19QbHVzJFdhcm5pbmcvY291bnQoZGF0YV8yMDEyXzIwMjBfdG90YWxfKSRuKjEwMCwgNCkpICU+JQogIG11dGF0ZShDYXV0aW9uX1JhdGU9cm91bmQoZGF0YV83X1BsdXMkQ2F1dGlvbi9jb3VudChkYXRhXzIwMTJfMjAyMF90b3RhbF8pJG4qMTAwLCA0KSkgJT4lCiAgbXV0YXRlKE5vdGljZV9SYXRlPXJvdW5kKGRhdGFfN19QbHVzJE5vdGljZS9jb3VudChkYXRhXzIwMTJfMjAyMF90b3RhbF8pJG4qMTAwLCA0KSkgJT4lCiAgbXV0YXRlKEluZm9fUmF0ZT1yb3VuZChkYXRhXzdfUGx1cyRJbmZvL2NvdW50KGRhdGFfMjAxMl8yMDIwX3RvdGFsXykkbioxMDAsIDQpKQoKVGFibGUxXzQgPC0gZGF0YV83X1BsdXMgJT4lCiAgZmlsdGVyKEZpc2NhbF9ZZWFyIT0iLSIgJiBGaXNjYWxfWWVhciE9IjIwMTEiKSAlPiUKICBtZXJnZShkYXRhXzgsIGJ5PSJGaXNjYWxfWWVhciIpICU+JQogIG11dGF0ZSgpICU+JQogIHNlbGVjdCgiRmlzY2FsX1llYXIiLAogICAgICAgICAiV2FybmluZyIsICJXYXJuaW5nX1JhdGUiLAogICAgICAgICAiQ2F1dGlvbiIsICJDYXV0aW9uX1JhdGUiLAogICAgICAgICAiTm90aWNlIiwgIk5vdGljZV9SYXRlIiwKICAgICAgICAgIkluZm8iLCAiSW5mb19SYXRlIgogICAgICAgICApICU+JSBwcmludCgpCgoKcm0oZGF0YV8wLCBkYXRhXzEsIGRhdGFfMiwgZGF0YV8zLCBkYXRhXzQsIGRhdGFfNSwgZGF0YV82LCBkYXRhXzcsIGRhdGFfOCwgZGF0YV83X1BsdXMpCgoKYGBgCgoKIyBUYWJsZSAyLiBPcmlnaW4gb2YgdGhlIGV4YW1pbmVkIGZpc2hlcnkgZm9vZCBwcm9kdWN0cyB0aGF0IHdlcmUgcmVwb3J0ZWQgdG8gZXhjZWVkIDEwMCBCcS9rZyoKYGBge3J9CiMgRGF0YSB1c2luZyBDcyBkZXRlY3Rpb24gaW5zdHJ1bWVudHMgcmVwb3J0ZWQsIOKAnEdl4oCdLCDigJxDc0nigJ0sIOKAnE5hSeKAnSBhbmQgIOKAnC0s4oCdIHdlcmUgdXNlZCBmb3IgYW5hbHlzaXMuCmRhdGFfMjAxMl8yMDIwX2Zpc2hfIDwtIGRhdGFfMjAxMl8yMDIwX3RvdGFsXyAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnk9PSJGaXNoZXJ5IHByb2R1Y3RzIiAmICFpcy5uYShGaXNjYWxfWWVhcikpICU+JQogIG11dGF0ZSgKICAgIE1hcmluZV9XYXRlciA9IGNhc2Vfd2hlbihGb29kX2NsYXNzZmljYXRpb249PSJNYXJpbmVfcHJvZHVjdHMoZnJlc2h3YXRlcikiIH4gIkZyZXNod2F0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvb2RfY2xhc3NmaWNhdGlvbiE9Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIgfiAiTWFyaW5lIikKICAgICkgJT4lCiAgbXV0YXRlKFBlcmlvZD1jYXNlX3doZW4oCiAgICAgIEZpc2NhbF9ZZWFyPT0yMDEyIHwgRmlzY2FsX1llYXI9PTIwMTMgfCBGaXNjYWxfWWVhcj09MjAxNCB8IEZpc2NhbF9ZZWFyPT0yMDE1IH4gIkVhcmx5IiwKICAgICAgRmlzY2FsX1llYXI9PTIwMTYgfCBGaXNjYWxfWWVhcj09MjAxNyB8IEZpc2NhbF9ZZWFyPT0yMDE4IHwgRmlzY2FsX1llYXI9PTIwMTkgfiAiTWlkZGxlIiwKICAgICAgRmlzY2FsX1llYXI9PTIwMjAgfCBGaXNjYWxfWWVhcj09MjAyMSB+ICJMYXRlciIsCiAgICAgIFRSVUUgfiAiT3RoZXJzIgogICAgKQogICkgJT4lCiAgbXV0YXRlKEZhcm1lZF9XaWxkPWNhc2Vfd2hlbigKICAgICAgc3RyX2RldGVjdCjlk4Hnm67lkI0sICLppIrmrpYiKSAmICFzdHJfZGV0ZWN0KOOBneOBruS7liwgIumkiuauluOBp+OBr+OBquOBhCIpIH4gIkZhcm1lZCIsCiAgICAgIHN0cl9kZXRlY3Qo44Gd44Gu5LuWLCAi6aSK5q6WIikgJiAhc3RyX2RldGVjdCjjgZ3jga7ku5YsICLppIrmrpbjgafjga/jgarjgYQiKSB+ICJGYXJtZWQiLAogICAgICAhc3RyX2RldGVjdCjjgZ3jga7ku5YsICLppIrmrpYiKSB8IHN0cl9kZXRlY3Qo44Gd44Gu5LuWLCAi6aSK5q6W44Gn44Gv44Gq44GEIikgfiAiV2lsZCIsCiAgICAgICFzdHJfZGV0ZWN0KOOBneOBruS7liwgIumkiuauliIpIHwgc3RyX2RldGVjdCjjgZ3jga7ku5YsICLppIrmrpbjgafjga/jgarjgYQiKSB+ICJXaWxkIiwKICAgICAgVFJVRSB+ICItIgogICAgKQogICkgJT4lCiAgbXV0YXRlKEZyZXNoX0Zhcm1lZD1jYXNlX3doZW4oCiAgICAgIEZvb2RfY2xhc3NmaWNhdGlvbj09Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIgJiBGYXJtZWRfV2lsZD09IldpbGQiIH4gIkZyZXNod2F0ZXIsIHdpbGQiLAogICAgICBGb29kX2NsYXNzZmljYXRpb24hPSJNYXJpbmVfcHJvZHVjdHMoZnJlc2h3YXRlcikiICYgRmFybWVkX1dpbGQ9PSJXaWxkIiB+ICJNYXJpbmUsIHdpbGQiLAogICAgICBGb29kX2NsYXNzZmljYXRpb249PSJNYXJpbmVfcHJvZHVjdHMoZnJlc2h3YXRlcikiICYgRmFybWVkX1dpbGQ9PSJGYXJtZWQiIH4gIkZyZXNod2F0ZXIsIGFxdWFjdWx0dXJlIiwKICAgICAgRm9vZF9jbGFzc2ZpY2F0aW9uIT0iTWFyaW5lX3Byb2R1Y3RzKGZyZXNod2F0ZXIpIiAmIEZhcm1lZF9XaWxkPT0iRmFybWVkIiB+ICJNYXJpbmUsIGFxdWFjdWx0dXJlIiwKICAgICAgVFJVRSB+ICItIgogICAgKQogICkgJT4lCiAgbXV0YXRlKEV4X0RldGVjdD1jYXNlX3doZW4oCiAgICBDc190b3RhbF9maXg+MTAwIH4gIkV4IiwKICAgIENzX3RvdGFsX2ZpeD4yNSB+ICJEZXRlY3QiLAogICAgIUNzX3RvdGFsX2ZpeD4xMDAgfiAiTkQiCiAgKSkKCiMgRmFybWVkLCBGcmVzaHdhdGVyIGZpc2hlcnkgZm9vZHN0dWZmcwpUYWJsZTJfMSA8LSBkYXRhXzIwMTJfMjAyMF9maXNoXyAlPiUKICBmaWx0ZXIoRmFybWVkX1dpbGQ9PSJGYXJtZWQiKSAlPiUKICBmaWx0ZXIoRm9vZF9jbGFzc2ZpY2F0aW9uPT0iTWFyaW5lX3Byb2R1Y3RzKGZyZXNod2F0ZXIpIikgJT4lCiAgY291bnQoRmlzY2FsX1llYXIsIEV4Y2VlZCkgJT4lCiAgc3ByZWFkKEV4Y2VlZCwgbikgJT4lCiAgcmVwbGFjZV9uYShsaXN0KEV4PTApKSAlPiUKICBtdXRhdGUoRXhhbWluZWQ9RXgrYDxOQT5gKSAlPiUKICBtdXRhdGUoUmF0aW89RXgvKEV4YW1pbmVkKSoxMDApICU+JQogIHNlbGVjdCgiRmlzY2FsX1llYXIiLCAiRXhhbWluZWQiLCAiRXgiLCAiUmF0aW8iKSAlPiUKICBwcmludCgpCgojIEZhcm1lZCwgTWFyaW5lIGZpc2hlcnkgZm9vZHN0dWZmcwpUYWJsZTJfMiA8LSBkYXRhXzIwMTJfMjAyMF9maXNoXyAlPiUKICBmaWx0ZXIoRmFybWVkX1dpbGQ9PSJGYXJtZWQiKSAlPiUKICBmaWx0ZXIoRm9vZF9jbGFzc2ZpY2F0aW9uIT0iTWFyaW5lX3Byb2R1Y3RzKGZyZXNod2F0ZXIpIikgJT4lCiAgY291bnQoRmlzY2FsX1llYXIsIEV4Y2VlZCkgJT4lCiAgc3ByZWFkKEV4Y2VlZCwgbikgJT4lCiAgIyByZXBsYWNlX25hKGxpc3QoRXg9MCkpICU+JQogIG11dGF0ZShFeD0wKSAlPiUKICBtdXRhdGUoRXhhbWluZWQ9RXgrYDxOQT5gKSAlPiUKICBtdXRhdGUoUmF0aW89RXgvKEV4YW1pbmVkKSoxMDApICU+JQogIHNlbGVjdCgiRmlzY2FsX1llYXIiLCAiRXhhbWluZWQiLCAiRXgiLCAiUmF0aW8iKSAlPiUKICBwcmludCgpCgojIFdpbGQsIEZyZXNod2F0ZXIgZmlzaGVyeSBmb29kc3R1ZmZzClRhYmxlMl8zIDwtIGRhdGFfMjAxMl8yMDIwX2Zpc2hfICU+JQogIGZpbHRlcihGYXJtZWRfV2lsZCE9IkZhcm1lZCIpICU+JQogIGZpbHRlcihGb29kX2NsYXNzZmljYXRpb249PSJNYXJpbmVfcHJvZHVjdHMoZnJlc2h3YXRlcikiKSAlPiUKICBjb3VudChGaXNjYWxfWWVhciwgRXhjZWVkKSAlPiUKICBzcHJlYWQoRXhjZWVkLCBuKSAlPiUKICByZXBsYWNlX25hKGxpc3QoRXg9MCkpICU+JQogIG11dGF0ZShFeGFtaW5lZD1FeCtgPE5BPmApICU+JQogIG11dGF0ZShSYXRpbz1FeC8oRXhhbWluZWQpKjEwMCkgJT4lCiAgc2VsZWN0KCJGaXNjYWxfWWVhciIsICJFeGFtaW5lZCIsICJFeCIsICJSYXRpbyIpICU+JQogIHByaW50KCkKCiMgV2lsZCwgTWFyaW5lIGZpc2hlcnkgZm9vZHN0dWZmcwpUYWJsZTJfNCA8LSBkYXRhXzIwMTJfMjAyMF9maXNoXyAlPiUKICBmaWx0ZXIoRmFybWVkX1dpbGQhPSJGYXJtZWQiKSAlPiUKICBmaWx0ZXIoRm9vZF9jbGFzc2ZpY2F0aW9uIT0iTWFyaW5lX3Byb2R1Y3RzKGZyZXNod2F0ZXIpIikgJT4lCiAgY291bnQoRmlzY2FsX1llYXIsIEV4Y2VlZCkgJT4lCiAgc3ByZWFkKEV4Y2VlZCwgbikgJT4lCiAgcmVwbGFjZV9uYShsaXN0KEV4PTApKSAlPiUKICBtdXRhdGUoRXhhbWluZWQ9RXgrYDxOQT5gKSAlPiUKICBtdXRhdGUoUmF0aW89RXgvKEV4YW1pbmVkKSoxMDApICU+JQogIHNlbGVjdCgiRmlzY2FsX1llYXIiLCAiRXhhbWluZWQiLCAiRXgiLCAiUmF0aW8iKSAlPiUKICBwcmludCgpCgpybShkYXRhXzIwMTJfMjAyMF9maXNoXykKCmBgYAoKCiMgRmlnIDEuIFRoZSBnZW5lcmFsIGZvb2RzdWZmcyBleGFtaW5lZCBmcm9tIEZZIDIwMTIgLSAyMDIxIGFuZCByZXBvcnRlZCBhYm92ZSB0aGUgdGhyZXNob2xkIHZhbHVlICgxMDAgQnEva2cpCmBgYHtyfQojIERhdGEgdXNpbmcgQ3MgZGV0ZWN0aW9uIGluc3RydW1lbnRzIHJlcG9ydGVkLCDigJxHZeKAnSwg4oCcQ3NJ4oCdLCDigJxOYUnigJ0gYW5kICDigJwtLOKAnSB3ZXJlIHVzZWQgZm9yIGFuYWx5c2lzLgoKRmlnMSA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgZmlsdGVyKEl0ZW0hPSJDYXR0bGUgbWVhdCIgJiAhc3RyX2RldGVjdCjjgZ3jga7ku5YsIuWFqOmgreaknOafuyIpKSAlPiUKICBmaWx0ZXIoSXRlbSE9IkNhdHRsZSBtZWF0IiAmICFzdHJfZGV0ZWN0KOOBneOBruS7liwi5YWo5bO25qSc5p+7IikpICU+JQogIGZpbHRlcihGaXNjYWxfWWVhciE9Ii0iKSAlPiUKICBjb3VudChGaXNjYWxfWWVhciwgRXhjZWVkKSAlPiUKICBzcHJlYWQoRXhjZWVkLCBuKSAlPiUKICBtdXRhdGUoVG90YWw9RXgrYDxOQT5gKSAlPiUKICBtdXRhdGUoWWVhcl9SYXRlPVRvdGFsL3N1bShUb3RhbCkqMTAwKSAlPiUKICBtdXRhdGUoRXhfUmF0ZT1FeC9Ub3RhbCoxMDApICU+JQogIHByaW50KCkKCmBgYAoKCiMjIyBGaWcuMi4gQW5udWFsIHRyZW5kcyBvZiBnZW5lcmFsIGZvb2RzdHVmZnMgcmVwb3J0ZWQgYXQgPjEwMCBCcS9rZwpgYGB7cn0KIyBGb29kIGNhdGVnb3JpZXMgYW5hbHl6ZWQgZm9yIHNhbXBsZXMgaGF2aW5nID4xMDAgQnEva2cuCiMgUGllIGdyYXBocyBzaG93aW5nIHRoZSByYXRlIG9mIHRoZSBmb29kIGNhdGVnb3JpZXMgcmVwb3J0ZWQgaW4geWVhciAoQSkgMjAxMiwgKEIpIDIwMTQsIChDKSAyMDE2IGFuZCAoRCkgMjAxOS4KIyBGcmVzaHdhdGVyIHByb2R1Y3RzIHdlcmUgc2hhZGVkIGluIGxpbmUuIE1hcmluZSBwcm9kdWN0cyB3ZXJlIGJsYWNrLXBhaW50ZWQKIyBEYXRhIHVzaW5nIENzIGRldGVjdGlvbiBpbnN0cnVtZW50cyByZXBvcnRlZCwg4oCcR2XigJ0sIOKAnENzSeKAnSwg4oCcTmFJ4oCdIGFuZCAg4oCcLSzigJ0gd2VyZSB1c2VkIGZvciBhbmFseXNpcy4KCiMgIk1hcmluZSBwcm9kdWN0cyhmcmVzaHdhdGVyKSIgYXJlIHRoZSBmcmVzaHdhdGVyIGZpc2hlcnkgcHJvZHVjdHMuCgpkYXRhX0V4X0l0ZW1fMCA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgY291bnQoRm9vZF9jbGFzc2ZpY2F0aW9uLCBFeGNlZWQpICU+JQogIHNwcmVhZChFeGNlZWQsIG4pICU+JQogICMgZmlsdGVyKEV4PjApICU+JQogIHJlcGxhY2VfbmEobGlzdChFeD0wLCBgPE5BPmA9MCkpICU+JQogIG11dGF0ZShJbnNwZWN0PUV4K2A8TkE+YCkgJT4lCiAgbXV0YXRlKFJhdGU9cm91bmQoKEV4L0luc3BlY3QpKjEwMCwyKSkgJT4lCiAgc2VsZWN0KCJGb29kX2NsYXNzZmljYXRpb24iLCAiRXgiLCAiSW5zcGVjdCIsICJSYXRlIikgJT4lCiAgYXJyYW5nZShkZXNjKEV4KSkKZGF0YV9FeF9JdGVtXyA8LSBkYXRhX0V4X0l0ZW1fMApmb3IgKFllYXJfIGluIGMoMjAxMjoyMDIxKSkgewogIGRhdGFfRXhfSXRlbV9ZZWFyXyA8LQogICAgICBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgICAgIGZpbHRlcihGaXNjYWxfWWVhcj09WWVhcl8pICU+JQogICAgICBjb3VudChGb29kX2NsYXNzZmljYXRpb24sIEV4Y2VlZCkgJT4lCiAgICAgIHNwcmVhZChFeGNlZWQsIG4pICU+JQogICAgICByZXBsYWNlX25hKGxpc3QoRXg9MCAsYDxOQT5gPTApKSAlPiUKICAgICAgbXV0YXRlKEluc3BlY3Q9RXgrYDxOQT5gKSAlPiUKICAgICAgbXV0YXRlKFJhdGU9cm91bmQoKEV4L0luc3BlY3QpKjEwMCwyKSkgJT4lCiAgICAgIHNlbGVjdCgiRm9vZF9jbGFzc2ZpY2F0aW9uIiwgIkV4IiwgIkluc3BlY3QiLCAiUmF0ZSIpCiAgY29sbmFtZXMoZGF0YV9FeF9JdGVtX1llYXJfKSA8LSBjKCJGb29kX2NsYXNzZmljYXRpb24iLCBwYXN0ZTAoIkV4XyIsIFllYXJfKSwgcGFzdGUwKCJJbnNwZWN0XyIsIFllYXJfKSwgcGFzdGUwKCJSYXRlXyIsIFllYXJfKSkKICBkYXRhX0V4X0l0ZW1fWWVhcl8KICBkYXRhX0V4X0l0ZW1fIDwtIGRhdGFfRXhfSXRlbV8gJT4lCiAgICBtZXJnZSgKICAgICAgZGF0YV9FeF9JdGVtX1llYXJfLAogICAgICBieT0iRm9vZF9jbGFzc2ZpY2F0aW9uIiwgYWxsLng9VAogICAgKQp9CmRhdGFfRXhfSXRlbV8gJT4lCiAgYXJyYW5nZShkZXNjKEV4XzIwMTIpKSAlPiUKICAjIFZpZXcoKQogIHByaW50KCkKCkZpZzJfMjAxMiA8LSBkYXRhX0V4X0l0ZW1fICU+JSBmaWx0ZXIoRXhfMjAxMj4wKSAlPiUgYXJyYW5nZShkZXNjKEV4XzIwMTIpKQpGaWcyXzIwMTQgPC0gZGF0YV9FeF9JdGVtXyAlPiUgZmlsdGVyKEV4XzIwMTQ+MCkgJT4lIGFycmFuZ2UoZGVzYyhFeF8yMDE0KSkKRmlnMl8yMDE2IDwtIGRhdGFfRXhfSXRlbV8gJT4lIGZpbHRlcihFeF8yMDE2PjApICU+JSBhcnJhbmdlKGRlc2MoRXhfMjAxNikpCiMgRmlnMl8yMDE5IDwtIGRhdGFfRXhfSXRlbV8gJT4lIGZpbHRlcihFeF8yMDE5PjApICU+JSBhcnJhbmdlKGRlc2MoRXhfMjAxOSkpCkZpZzJfMjAyMSA8LSBkYXRhX0V4X0l0ZW1fICU+JSBmaWx0ZXIoRXhfMjAyMT4wKSAlPiUgYXJyYW5nZShkZXNjKEV4XzIwMjEpKQpGaWcyXzIwMTIgJT4lIHByaW50KCkKRmlnMl8yMDE0ICU+JSBwcmludCgpCkZpZzJfMjAxNiAlPiUgcHJpbnQoKQojIEZpZzJfMjAxOSAlPiUgcHJpbnQoKQpGaWcyXzIwMjEgJT4lIHByaW50KCkKCgpybShkYXRhX0V4X0l0ZW1fLCBkYXRhX0V4X0l0ZW1fMCwgZGF0YV9FeF9JdGVtX1llYXJfKQoKCgpgYGAKCiMgRmlnLjMgUmVzdWx0cyBvZiBDcyBjb25jZW50cmF0aW9uIGRhdGEgYW5hbHl6ZWQgZm9yIG1hcmluZSBvciBmcmVzaCB3YXRlciBwcm9kdWN0cyAKIyMjIyBGaWcuMyAoQSkKYGBge3J9CiMgRGF0YSB1c2luZyBDcyBkZXRlY3Rpb24gaW5zdHJ1bWVudCByZXBvcnRlZCwg4oCcR2Us4oCdIHdlcmUgdXNlZCBmb3IgYW5hbHlzaXMuCgojIE90aGVyIGZpc2hlcnkgZm9vZHN0dWZmcyBleGNlcHQgZnJlc2h3YXRlciBmaXNoZXJ5IGZvb2RzdHVmZnMgd2VyZSBkZWZpbmVkIGFzIG1hcmluZSBmaXNoZXJ5IGZvb2RzdHVmZnMuCgojIFNhbXBsZXMgbWFya2V0ZWQgb3Igbm9uLW1hcmtldGVkIGZvb2RzdHVmZnMgd2VyZSBzdW1tYXJpemVkLgoKIyAiTWFyaW5lIHByb2R1Y3RzKGZyZXNod2F0ZXIpIiBhcmUgdGhlIGZyZXNod2F0ZXIgZmlzaGVyeSBwcm9kdWN0cy4KCiMgVGhlIGZvb2RzdHVmZnMgdGhhdCB3ZXJlIG1hcmtldGVkIGFuZCBwcm9kdWNlZCBmb3Igc2FsZXMgd2VyZSBjb3VudGVkLgoKRmlnM19BIDwtIGRhdGFfMjAxMl8yMDIwX3RvdGFsXyAlPiUKICBmaWx0ZXIoSW5zcGVjdGlvbl9pbnN0cnVtZW50PT0iR2UiICYgQ2F0ZWdvcnk9PSJGaXNoZXJ5IHByb2R1Y3RzIikgJT4lCiAgZmlsdGVyKE1hcmtldD09Ik1hcmtldCBwcm9kdWN0cyIpICU+JQogIGZpbHRlcihGb29kX2NsYXNzZmljYXRpb24hPSJNYXJpbmVfcHJvZHVjdHMoZnJlc2h3YXRlcikiKSAlPiUKICBjb3VudChGaXNjYWxfWWVhciwgRXhjZWVkKSAlPiUKICBzcHJlYWQoRXhjZWVkLCBuKSAlPiUKICByZXBsYWNlX25hKGxpc3QoRXg9MCwgYDxOQT5gPTApKSAlPiUKICBtdXRhdGUoSW5zcGVjdD1FeCtgPE5BPmApICU+JQogIHJlbmFtZShjKE1hcmtldF9FeD1FeCwgTWFya2V0X05BPWA8TkE+YCwgTWFya2V0X0luc3BlY3Q9SW5zcGVjdCkpICU+JQogIG11dGF0ZShNYXJrZXRfUmF0ZT1NYXJrZXRfRXgvTWFya2V0X0luc3BlY3QqMTAwKQpGaWczX0ElPiUKICBzZWxlY3QoIkZpc2NhbF9ZZWFyIiwgIk1hcmtldF9FeCIsICJNYXJrZXRfSW5zcGVjdCIsICJNYXJrZXRfUmF0ZSIpICU+JSBwcmludCgpCgpgYGAKCiMjIyMgRmlnLjMgKEIpCmBgYHtyfQojIERhdGEgdXNpbmcgQ3MgZGV0ZWN0aW9uIGluc3RydW1lbnQgcmVwb3J0ZWQsIOKAnEdlLOKAnSB3ZXJlIHVzZWQgZm9yIGFuYWx5c2lzLgoKIyBPdGhlciBmaXNoZXJ5IGZvb2RzdHVmZnMgZXhjZXB0IGZyZXNod2F0ZXIgZmlzaGVyeSBmb29kc3R1ZmZzIHdlcmUgZGVmaW5lZCBhcyBtYXJpbmUgZmlzaGVyeSBmb29kc3R1ZmZzLgoKIyAiTWFyaW5lIHByb2R1Y3RzKGZyZXNod2F0ZXIpIiBhcmUgdGhlIGZyZXNod2F0ZXIgZmlzaGVyeSBwcm9kdWN0cy4KCiMgV2lsZCBvciBhcXVhY3VsdHVyZSBmaXNoZXJ5IGZvb2RzdHVmZnMgd2VyZSBjb3VudGVkLgpOb25fTWFya2V0XzAgPC0gZGF0YV8yMDEyXzIwMjBfdG90YWxfICU+JQogIGZpbHRlcihJbnNwZWN0aW9uX2luc3RydW1lbnQ9PSJHZSIgJiBDYXRlZ29yeT09IkZpc2hlcnkgcHJvZHVjdHMiKSAlPiUKICBmaWx0ZXIoTWFya2V0IT0iTWFya2V0IHByb2R1Y3RzIikgJT4lCiAgZmlsdGVyKEZvb2RfY2xhc3NmaWNhdGlvbiE9Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIpICU+JQogIGNvdW50KEZpc2NhbF9ZZWFyKSAlPiUKICByZW5hbWUoVG90YWw9bikKTm9uX01hcmtldCA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgZmlsdGVyKEluc3BlY3Rpb25faW5zdHJ1bWVudD09IkdlIiAmIENhdGVnb3J5PT0iRmlzaGVyeSBwcm9kdWN0cyIpICU+JQogIGZpbHRlcihNYXJrZXQ9PSJOb24gbWFya2V0IHByb2R1Y3RzIikgJT4lCiAgZmlsdGVyKEZvb2RfY2xhc3NmaWNhdGlvbiE9Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIpICU+JQogIGNvdW50KEZpc2NhbF9ZZWFyLCBFeGNlZWQpICU+JQogIHNwcmVhZChFeGNlZWQsIG4pICU+JQogIHJlbmFtZShjKE5vbl9NYXJrZXRfRXg9RXgsIE5vbl9NYXJrZXRfTkE9YDxOQT5gKSkKRm9yX1NhbGVzIDwtIGRhdGFfMjAxMl8yMDIwX3RvdGFsXyAlPiUKICBmaWx0ZXIoSW5zcGVjdGlvbl9pbnN0cnVtZW50PT0iR2UiICYgQ2F0ZWdvcnk9PSJGaXNoZXJ5IHByb2R1Y3RzIikgJT4lCiAgZmlsdGVyKE1hcmtldD09IlByb2R1Y2UgZm9yIHNhbGVzIikgJT4lCiAgZmlsdGVyKEZvb2RfY2xhc3NmaWNhdGlvbiE9Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIpICU+JQogIGNvdW50KEZpc2NhbF9ZZWFyLCBFeGNlZWQpICU+JQogIHNwcmVhZChFeGNlZWQsIG4pICU+JQogIG11dGF0ZShFeD0wKSAlPiUKICByZW5hbWUoYyhGb3JfU2FsZV9FeD1FeCwgRm9yX1NhbGVfTkE9YDxOQT5gKSkKTm90X0Zvcl9TYWxlcyA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgZmlsdGVyKEluc3BlY3Rpb25faW5zdHJ1bWVudD09IkdlIiAmIENhdGVnb3J5PT0iRmlzaGVyeSBwcm9kdWN0cyIpICU+JQogIGZpbHRlcihNYXJrZXQ9PSJQcm9kdWNlIG5vdCBmb3Igc2FsZXMiKSAlPiUKICBmaWx0ZXIoRm9vZF9jbGFzc2ZpY2F0aW9uIT0iTWFyaW5lX3Byb2R1Y3RzKGZyZXNod2F0ZXIpIikgJT4lCiAgY291bnQoRmlzY2FsX1llYXIsIEV4Y2VlZCkgJT4lCiAgc3ByZWFkKEV4Y2VlZCwgbikgJT4lCiAgcmVuYW1lKGMoTm90X0Zvcl9TYWxlX0V4PUV4LCBOb3RfRm9yX1NhbGVfTkE9YDxOQT5gKSkKRmlnM19CIDwtIE5vbl9NYXJrZXRfMCAlPiUKICBtZXJnZShOb25fTWFya2V0LCBieT0iRmlzY2FsX1llYXIiLCBhbGwueD1UKSAlPiUKICBtZXJnZShGb3JfU2FsZXMsIGJ5PSJGaXNjYWxfWWVhciIsIGFsbC54PVQpICU+JQogIG1lcmdlKE5vdF9Gb3JfU2FsZXMsIGJ5PSJGaXNjYWxfWWVhciIsIGFsbC54PVQpICU+JQogIHJlcGxhY2VfbmEoCiAgICBsaXN0KE5vbl9NYXJrZXRfRXg9MCwgTm9uX01hcmtldF9OQT0wLAogICAgICAgICBGb3JfU2FsZV9FeD0wLCBGb3JfU2FsZV9OQT0wLAogICAgICAgICBOb3RfRm9yX1NhbGVfRXg9MCwgTm90X0Zvcl9TYWxlX05BPTApCiAgKSAlPiUKICBtdXRhdGUoTm9uX01hcmtldF9JbnNwZWN0PU5vbl9NYXJrZXRfRXgrTm9uX01hcmtldF9OQSwKICAgICAgICAgRm9yX1NhbGVfSW5zcGVjdD1Gb3JfU2FsZV9FeCtGb3JfU2FsZV9OQSwKICAgICAgICAgTm90X0Zvcl9TYWxlX0luc3BlY3Q9Tm90X0Zvcl9TYWxlX0V4K05vdF9Gb3JfU2FsZV9OQSkgJT4lCiAgbXV0YXRlKFJhdGU9KE5vbl9NYXJrZXRfRXggKyBGb3JfU2FsZV9FeCArIE5vdF9Gb3JfU2FsZV9FeCkvVG90YWwqMTAwKQpGaWczX0IgJT4lCiAgc2VsZWN0KCJGaXNjYWxfWWVhciIsICJOb25fTWFya2V0X0V4IiwgIk5vbl9NYXJrZXRfSW5zcGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJGb3JfU2FsZV9FeCIsICJGb3JfU2FsZV9JbnNwZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIk5vdF9Gb3JfU2FsZV9FeCIsICJOb3RfRm9yX1NhbGVfSW5zcGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJSYXRlIiwiVG90YWwiKSAlPiUgcHJpbnQoKQoKcm0oTm9uX01hcmtldF8wLCBOb25fTWFya2V0LCBGb3JfU2FsZXMsIE5vdF9Gb3JfU2FsZXMpCgoKYGBgCgoKIyMjIyBGaWcuMyAoQykKYGBge3J9CiMgRGF0YSB1c2luZyBDcyBkZXRlY3Rpb24gaW5zdHJ1bWVudCByZXBvcnRlZCwg4oCcR2Us4oCdIHdlcmUgdXNlZCBmb3IgYW5hbHlzaXMuCgojIEZyZXNod2F0ZXIgZmlzaGVyeSBmb29kc3R1ZmZzIHdlcmUgc3VtbWFyaXplZC4KCiMgU2FtcGxlcyBtYXJrZXRlZCBvciBub24tbWFya2V0ZWQgZm9vZHN0dWZmcyB3ZXJlIHN1bW1hcml6ZWQuCgojICJNYXJpbmUgcHJvZHVjdHMoZnJlc2h3YXRlcikiIGFyZSB0aGUgZnJlc2h3YXRlciBmaXNoZXJ5IHByb2R1Y3RzLgoKIyBUaGUgZm9vZHN0dWZmcyB0aGF0IHdlcmUgbWFya2V0ZWQgYW5kIHByb2R1Y2VkIGZvciBzYWxlcyB3ZXJlIGNvdW50ZWQuCkZpZzNfQyA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgZmlsdGVyKEluc3BlY3Rpb25faW5zdHJ1bWVudD09IkdlIiAmIENhdGVnb3J5PT0iRmlzaGVyeSBwcm9kdWN0cyIpICU+JQogIGZpbHRlcihNYXJrZXQ9PSJNYXJrZXQgcHJvZHVjdHMiKSAlPiUKICBmaWx0ZXIoRm9vZF9jbGFzc2ZpY2F0aW9uPT0iTWFyaW5lX3Byb2R1Y3RzKGZyZXNod2F0ZXIpIikgJT4lCiAgY291bnQoRmlzY2FsX1llYXIsIEV4Y2VlZCkgJT4lCiAgc3ByZWFkKEV4Y2VlZCwgbikgJT4lCiAgcmVwbGFjZV9uYShsaXN0KEV4PTAsIGA8TkE+YD0wKSkgJT4lCiAgbXV0YXRlKEluc3BlY3Q9RXgrYDxOQT5gKSAlPiUKICByZW5hbWUoYyhNYXJrZXRfRXg9RXgsIE1hcmtldF9OQT1gPE5BPmAsIE1hcmtldF9JbnNwZWN0PUluc3BlY3QpKSAlPiUKICBtdXRhdGUoTWFya2V0X1JhdGU9TWFya2V0X0V4L01hcmtldF9JbnNwZWN0KjEwMCkKRmlnM19DICU+JQogIHNlbGVjdCgiRmlzY2FsX1llYXIiLCAiTWFya2V0X0V4IiwgIk1hcmtldF9JbnNwZWN0IiwgIk1hcmtldF9SYXRlIikgJT4lIHByaW50KCkKCgpgYGAKCiMjIyMgRmlnLjMgKEQpIApgYGB7cn0KIyBEYXRhIHVzaW5nIENzIGRldGVjdGlvbiBpbnN0cnVtZW50IHJlcG9ydGVkLCDigJxHZSzigJ0gd2VyZSB1c2VkIGZvciBhbmFseXNpcy4KCiMgRnJlc2h3YXRlciBmaXNoZXJ5IGZvb2RzdHVmZnMgd2VyZSBzdW1tYXJpemVkLgoKIyAiTWFyaW5lIHByb2R1Y3RzKGZyZXNod2F0ZXIpIiBhcmUgdGhlIGZyZXNod2F0ZXIgZmlzaGVyeSBwcm9kdWN0cy4KCiMgV2lsZCBvciBhcXVhY3VsdHVyZSBmaXNoZXJ5IGZvb2RzdHVmZnMgd2VyZSBjb3VudGVkLgpOb25fTWFya2V0XzAgPC0gZGF0YV8yMDEyXzIwMjBfdG90YWxfICU+JQogIGZpbHRlcihJbnNwZWN0aW9uX2luc3RydW1lbnQ9PSJHZSIgJiBDYXRlZ29yeT09IkZpc2hlcnkgcHJvZHVjdHMiKSAlPiUKICBmaWx0ZXIoTWFya2V0IT0iTWFya2V0IHByb2R1Y3RzIikgJT4lCiAgZmlsdGVyKEZvb2RfY2xhc3NmaWNhdGlvbj09Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIpICU+JQogIGNvdW50KEZpc2NhbF9ZZWFyKSAlPiUKICByZW5hbWUoVG90YWw9bikKTm9uX01hcmtldCA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgZmlsdGVyKEluc3BlY3Rpb25faW5zdHJ1bWVudD09IkdlIiAmIENhdGVnb3J5PT0iRmlzaGVyeSBwcm9kdWN0cyIpICU+JQogIGZpbHRlcihNYXJrZXQ9PSJOb24gbWFya2V0IHByb2R1Y3RzIikgJT4lCiAgZmlsdGVyKEZvb2RfY2xhc3NmaWNhdGlvbj09Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIpICU+JQogIGNvdW50KEZpc2NhbF9ZZWFyLCBFeGNlZWQpICU+JQogIHNwcmVhZChFeGNlZWQsIG4pICU+JQogIHJlbmFtZShjKE5vbl9NYXJrZXRfRXg9RXgsIE5vbl9NYXJrZXRfTkE9YDxOQT5gKSkKRm9yX1NhbGVzIDwtIGRhdGFfMjAxMl8yMDIwX3RvdGFsXyAlPiUKICBmaWx0ZXIoSW5zcGVjdGlvbl9pbnN0cnVtZW50PT0iR2UiICYgQ2F0ZWdvcnk9PSJGaXNoZXJ5IHByb2R1Y3RzIikgJT4lCiAgZmlsdGVyKE1hcmtldD09IlByb2R1Y2UgZm9yIHNhbGVzIikgJT4lCiAgZmlsdGVyKEZvb2RfY2xhc3NmaWNhdGlvbj09Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIpICU+JQogIGNvdW50KEZpc2NhbF9ZZWFyLCBFeGNlZWQpICU+JQogIHNwcmVhZChFeGNlZWQsIG4pICU+JQogIG11dGF0ZShFeD0wKSAlPiUKICByZW5hbWUoYyhGb3JfU2FsZV9FeD1FeCwgRm9yX1NhbGVfTkE9YDxOQT5gKSkKTm90X0Zvcl9TYWxlcyA8LSBkYXRhXzIwMTJfMjAyMF90b3RhbF8gJT4lCiAgZmlsdGVyKEluc3BlY3Rpb25faW5zdHJ1bWVudD09IkdlIiAmIENhdGVnb3J5PT0iRmlzaGVyeSBwcm9kdWN0cyIpICU+JQogIGZpbHRlcihNYXJrZXQ9PSJQcm9kdWNlIG5vdCBmb3Igc2FsZXMiKSAlPiUKICBmaWx0ZXIoRm9vZF9jbGFzc2ZpY2F0aW9uPT0iTWFyaW5lX3Byb2R1Y3RzKGZyZXNod2F0ZXIpIikgJT4lCiAgY291bnQoRmlzY2FsX1llYXIsIEV4Y2VlZCkgJT4lCiAgc3ByZWFkKEV4Y2VlZCwgbikgJT4lCiAgcmVuYW1lKGMoTm90X0Zvcl9TYWxlX0V4PUV4LCBOb3RfRm9yX1NhbGVfTkE9YDxOQT5gKSkKRmlnM19EIDwtIE5vbl9NYXJrZXRfMCAlPiUKICBtZXJnZShOb25fTWFya2V0LCBieT0iRmlzY2FsX1llYXIiLCBhbGwueD1UKSAlPiUKICBtZXJnZShGb3JfU2FsZXMsIGJ5PSJGaXNjYWxfWWVhciIsIGFsbC54PVQpICU+JQogIG1lcmdlKE5vdF9Gb3JfU2FsZXMsIGJ5PSJGaXNjYWxfWWVhciIsIGFsbC54PVQpICU+JQogIHJlcGxhY2VfbmEoCiAgICBsaXN0KE5vbl9NYXJrZXRfRXg9MCwgTm9uX01hcmtldF9OQT0wLAogICAgICAgICBGb3JfU2FsZV9FeD0wLCBGb3JfU2FsZV9OQT0wLAogICAgICAgICBOb3RfRm9yX1NhbGVfRXg9MCwgTm90X0Zvcl9TYWxlX05BPTApCiAgKSAlPiUKICBtdXRhdGUoTm9uX01hcmtldF9JbnNwZWN0PU5vbl9NYXJrZXRfRXgrTm9uX01hcmtldF9OQSwKICAgICAgICAgRm9yX1NhbGVfSW5zcGVjdD1Gb3JfU2FsZV9FeCtGb3JfU2FsZV9OQSwKICAgICAgICAgTm90X0Zvcl9TYWxlX0luc3BlY3Q9Tm90X0Zvcl9TYWxlX0V4K05vdF9Gb3JfU2FsZV9OQSkgJT4lCiAgbXV0YXRlKFJhdGU9KE5vbl9NYXJrZXRfRXggKyBGb3JfU2FsZV9FeCArIE5vdF9Gb3JfU2FsZV9FeCkvVG90YWwqMTAwKQpGaWczX0QgJT4lCiAgc2VsZWN0KCJGaXNjYWxfWWVhciIsICJOb25fTWFya2V0X0V4IiwgIk5vbl9NYXJrZXRfSW5zcGVjdCIsCiAgICAgICAgICAgICAgICAgICAiRm9yX1NhbGVfRXgiLCAiRm9yX1NhbGVfSW5zcGVjdCIsCiAgICAgICAgICAgICAgICAgICAiTm90X0Zvcl9TYWxlX0V4IiwgIk5vdF9Gb3JfU2FsZV9JbnNwZWN0IiwKICAgICAgICAgICAgICAgICAgICJSYXRlIiwiVG90YWwiKSAlPiUgcHJpbnQoKQoKcm0oTm9uX01hcmtldF8wLCBOb25fTWFya2V0LCBGb3JfU2FsZXMsIE5vdF9Gb3JfU2FsZXMpCgpgYGAKCgojIGZpZy40IENvbXBhcmlzb24gb2YgdGhlIG51bWJlciBvZiBtYXJpbmUgYW5kIGZyZXNoIHdhdGVyIGZvb2RzdHVmZnMgaGF2aW5nIENzIGRldGVjdGVkIGFuZCBhYm92ZSB0aGUgdGhyZXNob2xkIGNvbmNlbnRyYXRpb24gYmV0d2VlbiB5ZWFyIEZZIDIwMTYgLSAyMDIxCmBgYHtyfQojIERhdGEgdXNpbmcgQ3MgZGV0ZWN0aW9uIGluc3RydW1lbnQgcmVwb3J0ZWQsIOKAnEdlLOKAnSB3ZXJlIHVzZWQgZm9yIGFuYWx5c2lzLgoKIyAiTWFyaW5lIHByb2R1Y3RzKGZyZXNod2F0ZXIpIiBhcmUgdGhlIGZyZXNod2F0ZXIgZmlzaGVyeSBwcm9kdWN0cy4KCmRhdGFfMjAxMl8yMDIwX2Zpc2hfIDwtIGRhdGFfMjAxMl8yMDIwX3RvdGFsXyAlPiUKICBmaWx0ZXIoSW5zcGVjdGlvbl9pbnN0cnVtZW50PT0iR2UiKSAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnk9PSJGaXNoZXJ5IHByb2R1Y3RzIiAmICFpcy5uYShGaXNjYWxfWWVhcikpICU+JQogIG11dGF0ZSgKICAgIE1hcmluZV9XYXRlciA9IGNhc2Vfd2hlbihGb29kX2NsYXNzZmljYXRpb249PSJNYXJpbmVfcHJvZHVjdHMoZnJlc2h3YXRlcikiIH4gIkZyZXNod2F0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvb2RfY2xhc3NmaWNhdGlvbiE9Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIgfiAiTWFyaW5lIikKICAgICkgJT4lCiAgbXV0YXRlKFBlcmlvZD1jYXNlX3doZW4oCiAgICAgIEZpc2NhbF9ZZWFyPT0yMDEyIHwgRmlzY2FsX1llYXI9PTIwMTMgfCBGaXNjYWxfWWVhcj09MjAxNCB8IEZpc2NhbF9ZZWFyPT0yMDE1IH4gIkVhcmx5IiwKICAgICAgRmlzY2FsX1llYXI9PTIwMTYgfCBGaXNjYWxfWWVhcj09MjAxNyB8IEZpc2NhbF9ZZWFyPT0yMDE4IHwgRmlzY2FsX1llYXI9PTIwMTkgfiAiTWlkZGxlIiwKICAgICAgRmlzY2FsX1llYXI9PTIwMjAgfCBGaXNjYWxfWWVhcj09MjAyMSB+ICJMYXRlciIsCiAgICAgIFRSVUUgfiAiT3RoZXJzIgogICAgKQogICkgJT4lCiAgbXV0YXRlKEZhcm1lZF9XaWxkPWNhc2Vfd2hlbigKICAgICAgc3RyX2RldGVjdCjlk4Hnm67lkI0sICLppIrmrpYiKSAmICFzdHJfZGV0ZWN0KOOBneOBruS7liwgIumkiuauluOBp+OBr+OBquOBhCIpIH4gIkZhcm1lZCIsCiAgICAgIHN0cl9kZXRlY3Qo44Gd44Gu5LuWLCAi6aSK5q6WIikgJiAhc3RyX2RldGVjdCjjgZ3jga7ku5YsICLppIrmrpbjgafjga/jgarjgYQiKSB+ICJGYXJtZWQiLAogICAgICAhc3RyX2RldGVjdCjjgZ3jga7ku5YsICLppIrmrpYiKSB8IHN0cl9kZXRlY3Qo44Gd44Gu5LuWLCAi6aSK5q6W44Gn44Gv44Gq44GEIikgfiAiV2lsZCIsCiAgICAgICFzdHJfZGV0ZWN0KOOBneOBruS7liwgIumkiuauliIpIHwgc3RyX2RldGVjdCjjgZ3jga7ku5YsICLppIrmrpbjgafjga/jgarjgYQiKSB+ICJXaWxkIiwKICAgICAgVFJVRSB+ICJXaWxkIgogICAgKQogICkgJT4lCiAgbXV0YXRlKEZyZXNoX0Zhcm1lZD1jYXNlX3doZW4oCiAgICAgIEZvb2RfY2xhc3NmaWNhdGlvbj09Ik1hcmluZV9wcm9kdWN0cyhmcmVzaHdhdGVyKSIgJiBGYXJtZWRfV2lsZD09IldpbGQiIH4gIkZyZXNod2F0ZXIsIHdpbGQiLAogICAgICBGb29kX2NsYXNzZmljYXRpb24hPSJNYXJpbmVfcHJvZHVjdHMoZnJlc2h3YXRlcikiICYgRmFybWVkX1dpbGQ9PSJXaWxkIiB+ICJNYXJpbmUsIHdpbGQiLAogICAgICBGb29kX2NsYXNzZmljYXRpb249PSJNYXJpbmVfcHJvZHVjdHMoZnJlc2h3YXRlcikiICYgRmFybWVkX1dpbGQ9PSJGYXJtZWQiIH4gIkZyZXNod2F0ZXIsIGFxdWFjdWx0dXJlIiwKICAgICAgRm9vZF9jbGFzc2ZpY2F0aW9uIT0iTWFyaW5lX3Byb2R1Y3RzKGZyZXNod2F0ZXIpIiAmIEZhcm1lZF9XaWxkPT0iRmFybWVkIiB+ICJNYXJpbmUsIGFxdWFjdWx0dXJlIiwKICAgICAgVFJVRSB+ICItIgogICAgKQogICkgJT4lCiAgbXV0YXRlKEV4X0RldGVjdD1jYXNlX3doZW4oCiAgICBDc190b3RhbF9maXg+MTAwIH4gIkV4IiwKICAgIENzX3RvdGFsX2ZpeD4yNSB+ICJEZXRlY3QiLAogICAgIUNzX3RvdGFsX2ZpeD4xMDAgfiAiTkQiCiAgKSkKCmRhdGFfRmlzaGVyeV8gPC0gZGF0YV8yMDEyXzIwMjBfZmlzaF8gJT4lIGZpbHRlcihQZXJpb2QhPSJFYXJseSIpCmRhdGFfRmlzaGVyeV8gJT4lCiAgY291bnQoRnJlc2hfRmFybWVkKSAlPiUKICByZW5hbWUoRXhhbWluZWQ9bikgJT4lCiAgbWVyZ2UoCiAgICBkYXRhX0Zpc2hlcnlfICU+JQogICAgICBmaWx0ZXIoQ3NfdG90YWxfZml4PjI1KSAlPiUKICAgICAgY291bnQoRnJlc2hfRmFybWVkKSAlPiUKICAgICAgcmVuYW1lKERldGVjdGVkPW4pLAogICAgYnk9IkZyZXNoX0Zhcm1lZCIsIGFsbC54ID0gVAogICkgJT4lCiAgbWVyZ2UoCiAgICBkYXRhX0Zpc2hlcnlfICU+JQogICAgICBmaWx0ZXIoQ3NfdG90YWxfZml4PjEwMCkgJT4lCiAgICAgIGNvdW50KEZyZXNoX0Zhcm1lZCkgJT4lCiAgICAgIHJlbmFtZShFeGNlZWQ9biksCiAgICBieT0iRnJlc2hfRmFybWVkIiwgYWxsLnggPSBUCiAgKSAlPiUKICByZXBsYWNlX25hKGxpc3QoRnJlc2hfRmFybWVkPSJPdGhlcnMiLCBFeGFtaW5lZD0wLCBEZXRlY3RlZD0wLCBFeGNlZWQ9MCkpICU+JQogIG11dGF0ZShEZXRlY3RfUmF0ZT1EZXRlY3RlZC9FeGFtaW5lZCoxMDApICU+JQogIG11dGF0ZShFeF9SYXRlPUV4Y2VlZC9FeGFtaW5lZCoxMDApICU+JQogIHByaW50KCkKCnJtKGRhdGFfRmlzaGVyeV8sIGRhdGFfMjAxMl8yMDIwX2Zpc2hfKQoKYGBgCgoK