This is an analysis of the margin of victory in the 2016 U.S. Presidential Election. The workings of the U.S. Electoral college mean that narrow victories in key states can have a large impact on election results. This analysis explores how many votes really decided the election.

library(rvest)
library(tidyverse)
library(ggplot2)
library(testthat)

wiki <- read_html(paste0("https://en.wikipedia.org/wiki/",
                         "United_States_presidential_election,_2016"))
wiki_table <- html_node(wiki, 
                        xpath = '//*[@id="mw-content-text"]/div[38]/table') %>%
  html_table()
# drop secondary header and total rows, keep popular and electoral vote counts
eresults_raw <- setNames(wiki_table[c(-1, -58), c(1, 3, 5, 6, 8)],
                     c("state", "h_popular", "h_electoral", "t_popular",
                       "t_electoral"))
eresults_raw %>% 
  mutate_each(funs(as.numeric(gsub(",", "", .))), -state) %>%
  mutate(margin = abs(h_popular - t_popular), 
         votes = pmax(h_electoral, t_electoral, na.rm = TRUE)) %>%
  left_join(tibble(state = state.name, st = state.abb), by = "state") ->
  eresults
NAs introduced by coercionNAs introduced by coercion
weird_names <- c("District of Columbia", "Maine (at-large)", "Maine, 1st", 
                "Maine, 2nd", "Nebraska (at-lrg)", "Nebraska, 1st", 
                "Nebraska, 2nd", "Nebraska, 3rd")
eresults$st[match(c(weird_names) , eresults$state)] <- 
  c("DC", "ME", "ME1", "ME2", "NE", "NE1", "NE2", "NE3")
# district electoral college votes not conseuqnetial to this analysis, going to treat them as WTA
# for viz clarity
eresults$h_electoral[match("ME", eresults$st)] <- 
  sum(eresults$h_electoral[grep("ME", eresults$st)], na.rm = T)
# no votes for Hillary in NE, avaoid chaing NA to 0
# eresults$h_electoral[match("NE", eresults$st)] <- 
#   sum(eresults$h_electoral[grep("NE", eresults$st)], na.rm = T)
eresults$t_electoral[match("ME", eresults$st)] <- 
  sum(eresults$t_electoral[grep("ME", eresults$st)], na.rm = T)
eresults$t_electoral[match("NE", eresults$st)] <- 
  sum(eresults$t_electoral[grep("NE", eresults$st)], na.rm = T)
eresults <- filter(eresults, 
                   !st %in% c("ME1", "ME2", "NE1", "NE2", "NE3"))
eresults$votes[match("ME", eresults$st)] <- 
  sum(eresults[match("ME", eresults$st), c("h_electoral", "t_electoral")], na.rm = T)
eresults$votes[match("NE", eresults$st)] <- 
  sum(eresults[match("NE", eresults$st), c("h_electoral", "t_electoral")], na.rm = T)
# some calcs for plotting
eresults <- eresults %>%
  mutate(winner = ifelse(is.na(h_electoral), "Trump", "Clinton"),
         smargin = t_popular - h_popular) %>%
  arrange(-1 * smargin) %>%
  mutate(cum_vote  = cumsum(votes)) 
test_that("Electoral votes checksum", {
  expect_equal(
    sum(eresults$votes), 
    sum(eresults$h_electoral, na.rm = TRUE) + 
      sum(eresults$t_electoral, na.rm = TRUE)
  )
  expect_equal(sum(eresults$votes), 538)
})
eresults

flip_votes <- eresults %>%
  filter(st %in% c("MI", "WI", "PA")) %>%
  summarize(margin = sum(margin),
            cum_vote = max(cum_vote),
            votes = sum(votes)) %>%
  mutate(smargin = 0, winner = "Clinton")
margin_of_victory <- function(x) {
  paste0("Total Margin of Victory:\n", 
        prettyNum(x, big.mark = ","),
        " votes")
}
big_pretty_num <- function(x, short = FALSE) {
  m_lab <- ifelse(short, "M", " Million")
  k_lab <- ifelse(short, "K", " Thousand")
  x <- abs(x)
  p <- log10(x)
  labs <- ifelse(
    p >= 6, 
    paste0(signif(x / 1e6, 2), m_lab),
    paste0(signif(x / 1e3, 2), k_lab)
  )
  labs[x == 0] <- ""
  labs
}
plt <- eresults %>%
  ggplot(aes(xmin = cum_vote - votes, xmax = cum_vote,
             ymin = 0, ymax = smargin, 
             fill = winner)) +
  # 270 threshold
  geom_vline(xintercept = 270, size = 4,
             color = "grey90") +
  # margin bars
  geom_rect(aes(color = winner)) +
  # margin labels
  geom_text(aes(label = big_pretty_num(margin, TRUE),
                x = cum_vote - votes / 2, 
                y = smargin + 5e4 * ifelse(winner == "Trump", 1, -1)),
            data = filter(eresults, st %in% c("MI", "WI", "PA")),
            size = 2.5) +
  # State labels
  geom_text(aes(label = st, x = cum_vote - votes / 2,
                y = 100000 * ifelse(winner == "Trump", -1, 1)),
            angle = 90, size = 2.5) +
  # Margin of victory
  geom_errorbarh(aes(y = 2.3e5, x = cum_vote), data = flip_votes,
                 height = 1e5, size = 2) +
  geom_text(aes(y = 4.5e5, x = cum_vote - votes / 2, 
                label = margin_of_victory(margin)), 
            data = flip_votes, size = 4.5, fontface = "bold") +
  scale_x_continuous(labels = function(x) ifelse(x <= 270, x, 538 - x),
                     breaks = c(seq(0, 225, by = 75), 270,
                                rev(seq(538, 270, by = -75)))) +
  scale_y_continuous(labels = big_pretty_num,
                     breaks = c(-4e6, -2e6, -1e6, -5e5, -2.5e5, -5e4,
                                0, 5e4, 2.5e5, 5e5, 1e6),
                     minor_breaks = NULL) +
  coord_cartesian(ylim = c(-2e6, 1e6)) +
  scale_fill_manual(values = c("steelblue2", "tomato3")) +
  scale_color_manual(values = c("dodgerblue3", "firebrick4")) +
  theme_minimal() +
  theme(legend.position = "none",
        title = element_text(size = 18),
        axis.text = element_text(size = 13)) +
  labs(x = "Electoral College Votes",
       y = "Popular Vote Margin of Victory",
       title = "2016 U.S. Presidential Election Results",
       subtitle = "State Wins by Margin of Victory") +
  annotate("text", x = c(112.5, 538 - 112.5), y = c(-3e5, 3e5), 
           label = paste("States Won by", c("Trump", "Clinton")),
           size = 4) +
  annotate("text", x = 510.5, y = -2.05e6, size = 3, 
           label = "CA Truncated:\n4.3 Million") +
  annotate("text", x = 0, y = -2e6, color = "grey90", size = 6,
           label = "@DATATITIAN", hjust = 0, vjust = 0.9, fontface = "bold")
  
png("electionmargin.png", width = 10, height = 6, units = "in", res = 150)
print(plt)
invisible(dev.off())
plt

LS0tDQp0aXRsZTogIjIwMTYgRWxlY3Rpb24gTWFyZ2luIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KVGhpcyBpcyBhbiBhbmFseXNpcyBvZiB0aGUgbWFyZ2luIG9mIHZpY3RvcnkgaW4gdGhlIDIwMTYgVS5TLiBQcmVzaWRlbnRpYWwNCkVsZWN0aW9uLiBUaGUgd29ya2luZ3Mgb2YgdGhlIFUuUy4gRWxlY3RvcmFsIGNvbGxlZ2UgbWVhbiB0aGF0IG5hcnJvdyB2aWN0b3JpZXMgDQppbiBrZXkgc3RhdGVzIGNhbiBoYXZlIGEgbGFyZ2UgaW1wYWN0IG9uIGVsZWN0aW9uIHJlc3VsdHMuIFRoaXMgYW5hbHlzaXMNCmV4cGxvcmVzIGhvdyBtYW55IHZvdGVzIHJlYWxseSBkZWNpZGVkIHRoZSBlbGVjdGlvbi4gDQoNCmBgYHtyIHNldHVwLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0ZXN0dGhhdCkNCg0Kd2lraSA8LSByZWFkX2h0bWwocGFzdGUwKCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJVbml0ZWRfU3RhdGVzX3ByZXNpZGVudGlhbF9lbGVjdGlvbixfMjAxNiIpKQ0Kd2lraV90YWJsZSA8LSBodG1sX25vZGUod2lraSwgDQogICAgICAgICAgICAgICAgICAgICAgICB4cGF0aCA9ICcvLypbQGlkPSJtdy1jb250ZW50LXRleHQiXS9kaXZbMzhdL3RhYmxlJykgJT4lDQogIGh0bWxfdGFibGUoKQ0KDQpgYGANCg0KDQpgYGB7ciBtdW5nZX0NCg0KIyBkcm9wIHNlY29uZGFyeSBoZWFkZXIgYW5kIHRvdGFsIHJvd3MsIGtlZXAgcG9wdWxhciBhbmQgZWxlY3RvcmFsIHZvdGUgY291bnRzDQplcmVzdWx0c19yYXcgPC0gc2V0TmFtZXMod2lraV90YWJsZVtjKC0xLCAtNTgpLCBjKDEsIDMsIDUsIDYsIDgpXSwNCiAgICAgICAgICAgICAgICAgICAgIGMoInN0YXRlIiwgImhfcG9wdWxhciIsICJoX2VsZWN0b3JhbCIsICJ0X3BvcHVsYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAidF9lbGVjdG9yYWwiKSkNCmVyZXN1bHRzX3JhdyAlPiUgDQogIG11dGF0ZV9lYWNoKGZ1bnMoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIC4pKSksIC1zdGF0ZSkgJT4lDQogIG11dGF0ZShtYXJnaW4gPSBhYnMoaF9wb3B1bGFyIC0gdF9wb3B1bGFyKSwgDQogICAgICAgICB2b3RlcyA9IHBtYXgoaF9lbGVjdG9yYWwsIHRfZWxlY3RvcmFsLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgbGVmdF9qb2luKHRpYmJsZShzdGF0ZSA9IHN0YXRlLm5hbWUsIHN0ID0gc3RhdGUuYWJiKSwgYnkgPSAic3RhdGUiKSAtPg0KICBlcmVzdWx0cw0KDQp3ZWlyZF9uYW1lcyA8LSBjKCJEaXN0cmljdCBvZiBDb2x1bWJpYSIsICJNYWluZSAoYXQtbGFyZ2UpIiwgIk1haW5lLCAxc3QiLCANCiAgICAgICAgICAgICAgICAiTWFpbmUsIDJuZCIsICJOZWJyYXNrYSAoYXQtbHJnKSIsICJOZWJyYXNrYSwgMXN0IiwgDQogICAgICAgICAgICAgICAgIk5lYnJhc2thLCAybmQiLCAiTmVicmFza2EsIDNyZCIpDQplcmVzdWx0cyRzdFttYXRjaChjKHdlaXJkX25hbWVzKSAsIGVyZXN1bHRzJHN0YXRlKV0gPC0gDQogIGMoIkRDIiwgIk1FIiwgIk1FMSIsICJNRTIiLCAiTkUiLCAiTkUxIiwgIk5FMiIsICJORTMiKQ0KDQojIGRpc3RyaWN0IGVsZWN0b3JhbCBjb2xsZWdlIHZvdGVzIG5vdCBjb25zZXVxbmV0aWFsIHRvIHRoaXMgYW5hbHlzaXMsIGdvaW5nIHRvIHRyZWF0IHRoZW0gYXMgV1RBDQojIGZvciB2aXogY2xhcml0eQ0KZXJlc3VsdHMkaF9lbGVjdG9yYWxbbWF0Y2goIk1FIiwgZXJlc3VsdHMkc3QpXSA8LSANCiAgc3VtKGVyZXN1bHRzJGhfZWxlY3RvcmFsW2dyZXAoIk1FIiwgZXJlc3VsdHMkc3QpXSwgbmEucm0gPSBUKQ0KIyBubyB2b3RlcyBmb3IgSGlsbGFyeSBpbiBORSwgYXZhb2lkIGNoYWluZyBOQSB0byAwDQojIGVyZXN1bHRzJGhfZWxlY3RvcmFsW21hdGNoKCJORSIsIGVyZXN1bHRzJHN0KV0gPC0gDQojICAgc3VtKGVyZXN1bHRzJGhfZWxlY3RvcmFsW2dyZXAoIk5FIiwgZXJlc3VsdHMkc3QpXSwgbmEucm0gPSBUKQ0KDQplcmVzdWx0cyR0X2VsZWN0b3JhbFttYXRjaCgiTUUiLCBlcmVzdWx0cyRzdCldIDwtIA0KICBzdW0oZXJlc3VsdHMkdF9lbGVjdG9yYWxbZ3JlcCgiTUUiLCBlcmVzdWx0cyRzdCldLCBuYS5ybSA9IFQpDQplcmVzdWx0cyR0X2VsZWN0b3JhbFttYXRjaCgiTkUiLCBlcmVzdWx0cyRzdCldIDwtIA0KICBzdW0oZXJlc3VsdHMkdF9lbGVjdG9yYWxbZ3JlcCgiTkUiLCBlcmVzdWx0cyRzdCldLCBuYS5ybSA9IFQpDQoNCmVyZXN1bHRzIDwtIGZpbHRlcihlcmVzdWx0cywgDQogICAgICAgICAgICAgICAgICAgIXN0ICVpbiUgYygiTUUxIiwgIk1FMiIsICJORTEiLCAiTkUyIiwgIk5FMyIpKQ0KDQplcmVzdWx0cyR2b3Rlc1ttYXRjaCgiTUUiLCBlcmVzdWx0cyRzdCldIDwtIA0KICBzdW0oZXJlc3VsdHNbbWF0Y2goIk1FIiwgZXJlc3VsdHMkc3QpLCBjKCJoX2VsZWN0b3JhbCIsICJ0X2VsZWN0b3JhbCIpXSwgbmEucm0gPSBUKQ0KZXJlc3VsdHMkdm90ZXNbbWF0Y2goIk5FIiwgZXJlc3VsdHMkc3QpXSA8LSANCiAgc3VtKGVyZXN1bHRzW21hdGNoKCJORSIsIGVyZXN1bHRzJHN0KSwgYygiaF9lbGVjdG9yYWwiLCAidF9lbGVjdG9yYWwiKV0sIG5hLnJtID0gVCkNCg0KIyBzb21lIGNhbGNzIGZvciBwbG90dGluZw0KZXJlc3VsdHMgPC0gZXJlc3VsdHMgJT4lDQogIG11dGF0ZSh3aW5uZXIgPSBpZmVsc2UoaXMubmEoaF9lbGVjdG9yYWwpLCAiVHJ1bXAiLCAiQ2xpbnRvbiIpLA0KICAgICAgICAgc21hcmdpbiA9IHRfcG9wdWxhciAtIGhfcG9wdWxhcikgJT4lDQogIGFycmFuZ2UoLTEgKiBzbWFyZ2luKSAlPiUNCiAgbXV0YXRlKGN1bV92b3RlICA9IGN1bXN1bSh2b3RlcykpIA0KDQoNCnRlc3RfdGhhdCgiRWxlY3RvcmFsIHZvdGVzIGNoZWNrc3VtIiwgew0KICBleHBlY3RfZXF1YWwoDQogICAgc3VtKGVyZXN1bHRzJHZvdGVzKSwgDQogICAgc3VtKGVyZXN1bHRzJGhfZWxlY3RvcmFsLCBuYS5ybSA9IFRSVUUpICsgDQogICAgICBzdW0oZXJlc3VsdHMkdF9lbGVjdG9yYWwsIG5hLnJtID0gVFJVRSkNCiAgKQ0KICBleHBlY3RfZXF1YWwoc3VtKGVyZXN1bHRzJHZvdGVzKSwgNTM4KQ0KfSkNCg0KZXJlc3VsdHMNCmBgYA0KDQpgYGB7ciBleHBsb3JlfQ0KDQpoaXN0KGVyZXN1bHRzJG1hcmdpbikNCmhpc3QobG9nMTAoZXJlc3VsdHMkbWFyZ2luKSkNCg0KYGBgDQoNCmBgYHtyIHZpeiwgZmlnLndpZHRoPTEwfQ0KDQpmbGlwX3ZvdGVzIDwtIGVyZXN1bHRzICU+JQ0KICBmaWx0ZXIoc3QgJWluJSBjKCJNSSIsICJXSSIsICJQQSIpKSAlPiUNCiAgc3VtbWFyaXplKG1hcmdpbiA9IHN1bShtYXJnaW4pLA0KICAgICAgICAgICAgY3VtX3ZvdGUgPSBtYXgoY3VtX3ZvdGUpLA0KICAgICAgICAgICAgdm90ZXMgPSBzdW0odm90ZXMpKSAlPiUNCiAgbXV0YXRlKHNtYXJnaW4gPSAwLCB3aW5uZXIgPSAiQ2xpbnRvbiIpDQoNCm1hcmdpbl9vZl92aWN0b3J5IDwtIGZ1bmN0aW9uKHgpIHsNCiAgcGFzdGUwKCJUb3RhbCBNYXJnaW4gb2YgVmljdG9yeTpcbiIsIA0KICAgICAgICBwcmV0dHlOdW0oeCwgYmlnLm1hcmsgPSAiLCIpLA0KICAgICAgICAiIHZvdGVzIikNCn0NCg0KYmlnX3ByZXR0eV9udW0gPC0gZnVuY3Rpb24oeCwgc2hvcnQgPSBGQUxTRSkgew0KICBtX2xhYiA8LSBpZmVsc2Uoc2hvcnQsICJNIiwgIiBNaWxsaW9uIikNCiAga19sYWIgPC0gaWZlbHNlKHNob3J0LCAiSyIsICIgVGhvdXNhbmQiKQ0KICB4IDwtIGFicyh4KQ0KICBwIDwtIGxvZzEwKHgpDQogIGxhYnMgPC0gaWZlbHNlKA0KICAgIHAgPj0gNiwgDQogICAgcGFzdGUwKHNpZ25pZih4IC8gMWU2LCAyKSwgbV9sYWIpLA0KICAgIHBhc3RlMChzaWduaWYoeCAvIDFlMywgMiksIGtfbGFiKQ0KICApDQogIGxhYnNbeCA9PSAwXSA8LSAiIg0KICBsYWJzDQp9DQoNCnBsdCA8LSBlcmVzdWx0cyAlPiUNCiAgZ2dwbG90KGFlcyh4bWluID0gY3VtX3ZvdGUgLSB2b3RlcywgeG1heCA9IGN1bV92b3RlLA0KICAgICAgICAgICAgIHltaW4gPSAwLCB5bWF4ID0gc21hcmdpbiwgDQogICAgICAgICAgICAgZmlsbCA9IHdpbm5lcikpICsNCiAgIyAyNzAgdGhyZXNob2xkDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDI3MCwgc2l6ZSA9IDQsDQogICAgICAgICAgICAgY29sb3IgPSAiZ3JleTkwIikgKw0KICAjIG1hcmdpbiBiYXJzDQogIGdlb21fcmVjdChhZXMoY29sb3IgPSB3aW5uZXIpKSArDQogICMgbWFyZ2luIGxhYmVscw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYmlnX3ByZXR0eV9udW0obWFyZ2luLCBUUlVFKSwNCiAgICAgICAgICAgICAgICB4ID0gY3VtX3ZvdGUgLSB2b3RlcyAvIDIsIA0KICAgICAgICAgICAgICAgIHkgPSBzbWFyZ2luICsgNWU0ICogaWZlbHNlKHdpbm5lciA9PSAiVHJ1bXAiLCAxLCAtMSkpLA0KICAgICAgICAgICAgZGF0YSA9IGZpbHRlcihlcmVzdWx0cywgc3QgJWluJSBjKCJNSSIsICJXSSIsICJQQSIpKSwNCiAgICAgICAgICAgIHNpemUgPSAyLjUpICsNCiAgIyBTdGF0ZSBsYWJlbHMNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN0LCB4ID0gY3VtX3ZvdGUgLSB2b3RlcyAvIDIsDQogICAgICAgICAgICAgICAgeSA9IDEwMDAwMCAqIGlmZWxzZSh3aW5uZXIgPT0gIlRydW1wIiwgLTEsIDEpKSwNCiAgICAgICAgICAgIGFuZ2xlID0gOTAsIHNpemUgPSAyLjUpICsNCiAgIyBNYXJnaW4gb2YgdmljdG9yeQ0KICBnZW9tX2Vycm9yYmFyaChhZXMoeSA9IDIuM2U1LCB4ID0gY3VtX3ZvdGUpLCBkYXRhID0gZmxpcF92b3RlcywNCiAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMWU1LCBzaXplID0gMikgKw0KICBnZW9tX3RleHQoYWVzKHkgPSA0LjVlNSwgeCA9IGN1bV92b3RlIC0gdm90ZXMgLyAyLCANCiAgICAgICAgICAgICAgICBsYWJlbCA9IG1hcmdpbl9vZl92aWN0b3J5KG1hcmdpbikpLCANCiAgICAgICAgICAgIGRhdGEgPSBmbGlwX3ZvdGVzLCBzaXplID0gNC41LCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgaWZlbHNlKHggPD0gMjcwLCB4LCA1MzggLSB4KSwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoc2VxKDAsIDIyNSwgYnkgPSA3NSksIDI3MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2KHNlcSg1MzgsIDI3MCwgYnkgPSAtNzUpKSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGJpZ19wcmV0dHlfbnVtLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtNGU2LCAtMmU2LCAtMWU2LCAtNWU1LCAtMi41ZTUsIC01ZTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDVlNCwgMi41ZTUsIDVlNSwgMWU2KSwNCiAgICAgICAgICAgICAgICAgICAgIG1pbm9yX2JyZWFrcyA9IE5VTEwpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0yZTYsIDFlNikpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygic3RlZWxibHVlMiIsICJ0b21hdG8zIikpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRvZGdlcmJsdWUzIiwgImZpcmVicmljazQiKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSArDQogIGxhYnMoeCA9ICJFbGVjdG9yYWwgQ29sbGVnZSBWb3RlcyIsDQogICAgICAgeSA9ICJQb3B1bGFyIFZvdGUgTWFyZ2luIG9mIFZpY3RvcnkiLA0KICAgICAgIHRpdGxlID0gIjIwMTYgVS5TLiBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gUmVzdWx0cyIsDQogICAgICAgc3VidGl0bGUgPSAiU3RhdGUgV2lucyBieSBNYXJnaW4gb2YgVmljdG9yeSIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYygxMTIuNSwgNTM4IC0gMTEyLjUpLCB5ID0gYygtM2U1LCAzZTUpLCANCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZSgiU3RhdGVzIFdvbiBieSIsIGMoIlRydW1wIiwgIkNsaW50b24iKSksDQogICAgICAgICAgIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDUxMC41LCB5ID0gLTIuMDVlNiwgc2l6ZSA9IDMsIA0KICAgICAgICAgICBsYWJlbCA9ICJDQSBUcnVuY2F0ZWQ6XG40LjMgTWlsbGlvbiIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMCwgeSA9IC0yZTYsIGNvbG9yID0gImdyZXk5MCIsIHNpemUgPSA2LA0KICAgICAgICAgICBsYWJlbCA9ICJAREFUQVRJVElBTiIsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjksIGZvbnRmYWNlID0gImJvbGQiKQ0KICANCnBuZygiZWxlY3Rpb25tYXJnaW4ucG5nIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNiwgdW5pdHMgPSAiaW4iLCByZXMgPSAxNTApDQpwcmludChwbHQpDQppbnZpc2libGUoZGV2Lm9mZigpKQ0KDQpwbHQNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQo=