This notebook introductes the ideas of statebins.
This is for working on the Project. Find some economic data from the GeoFRED websitge. For example take the data from a map and make a statebin from it.
Use the socviz Chapter 7 Section 3 as a reference.
From the Preface of the book load the following packages, install and load the socviz and statebin package from the authors github.
library(pacman)
p_load("tidyverse", "broom", "coefplot", "cowplot",
"gapminder", "GGally", "ggrepel", "ggridges", "gridExtra",
"here", "interplot", "margins", "maps", "mapproj",
"mapdata", "MASS", "quantreg", "rlang", "scales",
"survey", "srvyr", "viridis", "viridisLite", "devtools", "socviz", "statebins")
# Enter one or more numbers separated by spaces, or an empty line to cancel
# 1:
# devtools::install_github("kjhealy/socviz")
data("election")
election %>% select(state, total_vote,
r_points, pct_trump, party, census) %>%
sample_n(5)
# Hex color codes for Dem Blue and Rep Red
party_colors <- c("#2E74C0", "#CB454A")
p0 <- ggplot(data = subset(election, st %nin% "DC"),
mapping = aes(x = r_points,
y = reorder(state, r_points),
color = party))
p1 <- p0 + geom_vline(xintercept = 0, color = "gray30") +
geom_point(size = 2)
p2 <- p1 + scale_color_manual(values = party_colors)
p3 <- p2 + scale_x_continuous(breaks = c(-30, -20, -10, 0, 10, 20, 30, 40),
labels = c("30\n (Clinton)", "20", "10", "0",
"10", "20", "30", "40\n(Trump)"))
p3 + facet_wrap(~ census, ncol=1, scales="free_y") +
guides(color=FALSE) + labs(x = "Point Margin", y = "") +
theme(axis.text=element_text(size=8))

library(maps)
us_states <- map_data("state")
head(us_states)
dim(us_states)
[1] 15537 6
p <- ggplot(data = us_states,
mapping = aes(x = long, y = lat,
group = group))
p + geom_polygon(fill = "white", color = "black")

p <- ggplot(data = us_states,
aes(x = long, y = lat,
group = group, fill = region))
p + geom_polygon(color = "gray90", size = 0.1) + guides(fill = FALSE)

p <- ggplot(data = us_states,
mapping = aes(x = long, y = lat,
group = group, fill = region))
p + geom_polygon(color = "gray90", size = 0.1) +
coord_map(projection = "albers", lat0 = 39, lat1 = 45) +
guides(fill = FALSE)

election$region <- tolower(election$state)
us_states_elec <- left_join(us_states, election)
Joining, by = "region"
p <- ggplot(data = us_states_elec,
aes(x = long, y = lat,
group = group, fill = party))
p + geom_polygon(color = "gray90", size = 0.1) +
coord_map(projection = "albers", lat0 = 39, lat1 = 45)

p0 <- ggplot(data = us_states_elec,
mapping = aes(x = long, y = lat,
group = group, fill = party))
p1 <- p0 + geom_polygon(color = "gray90", size = 0.1) +
coord_map(projection = "albers", lat0 = 39, lat1 = 45)
p2 <- p1 + scale_fill_manual(values = party_colors) +
labs(title = "Election Results 2016", fill = NULL)
p2 + theme_map()

Trump vote default colors not so good.
p0 <- ggplot(data = us_states_elec,
mapping = aes(x = long, y = lat, group = group, fill = pct_trump))
p1 <- p0 + geom_polygon(color = "gray90", size = 0.1) +
coord_map(projection = "albers", lat0 = 39, lat1 = 45)
p1 + labs(title = "Trump vote") + theme_map() + labs(fill = "Percent")

p2 <- p1 + scale_fill_gradient(low = "white", high = "#CB454A") +
labs(title = "Trump vote")
p2 + theme_map() + labs(fill = "Percent")

Winning percentage, again default colors are not so good.
p0 <- ggplot(data = us_states_elec,
mapping = aes(x = long, y = lat, group = group, fill = d_points))
p1 <- p0 + geom_polygon(color = "gray90", size = 0.1) +
coord_map(projection = "albers", lat0 = 39, lat1 = 45)
p2 <- p1 + scale_fill_gradient2() + labs(title = "Winning margins")
p2 + theme_map() + labs(fill = "Percent")

p3 <- p1 + scale_fill_gradient2(low = "red", mid = scales::muted("purple"),
high = "blue", breaks = c(-25, 0, 25, 50, 75)) +
labs(title = "Winning margins")
p3 + theme_map() + labs(fill = "Percent")

Without Washington Dc
p0 <- ggplot(data = subset(us_states_elec,
region %nin% "district of columbia"),
aes(x = long, y = lat, group = group, fill = d_points))
p1 <- p0 + geom_polygon(color = "gray90", size = 0.1) +
coord_map(projection = "albers", lat0 = 39, lat1 = 45)
p2 <- p1 + scale_fill_gradient2(low = "red",
mid = scales::muted("purple"),
high = "blue") +
labs(title = "Winning margins")
p2 + theme_map() + labs(fill = "Percent")

Statebins
library(statebins)
statebins_continuous(state_data = election, state_col = "state",
text_color = "white", value_col = "pct_trump",
brewer_pal="Reds", font_size = 3,
legend_title="Percent Trump")
`show_guide` has been deprecated. Please use `show.legend` instead.

statebins_continuous(state_data = subset(election, st %nin% "DC"),
state_col = "state",
text_color = "black", value_col = "pct_clinton",
brewer_pal="Blues", font_size = 3,
legend_title="Percent Clinton")
`show_guide` has been deprecated. Please use `show.legend` instead.

election <- election %>% mutate(color = recode(party, Republican = "darkred",
Democrat = "royalblue"))
statebins_manual(state_data = election, state_col = "st",
color_col = "color", text_color = "white",
font_size = 3, legend_title="Winner",
labels=c("Trump", "Clinton"), legend_position = "right")
`show_guide` has been deprecated. Please use `show.legend` instead.

statebins(state_data = election,
state_col = "state", value_col = "pct_trump",
text_color = "white", breaks = 4,
labels = c("4-21", "21-37", "37-53", "53-70"),
brewer_pal="Reds", font_size = 3, legend_title="Percent Trump")
`show_guide` has been deprecated. Please use `show.legend` instead.

LS0tCnRpdGxlOiAic3RhdGViaW5zIgphdXRob3I6ICJQcm9mLiBFcmljIEEuIFN1ZXNzIgpkYXRlOiAiTm92ZW1iZXIgMTgsIDIwMjAiCm91dHB1dDoKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KClRoaXMgbm90ZWJvb2sgaW50cm9kdWN0ZXMgdGhlIGlkZWFzIG9mIHN0YXRlYmlucy4KClRoaXMgaXMgZm9yIHdvcmtpbmcgb24gdGhlIFByb2plY3QuICBGaW5kIHNvbWUgZWNvbm9taWMgZGF0YSBmcm9tIHRoZSBbR2VvRlJFRF0oaHR0cHM6Ly9nZW9mcmVkLnN0bG91aXNmZWQub3JnLykgd2Vic2l0Z2UuICBGb3IgZXhhbXBsZSB0YWtlIHRoZSBkYXRhIGZyb20gYSBbbWFwXShodHRwczovL2dlb2ZyZWQuc3Rsb3Vpc2ZlZC5vcmcvbWFwLz90aD1wdWJ1Z24mY2M9NSZyYz1mYWxzZSZpbT1mcmFjdGlsZSZzYiZsbmc9LTExMy45MSZsYXQ9NTYuODAmem09MyZzbCZzdiZzdGk9MzE5JnJ0PXN0YXRlJmF0PU5vdCUyMFNlYXNvbmFsbHklMjBBZGp1c3RlZCwlMjBBbm51YWwsJTIwRG9sbGFycyUyMHBlciUyMEhvdXImZnE9QW5udWFsJmFtPUF2ZXJhZ2UmdW49bGluJmR0PTIwMTctMDEtMDEpIGFuZCBtYWtlIGEgc3RhdGViaW4gZnJvbSBpdC4KClVzZSB0aGUgW3NvY3Zpel0oaHR0cHM6Ly9zb2N2aXouY28pIFtDaGFwdGVyIDddKGh0dHBzOi8vc29jdml6LmNvL21hcHMuaHRtbCNtYXBzKSBbU2VjdGlvbiAzXShodHRwczovL3NvY3Zpei5jby9tYXBzLmh0bWwjc3RhdGViaW5zKSBhcyBhIHJlZmVyZW5jZS4KCkZyb20gdGhlIFByZWZhY2Ugb2YgdGhlIGJvb2sgbG9hZCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzLCBpbnN0YWxsIGFuZCBsb2FkIHRoZSAqc29jdml6KiBhbmQgKnN0YXRlYmluKiBwYWNrYWdlIGZyb20gdGhlIGF1dGhvcnMgZ2l0aHViLgoKYGBge3J9CmxpYnJhcnkocGFjbWFuKQpwX2xvYWQoInRpZHl2ZXJzZSIsICJicm9vbSIsICJjb2VmcGxvdCIsICJjb3dwbG90IiwKICAgICAgICAgICAgICAgICAiZ2FwbWluZGVyIiwgIkdHYWxseSIsICJnZ3JlcGVsIiwgImdncmlkZ2VzIiwgImdyaWRFeHRyYSIsCiAgICAgICAgICAgICAgICAgImhlcmUiLCAiaW50ZXJwbG90IiwgIm1hcmdpbnMiLCAibWFwcyIsICJtYXBwcm9qIiwKICAgICAgICAgICAgICAgICAibWFwZGF0YSIsICJNQVNTIiwgInF1YW50cmVnIiwgInJsYW5nIiwgInNjYWxlcyIsCiAgICAgICAgICAgICAgICAgInN1cnZleSIsICJzcnZ5ciIsICJ2aXJpZGlzIiwgInZpcmlkaXNMaXRlIiwgImRldnRvb2xzIiwgInNvY3ZpeiIsICJzdGF0ZWJpbnMiKQoKCiMgRW50ZXIgb25lIG9yIG1vcmUgbnVtYmVycyBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBvciBhbiBlbXB0eSBsaW5lIHRvIGNhbmNlbAojIDE6IAoKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImtqaGVhbHkvc29jdml6IikKYGBgCgoKCmBgYHtyfQpkYXRhKCJlbGVjdGlvbiIpCgplbGVjdGlvbiAlPiUgc2VsZWN0KHN0YXRlLCB0b3RhbF92b3RlLAogICAgICAgICAgICAgICAgICAgIHJfcG9pbnRzLCBwY3RfdHJ1bXAsIHBhcnR5LCBjZW5zdXMpICU+JQogICAgc2FtcGxlX24oNSkKYGBgCgpgYGB7cn0KCiMgSGV4IGNvbG9yIGNvZGVzIGZvciBEZW0gQmx1ZSBhbmQgUmVwIFJlZApwYXJ0eV9jb2xvcnMgPC0gYygiIzJFNzRDMCIsICIjQ0I0NTRBIikgCgpwMCA8LSBnZ3Bsb3QoZGF0YSA9IHN1YnNldChlbGVjdGlvbiwgc3QgJW5pbiUgIkRDIiksCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSByX3BvaW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoc3RhdGUsIHJfcG9pbnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBwYXJ0eSkpCgpwMSA8LSBwMCArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkzMCIpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDIpCgpwMiA8LSBwMSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBwYXJ0eV9jb2xvcnMpCgpwMyA8LSBwMiArIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKC0zMCwgLTIwLCAtMTAsIDAsIDEwLCAyMCwgMzAsIDQwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMzBcbiAoQ2xpbnRvbikiLCAiMjAiLCAiMTAiLCAiMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIiwgIjIwIiwgIjMwIiwgIjQwXG4oVHJ1bXApIikpCgpwMyArIGZhY2V0X3dyYXAofiBjZW5zdXMsIG5jb2w9MSwgc2NhbGVzPSJmcmVlX3kiKSArCiAgICBndWlkZXMoY29sb3I9RkFMU0UpICsgbGFicyh4ID0gIlBvaW50IE1hcmdpbiIsIHkgPSAiIikgKwogICAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTgpKQoKCmBgYAoKYGBge3J9CmxpYnJhcnkobWFwcykKdXNfc3RhdGVzIDwtIG1hcF9kYXRhKCJzdGF0ZSIpCmhlYWQodXNfc3RhdGVzKQoKZGltKHVzX3N0YXRlcykKCnAgPC0gZ2dwbG90KGRhdGEgPSB1c19zdGF0ZXMsCiAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCkpCgpwICsgZ2VvbV9wb2x5Z29uKGZpbGwgPSAid2hpdGUiLCBjb2xvciA9ICJibGFjayIpCgpwIDwtIGdncGxvdChkYXRhID0gdXNfc3RhdGVzLAogICAgICAgICAgICBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsCiAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwLCBmaWxsID0gcmVnaW9uKSkKCnAgKyBnZW9tX3BvbHlnb24oY29sb3IgPSAiZ3JheTkwIiwgc2l6ZSA9IDAuMSkgKyBndWlkZXMoZmlsbCA9IEZBTFNFKQoKcCA8LSBnZ3Bsb3QoZGF0YSA9IHVzX3N0YXRlcywKICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbG9uZywgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwLCBmaWxsID0gcmVnaW9uKSkKCnAgKyBnZW9tX3BvbHlnb24oY29sb3IgPSAiZ3JheTkwIiwgc2l6ZSA9IDAuMSkgKwogICAgY29vcmRfbWFwKHByb2plY3Rpb24gPSAiYWxiZXJzIiwgbGF0MCA9IDM5LCBsYXQxID0gNDUpICsKICAgIGd1aWRlcyhmaWxsID0gRkFMU0UpCmBgYAoKYGBge3J9CmVsZWN0aW9uJHJlZ2lvbiA8LSB0b2xvd2VyKGVsZWN0aW9uJHN0YXRlKQp1c19zdGF0ZXNfZWxlYyA8LSBsZWZ0X2pvaW4odXNfc3RhdGVzLCBlbGVjdGlvbikKCnAgPC0gZ2dwbG90KGRhdGEgPSB1c19zdGF0ZXNfZWxlYywKICAgICAgICAgICAgYWVzKHggPSBsb25nLCB5ID0gbGF0LAogICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCwgZmlsbCA9IHBhcnR5KSkKCnAgKyBnZW9tX3BvbHlnb24oY29sb3IgPSAiZ3JheTkwIiwgc2l6ZSA9IDAuMSkgKwogICAgY29vcmRfbWFwKHByb2plY3Rpb24gPSAiYWxiZXJzIiwgbGF0MCA9IDM5LCBsYXQxID0gNDUpIAoKCmBgYAoKCmBgYHtyfQpwMCA8LSBnZ3Bsb3QoZGF0YSA9IHVzX3N0YXRlc19lbGVjLAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbG9uZywgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCwgZmlsbCA9IHBhcnR5KSkKcDEgPC0gcDAgKyBnZW9tX3BvbHlnb24oY29sb3IgPSAiZ3JheTkwIiwgc2l6ZSA9IDAuMSkgKwogICAgY29vcmRfbWFwKHByb2plY3Rpb24gPSAiYWxiZXJzIiwgbGF0MCA9IDM5LCBsYXQxID0gNDUpIApwMiA8LSBwMSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhcnR5X2NvbG9ycykgKwogICAgbGFicyh0aXRsZSA9ICJFbGVjdGlvbiBSZXN1bHRzIDIwMTYiLCBmaWxsID0gTlVMTCkKcDIgKyB0aGVtZV9tYXAoKSAKYGBgCgpUcnVtcCB2b3RlIGRlZmF1bHQgY29sb3JzIG5vdCBzbyBnb29kLgoKYGBge3J9CnAwIDwtIGdncGxvdChkYXRhID0gdXNfc3RhdGVzX2VsZWMsCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gcGN0X3RydW1wKSkKCnAxIDwtIHAwICsgZ2VvbV9wb2x5Z29uKGNvbG9yID0gImdyYXk5MCIsIHNpemUgPSAwLjEpICsKICAgIGNvb3JkX21hcChwcm9qZWN0aW9uID0gImFsYmVycyIsIGxhdDAgPSAzOSwgbGF0MSA9IDQ1KSAKCnAxICsgbGFicyh0aXRsZSA9ICJUcnVtcCB2b3RlIikgKyB0aGVtZV9tYXAoKSArIGxhYnMoZmlsbCA9ICJQZXJjZW50IikKCnAyIDwtIHAxICsgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIiNDQjQ1NEEiKSArCiAgICAgICAgbGFicyh0aXRsZSA9ICJUcnVtcCB2b3RlIikgCnAyICsgdGhlbWVfbWFwKCkgKyBsYWJzKGZpbGwgPSAiUGVyY2VudCIpCmBgYAoKV2lubmluZyBwZXJjZW50YWdlLCBhZ2FpbiBkZWZhdWx0IGNvbG9ycyBhcmUgbm90IHNvIGdvb2QuCgpgYGB7cn0KcDAgPC0gZ2dwbG90KGRhdGEgPSB1c19zdGF0ZXNfZWxlYywKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBkX3BvaW50cykpCgpwMSA8LSBwMCArIGdlb21fcG9seWdvbihjb2xvciA9ICJncmF5OTAiLCBzaXplID0gMC4xKSArCiAgICBjb29yZF9tYXAocHJvamVjdGlvbiA9ICJhbGJlcnMiLCBsYXQwID0gMzksIGxhdDEgPSA0NSkgCgpwMiA8LSBwMSArIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKCkgKyBsYWJzKHRpdGxlID0gIldpbm5pbmcgbWFyZ2lucyIpIApwMiArIHRoZW1lX21hcCgpICsgbGFicyhmaWxsID0gIlBlcmNlbnQiKQoKcDMgPC0gcDEgKyBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3cgPSAicmVkIiwgbWlkID0gc2NhbGVzOjptdXRlZCgicHVycGxlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICJibHVlIiwgYnJlYWtzID0gYygtMjUsIDAsIDI1LCA1MCwgNzUpKSArCiAgICBsYWJzKHRpdGxlID0gIldpbm5pbmcgbWFyZ2lucyIpIApwMyArIHRoZW1lX21hcCgpICsgbGFicyhmaWxsID0gIlBlcmNlbnQiKQpgYGAKCldpdGhvdXQgV2FzaGluZ3RvbiBEYwoKYGBge3J9CnAwIDwtIGdncGxvdChkYXRhID0gc3Vic2V0KHVzX3N0YXRlc19lbGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gJW5pbiUgImRpc3RyaWN0IG9mIGNvbHVtYmlhIiksCiAgICAgICAgICAgICBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXAsIGZpbGwgPSBkX3BvaW50cykpCgpwMSA8LSBwMCArIGdlb21fcG9seWdvbihjb2xvciA9ICJncmF5OTAiLCBzaXplID0gMC4xKSArCiAgICBjb29yZF9tYXAocHJvamVjdGlvbiA9ICJhbGJlcnMiLCBsYXQwID0gMzksIGxhdDEgPSA0NSkgCgpwMiA8LSBwMSArIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZCA9IHNjYWxlczo6bXV0ZWQoInB1cnBsZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSAiYmx1ZSIpICsKICAgIGxhYnModGl0bGUgPSAiV2lubmluZyBtYXJnaW5zIikgCnAyICsgdGhlbWVfbWFwKCkgKyBsYWJzKGZpbGwgPSAiUGVyY2VudCIpCmBgYAoKU3RhdGViaW5zCgpgYGB7cn0KbGlicmFyeShzdGF0ZWJpbnMpCgpzdGF0ZWJpbnNfY29udGludW91cyhzdGF0ZV9kYXRhID0gZWxlY3Rpb24sIHN0YXRlX2NvbCA9ICJzdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgIHRleHRfY29sb3IgPSAid2hpdGUiLCB2YWx1ZV9jb2wgPSAicGN0X3RydW1wIiwKICAgICAgICAgICAgICAgICAgICAgYnJld2VyX3BhbD0iUmVkcyIsIGZvbnRfc2l6ZSA9IDMsCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZF90aXRsZT0iUGVyY2VudCBUcnVtcCIpCgpzdGF0ZWJpbnNfY29udGludW91cyhzdGF0ZV9kYXRhID0gc3Vic2V0KGVsZWN0aW9uLCBzdCAlbmluJSAiREMiKSwKICAgICAgICAgICAgICAgICAgICAgc3RhdGVfY29sID0gInN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgdGV4dF9jb2xvciA9ICJibGFjayIsIHZhbHVlX2NvbCA9ICJwY3RfY2xpbnRvbiIsCiAgICAgICAgICAgICAgICAgICAgIGJyZXdlcl9wYWw9IkJsdWVzIiwgZm9udF9zaXplID0gMywKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kX3RpdGxlPSJQZXJjZW50IENsaW50b24iKQpgYGAKCmBgYHtyfQplbGVjdGlvbiA8LSBlbGVjdGlvbiAlPiUgbXV0YXRlKGNvbG9yID0gcmVjb2RlKHBhcnR5LCBSZXB1YmxpY2FuID0gImRhcmtyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbW9jcmF0ID0gInJveWFsYmx1ZSIpKQoKc3RhdGViaW5zX21hbnVhbChzdGF0ZV9kYXRhID0gZWxlY3Rpb24sIHN0YXRlX2NvbCA9ICJzdCIsCiAgICAgICAgICAgICAgICAgY29sb3JfY29sID0gImNvbG9yIiwgdGV4dF9jb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgZm9udF9zaXplID0gMywgbGVnZW5kX3RpdGxlPSJXaW5uZXIiLAogICAgICAgICAgICAgICAgIGxhYmVscz1jKCJUcnVtcCIsICJDbGludG9uIiksIGxlZ2VuZF9wb3NpdGlvbiA9ICJyaWdodCIpCgpzdGF0ZWJpbnMoc3RhdGVfZGF0YSA9IGVsZWN0aW9uLCAgICAgICAgICAKICAgICAgICAgIHN0YXRlX2NvbCA9ICJzdGF0ZSIsIHZhbHVlX2NvbCA9ICJwY3RfdHJ1bXAiLAogICAgICAgICAgdGV4dF9jb2xvciA9ICJ3aGl0ZSIsIGJyZWFrcyA9IDQsCiAgICAgICAgICBsYWJlbHMgPSBjKCI0LTIxIiwgIjIxLTM3IiwgIjM3LTUzIiwgIjUzLTcwIiksCiAgICAgICAgICBicmV3ZXJfcGFsPSJSZWRzIiwgZm9udF9zaXplID0gMywgbGVnZW5kX3RpdGxlPSJQZXJjZW50IFRydW1wIikKYGBgCgo=