Economist-Style Plot using R

The graph was created by the Economist and can be replicated by using R as follows:

R Codes for Data Cleaning and Visualization

rm(list = ls())
# Package for data manipulation: 
library(tidyverse)

# Load wbstats package: 
library(wbstats)

# A list of indicators: 
my_indicator <- c("SP.DYN.TFRT.IN", "SP.POP.TOTL", "NY.GDP.PCAP.CD")

# Collect data for indicators: 

data <- wb(country = "all",
           indicator = my_indicator,
           startdate = 2017,
           enddate = 2017)

# Relabel: 

data %>% 
  select(iso3c, value, indicatorID, country) %>% 
  mutate(indicator_name = case_when(indicatorID == my_indicator[1] ~ "fertility", 
                                    indicatorID == my_indicator[2] ~ "population", 
                                    TRUE ~ "gdp")) -> data

# Country code: 

general_information <-  wb_cachelist
codes <- general_information[[1]]

codes %>% 
  select(iso3c, country, long, lat) %>% 
  filter(!is.na(long)) %>% 
  pull(iso3c) -> all_nations

# Convert to wide form for data set: 

data %>% 
  filter(iso3c %in% all_nations) %>% 
  select(-indicatorID) %>% 
  spread(key = "indicator_name", value = "value") %>% 
  na.omit() -> dfPlot

# https://www.economist.com/graphic-detail/2019/08/30/south-koreas-fertility-rate-falls-to-a-record-low

library(scales)
library(ggrepel)
library(ggthemes)

pointColor <- "#2fc1d3"
my_font <- "Ubuntu Condensed"
h1 <- 0.75
h2 <- 0.5
grey20 <- "grey20"


dfPlot %>% 
  ggplot(aes(gdp, fertility, size = population)) + 
  geom_point(show.legend = FALSE, color = pointColor, alpha = 0.5) + 
  scale_size(range = c(1, 25)) + 
  geom_hline(aes(yintercept = 2.1), color = "#e5001c", alpha = 0.6, linetype = "dashed", size = 0.6) + 
  theme_economist_white(base_family = my_font) + 
  scale_x_continuous(labels = dollar, limits = c(100, 110000), 
                     trans = "log10", expand = c(0.01, 0)) +
  scale_y_continuous(breaks = seq(0, 8, 2), limits = c(0, 9), 
                     position = "right", expand = c(0, 0)) + 
  # China + India: 
  geom_segment(data = dfPlot %>% filter(country %in% c("India", "China")), 
               aes(x = gdp, xend = gdp, y = fertility, yend = fertility - h1), 
               size = 0.5) + 
  geom_point(data = dfPlot %>% filter(country %in% c("India", "China")), 
             aes(x = gdp, y = fertility, size = population), shape = 21, 
             fill = pointColor, show.legend = FALSE) + 
  geom_text_repel(data = dfPlot %>% filter(country %in% c("India", "China")), 
                  aes(x = gdp, y = fertility - h1, label = country), 
                  nudge_x = -0.3, direction = "x", size = 4.5, family = my_font) + 
  # Thailand: 
  geom_text_repel(data = dfPlot %>% filter(country == "Thailand"), 
                  aes(x = gdp, y = fertility, label = country), 
                  direction = "x", nudge_x = -0.25, size = 4.5, family = my_font) + 
  geom_point(data = dfPlot %>% filter(country == "Thailand"), 
             aes(x = gdp, y = fertility, size = population), shape = 21, 
             fill = pointColor, show.legend = FALSE) + 
  # Vietnam: 
  geom_segment(data = dfPlot %>% filter(country == "Vietnam"),
               aes(x = gdp, xend = gdp, y = fertility, yend = fertility - 1.2),
               size = 0.5)  +
  geom_point(data = dfPlot %>% filter(country == "Vietnam"), 
             aes(x = gdp, y = fertility, size = population), shape = 21, 
             fill = pointColor, show.legend = FALSE) + 
  geom_text_repel(data = dfPlot %>% filter(country == "Vietnam"),
                  aes(x = gdp, y = fertility - 1.1, label = country),
                  direction = "y", nudge_y = -0.05, size = 4.5, family = my_font, fontface = "bold") +
  # United States: 
  geom_segment(data = dfPlot %>% filter(country == "United States"), 
               aes(x = gdp, xend = gdp, y = fertility, yend = fertility + 0.3), 
               size = 0.5) + 
  geom_point(data = dfPlot %>% filter(country == "United States"), 
             aes(x = gdp, y = fertility, size = population), shape = 21, 
             fill = pointColor, show.legend = FALSE) +
  geom_text_repel(data = dfPlot %>% filter(country == "United States"),
                  aes(x = gdp, y = fertility + 0.3, label = country),
                  nudge_y = 0.4, direction = "y", size = 4.5, family = my_font) +
  # Singapore: 
  geom_segment(data = dfPlot %>% filter(country == "Singapore"), 
               aes(x = gdp, xend = gdp, y = fertility, yend = fertility - h2), 
               size = 0.5) + 
  geom_point(data = dfPlot %>% filter(country == "Singapore"), 
             aes(x = gdp, y = fertility, size = population), shape = 21, 
             fill = pointColor, show.legend = FALSE) + 
  geom_text_repel(data = dfPlot %>% filter(country == "Singapore"), 
                  aes(x = gdp, y = fertility - h2, label = country), 
                  nudge_x = -0.3, direction = "x", size = 4.5, family = my_font) + 
  # Japan: 
  geom_segment(data = dfPlot %>% filter(country == "Japan"), 
               aes(x = gdp, xend = gdp, y = fertility, yend = fertility + 1.3), 
               size = 0.5) + 
  geom_point(data = dfPlot %>% filter(country == "Japan"), 
             aes(x = gdp, y = fertility, size = population), shape = 21, 
             fill = pointColor, show.legend = FALSE) + 
  geom_text_repel(data = dfPlot %>% filter(country == "Japan"), 
                  aes(x = gdp, y = fertility + 1.3, label = country), 
                  nudge_x = -0.2, direction = "x", size = 4.6, family = my_font) + 
  # Niger: 
  geom_text_repel(data = dfPlot %>% filter(country == "Niger"), 
                  aes(x = gdp, y = fertility, label = country), 
                  direction = "x", nudge_x = 0.2, size = 4.5, family = my_font) + 
  geom_point(data = dfPlot %>% filter(country == "Niger"), 
             aes(x = gdp, y = fertility, size = population), shape = 21, 
             fill = pointColor, show.legend = FALSE) + 
  theme(plot.background = element_rect(fill = "white")) + 
  theme(plot.margin = unit(c(1, 1, 1, 0.8), "cm")) + 
  theme(axis.text.y = element_blank()) + 
  theme(axis.title.y = element_blank()) + 
  labs(x = "GDP per capital, $, log scale", 
       title = "Gone baby gone", 
       subtitle = "GDP and fertility, 2017", 
       caption = "Source: United Nations; World Bank") + 
  theme(plot.title = element_text(size = 20), 
        plot.subtitle = element_text(size = 15), 
        plot.caption = element_text(size = 11, colour = "grey30")) + 
  theme(axis.ticks.length.x = unit(2, "mm")) + 
  theme(axis.title.x = element_text(size = 14, color = "grey10"), 
        axis.text.x = element_text(size = 14, color = "grey20")) + 
  annotate("text", x = 110000, y = seq(0, 8, 2) + 0.2, label = seq(0, 8, 2), family = my_font, size = 5, color = "grey20") + 
  annotate("text", x = 110000, y = 8.7, label = "Fertility rate", family = my_font, size = 5, color = "grey10", hjust = 1) + 
  annotate("text", x = 100, y = 2.35, label = "Replacement fertility level", 
           family = "Arial Narrow", size = 5, color = "#e5001c", hjust = -0.02, alpha = 0.7)


library(grid)
grid.rect(x = 1, y = 0.995, hjust = 0.97, vjust = 0, gp = gpar(fill = "#e5001c", lwd = 0))
grid.rect(x = 0.05, y = 0.97, hjust = 0.97, vjust = 0, gp = gpar(fill = "#e5001c", lwd = 0))
LS0tCnRpdGxlOiAiVmlldG5hbSDigJlzIGZlcnRpbGl0eSByYXRlIgphdXRob3I6ICdOZ3V5ZW4gQ2hpIER1bmcnCnN1YnRpdGxlOiAiRGFpbHkgR3JhcGggU2VyaWVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAjICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgICMgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiAiZmxhdGx5IgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYpCmBgYAoKIyBFY29ub21pc3QtU3R5bGUgUGxvdCB1c2luZyBSCgpUaGUgZ3JhcGggd2FzIGNyZWF0ZWQgYnkgW3RoZSBFY29ub21pc3RdKGh0dHBzOi8vd3d3LmVjb25vbWlzdC5jb20vZ3JhcGhpYy1kZXRhaWwvMjAxOS8wOC8zMC9zb3V0aC1rb3JlYXMtZmVydGlsaXR5LXJhdGUtZmFsbHMtdG8tYS1yZWNvcmQtbG93KSBhbmQgY2FuIGJlIHJlcGxpY2F0ZWQgYnkgdXNpbmcgUiBhcyBmb2xsb3dzOiAKICAKIVtdKC9ob21lL2toYW5oYW4vRmVydGlsaXR5LnBuZykKCgojIFIgQ29kZXMgZm9yIERhdGEgQ2xlYW5pbmcgYW5kIFZpc3VhbGl6YXRpb24KCgpgYGB7ciwgZXZhbD1GQUxTRX0KCnJtKGxpc3QgPSBscygpKQojIFBhY2thZ2UgZm9yIGRhdGEgbWFuaXB1bGF0aW9uOiAKbGlicmFyeSh0aWR5dmVyc2UpCgojIExvYWQgd2JzdGF0cyBwYWNrYWdlOiAKbGlicmFyeSh3YnN0YXRzKQoKIyBBIGxpc3Qgb2YgaW5kaWNhdG9yczogCm15X2luZGljYXRvciA8LSBjKCJTUC5EWU4uVEZSVC5JTiIsICJTUC5QT1AuVE9UTCIsICJOWS5HRFAuUENBUC5DRCIpCgojIENvbGxlY3QgZGF0YSBmb3IgaW5kaWNhdG9yczogCgpkYXRhIDwtIHdiKGNvdW50cnkgPSAiYWxsIiwKICAgICAgICAgICBpbmRpY2F0b3IgPSBteV9pbmRpY2F0b3IsCiAgICAgICAgICAgc3RhcnRkYXRlID0gMjAxNywKICAgICAgICAgICBlbmRkYXRlID0gMjAxNykKCiMgUmVsYWJlbDogCgpkYXRhICU+JSAKICBzZWxlY3QoaXNvM2MsIHZhbHVlLCBpbmRpY2F0b3JJRCwgY291bnRyeSkgJT4lIAogIG11dGF0ZShpbmRpY2F0b3JfbmFtZSA9IGNhc2Vfd2hlbihpbmRpY2F0b3JJRCA9PSBteV9pbmRpY2F0b3JbMV0gfiAiZmVydGlsaXR5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvcklEID09IG15X2luZGljYXRvclsyXSB+ICJwb3B1bGF0aW9uIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZ2RwIikpIC0+IGRhdGEKCiMgQ291bnRyeSBjb2RlOiAKCmdlbmVyYWxfaW5mb3JtYXRpb24gPC0gIHdiX2NhY2hlbGlzdApjb2RlcyA8LSBnZW5lcmFsX2luZm9ybWF0aW9uW1sxXV0KCmNvZGVzICU+JSAKICBzZWxlY3QoaXNvM2MsIGNvdW50cnksIGxvbmcsIGxhdCkgJT4lIAogIGZpbHRlcighaXMubmEobG9uZykpICU+JSAKICBwdWxsKGlzbzNjKSAtPiBhbGxfbmF0aW9ucwoKIyBDb252ZXJ0IHRvIHdpZGUgZm9ybSBmb3IgZGF0YSBzZXQ6IAoKZGF0YSAlPiUgCiAgZmlsdGVyKGlzbzNjICVpbiUgYWxsX25hdGlvbnMpICU+JSAKICBzZWxlY3QoLWluZGljYXRvcklEKSAlPiUgCiAgc3ByZWFkKGtleSA9ICJpbmRpY2F0b3JfbmFtZSIsIHZhbHVlID0gInZhbHVlIikgJT4lIAogIG5hLm9taXQoKSAtPiBkZlBsb3QKCiMgaHR0cHM6Ly93d3cuZWNvbm9taXN0LmNvbS9ncmFwaGljLWRldGFpbC8yMDE5LzA4LzMwL3NvdXRoLWtvcmVhcy1mZXJ0aWxpdHktcmF0ZS1mYWxscy10by1hLXJlY29yZC1sb3cKCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkoZ2d0aGVtZXMpCgpwb2ludENvbG9yIDwtICIjMmZjMWQzIgpteV9mb250IDwtICJVYnVudHUgQ29uZGVuc2VkIgpoMSA8LSAwLjc1CmgyIDwtIDAuNQpncmV5MjAgPC0gImdyZXkyMCIKCgpkZlBsb3QgJT4lIAogIGdncGxvdChhZXMoZ2RwLCBmZXJ0aWxpdHksIHNpemUgPSBwb3B1bGF0aW9uKSkgKyAKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UsIGNvbG9yID0gcG9pbnRDb2xvciwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMSwgMjUpKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSAyLjEpLCBjb2xvciA9ICIjZTUwMDFjIiwgYWxwaGEgPSAwLjYsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAwLjYpICsgCiAgdGhlbWVfZWNvbm9taXN0X3doaXRlKGJhc2VfZmFtaWx5ID0gbXlfZm9udCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyLCBsaW1pdHMgPSBjKDEwMCwgMTEwMDAwKSwgCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwgZXhwYW5kID0gYygwLjAxLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgOCwgMiksIGxpbWl0cyA9IGMoMCwgOSksIAogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJyaWdodCIsIGV4cGFuZCA9IGMoMCwgMCkpICsgCiAgIyBDaGluYSArIEluZGlhOiAKICBnZW9tX3NlZ21lbnQoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJJbmRpYSIsICJDaGluYSIpKSwgCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB4ZW5kID0gZ2RwLCB5ID0gZmVydGlsaXR5LCB5ZW5kID0gZmVydGlsaXR5IC0gaDEpLCAKICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ICVpbiUgYygiSW5kaWEiLCAiQ2hpbmEiKSksIAogICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHksIHNpemUgPSBwb3B1bGF0aW9uKSwgc2hhcGUgPSAyMSwgCiAgICAgICAgICAgICBmaWxsID0gcG9pbnRDb2xvciwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJJbmRpYSIsICJDaGluYSIpKSwgCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB5ID0gZmVydGlsaXR5IC0gaDEsIGxhYmVsID0gY291bnRyeSksIAogICAgICAgICAgICAgICAgICBudWRnZV94ID0gLTAuMywgZGlyZWN0aW9uID0gIngiLCBzaXplID0gNC41LCBmYW1pbHkgPSBteV9mb250KSArIAogICMgVGhhaWxhbmQ6IAogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gZGZQbG90ICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSwgCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB5ID0gZmVydGlsaXR5LCBsYWJlbCA9IGNvdW50cnkpLCAKICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIngiLCBudWRnZV94ID0gLTAuMjUsIHNpemUgPSA0LjUsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgZ2VvbV9wb2ludChkYXRhID0gZGZQbG90ICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgc2l6ZSA9IHBvcHVsYXRpb24pLCBzaGFwZSA9IDIxLCAKICAgICAgICAgICAgIGZpbGwgPSBwb2ludENvbG9yLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICMgVmlldG5hbTogCiAgZ2VvbV9zZWdtZW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJWaWV0bmFtIiksCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB4ZW5kID0gZ2RwLCB5ID0gZmVydGlsaXR5LCB5ZW5kID0gZmVydGlsaXR5IC0gMS4yKSwKICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSkgICsKICBnZW9tX3BvaW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJWaWV0bmFtIiksIAogICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHksIHNpemUgPSBwb3B1bGF0aW9uKSwgc2hhcGUgPSAyMSwgCiAgICAgICAgICAgICBmaWxsID0gcG9pbnRDb2xvciwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlZpZXRuYW0iKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHkgLSAxLjEsIGxhYmVsID0gY291bnRyeSksCiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ5IiwgbnVkZ2VfeSA9IC0wLjA1LCBzaXplID0gNC41LCBmYW1pbHkgPSBteV9mb250LCBmb250ZmFjZSA9ICJib2xkIikgKwogICMgVW5pdGVkIFN0YXRlczogCiAgZ2VvbV9zZWdtZW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIiksIAogICAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeGVuZCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgeWVuZCA9IGZlcnRpbGl0eSArIDAuMyksIAogICAgICAgICAgICAgICBzaXplID0gMC41KSArIAogIGdlb21fcG9pbnQoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgc2l6ZSA9IHBvcHVsYXRpb24pLCBzaGFwZSA9IDIxLCAKICAgICAgICAgICAgIGZpbGwgPSBwb2ludENvbG9yLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIiksCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB5ID0gZmVydGlsaXR5ICsgMC4zLCBsYWJlbCA9IGNvdW50cnkpLAogICAgICAgICAgICAgICAgICBudWRnZV95ID0gMC40LCBkaXJlY3Rpb24gPSAieSIsIHNpemUgPSA0LjUsIGZhbWlseSA9IG15X2ZvbnQpICsKICAjIFNpbmdhcG9yZTogCiAgZ2VvbV9zZWdtZW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJTaW5nYXBvcmUiKSwgCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB4ZW5kID0gZ2RwLCB5ID0gZmVydGlsaXR5LCB5ZW5kID0gZmVydGlsaXR5IC0gaDIpLCAKICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJTaW5nYXBvcmUiKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgc2l6ZSA9IHBvcHVsYXRpb24pLCBzaGFwZSA9IDIxLCAKICAgICAgICAgICAgIGZpbGwgPSBwb2ludENvbG9yLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gZGZQbG90ICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiU2luZ2Fwb3JlIiksIAogICAgICAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSAtIGgyLCBsYWJlbCA9IGNvdW50cnkpLCAKICAgICAgICAgICAgICAgICAgbnVkZ2VfeCA9IC0wLjMsIGRpcmVjdGlvbiA9ICJ4Iiwgc2l6ZSA9IDQuNSwgZmFtaWx5ID0gbXlfZm9udCkgKyAKICAjIEphcGFuOiAKICBnZW9tX3NlZ21lbnQoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIiksIAogICAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeGVuZCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgeWVuZCA9IGZlcnRpbGl0eSArIDEuMyksIAogICAgICAgICAgICAgICBzaXplID0gMC41KSArIAogIGdlb21fcG9pbnQoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIiksIAogICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHksIHNpemUgPSBwb3B1bGF0aW9uKSwgc2hhcGUgPSAyMSwgCiAgICAgICAgICAgICBmaWxsID0gcG9pbnRDb2xvciwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIiksIAogICAgICAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSArIDEuMywgbGFiZWwgPSBjb3VudHJ5KSwgCiAgICAgICAgICAgICAgICAgIG51ZGdlX3ggPSAtMC4yLCBkaXJlY3Rpb24gPSAieCIsIHNpemUgPSA0LjYsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgIyBOaWdlcjogCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJOaWdlciIpLCAKICAgICAgICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHksIGxhYmVsID0gY291bnRyeSksIAogICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAieCIsIG51ZGdlX3ggPSAwLjIsIHNpemUgPSA0LjUsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgZ2VvbV9wb2ludChkYXRhID0gZGZQbG90ICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiTmlnZXIiKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgc2l6ZSA9IHBvcHVsYXRpb24pLCBzaGFwZSA9IDIxLCAKICAgICAgICAgICAgIGZpbGwgPSBwb2ludENvbG9yLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikpICsgCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMSwgMC44KSwgImNtIikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnMoeCA9ICJHRFAgcGVyIGNhcGl0YWwsICQsIGxvZyBzY2FsZSIsIAogICAgICAgdGl0bGUgPSAiR29uZSBiYWJ5IGdvbmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkdEUCBhbmQgZmVydGlsaXR5LCAyMDE3IiwgCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogVW5pdGVkIE5hdGlvbnM7IFdvcmxkIEJhbmsiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwgCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAKICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBjb2xvdXIgPSAiZ3JleTMwIikpICsgCiAgdGhlbWUoYXhpcy50aWNrcy5sZW5ndGgueCA9IHVuaXQoMiwgIm1tIikpICsgCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiZ3JleTEwIiksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiZ3JleTIwIikpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTEwMDAwLCB5ID0gc2VxKDAsIDgsIDIpICsgMC4yLCBsYWJlbCA9IHNlcSgwLCA4LCAyKSwgZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDUsIGNvbG9yID0gImdyZXkyMCIpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTEwMDAwLCB5ID0gOC43LCBsYWJlbCA9ICJGZXJ0aWxpdHkgcmF0ZSIsIGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSA1LCBjb2xvciA9ICJncmV5MTAiLCBoanVzdCA9IDEpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTAwLCB5ID0gMi4zNSwgbGFiZWwgPSAiUmVwbGFjZW1lbnQgZmVydGlsaXR5IGxldmVsIiwgCiAgICAgICAgICAgZmFtaWx5ID0gIkFyaWFsIE5hcnJvdyIsIHNpemUgPSA1LCBjb2xvciA9ICIjZTUwMDFjIiwgaGp1c3QgPSAtMC4wMiwgYWxwaGEgPSAwLjcpCgoKbGlicmFyeShncmlkKQpncmlkLnJlY3QoeCA9IDEsIHkgPSAwLjk5NSwgaGp1c3QgPSAwLjk3LCB2anVzdCA9IDAsIGdwID0gZ3BhcihmaWxsID0gIiNlNTAwMWMiLCBsd2QgPSAwKSkKZ3JpZC5yZWN0KHggPSAwLjA1LCB5ID0gMC45NywgaGp1c3QgPSAwLjk3LCB2anVzdCA9IDAsIGdwID0gZ3BhcihmaWxsID0gIiNlNTAwMWMiLCBsd2QgPSAwKSkKCmBgYAoKCg==