library

library(acs) # access acs survey data
library(tidyverse) # data manupliation
library(tidycensus) # access census data
library(ggplot2)
library(ggmap)
library(maptools)
library(ggthemes)
library(rgeos)
library(broom)
library(dplyr)
library(plyr)
library(grid)
library(gridExtra)
library(reshape2)
library(scales)
library(tigris)
library(sf)
Linking to GEOS 3.8.1, GDAL 2.4.4, PROJ 7.0.0
library(rgdal)
rgdal: version: 1.4-8, (SVN revision 845)
 Geospatial Data Abstraction Library extensions to R successfully loaded
 Loaded GDAL runtime: GDAL 2.4.2, released 2019/06/28
 Path to GDAL shared files: /Library/Frameworks/R.framework/Versions/3.6/Resources/library/rgdal/gdal
 GDAL binary built with GEOS: FALSE 
 Loaded PROJ.4 runtime: Rel. 5.2.0, September 15th, 2018, [PJ_VERSION: 520]
 Path to PROJ.4 shared files: /Library/Frameworks/R.framework/Versions/3.6/Resources/library/rgdal/proj
 Linking to sp version: 1.3-2 
library(leaflet)
library(sp)
library(devtools)
library(censusapi)

Attaching package: ‘censusapi’

The following object is masked from ‘package:methods’:

    getFunction
library(XML)
library(RCurl)

Attaching package: ‘RCurl’

The following object is masked from ‘package:tidyr’:

    complete
register_google(key = "AIzaSyA2ssODSDKBAXe5MOgxz6rL_JfnN7JTX30")
# Next, we’re going to define two themes that will tell ggplot how to construct both maps and plots. Defining our themes up front ensures that we don’t have to repeat this code over and again for every plot we generate below

plotTheme <- function(base_size = 12) {
  theme(
    text = element_text( color = "black"),
    plot.title = element_text(size = 18,colour = "black"),
    plot.subtitle = element_text(face="italic"),
    plot.caption = element_text(hjust=0),
    axis.ticks = element_blank(),
    panel.background = element_blank(),
    panel.grid.major = element_line("grey80", size = 0.1),
    panel.grid.minor = element_blank(),
    strip.background = element_rect(fill = "grey80", color = "white"),
    strip.text = element_text(size=12),
    axis.title = element_text(size=8),
    axis.text = element_text(size=8),
    axis.title.x = element_text(hjust=1),
    axis.title.y = element_text(hjust=1),
    plot.background = element_blank(),
    legend.background = element_blank(),
    legend.title = element_text(colour = "black", face = "italic"),
    legend.text = element_text(colour = "black", face = "italic"))
}
 
# And another that we will use for maps
mapTheme <- function(base_size = 12) {
  theme(
    text = element_text( color = "black"),
    plot.title = element_text(size = 18,colour = "black"),
    plot.subtitle=element_text(face="italic"),
    plot.caption=element_text(hjust=0),
    axis.ticks = element_blank(),
    panel.background = element_blank(),
    panel.grid.major = element_line("grey80", size = 0.1),
    strip.text = element_text(size=12),
    axis.title = element_blank(),
    axis.text = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    panel.grid.minor = element_blank(),
    strip.background = element_rect(fill = "grey80", color = "white"),
    plot.background = element_blank(),
    legend.background = element_blank(),
    legend.title = element_text(colour = "black", face = "italic"),
    legend.text = element_text(colour = "black", face = "italic"))
}
 
# Define some palettes
palette_9_colors <- c("#0DA3A0","#2999A9","#458FB2","#6285BB","#7E7CC4","#9A72CD","#B768D6","#D35EDF","#F055E9")
palette_8_colors <- c("#0DA3A0","#2D97AA","#4D8CB4","#6E81BF","#8E76C9","#AF6BD4","#CF60DE","#F055E9")
palette_7_colors <- c("#2D97AA","#4D8CB4","#6E81BF","#8E76C9","#AF6BD4","#CF60DE","#F055E9")
palette_1_colors <- c("#0DA3A0")

Get Boston Rental Data as a table dataframe

BR_2_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1361188921.txt")
BR_3_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1363604521.txt")
BR_4_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1366282922.txt")
BR_5_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1368874922.txt")
BR_6_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1371553321.txt")
BR_7_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1374145322.txt")
BR_8_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1376823721.txt")
BR_9_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1379502122.txt")
BR_10_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1382094122.txt")
BR_11_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1384776122.txt")
BR_11_21_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1385024431.txt")
BR_12_18_2013 <-read.table("https://www.jefftk.com/apartment_prices/apts-1387368122.txt")
BR_1_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1390046522.txt")
BR_2_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1392724922.txt")
BR_3_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1395140522.txt")
BR_4_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1397818922.txt")
BR_5_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1400410922.txt")
BR_6_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1403089321.txt")
BR_7_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1405681321.txt")
BR_8_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1408359722.txt")
BR_9_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1411038121.txt")
BR_10_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1413597722.txt")
BR_11_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1416276121.txt")
BR_12_18_2014 <-read.table("https://www.jefftk.com/apartment_prices/apts-1418868122.txt")
BR_1_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1421546523.txt")
BR_2_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1424224922.txt")
BR_3_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1426644122.txt")
BR_4_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1429322522.txt")
BR_5_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1431914522.txt")
BR_6_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1434592921.txt")
BR_7_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1437184922.txt")
BR_8_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1439863322.txt")
BR_9_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1442541722.txt")
BR_10_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1445133723.txt")
BR_11_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1447812123.txt")
BR_12_18_2015 <-read.table("https://www.jefftk.com/apartment_prices/apts-1450404122.txt")
BR_1_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1453082522.txt")
BR_2_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1455760922.txt")
BR_3_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1458266521.txt")
BR_4_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1460944923.txt")
BR_5_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1463536922.txt")
BR_6_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1466215323.txt")
BR_7_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1468807322.txt")
BR_8_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1471485722.txt")
BR_9_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1474164121.txt")
BR_10_28_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1477662757.txt")
BR_11_18_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1479477370.txt")
BR_12_19_2016 <-read.table("https://www.jefftk.com/apartment_prices/apts-1482155325.txt")
BR_1_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1484743042.txt")
BR_2_19_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1487511252.txt")
BR_3_19_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1489951548.txt")
BR_4_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1492528051.txt")
BR_5_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1495128565.txt")
BR_6_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1497785436.txt")
BR_7_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1500389951.txt")
BR_8_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1503056501.txt")
BR_9_19_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1505830448.txt")
BR_10_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1508347437.txt")
BR_11_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1511025718.txt")
BR_12_18_2017 <-read.table("https://www.jefftk.com/apartment_prices/apts-1513607533.txt")
BR_1_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1516280053.txt")
BR_2_21_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1519173184.txt")
BR_3_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1521392156.txt")
BR_4_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1524056383.txt")
BR_4_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1524059974.txt")
BR_5_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1526663745.txt")
BR_7_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1531942677.txt")
BR_8_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1534594761.txt")
BR_9_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1537269695.txt")
BR_10_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1539895062.txt")
BR_11_19_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1542637382.txt")
BR_12_18_2018 <-read.table("https://www.jefftk.com/apartment_prices/apts-1545151888.txt")
BR_1_27_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1548600831.txt")
BR_2_18_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1550519514.txt")
BR_3_18_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1552916163.txt")
BR_4_18_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1555593780.txt")
BR_5_20_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1558364572.txt")
BR_6_18_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1560875990.txt")
BR_8_3_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1564836478.txt")
BR_8_18_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1566158813.txt")
BR_9_18_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1568827984.txt")
BR_10_20_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1571532666.txt")
BR_11_18_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1574092365.txt")
BR_12_18_2019 <-read.table("https://www.jefftk.com/apartment_prices/apts-1576687349.txt")
BR_1_18_2020 <-read.table("https://www.jefftk.com/apartment_prices/apts-1579389225.txt")
BR_2_18_2020 <-read.table("https://www.jefftk.com/apartment_prices/apts-1582039669.txt")
BR_3_20_2020 <-read.table("https://www.jefftk.com/apartment_prices/apts-1584708383.txt")

Add Year

BR_2_18_2013$Year <-"2013"
BR_3_18_2013$Year <-"2013"
BR_4_18_2013$Year <-"2013"
BR_5_18_2013$Year <-"2013"
BR_6_18_2013$Year <-"2013"
BR_7_18_2013$Year <-"2013"
BR_8_18_2013$Year <-"2013"
BR_9_18_2013$Year <-"2013"
BR_10_18_2013$Year <-"2013"
BR_11_18_2013$Year <-"2013"
BR_11_21_2013$Year <-"2013"
BR_12_18_2013$Year <-"2013"
BR_1_18_2014$Year <-"2014"
BR_2_18_2014$Year <-"2014"
BR_3_18_2014$Year <-"2014"
BR_4_18_2014$Year <-"2014"
BR_5_18_2014$Year <-"2014"
BR_6_18_2014$Year <-"2014"
BR_7_18_2014$Year <-"2014"
BR_8_18_2014$Year <-"2014"
BR_9_18_2014$Year <-"2014"
BR_10_18_2014$Year <-"2014"
BR_11_18_2014$Year <-"2014"
BR_12_18_2014$Year <-"2014"
BR_1_18_2015$Year <-"2015"
BR_2_18_2015$Year <-"2015"
BR_3_18_2015$Year <-"2015"
BR_4_18_2015$Year <-"2015"
BR_5_18_2015$Year <-"2015"
BR_6_18_2015$Year <-"2015"
BR_7_18_2015$Year <-"2015"
BR_8_18_2015$Year <-"2015"
BR_9_18_2015$Year <-"2015"
BR_10_18_2015$Year <-"2015"
BR_11_18_2015$Year <-"2015"
BR_12_18_2015$Year <-"2015"
BR_1_18_2016$Year <-"2016"
BR_2_18_2016$Year <-"2016"
BR_3_18_2016$Year <-"2016"
BR_4_18_2016$Year <-"2016"
BR_5_18_2016$Year <-"2016"
BR_6_18_2016$Year <-"2016"
BR_7_18_2016$Year <-"2016"
BR_8_18_2016$Year <-"2016"
BR_9_18_2016$Year <-"2016"
BR_10_28_2016$Year <-"2016"
BR_11_18_2016$Year <-"2016"
BR_12_19_2016$Year <-"2016"
BR_1_18_2017$Year <-"2017"
BR_2_19_2017$Year <-"2017"
BR_3_19_2017$Year <-"2017"
BR_4_18_2017$Year <-"2017"
BR_5_18_2017$Year <-"2017"
BR_6_18_2017$Year <-"2017"
BR_7_18_2017$Year <-"2017"
BR_8_18_2017$Year <-"2017"
BR_9_19_2017$Year <-"2017"
BR_10_18_2017$Year <-"2017"
BR_11_18_2017$Year <-"2017"
BR_12_18_2017$Year <-"2017"
BR_1_18_2018$Year <-"2018"
BR_2_21_2018$Year <-"2018"
BR_3_18_2018$Year <-"2018"
BR_4_18_2018$Year <-"2018"
BR_4_18_2018$Year <-"2018"
BR_5_18_2018$Year <-"2018"
BR_7_18_2018$Year <-"2018"
BR_8_18_2018$Year <-"2018"
BR_9_18_2018$Year <-"2018"
BR_10_18_2018$Year <-"2018"
BR_11_19_2018$Year <-"2018"
BR_12_18_2018$Year <-"2018"
BR_1_27_2019$Year <-"2019"
BR_2_18_2019$Year <-"2019"
BR_3_18_2019$Year <-"2019"
BR_4_18_2019$Year <-"2019"
BR_5_20_2019$Year <-"2019"
BR_6_18_2019$Year <-"2019"
BR_8_3_2019$Year <-"2019"
BR_8_18_2019$Year <-"2019"
BR_9_18_2019$Year <-"2019"
BR_10_20_2019$Year <-"2019"
BR_11_18_2019$Year <-"2019"
BR_12_18_2019$Year <-"2019"
BR_1_18_2020$Year <-"2020"
BR_2_18_2020$Year <-"2020"
BR_3_20_2020$Year <-"2020"

Add Month

BR_2_18_2013$Month <-"Feb"
BR_3_18_2013$Month <-"Mar"
BR_4_18_2013$Month <-"Apr"
BR_5_18_2013$Month <-"May"
BR_6_18_2013$Month <-"Jun"
BR_7_18_2013$Month <-"Jul"
BR_8_18_2013$Month <-"Aug"
BR_9_18_2013$Month <-"Sep"
BR_10_18_2013$Month <-"Oct"
BR_11_18_2013$Month <-"Nov"
BR_11_21_2013$Month <-"Nov"
BR_12_18_2013$Month <-"Dec"
BR_1_18_2014$Month <-"Jan"
BR_2_18_2014$Month <-"Feb"
BR_3_18_2014$Month <-"Mar"
BR_4_18_2014$Month <-"Apr"
BR_5_18_2014$Month <-"May"
BR_6_18_2014$Month <-"Jun"
BR_7_18_2014$Month <-"Jul"
BR_8_18_2014$Month <-"Aug"
BR_9_18_2014$Month <-"Sep"
BR_10_18_2014$Month <-"Oct"
BR_11_18_2014$Month <-"Nov"
BR_12_18_2014$Month <-"Dec"
BR_1_18_2015$Month <-"Jan"
BR_2_18_2015$Month <-"Feb"
BR_3_18_2015$Month <-"Mar"
BR_4_18_2015$Month <-"Apr"
BR_5_18_2015$Month <-"May"
BR_6_18_2015$Month <-"Jun"
BR_7_18_2015$Month <-"Jul"
BR_8_18_2015$Month <-"Aug"
BR_9_18_2015$Month <-"Sep"
BR_10_18_2015$Month <-"Oct"
BR_11_18_2015$Month <-"Nov"
BR_12_18_2015$Month <-"Dec"
BR_1_18_2016$Month <-"Jan"
BR_2_18_2016$Month <-"Feb"
BR_3_18_2016$Month <-"Mar"
BR_4_18_2016$Month <-"Apr"
BR_5_18_2016$Month <-"May"
BR_6_18_2016$Month <-"Jun"
BR_7_18_2016$Month <-"Jul"
BR_8_18_2016$Month <-"Aug"
BR_9_18_2016$Month <-"Sep"
BR_10_28_2016$Month <-"Oct"
BR_11_18_2016$Month <-"Nov"
BR_12_19_2016$Month <-"Dec"
BR_1_18_2017$Month <-"Jan"
BR_2_19_2017$Month <-"Feb"
BR_3_19_2017$Month <-"Mar"
BR_4_18_2017$Month <-"Apr"
BR_5_18_2017$Month <-"May"
BR_6_18_2017$Month <-"Jun"
BR_7_18_2017$Month <-"Jul"
BR_8_18_2017$Month <-"Aug"
BR_9_19_2017$Month <-"Sep"
BR_10_18_2017$Month <-"Oct"
BR_11_18_2017$Month <-"Nov"
BR_12_18_2017$Month <-"Dec"
BR_1_18_2018$Month <-"Jan"
BR_2_21_2018$Month <-"Feb"
BR_3_18_2018$Month <-"Mar"
BR_4_18_2018$Month <-"Apr"
BR_4_18_2018$Month <-"Apr"
BR_5_18_2018$Month <-"May"
BR_7_18_2018$Month <-"Jul"
BR_8_18_2018$Month <-"Aug"
BR_9_18_2018$Month <-"Sep"
BR_10_18_2018$Month <-"Oct"
BR_11_19_2018$Month <-"Nov"
BR_12_18_2018$Month <-"Dec"
BR_1_27_2019$Month <-"Jan"
BR_2_18_2019$Month <-"Feb"
BR_3_18_2019$Month <-"Mar"
BR_4_18_2019$Month <-"Apr"
BR_5_20_2019$Month <-"May"
BR_6_18_2019$Month <-"Jun"
BR_8_3_2019$Month <-"Aug"
BR_8_18_2019$Month <-"Aug"
BR_9_18_2019$Month <-"Sep"
BR_10_20_2019$Month <-"Oct"
BR_11_18_2019$Month <-"Nov"
BR_12_18_2019$Month <-"Dec"
BR_1_18_2020$Month <-"Jan"
BR_2_18_2020$Month <-"Feb"
BR_3_20_2020$Month <-"Mar"

Merge by Year

# 2013
BR_2013 <- rbind(BR_2_18_2013,
BR_3_18_2013,
BR_4_18_2013,
BR_5_18_2013,
BR_6_18_2013,
BR_7_18_2013,
BR_8_18_2013,
BR_9_18_2013,
BR_10_18_2013,
BR_11_18_2013,
BR_11_21_2013,
BR_12_18_2013)
# 2014
BR_2014 <- rbind(BR_1_18_2014,
BR_2_18_2014,
BR_3_18_2014,
BR_4_18_2014,
BR_5_18_2014,
BR_6_18_2014,
BR_7_18_2014,
BR_8_18_2014,
BR_9_18_2014,
BR_10_18_2014,
BR_11_18_2014,
BR_12_18_2014)
# 2015
BR_2015 <- rbind(BR_1_18_2015,
BR_2_18_2015,
BR_3_18_2015,
BR_4_18_2015,
BR_5_18_2015,
BR_6_18_2015,
BR_7_18_2015,
BR_8_18_2015,
BR_9_18_2015,
BR_10_18_2015,
BR_11_18_2015,
BR_12_18_2015)
# 2016  
BR_2016 <- rbind(BR_1_18_2016,
BR_2_18_2016,
BR_3_18_2016,
BR_4_18_2016,
BR_5_18_2016,
BR_6_18_2016,
BR_7_18_2016,
BR_8_18_2016,
BR_9_18_2016,
BR_10_28_2016,
BR_11_18_2016,
BR_12_19_2016)
# 2017
BR_2017 <- rbind(BR_1_18_2017,
BR_2_19_2017,
BR_3_19_2017,
BR_4_18_2017,
BR_5_18_2017,
BR_6_18_2017,
BR_7_18_2017,
BR_8_18_2017,
BR_9_19_2017,
BR_10_18_2017,
BR_11_18_2017,
BR_12_18_2017)
# 2018
BR_2018 <- rbind(BR_1_18_2018,
BR_2_21_2018,
BR_3_18_2018,
BR_4_18_2018,
BR_4_18_2018,
BR_5_18_2018,
BR_7_18_2018,
BR_8_18_2018,
BR_9_18_2018,
BR_10_18_2018,
BR_11_19_2018,
BR_12_18_2018)
# 2019
BR_2019 <- rbind(BR_1_27_2019,
BR_2_18_2019,
BR_3_18_2019,
BR_4_18_2019,
BR_5_20_2019,
BR_6_18_2019,
BR_8_3_2019,
BR_8_18_2019,
BR_9_18_2019,
BR_10_20_2019,
BR_11_18_2019,
BR_12_18_2019)
# 2020
BR_2020 <- rbind(BR_1_18_2020,
BR_2_18_2020,
BR_3_20_2020)

Update Column Names

# 2020
names(BR_2020)[1] <- "Rent"
names(BR_2020)[2] <- "Bedrooms"
names(BR_2020)[3] <- "ID"
names(BR_2020)[4] <- "Lon"
names(BR_2020)[5] <- "Lat"
# 2019
names(BR_2019)[1] <- "Rent"
names(BR_2019)[2] <- "Bedrooms"
names(BR_2019)[3] <- "ID"
names(BR_2019)[4] <- "Lon"
names(BR_2019)[5] <- "Lat"
# 2018
names(BR_2018)[1] <- "Rent"
names(BR_2018)[2] <- "Bedrooms"
names(BR_2018)[3] <- "ID"
names(BR_2018)[4] <- "Lon"
names(BR_2018)[5] <- "Lat"
# 2017
names(BR_2017)[1] <- "Rent"
names(BR_2017)[2] <- "Bedrooms"
names(BR_2017)[3] <- "ID"
names(BR_2017)[4] <- "Lon"
names(BR_2017)[5] <- "Lat"
# 2016
names(BR_2016)[1] <- "Rent"
names(BR_2016)[2] <- "Bedrooms"
names(BR_2016)[3] <- "ID"
names(BR_2016)[4] <- "Lon"
names(BR_2016)[5] <- "Lat"
# 2015
names(BR_2015)[1] <- "Rent"
names(BR_2015)[2] <- "Bedrooms"
names(BR_2015)[3] <- "ID"
names(BR_2015)[4] <- "Lon"
names(BR_2015)[5] <- "Lat"
# 2014
names(BR_2014)[1] <- "Rent"
names(BR_2014)[2] <- "Bedrooms"
names(BR_2014)[3] <- "ID"
names(BR_2014)[4] <- "Lon"
names(BR_2014)[5] <- "Lat"
# 2013
names(BR_2013)[1] <- "Rent"
names(BR_2013)[2] <- "Bedrooms"
names(BR_2013)[3] <- "ID"
names(BR_2013)[4] <- "Lon"
names(BR_2013)[5] <- "Lat"

Merge into one dataframe

Download data.frame

write.csv(BR_2013_2020, "BR_2013_2020.csv")

Distribution of Boston Rent Prices Nominal Prices (2013 - 2020)

rent_value_hist <- ggplot(BR_2013_2019, aes(Rent)) + 
  geom_histogram(fill=palette_1_colors) +
  xlab("Rent Price($)") + ylab("Count") +
  scale_fill_manual(values=palette_1_colors) +
  plotTheme() + 
  labs(x="Rent Price($)", y="Count", title="Distribution of Boston Rent prices",
       subtitle="Nominal prices (2013 - 2020)", 
       caption="Source: Padmapper UI\n@JeffKaufman")
# Plotting it:
rent_value_hist

It seems as though there may be some outliers. We’ll remove anything greater than 2.5 standard deviations from the mean.

check out the distribution of prices for each year using a violin plot

rent_value_violin <- ggplot(BR_13_29, aes(x=Year, y=Rent, fill=Year)) + 
  geom_violin(color = "grey50") +
  xlab("Rent Price($)") + ylab("Count") +
  scale_fill_manual(values=palette_7_colors) +
  stat_summary(fun.y=mean, geom="point", size=2, colour="white") +
  plotTheme() + theme(legend.position="none") +
  scale_y_continuous(labels = comma) +
  labs(x="Year",y="Rent Price($)",title="Distribution of Boston Rent prices",
       subtitle="Nominal prices (2013 - 2019); Rent price means visualized as points",
       caption="Source: Padmapper UI\n@JeffKaufman")
`fun.y` is deprecated. Use `fun` instead.
rent_value_violin

The white circles denote sale price means for each year.

Distribution of Northeastern Rent Prices

# Add Boston Shape file with names of neighborhoods

Boston_neighb <- readOGR("Boston_Neighborhoods",layer = "Boston_Neighborhoods")
bbox <- Boston_neighb@bbox
bos_bbox <- c(left = bbox[1, 1] - .01, bottom = bbox[2, 1] - .005, 
             right = bbox[1, 2] + .01, top = bbox[2, 2] + .005)
basemap <- get_stamenmap(
  bbox = bos_bbox,
  zoom = 12,
  maptype = "toner-lite")
# Map it
bmMap <- ggmap(basemap) + mapTheme() + 
  labs(title="Boston basemap")
bmMap

Distribution of Boston Rent Prices

library(mapproj)
Loading required package: maps

Attaching package: ‘maps’

The following object is masked from ‘package:plyr’:

    ozone

The following object is masked from ‘package:purrr’:

    map
prices_mapped_by_year <- ggmap(basemap) + 
  geom_point(data = BR_13_19, aes(x = Lon, y = Lat, color = Rent), 
             size = .25, alpha = 0.6) +
  facet_wrap(~Year, scales = "fixed", ncol = 4) +
  coord_map() +
  mapTheme() + theme(legend.position = c(.85, .25)) +
  scale_color_gradientn("Rent Price", 
                        colors = palette_8_colors,
                        labels = scales::dollar_format(prefix = "$")) +
  labs(title="Distribution of Boston Rent prices",
       subtitle="Nominal prices (2013 - 2019)",
       caption="Source: Padmapper UI\n@JeffKaufman")
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
prices_mapped_by_year

We’ll stack the two maps and increase the point size

prices_mapped_2013_2019 <- ggmap(basemap) + 
  geom_point(data = subset(BR_13_19, BR_13_19$Year == 2013 | BR_13_19$Year == 2019), 
             aes(x = Lon, y = Lat, color = Rent), 
             size = 1, alpha = 0.75) +
  facet_wrap(~Year, scales = "fixed", ncol = 1) +
  coord_map() +
  mapTheme() +
  scale_color_gradientn("Sale Price", 
                        colors = palette_8_colors,
                        labels = scales::dollar_format(prefix = "$")) +
  labs(title="Distribution of Boston Rent prices",
       subtitle="Nominal prices (2013 & 2019)",
       caption="Source: Padmapper UI\n@JeffKaufman")
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
prices_mapped_2013_2019

Merging Rent Data with Boston Neighbrohood Polygon

Neighborhood—Fenway

Neighborhood—Mission Hill

Neighborhood—Roxbury

Neighborhood—South End

Distribution of Rent prices around Northeastern University

Boston Summarization


Boston_Rents_summarized <- ddply(Boston_Rent_Data, c("Name","Year"), summarise,
                                       medianRent = median(Rent),
                                       rentCount = length(Year),
                                       sdRent = sd(Rent),
                                       minusSd = medianRent - sdRent,
                                       plusSD = medianRent + sdRent,
                                       .progress = "text")

  |                                                                                                             
  |                                                                                                       |   0%
  |                                                                                                             
  |=                                                                                                      |   1%
  |                                                                                                             
  |==                                                                                                     |   2%
  |                                                                                                             
  |===                                                                                                    |   3%
  |                                                                                                             
  |====                                                                                                   |   3%
  |                                                                                                             
  |====                                                                                                   |   4%
  |                                                                                                             
  |=====                                                                                                  |   5%
  |                                                                                                             
  |======                                                                                                 |   6%
  |                                                                                                             
  |=======                                                                                                |   7%
  |                                                                                                             
  |========                                                                                               |   7%
  |                                                                                                             
  |========                                                                                               |   8%
  |                                                                                                             
  |=========                                                                                              |   9%
  |                                                                                                             
  |==========                                                                                             |  10%
  |                                                                                                             
  |===========                                                                                            |  10%
  |                                                                                                             
  |===========                                                                                            |  11%
  |                                                                                                             
  |============                                                                                           |  11%
  |                                                                                                             
  |============                                                                                           |  12%
  |                                                                                                             
  |=============                                                                                          |  13%
  |                                                                                                             
  |==============                                                                                         |  13%
  |                                                                                                             
  |==============                                                                                         |  14%
  |                                                                                                             
  |===============                                                                                        |  14%
  |                                                                                                             
  |===============                                                                                        |  15%
  |                                                                                                             
  |================                                                                                       |  15%
  |                                                                                                             
  |================                                                                                       |  16%
  |                                                                                                             
  |=================                                                                                      |  17%
  |                                                                                                             
  |==================                                                                                     |  17%
  |                                                                                                             
  |==================                                                                                     |  18%
  |                                                                                                             
  |===================                                                                                    |  18%
  |                                                                                                             
  |===================                                                                                    |  19%
  |                                                                                                             
  |====================                                                                                   |  19%
  |                                                                                                             
  |=====================                                                                                  |  20%
  |                                                                                                             
  |=====================                                                                                  |  21%
  |                                                                                                             
  |======================                                                                                 |  21%
  |                                                                                                             
  |======================                                                                                 |  22%
  |                                                                                                             
  |=======================                                                                                |  22%
  |                                                                                                             
  |========================                                                                               |  23%
  |                                                                                                             
  |=========================                                                                              |  24%
  |                                                                                                             
  |=========================                                                                              |  25%
  |                                                                                                             
  |==========================                                                                             |  25%
  |                                                                                                             
  |==========================                                                                             |  26%
  |                                                                                                             
  |===========================                                                                            |  26%
  |                                                                                                             
  |============================                                                                           |  27%
  |                                                                                                             
  |=============================                                                                          |  28%
  |                                                                                                             
  |=============================                                                                          |  29%
  |                                                                                                             
  |==============================                                                                         |  29%
  |                                                                                                             
  |===============================                                                                        |  30%
  |                                                                                                             
  |================================                                                                       |  31%
  |                                                                                                             
  |=================================                                                                      |  32%
  |                                                                                                             
  |==================================                                                                     |  33%
  |                                                                                                             
  |===================================                                                                    |  34%
  |                                                                                                             
  |====================================                                                                   |  35%
  |                                                                                                             
  |=====================================                                                                  |  36%
  |                                                                                                             
  |======================================                                                                 |  37%
  |                                                                                                             
  |=======================================                                                                |  38%
  |                                                                                                             
  |========================================                                                               |  39%
  |                                                                                                             
  |=========================================                                                              |  39%
  |                                                                                                             
  |=========================================                                                              |  40%
  |                                                                                                             
  |==========================================                                                             |  41%
  |                                                                                                             
  |===========================================                                                            |  42%
  |                                                                                                             
  |============================================                                                           |  42%
  |                                                                                                             
  |============================================                                                           |  43%
  |                                                                                                             
  |=============================================                                                          |  43%
  |                                                                                                             
  |=============================================                                                          |  44%
  |                                                                                                             
  |==============================================                                                         |  45%
  |                                                                                                             
  |===============================================                                                        |  46%
  |                                                                                                             
  |================================================                                                       |  46%
  |                                                                                                             
  |================================================                                                       |  47%
  |                                                                                                             
  |=================================================                                                      |  47%
  |                                                                                                             
  |=================================================                                                      |  48%
  |                                                                                                             
  |==================================================                                                     |  49%
  |                                                                                                             
  |===================================================                                                    |  49%
  |                                                                                                             
  |===================================================                                                    |  50%
  |                                                                                                             
  |====================================================                                                   |  50%
  |                                                                                                             
  |====================================================                                                   |  51%
  |                                                                                                             
  |=====================================================                                                  |  51%
  |                                                                                                             
  |======================================================                                                 |  52%
  |                                                                                                             
  |======================================================                                                 |  53%
  |                                                                                                             
  |=======================================================                                                |  53%
  |                                                                                                             
  |=======================================================                                                |  54%
  |                                                                                                             
  |========================================================                                               |  54%
  |                                                                                                             
  |=========================================================                                              |  55%
  |                                                                                                             
  |==========================================================                                             |  56%
  |                                                                                                             
  |==========================================================                                             |  57%
  |                                                                                                             
  |===========================================================                                            |  57%
  |                                                                                                             
  |===========================================================                                            |  58%
  |                                                                                                             
  |============================================================                                           |  58%
  |                                                                                                             
  |=============================================================                                          |  59%
  |                                                                                                             
  |==============================================================                                         |  60%
  |                                                                                                             
  |==============================================================                                         |  61%
  |                                                                                                             
  |===============================================================                                        |  61%
  |                                                                                                             
  |================================================================                                       |  62%
  |                                                                                                             
  |=================================================================                                      |  63%
  |                                                                                                             
  |==================================================================                                     |  64%
  |                                                                                                             
  |===================================================================                                    |  65%
  |                                                                                                             
  |====================================================================                                   |  66%
  |                                                                                                             
  |=====================================================================                                  |  67%
  |                                                                                                             
  |======================================================================                                 |  68%
  |                                                                                                             
  |=======================================================================                                |  69%
  |                                                                                                             
  |========================================================================                               |  70%
  |                                                                                                             
  |=========================================================================                              |  71%
  |                                                                                                             
  |==========================================================================                             |  71%
  |                                                                                                             
  |==========================================================================                             |  72%
  |                                                                                                             
  |===========================================================================                            |  73%
  |                                                                                                             
  |============================================================================                           |  74%
  |                                                                                                             
  |=============================================================================                          |  74%
  |                                                                                                             
  |=============================================================================                          |  75%
  |                                                                                                             
  |==============================================================================                         |  75%
  |                                                                                                             
  |==============================================================================                         |  76%
  |                                                                                                             
  |===============================================================================                        |  77%
  |                                                                                                             
  |================================================================================                       |  78%
  |                                                                                                             
  |=================================================================================                      |  78%
  |                                                                                                             
  |=================================================================================                      |  79%
  |                                                                                                             
  |==================================================================================                     |  79%
  |                                                                                                             
  |==================================================================================                     |  80%
  |                                                                                                             
  |===================================================================================                    |  81%
  |                                                                                                             
  |====================================================================================                   |  81%
  |                                                                                                             
  |====================================================================================                   |  82%
  |                                                                                                             
  |=====================================================================================                  |  82%
  |                                                                                                             
  |=====================================================================================                  |  83%
  |                                                                                                             
  |======================================================================================                 |  83%
  |                                                                                                             
  |=======================================================================================                |  84%
  |                                                                                                             
  |=======================================================================================                |  85%
  |                                                                                                             
  |========================================================================================               |  85%
  |                                                                                                             
  |========================================================================================               |  86%
  |                                                                                                             
  |=========================================================================================              |  86%
  |                                                                                                             
  |=========================================================================================              |  87%
  |                                                                                                             
  |==========================================================================================             |  87%
  |                                                                                                             
  |===========================================================================================            |  88%
  |                                                                                                             
  |===========================================================================================            |  89%
  |                                                                                                             
  |============================================================================================           |  89%
  |                                                                                                             
  |============================================================================================           |  90%
  |                                                                                                             
  |=============================================================================================          |  90%
  |                                                                                                             
  |==============================================================================================         |  91%
  |                                                                                                             
  |===============================================================================================        |  92%
  |                                                                                                             
  |===============================================================================================        |  93%
  |                                                                                                             
  |================================================================================================       |  93%
  |                                                                                                             
  |=================================================================================================      |  94%
  |                                                                                                             
  |==================================================================================================     |  95%
  |                                                                                                             
  |===================================================================================================    |  96%
  |                                                                                                             
  |===================================================================================================    |  97%
  |                                                                                                             
  |====================================================================================================   |  97%
  |                                                                                                             
  |=====================================================================================================  |  98%
  |                                                                                                             
  |====================================================================================================== |  99%
  |                                                                                                             
  |=======================================================================================================| 100%
yearly_rents <- ddply(Boston_Rents_summarized, ~Name, summarise, 
                      avg.yearly.rent = mean(rentCount))

Boston_Rents_summarized <- left_join(Boston_Rents_summarized, yearly_rents, by = "Name")

medByYear <- dcast(Boston_Rents_summarized, Name ~ Year, value.var = "medianRent")
medByYear$pctChange <- (medByYear$`2019` - medByYear$`2013`) / medByYear$`2013`
Boston_Rents_summarized <- left_join(Boston_Rents_summarized, medByYear[,c("Name", "pctChange")], 
                           by = "Name")
Boston_Rents_summarized
neighb.tidy <- tidy(Boston_neighb, region = c('Name'))
Ring Self-intersection at or near point -71.125747340000004 42.27233854SpP is invalid
Invalid objects found; consider using set_RGEOS_CheckValidity(2L)Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector
neighb.tidy$Name <- neighb.tidy$id
Boston_Rents_summarized <- join(Boston_Rents_summarized, neighb.tidy, by = "Name", match = "all")
Boston_Rents_summarized
NA

Northeastern Summeraization

Median Rent Price by Northeastern Neighborhood

neighb_map <- ggmap(basemap) +
  geom_polygon(data = Northeastern_Rents_summarized_tidy, 
               aes(x = long, y = lat, group = group, fill = medianRent), 
               colour = "white", alpha = 0.75, size = 0.25) + 
  scale_fill_gradientn("Neighborhood \nMedian \nRent Price", 
                       colors = palette_8_colors,
                       labels = scales::dollar_format(prefix = "$")) +
  mapTheme() + theme(legend.position = c(.85, .25)) + coord_map() +
  facet_wrap(~Year, nrow = 2) +
  labs(title="Median rent price by neighborhood, Northeastern ",
       subtitle="Nominal prices (2013 - 2019)",
       caption="Source: Padmapper UI\n@JeffKaufman")
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
neighb_map

Percent Change in Rent

Time Sereis Plots

Boston_Rents_summarized
# Lets look at the top 8 most appreciating neighborhoods.
topPctChange <- unique(Boston_Rents_summarized$pctChange) %>% sort(decreasing = TRUE) %>% head(8)
 
# Well use these percentages to subset our neighborhoods data frame
bosForTimeSeries <- Boston_Rents_summarized[which(Boston_Rents_summarized$pctChange %in% topPctChange), ] 

time.series <- ggplot(bosForTimeSeries, aes(x = Year, group=Name)) +
  geom_line(aes(y = medianRent)) +
  geom_ribbon(aes(ymin = minusSd, ymax = plusSD, fill = Name), alpha = 0.75) +
  facet_wrap(~Name, scales = "fixed", nrow = 4) +
  scale_y_continuous(labels = scales::dollar_format(prefix = "$")) +
  ylab("Neighborhood median rent price") + xlab(NULL) +
  plotTheme() +
  theme(
    legend.position = "none",
    panel.spacing.y = unit(1, "lines")
  ) +
  scale_fill_manual(values=palette_8_colors) +
  labs(title="Time series for highest growth neighborhoods, Boston",
       subtitle="Nominal prices (2013-2019); Median; Ribbon indicates 1 standard deviation",
       caption="Source:")
time.series

LS0tCnRpdGxlOiAiQm9zdG9uIFJlbnQgRGF0YSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKbGlicmFyeQpgYGB7cn0KbGlicmFyeShhY3MpICMgYWNjZXNzIGFjcyBzdXJ2ZXkgZGF0YQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBkYXRhIG1hbnVwbGlhdGlvbgpsaWJyYXJ5KHRpZHljZW5zdXMpICMgYWNjZXNzIGNlbnN1cyBkYXRhCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ21hcCkKbGlicmFyeShtYXB0b29scykKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShyZ2VvcykKbGlicmFyeShicm9vbSkKbGlicmFyeShkcGx5cikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeSh0aWdyaXMpCmxpYnJhcnkoc2YpCmxpYnJhcnkocmdkYWwpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShzcCkKbGlicmFyeShkZXZ0b29scykKbGlicmFyeShjZW5zdXNhcGkpCmxpYnJhcnkoWE1MKQpsaWJyYXJ5KFJDdXJsKQpsaWJyYXJ5KG1hcHByb2opCnJlZ2lzdGVyX2dvb2dsZShrZXkgPSAiQUl6YVN5QTJzc09EU0RLQkFYZTVNT2d4ejZyTF9KZm5ON0pUWDMwIikKYGBgCgoKYGBge3J9CiMgTmV4dCwgd2XigJlyZSBnb2luZyB0byBkZWZpbmUgdHdvIHRoZW1lcyB0aGF0IHdpbGwgdGVsbCBnZ3Bsb3QgaG93IHRvIGNvbnN0cnVjdCBib3RoIG1hcHMgYW5kIHBsb3RzLiBEZWZpbmluZyBvdXIgdGhlbWVzIHVwIGZyb250IGVuc3VyZXMgdGhhdCB3ZSBkb27igJl0IGhhdmUgdG8gcmVwZWF0IHRoaXMgY29kZSBvdmVyIGFuZCBhZ2FpbiBmb3IgZXZlcnkgcGxvdCB3ZSBnZW5lcmF0ZSBiZWxvdwoKcGxvdFRoZW1lIDwtIGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDEyKSB7CiAgdGhlbWUoCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KCBjb2xvciA9ICJibGFjayIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsY29sb3VyID0gImJsYWNrIiksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9Iml0YWxpYyIpLAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0PTApLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKCJncmV5ODAiLCBzaXplID0gMC4xKSwKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JleTgwIiwgY29sb3IgPSAid2hpdGUiKSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT04KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdD0xKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChoanVzdD0xKSwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIGZhY2UgPSAiaXRhbGljIiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBmYWNlID0gIml0YWxpYyIpKQp9CiAKIyBBbmQgYW5vdGhlciB0aGF0IHdlIHdpbGwgdXNlIGZvciBtYXBzCm1hcFRoZW1lIDwtIGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDEyKSB7CiAgdGhlbWUoCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KCBjb2xvciA9ICJibGFjayIpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsY29sb3VyID0gImJsYWNrIiksCiAgICBwbG90LnN1YnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJpdGFsaWMiKSwKICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3Q9MCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoImdyZXk4MCIsIHNpemUgPSAwLjEpLAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyZXk4MCIsIGNvbG9yID0gIndoaXRlIiksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBmYWNlID0gIml0YWxpYyIpLAogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgZmFjZSA9ICJpdGFsaWMiKSkKfQogCiMgRGVmaW5lIHNvbWUgcGFsZXR0ZXMKcGFsZXR0ZV85X2NvbG9ycyA8LSBjKCIjMERBM0EwIiwiIzI5OTlBOSIsIiM0NThGQjIiLCIjNjI4NUJCIiwiIzdFN0NDNCIsIiM5QTcyQ0QiLCIjQjc2OEQ2IiwiI0QzNUVERiIsIiNGMDU1RTkiKQpwYWxldHRlXzhfY29sb3JzIDwtIGMoIiMwREEzQTAiLCIjMkQ5N0FBIiwiIzREOENCNCIsIiM2RTgxQkYiLCIjOEU3NkM5IiwiI0FGNkJENCIsIiNDRjYwREUiLCIjRjA1NUU5IikKcGFsZXR0ZV83X2NvbG9ycyA8LSBjKCIjMkQ5N0FBIiwiIzREOENCNCIsIiM2RTgxQkYiLCIjOEU3NkM5IiwiI0FGNkJENCIsIiNDRjYwREUiLCIjRjA1NUU5IikKcGFsZXR0ZV8xX2NvbG9ycyA8LSBjKCIjMERBM0EwIikKCmBgYAoKR2V0IEJvc3RvbiBSZW50YWwgRGF0YSBhcyBhIHRhYmxlIGRhdGFmcmFtZQpgYGB7cn0KQlJfMl8xOF8yMDEzIDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTM2MTE4ODkyMS50eHQiKQpCUl8zXzE4XzIwMTMgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xMzYzNjA0NTIxLnR4dCIpCkJSXzRfMThfMjAxMyA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTEzNjYyODI5MjIudHh0IikKQlJfNV8xOF8yMDEzIDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTM2ODg3NDkyMi50eHQiKQpCUl82XzE4XzIwMTMgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xMzcxNTUzMzIxLnR4dCIpCkJSXzdfMThfMjAxMyA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTEzNzQxNDUzMjIudHh0IikKQlJfOF8xOF8yMDEzIDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTM3NjgyMzcyMS50eHQiKQpCUl85XzE4XzIwMTMgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xMzc5NTAyMTIyLnR4dCIpCkJSXzEwXzE4XzIwMTMgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xMzgyMDk0MTIyLnR4dCIpCkJSXzExXzE4XzIwMTMgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xMzg0Nzc2MTIyLnR4dCIpCkJSXzExXzIxXzIwMTMgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xMzg1MDI0NDMxLnR4dCIpCkJSXzEyXzE4XzIwMTMgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xMzg3MzY4MTIyLnR4dCIpCkJSXzFfMThfMjAxNCA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTEzOTAwNDY1MjIudHh0IikKQlJfMl8xOF8yMDE0IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTM5MjcyNDkyMi50eHQiKQpCUl8zXzE4XzIwMTQgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xMzk1MTQwNTIyLnR4dCIpCkJSXzRfMThfMjAxNCA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTEzOTc4MTg5MjIudHh0IikKQlJfNV8xOF8yMDE0IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQwMDQxMDkyMi50eHQiKQpCUl82XzE4XzIwMTQgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDAzMDg5MzIxLnR4dCIpCkJSXzdfMThfMjAxNCA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0MDU2ODEzMjEudHh0IikKQlJfOF8xOF8yMDE0IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQwODM1OTcyMi50eHQiKQpCUl85XzE4XzIwMTQgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDExMDM4MTIxLnR4dCIpCkJSXzEwXzE4XzIwMTQgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDEzNTk3NzIyLnR4dCIpCkJSXzExXzE4XzIwMTQgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDE2Mjc2MTIxLnR4dCIpCkJSXzEyXzE4XzIwMTQgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDE4ODY4MTIyLnR4dCIpCkJSXzFfMThfMjAxNSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0MjE1NDY1MjMudHh0IikKQlJfMl8xOF8yMDE1IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQyNDIyNDkyMi50eHQiKQpCUl8zXzE4XzIwMTUgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDI2NjQ0MTIyLnR4dCIpCkJSXzRfMThfMjAxNSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0MjkzMjI1MjIudHh0IikKQlJfNV8xOF8yMDE1IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQzMTkxNDUyMi50eHQiKQpCUl82XzE4XzIwMTUgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDM0NTkyOTIxLnR4dCIpCkJSXzdfMThfMjAxNSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0MzcxODQ5MjIudHh0IikKQlJfOF8xOF8yMDE1IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQzOTg2MzMyMi50eHQiKQpCUl85XzE4XzIwMTUgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDQyNTQxNzIyLnR4dCIpCkJSXzEwXzE4XzIwMTUgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDQ1MTMzNzIzLnR4dCIpCkJSXzExXzE4XzIwMTUgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDQ3ODEyMTIzLnR4dCIpCkJSXzEyXzE4XzIwMTUgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDUwNDA0MTIyLnR4dCIpCkJSXzFfMThfMjAxNiA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0NTMwODI1MjIudHh0IikKQlJfMl8xOF8yMDE2IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQ1NTc2MDkyMi50eHQiKQpCUl8zXzE4XzIwMTYgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDU4MjY2NTIxLnR4dCIpCkJSXzRfMThfMjAxNiA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0NjA5NDQ5MjMudHh0IikKQlJfNV8xOF8yMDE2IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQ2MzUzNjkyMi50eHQiKQpCUl82XzE4XzIwMTYgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDY2MjE1MzIzLnR4dCIpCkJSXzdfMThfMjAxNiA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0Njg4MDczMjIudHh0IikKQlJfOF8xOF8yMDE2IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQ3MTQ4NTcyMi50eHQiKQpCUl85XzE4XzIwMTYgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDc0MTY0MTIxLnR4dCIpCkJSXzEwXzI4XzIwMTYgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDc3NjYyNzU3LnR4dCIpCkJSXzExXzE4XzIwMTYgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDc5NDc3MzcwLnR4dCIpCkJSXzEyXzE5XzIwMTYgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDgyMTU1MzI1LnR4dCIpCkJSXzFfMThfMjAxNyA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0ODQ3NDMwNDIudHh0IikKQlJfMl8xOV8yMDE3IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQ4NzUxMTI1Mi50eHQiKQpCUl8zXzE5XzIwMTcgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDg5OTUxNTQ4LnR4dCIpCkJSXzRfMThfMjAxNyA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE0OTI1MjgwNTEudHh0IikKQlJfNV8xOF8yMDE3IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTQ5NTEyODU2NS50eHQiKQpCUl82XzE4XzIwMTcgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNDk3Nzg1NDM2LnR4dCIpCkJSXzdfMThfMjAxNyA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1MDAzODk5NTEudHh0IikKQlJfOF8xOF8yMDE3IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTUwMzA1NjUwMS50eHQiKQpCUl85XzE5XzIwMTcgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTA1ODMwNDQ4LnR4dCIpCkJSXzEwXzE4XzIwMTcgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTA4MzQ3NDM3LnR4dCIpCkJSXzExXzE4XzIwMTcgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTExMDI1NzE4LnR4dCIpCkJSXzEyXzE4XzIwMTcgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTEzNjA3NTMzLnR4dCIpCkJSXzFfMThfMjAxOCA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1MTYyODAwNTMudHh0IikKQlJfMl8yMV8yMDE4IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTUxOTE3MzE4NC50eHQiKQpCUl8zXzE4XzIwMTggPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTIxMzkyMTU2LnR4dCIpCkJSXzRfMThfMjAxOCA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1MjQwNTYzODMudHh0IikKQlJfNF8xOF8yMDE4IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTUyNDA1OTk3NC50eHQiKQpCUl81XzE4XzIwMTggPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTI2NjYzNzQ1LnR4dCIpCkJSXzdfMThfMjAxOCA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1MzE5NDI2NzcudHh0IikKQlJfOF8xOF8yMDE4IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTUzNDU5NDc2MS50eHQiKQpCUl85XzE4XzIwMTggPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTM3MjY5Njk1LnR4dCIpCkJSXzEwXzE4XzIwMTggPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTM5ODk1MDYyLnR4dCIpCkJSXzExXzE5XzIwMTggPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTQyNjM3MzgyLnR4dCIpCkJSXzEyXzE4XzIwMTggPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTQ1MTUxODg4LnR4dCIpCkJSXzFfMjdfMjAxOSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1NDg2MDA4MzEudHh0IikKQlJfMl8xOF8yMDE5IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTU1MDUxOTUxNC50eHQiKQpCUl8zXzE4XzIwMTkgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTUyOTE2MTYzLnR4dCIpCkJSXzRfMThfMjAxOSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1NTU1OTM3ODAudHh0IikKQlJfNV8yMF8yMDE5IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTU1ODM2NDU3Mi50eHQiKQpCUl82XzE4XzIwMTkgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTYwODc1OTkwLnR4dCIpCkJSXzhfM18yMDE5IDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTU2NDgzNjQ3OC50eHQiKQpCUl84XzE4XzIwMTkgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTY2MTU4ODEzLnR4dCIpCkJSXzlfMThfMjAxOSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1Njg4Mjc5ODQudHh0IikKQlJfMTBfMjBfMjAxOSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1NzE1MzI2NjYudHh0IikKQlJfMTFfMThfMjAxOSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1NzQwOTIzNjUudHh0IikKQlJfMTJfMThfMjAxOSA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1NzY2ODczNDkudHh0IikKQlJfMV8xOF8yMDIwIDwtcmVhZC50YWJsZSgiaHR0cHM6Ly93d3cuamVmZnRrLmNvbS9hcGFydG1lbnRfcHJpY2VzL2FwdHMtMTU3OTM4OTIyNS50eHQiKQpCUl8yXzE4XzIwMjAgPC1yZWFkLnRhYmxlKCJodHRwczovL3d3dy5qZWZmdGsuY29tL2FwYXJ0bWVudF9wcmljZXMvYXB0cy0xNTgyMDM5NjY5LnR4dCIpCkJSXzNfMjBfMjAyMCA8LXJlYWQudGFibGUoImh0dHBzOi8vd3d3LmplZmZ0ay5jb20vYXBhcnRtZW50X3ByaWNlcy9hcHRzLTE1ODQ3MDgzODMudHh0IikKYGBgCgpBZGQgWWVhcgpgYGB7cn0KQlJfMl8xOF8yMDEzJFllYXIgPC0iMjAxMyIKQlJfM18xOF8yMDEzJFllYXIgPC0iMjAxMyIKQlJfNF8xOF8yMDEzJFllYXIgPC0iMjAxMyIKQlJfNV8xOF8yMDEzJFllYXIgPC0iMjAxMyIKQlJfNl8xOF8yMDEzJFllYXIgPC0iMjAxMyIKQlJfN18xOF8yMDEzJFllYXIgPC0iMjAxMyIKQlJfOF8xOF8yMDEzJFllYXIgPC0iMjAxMyIKQlJfOV8xOF8yMDEzJFllYXIgPC0iMjAxMyIKQlJfMTBfMThfMjAxMyRZZWFyIDwtIjIwMTMiCkJSXzExXzE4XzIwMTMkWWVhciA8LSIyMDEzIgpCUl8xMV8yMV8yMDEzJFllYXIgPC0iMjAxMyIKQlJfMTJfMThfMjAxMyRZZWFyIDwtIjIwMTMiCkJSXzFfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzJfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzNfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzRfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzVfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzZfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzdfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzhfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzlfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzEwXzE4XzIwMTQkWWVhciA8LSIyMDE0IgpCUl8xMV8xOF8yMDE0JFllYXIgPC0iMjAxNCIKQlJfMTJfMThfMjAxNCRZZWFyIDwtIjIwMTQiCkJSXzFfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzJfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzNfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzRfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzVfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzZfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzdfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzhfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzlfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzEwXzE4XzIwMTUkWWVhciA8LSIyMDE1IgpCUl8xMV8xOF8yMDE1JFllYXIgPC0iMjAxNSIKQlJfMTJfMThfMjAxNSRZZWFyIDwtIjIwMTUiCkJSXzFfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzJfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzNfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzRfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzVfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzZfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzdfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzhfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzlfMThfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzEwXzI4XzIwMTYkWWVhciA8LSIyMDE2IgpCUl8xMV8xOF8yMDE2JFllYXIgPC0iMjAxNiIKQlJfMTJfMTlfMjAxNiRZZWFyIDwtIjIwMTYiCkJSXzFfMThfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzJfMTlfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzNfMTlfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzRfMThfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzVfMThfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzZfMThfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzdfMThfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzhfMThfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzlfMTlfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzEwXzE4XzIwMTckWWVhciA8LSIyMDE3IgpCUl8xMV8xOF8yMDE3JFllYXIgPC0iMjAxNyIKQlJfMTJfMThfMjAxNyRZZWFyIDwtIjIwMTciCkJSXzFfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzJfMjFfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzNfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzRfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzRfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzVfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzdfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzhfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzlfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzEwXzE4XzIwMTgkWWVhciA8LSIyMDE4IgpCUl8xMV8xOV8yMDE4JFllYXIgPC0iMjAxOCIKQlJfMTJfMThfMjAxOCRZZWFyIDwtIjIwMTgiCkJSXzFfMjdfMjAxOSRZZWFyIDwtIjIwMTkiCkJSXzJfMThfMjAxOSRZZWFyIDwtIjIwMTkiCkJSXzNfMThfMjAxOSRZZWFyIDwtIjIwMTkiCkJSXzRfMThfMjAxOSRZZWFyIDwtIjIwMTkiCkJSXzVfMjBfMjAxOSRZZWFyIDwtIjIwMTkiCkJSXzZfMThfMjAxOSRZZWFyIDwtIjIwMTkiCkJSXzhfM18yMDE5JFllYXIgPC0iMjAxOSIKQlJfOF8xOF8yMDE5JFllYXIgPC0iMjAxOSIKQlJfOV8xOF8yMDE5JFllYXIgPC0iMjAxOSIKQlJfMTBfMjBfMjAxOSRZZWFyIDwtIjIwMTkiCkJSXzExXzE4XzIwMTkkWWVhciA8LSIyMDE5IgpCUl8xMl8xOF8yMDE5JFllYXIgPC0iMjAxOSIKQlJfMV8xOF8yMDIwJFllYXIgPC0iMjAyMCIKQlJfMl8xOF8yMDIwJFllYXIgPC0iMjAyMCIKQlJfM18yMF8yMDIwJFllYXIgPC0iMjAyMCIKYGBgCgpBZGQgTW9udGgKYGBge3J9CkJSXzJfMThfMjAxMyRNb250aCA8LSJGZWIiCkJSXzNfMThfMjAxMyRNb250aCA8LSJNYXIiCkJSXzRfMThfMjAxMyRNb250aCA8LSJBcHIiCkJSXzVfMThfMjAxMyRNb250aCA8LSJNYXkiCkJSXzZfMThfMjAxMyRNb250aCA8LSJKdW4iCkJSXzdfMThfMjAxMyRNb250aCA8LSJKdWwiCkJSXzhfMThfMjAxMyRNb250aCA8LSJBdWciCkJSXzlfMThfMjAxMyRNb250aCA8LSJTZXAiCkJSXzEwXzE4XzIwMTMkTW9udGggPC0iT2N0IgpCUl8xMV8xOF8yMDEzJE1vbnRoIDwtIk5vdiIKQlJfMTFfMjFfMjAxMyRNb250aCA8LSJOb3YiCkJSXzEyXzE4XzIwMTMkTW9udGggPC0iRGVjIgpCUl8xXzE4XzIwMTQkTW9udGggPC0iSmFuIgpCUl8yXzE4XzIwMTQkTW9udGggPC0iRmViIgpCUl8zXzE4XzIwMTQkTW9udGggPC0iTWFyIgpCUl80XzE4XzIwMTQkTW9udGggPC0iQXByIgpCUl81XzE4XzIwMTQkTW9udGggPC0iTWF5IgpCUl82XzE4XzIwMTQkTW9udGggPC0iSnVuIgpCUl83XzE4XzIwMTQkTW9udGggPC0iSnVsIgpCUl84XzE4XzIwMTQkTW9udGggPC0iQXVnIgpCUl85XzE4XzIwMTQkTW9udGggPC0iU2VwIgpCUl8xMF8xOF8yMDE0JE1vbnRoIDwtIk9jdCIKQlJfMTFfMThfMjAxNCRNb250aCA8LSJOb3YiCkJSXzEyXzE4XzIwMTQkTW9udGggPC0iRGVjIgpCUl8xXzE4XzIwMTUkTW9udGggPC0iSmFuIgpCUl8yXzE4XzIwMTUkTW9udGggPC0iRmViIgpCUl8zXzE4XzIwMTUkTW9udGggPC0iTWFyIgpCUl80XzE4XzIwMTUkTW9udGggPC0iQXByIgpCUl81XzE4XzIwMTUkTW9udGggPC0iTWF5IgpCUl82XzE4XzIwMTUkTW9udGggPC0iSnVuIgpCUl83XzE4XzIwMTUkTW9udGggPC0iSnVsIgpCUl84XzE4XzIwMTUkTW9udGggPC0iQXVnIgpCUl85XzE4XzIwMTUkTW9udGggPC0iU2VwIgpCUl8xMF8xOF8yMDE1JE1vbnRoIDwtIk9jdCIKQlJfMTFfMThfMjAxNSRNb250aCA8LSJOb3YiCkJSXzEyXzE4XzIwMTUkTW9udGggPC0iRGVjIgpCUl8xXzE4XzIwMTYkTW9udGggPC0iSmFuIgpCUl8yXzE4XzIwMTYkTW9udGggPC0iRmViIgpCUl8zXzE4XzIwMTYkTW9udGggPC0iTWFyIgpCUl80XzE4XzIwMTYkTW9udGggPC0iQXByIgpCUl81XzE4XzIwMTYkTW9udGggPC0iTWF5IgpCUl82XzE4XzIwMTYkTW9udGggPC0iSnVuIgpCUl83XzE4XzIwMTYkTW9udGggPC0iSnVsIgpCUl84XzE4XzIwMTYkTW9udGggPC0iQXVnIgpCUl85XzE4XzIwMTYkTW9udGggPC0iU2VwIgpCUl8xMF8yOF8yMDE2JE1vbnRoIDwtIk9jdCIKQlJfMTFfMThfMjAxNiRNb250aCA8LSJOb3YiCkJSXzEyXzE5XzIwMTYkTW9udGggPC0iRGVjIgpCUl8xXzE4XzIwMTckTW9udGggPC0iSmFuIgpCUl8yXzE5XzIwMTckTW9udGggPC0iRmViIgpCUl8zXzE5XzIwMTckTW9udGggPC0iTWFyIgpCUl80XzE4XzIwMTckTW9udGggPC0iQXByIgpCUl81XzE4XzIwMTckTW9udGggPC0iTWF5IgpCUl82XzE4XzIwMTckTW9udGggPC0iSnVuIgpCUl83XzE4XzIwMTckTW9udGggPC0iSnVsIgpCUl84XzE4XzIwMTckTW9udGggPC0iQXVnIgpCUl85XzE5XzIwMTckTW9udGggPC0iU2VwIgpCUl8xMF8xOF8yMDE3JE1vbnRoIDwtIk9jdCIKQlJfMTFfMThfMjAxNyRNb250aCA8LSJOb3YiCkJSXzEyXzE4XzIwMTckTW9udGggPC0iRGVjIgpCUl8xXzE4XzIwMTgkTW9udGggPC0iSmFuIgpCUl8yXzIxXzIwMTgkTW9udGggPC0iRmViIgpCUl8zXzE4XzIwMTgkTW9udGggPC0iTWFyIgpCUl80XzE4XzIwMTgkTW9udGggPC0iQXByIgpCUl80XzE4XzIwMTgkTW9udGggPC0iQXByIgpCUl81XzE4XzIwMTgkTW9udGggPC0iTWF5IgpCUl83XzE4XzIwMTgkTW9udGggPC0iSnVsIgpCUl84XzE4XzIwMTgkTW9udGggPC0iQXVnIgpCUl85XzE4XzIwMTgkTW9udGggPC0iU2VwIgpCUl8xMF8xOF8yMDE4JE1vbnRoIDwtIk9jdCIKQlJfMTFfMTlfMjAxOCRNb250aCA8LSJOb3YiCkJSXzEyXzE4XzIwMTgkTW9udGggPC0iRGVjIgpCUl8xXzI3XzIwMTkkTW9udGggPC0iSmFuIgpCUl8yXzE4XzIwMTkkTW9udGggPC0iRmViIgpCUl8zXzE4XzIwMTkkTW9udGggPC0iTWFyIgpCUl80XzE4XzIwMTkkTW9udGggPC0iQXByIgpCUl81XzIwXzIwMTkkTW9udGggPC0iTWF5IgpCUl82XzE4XzIwMTkkTW9udGggPC0iSnVuIgpCUl84XzNfMjAxOSRNb250aCA8LSJBdWciCkJSXzhfMThfMjAxOSRNb250aCA8LSJBdWciCkJSXzlfMThfMjAxOSRNb250aCA8LSJTZXAiCkJSXzEwXzIwXzIwMTkkTW9udGggPC0iT2N0IgpCUl8xMV8xOF8yMDE5JE1vbnRoIDwtIk5vdiIKQlJfMTJfMThfMjAxOSRNb250aCA8LSJEZWMiCkJSXzFfMThfMjAyMCRNb250aCA8LSJKYW4iCkJSXzJfMThfMjAyMCRNb250aCA8LSJGZWIiCkJSXzNfMjBfMjAyMCRNb250aCA8LSJNYXIiCmBgYAoKTWVyZ2UgYnkgWWVhcgpgYGB7cn0KIyAyMDEzCkJSXzIwMTMgPC0gcmJpbmQoQlJfMl8xOF8yMDEzLApCUl8zXzE4XzIwMTMsCkJSXzRfMThfMjAxMywKQlJfNV8xOF8yMDEzLApCUl82XzE4XzIwMTMsCkJSXzdfMThfMjAxMywKQlJfOF8xOF8yMDEzLApCUl85XzE4XzIwMTMsCkJSXzEwXzE4XzIwMTMsCkJSXzExXzE4XzIwMTMsCkJSXzExXzIxXzIwMTMsCkJSXzEyXzE4XzIwMTMpCiMgMjAxNApCUl8yMDE0IDwtIHJiaW5kKEJSXzFfMThfMjAxNCwKQlJfMl8xOF8yMDE0LApCUl8zXzE4XzIwMTQsCkJSXzRfMThfMjAxNCwKQlJfNV8xOF8yMDE0LApCUl82XzE4XzIwMTQsCkJSXzdfMThfMjAxNCwKQlJfOF8xOF8yMDE0LApCUl85XzE4XzIwMTQsCkJSXzEwXzE4XzIwMTQsCkJSXzExXzE4XzIwMTQsCkJSXzEyXzE4XzIwMTQpCiMgMjAxNQpCUl8yMDE1IDwtIHJiaW5kKEJSXzFfMThfMjAxNSwKQlJfMl8xOF8yMDE1LApCUl8zXzE4XzIwMTUsCkJSXzRfMThfMjAxNSwKQlJfNV8xOF8yMDE1LApCUl82XzE4XzIwMTUsCkJSXzdfMThfMjAxNSwKQlJfOF8xOF8yMDE1LApCUl85XzE4XzIwMTUsCkJSXzEwXzE4XzIwMTUsCkJSXzExXzE4XzIwMTUsCkJSXzEyXzE4XzIwMTUpCiMgMjAxNiAgCkJSXzIwMTYgPC0gcmJpbmQoQlJfMV8xOF8yMDE2LApCUl8yXzE4XzIwMTYsCkJSXzNfMThfMjAxNiwKQlJfNF8xOF8yMDE2LApCUl81XzE4XzIwMTYsCkJSXzZfMThfMjAxNiwKQlJfN18xOF8yMDE2LApCUl84XzE4XzIwMTYsCkJSXzlfMThfMjAxNiwKQlJfMTBfMjhfMjAxNiwKQlJfMTFfMThfMjAxNiwKQlJfMTJfMTlfMjAxNikKIyAyMDE3CkJSXzIwMTcgPC0gcmJpbmQoQlJfMV8xOF8yMDE3LApCUl8yXzE5XzIwMTcsCkJSXzNfMTlfMjAxNywKQlJfNF8xOF8yMDE3LApCUl81XzE4XzIwMTcsCkJSXzZfMThfMjAxNywKQlJfN18xOF8yMDE3LApCUl84XzE4XzIwMTcsCkJSXzlfMTlfMjAxNywKQlJfMTBfMThfMjAxNywKQlJfMTFfMThfMjAxNywKQlJfMTJfMThfMjAxNykKIyAyMDE4CkJSXzIwMTggPC0gcmJpbmQoQlJfMV8xOF8yMDE4LApCUl8yXzIxXzIwMTgsCkJSXzNfMThfMjAxOCwKQlJfNF8xOF8yMDE4LApCUl80XzE4XzIwMTgsCkJSXzVfMThfMjAxOCwKQlJfN18xOF8yMDE4LApCUl84XzE4XzIwMTgsCkJSXzlfMThfMjAxOCwKQlJfMTBfMThfMjAxOCwKQlJfMTFfMTlfMjAxOCwKQlJfMTJfMThfMjAxOCkKIyAyMDE5CkJSXzIwMTkgPC0gcmJpbmQoQlJfMV8yN18yMDE5LApCUl8yXzE4XzIwMTksCkJSXzNfMThfMjAxOSwKQlJfNF8xOF8yMDE5LApCUl81XzIwXzIwMTksCkJSXzZfMThfMjAxOSwKQlJfOF8zXzIwMTksCkJSXzhfMThfMjAxOSwKQlJfOV8xOF8yMDE5LApCUl8xMF8yMF8yMDE5LApCUl8xMV8xOF8yMDE5LApCUl8xMl8xOF8yMDE5KQojIDIwMjAKQlJfMjAyMCA8LSByYmluZChCUl8xXzE4XzIwMjAsCkJSXzJfMThfMjAyMCwKQlJfM18yMF8yMDIwKQpgYGAKClVwZGF0ZSBDb2x1bW4gTmFtZXMKYGBge3J9CiMgMjAyMApuYW1lcyhCUl8yMDIwKVsxXSA8LSAiUmVudCIKbmFtZXMoQlJfMjAyMClbMl0gPC0gIkJlZHJvb21zIgpuYW1lcyhCUl8yMDIwKVszXSA8LSAiSUQiCm5hbWVzKEJSXzIwMjApWzRdIDwtICJMb24iCm5hbWVzKEJSXzIwMjApWzVdIDwtICJMYXQiCiMgMjAxOQpuYW1lcyhCUl8yMDE5KVsxXSA8LSAiUmVudCIKbmFtZXMoQlJfMjAxOSlbMl0gPC0gIkJlZHJvb21zIgpuYW1lcyhCUl8yMDE5KVszXSA8LSAiSUQiCm5hbWVzKEJSXzIwMTkpWzRdIDwtICJMb24iCm5hbWVzKEJSXzIwMTkpWzVdIDwtICJMYXQiCiMgMjAxOApuYW1lcyhCUl8yMDE4KVsxXSA8LSAiUmVudCIKbmFtZXMoQlJfMjAxOClbMl0gPC0gIkJlZHJvb21zIgpuYW1lcyhCUl8yMDE4KVszXSA8LSAiSUQiCm5hbWVzKEJSXzIwMTgpWzRdIDwtICJMb24iCm5hbWVzKEJSXzIwMTgpWzVdIDwtICJMYXQiCiMgMjAxNwpuYW1lcyhCUl8yMDE3KVsxXSA8LSAiUmVudCIKbmFtZXMoQlJfMjAxNylbMl0gPC0gIkJlZHJvb21zIgpuYW1lcyhCUl8yMDE3KVszXSA8LSAiSUQiCm5hbWVzKEJSXzIwMTcpWzRdIDwtICJMb24iCm5hbWVzKEJSXzIwMTcpWzVdIDwtICJMYXQiCiMgMjAxNgpuYW1lcyhCUl8yMDE2KVsxXSA8LSAiUmVudCIKbmFtZXMoQlJfMjAxNilbMl0gPC0gIkJlZHJvb21zIgpuYW1lcyhCUl8yMDE2KVszXSA8LSAiSUQiCm5hbWVzKEJSXzIwMTYpWzRdIDwtICJMb24iCm5hbWVzKEJSXzIwMTYpWzVdIDwtICJMYXQiCiMgMjAxNQpuYW1lcyhCUl8yMDE1KVsxXSA8LSAiUmVudCIKbmFtZXMoQlJfMjAxNSlbMl0gPC0gIkJlZHJvb21zIgpuYW1lcyhCUl8yMDE1KVszXSA8LSAiSUQiCm5hbWVzKEJSXzIwMTUpWzRdIDwtICJMb24iCm5hbWVzKEJSXzIwMTUpWzVdIDwtICJMYXQiCiMgMjAxNApuYW1lcyhCUl8yMDE0KVsxXSA8LSAiUmVudCIKbmFtZXMoQlJfMjAxNClbMl0gPC0gIkJlZHJvb21zIgpuYW1lcyhCUl8yMDE0KVszXSA8LSAiSUQiCm5hbWVzKEJSXzIwMTQpWzRdIDwtICJMb24iCm5hbWVzKEJSXzIwMTQpWzVdIDwtICJMYXQiCiMgMjAxMwpuYW1lcyhCUl8yMDEzKVsxXSA8LSAiUmVudCIKbmFtZXMoQlJfMjAxMylbMl0gPC0gIkJlZHJvb21zIgpuYW1lcyhCUl8yMDEzKVszXSA8LSAiSUQiCm5hbWVzKEJSXzIwMTMpWzRdIDwtICJMb24iCm5hbWVzKEJSXzIwMTMpWzVdIDwtICJMYXQiCmBgYAoKTWVyZ2UgaW50byBvbmUgZGF0YWZyYW1lCmBgYHtyfQojIEluY2x1ZCB0aGUgMyBtb250aHMgb2YgMjAyMApCUl8yMDEzXzIwMjAgPC0gcmJpbmQoQlJfMjAxMyxCUl8yMDE0LEJSXzIwMTUsQlJfMjAxNixCUl8yMDE3LEJSXzIwMTgsQlJfMjAxOSxCUl8yMDIwKQpCUl8yMDEzXzIwMjAKCiMgRm9yIHRoZSBkYXRhc2V0IHdlIHdpbGwgb25seSB1c2UgMjAxMy0yMDE5IGJlY2F1c2UgdGhleSBhcmUgY29tcGxldGUgeWVhcnMgCkJSXzIwMTNfMjAxOSA8LSByYmluZChCUl8yMDEzLEJSXzIwMTQsQlJfMjAxNSxCUl8yMDE2LEJSXzIwMTcsQlJfMjAxOCxCUl8yMDE5KQpgYGAKCkRvd25sb2FkIGRhdGEuZnJhbWUKYGBge3J9CndyaXRlLmNzdihCUl8yMDEzXzIwMjAsICJCUl8yMDEzXzIwMjAuY3N2IikKYGBgCgpEaXN0cmlidXRpb24gb2YgQm9zdG9uIFJlbnQgUHJpY2VzCk5vbWluYWwgUHJpY2VzICgyMDEzIC0gMjAyMCkKCmBgYHtyfQpyZW50X3ZhbHVlX2hpc3QgPC0gZ2dwbG90KEJSXzIwMTNfMjAxOSwgYWVzKFJlbnQpKSArIAogIGdlb21faGlzdG9ncmFtKGZpbGw9cGFsZXR0ZV8xX2NvbG9ycykgKwogIHhsYWIoIlJlbnQgUHJpY2UoJCkiKSArIHlsYWIoIkNvdW50IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWxldHRlXzFfY29sb3JzKSArCiAgcGxvdFRoZW1lKCkgKyAKICBsYWJzKHg9IlJlbnQgUHJpY2UoJCkiLCB5PSJDb3VudCIsIHRpdGxlPSJEaXN0cmlidXRpb24gb2YgQm9zdG9uIFJlbnQgcHJpY2VzIiwKICAgICAgIHN1YnRpdGxlPSJOb21pbmFsIHByaWNlcyAoMjAxMyAtIDIwMTkpIiwgCiAgICAgICBjYXB0aW9uPSJTb3VyY2U6IFBhZG1hcHBlciBVSVxuQEplZmZLYXVmbWFuIikKIyBQbG90dGluZyBpdDoKcmVudF92YWx1ZV9oaXN0CmBgYAoKSXQgc2VlbXMgYXMgdGhvdWdoIHRoZXJlIG1heSBiZSBzb21lIG91dGxpZXJzLiBXZeKAmWxsIHJlbW92ZSBhbnl0aGluZyBncmVhdGVyIHRoYW4gMi41IHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbi4KYGBge3J9CkJSXzEzXzE5IDwtIEJSXzIwMTNfMjAxOVt3aGljaChCUl8yMDEzXzIwMTkkUmVudCA8IG1lYW4oQlJfMjAxM18yMDE5JFJlbnQpICsgKDIuNSAqIHNkKEJSXzIwMTNfMjAxOSRSZW50KSkpLCBdCnJlbnRfdmFsdWVfaGlzdDIgPC0gZ2dwbG90KEJSXzEzXzE5LCBhZXMoUmVudCkpICsgZ2VvbV9oaXN0b2dyYW0oZmlsbD1wYWxldHRlXzFfY29sb3JzKQpyZW50X3ZhbHVlX2hpc3QyCmBgYAoKY2hlY2sgb3V0IHRoZSBkaXN0cmlidXRpb24gb2YgcHJpY2VzIGZvciBlYWNoIHllYXIgdXNpbmcgYSB2aW9saW4gcGxvdAoKYGBge3J9CnJlbnRfdmFsdWVfdmlvbGluIDwtIGdncGxvdChCUl8xM18xOSwgYWVzKHg9WWVhciwgeT1SZW50LCBmaWxsPVllYXIpKSArIAogIGdlb21fdmlvbGluKGNvbG9yID0gImdyZXk1MCIpICsKICB4bGFiKCJSZW50IFByaWNlKCQpIikgKyB5bGFiKCJDb3VudCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsZXR0ZV83X2NvbG9ycykgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBnZW9tPSJwb2ludCIsIHNpemU9MiwgY29sb3VyPSJ3aGl0ZSIpICsKICBwbG90VGhlbWUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsKICBsYWJzKHg9IlllYXIiLHk9IlJlbnQgUHJpY2UoJCkiLHRpdGxlPSJEaXN0cmlidXRpb24gb2YgQm9zdG9uIFJlbnQgcHJpY2VzIiwKICAgICAgIHN1YnRpdGxlPSJOb21pbmFsIHByaWNlcyAoMjAxMyAtIDIwMTkpOyBSZW50IHByaWNlIG1lYW5zIHZpc3VhbGl6ZWQgYXMgcG9pbnRzIiwKICAgICAgIGNhcHRpb249IlNvdXJjZTogUGFkbWFwcGVyIFVJXG5ASmVmZkthdWZtYW4iKQpyZW50X3ZhbHVlX3Zpb2xpbgoKYGBgClRoZSB3aGl0ZSBjaXJjbGVzIGRlbm90ZSBzYWxlIHByaWNlIG1lYW5zIGZvciBlYWNoIHllYXIuIAoKRGlzdHJpYnV0aW9uIG9mIE5vcnRoZWFzdGVybiBSZW50IFByaWNlcwpgYGB7cn0KTlVfcmVudF92YWx1ZV92aW9saW4gPC0gZ2dwbG90KE5vcnRoZWFzdGVybl9SZW50cywgYWVzKHg9WWVhciwgeT1SZW50LCBmaWxsPVllYXIpKSArIAogIGdlb21fdmlvbGluKGNvbG9yID0gImdyZXk1MCIpICsKICB4bGFiKCJSZW50IFByaWNlKCQpIikgKyB5bGFiKCJDb3VudCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsZXR0ZV83X2NvbG9ycykgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBnZW9tPSJwb2ludCIsIHNpemU9MiwgY29sb3VyPSJ3aGl0ZSIpICsKICBwbG90VGhlbWUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsKICBsYWJzKHg9IlllYXIiLHk9IlJlbnQgUHJpY2UoJCkiLHRpdGxlPSJEaXN0cmlidXRpb24gb2YgTm9ydGhlYXN0ZXJuIFJlbnQgcHJpY2VzIiwKICAgICAgIHN1YnRpdGxlPSJOb21pbmFsIHByaWNlcyAoMjAxMyAtIDIwMTkpOyBSZW50IHByaWNlIG1lYW5zIHZpc3VhbGl6ZWQgYXMgcG9pbnRzIiwKICAgICAgIGNhcHRpb249IlNvdXJjZTogUGFkbWFwcGVyIFVJXG5ASmVmZkthdWZtYW4iKQpOVV9yZW50X3ZhbHVlX3Zpb2xpbgpgYGAKCmBgYHtyfQojIEFkZCBCb3N0b24gU2hhcGUgZmlsZSB3aXRoIG5hbWVzIG9mIG5laWdoYm9yaG9vZHMKCkJvc3Rvbl9uZWlnaGIgPC0gcmVhZE9HUigiQm9zdG9uX05laWdoYm9yaG9vZHMiLGxheWVyID0gIkJvc3Rvbl9OZWlnaGJvcmhvb2RzIikKYmJveCA8LSBCb3N0b25fbmVpZ2hiQGJib3gKYm9zX2Jib3ggPC0gYyhsZWZ0ID0gYmJveFsxLCAxXSAtIC4wMSwgYm90dG9tID0gYmJveFsyLCAxXSAtIC4wMDUsIAogICAgICAgICAgICAgcmlnaHQgPSBiYm94WzEsIDJdICsgLjAxLCB0b3AgPSBiYm94WzIsIDJdICsgLjAwNSkKYmFzZW1hcCA8LSBnZXRfc3RhbWVubWFwKAogIGJib3ggPSBib3NfYmJveCwKICB6b29tID0gMTIsCiAgbWFwdHlwZSA9ICJ0b25lci1saXRlIikKIyBNYXAgaXQKYm1NYXAgPC0gZ2dtYXAoYmFzZW1hcCkgKyBtYXBUaGVtZSgpICsgCiAgbGFicyh0aXRsZT0iQm9zdG9uIGJhc2VtYXAiKQpibU1hcApgYGAKCgpEaXN0cmlidXRpb24gb2YgQm9zdG9uIFJlbnQgUHJpY2VzCmBgYHtyfQpwcmljZXNfbWFwcGVkX2J5X3llYXIgPC0gZ2dtYXAoYmFzZW1hcCkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBCUl8xM18xOSwgYWVzKHggPSBMb24sIHkgPSBMYXQsIGNvbG9yID0gUmVudCksIAogICAgICAgICAgICAgc2l6ZSA9IC4yNSwgYWxwaGEgPSAwLjYpICsKICBmYWNldF93cmFwKH5ZZWFyLCBzY2FsZXMgPSAiZml4ZWQiLCBuY29sID0gNCkgKwogIGNvb3JkX21hcCgpICsKICBtYXBUaGVtZSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4yNSkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oIlJlbnQgUHJpY2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzID0gcGFsZXR0ZV84X2NvbG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpkb2xsYXJfZm9ybWF0KHByZWZpeCA9ICIkIikpICsKICBsYWJzKHRpdGxlPSJEaXN0cmlidXRpb24gb2YgQm9zdG9uIFJlbnQgcHJpY2VzIiwKICAgICAgIHN1YnRpdGxlPSJOb21pbmFsIHByaWNlcyAoMjAxMyAtIDIwMTkpIiwKICAgICAgIGNhcHRpb249IlNvdXJjZTogUGFkbWFwcGVyIFVJXG5ASmVmZkthdWZtYW4iKQpwcmljZXNfbWFwcGVkX2J5X3llYXIKCmBgYAoKCgojIFdlJ2xsIHN0YWNrIHRoZSB0d28gbWFwcyBhbmQgaW5jcmVhc2UgdGhlIHBvaW50IHNpemUKYGBge3J9CnByaWNlc19tYXBwZWRfMjAxM18yMDE5IDwtIGdnbWFwKGJhc2VtYXApICsgCiAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KEJSXzEzXzE5LCBCUl8xM18xOSRZZWFyID09IDIwMTMgfCBCUl8xM18xOSRZZWFyID09IDIwMTkpLCAKICAgICAgICAgICAgIGFlcyh4ID0gTG9uLCB5ID0gTGF0LCBjb2xvciA9IFJlbnQpLCAKICAgICAgICAgICAgIHNpemUgPSAuNSwgYWxwaGEgPSAwLjc1KSArCiAgZmFjZXRfd3JhcCh+WWVhciwgc2NhbGVzID0gImZpeGVkIiwgbmNvbCA9IDEpICsKICBjb29yZF9tYXAoKSArCiAgbWFwVGhlbWUoKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKCJTYWxlIFByaWNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IHBhbGV0dGVfOF9jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChwcmVmaXggPSAiJCIpKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIEJvc3RvbiBSZW50IHByaWNlcyIsCiAgICAgICBzdWJ0aXRsZT0iTm9taW5hbCBwcmljZXMgKDIwMTMgJiAyMDE5KSIsCiAgICAgICBjYXB0aW9uPSJTb3VyY2U6IFBhZG1hcHBlciBVSVxuQEplZmZLYXVmbWFuIikKcHJpY2VzX21hcHBlZF8yMDEzXzIwMTkKYGBgCgpNZXJnaW5nIFJlbnQgRGF0YSB3aXRoIEJvc3RvbiBOZWlnaGJyb2hvb2QgUG9seWdvbgpgYGB7cn0KcHJvajRzdHJpbmcoQm9zdG9uX25laWdoYikKY29tbW9uLmNycyA8LSBDUlMoIitpbml0PUVQU0c6NDMyNiIpCkJvc3Rvbl9uZWlnaGIgPC0gc3BUcmFuc2Zvcm0oQm9zdG9uX25laWdoYiwgY29tbW9uLmNycykKCmJvc3Rvbi5yZW50IDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoY29vcmRzID0gY2JpbmQoQlJfMTNfMTkkTG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSXzEzXzE5JExhdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEJSXzEzXzE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2o0c3RyaW5nID0gQ1JTKCIraW5pdD1FUFNHOjQzMjYiKSkKCgpib3N0b24ubmVpZ2hiLnJlbnQgPC0gb3Zlcihib3N0b24ucmVudCwgQm9zdG9uX25laWdoYikKYm9zdG9uLm5laWdoYi5yZW50MiA8LSBvdmVyKGJvc3Rvbi5yZW50LCBnZW9tZXRyeShCb3N0b25fbmVpZ2hiKSkKYm9zdG9uMiA8LSBzcENiaW5kKGJvc3Rvbi5yZW50LCBib3N0b24ubmVpZ2hiLnJlbnQpCmNsYXNzKGJvc3RvbjIpCmNsYXNzKGJvc3Rvbi5uZWlnaGIucmVudDIpCmNsYXNzKGJvc3Rvbi5uZWlnaGIucmVudCkKQm9zdG9uX1JlbnRfTmVpZ2hib3Job29kIDwtIGFzLmRhdGEuZnJhbWUoYm9zdG9uMikKQm9zdG9uX1JlbnRfTmVpZ2hib3Job29kCkJvc3Rvbl9SZW50X05laWdoYm9yaG9vZApCb3N0b25fUmVudF9EYXRhIDwtIEJvc3Rvbl9SZW50X05laWdoYm9yaG9vZCAlPiUKICBmaWx0ZXIoTmFtZSAhPSAiTkEiKQpCb3N0b25fUmVudF9EYXRhCmBgYAoKCmBgYHtyfQpCb3N0b25fbmVpZ2hiQGRhdGEkaWQgPC0gcm93bmFtZXMoQm9zdG9uX25laWdoYkBkYXRhKQpCb3N0b25fbmVpZ2hiCgpCb3N0b25fbmVpZ2hiMiA8LSBmb3J0aWZ5KEJvc3Rvbl9uZWlnaGIsIHJlZ2lvbiA9ICJpZCIpICN0aGlzIG9ubHkgaGFzIHRoZSBjb29yZGluYXRlcwpCb3N0b25fbmVpZ2hiMgoKYm9zdG9uLmdnIDwtIG1lcmdlKEJvc3Rvbl9uZWlnaGIyLCBCb3N0b25fbmVpZ2hiLCBieSA9ImlkIiwgdHlwZSA9ICJsZWZ0IikKCmdnbWFwKGJhc2VtYXApICsKZ2VvbV9wb2x5Z29uKGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IEFjcmVzKSwgCiAgICAgICAgICAgICAjYWxwaGEgc2V0cyB0aGUgdHJhbnNwYXJlbmN5IG9mIHRoZSBwb2x5Z29uIGZpbGwgY29sb3IKICAgICAgICAgICAgIGRhdGEgPSBib3N0b24uZ2csIAogICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsCiAgICAgICAgICAgICBsd2QgPSAxKQoKYGBgCgpOZWlnaGJvcmhvb2QtLS1GZW53YXkKYGBge3J9CiNTdWJzZXQgc2FsZXMgZm9yIHRoZSAiSW5uZXIgTWlzc2lvbiBuZWlnaGJvcmhvb2QiCkZld2FueV9SZW50cyA8LSBCb3N0b25fUmVudF9OZWlnaGJvcmhvb2QgJT4lCiAgZmlsdGVyKEJvc3Rvbl9SZW50X05laWdoYm9yaG9vZCROYW1lICVpbiUgIkZlbndheSIpCiNDcmVhdGUgYSBuZXcgYmFzZW1hcCBhdCB0aGUgYXBwcm9wcmlhdGUgc2NhbGUKY2VudHJvaWRfbG9uIDwtIG1lZGlhbihGZXdhbnlfUmVudHMkTG9uKQpjZW50cm9pZF9sYXQgPC0gbWVkaWFuKEZld2FueV9SZW50cyRMYXQpCkZlbndheUJhc2VtYXAgPC0gZ2V0X21hcChsb2NhdGlvbiA9IGMobG9uID0gY2VudHJvaWRfbG9uLCBsYXQgPSBjZW50cm9pZF9sYXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSAic3RhbWVuIixtYXB0eXBlID0gInRvbmVyLWxpdGUiLCB6b29tID0gMTUpCiNDcmVhdGUgYSBmYWNldCBtYXAgYnkgeWVhcgpGZW53YXlfbWFwcGVkX2J5X3llYXIgPC0gZ2dtYXAoRmVud2F5QmFzZW1hcCkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBGZXdhbnlfUmVudHMsIGFlcyh4ID0gTG9uLCB5ID0gTGF0LCBjb2xvciA9IFJlbnQpLCAKICAgICAgICAgICAgIHNpemUgPSAuNSkgKwogIGZhY2V0X3dyYXAoflllYXIsIHNjYWxlcyA9ICJmaXhlZCIsIG5jb2wgPSA0KSArCiAgY29vcmRfbWFwKCkgKwogIG1hcFRoZW1lKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjI1KSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bigiUmVudCBQcmljZSIsIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMgPSBwYWxldHRlXzhfY29sb3JzLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcl9mb3JtYXQocHJlZml4ID0gIiQiKSkgKwogIGxhYnModGl0bGU9IkRpc3RyaWJ1dGlvbiBvZiBGZW53YXkgUmVudCBwcmljZXMiLAogICAgICAgc3VidGl0bGU9Ik5vbWluYWwgcHJpY2VzICgyMDEzIC0gMjAxOSkiLAogICAgICAgY2FwdGlvbj0iU291cmNlOiBQYWRtYXBwZXIgVUlcbkBKZWZmS2F1Zm1hbiIpCiMgUmVudCBWaW9saW4gCkZlbndheV9yZW50X3ZhbHVlX3Zpb2xpbiA8LSBnZ3Bsb3QoRmV3YW55X1JlbnRzLCBhZXMoeD1ZZWFyLCB5PVJlbnQsIGZpbGw9WWVhcikpICsgCiAgZ2VvbV92aW9saW4oY29sb3IgPSAiZ3JleTUwIikgKwogIHhsYWIoIlJlbnQgUHJpY2UoJCkiKSArIHlsYWIoIkNvdW50IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWxldHRlXzdfY29sb3JzKSArCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGdlb209InBvaW50Iiwgc2l6ZT0yLCBjb2xvdXI9IndoaXRlIikgKwogIHBsb3RUaGVtZSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKwogIGxhYnMoeD0iWWVhciIseT0iUmVudCBQcmljZSgkKSIsdGl0bGU9IkRpc3RyaWJ1dGlvbiBvZiBGZW53YXkgUmVudCBwcmljZXMiLAogICAgICAgc3VidGl0bGU9Ik5vbWluYWwgcHJpY2VzICgyMDEzIC0gMjAxOSk7IFJlbnQgcHJpY2UgbWVhbnMgdmlzdWFsaXplZCBhcyBwb2ludHMiLAogICAgICAgY2FwdGlvbj0iU291cmNlOiBQYWRtYXBwZXIgVUlcbkBKZWZmS2F1Zm1hbiIpCkZlbndheV9yZW50X3ZhbHVlX3Zpb2xpbgpGZW53YXlfbWFwcGVkX2J5X3llYXIKYGBgCgpOZWlnaGJvcmhvb2QtLS1NaXNzaW9uIEhpbGwKYGBge3J9Ck1pc3Npb25IaWxsX1JlbnRzIDwtIEJvc3Rvbl9SZW50X05laWdoYm9yaG9vZCAlPiUKICBmaWx0ZXIoQm9zdG9uX1JlbnRfTmVpZ2hib3Job29kJE5hbWUgJWluJSAiTWlzc2lvbiBIaWxsIikKI0NyZWF0ZSBhIG5ldyBiYXNlbWFwIGF0IHRoZSBhcHByb3ByaWF0ZSBzY2FsZQpjZW50cm9pZF9sb24gPC0gbWVkaWFuKE1pc3Npb25IaWxsX1JlbnRzJExvbikKY2VudHJvaWRfbGF0IDwtIG1lZGlhbihNaXNzaW9uSGlsbF9SZW50cyRMYXQpCk1pc3Npb25IaWxsQmFzZW1hcCA8LSBnZXRfbWFwKGxvY2F0aW9uID0gYyhsb24gPSBjZW50cm9pZF9sb24sIGxhdCA9IGNlbnRyb2lkX2xhdCksIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9ICJzdGFtZW4iLG1hcHR5cGUgPSAidG9uZXItbGl0ZSIsIHpvb20gPSAxNSkKI0NyZWF0ZSBhIGZhY2V0IG1hcCBieSB5ZWFyCk1pc3Npb25IaWxsX21hcHBlZF9ieV95ZWFyIDwtIGdnbWFwKE1pc3Npb25IaWxsQmFzZW1hcCkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBNaXNzaW9uSGlsbF9SZW50cywgYWVzKHggPSBMb24sIHkgPSBMYXQsIGNvbG9yID0gUmVudCksIAogICAgICAgICAgICAgc2l6ZSA9IC41KSArCiAgZmFjZXRfd3JhcCh+WWVhciwgc2NhbGVzID0gImZpeGVkIiwgbmNvbCA9IDQpICsKICBjb29yZF9tYXAoKSArCiAgbWFwVGhlbWUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMjUpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKCJSZW50IFByaWNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IHBhbGV0dGVfOF9jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChwcmVmaXggPSAiJCIpKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIFJlbnQgcHJpY2VzIE1pc3Npb24gSGlsbCIsCiAgICAgICBzdWJ0aXRsZT0iTm9taW5hbCBwcmljZXMgKDIwMTMgLSAyMDE5KSIsCiAgICAgICBjYXB0aW9uPSJTb3VyY2U6IFBhZG1hcHBlciBVSVxuQEplZmZLYXVmbWFuIikKIyBSZW50IFZpb2xpbiAKTWlzc2lvbkhpbGxfcmVudF92YWx1ZV92aW9saW4gPC0gZ2dwbG90KE1pc3Npb25IaWxsX1JlbnRzLCBhZXMoeD1ZZWFyLCB5PVJlbnQsIGZpbGw9WWVhcikpICsgCiAgZ2VvbV92aW9saW4oY29sb3IgPSAiZ3JleTUwIikgKwogIHhsYWIoIlJlbnQgUHJpY2UoJCkiKSArIHlsYWIoIkNvdW50IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1wYWxldHRlXzdfY29sb3JzKSArCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PW1lYW4sIGdlb209InBvaW50Iiwgc2l6ZT0yLCBjb2xvdXI9IndoaXRlIikgKwogIHBsb3RUaGVtZSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKwogIGxhYnMoeD0iWWVhciIseT0iUmVudCBQcmljZSgkKSIsdGl0bGU9IkRpc3RyaWJ1dGlvbiBvZiBNaXNzaW9uIEhpbGwgUmVudCBwcmljZXMiLAogICAgICAgc3VidGl0bGU9Ik5vbWluYWwgcHJpY2VzICgyMDEzIC0gMjAxOSk7IFJlbnQgcHJpY2UgbWVhbnMgdmlzdWFsaXplZCBhcyBwb2ludHMiLAogICAgICAgY2FwdGlvbj0iU291cmNlOiBQYWRtYXBwZXIgVUlcbkBKZWZmS2F1Zm1hbiIpCk1pc3Npb25IaWxsX3JlbnRfdmFsdWVfdmlvbGluCk1pc3Npb25IaWxsX21hcHBlZF9ieV95ZWFyCmBgYAoKTmVpZ2hib3Job29kLS0tUm94YnVyeSAKYGBge3J9ClJveGJ1cnlfUmVudHMgPC0gQm9zdG9uX1JlbnRfTmVpZ2hib3Job29kICU+JQogIGZpbHRlcihCb3N0b25fUmVudF9OZWlnaGJvcmhvb2QkTmFtZSAlaW4lICJSb3hidXJ5IikKI0NyZWF0ZSBhIG5ldyBiYXNlbWFwIGF0IHRoZSBhcHByb3ByaWF0ZSBzY2FsZQpjZW50cm9pZF9sb24gPC0gbWVkaWFuKFJveGJ1cnlfUmVudHMkTG9uKQpjZW50cm9pZF9sYXQgPC0gbWVkaWFuKFJveGJ1cnlfUmVudHMkTGF0KQpSb3hidXJ5QmFzZW1hcCA8LSBnZXRfbWFwKGxvY2F0aW9uID0gYyhsb24gPSBjZW50cm9pZF9sb24sIGxhdCA9IGNlbnRyb2lkX2xhdCksIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9ICJzdGFtZW4iLG1hcHR5cGUgPSAidG9uZXItbGl0ZSIsIHpvb20gPSAxNSkKI0NyZWF0ZSBhIGZhY2V0IG1hcCBieSB5ZWFyClJveGJ1cnlfbWFwcGVkX2J5X3llYXIgPC0gZ2dtYXAoUm94YnVyeUJhc2VtYXApICsgCiAgZ2VvbV9wb2ludChkYXRhID0gUm94YnVyeV9SZW50cywgYWVzKHggPSBMb24sIHkgPSBMYXQsIGNvbG9yID0gUmVudCksIAogICAgICAgICAgICAgc2l6ZSA9IC41KSArCiAgZmFjZXRfd3JhcCh+WWVhciwgc2NhbGVzID0gImZpeGVkIiwgbmNvbCA9IDQpICsKICBjb29yZF9tYXAoKSArCiAgbWFwVGhlbWUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMjUpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKCJSZW50IFByaWNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IHBhbGV0dGVfOF9jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChwcmVmaXggPSAiJCIpKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIFJlbnQgcHJpY2VzIFJveGJ1cnkiLAogICAgICAgc3VidGl0bGU9Ik5vbWluYWwgcHJpY2VzICgyMDEzIC0gMjAxOSkiLAogICAgICAgY2FwdGlvbj0iU291cmNlOiBQYWRtYXBwZXIgVUlcbkBKZWZmS2F1Zm1hbiIpCiMgUmVudCBWaW9saW4KUm94YnVyeV9yZW50X3ZhbHVlX3Zpb2xpbiA8LSBnZ3Bsb3QoUm94YnVyeV9SZW50cywgYWVzKHg9WWVhciwgeT1SZW50LCBmaWxsPVllYXIpKSArIAogIGdlb21fdmlvbGluKGNvbG9yID0gImdyZXk1MCIpICsKICB4bGFiKCJSZW50IFByaWNlKCQpIikgKyB5bGFiKCJDb3VudCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsZXR0ZV83X2NvbG9ycykgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBnZW9tPSJwb2ludCIsIHNpemU9MiwgY29sb3VyPSJ3aGl0ZSIpICsKICBwbG90VGhlbWUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsKICBsYWJzKHg9IlllYXIiLHk9IlJlbnQgUHJpY2UoJCkiLHRpdGxlPSJEaXN0cmlidXRpb24gb2YgUm94YnVyeSBSZW50IHByaWNlcyIsCiAgICAgICBzdWJ0aXRsZT0iTm9taW5hbCBwcmljZXMgKDIwMTMgLSAyMDE5KTsgUmVudCBwcmljZSBtZWFucyB2aXN1YWxpemVkIGFzIHBvaW50cyIsCiAgICAgICBjYXB0aW9uPSJTb3VyY2U6IFBhZG1hcHBlciBVSVxuQEplZmZLYXVmbWFuIikKUm94YnVyeV9yZW50X3ZhbHVlX3Zpb2xpbgpSb3hidXJ5X21hcHBlZF9ieV95ZWFyCmBgYAoKTmVpZ2hib3Job29kLS0tU291dGggRW5kCmBgYHtyfQpTb3V0aEVuZF9SZW50cyA8LSBCb3N0b25fUmVudF9OZWlnaGJvcmhvb2QgJT4lCiAgZmlsdGVyKEJvc3Rvbl9SZW50X05laWdoYm9yaG9vZCROYW1lICVpbiUgIlNvdXRoIEVuZCIpCiNDcmVhdGUgYSBuZXcgYmFzZW1hcCBhdCB0aGUgYXBwcm9wcmlhdGUgc2NhbGUKY2VudHJvaWRfbG9uIDwtIG1lZGlhbihTb3V0aEVuZF9SZW50cyRMb24pCmNlbnRyb2lkX2xhdCA8LSBtZWRpYW4oU291dGhFbmRfUmVudHMkTGF0KQpTb3V0aEVuZEJhc2VtYXAgPC0gZ2V0X21hcChsb2NhdGlvbiA9IGMobG9uID0gY2VudHJvaWRfbG9uLCBsYXQgPSBjZW50cm9pZF9sYXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSAic3RhbWVuIixtYXB0eXBlID0gInRvbmVyLWxpdGUiLCB6b29tID0gMTUpCiNDcmVhdGUgYSBmYWNldCBtYXAgYnkgeWVhcgpTb3V0aEVuZF9tYXBwZWRfYnlfeWVhciA8LSBnZ21hcChTb3V0aEVuZEJhc2VtYXApICsgCiAgZ2VvbV9wb2ludChkYXRhID0gU291dGhFbmRfUmVudHMsIGFlcyh4ID0gTG9uLCB5ID0gTGF0LCBjb2xvciA9IFJlbnQpLCAKICAgICAgICAgICAgIHNpemUgPSAuNSkgKwogIGZhY2V0X3dyYXAoflllYXIsIHNjYWxlcyA9ICJmaXhlZCIsIG5jb2wgPSA0KSArCiAgY29vcmRfbWFwKCkgKwogIG1hcFRoZW1lKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjI1KSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50bigiUmVudCBQcmljZSIsIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMgPSBwYWxldHRlXzhfY29sb3JzLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcl9mb3JtYXQocHJlZml4ID0gIiQiKSkgKwogIGxhYnModGl0bGU9IkRpc3RyaWJ1dGlvbiBvZiBSZW50IHByaWNlcyBTb3V0aCBFbmQiLAogICAgICAgc3VidGl0bGU9Ik5vbWluYWwgcHJpY2VzICgyMDEzIC0gMjAxOSkiLAogICAgICAgY2FwdGlvbj0iU291cmNlOiBQYWRtYXBwZXIgVUlcbkBKZWZmS2F1Zm1hbiIpCiMgUmVudCBWaW9saW4gClNvdXRoRW5kX3JlbnRfdmFsdWVfdmlvbGluIDwtIGdncGxvdChTb3V0aEVuZF9SZW50cywgYWVzKHg9WWVhciwgeT1SZW50LCBmaWxsPVllYXIpKSArIAogIGdlb21fdmlvbGluKGNvbG9yID0gImdyZXk1MCIpICsKICB4bGFiKCJSZW50IFByaWNlKCQpIikgKyB5bGFiKCJDb3VudCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsZXR0ZV83X2NvbG9ycykgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLCBnZW9tPSJwb2ludCIsIHNpemU9MiwgY29sb3VyPSJ3aGl0ZSIpICsKICBwbG90VGhlbWUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsKICBsYWJzKHg9IlllYXIiLHk9IlJlbnQgUHJpY2UoJCkiLHRpdGxlPSJEaXN0cmlidXRpb24gb2YgU291dGggRW5kIFJlbnQgcHJpY2VzIiwKICAgICAgIHN1YnRpdGxlPSJOb21pbmFsIHByaWNlcyAoMjAxMyAtIDIwMTkpOyBSZW50IHByaWNlIG1lYW5zIHZpc3VhbGl6ZWQgYXMgcG9pbnRzIiwKICAgICAgIGNhcHRpb249IlNvdXJjZTogUGFkbWFwcGVyIFVJXG5ASmVmZkthdWZtYW4iKQpTb3V0aEVuZF9yZW50X3ZhbHVlX3Zpb2xpbgpTb3V0aEVuZF9tYXBwZWRfYnlfeWVhcgpgYGAKCkRpc3RyaWJ1dGlvbiBvZiBSZW50IHByaWNlcyBhcm91bmQgTm9ydGhlYXN0ZXJuIFVuaXZlcnNpdHkKYGBge3J9Ck5vcnRoZWFzdGVybl9SZW50cyA8LSByYmluZChTb3V0aEVuZF9SZW50cyxSb3hidXJ5X1JlbnRzLE1pc3Npb25IaWxsX1JlbnRzLCBGZXdhbnlfUmVudHMpCgojQ3JlYXRlIGEgbmV3IGJhc2VtYXAgYXQgdGhlIGFwcHJvcHJpYXRlIHNjYWxlCmNlbnRyb2lkX2xvbiA8LSBtZWRpYW4oTm9ydGhlYXN0ZXJuX1JlbnRzJExvbikKY2VudHJvaWRfbGF0IDwtIG1lZGlhbihOb3J0aGVhc3Rlcm5fUmVudHMkTGF0KQpOb3J0aGVhc3Rlcm5CYXNlbWFwIDwtIGdldF9tYXAobG9jYXRpb24gPSBjKGxvbiA9IGNlbnRyb2lkX2xvbiwgbGF0ID0gY2VudHJvaWRfbGF0KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gInN0YW1lbiIsbWFwdHlwZSA9ICJ0b25lci1saXRlIiwgem9vbSA9IDE1KQoKI0NyZWF0ZSBhIGZhY2V0IG1hcCBieSB5ZWFyCk5vcnRoZWFzdGVybl9tYXBwZWRfYnlfeWVhciA8LSBnZ21hcChOb3J0aGVhc3Rlcm5CYXNlbWFwKSArIAogIGdlb21fcG9pbnQoZGF0YSA9IE5vcnRoZWFzdGVybl9SZW50cywgYWVzKHggPSBMb24sIHkgPSBMYXQsIGNvbG9yID0gUmVudCksIAogICAgICAgICAgICAgc2l6ZSA9IC41KSArCiAgZmFjZXRfd3JhcCh+WWVhciwgc2NhbGVzID0gImZpeGVkIiwgbmNvbCA9IDQpICsKICBjb29yZF9tYXAoKSArCiAgbWFwVGhlbWUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMjUpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKCJSZW50IFByaWNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IHBhbGV0dGVfOF9jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChwcmVmaXggPSAiJCIpKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIFJlbnQgcHJpY2VzIGFyb3VuZCBOb3J0aGVhc3Rlcm4gVW5pdmVyc2l0eSIsCiAgICAgICBzdWJ0aXRsZT0iTm9taW5hbCBwcmljZXMgKDIwMTMgLSAyMDE5KSIsCiAgICAgICBjYXB0aW9uPSJTb3VyY2U6IFBhZG1hcHBlciBVSVxuQEplZmZLYXVmbWFuIikKTm9ydGhlYXN0ZXJuX21hcHBlZF9ieV95ZWFyCgpgYGAKCgpCb3N0b24gU3VtbWFyaXphdGlvbgpgYGB7cn0KQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQgPC0gZGRwbHkoQm9zdG9uX1JlbnRfRGF0YSwgYygiTmFtZSIsIlllYXIiKSwgc3VtbWFyaXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5SZW50ID0gbWVkaWFuKFJlbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW50Q291bnQgPSBsZW5ndGgoWWVhciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkUmVudCA9IHNkKFJlbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51c1NkID0gbWVkaWFuUmVudCAtIHNkUmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1NEID0gbWVkaWFuUmVudCArIHNkUmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb2dyZXNzID0gInRleHQiKQp5ZWFybHlfcmVudHMgPC0gZGRwbHkoQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQsIH5OYW1lLCBzdW1tYXJpc2UsIAogICAgICAgICAgICAgICAgICAgICAgYXZnLnllYXJseS5yZW50ID0gbWVhbihyZW50Q291bnQpKQpCb3N0b25fUmVudHNfc3VtbWFyaXplZCA8LSBsZWZ0X2pvaW4oQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQsIHllYXJseV9yZW50cywgYnkgPSAiTmFtZSIpCm1lZEJ5WWVhciA8LSBkY2FzdChCb3N0b25fUmVudHNfc3VtbWFyaXplZCwgTmFtZSB+IFllYXIsIHZhbHVlLnZhciA9ICJtZWRpYW5SZW50IikKbWVkQnlZZWFyJHBjdENoYW5nZSA8LSAobWVkQnlZZWFyJGAyMDE5YCAtIG1lZEJ5WWVhciRgMjAxM2ApIC8gbWVkQnlZZWFyJGAyMDEzYApCb3N0b25fUmVudHNfc3VtbWFyaXplZCA8LSBsZWZ0X2pvaW4oQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQsIG1lZEJ5WWVhclssYygiTmFtZSIsICJwY3RDaGFuZ2UiKV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJOYW1lIikKQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQKbmVpZ2hiLnRpZHkgPC0gdGlkeShCb3N0b25fbmVpZ2hiLCByZWdpb24gPSBjKCdOYW1lJykpCm5laWdoYi50aWR5JE5hbWUgPC0gbmVpZ2hiLnRpZHkkaWQKQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQgPC0gam9pbihCb3N0b25fUmVudHNfc3VtbWFyaXplZCwgbmVpZ2hiLnRpZHksIGJ5ID0gIk5hbWUiLCBtYXRjaCA9ICJhbGwiKQpCb3N0b25fUmVudHNfc3VtbWFyaXplZAoKYGBgCgpOb3J0aGVhc3Rlcm4gU3VtbWVyYWl6YXRpb24KYGBge3J9Ck5vcnRoZWFzdGVybl9SZW50c19zdW1tYXJpemVkIDwtIGRkcGx5KE5vcnRoZWFzdGVybl9SZW50cywgYygiTmFtZSIsIlllYXIiKSwgc3VtbWFyaXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5SZW50ID0gbWVkaWFuKFJlbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW50Q291bnQgPSBsZW5ndGgoWWVhciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkUmVudCA9IHNkKFJlbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51c1NkID0gbWVkaWFuUmVudCAtIHNkUmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1NEID0gbWVkaWFuUmVudCArIHNkUmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb2dyZXNzID0gInRleHQiKQp5ZWFybHlfcmVudHMgPC0gZGRwbHkoTm9ydGhlYXN0ZXJuX1JlbnRzX3N1bW1hcml6ZWQsIH5OYW1lLCBzdW1tYXJpc2UsIAogICAgICAgICAgICAgICAgICAgICAgYXZnLnllYXJseS5yZW50ID0gbWVhbihyZW50Q291bnQpKQpOb3J0aGVhc3Rlcm5fUmVudHNfc3VtbWFyaXplZCA8LSBsZWZ0X2pvaW4oTm9ydGhlYXN0ZXJuX1JlbnRzX3N1bW1hcml6ZWQsIHllYXJseV9yZW50cywgYnkgPSAiTmFtZSIpCm1lZEJ5WWVhciA8LSBkY2FzdChOb3J0aGVhc3Rlcm5fUmVudHNfc3VtbWFyaXplZCwgTmFtZSB+IFllYXIsIHZhbHVlLnZhciA9ICJtZWRpYW5SZW50IikKbWVkQnlZZWFyJHBjdENoYW5nZSA8LSAobWVkQnlZZWFyJGAyMDE5YCAtIG1lZEJ5WWVhciRgMjAxM2ApIC8gbWVkQnlZZWFyJGAyMDEzYAptZWRCeVllYXIKCk5vcnRoZWFzdGVybl9SZW50c19zdW1tYXJpemVkIDwtIGxlZnRfam9pbihOb3J0aGVhc3Rlcm5fUmVudHNfc3VtbWFyaXplZCwgbWVkQnlZZWFyWyxjKCJOYW1lIiwgInBjdENoYW5nZSIpXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIk5hbWUiKQpOb3J0aGVhc3Rlcm5fUmVudHNfc3VtbWFyaXplZApuZWlnaGIudGlkeSA8LSB0aWR5KEJvc3Rvbl9uZWlnaGIsIHJlZ2lvbiA9IGMoJ05hbWUnKSkKbmVpZ2hiLnRpZHkkTmFtZSA8LSBuZWlnaGIudGlkeSRpZApOb3J0aGVhc3Rlcm5fUmVudHNfc3VtbWFyaXplZF90aWR5IDwtIGpvaW4oTm9ydGhlYXN0ZXJuX1JlbnRzX3N1bW1hcml6ZWQsIG5laWdoYi50aWR5LCBieSA9ICJOYW1lIiwgbWF0Y2ggPSAiYWxsIikKTm9ydGhlYXN0ZXJuX1JlbnRzX3N1bW1hcml6ZWRfdGlkeQpgYGAKCk1lZGlhbiBSZW50IFByaWNlIGJ5IE5vcnRoZWFzdGVybiBOZWlnaGJvcmhvb2QKYGBge3J9Cm5laWdoYl9tYXAgPC0gZ2dtYXAoYmFzZW1hcCkgKwogIGdlb21fcG9seWdvbihkYXRhID0gTm9ydGhlYXN0ZXJuX1JlbnRzX3N1bW1hcml6ZWRfdGlkeSwgCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IG1lZGlhblJlbnQpLCAKICAgICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgYWxwaGEgPSAwLjc1LCBzaXplID0gMC4yNSkgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50bigiTmVpZ2hib3Job29kIFxuTWVkaWFuIFxuUmVudCBQcmljZSIsIAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IHBhbGV0dGVfOF9jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpkb2xsYXJfZm9ybWF0KHByZWZpeCA9ICIkIikpICsKICBtYXBUaGVtZSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4yNSkpICsgY29vcmRfbWFwKCkgKwogIGZhY2V0X3dyYXAoflllYXIsIG5yb3cgPSAyKSArCiAgbGFicyh0aXRsZT0iTWVkaWFuIHJlbnQgcHJpY2UgYnkgbmVpZ2hib3Job29kLCBOb3J0aGVhc3Rlcm4gIiwKICAgICAgIHN1YnRpdGxlPSJOb21pbmFsIHByaWNlcyAoMjAxMyAtIDIwMTkpIiwKICAgICAgIGNhcHRpb249IlNvdXJjZTogUGFkbWFwcGVyIFVJXG5ASmVmZkthdWZtYW4iKQpuZWlnaGJfbWFwCmBgYAoKUGVyY2VudCBDaGFuZ2UgaW4gUmVudApgYGB7cn0KY2hhbmdlX21hcCA8LSBnZ21hcChiYXNlbWFwKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBOb3J0aGVhc3Rlcm5fUmVudHNfc3VtbWFyaXplZF90aWR5W3doaWNoKE5vcnRoZWFzdGVybl9SZW50c19zdW1tYXJpemVkX3RpZHkkWWVhciA9PSAyMDE5KSwgXSwgCiAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCwgZmlsbCA9IHBjdENoYW5nZSksIAogICAgICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjI1KSArIAogIGNvb3JkX21hcCgpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bigiJSBDaGFuZ2UiLCBjb2xvcnMgPSBwYWxldHRlXzhfY29sb3JzLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSkgKwogIG1hcFRoZW1lKCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoLjUsICJpbiIpKSArCiAgbGFicyh0aXRsZT0iUGVyY2VudCBjaGFuZ2UgaW4gbWVkaWFuIHJlbnQgcHJpY2VzLCBOb3J0aGVhc3Rlcm4iLAogICAgICAgc3VidGl0bGU9Ik5vbWluYWwgcHJpY2VzICgyMDEzIC0gMjAxOSkiLAogICAgICAgY2FwdGlvbj0iUyIpCmNoYW5nZV9tYXAKYGBgClRpbWUgU2VyZWlzIFBsb3RzCgpgYGB7cn0KQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQKIyBMZXRzIGxvb2sgYXQgdGhlIHRvcCA4IG1vc3QgYXBwcmVjaWF0aW5nIG5laWdoYm9yaG9vZHMuCnRvcFBjdENoYW5nZSA8LSB1bmlxdWUoQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQkcGN0Q2hhbmdlKSAlPiUgc29ydChkZWNyZWFzaW5nID0gVFJVRSkgJT4lIGhlYWQoOCkKIAojIFdlbGwgdXNlIHRoZXNlIHBlcmNlbnRhZ2VzIHRvIHN1YnNldCBvdXIgbmVpZ2hib3Job29kcyBkYXRhIGZyYW1lCmJvc0ZvclRpbWVTZXJpZXMgPC0gQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWRbd2hpY2goQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQkcGN0Q2hhbmdlICVpbiUgdG9wUGN0Q2hhbmdlKSwgXSAKCnRpbWUuc2VyaWVzIDwtIGdncGxvdChib3NGb3JUaW1lU2VyaWVzLCBhZXMoeCA9IFllYXIsIGdyb3VwPU5hbWUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVkaWFuUmVudCkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IG1pbnVzU2QsIHltYXggPSBwbHVzU0QsIGZpbGwgPSBOYW1lKSwgYWxwaGEgPSAwLjc1KSArCiAgZmFjZXRfd3JhcCh+TmFtZSwgc2NhbGVzID0gImZpeGVkIiwgbnJvdyA9IDQpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpkb2xsYXJfZm9ybWF0KHByZWZpeCA9ICIkIikpICsKICB5bGFiKCJOZWlnaGJvcmhvb2QgbWVkaWFuIHJlbnQgcHJpY2UiKSArIHhsYWIoTlVMTCkgKwogIHBsb3RUaGVtZSgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIHBhbmVsLnNwYWNpbmcueSA9IHVuaXQoMSwgImxpbmVzIikKICApICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsZXR0ZV84X2NvbG9ycykgKwogIGxhYnModGl0bGU9IlRpbWUgc2VyaWVzIGZvciBoaWdoZXN0IGdyb3d0aCBuZWlnaGJvcmhvb2RzLCBCb3N0b24iLAogICAgICAgc3VidGl0bGU9Ik5vbWluYWwgcHJpY2VzICgyMDEzLTIwMTkpOyBNZWRpYW47IFJpYmJvbiBpbmRpY2F0ZXMgMSBzdGFuZGFyZCBkZXZpYXRpb24iLAogICAgICAgY2FwdGlvbj0iU291cmNlOiIpCnRpbWUuc2VyaWVzCmBgYAoKYGBge3J9Ck5vcnRoZWFzdGVybl9SZW50c19zdW1tYXJpemVkCnRpbWUuc2VyaWVzIDwtIGdncGxvdChOb3J0aGVhc3Rlcm5fUmVudHNfc3VtbWFyaXplZCwgYWVzKHggPSBZZWFyLCBncm91cD1OYW1lKSkgKwogIGdlb21fbGluZShhZXMoeSA9IG1lZGlhblJlbnQpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtaW51c1NkLCB5bWF4ID0gcGx1c1NELCBmaWxsID0gTmFtZSksIGFscGhhID0gMC43NSkgKwogIGZhY2V0X3dyYXAofk5hbWUsIHNjYWxlcyA9ICJmaXhlZCIsIG5yb3cgPSA0KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChwcmVmaXggPSAiJCIpKSArCiAgeWxhYigiTmVpZ2hib3Job29kIG1lZGlhbiByZW50IHByaWNlIikgKyB4bGFiKE5VTEwpICsKICBwbG90VGhlbWUoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICBwYW5lbC5zcGFjaW5nLnkgPSB1bml0KDEsICJsaW5lcyIpCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXBhbGV0dGVfOF9jb2xvcnMpICsKICBsYWJzKHRpdGxlPSJUaW1lIHNlcmllcyBmb3IgaGlnaGVzdCBncm93dGggbmVpZ2hib3Job29kcywgTm9ydGhlYXN0ZXJuIiwKICAgICAgIHN1YnRpdGxlPSJOb21pbmFsIHByaWNlcyAoMjAxMy0yMDE5KTsgTWVkaWFuOyBSaWJib24gaW5kaWNhdGVzIDEgc3RhbmRhcmQgZGV2aWF0aW9uIiwKICAgICAgIGNhcHRpb249IlNvdXJjZToiKQp0aW1lLnNlcmllcwpgYGAKCgpgYGB7cn0KCiMgRmlyc3Qgd2UgY3JlYXRlIGEgZGF0YSBmcmFtZSBvZiBqdXN0IDIwMTMgYW5kIHJlbW92ZSBuZWlnaGJvcmhvb2RzIAojIHRoYXQgaGF2ZSBhbiBOQSB2YWx1ZSBmb3IgcGN0Q2hhbmdlIGR1ZSB0byBvbiBpbnN1ZmZpY2llbnQgc2FsZSB2b2x1bWUKYm9zLjIwMTMgPC0gQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWRbd2hpY2goQm9zdG9uX1JlbnRzX3N1bW1hcml6ZWQkWWVhciA9PSAyMDEzKSwgXSAlPiUgbmEub21pdCgpCgojIFRoZW4gY3JlYXRlIHRoZSBzY2F0dGVycGxvdCB1c2luZyBuZWlnaGJvcmhvb2QgbmFtZSBsYWJlbHMgaW5zdGVhZCBvZiBwb2ludHMKY2hhbmdlX3NjYXR0ZXJwbG90IDwtIGdncGxvdChib3MuMjAxMywgYWVzKHggPSBwY3RDaGFuZ2UsIHkgPSBtZWRpYW5SZW50LCBsYWJlbCA9IE5hbWUpKSArIAogIGdlb21fbGFiZWwoZGF0YSA9IGJvcy4yMDEzW3doaWNoKCFib3MuMjAxMyRwY3RDaGFuZ2UgJWluJSB0b3BQY3RDaGFuZ2UpLF0sIAogICAgICAgICAgICAgYWVzKGxhYmVsID0gTmFtZSksIGZpbGwgPSAiZ3JleTIwIiwgc2l6ZSA9IDIsIGNvbG9yID0gIndoaXRlIikgKwogIGdlb21fbGFiZWwoZGF0YSA9IGJvcy4yMDEzW3doaWNoKGJvcy4yMDEzJHBjdENoYW5nZSAlaW4lIHRvcFBjdENoYW5nZSksXSwgCiAgICAgICAgICAgICBhZXMobGFiZWwgPSBOYW1lLCBmaWxsID0gTmFtZSksIHNpemUgPSAyLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFsZXR0ZV85X2NvbG9ycykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBwbG90VGhlbWUoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KHByZWZpeCA9ICIkIikpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQsIGxpbWl0cyA9IGMobWluKGJvcy4yMDEzJHBjdENoYW5nZSAtIC4wNCksIG1heChib3MuMjAxMyRwY3RDaGFuZ2UgKyAuMDI1KSkgKSArCiAgbGFicyh4PSIlIENoYW5nZSIsIHk9Ik1lZGlhbiBSZW50IFByaWNlICgyMDEzKSIsCiAgICAgICB0aXRsZT0iQ2hhbmdlIGluIHJlbnQgcHJpY2UgYXMgYSBmdW5jdGlvbiBvZiBpbml0aWFsIHByaWNlIiwKICAgICAgIHN1YnRpdGxlPSJNZWRpYW4gcHJpY2U7IENoYW5nZSBiZXR3ZWVuIDIwMTMgLSAyMDE5IiwKICAgICAgIGNhcHRpb249IlNvdXJjZTogIikKY2hhbmdlX3NjYXR0ZXJwbG90CmBgYAoK