Finding Similar Properties and their Taxbills

library(glue)
ptaxsim_db_conn <- DBI::dbConnect(RSQLite::SQLite(), "./ptaxsim.db/ptaxsim-2021.0.4.db")

# has EAV values, extensions by agency_num
agency_dt <- DBI::dbGetQuery(
  ptaxsim_db_conn,
  "SELECT *
  FROM agency
  WHERE year = 2021
  "
)

# grabs all unique muni names & numbs
# don't forget Cicero
muni_agency_names <- DBI::dbGetQuery(
  ptaxsim_db_conn,
  "SELECT DISTINCT agency_num, agency_name, minor_type
  FROM agency_info
  WHERE minor_type = 'MUNI'
  OR agency_num = '020060000'  

  "
)


# list of all taxcodes in municipalities. 
# This does NOT include unincorporated tax codes!!
doltchi_tax_codes <- DBI::dbGetQuery(
  ptaxsim_db_conn,
  glue_sql("
  SELECT*
  FROM tax_code
  WHERE (agency_num = '030210000' OR agency_num = '030310000')
  AND year = 2021
  ",
  .con = ptaxsim_db_conn
  )
) %>% mutate(tax_code = as.character(tax_code_num))
taxbills_current <- read_csv("./Output/1_Get_All_Pins-CookPinTaxbills_2021_Actual.csv")
# 22,453,875 tax bills in 2021 in municipalities (incorporated areas). 
# 22,972,902 tax bills in all of Cook County in 2021 (incorporated and unincorporated)
# DOES INCLUDE unincorporated tax bills based on how we pulled the data in Step 1.



# 1,825,816 billed properties with 14-digit PINs  for incorporated areras
# 1,864,594 billed properties in Cook county (incorporated and unincorporated)
# 
pin14_bills_current <- taxbills_current %>%
  group_by(tax_code, class, pin) %>%
  
  mutate(total_bill = final_tax_to_dist + final_tax_to_tif) %>% # from each taxing agency
  
  summarize(total_billed = sum(total_bill, na.rm = TRUE), # total on someone's property tax bill
            av = first(av),
            eav = first(eav),
            pin_count_in_parcel = n(),
            final_tax_to_dist = sum(final_tax_to_dist, na.rm = TRUE),
            final_tax_to_tif = sum(final_tax_to_tif, na.rm = TRUE),
            tax_amt_exe = sum(tax_amt_exe, na.rm = TRUE), # revenue lost due to exemptions
            tax_amt_pre_exe = sum(tax_amt_pre_exe, na.rm = TRUE), # total rev before all exemptions
            tax_amt_post_exe = sum(tax_amt_post_exe, na.rm = TRUE), # total rev after all exemptions
            rpm_tif_to_cps = sum(rpm_tif_to_cps, na.rm = TRUE), # not used
            rpm_tif_to_rpm = sum(rpm_tif_to_rpm, na.rm=TRUE), # not used
            rpm_tif_to_dist = sum(rpm_tif_to_dist, na.rm=TRUE), # not used
            tif_share = mean(tif_share, na.rm=TRUE), # not used
  )  %>% 
  mutate(propclass_1dig = str_sub(class, 1, 1))

head(pin14_bills_current)



DoltonChicago <- pin14_bills_current %>% 
  filter(tax_code %in% doltchi_tax_codes$tax_code_num) %>%
  filter(class != "0")


DoltonChicago <- DoltonChicago %>% 
  mutate(tax_code = as.character(tax_code))%>%
  left_join(doltchi_tax_codes) %>% 
  group_by(agency_num, class) %>% arrange(av)

write_csv(DoltonChicago, "./Output/Cholton_taxbills.csv")
nicknames <- readxl::read_excel("./Necessary_Files/muni_shortnames.xlsx")

class_dict <- read_csv("./Necessary_Files/class_dict.csv")

taxcode_taxrates <- read_csv("./Output/2_taxcode_taxrates.csv")


DoltonChicago <- read_csv("./Output/Cholton_taxbills.csv") %>% 
  arrange(av) %>%     
  left_join(taxcode_taxrates) %>%
    mutate(propclass_1dig = str_sub(class, 1, 1))

Max composite tax rate in a tax code in Chicago is 9.1% and minimum composite tax rate is 6.7%. Chicago has 665 tax codes.

Max composite tax rate in a tax code in Dolton is 27.9% and minimum composite tax rate is 22.9%. Dolton has 13 tax codes.

# DoltonChicago %>% 
#   group_by(agency_num, tax_code) %>% 
#   summarize(max_comprate = max(tax_rate_current),
#             min_comprate = min(tax_rate_current)) %>% arrange(-max_comprate)

DoltonChicago %>% group_by(agency_num) %>% 
  summarize(max_comprate = max(tax_rate_current, na.rm=TRUE),
            mean_comprate = mean(tax_rate_current, na.rm=TRUE),
            min_comprate = min(tax_rate_current, na.rm=TRUE)) %>% arrange(-mean_comprate)
## # A tibble: 2 × 4
##   agency_num max_comprate mean_comprate min_comprate
##   <chr>             <dbl>         <dbl>        <dbl>
## 1 030310000        0.279         0.252        0.229 
## 2 030210000        0.0908        0.0671       0.0670
DoltonChicago %>% filter(agency_num == "030310000") %>%
  group_by(agency_num, class) %>% 
  summarize(max_comprate = max(tax_rate_current, na.rm=TRUE),
            mean_comprate = mean(tax_rate_current, na.rm=TRUE),
            min_comprate = min(tax_rate_current, na.rm=TRUE),
            pin_count = n(),
            av = mean(av),
            eav = mean(eav),
            tax_amt_post_exe = mean(tax_amt_post_exe),
            tax_amt_exe = mean(tax_amt_exe),
            tax_amt_pre_exe = mean(tax_amt_pre_exe)) %>% 
  arrange(-pin_count) %>% head() %>% kbl()
agency_num class max_comprate mean_comprate min_comprate pin_count av eav tax_amt_post_exe tax_amt_exe tax_amt_pre_exe
030310000 203 0.27915 0.2517154 0.22937 3609 8462.172 25409.362 3971.0875 2351.644 6322.732
030310000 234 0.27915 0.2437240 0.22937 2374 11825.945 35509.757 5704.2086 2924.786 8628.995
030310000 202 0.27915 0.2637175 0.22937 990 4833.689 14514.148 2225.9500 1615.417 3839.347
030310000 211 0.27915 0.2555963 0.22937 286 14033.490 42138.364 9064.7549 1370.885 10435.640
030310000 100 0.27915 0.2578337 0.22937 221 6529.937 19607.348 5015.0933 0.000 5015.093
030310000 299 0.27915 0.2618058 0.22937 221 2607.186 7828.552 665.1598 1384.339 2049.500
DoltonChicago %>% filter(agency_num == "030210000") %>%
  group_by(agency_num, class) %>% 
  summarize(max_comprate = max(tax_rate_current, na.rm=TRUE),
            mean_comprate = mean(tax_rate_current, na.rm=TRUE),
            min_comprate = min(tax_rate_current, na.rm=TRUE),
            pin_count = n(),
            av = mean(av),
            eav = mean(eav),
            tax_amt_post_exe = mean(tax_amt_post_exe),
            tax_amt_exe = mean(tax_amt_exe),
            tax_amt_pre_exe = mean(tax_amt_pre_exe)) %>% 
  arrange(-pin_count) %>% head() %>% kbl()
agency_num class max_comprate mean_comprate min_comprate pin_count av eav tax_amt_post_exe tax_amt_exe tax_amt_pre_exe
030210000 299 0.08435 0.0671080 0.06697 286419 25845.293 77605.65 4879.667 333.8783 5213.531
030210000 203 0.08244 0.0670568 0.06697 134808 21963.844 65950.83 3504.307 917.8658 4422.150
030210000 211 0.09078 0.0670501 0.06697 120872 36681.360 110143.14 6528.777 858.2396 7387.016
030210000 202 0.08244 0.0670643 0.06697 55917 16138.675 48459.62 2488.226 761.6435 3249.829
030210000 205 0.09078 0.0670673 0.06697 36918 30049.316 90229.10 5194.381 856.2097 6050.591
030210000 100 0.09078 0.0671145 0.06697 32109 6197.712 18609.82 1254.988 0.0000 1254.988
DoltonChicago %>% 
  filter(class == "203") %>% 
  arrange(av)%>%
  group_by(agency_num, class) %>%
  summarize(medianbill = median(total_billed),
            meanbill = mean(total_billed),
            medianAV = median(av),
            meanAV = mean(av),
            )%>% 
 # pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values")  %>%
  kbl(caption= "Chicago and Dolton, Class 203, Measures of the Middle", digits=0, booktabs = T) %>%   
  kable_styling(full_width = T)
Chicago and Dolton, Class 203, Measures of the Middle
agency_num class medianbill meanbill medianAV meanAV
030210000 203 3151 3504 20000 21964
030310000 203 4152 3971 8874 8462
DoltonChicago %>% 
  filter(class == "205") %>% 
  group_by(agency_num, class) %>%
  summarize(medianbill = median(total_billed),
            meanbill = mean(total_billed),
            medianAV = median(av),
            meanAV = mean(av),
            )%>% 
 # pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values")  %>%
  kbl(caption= "Chicago and Dolton, Class 205, Measures of the Middle", digits=0, booktabs = T) %>%   
  kable_styling(full_width = T)
Chicago and Dolton, Class 205, Measures of the Middle
agency_num class medianbill meanbill medianAV meanAV
030210000 205 4168 5194 25000 30049
030310000 205 3515 4006 6980 7834
DoltonChicago %>% 
  filter(class == "211") %>% 
  group_by(agency_num, class) %>%
  summarize(medianbill = median(total_billed),
            meanbill = mean(total_billed),
            medianAV = median(av),
            meanAV = mean(av),
            )%>% 
 # pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values")  %>%
  kbl(caption= "Chicago and Dolton, Class 211, Measures of the Middle", digits=0, booktabs = T) %>%   
  kable_styling(full_width = T)
Chicago and Dolton, Class 211, Measures of the Middle
agency_num class medianbill meanbill medianAV meanAV
030210000 211 4640 6529 28000 36681
030310000 211 8878 9065 15192 14033
DoltonChicago %>% 
  filter(class == "234") %>% 
  group_by(agency_num, class) %>%
  summarize(medianbill = median(total_billed),
            meanbill = mean(total_billed),
            medianAV = median(av),
            meanAV = mean(av),
            )%>% 
 # pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values")  %>%
  kbl(caption= "Chicago and Dolton, Class 234, Measures of the Middle", digits=0, booktabs = T) %>%   
  kable_styling(full_width = T)
Chicago and Dolton, Class 234, Measures of the Middle
agency_num class medianbill meanbill medianAV meanAV
030210000 234 2420 2953 15999 18781
030310000 234 6043 5704 11990 11826

Using similarily Assessed Value properties

Chicago has 655 tax codes in its borders and Dolton has 13 tax codes in its borders.

Class 203

One story residence, any age, 1,000 to 1,800 sq. ft.

DoltonChicago %>% 
  filter(agency_num == "030210000" ) %>% #& class == "203" & between(av,9950,10050)) %>% 
  group_by(tax_code) %>% 
  summarize(count = n(),            
            avg_current_comprate = mean(tax_rate_current, na.rm=TRUE)
  ) %>% arrange(-avg_current_comprate) %>% head()
## # A tibble: 6 × 3
##   tax_code count avg_current_comprate
##      <dbl> <int>                <dbl>
## 1    70039   212               0.0908
## 2    70048    89               0.0844
## 3    72185   214               0.0824
## 4    70071    78               0.0790
## 5    77098   125               0.0782
## 6    72157    35               0.0758
DoltonChicago %>% 
  filter(agency_num == "030310000") %>% # & class == "203" & between(av, 9950, 10050)) %>%
  group_by(tax_code) %>%
  summarize(count = n(),
            avg_current_comprate = mean(tax_rate_current, na.rm=TRUE)
  ) %>% arrange(-avg_current_comprate) %>% head()
## # A tibble: 6 × 3
##   tax_code count avg_current_comprate
##      <dbl> <int>                <dbl>
## 1    37035  4038                0.279
## 2    37039   259                0.230
## 3    37034  4486                0.229
## 4    37036    83              NaN    
## 5    37037    36              NaN    
## 6    37038     5              NaN

If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions….

For property class 203 PINs with assessed values between $9,000 and $11,000, the average change in tax bill would be $75 more in Chicago and $205 more in Dolton compared to their current tax bills ($1475 and $4312 respectively).

The “average” property tax payer would think they are saving $624 in Chicago and $2708 in Dolton due to exemptions. This number appears on their taxbill and calculated by the full EAV * current tax rate and does NOT consider the change in tax rate that would occur if levies are held constant and all EAV became taxable.

Chi3 <- DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "203" & between(av,9000,11000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

Dol3 <- DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "203" & between(av, 9000, 11000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

both_dt <- cbind(Chi3, Dol3)


kbl(both_dt, booktabs = T, digits = 0, 
    caption = "Property Class 203 Comparison, AV ~ $10,000 (9000-11000 range)") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
Property Class 203 Comparison, AV ~ $10,000 (9000-11000 range)
Chicago
Dolton
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 24
bill_current 1475 bill_current 4312
bill_hyp 1550 bill_hyp 4517
bill_change 74 bill_change 205
tax_amt_post_exe 1475 tax_amt_post_exe 4312
tax_amt_exe 624 tax_amt_exe 2708
tax_amt_pre_exe 2099 tax_amt_pre_exe 7020
pin_count 4801 pin_count 1466
av 10424 av 9769
eav 31301 eav 29333

Changing the range of PINs included in the calculation alters the “Median Property Statistic”

If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions….

For property class 203 PINs with assessed values between $8,000 and $12,000, the average change in tax bill would be $98 more in Chicago and $55 more in Dolton compared to their current tax bills ($1513 and $4342 respectively).

Chi3 <- DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "203" & between(av,8000,12000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
Dol3 <- DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "203" & between(av, 8000, 12000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

both_dt <- cbind(Chi3, Dol3)


kbl(both_dt, booktabs = T, digits = 0, 
    caption = "Property Major Class 2 Comparison, AV ~ $10,000 (AV range $8000-$12000)") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago Class 203, 8K-12K Property Stats" = 2, "Dolton Class 203, 8L-12K AV Property Stats" = 2))
Property Major Class 2 Comparison, AV ~ $10,000 (AV range $8000-$12000)
Chicago Class 203, 8K-12K Property Stats
Dolton Class 203, 8L-12K AV Property Stats
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 24
bill_current 1513 bill_current 4342
bill_hyp 1611 bill_hyp 4396
bill_change 98 bill_change 55
tax_amt_post_exe 1513 tax_amt_post_exe 4342
tax_amt_exe 676 tax_amt_exe 2519
tax_amt_pre_exe 2190 tax_amt_pre_exe 6860
pin_count 10480 pin_count 2541
av 10871 av 9380
eav 32643 eav 28166

Major Class 2

Average and median tax bills and assessed values are calculated below for ALL property class types within the the broader “Residential” property class type (property classes that have the first digit “2”, or Major Class Type 2)

The median AV is used to select a range of pins (based on their AV) to calculate the average current bill, hypothetical bill, and hypothetical change in tax bill for a “median property”.

This is done because some properties receive multiple exemptions while others receive none. Using the literal median pin can skew the summary statistics of that specific pin receives no exemptions or multiple exemptions. The average for the range of “median PINs” is created to smooth out the variation within the observations.

DoltonChicago %>% 
  filter(propclass_1dig == "2") %>% 
  arrange(av) %>%
  group_by(agency_num) %>%
  summarize(medianbill = median(total_billed),
            meanbill = mean(total_billed),
            medianAV = median(av),
            meanAV = mean(av),
            pin_count = n()
            )%>% 
 # pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values")  %>%
  kbl(caption= "Chicago and Dolton, Major Class 2, Measures of the Middle", digits=0, booktabs = T) %>%   
  kable_styling(full_width = T)
Chicago and Dolton, Major Class 2, Measures of the Middle
agency_num medianbill meanbill medianAV meanAV pin_count
030210000 3619 5244 21119 29123 732952
030310000 4304 4364 9132 8929 8275
# 
# DoltonChicago %>% 
#   filter(propclass_1dig == "3") %>% 
#   arrange(av) %>%
#   group_by(agency_num) %>%
#   summarize(medianbill = median(total_billed),
#             meanbill = mean(total_billed),
#             medianAV = median(av),
#             meanAV = mean(av),
#             pin_count = n()
#             )%>% 
#  # pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values")  %>%
#   kbl(caption= "Chicago and Dolton, Major Class 3, Measures of the Middle", digits=0, booktabs = T) %>%   
#   kable_styling(full_width = T)

If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $1570 (an $14 increase from $1556) and Dolton’s would be $4610 (a $30 increase from $4580).

On average, residents would think they “saved” $501 in Chicago and $2588 in Dolton (based on tax_amt_exe which also shows up on their tax bill based on the “naive” pre-tax exemption tax bill amount on the tax bill). The amount saved per person will depend on how many exemptions they qualified for in the first place. This is a rough average for all types of exemptions and includes those that received no exemptions and multiiple exemptions.

Values were calculated by selecting pins with AVs between $9000 and $11,000 and then calculating the average current bill, change in bill, and other statistics seen in the table. Pin count tells you the number of pins that were included in the AV range used for the “median property.”

Chi3 <- DoltonChicago %>% 
  filter(agency_num == "030210000" & propclass_1dig == "2" & between(av,9000,11000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
Dol3 <- DoltonChicago %>% 
  filter(agency_num == "030310000" & propclass_1dig == "2" & between(av, 9000, 11000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

both_dt <- cbind(Chi3, Dol3)


kbl(both_dt, booktabs = T, digits = 0, 
    caption = "Property Major Class 2 Comparison, AV ~ $10,000 (AV range $9000-$11000)") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
Property Major Class 2 Comparison, AV ~ $10,000 (AV range $9000-$11000)
Chicago
Dolton
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 24
bill_current 1556 bill_current 4580
bill_hyp 1570 bill_hyp 4610
bill_change 14 bill_change 30
tax_amt_post_exe 1556 tax_amt_post_exe 4580
tax_amt_exe 501 tax_amt_exe 2588
tax_amt_pre_exe 2057 tax_amt_pre_exe 7168
pin_count 34215 pin_count 1823
av 10199 av 9869
eav 30623 eav 29635
Chi3 <- DoltonChicago %>% 
  filter(agency_num == "030210000" & propclass_1dig == "2" & between(av,8000,12000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
Dol3 <- DoltonChicago %>% 
  filter(agency_num == "030310000" & propclass_1dig == "2" & between(av, 8000, 12000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

both_dt <- cbind(Chi3, Dol3)


kbl(both_dt, booktabs = T, digits = 0, 
    caption = "Property Major Class 2 Comparison, AV ~ $10,000 (AV range $8000-$12000)") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
Property Major Class 2 Comparison, AV ~ $10,000 (AV range $8000-$12000)
Chicago
Dolton
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 25
bill_current 1579 bill_current 4796
bill_hyp 1592 bill_hyp 4698
bill_change 13 bill_change -99
tax_amt_post_exe 1579 tax_amt_post_exe 4796
tax_amt_exe 504 tax_amt_exe 2539
tax_amt_pre_exe 2083 tax_amt_pre_exe 7335
pin_count 62480 pin_count 3885
av 10329 av 9943
eav 31015 eav 29855

If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $1592 (an $13 increase from $1579) and Dolton’s would be $4598 (a $99 DECREASE from $4596).

Values were calculated by selecting pins with AVs between $8000 and $12,000 and then calculating the average current bill, change in bill, and other statistics seen in the table. Pin count tells you the number of pins that were included in the AV range used for the “median property.”

Increasing the number of pins included in the measurement of “average bill” and “average bill change” completely changed the results for Dolton. Using the “median” value must be done super carefully.

If we “removed” only homeowners exemptions or only senior exemptions, then the median statistic would be more reliable… potentially.

Class 205

Two or more story residence, over 62 years, up to 2,200 sq. ft

Chi3 <- DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "205" & between(av,8000,12000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")


Dol3 <- DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "205" & between(av, 8000, 12000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  )  %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

both_dt <- cbind(Chi3, Dol3)


kbl(both_dt, booktabs = T, digits = 0, 
    caption = "Property Class 205 Comparison, AV ~ $10,000 (8000 to 12000 AV range)") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
Property Class 205 Comparison, AV ~ $10,000 (8000 to 12000 AV range)
Chicago
Dolton
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 27
bill_current 1503 bill_current 5147
bill_hyp 1530 bill_hyp 4755
bill_change 27 bill_change -392
tax_amt_post_exe 1503 tax_amt_post_exe 5147
tax_amt_exe 622 tax_amt_exe 2353
tax_amt_pre_exe 2124 tax_amt_pre_exe 7500
pin_count 2832 pin_count 55
av 10544 av 9427
eav 31660 eav 28305

Class 211

Two to six residential apartments, any age.

Chi3 <- DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "211" & between(av,17000,19000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")


Dol3 <- DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "211" & between(av, 17000, 19000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

both_dt <- cbind(Chi3, Dol3)


kbl(both_dt, booktabs = T, digits = 0, 
    caption = "Property Class 211 Comparison, AV ~ $18,000") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
Property Class 211 Comparison, AV ~ $18,000
Chicago
Dolton
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 24
bill_current 3040 bill_current 11459
bill_hyp 2782 bill_hyp 8211
bill_change -258 bill_change -3249
tax_amt_post_exe 3040 tax_amt_post_exe 11459
tax_amt_exe 628 tax_amt_exe 1231
tax_amt_pre_exe 3668 tax_amt_pre_exe 12690
pin_count 6747 pin_count 54
av 18217 av 17707
eav 54701 eav 53170

Class 234

Split level residence, with a lower level below grade, all ages, all sizes

Chi3 <- DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "234" & between(av,12000,13000)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")


Dol3 <- DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "234" & between(av, 12450, 12750)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
    tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")

both_dt <- cbind(Chi3, Dol3)


kbl(both_dt, booktabs = T, digits = 0, 
    caption = "Property Class 234 Comparison, AV ~ $12,500") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
Property Class 234 Comparison, AV ~ $12,500
Chicago
Dolton
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 24
bill_current 1763 bill_current 5944
bill_hyp 1824 bill_hyp 5861
bill_change 61 bill_change -82
tax_amt_post_exe 1763 tax_amt_post_exe 5944
tax_amt_exe 779 tax_amt_exe 3176
tax_amt_pre_exe 2542 tax_amt_pre_exe 9120
pin_count 591 pin_count 215
av 12613 av 12606
eav 37872 eav 37851

Other ways to compare locations (that I don’t like as much)

Median Chicago AV vs Median Dolton AV

## Chicago #

Chi1 <- DoltonChicago %>% 
  arrange(av)%>%
  filter(agency_num == "030210000" & class == "203" & between(av,18000,22000)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    hypothetical_taxrate = mean(taxrate_new, na.rm=TRUE),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
  # kbl(caption= "Chicago, Class 203, Tax Bill ~$3150", digits=0, booktabs = T)


## Dolton ## 

Dol1<- DoltonChicago %>% 
  arrange(av) %>%
  filter(agency_num == "030310000" & class == "203" & between(av,8000,12000)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    hypothetical_taxrate = mean(taxrate_new, na.rm=TRUE),

    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")


both_dt <- cbind(Chi1, Dol1)


kbl(both_dt, booktabs = T, digits = 0, caption = "Property Class 203 Comparison, Chicago Median AV vs Dolton Median AV") %>%
  kable_styling(full_width = T) %>%
add_header_above(c("Chicago Median AV 203 Property" = 2, "Dolton Median AV 203 Property" = 2))
Property Class 203 Comparison, Chicago Median AV vs Dolton Median AV
Chicago Median AV 203 Property
Dolton Median AV 203 Property
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 24
hypothetical_taxrate 0 hypothetical_taxrate 0
bill_current 3132 bill_current 4342
bill_hyp 3280 bill_hyp 4396
bill_change 148 bill_change 55
tax_amt_post_exe 3132 tax_amt_post_exe 4342
tax_amt_exe 897 tax_amt_exe 2519
tax_amt_pre_exe 4029 tax_amt_pre_exe 6860
pin_count 28012 pin_count 2541
av 20009 av 9380
eav 60082 eav 28166

Median Chicago Taxbill vs Median Dolton Taxbill

## Chicago #

Chi1 <- DoltonChicago %>% 
  arrange(av)%>%
  filter(agency_num == "030210000" & class == "203" & between(total_billed,3100,3300)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
  # kbl(caption= "Chicago, Class 203, Tax Bill ~$3150", digits=0, booktabs = T)


## Dolton ## 

Dol1<- DoltonChicago %>% 
  arrange(av) %>%
  filter(agency_num == "030310000" & class == "203" & between(total_billed,3100,3300)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
  ) %>% 
  pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values") #%>% 
  # kbl(caption= "Dolton, Class 203, Tax Bill ~ $3150", digits=0, booktabs = T)


# av = 
#exempt eav = 


both_dt <- cbind(Chi1, Dol1)


kbl(both_dt, booktabs = T, digits = 0, caption = "Property Class 203 Comparison, Tax Bill ~ $3,150 (Chicago's median current bill)") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
Property Class 203 Comparison, Tax Bill ~ $3,150 (Chicago’s median current bill)
Chicago
Dolton
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 25
bill_current 3181 bill_current 3194
bill_hyp 3268 bill_hyp 3408
bill_change 87 bill_change 214
tax_amt_post_exe 3181 tax_amt_post_exe 3194
tax_amt_exe 822 tax_amt_exe 2164
tax_amt_pre_exe 4003 tax_amt_pre_exe 5358
pin_count 6292 pin_count 84
av 19884 av 7156
eav 59706 eav 21487
Chi1a <- DoltonChicago %>% filter(agency_num == "030210000" & class == "203" & between(total_billed,4100,4200)) %>%
  arrange(av)%>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)
                ) %>% 
  pivot_longer(comp_taxrate:eav, names_to = "Stats", values_to = "Values") 
# kbl(caption= "Chicago, Class 203, Tax Bill ~$3150", digits=0, booktabs = T)


## Chicago ## 

# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
#DoltonChicago %>% filter(agency_num == "030310000" & class == "203" & between(total_billed,3140,3160))

Dol1a <- DoltonChicago %>% filter(agency_num == "030310000" & class == "203" & between(total_billed,4100,4200)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)) %>% 
  pivot_longer(comp_taxrate:eav, names_to = "Stats", values_to = "Values") #%>% 
# kbl(caption= "Dolton, Class 203, Tax Bill ~ $3150", digits=0, booktabs = T)


# av = 
#exempt eav = 


both_dt <- cbind(Chi1a, Dol1a)


kbl(both_dt, booktabs = T, digits = 0, caption = "Property Class 203 Comparison, Tax Bill ~ $4150 (Dolton's median current bill)") %>%
  kable_styling(full_width = T) %>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
Property Class 203 Comparison, Tax Bill ~ $4150 (Dolton’s median current bill)
Chicago
Dolton
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 24
bill_current 4158 bill_current 4151
bill_hyp 4193 bill_hyp 4202
bill_change 35 bill_change 52
tax_amt_post_exe 4158 tax_amt_post_exe 4151
tax_amt_exe 901 tax_amt_exe 2431
tax_amt_pre_exe 5059 tax_amt_pre_exe 6581
pin_count 1173 pin_count 79
av 25133 av 9068
eav 75468 eav 27228
both_dt <- cbind(Chi1, Dol1a)


kbl(both_dt, booktabs = T, digits = 0, caption = "Property Class 203 Comparison, Median Dolton vs Median Chicago") %>%
  kable_styling(full_width = T)%>%
add_header_above(c("Chicago Median 203 Property" = 2, "Dolton Median 203 Property" = 2))
Property Class 203 Comparison, Median Dolton vs Median Chicago
Chicago Median 203 Property
Dolton Median 203 Property
Stats Values Stats Values
comp_taxrate 7 comp_taxrate 24
bill_current 3181 bill_current 4151
bill_hyp 3268 bill_hyp 4202
bill_change 87 bill_change 52
tax_amt_post_exe 3181 tax_amt_post_exe 4151
tax_amt_exe 822 tax_amt_exe 2431
tax_amt_pre_exe 4003 tax_amt_pre_exe 6581
pin_count 6292 pin_count 79
av 19884 av 9068
eav 59706 eav 27228

Using a current tax bill ~$3500:

If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $3644 (an $87 increase from $3557) and Dolton’s would be $3692 (a $136 increase from $3555).

DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "203" & between(tax_amt_post_exe, 3500, 3600)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav))  %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
  kbl(caption= "Chicago, Class 203, Current Bill ~ $3,550", digits=0)
Chicago, Class 203, Current Bill ~ $3,550
Stats Values
comp_taxrate 7
bill_current 3557
bill_hyp 3644
bill_change 87
tax_amt_post_exe 3557
tax_amt_exe 846
tax_amt_pre_exe 4403
pin_count 3141
av 21866
eav 65656
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "203" & between(tax_amt_post_exe,3500,3600)) %>%
    summarize(              
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av), 
    eav = mean(eav)) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
  kbl(caption= "Dolton, Class 203, Current Bill ~ $3,550", digits=0)
Dolton, Class 203, Current Bill ~ $3,550
Stats Values
comp_taxrate 24
bill_current 3555
bill_hyp 3692
bill_change 137
tax_amt_post_exe 3555
tax_amt_exe 2190
tax_amt_pre_exe 5745
pin_count 55
av 8129
eav 24408

Using a current tax bill ~$3700:

Value was chosen randomly as roughly between the median property AV in Dolton and Chicago.

For post-exemption bills around $3700: Chicago has $26,448 AV and $79,420 in EAV. Chicago’s Composite tax rate for the properties examined is 6.7%. Dolton has an AV of $7,631 and $22,914 in EAV. Dolton’s average composite tax rate for the properties examined was 24.2%.

If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $4503 (an $802 increase from $3700) and Dolton’s would be $3479 (a $220 DECREASE from $3700).

## Chicago ## 
DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "203" & between(tax_amt_post_exe, 3695, 3705)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,

    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av),
    eav = mean(eav)
  )  %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
  kbl(caption= "Chicago NOT ENOGUH PINS, Class 203, Current Bill ~$3,700", digits=0)
Chicago NOT ENOGUH PINS, Class 203, Current Bill ~$3,700
Stats Values
comp_taxrate 7
bill_current 3700
bill_hyp 4503
bill_change 803
tax_amt_exe 1626
tax_amt_pre_exe 5325
pin_count 47
av 26449
eav 79418
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)

## Dolton ## 
DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "203" & between(tax_amt_post_exe,3695,3705)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),  
    bill_change = bill_hyp - bill_current,
    tax_amt_pre_exe = mean(tax_amt_pre_exe), # the naive amount that appears on peoples taxbills
    pin_count = n(),
    av = mean(av),
    eav = mean(eav)
  ) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
  kbl(caption= "Dolton NOT ENOUGH PINS, Class 203, Current Bill ~ $3,700" , digits=0)
Dolton NOT ENOUGH PINS, Class 203, Current Bill ~ $3,700
Stats Values
comp_taxrate 24
bill_current 3700
bill_hyp 3479
bill_change -221
tax_amt_pre_exe 5421
pin_count 4
av 7631
eav 22914

Expanded taxbill range:

## Chicago ## 
DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "203" & between(tax_amt_post_exe, 3600, 3800)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,

    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av),
    eav = mean(eav)
  )  %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
  kbl(caption= "Chicago, Class 203, Current Bill ~$3,700", digits=0)
Chicago, Class 203, Current Bill ~$3,700
Stats Values
comp_taxrate 7
bill_current 3713
bill_hyp 3679
bill_change -34
tax_amt_exe 719
tax_amt_pre_exe 4431
pin_count 5195
av 22013
eav 66098
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)

## Dolton ## 
DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "203" & between(tax_amt_post_exe,3600,3800)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),  
    bill_change = bill_hyp - bill_current,
    tax_amt_pre_exe = mean(tax_amt_pre_exe), # the naive amount that appears on peoples taxbills
    pin_count = n(),
    av = mean(av),
    eav = mean(eav)
  ) %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
  kbl(caption= "Dolton, Class 203, Current Bill ~ $3,700", digits=0)
Dolton, Class 203, Current Bill ~ $3,700
Stats Values
comp_taxrate 24
bill_current 3703
bill_hyp 3870
bill_change 167
tax_amt_pre_exe 5987
pin_count 124
av 8462
eav 25408

Using pre-exemption taxbill amount of $3700:

For pre exemption tax bills around $3700 in Chicago, average AV is $18,378, EAV is $55,184. Average current taxbill is $2901.

Chicago’s Composite tax rate for the properties examined is 6.7%. Dolton’s average composite tax rate for the properties examiend was 24.2%.

For pre exemption tax bills around $3700 in Dolton, average AV is $5,235, EAV is $15,719. Average current taxbill is $3044.

If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $2990 (an $89 increase from $2901) and Dolton’s would be $2377 (a $667 DECREASE from $3044).

Uses a tax bill range of 3600 to 3800 to increase “median pins” used for summary stats.

## Chicago ## 
DoltonChicago %>% 
  filter(agency_num == "030210000" & class == "203" & between(tax_amt_pre_exe, 3600, 3800)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_post_exe = mean(tax_amt_post_exe),
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av),
    eav = mean(eav)
  )  %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
  kbl(caption= "Chicago, Class 203, Naive Pre-Exemp Bill ~ $3,700", digits=0)
Chicago, Class 203, Naive Pre-Exemp Bill ~ $3,700
Stats Values
comp_taxrate 7
bill_current 2737
bill_hyp 2898
bill_change 161
tax_amt_post_exe 2737
tax_amt_exe 895
tax_amt_pre_exe 3632
pin_count 6162
av 18023
eav 54119
## Dolton ##
DoltonChicago %>% 
  filter(agency_num == "030310000" & class == "203" & between(tax_amt_pre_exe,3600,3800)) %>%
  summarize(
    comp_taxrate = mean(tax_code_rate),
    bill_current = mean(tax_amt_post_exe),
    bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
    bill_change = bill_hyp - bill_current,
    tax_amt_exe = mean(tax_amt_exe),
    tax_amt_pre_exe = mean(tax_amt_pre_exe),
    pin_count = n(),
    av = mean(av),
    eav = mean(eav)
  )  %>% 
    pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
  kbl(caption= "Dolton, Class 203, Naive Pre-Exemp Bill ~ $3,700", digits=0)
Dolton, Class 203, Naive Pre-Exemp Bill ~ $3,700
Stats Values
comp_taxrate 26
bill_current 1850
bill_hyp 2361
bill_change 512
tax_amt_exe 1833
tax_amt_pre_exe 3683
pin_count 29
av 4796
eav 14401
LS0tDQp0aXRsZTogIjRiX1NpbWlsYXIgUHJvcGVydGllcyINCmF1dGhvcjogIkFsZWEgV2lsYnVyIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCg0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZ3N0YXQpDQpsaWJyYXJ5KHB0YXhzaW0pDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmBgYA0KDQojIEZpbmRpbmcgU2ltaWxhciBQcm9wZXJ0aWVzIGFuZCB0aGVpciBUYXhiaWxscw0KDQpgYGB7cn0NCmxpYnJhcnkoZ2x1ZSkNCnB0YXhzaW1fZGJfY29ubiA8LSBEQkk6OmRiQ29ubmVjdChSU1FMaXRlOjpTUUxpdGUoKSwgIi4vcHRheHNpbS5kYi9wdGF4c2ltLTIwMjEuMC40LmRiIikNCg0KIyBoYXMgRUFWIHZhbHVlcywgZXh0ZW5zaW9ucyBieSBhZ2VuY3lfbnVtDQphZ2VuY3lfZHQgPC0gREJJOjpkYkdldFF1ZXJ5KA0KICBwdGF4c2ltX2RiX2Nvbm4sDQogICJTRUxFQ1QgKg0KICBGUk9NIGFnZW5jeQ0KICBXSEVSRSB5ZWFyID0gMjAyMQ0KICAiDQopDQoNCiMgZ3JhYnMgYWxsIHVuaXF1ZSBtdW5pIG5hbWVzICYgbnVtYnMNCiMgZG9uJ3QgZm9yZ2V0IENpY2Vybw0KbXVuaV9hZ2VuY3lfbmFtZXMgPC0gREJJOjpkYkdldFF1ZXJ5KA0KICBwdGF4c2ltX2RiX2Nvbm4sDQogICJTRUxFQ1QgRElTVElOQ1QgYWdlbmN5X251bSwgYWdlbmN5X25hbWUsIG1pbm9yX3R5cGUNCiAgRlJPTSBhZ2VuY3lfaW5mbw0KICBXSEVSRSBtaW5vcl90eXBlID0gJ01VTkknDQogIE9SIGFnZW5jeV9udW0gPSAnMDIwMDYwMDAwJyAgDQoNCiAgIg0KKQ0KDQoNCiMgbGlzdCBvZiBhbGwgdGF4Y29kZXMgaW4gbXVuaWNpcGFsaXRpZXMuIA0KIyBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgdW5pbmNvcnBvcmF0ZWQgdGF4IGNvZGVzISENCmRvbHRjaGlfdGF4X2NvZGVzIDwtIERCSTo6ZGJHZXRRdWVyeSgNCiAgcHRheHNpbV9kYl9jb25uLA0KICBnbHVlX3NxbCgiDQogIFNFTEVDVCoNCiAgRlJPTSB0YXhfY29kZQ0KICBXSEVSRSAoYWdlbmN5X251bSA9ICcwMzAyMTAwMDAnIE9SIGFnZW5jeV9udW0gPSAnMDMwMzEwMDAwJykNCiAgQU5EIHllYXIgPSAyMDIxDQogICIsDQogIC5jb24gPSBwdGF4c2ltX2RiX2Nvbm4NCiAgKQ0KKSAlPiUgbXV0YXRlKHRheF9jb2RlID0gYXMuY2hhcmFjdGVyKHRheF9jb2RlX251bSkpDQoNCmBgYA0KDQpgYGB7ciBldmFsID0gRkFMU0V9DQp0YXhiaWxsc19jdXJyZW50IDwtIHJlYWRfY3N2KCIuL091dHB1dC8xX0dldF9BbGxfUGlucy1Db29rUGluVGF4YmlsbHNfMjAyMV9BY3R1YWwuY3N2IikNCiMgMjIsNDUzLDg3NSB0YXggYmlsbHMgaW4gMjAyMSBpbiBtdW5pY2lwYWxpdGllcyAoaW5jb3Jwb3JhdGVkIGFyZWFzKS4gDQojIDIyLDk3Miw5MDIgdGF4IGJpbGxzIGluIGFsbCBvZiBDb29rIENvdW50eSBpbiAyMDIxIChpbmNvcnBvcmF0ZWQgYW5kIHVuaW5jb3Jwb3JhdGVkKQ0KIyBET0VTIElOQ0xVREUgdW5pbmNvcnBvcmF0ZWQgdGF4IGJpbGxzIGJhc2VkIG9uIGhvdyB3ZSBwdWxsZWQgdGhlIGRhdGEgaW4gU3RlcCAxLg0KDQoNCg0KIyAxLDgyNSw4MTYgYmlsbGVkIHByb3BlcnRpZXMgd2l0aCAxNC1kaWdpdCBQSU5zICBmb3IgaW5jb3Jwb3JhdGVkIGFyZXJhcw0KIyAxLDg2NCw1OTQgYmlsbGVkIHByb3BlcnRpZXMgaW4gQ29vayBjb3VudHkgKGluY29ycG9yYXRlZCBhbmQgdW5pbmNvcnBvcmF0ZWQpDQojIA0KcGluMTRfYmlsbHNfY3VycmVudCA8LSB0YXhiaWxsc19jdXJyZW50ICU+JQ0KICBncm91cF9ieSh0YXhfY29kZSwgY2xhc3MsIHBpbikgJT4lDQogIA0KICBtdXRhdGUodG90YWxfYmlsbCA9IGZpbmFsX3RheF90b19kaXN0ICsgZmluYWxfdGF4X3RvX3RpZikgJT4lICMgZnJvbSBlYWNoIHRheGluZyBhZ2VuY3kNCiAgDQogIHN1bW1hcml6ZSh0b3RhbF9iaWxsZWQgPSBzdW0odG90YWxfYmlsbCwgbmEucm0gPSBUUlVFKSwgIyB0b3RhbCBvbiBzb21lb25lJ3MgcHJvcGVydHkgdGF4IGJpbGwNCiAgICAgICAgICAgIGF2ID0gZmlyc3QoYXYpLA0KICAgICAgICAgICAgZWF2ID0gZmlyc3QoZWF2KSwNCiAgICAgICAgICAgIHBpbl9jb3VudF9pbl9wYXJjZWwgPSBuKCksDQogICAgICAgICAgICBmaW5hbF90YXhfdG9fZGlzdCA9IHN1bShmaW5hbF90YXhfdG9fZGlzdCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGZpbmFsX3RheF90b190aWYgPSBzdW0oZmluYWxfdGF4X3RvX3RpZiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHRheF9hbXRfZXhlID0gc3VtKHRheF9hbXRfZXhlLCBuYS5ybSA9IFRSVUUpLCAjIHJldmVudWUgbG9zdCBkdWUgdG8gZXhlbXB0aW9ucw0KICAgICAgICAgICAgdGF4X2FtdF9wcmVfZXhlID0gc3VtKHRheF9hbXRfcHJlX2V4ZSwgbmEucm0gPSBUUlVFKSwgIyB0b3RhbCByZXYgYmVmb3JlIGFsbCBleGVtcHRpb25zDQogICAgICAgICAgICB0YXhfYW10X3Bvc3RfZXhlID0gc3VtKHRheF9hbXRfcG9zdF9leGUsIG5hLnJtID0gVFJVRSksICMgdG90YWwgcmV2IGFmdGVyIGFsbCBleGVtcHRpb25zDQogICAgICAgICAgICBycG1fdGlmX3RvX2NwcyA9IHN1bShycG1fdGlmX3RvX2NwcywgbmEucm0gPSBUUlVFKSwgIyBub3QgdXNlZA0KICAgICAgICAgICAgcnBtX3RpZl90b19ycG0gPSBzdW0ocnBtX3RpZl90b19ycG0sIG5hLnJtPVRSVUUpLCAjIG5vdCB1c2VkDQogICAgICAgICAgICBycG1fdGlmX3RvX2Rpc3QgPSBzdW0ocnBtX3RpZl90b19kaXN0LCBuYS5ybT1UUlVFKSwgIyBub3QgdXNlZA0KICAgICAgICAgICAgdGlmX3NoYXJlID0gbWVhbih0aWZfc2hhcmUsIG5hLnJtPVRSVUUpLCAjIG5vdCB1c2VkDQogICkgICU+JSANCiAgbXV0YXRlKHByb3BjbGFzc18xZGlnID0gc3RyX3N1YihjbGFzcywgMSwgMSkpDQoNCmhlYWQocGluMTRfYmlsbHNfY3VycmVudCkNCg0KDQoNCkRvbHRvbkNoaWNhZ28gPC0gcGluMTRfYmlsbHNfY3VycmVudCAlPiUgDQogIGZpbHRlcih0YXhfY29kZSAlaW4lIGRvbHRjaGlfdGF4X2NvZGVzJHRheF9jb2RlX251bSkgJT4lDQogIGZpbHRlcihjbGFzcyAhPSAiMCIpDQoNCg0KRG9sdG9uQ2hpY2FnbyA8LSBEb2x0b25DaGljYWdvICU+JSANCiAgbXV0YXRlKHRheF9jb2RlID0gYXMuY2hhcmFjdGVyKHRheF9jb2RlKSklPiUNCiAgbGVmdF9qb2luKGRvbHRjaGlfdGF4X2NvZGVzKSAlPiUgDQogIGdyb3VwX2J5KGFnZW5jeV9udW0sIGNsYXNzKSAlPiUgYXJyYW5nZShhdikNCg0Kd3JpdGVfY3N2KERvbHRvbkNoaWNhZ28sICIuL091dHB1dC9DaG9sdG9uX3RheGJpbGxzLmNzdiIpDQpgYGANCg0KYGBge3J9DQpuaWNrbmFtZXMgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCIuL05lY2Vzc2FyeV9GaWxlcy9tdW5pX3Nob3J0bmFtZXMueGxzeCIpDQoNCmNsYXNzX2RpY3QgPC0gcmVhZF9jc3YoIi4vTmVjZXNzYXJ5X0ZpbGVzL2NsYXNzX2RpY3QuY3N2IikNCg0KdGF4Y29kZV90YXhyYXRlcyA8LSByZWFkX2NzdigiLi9PdXRwdXQvMl90YXhjb2RlX3RheHJhdGVzLmNzdiIpDQoNCg0KRG9sdG9uQ2hpY2FnbyA8LSByZWFkX2NzdigiLi9PdXRwdXQvQ2hvbHRvbl90YXhiaWxscy5jc3YiKSAlPiUgDQogIGFycmFuZ2UoYXYpICU+JSAgICAgDQogIGxlZnRfam9pbih0YXhjb2RlX3RheHJhdGVzKSAlPiUNCiAgICBtdXRhdGUocHJvcGNsYXNzXzFkaWcgPSBzdHJfc3ViKGNsYXNzLCAxLCAxKSkNCg0KDQoNCmBgYA0KDQoNCj4gTWF4IGNvbXBvc2l0ZSB0YXggcmF0ZSBpbiBhIHRheCBjb2RlIGluIENoaWNhZ28gaXMgOS4xJSBhbmQgbWluaW11bSBjb21wb3NpdGUgdGF4IHJhdGUgaXMgNi43JS4gQ2hpY2FnbyBoYXMgNjY1IHRheCBjb2Rlcy4gDQoNCj4gTWF4IGNvbXBvc2l0ZSB0YXggcmF0ZSBpbiBhIHRheCBjb2RlIGluIERvbHRvbiBpcyAyNy45JSBhbmQgbWluaW11bSBjb21wb3NpdGUgdGF4IHJhdGUgaXMgMjIuOSUuIERvbHRvbiBoYXMgMTMgdGF4IGNvZGVzLiANCg0KDQoNCmBgYHtyfQ0KIyBEb2x0b25DaGljYWdvICU+JSANCiMgICBncm91cF9ieShhZ2VuY3lfbnVtLCB0YXhfY29kZSkgJT4lIA0KIyAgIHN1bW1hcml6ZShtYXhfY29tcHJhdGUgPSBtYXgodGF4X3JhdGVfY3VycmVudCksDQojICAgICAgICAgICAgIG1pbl9jb21wcmF0ZSA9IG1pbih0YXhfcmF0ZV9jdXJyZW50KSkgJT4lIGFycmFuZ2UoLW1heF9jb21wcmF0ZSkNCg0KRG9sdG9uQ2hpY2FnbyAlPiUgZ3JvdXBfYnkoYWdlbmN5X251bSkgJT4lIA0KICBzdW1tYXJpemUobWF4X2NvbXByYXRlID0gbWF4KHRheF9yYXRlX2N1cnJlbnQsIG5hLnJtPVRSVUUpLA0KICAgICAgICAgICAgbWVhbl9jb21wcmF0ZSA9IG1lYW4odGF4X3JhdGVfY3VycmVudCwgbmEucm09VFJVRSksDQogICAgICAgICAgICBtaW5fY29tcHJhdGUgPSBtaW4odGF4X3JhdGVfY3VycmVudCwgbmEucm09VFJVRSkpICU+JSBhcnJhbmdlKC1tZWFuX2NvbXByYXRlKQ0KDQpEb2x0b25DaGljYWdvICU+JSBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMzEwMDAwIikgJT4lDQogIGdyb3VwX2J5KGFnZW5jeV9udW0sIGNsYXNzKSAlPiUgDQogIHN1bW1hcml6ZShtYXhfY29tcHJhdGUgPSBtYXgodGF4X3JhdGVfY3VycmVudCwgbmEucm09VFJVRSksDQogICAgICAgICAgICBtZWFuX2NvbXByYXRlID0gbWVhbih0YXhfcmF0ZV9jdXJyZW50LCBuYS5ybT1UUlVFKSwNCiAgICAgICAgICAgIG1pbl9jb21wcmF0ZSA9IG1pbih0YXhfcmF0ZV9jdXJyZW50LCBuYS5ybT1UUlVFKSwNCiAgICAgICAgICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICAgICAgICAgIGF2ID0gbWVhbihhdiksDQogICAgICAgICAgICBlYXYgPSBtZWFuKGVhdiksDQogICAgICAgICAgICB0YXhfYW10X3Bvc3RfZXhlID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICAgICAgICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSksDQogICAgICAgICAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSkpICU+JSANCiAgYXJyYW5nZSgtcGluX2NvdW50KSAlPiUgaGVhZCgpICU+JSBrYmwoKQ0KDQpEb2x0b25DaGljYWdvICU+JSBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMjEwMDAwIikgJT4lDQogIGdyb3VwX2J5KGFnZW5jeV9udW0sIGNsYXNzKSAlPiUgDQogIHN1bW1hcml6ZShtYXhfY29tcHJhdGUgPSBtYXgodGF4X3JhdGVfY3VycmVudCwgbmEucm09VFJVRSksDQogICAgICAgICAgICBtZWFuX2NvbXByYXRlID0gbWVhbih0YXhfcmF0ZV9jdXJyZW50LCBuYS5ybT1UUlVFKSwNCiAgICAgICAgICAgIG1pbl9jb21wcmF0ZSA9IG1pbih0YXhfcmF0ZV9jdXJyZW50LCBuYS5ybT1UUlVFKSwNCiAgICAgICAgICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICAgICAgICAgIGF2ID0gbWVhbihhdiksDQogICAgICAgICAgICBlYXYgPSBtZWFuKGVhdiksDQogICAgICAgICAgICB0YXhfYW10X3Bvc3RfZXhlID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICAgICAgICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSksDQogICAgICAgICAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSkpICU+JSANCiAgYXJyYW5nZSgtcGluX2NvdW50KSAlPiUgaGVhZCgpICU+JSBrYmwoKQ0KYGBgIA0KDQoNCg0KYGBge3J9DQoNCkRvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoY2xhc3MgPT0gIjIwMyIpICU+JSANCiAgYXJyYW5nZShhdiklPiUNCiAgZ3JvdXBfYnkoYWdlbmN5X251bSwgY2xhc3MpICU+JQ0KICBzdW1tYXJpemUobWVkaWFuYmlsbCA9IG1lZGlhbih0b3RhbF9iaWxsZWQpLA0KICAgICAgICAgICAgbWVhbmJpbGwgPSBtZWFuKHRvdGFsX2JpbGxlZCksDQogICAgICAgICAgICBtZWRpYW5BViA9IG1lZGlhbihhdiksDQogICAgICAgICAgICBtZWFuQVYgPSBtZWFuKGF2KSwNCiAgICAgICAgICAgICklPiUgDQogIyBwaXZvdF9sb25nZXIobWVkaWFuYmlsbDptZWFuQVYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpICAlPiUNCiAga2JsKGNhcHRpb249ICJDaGljYWdvIGFuZCBEb2x0b24sIENsYXNzIDIwMywgTWVhc3VyZXMgb2YgdGhlIE1pZGRsZSIsIGRpZ2l0cz0wLCBib29rdGFicyA9IFQpICU+JSAgIA0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUKQ0KDQoNCg0KRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihjbGFzcyA9PSAiMjA1IikgJT4lIA0KICBncm91cF9ieShhZ2VuY3lfbnVtLCBjbGFzcykgJT4lDQogIHN1bW1hcml6ZShtZWRpYW5iaWxsID0gbWVkaWFuKHRvdGFsX2JpbGxlZCksDQogICAgICAgICAgICBtZWFuYmlsbCA9IG1lYW4odG90YWxfYmlsbGVkKSwNCiAgICAgICAgICAgIG1lZGlhbkFWID0gbWVkaWFuKGF2KSwNCiAgICAgICAgICAgIG1lYW5BViA9IG1lYW4oYXYpLA0KICAgICAgICAgICAgKSU+JSANCiAjIHBpdm90X2xvbmdlcihtZWRpYW5iaWxsOm1lYW5BViwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikgICU+JQ0KICBrYmwoY2FwdGlvbj0gIkNoaWNhZ28gYW5kIERvbHRvbiwgQ2xhc3MgMjA1LCBNZWFzdXJlcyBvZiB0aGUgTWlkZGxlIiwgZGlnaXRzPTAsIGJvb2t0YWJzID0gVCkgJT4lICAgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFQpDQoNCkRvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoY2xhc3MgPT0gIjIxMSIpICU+JSANCiAgZ3JvdXBfYnkoYWdlbmN5X251bSwgY2xhc3MpICU+JQ0KICBzdW1tYXJpemUobWVkaWFuYmlsbCA9IG1lZGlhbih0b3RhbF9iaWxsZWQpLA0KICAgICAgICAgICAgbWVhbmJpbGwgPSBtZWFuKHRvdGFsX2JpbGxlZCksDQogICAgICAgICAgICBtZWRpYW5BViA9IG1lZGlhbihhdiksDQogICAgICAgICAgICBtZWFuQVYgPSBtZWFuKGF2KSwNCiAgICAgICAgICAgICklPiUgDQogIyBwaXZvdF9sb25nZXIobWVkaWFuYmlsbDptZWFuQVYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpICAlPiUNCiAga2JsKGNhcHRpb249ICJDaGljYWdvIGFuZCBEb2x0b24sIENsYXNzIDIxMSwgTWVhc3VyZXMgb2YgdGhlIE1pZGRsZSIsIGRpZ2l0cz0wLCBib29rdGFicyA9IFQpICU+JSAgIA0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUKQ0KDQpEb2x0b25DaGljYWdvICU+JSANCiAgZmlsdGVyKGNsYXNzID09ICIyMzQiKSAlPiUgDQogIGdyb3VwX2J5KGFnZW5jeV9udW0sIGNsYXNzKSAlPiUNCiAgc3VtbWFyaXplKG1lZGlhbmJpbGwgPSBtZWRpYW4odG90YWxfYmlsbGVkKSwNCiAgICAgICAgICAgIG1lYW5iaWxsID0gbWVhbih0b3RhbF9iaWxsZWQpLA0KICAgICAgICAgICAgbWVkaWFuQVYgPSBtZWRpYW4oYXYpLA0KICAgICAgICAgICAgbWVhbkFWID0gbWVhbihhdiksDQogICAgICAgICAgICApJT4lIA0KICMgcGl2b3RfbG9uZ2VyKG1lZGlhbmJpbGw6bWVhbkFWLCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKSAgJT4lDQogIGtibChjYXB0aW9uPSAiQ2hpY2FnbyBhbmQgRG9sdG9uLCBDbGFzcyAyMzQsIE1lYXN1cmVzIG9mIHRoZSBNaWRkbGUiLCBkaWdpdHM9MCwgYm9va3RhYnMgPSBUKSAlPiUgICANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVCkNCg0KDQpgYGANCg0KIyMgVXNpbmcgc2ltaWxhcmlseSBBc3Nlc3NlZCBWYWx1ZSBwcm9wZXJ0aWVzIA0KDQpDaGljYWdvIGhhcyA2NTUgdGF4IGNvZGVzIGluIGl0cyBib3JkZXJzIGFuZCBEb2x0b24gaGFzIDEzIHRheCBjb2RlcyBpbiBpdHMgYm9yZGVycy4gDQoNCg0KDQojIyMgQ2xhc3MgMjAzDQoNCk9uZSBzdG9yeSByZXNpZGVuY2UsIGFueSBhZ2UsIDEsMDAwIHRvIDEsODAwIHNxLiBmdC4NCg0KDQpgYGB7cn0NCkRvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMjEwMDAwIiApICU+JSAjJiBjbGFzcyA9PSAiMjAzIiAmIGJldHdlZW4oYXYsOTk1MCwxMDA1MCkpICU+JSANCiAgZ3JvdXBfYnkodGF4X2NvZGUpICU+JSANCiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAgICAgICAgICAgIA0KICAgICAgICAgICAgYXZnX2N1cnJlbnRfY29tcHJhdGUgPSBtZWFuKHRheF9yYXRlX2N1cnJlbnQsIG5hLnJtPVRSVUUpDQogICkgJT4lIGFycmFuZ2UoLWF2Z19jdXJyZW50X2NvbXByYXRlKSAlPiUgaGVhZCgpDQoNCkRvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMzEwMDAwIikgJT4lICMgJiBjbGFzcyA9PSAiMjAzIiAmIGJldHdlZW4oYXYsIDk5NTAsIDEwMDUwKSkgJT4lDQogIGdyb3VwX2J5KHRheF9jb2RlKSAlPiUNCiAgc3VtbWFyaXplKGNvdW50ID0gbigpLA0KICAgICAgICAgICAgYXZnX2N1cnJlbnRfY29tcHJhdGUgPSBtZWFuKHRheF9yYXRlX2N1cnJlbnQsIG5hLnJtPVRSVUUpDQogICkgJT4lIGFycmFuZ2UoLWF2Z19jdXJyZW50X2NvbXByYXRlKSAlPiUgaGVhZCgpDQpgYGANCg0KDQpJZiBob2xkaW5nIHRoZSBsZXZ5IGNvbnN0YW50IGFuZCBhY2tub3dsZWRnaW5nIHRoZSBjaGFuZ2UgaW4gdGF4IHJhdGVzIHRoYXQgd291bGQgb2NjdXIgZnJvbSBoYXZpbmcgYWRkaXRpb25hbCB0YXhhYmxlIEVBViB3aXRoaW4gdGhlIHRheGluZyBqdXJpc2RpY3Rpb25zLi4uLg0KDQpGb3IgcHJvcGVydHkgY2xhc3MgMjAzIFBJTnMgd2l0aCBhc3Nlc3NlZCB2YWx1ZXMgYmV0d2VlbiBcJDksMDAwIGFuZCBcJDExLDAwMCwgdGhlIGF2ZXJhZ2UgY2hhbmdlIGluIHRheCBiaWxsIHdvdWxkIGJlIFwkNzUgbW9yZSBpbiBDaGljYWdvIGFuZCBcJDIwNSBtb3JlIGluIERvbHRvbiBjb21wYXJlZCB0byB0aGVpciBjdXJyZW50IHRheCBiaWxscyAoXCQxNDc1IGFuZCAkNDMxMiByZXNwZWN0aXZlbHkpLiANCg0KVGhlICJhdmVyYWdlIiBwcm9wZXJ0eSB0YXggcGF5ZXIgd291bGQgdGhpbmsgdGhleSBhcmUgc2F2aW5nIFwkNjI0IGluIENoaWNhZ28gYW5kICQyNzA4IGluIERvbHRvbiBkdWUgdG8gZXhlbXB0aW9ucy4gVGhpcyBudW1iZXIgYXBwZWFycyBvbiB0aGVpciB0YXhiaWxsIGFuZCBjYWxjdWxhdGVkIGJ5IHRoZSBmdWxsIEVBViAqIGN1cnJlbnQgdGF4IHJhdGUgYW5kIGRvZXMgTk9UIGNvbnNpZGVyIHRoZSBjaGFuZ2UgaW4gdGF4IHJhdGUgdGhhdCB3b3VsZCBvY2N1ciBpZiBsZXZpZXMgYXJlIGhlbGQgY29uc3RhbnQgYW5kIGFsbCBFQVYgYmVjYW1lIHRheGFibGUuIA0KDQoNCmBgYHtyfQ0KQ2hpMyA8LSBEb2x0b25DaGljYWdvICU+JSANCiAgZmlsdGVyKGFnZW5jeV9udW0gPT0gIjAzMDIxMDAwMCIgJiBjbGFzcyA9PSAiMjAzIiAmIGJldHdlZW4oYXYsOTAwMCwxMTAwMCkpICU+JQ0KICAgIHN1bW1hcml6ZSggICAgICAgICAgICAgIA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSwgbmEucm09VFJVRSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfcG9zdF9leGUgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLCANCiAgICBlYXYgPSBtZWFuKGVhdikNCiAgKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gY29tcF90YXhyYXRlOmVhdiwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikNCg0KRG9sMyA8LSBEb2x0b25DaGljYWdvICU+JSANCiAgZmlsdGVyKGFnZW5jeV9udW0gPT0gIjAzMDMxMDAwMCIgJiBjbGFzcyA9PSAiMjAzIiAmIGJldHdlZW4oYXYsIDkwMDAsIDExMDAwKSkgJT4lDQogICAgc3VtbWFyaXplKCAgICAgICAgICAgICAgDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSwgbmEucm09VFJVRSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksIA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpDQoNCmJvdGhfZHQgPC0gY2JpbmQoQ2hpMywgRG9sMykNCg0KDQprYmwoYm90aF9kdCwgYm9va3RhYnMgPSBULCBkaWdpdHMgPSAwLCANCiAgICBjYXB0aW9uID0gIlByb3BlcnR5IENsYXNzIDIwMyBDb21wYXJpc29uLCBBViB+ICQxMCwwMDAgKDkwMDAtMTEwMDAgcmFuZ2UpIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFQpJT4lDQphZGRfaGVhZGVyX2Fib3ZlKGMoIkNoaWNhZ28iID0gMiwgIkRvbHRvbiIgPSAyKSkNCmBgYA0KDQoNCj4gQ2hhbmdpbmcgdGhlIHJhbmdlIG9mIFBJTnMgaW5jbHVkZWQgaW4gdGhlIGNhbGN1bGF0aW9uIGFsdGVycyB0aGUgIk1lZGlhbiBQcm9wZXJ0eSBTdGF0aXN0aWMiIA0KDQpJZiBob2xkaW5nIHRoZSBsZXZ5IGNvbnN0YW50IGFuZCBhY2tub3dsZWRnaW5nIHRoZSBjaGFuZ2UgaW4gdGF4IHJhdGVzIHRoYXQgd291bGQgb2NjdXIgZnJvbSBoYXZpbmcgYWRkaXRpb25hbCB0YXhhYmxlIEVBViB3aXRoaW4gdGhlIHRheGluZyBqdXJpc2RpY3Rpb25zLi4uLg0KDQpGb3IgcHJvcGVydHkgY2xhc3MgMjAzIFBJTnMgd2l0aCBhc3Nlc3NlZCB2YWx1ZXMgYmV0d2VlbiBcJDgsMDAwIGFuZCBcJDEyLDAwMCwgdGhlIGF2ZXJhZ2UgY2hhbmdlIGluIHRheCBiaWxsIHdvdWxkIGJlIFwkOTggbW9yZSBpbiBDaGljYWdvIGFuZCBcJDU1IG1vcmUgaW4gRG9sdG9uIGNvbXBhcmVkIHRvIHRoZWlyIGN1cnJlbnQgdGF4IGJpbGxzIChcJDE1MTMgYW5kICQ0MzQyIHJlc3BlY3RpdmVseSkuIA0KDQpgYGB7cn0NCkNoaTMgPC0gRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAyMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKGF2LDgwMDAsMTIwMDApKSAlPiUNCiAgICBzdW1tYXJpemUoICAgICAgICAgICAgICANCiAgICBjb21wX3RheHJhdGUgPSBtZWFuKHRheF9jb2RlX3JhdGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY3VycmVudCA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSwgbmEucm09VFJVRSksDQogICAgYmlsbF9oeXAgPSBtZWFuKGVhdip0YXhyYXRlX25ldywgbmEucm09VFJVRSksDQogICAgYmlsbF9jaGFuZ2UgPSBiaWxsX2h5cCAtIGJpbGxfY3VycmVudCwNCiAgICB0YXhfYW10X3Bvc3RfZXhlID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICB0YXhfYW10X2V4ZSA9IG1lYW4odGF4X2FtdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIHRheF9hbXRfcHJlX2V4ZSA9IG1lYW4odGF4X2FtdF9wcmVfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICBwaW5fY291bnQgPSBuKCksDQogICAgYXYgPSBtZWFuKGF2KSwgDQogICAgZWF2ID0gbWVhbihlYXYpDQogICkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpDQoNCiMgQ2hpY2FnbyBvbmx5IGhhcyAyIHBpbnMgdGhhdCBhcmUgc2ltaWxhciB0byBEb2x0b24ncyBtZWRpYW4gcGluICh3aGljaCBoYWQgYSBsb3Qgb2YgbWF0Y2hlcykNCkRvbDMgPC0gRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAzMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKGF2LCA4MDAwLCAxMjAwMCkpICU+JQ0KICAgIHN1bW1hcml6ZSggICAgICAgICAgICAgIA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSwgbmEucm09VFJVRSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfcG9zdF9leGUgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSwgbmEucm09VFJVRSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUsIG5hLnJtPVRSVUUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLCANCiAgICBlYXYgPSBtZWFuKGVhdikNCiAgKSAlPiUgDQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKQ0KDQpib3RoX2R0IDwtIGNiaW5kKENoaTMsIERvbDMpDQoNCg0Ka2JsKGJvdGhfZHQsIGJvb2t0YWJzID0gVCwgZGlnaXRzID0gMCwgDQogICAgY2FwdGlvbiA9ICJQcm9wZXJ0eSBNYWpvciBDbGFzcyAyIENvbXBhcmlzb24sIEFWIH4gJDEwLDAwMCAoQVYgcmFuZ2UgJDgwMDAtJDEyMDAwKSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUKSU+JQ0KYWRkX2hlYWRlcl9hYm92ZShjKCJDaGljYWdvIENsYXNzIDIwMywgOEstMTJLIFByb3BlcnR5IFN0YXRzIiA9IDIsICJEb2x0b24gQ2xhc3MgMjAzLCA4TC0xMksgQVYgUHJvcGVydHkgU3RhdHMiID0gMikpDQpgYGANCg0KDQoNCiMjIyBNYWpvciBDbGFzcyAyDQoNCkF2ZXJhZ2UgYW5kIG1lZGlhbiB0YXggYmlsbHMgYW5kIGFzc2Vzc2VkIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBiZWxvdyBmb3IgQUxMIHByb3BlcnR5IGNsYXNzIHR5cGVzIHdpdGhpbiB0aGUgdGhlIGJyb2FkZXIgIlJlc2lkZW50aWFsIiBwcm9wZXJ0eSBjbGFzcyB0eXBlIChwcm9wZXJ0eSBjbGFzc2VzIHRoYXQgaGF2ZSB0aGUgZmlyc3QgZGlnaXQgIjIiLCBvciBNYWpvciBDbGFzcyBUeXBlIDIpDQoNClRoZSBtZWRpYW4gQVYgIGlzIHVzZWQgdG8gc2VsZWN0IGEgcmFuZ2Ugb2YgcGlucyAoYmFzZWQgb24gdGhlaXIgQVYpIHRvIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBjdXJyZW50IGJpbGwsIGh5cG90aGV0aWNhbCBiaWxsLCBhbmQgaHlwb3RoZXRpY2FsIGNoYW5nZSBpbiB0YXggYmlsbCBmb3IgYSAibWVkaWFuIHByb3BlcnR5Ii4gDQoNClRoaXMgaXMgZG9uZSBiZWNhdXNlIHNvbWUgcHJvcGVydGllcyByZWNlaXZlIG11bHRpcGxlIGV4ZW1wdGlvbnMgd2hpbGUgb3RoZXJzIHJlY2VpdmUgbm9uZS4gVXNpbmcgdGhlIGxpdGVyYWwgbWVkaWFuIHBpbiBjYW4gc2tldyB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoYXQgc3BlY2lmaWMgcGluIHJlY2VpdmVzIG5vIGV4ZW1wdGlvbnMgb3IgbXVsdGlwbGUgZXhlbXB0aW9ucy4gVGhlIGF2ZXJhZ2UgZm9yIHRoZSByYW5nZSBvZiAibWVkaWFuIFBJTnMiIGlzIGNyZWF0ZWQgdG8gc21vb3RoIG91dCB0aGUgdmFyaWF0aW9uIHdpdGhpbiB0aGUgb2JzZXJ2YXRpb25zLiANCg0KYGBge3J9DQpEb2x0b25DaGljYWdvICU+JSANCiAgZmlsdGVyKHByb3BjbGFzc18xZGlnID09ICIyIikgJT4lIA0KICBhcnJhbmdlKGF2KSAlPiUNCiAgZ3JvdXBfYnkoYWdlbmN5X251bSkgJT4lDQogIHN1bW1hcml6ZShtZWRpYW5iaWxsID0gbWVkaWFuKHRvdGFsX2JpbGxlZCksDQogICAgICAgICAgICBtZWFuYmlsbCA9IG1lYW4odG90YWxfYmlsbGVkKSwNCiAgICAgICAgICAgIG1lZGlhbkFWID0gbWVkaWFuKGF2KSwNCiAgICAgICAgICAgIG1lYW5BViA9IG1lYW4oYXYpLA0KICAgICAgICAgICAgcGluX2NvdW50ID0gbigpDQogICAgICAgICAgICApJT4lIA0KICMgcGl2b3RfbG9uZ2VyKG1lZGlhbmJpbGw6bWVhbkFWLCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKSAgJT4lDQogIGtibChjYXB0aW9uPSAiQ2hpY2FnbyBhbmQgRG9sdG9uLCBNYWpvciBDbGFzcyAyLCBNZWFzdXJlcyBvZiB0aGUgTWlkZGxlIiwgZGlnaXRzPTAsIGJvb2t0YWJzID0gVCkgJT4lICAgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFQpDQoNCiMgDQojIERvbHRvbkNoaWNhZ28gJT4lIA0KIyAgIGZpbHRlcihwcm9wY2xhc3NfMWRpZyA9PSAiMyIpICU+JSANCiMgICBhcnJhbmdlKGF2KSAlPiUNCiMgICBncm91cF9ieShhZ2VuY3lfbnVtKSAlPiUNCiMgICBzdW1tYXJpemUobWVkaWFuYmlsbCA9IG1lZGlhbih0b3RhbF9iaWxsZWQpLA0KIyAgICAgICAgICAgICBtZWFuYmlsbCA9IG1lYW4odG90YWxfYmlsbGVkKSwNCiMgICAgICAgICAgICAgbWVkaWFuQVYgPSBtZWRpYW4oYXYpLA0KIyAgICAgICAgICAgICBtZWFuQVYgPSBtZWFuKGF2KSwNCiMgICAgICAgICAgICAgcGluX2NvdW50ID0gbigpDQojICAgICAgICAgICAgICklPiUgDQojICAjIHBpdm90X2xvbmdlcihtZWRpYW5iaWxsOm1lYW5BViwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikgICU+JQ0KIyAgIGtibChjYXB0aW9uPSAiQ2hpY2FnbyBhbmQgRG9sdG9uLCBNYWpvciBDbGFzcyAzLCBNZWFzdXJlcyBvZiB0aGUgTWlkZGxlIiwgZGlnaXRzPTAsIGJvb2t0YWJzID0gVCkgJT4lICAgDQojICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVCkNCmBgYA0KDQpJZiBob2xkaW5nIHRoZSBsZXZ5IGNvbnN0YW50IGFuZCBhY2tub3dsZWRnaW5nIHRoZSBjaGFuZ2UgaW4gdGF4IHJhdGVzIHRoYXQgd291bGQgb2NjdXIgZnJvbSBoYXZpbmcgYWRkaXRpb25hbCB0YXhhYmxlIEVBViB3aXRoaW4gdGhlIHRheGluZyBqdXJpc2RpY3Rpb25zLCBDaGljYWdvJ3MgaHlwb3RoZXRpY2FsIHRheCBiaWxsIHdvdWxkIGJlIFwkMTU3MCAoYW4gXCQxNCBpbmNyZWFzZSBmcm9tIFwkMTU1NikgYW5kIERvbHRvbidzIHdvdWxkIGJlIFwkNDYxMCAoYSBcJDMwIGluY3JlYXNlIGZyb20gJDQ1ODApLiAgIA0KDQpPbiBhdmVyYWdlLCByZXNpZGVudHMgd291bGQgdGhpbmsgdGhleSAic2F2ZWQiIFwkNTAxIGluIENoaWNhZ28gYW5kIFwkMjU4OCBpbiBEb2x0b24gKGJhc2VkIG9uIHRheF9hbXRfZXhlIHdoaWNoIGFsc28gc2hvd3MgdXAgb24gdGhlaXIgdGF4IGJpbGwgYmFzZWQgb24gdGhlICJuYWl2ZSIgcHJlLXRheCBleGVtcHRpb24gdGF4IGJpbGwgYW1vdW50IG9uIHRoZSB0YXggYmlsbCkuIFRoZSBhbW91bnQgc2F2ZWQgcGVyIHBlcnNvbiB3aWxsIGRlcGVuZCBvbiBob3cgbWFueSBleGVtcHRpb25zIHRoZXkgcXVhbGlmaWVkIGZvciBpbiB0aGUgZmlyc3QgcGxhY2UuIFRoaXMgaXMgYSByb3VnaCBhdmVyYWdlIGZvciBhbGwgdHlwZXMgb2YgZXhlbXB0aW9ucyBhbmQgaW5jbHVkZXMgdGhvc2UgdGhhdCByZWNlaXZlZCBubyBleGVtcHRpb25zIGFuZCBtdWx0aWlwbGUgZXhlbXB0aW9ucy4gDQoNClZhbHVlcyB3ZXJlIGNhbGN1bGF0ZWQgYnkgc2VsZWN0aW5nIHBpbnMgd2l0aCBBVnMgYmV0d2VlbiBcJDkwMDAgYW5kICQxMSwwMDAgYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2UgY3VycmVudCBiaWxsLCBjaGFuZ2UgaW4gYmlsbCwgYW5kIG90aGVyIHN0YXRpc3RpY3Mgc2VlbiBpbiB0aGUgdGFibGUuIFBpbiBjb3VudCB0ZWxscyB5b3UgdGhlIG51bWJlciBvZiBwaW5zIHRoYXQgd2VyZSBpbmNsdWRlZCBpbiB0aGUgQVYgcmFuZ2UgdXNlZCBmb3IgdGhlICJtZWRpYW4gcHJvcGVydHkuIg0KDQpgYGB7cn0NCkNoaTMgPC0gRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAyMTAwMDAiICYgcHJvcGNsYXNzXzFkaWcgPT0gIjIiICYgYmV0d2Vlbihhdiw5MDAwLDExMDAwKSkgJT4lDQogICAgc3VtbWFyaXplKCAgICAgICAgICAgICAgDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSwgbmEucm09VFJVRSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksIA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKQ0KDQojIENoaWNhZ28gb25seSBoYXMgMiBwaW5zIHRoYXQgYXJlIHNpbWlsYXIgdG8gRG9sdG9uJ3MgbWVkaWFuIHBpbiAod2hpY2ggaGFkIGEgbG90IG9mIG1hdGNoZXMpDQpEb2wzIDwtIERvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMzEwMDAwIiAmIHByb3BjbGFzc18xZGlnID09ICIyIiAmIGJldHdlZW4oYXYsIDkwMDAsIDExMDAwKSkgJT4lDQogICAgc3VtbWFyaXplKCAgICAgICAgICAgICAgDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSwgbmEucm09VFJVRSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksIA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpDQoNCmJvdGhfZHQgPC0gY2JpbmQoQ2hpMywgRG9sMykNCg0KDQprYmwoYm90aF9kdCwgYm9va3RhYnMgPSBULCBkaWdpdHMgPSAwLCANCiAgICBjYXB0aW9uID0gIlByb3BlcnR5IE1ham9yIENsYXNzIDIgQ29tcGFyaXNvbiwgQVYgfiAkMTAsMDAwIChBViByYW5nZSAkOTAwMC0kMTEwMDApIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFQpJT4lDQphZGRfaGVhZGVyX2Fib3ZlKGMoIkNoaWNhZ28iID0gMiwgIkRvbHRvbiIgPSAyKSkNCmBgYA0KDQoNCmBgYHtyfQ0KQ2hpMyA8LSBEb2x0b25DaGljYWdvICU+JSANCiAgZmlsdGVyKGFnZW5jeV9udW0gPT0gIjAzMDIxMDAwMCIgJiBwcm9wY2xhc3NfMWRpZyA9PSAiMiIgJiBiZXR3ZWVuKGF2LDgwMDAsMTIwMDApKSAlPiUNCiAgICBzdW1tYXJpemUoICAgICAgICAgICAgICANCiAgICBjb21wX3RheHJhdGUgPSBtZWFuKHRheF9jb2RlX3JhdGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY3VycmVudCA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSwgbmEucm09VFJVRSksDQogICAgYmlsbF9oeXAgPSBtZWFuKGVhdip0YXhyYXRlX25ldywgbmEucm09VFJVRSksDQogICAgYmlsbF9jaGFuZ2UgPSBiaWxsX2h5cCAtIGJpbGxfY3VycmVudCwNCiAgICB0YXhfYW10X3Bvc3RfZXhlID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICB0YXhfYW10X2V4ZSA9IG1lYW4odGF4X2FtdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIHRheF9hbXRfcHJlX2V4ZSA9IG1lYW4odGF4X2FtdF9wcmVfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICBwaW5fY291bnQgPSBuKCksDQogICAgYXYgPSBtZWFuKGF2KSwgDQogICAgZWF2ID0gbWVhbihlYXYpDQogICkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpDQoNCiMgQ2hpY2FnbyBvbmx5IGhhcyAyIHBpbnMgdGhhdCBhcmUgc2ltaWxhciB0byBEb2x0b24ncyBtZWRpYW4gcGluICh3aGljaCBoYWQgYSBsb3Qgb2YgbWF0Y2hlcykNCkRvbDMgPC0gRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAzMTAwMDAiICYgcHJvcGNsYXNzXzFkaWcgPT0gIjIiICYgYmV0d2VlbihhdiwgODAwMCwgMTIwMDApKSAlPiUNCiAgICBzdW1tYXJpemUoICAgICAgICAgICAgICANCiAgICBjb21wX3RheHJhdGUgPSBtZWFuKHRheF9jb2RlX3JhdGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY3VycmVudCA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSwgbmEucm09VFJVRSksDQogICAgYmlsbF9oeXAgPSBtZWFuKGVhdip0YXhyYXRlX25ldywgbmEucm09VFJVRSksDQogICAgYmlsbF9jaGFuZ2UgPSBiaWxsX2h5cCAtIGJpbGxfY3VycmVudCwNCiAgICB0YXhfYW10X3Bvc3RfZXhlID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICB0YXhfYW10X2V4ZSA9IG1lYW4odGF4X2FtdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIHRheF9hbXRfcHJlX2V4ZSA9IG1lYW4odGF4X2FtdF9wcmVfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICBwaW5fY291bnQgPSBuKCksDQogICAgYXYgPSBtZWFuKGF2KSwgDQogICAgZWF2ID0gbWVhbihlYXYpDQogICkgJT4lIA0KICAgIHBpdm90X2xvbmdlcihjb2xzID0gY29tcF90YXhyYXRlOmVhdiwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikNCg0KYm90aF9kdCA8LSBjYmluZChDaGkzLCBEb2wzKQ0KDQoNCmtibChib3RoX2R0LCBib29rdGFicyA9IFQsIGRpZ2l0cyA9IDAsIA0KICAgIGNhcHRpb24gPSAiUHJvcGVydHkgTWFqb3IgQ2xhc3MgMiBDb21wYXJpc29uLCBBViB+ICQxMCwwMDAgKEFWIHJhbmdlICQ4MDAwLSQxMjAwMCkiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVCklPiUNCmFkZF9oZWFkZXJfYWJvdmUoYygiQ2hpY2FnbyIgPSAyLCAiRG9sdG9uIiA9IDIpKQ0KYGBgDQpJZiBob2xkaW5nIHRoZSBsZXZ5IGNvbnN0YW50IGFuZCBhY2tub3dsZWRnaW5nIHRoZSBjaGFuZ2UgaW4gdGF4IHJhdGVzIHRoYXQgd291bGQgb2NjdXIgZnJvbSBoYXZpbmcgYWRkaXRpb25hbCB0YXhhYmxlIEVBViB3aXRoaW4gdGhlIHRheGluZyBqdXJpc2RpY3Rpb25zLCBDaGljYWdvJ3MgaHlwb3RoZXRpY2FsIHRheCBiaWxsIHdvdWxkIGJlIFwkMTU5MiAoYW4gXCQxMyBpbmNyZWFzZSBmcm9tIFwkMTU3OSkgYW5kIERvbHRvbidzIHdvdWxkIGJlIFwkNDU5OCAoYSBcJDk5IERFQ1JFQVNFIGZyb20gJDQ1OTYpLiAgIA0KDQpWYWx1ZXMgd2VyZSBjYWxjdWxhdGVkIGJ5IHNlbGVjdGluZyBwaW5zIHdpdGggQVZzIGJldHdlZW4gXCQ4MDAwIGFuZCAkMTIsMDAwIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBhdmVyYWdlIGN1cnJlbnQgYmlsbCwgY2hhbmdlIGluIGJpbGwsIGFuZCBvdGhlciBzdGF0aXN0aWNzIHNlZW4gaW4gdGhlIHRhYmxlLiBQaW4gY291bnQgdGVsbHMgeW91IHRoZSBudW1iZXIgb2YgcGlucyB0aGF0IHdlcmUgaW5jbHVkZWQgaW4gdGhlIEFWIHJhbmdlIHVzZWQgZm9yIHRoZSAibWVkaWFuIHByb3BlcnR5LiINCg0KDQo+IEluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBwaW5zIGluY2x1ZGVkIGluIHRoZSBtZWFzdXJlbWVudCBvZiAiYXZlcmFnZSBiaWxsIiBhbmQgImF2ZXJhZ2UgYmlsbCBjaGFuZ2UiIGNvbXBsZXRlbHkgY2hhbmdlZCB0aGUgcmVzdWx0cyBmb3IgRG9sdG9uLiBVc2luZyB0aGUgIm1lZGlhbiIgdmFsdWUgbXVzdCBiZSBkb25lIHN1cGVyIGNhcmVmdWxseS4gDQoNCj4gSWYgd2UgInJlbW92ZWQiIG9ubHkgaG9tZW93bmVycyBleGVtcHRpb25zIG9yIG9ubHkgc2VuaW9yIGV4ZW1wdGlvbnMsIHRoZW4gdGhlIG1lZGlhbiBzdGF0aXN0aWMgd291bGQgYmUgbW9yZSByZWxpYWJsZS4uLiBwb3RlbnRpYWxseS4gDQoNCg0KDQojIyMgQ2xhc3MgMjA1DQoNClR3byBvciBtb3JlIHN0b3J5IHJlc2lkZW5jZSwgb3ZlciA2MiB5ZWFycywgdXAgdG8gMiwyMDAgc3EuIGZ0DQoNCg0KYGBge3J9DQpDaGkzIDwtIERvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMjEwMDAwIiAmIGNsYXNzID09ICIyMDUiICYgYmV0d2Vlbihhdiw4MDAwLDEyMDAwKSkgJT4lDQogICAgc3VtbWFyaXplKCAgICAgICAgICAgICAgDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSwgbmEucm09VFJVRSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksIA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKQ0KDQoNCkRvbDMgPC0gRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAzMTAwMDAiICYgY2xhc3MgPT0gIjIwNSIgJiBiZXR3ZWVuKGF2LCA4MDAwLCAxMjAwMCkpICU+JQ0KICAgIHN1bW1hcml6ZSggICAgICAgICAgICAgIA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSwgbmEucm09VFJVRSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfcG9zdF9leGUgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSwgbmEucm09VFJVRSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUsIG5hLnJtPVRSVUUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLCANCiAgICBlYXYgPSBtZWFuKGVhdikNCiAgKSAgJT4lIA0KICAgIHBpdm90X2xvbmdlcihjb2xzID0gY29tcF90YXhyYXRlOmVhdiwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikNCg0KYm90aF9kdCA8LSBjYmluZChDaGkzLCBEb2wzKQ0KDQoNCmtibChib3RoX2R0LCBib29rdGFicyA9IFQsIGRpZ2l0cyA9IDAsIA0KICAgIGNhcHRpb24gPSAiUHJvcGVydHkgQ2xhc3MgMjA1IENvbXBhcmlzb24sIEFWIH4gJDEwLDAwMCAoODAwMCB0byAxMjAwMCBBViByYW5nZSkiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVCklPiUNCmFkZF9oZWFkZXJfYWJvdmUoYygiQ2hpY2FnbyIgPSAyLCAiRG9sdG9uIiA9IDIpKQ0KYGBgDQoNCg0KIyMjIENsYXNzIDIxMQ0KDQpUd28gdG8gc2l4IHJlc2lkZW50aWFsIGFwYXJ0bWVudHMsIGFueSBhZ2UuDQoNCg0KYGBge3J9DQpDaGkzIDwtIERvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMjEwMDAwIiAmIGNsYXNzID09ICIyMTEiICYgYmV0d2VlbihhdiwxNzAwMCwxOTAwMCkpICU+JQ0KICAgIHN1bW1hcml6ZSggICAgICAgICAgICAgIA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSwgbmEucm09VFJVRSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfcG9zdF9leGUgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSwgbmEucm09VFJVRSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUsIG5hLnJtPVRSVUUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLCANCiAgICBlYXYgPSBtZWFuKGVhdikNCiAgKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gY29tcF90YXhyYXRlOmVhdiwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikNCg0KDQpEb2wzIDwtIERvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMzEwMDAwIiAmIGNsYXNzID09ICIyMTEiICYgYmV0d2VlbihhdiwgMTcwMDAsIDE5MDAwKSkgJT4lDQogICAgc3VtbWFyaXplKCAgICAgICAgICAgICAgDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSwgbmEucm09VFJVRSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksIA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpDQoNCmJvdGhfZHQgPC0gY2JpbmQoQ2hpMywgRG9sMykNCg0KDQprYmwoYm90aF9kdCwgYm9va3RhYnMgPSBULCBkaWdpdHMgPSAwLCANCiAgICBjYXB0aW9uID0gIlByb3BlcnR5IENsYXNzIDIxMSBDb21wYXJpc29uLCBBViB+ICQxOCwwMDAiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVCklPiUNCmFkZF9oZWFkZXJfYWJvdmUoYygiQ2hpY2FnbyIgPSAyLCAiRG9sdG9uIiA9IDIpKQ0KYGBgDQoNCg0KDQojIyMgQ2xhc3MgMjM0DQoNClNwbGl0IGxldmVsIHJlc2lkZW5jZSwgd2l0aCBhIGxvd2VyIGxldmVsIGJlbG93IGdyYWRlLCBhbGwgYWdlcywgYWxsIHNpemVzDQoNCg0KYGBge3J9DQpDaGkzIDwtIERvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMjEwMDAwIiAmIGNsYXNzID09ICIyMzQiICYgYmV0d2VlbihhdiwxMjAwMCwxMzAwMCkpICU+JQ0KICAgIHN1bW1hcml6ZSggICAgICAgICAgICAgIA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSwgbmEucm09VFJVRSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfcG9zdF9leGUgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSwgbmEucm09VFJVRSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUsIG5hLnJtPVRSVUUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLCANCiAgICBlYXYgPSBtZWFuKGVhdikNCiAgKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gY29tcF90YXhyYXRlOmVhdiwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikNCg0KDQpEb2wzIDwtIERvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMzEwMDAwIiAmIGNsYXNzID09ICIyMzQiICYgYmV0d2VlbihhdiwgMTI0NTAsIDEyNzUwKSkgJT4lDQogICAgc3VtbWFyaXplKCAgICAgICAgICAgICAgDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlLCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlLCBuYS5ybT1UUlVFKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSwgbmEucm09VFJVRSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksIA0KICAgIGVhdiA9IG1lYW4oZWF2KSkgJT4lIA0KICAgIHBpdm90X2xvbmdlcihjb2xzID0gY29tcF90YXhyYXRlOmVhdiwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikNCg0KYm90aF9kdCA8LSBjYmluZChDaGkzLCBEb2wzKQ0KDQoNCmtibChib3RoX2R0LCBib29rdGFicyA9IFQsIGRpZ2l0cyA9IDAsIA0KICAgIGNhcHRpb24gPSAiUHJvcGVydHkgQ2xhc3MgMjM0IENvbXBhcmlzb24sIEFWIH4gJDEyLDUwMCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUKSU+JQ0KYWRkX2hlYWRlcl9hYm92ZShjKCJDaGljYWdvIiA9IDIsICJEb2x0b24iID0gMikpDQpgYGANCg0KDQojIE90aGVyIHdheXMgdG8gY29tcGFyZSBsb2NhdGlvbnMgKHRoYXQgSSBkb24ndCBsaWtlIGFzIG11Y2gpDQoNCiMjIE1lZGlhbiBDaGljYWdvIEFWIHZzIE1lZGlhbiBEb2x0b24gQVYNCg0KYGBge3J9DQoNCg0KIyMgQ2hpY2FnbyAjDQoNCkNoaTEgPC0gRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGFycmFuZ2UoYXYpJT4lDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAyMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKGF2LDE4MDAwLDIyMDAwKSkgJT4lDQogIHN1bW1hcml6ZSgNCiAgICBjb21wX3RheHJhdGUgPSBtZWFuKHRheF9jb2RlX3JhdGUpLA0KICAgIGh5cG90aGV0aWNhbF90YXhyYXRlID0gbWVhbih0YXhyYXRlX25ldywgbmEucm09VFJVRSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfcG9zdF9leGUgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLCANCiAgICBlYXYgPSBtZWFuKGVhdikNCiAgKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gY29tcF90YXhyYXRlOmVhdiwgbmFtZXNfdG8gPSAiU3RhdHMiLCB2YWx1ZXNfdG8gPSAiVmFsdWVzIikNCiAgIyBrYmwoY2FwdGlvbj0gIkNoaWNhZ28sIENsYXNzIDIwMywgVGF4IEJpbGwgfiQzMTUwIiwgZGlnaXRzPTAsIGJvb2t0YWJzID0gVCkNCg0KDQojIyBEb2x0b24gIyMgDQoNCkRvbDE8LSBEb2x0b25DaGljYWdvICU+JSANCiAgYXJyYW5nZShhdikgJT4lDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAzMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKGF2LDgwMDAsMTIwMDApKSAlPiUNCiAgc3VtbWFyaXplKA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSksDQogICAgaHlwb3RoZXRpY2FsX3RheHJhdGUgPSBtZWFuKHRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCg0KICAgIGJpbGxfY3VycmVudCA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgYmlsbF9oeXAgPSBtZWFuKGVhdip0YXhyYXRlX25ldywgbmEucm09VFJVRSksDQogICAgYmlsbF9jaGFuZ2UgPSBiaWxsX2h5cCAtIGJpbGxfY3VycmVudCwNCiAgICB0YXhfYW10X3Bvc3RfZXhlID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICB0YXhfYW10X2V4ZSA9IG1lYW4odGF4X2FtdF9leGUpLA0KICAgIHRheF9hbXRfcHJlX2V4ZSA9IG1lYW4odGF4X2FtdF9wcmVfZXhlKSwNCiAgICBwaW5fY291bnQgPSBuKCksDQogICAgYXYgPSBtZWFuKGF2KSwgDQogICAgZWF2ID0gbWVhbihlYXYpDQogICkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpDQoNCg0KYm90aF9kdCA8LSBjYmluZChDaGkxLCBEb2wxKQ0KDQoNCmtibChib3RoX2R0LCBib29rdGFicyA9IFQsIGRpZ2l0cyA9IDAsIGNhcHRpb24gPSAiUHJvcGVydHkgQ2xhc3MgMjAzIENvbXBhcmlzb24sIENoaWNhZ28gTWVkaWFuIEFWIHZzIERvbHRvbiBNZWRpYW4gQVYiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVCkgJT4lDQphZGRfaGVhZGVyX2Fib3ZlKGMoIkNoaWNhZ28gTWVkaWFuIEFWIDIwMyBQcm9wZXJ0eSIgPSAyLCAiRG9sdG9uIE1lZGlhbiBBViAyMDMgUHJvcGVydHkiID0gMikpDQoNCg0KYGBgDQoNCg0KIyMgTWVkaWFuIENoaWNhZ28gVGF4YmlsbCB2cyBNZWRpYW4gRG9sdG9uIFRheGJpbGwNCg0KDQpgYGB7cn0NCg0KDQojIyBDaGljYWdvICMNCg0KQ2hpMSA8LSBEb2x0b25DaGljYWdvICU+JSANCiAgYXJyYW5nZShhdiklPiUNCiAgZmlsdGVyKGFnZW5jeV9udW0gPT0gIjAzMDIxMDAwMCIgJiBjbGFzcyA9PSAiMjAzIiAmIGJldHdlZW4odG90YWxfYmlsbGVkLDMxMDAsMzMwMCkpICU+JQ0KICBzdW1tYXJpemUoDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksIA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKQ0KICAjIGtibChjYXB0aW9uPSAiQ2hpY2FnbywgQ2xhc3MgMjAzLCBUYXggQmlsbCB+JDMxNTAiLCBkaWdpdHM9MCwgYm9va3RhYnMgPSBUKQ0KDQoNCiMjIERvbHRvbiAjIyANCg0KRG9sMTwtIERvbHRvbkNoaWNhZ28gJT4lIA0KICBhcnJhbmdlKGF2KSAlPiUNCiAgZmlsdGVyKGFnZW5jeV9udW0gPT0gIjAzMDMxMDAwMCIgJiBjbGFzcyA9PSAiMjAzIiAmIGJldHdlZW4odG90YWxfYmlsbGVkLDMxMDAsMzMwMCkpICU+JQ0KICBzdW1tYXJpemUoDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksIA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKSAjJT4lIA0KICAjIGtibChjYXB0aW9uPSAiRG9sdG9uLCBDbGFzcyAyMDMsIFRheCBCaWxsIH4gJDMxNTAiLCBkaWdpdHM9MCwgYm9va3RhYnMgPSBUKQ0KDQoNCiMgYXYgPSANCiNleGVtcHQgZWF2ID0gDQoNCg0KYm90aF9kdCA8LSBjYmluZChDaGkxLCBEb2wxKQ0KDQoNCmtibChib3RoX2R0LCBib29rdGFicyA9IFQsIGRpZ2l0cyA9IDAsIGNhcHRpb24gPSAiUHJvcGVydHkgQ2xhc3MgMjAzIENvbXBhcmlzb24sIFRheCBCaWxsIH4gJDMsMTUwIChDaGljYWdvJ3MgbWVkaWFuIGN1cnJlbnQgYmlsbCkiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVCklPiUNCmFkZF9oZWFkZXJfYWJvdmUoYygiQ2hpY2FnbyIgPSAyLCAiRG9sdG9uIiA9IDIpKQ0KDQoNCg0KDQpDaGkxYSA8LSBEb2x0b25DaGljYWdvICU+JSBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMjEwMDAwIiAmIGNsYXNzID09ICIyMDMiICYgYmV0d2Vlbih0b3RhbF9iaWxsZWQsNDEwMCw0MjAwKSkgJT4lDQogIGFycmFuZ2UoYXYpJT4lDQogIHN1bW1hcml6ZSgNCiAgICBjb21wX3RheHJhdGUgPSBtZWFuKHRheF9jb2RlX3JhdGUpLA0KICAgIGJpbGxfY3VycmVudCA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgYmlsbF9oeXAgPSBtZWFuKGVhdip0YXhyYXRlX25ldywgbmEucm09VFJVRSksDQogICAgYmlsbF9jaGFuZ2UgPSBiaWxsX2h5cCAtIGJpbGxfY3VycmVudCwNCiAgICB0YXhfYW10X3Bvc3RfZXhlID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICB0YXhfYW10X2V4ZSA9IG1lYW4odGF4X2FtdF9leGUpLA0KICAgIHRheF9hbXRfcHJlX2V4ZSA9IG1lYW4odGF4X2FtdF9wcmVfZXhlKSwNCiAgICBwaW5fY291bnQgPSBuKCksDQogICAgYXYgPSBtZWFuKGF2KSwgDQogICAgZWF2ID0gbWVhbihlYXYpDQogICAgICAgICAgICAgICAgKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKSANCiMga2JsKGNhcHRpb249ICJDaGljYWdvLCBDbGFzcyAyMDMsIFRheCBCaWxsIH4kMzE1MCIsIGRpZ2l0cz0wLCBib29rdGFicyA9IFQpDQoNCg0KIyMgQ2hpY2FnbyAjIyANCg0KIyBDaGljYWdvIG9ubHkgaGFzIDIgcGlucyB0aGF0IGFyZSBzaW1pbGFyIHRvIERvbHRvbidzIG1lZGlhbiBwaW4gKHdoaWNoIGhhZCBhIGxvdCBvZiBtYXRjaGVzKQ0KI0RvbHRvbkNoaWNhZ28gJT4lIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAzMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKHRvdGFsX2JpbGxlZCwzMTQwLDMxNjApKQ0KDQpEb2wxYSA8LSBEb2x0b25DaGljYWdvICU+JSBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMzEwMDAwIiAmIGNsYXNzID09ICIyMDMiICYgYmV0d2Vlbih0b3RhbF9iaWxsZWQsNDEwMCw0MjAwKSkgJT4lDQogIHN1bW1hcml6ZSgNCiAgICBjb21wX3RheHJhdGUgPSBtZWFuKHRheF9jb2RlX3JhdGUpLA0KICAgIGJpbGxfY3VycmVudCA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgYmlsbF9oeXAgPSBtZWFuKGVhdip0YXhyYXRlX25ldywgbmEucm09VFJVRSksDQogICAgYmlsbF9jaGFuZ2UgPSBiaWxsX2h5cCAtIGJpbGxfY3VycmVudCwNCiAgICB0YXhfYW10X3Bvc3RfZXhlID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICB0YXhfYW10X2V4ZSA9IG1lYW4odGF4X2FtdF9leGUpLA0KICAgIHRheF9hbXRfcHJlX2V4ZSA9IG1lYW4odGF4X2FtdF9wcmVfZXhlKSwNCiAgICBwaW5fY291bnQgPSBuKCksDQogICAgYXYgPSBtZWFuKGF2KSwgDQogICAgZWF2ID0gbWVhbihlYXYpKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKSAjJT4lIA0KIyBrYmwoY2FwdGlvbj0gIkRvbHRvbiwgQ2xhc3MgMjAzLCBUYXggQmlsbCB+ICQzMTUwIiwgZGlnaXRzPTAsIGJvb2t0YWJzID0gVCkNCg0KDQojIGF2ID0gDQojZXhlbXB0IGVhdiA9IA0KDQoNCmJvdGhfZHQgPC0gY2JpbmQoQ2hpMWEsIERvbDFhKQ0KDQoNCmtibChib3RoX2R0LCBib29rdGFicyA9IFQsIGRpZ2l0cyA9IDAsIGNhcHRpb24gPSAiUHJvcGVydHkgQ2xhc3MgMjAzIENvbXBhcmlzb24sIFRheCBCaWxsIH4gJDQxNTAgKERvbHRvbidzIG1lZGlhbiBjdXJyZW50IGJpbGwpIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFQpICU+JQ0KYWRkX2hlYWRlcl9hYm92ZShjKCJDaGljYWdvIiA9IDIsICJEb2x0b24iID0gMikpDQoNCg0KYm90aF9kdCA8LSBjYmluZChDaGkxLCBEb2wxYSkNCg0KDQprYmwoYm90aF9kdCwgYm9va3RhYnMgPSBULCBkaWdpdHMgPSAwLCBjYXB0aW9uID0gIlByb3BlcnR5IENsYXNzIDIwMyBDb21wYXJpc29uLCBNZWRpYW4gRG9sdG9uIHZzIE1lZGlhbiBDaGljYWdvIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFQpJT4lDQphZGRfaGVhZGVyX2Fib3ZlKGMoIkNoaWNhZ28gTWVkaWFuIDIwMyBQcm9wZXJ0eSIgPSAyLCAiRG9sdG9uIE1lZGlhbiAyMDMgUHJvcGVydHkiID0gMikpDQpgYGANCg0KDQojIyBVc2luZyBhIGN1cnJlbnQgdGF4IGJpbGwgfiQzNTAwOg0KDQpJZiBob2xkaW5nIHRoZSBsZXZ5IGNvbnN0YW50IGFuZCBhY2tub3dsZWRnaW5nIHRoZSBjaGFuZ2UgaW4gdGF4IHJhdGVzIHRoYXQgd291bGQgb2NjdXIgZnJvbSBoYXZpbmcgYWRkaXRpb25hbCB0YXhhYmxlIEVBViB3aXRoaW4gdGhlIHRheGluZyBqdXJpc2RpY3Rpb25zLCBDaGljYWdvJ3MgaHlwb3RoZXRpY2FsIHRheCBiaWxsIHdvdWxkIGJlIFwkMzY0NCAoYW4gXCQ4NyBpbmNyZWFzZSBmcm9tIFwkMzU1NykgYW5kIERvbHRvbidzIHdvdWxkIGJlIFwkMzY5MiAoYSBcJDEzNiBpbmNyZWFzZSBmcm9tICQzNTU1KS4NCg0KYGBge3J9DQpEb2x0b25DaGljYWdvICU+JSANCiAgZmlsdGVyKGFnZW5jeV9udW0gPT0gIjAzMDIxMDAwMCIgJiBjbGFzcyA9PSAiMjAzIiAmIGJldHdlZW4odGF4X2FtdF9wb3N0X2V4ZSwgMzUwMCwgMzYwMCkpICU+JQ0KICAgIHN1bW1hcml6ZSggICAgICAgICAgICAgIA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfcG9zdF9leGUgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLCANCiAgICBlYXYgPSBtZWFuKGVhdikpICAlPiUgDQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKSU+JQ0KICBrYmwoY2FwdGlvbj0gIkNoaWNhZ28sIENsYXNzIDIwMywgQ3VycmVudCBCaWxsIH4gJDMsNTUwIiwgZGlnaXRzPTApDQoNCiMgQ2hpY2FnbyBvbmx5IGhhcyAyIHBpbnMgdGhhdCBhcmUgc2ltaWxhciB0byBEb2x0b24ncyBtZWRpYW4gcGluICh3aGljaCBoYWQgYSBsb3Qgb2YgbWF0Y2hlcykNCkRvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMzEwMDAwIiAmIGNsYXNzID09ICIyMDMiICYgYmV0d2Vlbih0YXhfYW10X3Bvc3RfZXhlLDM1MDAsMzYwMCkpICU+JQ0KICAgIHN1bW1hcml6ZSggICAgICAgICAgICAgIA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfcG9zdF9leGUgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLCANCiAgICBlYXYgPSBtZWFuKGVhdikpICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpJT4lDQogIGtibChjYXB0aW9uPSAiRG9sdG9uLCBDbGFzcyAyMDMsIEN1cnJlbnQgQmlsbCB+ICQzLDU1MCIsIGRpZ2l0cz0wKQ0KYGBgDQoNCg0KDQoNCg0KIyMgVXNpbmcgYSBjdXJyZW50IHRheCBiaWxsIH4kMzcwMDoNCg0KVmFsdWUgd2FzIGNob3NlbiByYW5kb21seSBhcyByb3VnaGx5IGJldHdlZW4gdGhlIG1lZGlhbiBwcm9wZXJ0eSBBViBpbiBEb2x0b24gYW5kIENoaWNhZ28uIA0KDQpGb3IgcG9zdC1leGVtcHRpb24gYmlsbHMgYXJvdW5kIFwkMzcwMDogQ2hpY2FnbyBoYXMgJDI2LDQ0OCBBViBhbmQgXCQ3OSw0MjAgaW4gRUFWLiBDaGljYWdvJ3MgQ29tcG9zaXRlIHRheCByYXRlIGZvciB0aGUgcHJvcGVydGllcyBleGFtaW5lZCBpcyA2LjclLiBEb2x0b24gaGFzIGFuIEFWIG9mIFwkNyw2MzEgYW5kIFwkMjIsOTE0IGluIEVBVi4gRG9sdG9uJ3MgYXZlcmFnZSBjb21wb3NpdGUgdGF4IHJhdGUgZm9yIHRoZSBwcm9wZXJ0aWVzIGV4YW1pbmVkIHdhcyAyNC4yJS4NCg0KSWYgaG9sZGluZyB0aGUgbGV2eSBjb25zdGFudCBhbmQgYWNrbm93bGVkZ2luZyB0aGUgY2hhbmdlIGluIHRheCByYXRlcyB0aGF0IHdvdWxkIG9jY3VyIGZyb20gaGF2aW5nIGFkZGl0aW9uYWwgdGF4YWJsZSBFQVYgd2l0aGluIHRoZSB0YXhpbmcganVyaXNkaWN0aW9ucywgQ2hpY2FnbydzIGh5cG90aGV0aWNhbCB0YXggYmlsbCB3b3VsZCBiZSBcJDQ1MDMgKGFuIFwkODAyIGluY3JlYXNlIGZyb20gXCQzNzAwKSBhbmQgRG9sdG9uJ3Mgd291bGQgYmUgXCQzNDc5IChhIFwkMjIwIERFQ1JFQVNFIGZyb20gJDM3MDApLiANCg0KYGBge3J9DQojIyBDaGljYWdvICMjIA0KRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAyMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKHRheF9hbXRfcG9zdF9leGUsIDM2OTUsIDM3MDUpKSAlPiUNCiAgc3VtbWFyaXplKA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksDQogICAgZWF2ID0gbWVhbihlYXYpDQogICkgICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpJT4lDQogIGtibChjYXB0aW9uPSAiQ2hpY2FnbyBOT1QgRU5PR1VIIFBJTlMsIENsYXNzIDIwMywgQ3VycmVudCBCaWxsIH4kMyw3MDAiLCBkaWdpdHM9MCkNCg0KIyBDaGljYWdvIG9ubHkgaGFzIDIgcGlucyB0aGF0IGFyZSBzaW1pbGFyIHRvIERvbHRvbidzIG1lZGlhbiBwaW4gKHdoaWNoIGhhZCBhIGxvdCBvZiBtYXRjaGVzKQ0KDQojIyBEb2x0b24gIyMgDQpEb2x0b25DaGljYWdvICU+JSANCiAgZmlsdGVyKGFnZW5jeV9udW0gPT0gIjAzMDMxMDAwMCIgJiBjbGFzcyA9PSAiMjAzIiAmIGJldHdlZW4odGF4X2FtdF9wb3N0X2V4ZSwzNjk1LDM3MDUpKSAlPiUNCiAgc3VtbWFyaXplKA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwgIA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUpLCAjIHRoZSBuYWl2ZSBhbW91bnQgdGhhdCBhcHBlYXJzIG9uIHBlb3BsZXMgdGF4YmlsbHMNCiAgICBwaW5fY291bnQgPSBuKCksDQogICAgYXYgPSBtZWFuKGF2KSwNCiAgICBlYXYgPSBtZWFuKGVhdikNCiAgKSAlPiUgDQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKSU+JQ0KICBrYmwoY2FwdGlvbj0gIkRvbHRvbiBOT1QgRU5PVUdIIFBJTlMsIENsYXNzIDIwMywgQ3VycmVudCBCaWxsIH4gJDMsNzAwIiAsIGRpZ2l0cz0wKQ0KYGBgDQoNCg0KDQo+IEV4cGFuZGVkIHRheGJpbGwgcmFuZ2U6DQoNCg0KYGBge3J9DQojIyBDaGljYWdvICMjIA0KRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAyMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKHRheF9hbXRfcG9zdF9leGUsIDM2MDAsIDM4MDApKSAlPiUNCiAgc3VtbWFyaXplKA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksDQogICAgZWF2ID0gbWVhbihlYXYpDQogICkgICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpJT4lDQogIGtibChjYXB0aW9uPSAiQ2hpY2FnbywgQ2xhc3MgMjAzLCBDdXJyZW50IEJpbGwgfiQzLDcwMCIsIGRpZ2l0cz0wKQ0KDQojIENoaWNhZ28gb25seSBoYXMgMiBwaW5zIHRoYXQgYXJlIHNpbWlsYXIgdG8gRG9sdG9uJ3MgbWVkaWFuIHBpbiAod2hpY2ggaGFkIGEgbG90IG9mIG1hdGNoZXMpDQoNCiMjIERvbHRvbiAjIyANCkRvbHRvbkNoaWNhZ28gJT4lIA0KICBmaWx0ZXIoYWdlbmN5X251bSA9PSAiMDMwMzEwMDAwIiAmIGNsYXNzID09ICIyMDMiICYgYmV0d2Vlbih0YXhfYW10X3Bvc3RfZXhlLDM2MDAsMzgwMCkpICU+JQ0KICBzdW1tYXJpemUoDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLCAgDQogICAgYmlsbF9jaGFuZ2UgPSBiaWxsX2h5cCAtIGJpbGxfY3VycmVudCwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSksICMgdGhlIG5haXZlIGFtb3VudCB0aGF0IGFwcGVhcnMgb24gcGVvcGxlcyB0YXhiaWxscw0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpJT4lDQogIGtibChjYXB0aW9uPSAiRG9sdG9uLCBDbGFzcyAyMDMsIEN1cnJlbnQgQmlsbCB+ICQzLDcwMCIsIGRpZ2l0cz0wKQ0KYGBgDQoNCg0KDQojIyBVc2luZyBwcmUtZXhlbXB0aW9uIHRheGJpbGwgYW1vdW50IG9mICQzNzAwOg0KDQpGb3IgcHJlIGV4ZW1wdGlvbiB0YXggYmlsbHMgYXJvdW5kIFwkMzcwMCBpbiBDaGljYWdvLCBhdmVyYWdlIEFWIGlzIFwkMTgsMzc4LCBFQVYgaXMgXCQ1NSwxODQuIEF2ZXJhZ2UgY3VycmVudCB0YXhiaWxsIGlzICQyOTAxLg0KDQoNCkNoaWNhZ28ncyBDb21wb3NpdGUgdGF4IHJhdGUgZm9yIHRoZSBwcm9wZXJ0aWVzIGV4YW1pbmVkIGlzIDYuNyUuDQpEb2x0b24ncyBhdmVyYWdlIGNvbXBvc2l0ZSB0YXggcmF0ZSBmb3IgdGhlIHByb3BlcnRpZXMgZXhhbWllbmQgd2FzIDI0LjIlLg0KDQpGb3IgcHJlIGV4ZW1wdGlvbiB0YXggYmlsbHMgYXJvdW5kIFwkMzcwMCBpbiBEb2x0b24sIGF2ZXJhZ2UgQVYgaXMgXCQ1LDIzNSwgRUFWIGlzIFwkMTUsNzE5LiBBdmVyYWdlIGN1cnJlbnQgdGF4YmlsbCBpcyAkMzA0NC4NCg0KDQpJZiBob2xkaW5nIHRoZSBsZXZ5IGNvbnN0YW50IGFuZCBhY2tub3dsZWRnaW5nIHRoZSBjaGFuZ2UgaW4gdGF4IHJhdGVzIHRoYXQgd291bGQgb2NjdXIgZnJvbSBoYXZpbmcgYWRkaXRpb25hbCB0YXhhYmxlIEVBViB3aXRoaW4gdGhlIHRheGluZyBqdXJpc2RpY3Rpb25zLCBDaGljYWdvJ3MgaHlwb3RoZXRpY2FsIHRheCBiaWxsIHdvdWxkIGJlIFwkMjk5MCAoYW4gXCQ4OSBpbmNyZWFzZSBmcm9tIFwkMjkwMSkgYW5kIERvbHRvbidzIHdvdWxkIGJlIFwkMjM3NyAoYSBcJDY2NyBERUNSRUFTRSBmcm9tICQzMDQ0KS4gDQoNClVzZXMgYSB0YXggYmlsbCByYW5nZSBvZiAzNjAwIHRvIDM4MDAgdG8gaW5jcmVhc2UgIm1lZGlhbiBwaW5zIiB1c2VkIGZvciBzdW1tYXJ5IHN0YXRzLiANCg0KYGBge3J9DQojIyBDaGljYWdvICMjIA0KRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAyMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKHRheF9hbXRfcHJlX2V4ZSwgMzYwMCwgMzgwMCkpICU+JQ0KICBzdW1tYXJpemUoDQogICAgY29tcF90YXhyYXRlID0gbWVhbih0YXhfY29kZV9yYXRlKSwNCiAgICBiaWxsX2N1cnJlbnQgPSBtZWFuKHRheF9hbXRfcG9zdF9leGUpLA0KICAgIGJpbGxfaHlwID0gbWVhbihlYXYqdGF4cmF0ZV9uZXcsIG5hLnJtPVRSVUUpLA0KICAgIGJpbGxfY2hhbmdlID0gYmlsbF9oeXAgLSBiaWxsX2N1cnJlbnQsDQogICAgdGF4X2FtdF9wb3N0X2V4ZSA9IG1lYW4odGF4X2FtdF9wb3N0X2V4ZSksDQogICAgdGF4X2FtdF9leGUgPSBtZWFuKHRheF9hbXRfZXhlKSwNCiAgICB0YXhfYW10X3ByZV9leGUgPSBtZWFuKHRheF9hbXRfcHJlX2V4ZSksDQogICAgcGluX2NvdW50ID0gbigpLA0KICAgIGF2ID0gbWVhbihhdiksDQogICAgZWF2ID0gbWVhbihlYXYpDQogICkgICU+JSANCiAgICBwaXZvdF9sb25nZXIoY29scyA9IGNvbXBfdGF4cmF0ZTplYXYsIG5hbWVzX3RvID0gIlN0YXRzIiwgdmFsdWVzX3RvID0gIlZhbHVlcyIpJT4lDQogIGtibChjYXB0aW9uPSAiQ2hpY2FnbywgQ2xhc3MgMjAzLCBOYWl2ZSBQcmUtRXhlbXAgQmlsbCB+ICQzLDcwMCIsIGRpZ2l0cz0wKQ0KDQoNCiMjIERvbHRvbiAjIw0KRG9sdG9uQ2hpY2FnbyAlPiUgDQogIGZpbHRlcihhZ2VuY3lfbnVtID09ICIwMzAzMTAwMDAiICYgY2xhc3MgPT0gIjIwMyIgJiBiZXR3ZWVuKHRheF9hbXRfcHJlX2V4ZSwzNjAwLDM4MDApKSAlPiUNCiAgc3VtbWFyaXplKA0KICAgIGNvbXBfdGF4cmF0ZSA9IG1lYW4odGF4X2NvZGVfcmF0ZSksDQogICAgYmlsbF9jdXJyZW50ID0gbWVhbih0YXhfYW10X3Bvc3RfZXhlKSwNCiAgICBiaWxsX2h5cCA9IG1lYW4oZWF2KnRheHJhdGVfbmV3LCBuYS5ybT1UUlVFKSwNCiAgICBiaWxsX2NoYW5nZSA9IGJpbGxfaHlwIC0gYmlsbF9jdXJyZW50LA0KICAgIHRheF9hbXRfZXhlID0gbWVhbih0YXhfYW10X2V4ZSksDQogICAgdGF4X2FtdF9wcmVfZXhlID0gbWVhbih0YXhfYW10X3ByZV9leGUpLA0KICAgIHBpbl9jb3VudCA9IG4oKSwNCiAgICBhdiA9IG1lYW4oYXYpLA0KICAgIGVhdiA9IG1lYW4oZWF2KQ0KICApICAlPiUgDQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb21wX3RheHJhdGU6ZWF2LCBuYW1lc190byA9ICJTdGF0cyIsIHZhbHVlc190byA9ICJWYWx1ZXMiKSU+JQ0KICBrYmwoY2FwdGlvbj0gIkRvbHRvbiwgQ2xhc3MgMjAzLCBOYWl2ZSBQcmUtRXhlbXAgQmlsbCB+ICQzLDcwMCIsIGRpZ2l0cz0wKQ0KYGBgDQoNCg==