library(tidyverse)
── Attaching packages ────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
✓ ggplot2 3.2.1     ✓ purrr   0.3.3
✓ tibble  2.1.3     ✓ dplyr   0.8.3
✓ tidyr   1.0.0     ✓ stringr 1.4.0
✓ readr   1.3.1     ✓ forcats 0.4.0
── Conflicts ───────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(leaflet)
library(sf)
Linking to GEOS 3.5.1, GDAL 2.2.2, PROJ 4.9.2
library(readxl)
library(DT)
library(plotly)

Attaching package: ‘plotly’

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

    last_plot

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

    filter

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

    layout
library(broom)
library(tidycensus)
census_api_key("a7c59af9ec8e85e3b63423792c176d986478bd94") 
To install your API key for use in future sessions, run this function with `install = TRUE`.
house_counties <- read_xlsx("Statewide Results.xlsx", sheet = 2)
New names:
* `` -> ...2
* `` -> ...3
* `` -> ...4
* `` -> ...5
house_counties <- read_xlsx("Statewide Results.xlsx", sheet = 2, range = "B7:E63")
  1. First,I created a table that shows the counties’ senate results categorized by Democrat, Republican, and Libertarian votes. The Republican-Democrat split is shown in column “Repub_advantage”. A higher number here indicates a Republican advantage, and a lower number (like the negatives) depicts a Democrat advantage.
glimpse(house_counties)
Observations: 56
Variables: 4
$ County                          <chr> "Beaverhead", "Big Horn", "Blaine", "Broadwater", "Carbon", "Carter", "Cascade", "Chouteau…
$ `GREG GIANFORTE\r\nRepublican`  <dbl> 3113, 1705, 1173, 2249, 3450, 636, 17219, 1515, 3085, 684, 2811, 1379, 1025, 3915, 28450, …
$ `KATHLEEN WILLIAMS\r\nDemocrat` <dbl> 1681, 2865, 1742, 897, 2442, 100, 15826, 1071, 1638, 240, 1128, 2693, 226, 1752, 18051, 31…
$ `ELINOR SWANSON\r\nLibertarian` <dbl> 122, 106, 87, 105, 184, 12, 925, 66, 168, 20, 125, 155, 24, 139, 1277, 1523, 20, 111, 22, …
house_counties <- house_counties %>% 
  rename(Republican = "GREG GIANFORTE\r\nRepublican") %>% 
  rename(Democrat = "KATHLEEN WILLIAMS\r\nDemocrat") %>% 
  rename(Libertarian = "ELINOR SWANSON\r\nLibertarian")
glimpse(house_counties)
Observations: 56
Variables: 4
$ County      <chr> "Beaverhead", "Big Horn", "Blaine", "Broadwater", "Carbon", "Carter", "Cascade", "Chouteau", "Custer", "Daniel…
$ Republican  <dbl> 3113, 1705, 1173, 2249, 3450, 636, 17219, 1515, 3085, 684, 2811, 1379, 1025, 3915, 28450, 23157, 606, 1307, 32…
$ Democrat    <dbl> 1681, 2865, 1742, 897, 2442, 100, 15826, 1071, 1638, 240, 1128, 2693, 226, 1752, 18051, 31297, 55, 3564, 108, …
$ Libertarian <dbl> 122, 106, 87, 105, 184, 12, 925, 66, 168, 20, 125, 155, 24, 139, 1277, 1523, 20, 111, 22, 62, 231, 200, 34, 35…
house_counties <- house_counties %>% 
  mutate(total_votes = Republican + Democrat + Libertarian) %>% 
  mutate(Repub_advantage = Republican/total_votes - Democrat/total_votes) %>% 
  mutate(Repub_advantage = round(Repub_advantage*100, 1))

house_counties %>% 
  arrange(-Repub_advantage)
NA
  1. Here is a datatable of all the Senate votings of Montana counties.
mt_counties <- get_acs(geography = "county",
                       variables = "B01003_001",
                       state = "MT",
                       geometry = TRUE) 
Getting data from the 2014-2018 5-year ACS
Downloading feature geometry from the Census website.  To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
Using FIPS code '30' for state 'MT'

  |                                                                                                                                 
  |                                                                                                                           |   0%
  |                                                                                                                                 
  |=                                                                                                                          |   0%
  |                                                                                                                                 
  |=                                                                                                                          |   1%
  |                                                                                                                                 
  |==                                                                                                                         |   1%
  |                                                                                                                                 
  |==                                                                                                                         |   2%
  |                                                                                                                                 
  |===                                                                                                                        |   2%
  |                                                                                                                                 
  |===                                                                                                                        |   3%
  |                                                                                                                                 
  |====                                                                                                                       |   3%
  |                                                                                                                                 
  |====                                                                                                                       |   4%
  |                                                                                                                                 
  |=====                                                                                                                      |   4%
  |                                                                                                                                 
  |======                                                                                                                     |   5%
  |                                                                                                                                 
  |=======                                                                                                                    |   5%
  |                                                                                                                                 
  |=======                                                                                                                    |   6%
  |                                                                                                                                 
  |========                                                                                                                   |   6%
  |                                                                                                                                 
  |========                                                                                                                   |   7%
  |                                                                                                                                 
  |=========                                                                                                                  |   7%
  |                                                                                                                                 
  |=========                                                                                                                  |   8%
  |                                                                                                                                 
  |==========                                                                                                                 |   8%
  |                                                                                                                                 
  |===========                                                                                                                |   9%
  |                                                                                                                                 
  |============                                                                                                               |   9%
  |                                                                                                                                 
  |============                                                                                                               |  10%
  |                                                                                                                                 
  |=============                                                                                                              |  10%
  |                                                                                                                                 
  |=============                                                                                                              |  11%
  |                                                                                                                                 
  |==============                                                                                                             |  11%
  |                                                                                                                                 
  |==============                                                                                                             |  12%
  |                                                                                                                                 
  |===============                                                                                                            |  12%
  |                                                                                                                                 
  |================                                                                                                           |  13%
  |                                                                                                                                 
  |=================                                                                                                          |  14%
  |                                                                                                                                 
  |==================                                                                                                         |  14%
  |                                                                                                                                 
  |==================                                                                                                         |  15%
  |                                                                                                                                 
  |===================                                                                                                        |  15%
  |                                                                                                                                 
  |===================                                                                                                        |  16%
  |                                                                                                                                 
  |====================                                                                                                       |  16%
  |                                                                                                                                 
  |====================                                                                                                       |  17%
  |                                                                                                                                 
  |=====================                                                                                                      |  17%
  |                                                                                                                                 
  |======================                                                                                                     |  17%
  |                                                                                                                                 
  |======================                                                                                                     |  18%
  |                                                                                                                                 
  |=======================                                                                                                    |  18%
  |                                                                                                                                 
  |=======================                                                                                                    |  19%
  |                                                                                                                                 
  |========================                                                                                                   |  19%
  |                                                                                                                                 
  |========================                                                                                                   |  20%
  |                                                                                                                                 
  |=========================                                                                                                  |  20%
  |                                                                                                                                 
  |=========================                                                                                                  |  21%
  |                                                                                                                                 
  |==========================                                                                                                 |  21%
  |                                                                                                                                 
  |==========================                                                                                                 |  22%
  |                                                                                                                                 
  |===========================                                                                                                |  22%
  |                                                                                                                                 
  |============================                                                                                               |  22%
  |                                                                                                                                 
  |============================                                                                                               |  23%
  |                                                                                                                                 
  |=============================                                                                                              |  23%
  |                                                                                                                                 
  |=============================                                                                                              |  24%
  |                                                                                                                                 
  |==============================                                                                                             |  24%
  |                                                                                                                                 
  |==============================                                                                                             |  25%
  |                                                                                                                                 
  |===============================                                                                                            |  25%
  |                                                                                                                                 
  |===============================                                                                                            |  26%
  |                                                                                                                                 
  |================================                                                                                           |  26%
  |                                                                                                                                 
  |=================================                                                                                          |  26%
  |                                                                                                                                 
  |=================================                                                                                          |  27%
  |                                                                                                                                 
  |==================================                                                                                         |  27%
  |                                                                                                                                 
  |==================================                                                                                         |  28%
  |                                                                                                                                 
  |===================================                                                                                        |  28%
  |                                                                                                                                 
  |===================================                                                                                        |  29%
  |                                                                                                                                 
  |====================================                                                                                       |  29%
  |                                                                                                                                 
  |====================================                                                                                       |  30%
  |                                                                                                                                 
  |=====================================                                                                                      |  30%
  |                                                                                                                                 
  |======================================                                                                                     |  31%
  |                                                                                                                                 
  |=======================================                                                                                    |  31%
  |                                                                                                                                 
  |=======================================                                                                                    |  32%
  |                                                                                                                                 
  |========================================                                                                                   |  32%
  |                                                                                                                                 
  |========================================                                                                                   |  33%
  |                                                                                                                                 
  |=========================================                                                                                  |  33%
  |                                                                                                                                 
  |=========================================                                                                                  |  34%
  |                                                                                                                                 
  |==========================================                                                                                 |  34%
  |                                                                                                                                 
  |==========================================                                                                                 |  35%
  |                                                                                                                                 
  |===========================================                                                                                |  35%
  |                                                                                                                                 
  |============================================                                                                               |  35%
  |                                                                                                                                 
  |============================================                                                                               |  36%
  |                                                                                                                                 
  |=============================================                                                                              |  36%
  |                                                                                                                                 
  |=============================================                                                                              |  37%
  |                                                                                                                                 
  |==============================================                                                                             |  37%
  |                                                                                                                                 
  |==============================================                                                                             |  38%
  |                                                                                                                                 
  |===============================================                                                                            |  38%
  |                                                                                                                                 
  |===============================================                                                                            |  39%
  |                                                                                                                                 
  |================================================                                                                           |  39%
  |                                                                                                                                 
  |=================================================                                                                          |  39%
  |                                                                                                                                 
  |=================================================                                                                          |  40%
  |                                                                                                                                 
  |==================================================                                                                         |  40%
  |                                                                                                                                 
  |==================================================                                                                         |  41%
  |                                                                                                                                 
  |===================================================                                                                        |  41%
  |                                                                                                                                 
  |===================================================                                                                        |  42%
  |                                                                                                                                 
  |====================================================                                                                       |  42%
  |                                                                                                                                 
  |====================================================                                                                       |  43%
  |                                                                                                                                 
  |=====================================================                                                                      |  43%
  |                                                                                                                                 
  |======================================================                                                                     |  44%
  |                                                                                                                                 
  |=======================================================                                                                    |  44%
  |                                                                                                                                 
  |=======================================================                                                                    |  45%
  |                                                                                                                                 
  |========================================================                                                                   |  45%
  |                                                                                                                                 
  |========================================================                                                                   |  46%
  |                                                                                                                                 
  |=========================================================                                                                  |  46%
  |                                                                                                                                 
  |=========================================================                                                                  |  47%
  |                                                                                                                                 
  |==========================================================                                                                 |  47%
  |                                                                                                                                 
  |==========================================================                                                                 |  48%
  |                                                                                                                                 
  |===========================================================                                                                |  48%
  |                                                                                                                                 
  |============================================================                                                               |  48%
  |                                                                                                                                 
  |============================================================                                                               |  49%
  |                                                                                                                                 
  |=============================================================                                                              |  49%
  |                                                                                                                                 
  |=============================================================                                                              |  50%
  |                                                                                                                                 
  |==============================================================                                                             |  50%
  |                                                                                                                                 
  |==============================================================                                                             |  51%
  |                                                                                                                                 
  |===============================================================                                                            |  51%
  |                                                                                                                                 
  |===============================================================                                                            |  52%
  |                                                                                                                                 
  |================================================================                                                           |  52%
  |                                                                                                                                 
  |=================================================================                                                          |  52%
  |                                                                                                                                 
  |=================================================================                                                          |  53%
  |                                                                                                                                 
  |==================================================================                                                         |  53%
  |                                                                                                                                 
  |==================================================================                                                         |  54%
  |                                                                                                                                 
  |===================================================================                                                        |  54%
  |                                                                                                                                 
  |===================================================================                                                        |  55%
  |                                                                                                                                 
  |====================================================================                                                       |  55%
  |                                                                                                                                 
  |====================================================================                                                       |  56%
  |                                                                                                                                 
  |=====================================================================                                                      |  56%
  |                                                                                                                                 
  |======================================================================                                                     |  57%
  |                                                                                                                                 
  |=======================================================================                                                    |  57%
  |                                                                                                                                 
  |=======================================================================                                                    |  58%
  |                                                                                                                                 
  |========================================================================                                                   |  58%
  |                                                                                                                                 
  |========================================================================                                                   |  59%
  |                                                                                                                                 
  |=========================================================================                                                  |  59%
  |                                                                                                                                 
  |=========================================================================                                                  |  60%
  |                                                                                                                                 
  |==========================================================================                                                 |  60%
  |                                                                                                                                 
  |===========================================================================                                                |  61%
  |                                                                                                                                 
  |============================================================================                                               |  62%
  |                                                                                                                                 
  |=============================================================================                                              |  62%
  |                                                                                                                                 
  |=============================================================================                                              |  63%
  |                                                                                                                                 
  |==============================================================================                                             |  63%
  |                                                                                                                                 
  |==============================================================================                                             |  64%
  |                                                                                                                                 
  |===============================================================================                                            |  64%
  |                                                                                                                                 
  |===============================================================================                                            |  65%
  |                                                                                                                                 
  |================================================================================                                           |  65%
  |                                                                                                                                 
  |=================================================================================                                          |  65%
  |                                                                                                                                 
  |=================================================================================                                          |  66%
  |                                                                                                                                 
  |==================================================================================                                         |  66%
  |                                                                                                                                 
  |==================================================================================                                         |  67%
  |                                                                                                                                 
  |===================================================================================                                        |  67%
  |                                                                                                                                 
  |===================================================================================                                        |  68%
  |                                                                                                                                 
  |====================================================================================                                       |  68%
  |                                                                                                                                 
  |====================================================================================                                       |  69%
  |                                                                                                                                 
  |=====================================================================================                                      |  69%
  |                                                                                                                                 
  |======================================================================================                                     |  70%
  |                                                                                                                                 
  |=======================================================================================                                    |  70%
  |                                                                                                                                 
  |=======================================================================================                                    |  71%
  |                                                                                                                                 
  |========================================================================================                                   |  71%
  |                                                                                                                                 
  |========================================================================================                                   |  72%
  |                                                                                                                                 
  |=========================================================================================                                  |  72%
  |                                                                                                                                 
  |=========================================================================================                                  |  73%
  |                                                                                                                                 
  |==========================================================================================                                 |  73%
  |                                                                                                                                 
  |===========================================================================================                                |  74%
  |                                                                                                                                 
  |============================================================================================                               |  74%
  |                                                                                                                                 
  |============================================================================================                               |  75%
  |                                                                                                                                 
  |=============================================================================================                              |  75%
  |                                                                                                                                 
  |=============================================================================================                              |  76%
  |                                                                                                                                 
  |==============================================================================================                             |  76%
  |                                                                                                                                 
  |==============================================================================================                             |  77%
  |                                                                                                                                 
  |===============================================================================================                            |  77%
  |                                                                                                                                 
  |===============================================================================================                            |  78%
  |                                                                                                                                 
  |================================================================================================                           |  78%
  |                                                                                                                                 
  |=================================================================================================                          |  79%
  |                                                                                                                                 
  |==================================================================================================                         |  79%
  |                                                                                                                                 
  |==================================================================================================                         |  80%
  |                                                                                                                                 
  |===================================================================================================                        |  80%
  |                                                                                                                                 
  |===================================================================================================                        |  81%
  |                                                                                                                                 
  |====================================================================================================                       |  81%
  |                                                                                                                                 
  |====================================================================================================                       |  82%
  |                                                                                                                                 
  |=====================================================================================================                      |  82%
  |                                                                                                                                 
  |======================================================================================================                     |  83%
  |                                                                                                                                 
  |=======================================================================================================                    |  83%
  |                                                                                                                                 
  |=======================================================================================================                    |  84%
  |                                                                                                                                 
  |========================================================================================================                   |  84%
  |                                                                                                                                 
  |========================================================================================================                   |  85%
  |                                                                                                                                 
  |=========================================================================================================                  |  85%
  |                                                                                                                                 
  |=========================================================================================================                  |  86%
  |                                                                                                                                 
  |==========================================================================================================                 |  86%
  |                                                                                                                                 
  |==========================================================================================================                 |  87%
  |                                                                                                                                 
  |===========================================================================================================                |  87%
  |                                                                                                                                 
  |============================================================================================================               |  87%
  |                                                                                                                                 
  |============================================================================================================               |  88%
  |                                                                                                                                 
  |=============================================================================================================              |  88%
  |                                                                                                                                 
  |=============================================================================================================              |  89%
  |                                                                                                                                 
  |==============================================================================================================             |  89%
  |                                                                                                                                 
  |==============================================================================================================             |  90%
  |                                                                                                                                 
  |===============================================================================================================            |  90%
  |                                                                                                                                 
  |===============================================================================================================            |  91%
  |                                                                                                                                 
  |================================================================================================================           |  91%
  |                                                                                                                                 
  |=================================================================================================================          |  92%
  |                                                                                                                                 
  |==================================================================================================================         |  92%
  |                                                                                                                                 
  |==================================================================================================================         |  93%
  |                                                                                                                                 
  |===================================================================================================================        |  93%
  |                                                                                                                                 
  |===================================================================================================================        |  94%
  |                                                                                                                                 
  |====================================================================================================================       |  94%
  |                                                                                                                                 
  |====================================================================================================================       |  95%
  |                                                                                                                                 
  |=====================================================================================================================      |  95%
  |                                                                                                                                 
  |======================================================================================================================     |  96%
  |                                                                                                                                 
  |=======================================================================================================================    |  96%
  |                                                                                                                                 
  |=======================================================================================================================    |  97%
  |                                                                                                                                 
  |========================================================================================================================   |  97%
  |                                                                                                                                 
  |========================================================================================================================   |  98%
  |                                                                                                                                 
  |=========================================================================================================================  |  98%
  |                                                                                                                                 
  |=========================================================================================================================  |  99%
  |                                                                                                                                 
  |========================================================================================================================== |  99%
  |                                                                                                                                 
  |========================================================================================================================== | 100%
  |                                                                                                                                 
  |===========================================================================================================================| 100%
  1. The following choreopleth is of the senate voting in Montana counties, distinguished by color according to Republican or Democrat advantage. You can see that places such as Bozeman, Missoula, and the Crow Reservation have a very low Republican advantage.

house_counties[25, "County"] <- "Lewis and Clark"              # Changes  "&" "and"

mt_counties <- mt_counties %>% 
  mutate(County = gsub(" County, Montana", "", NAME)) %>%      # Removes unnecessary words
  rename(Population = estimate)                                # Renames the 'estimate' to 'Population'
  1. Next, I created a table of a linear regression of the Republican advantage due to population. There is a positive correlation between having a higher population, and having a higher Democratic vote advantage.
house_election <- mt_counties %>% 
  full_join(house_counties)
Joining, by = "County"
house_election %>%
  as_tibble() %>% 
  select(County, Population, Democrat, Republican, Libertarian, total_votes, Repub_advantage) %>% 
  datatable()

NA
  1. The following graph graph shows the population by county, and the Republican/Democrat advantage is shown by the line. The linear regression illustrates a pattern between the population of a county and it’s political advantage. Eastern counties leaned more towards Rosendale, while western counties tended to leab towards Tester.

vote_colors <- colorNumeric(palette = "viridis", domain = house_election$Repub_advantage)

house_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1,
              fillColor = ~vote_colors(Repub_advantage), 
              label = ~paste0(County, ", Republican advantage = ", Repub_advantage),
              highlight = highlightOptions(weight = 2)) %>% 
  setView(-110, 47, zoom = 6) %>% 
  addLegend(pal = vote_colors, values = ~Repub_advantage)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'
house_election %>%
  plot_ly(x = ~Population, y = ~Repub_advantage) %>% 
  add_markers()
  1. The following graph shows the “center” of each county, geographically.
house_election %>%
  plot_ly(x = ~Population, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", 
                        County, "<br>", 
                        "Population: ", Population, "<br>", 
                        "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(marker = list(opacity = 0.7)) %>%
  layout(title = "Predicting Republican Vote Advantage from Population, by County",
         xaxis = list(title = "County population"),
         yaxis = list(title = "Republican vote advantage"))     

NA
  1. This table shows a linear regression of population by geography.
pop_model <- lm(Repub_advantage ~ Population, data = house_election)
summary(pop_model)

Call:
lm(formula = Repub_advantage ~ Population, data = house_election)

Residuals:
    Min      1Q  Median      3Q     Max 
-73.973 -10.320   3.959  15.305  47.232 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) 34.1220288  4.0462304   8.433 1.99e-11 ***
Population  -0.0003977  0.0001090  -3.648 0.000597 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.2 on 54 degrees of freedom
Multiple R-squared:  0.1977,    Adjusted R-squared:  0.1828 
F-statistic: 13.31 on 1 and 54 DF,  p-value: 0.0005968
  1. This graph depicts the population density of Montana by geography, with the linear regression indicating a positive correlation between eastern counties voting more Republican in the senate election.
tidy(pop_model)
glance(pop_model)
NA
NA
  1. Next, we have a multiple regression predicting the geographic area (east or west) and population.
tidy(pop_model)
glance(pop_model) %>%
  add_lines(y = ~fitted(pop_model)) %>%
  add_markers(showlengend = F)
Unknown or uninitialised column: 'x'.Unknown or uninitialised column: 'x'.Error: Must supply `x` and `y` attributes
house_election <- house_election %>% 
  mutate(Longitude = as_tibble(st_coordinates(st_centroid(house_election$geometry)))$X) %>% 
  mutate(Latitude = as_tibble(st_coordinates(st_centroid(house_election$geometry)))$Y)
st_centroid does not give correct centroids for longitude/latitude datast_centroid does not give correct centroids for longitude/latitude data
  
  1. Finally, here is a 3D graph showing the relationship between longitude, population, and voting behavior in Montana. The farther east you get, the more votes for Rosendale. The farther west, the more votes for Tester.

house_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1) %>% 
  setView(-110, 47, zoom = 6) %>% 
addCircleMarkers(~Longitude, ~Latitude)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShzZikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoRFQpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHRpZHljZW5zdXMpCmBgYAoKCmBgYHtyfQpjZW5zdXNfYXBpX2tleSgiYTdjNTlhZjllYzhlODVlM2I2MzQyMzc5MmMxNzZkOTg2NDc4YmQ5NCIpCmBgYAoKYGBge3J9CnNlbmF0ZV9jb3VudGllcyA8LSByZWFkX3hsc3goIlN0YXRld2lkZSBSZXN1bHRzLnhsc3giLCBzaGVldCA9IDEsIHJhbmdlID0gIkI3OkU2MyIpCmBgYAoKYGBge3J9CnNlbmF0ZV9jb3VudGllcyA8LSBzZW5hdGVfY291bnRpZXMgJT4lIApyZW5hbWUoUmVwdWJsaWNhbiA9ICJNQVRUIFJPU0VOREFMRVxyXG5SZXB1YmxpY2FuIikgJT4lIAogIHJlbmFtZShEZW1vY3JhdCA9ICJKT04gVEVTVEVSXHJcbkRlbW9jcmF0IikgJT4lIAogIHJlbmFtZShMaWJlcnRhcmlhbiA9ICJSSUNLIEJSRUNLRU5SSURHRVxyXG5MaWJlcnRhcmlhbiIpCmBgYAoKMS4gRmlyc3QsSSBjcmVhdGVkIGEgdGFibGUgdGhhdCBzaG93cyB0aGUgY291bnRpZXPigJkgc2VuYXRlIHJlc3VsdHMgY2F0ZWdvcml6ZWQgYnkgRGVtb2NyYXQsIFJlcHVibGljYW4sIGFuZCBMaWJlcnRhcmlhbiB2b3Rlcy4gVGhlIFJlcHVibGljYW4tRGVtb2NyYXQgc3BsaXQgaXMgc2hvd24gaW4gY29sdW1uIOKAnFJlcHViX2FkdmFudGFnZeKAnS4gQSBoaWdoZXIgbnVtYmVyIGhlcmUgaW5kaWNhdGVzIGEgUmVwdWJsaWNhbiBhZHZhbnRhZ2UsIGFuZCBhIGxvd2VyIG51bWJlciAobGlrZSB0aGUgbmVnYXRpdmVzKSBkZXBpY3RzIGEgRGVtb2NyYXQgYWR2YW50YWdlLgoKYGBge3J9CnNlbmF0ZV9jb3VudGllcyA8LSBzZW5hdGVfY291bnRpZXMgJT4lIAogIG11dGF0ZSh0b3RhbF92b3RlcyA9IFJlcHVibGljYW4gKyBEZW1vY3JhdCArIExpYmVydGFyaWFuKSAlPiUgCiAgbXV0YXRlKFJlcHViX2FkdmFudGFnZSA9IFJlcHVibGljYW4vdG90YWxfdm90ZXMgLSBEZW1vY3JhdC90b3RhbF92b3RlcykgJT4lIAogIG11dGF0ZShSZXB1Yl9hZHZhbnRhZ2UgPSByb3VuZChSZXB1Yl9hZHZhbnRhZ2UqMTAwLCAxKSkKCnNlbmF0ZV9jb3VudGllcyAlPiUgCiAgYXJyYW5nZSgtUmVwdWJfYWR2YW50YWdlKQpgYGAKCmBgYHtyfQptdF9jb3VudGllcyA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLAogICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9ICJCMDEwMDNfMDAxIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBUUlVFKSAKYGBgCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzWzI1LCAiQ291bnR5Il0gPC0gIkxld2lzIGFuZCBDbGFyayIgICAgICAgICAgICAgCgptdF9jb3VudGllcyA8LSBtdF9jb3VudGllcyAlPiUgCiAgbXV0YXRlKENvdW50eSA9IGdzdWIoIiBDb3VudHksIE1vbnRhbmEiLCAiIiwgTkFNRSkpICU+JSAgICAgCiAgcmVuYW1lKFBvcHVsYXRpb24gPSBlc3RpbWF0ZSkgCmBgYAoKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gPC0gbXRfY291bnRpZXMgJT4lIAogIGZ1bGxfam9pbihzZW5hdGVfY291bnRpZXMpCmBgYAoKMi4gSGVyZSBpcyBhIGRhdGF0YWJsZSBvZiBhbGwgdGhlIFNlbmF0ZSB2b3RpbmdzIG9mIE1vbnRhbmEgY291bnRpZXMuIAoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUKICBhc190aWJibGUoKSAlPiUgCiAgc2VsZWN0KENvdW50eSwgUG9wdWxhdGlvbiwgRGVtb2NyYXQsIFJlcHVibGljYW4sIExpYmVydGFyaWFuLCB0b3RhbF92b3RlcywgUmVwdWJfYWR2YW50YWdlKSAlPiUgCiAgZGF0YXRhYmxlKCkKYGBgCgozLiBUaGUgZm9sbG93aW5nIGNob3Jlb3BsZXRoIGlzIG9mIHRoZSBzZW5hdGUgdm90aW5nIGluIE1vbnRhbmEgY291bnRpZXMsIGRpc3Rpbmd1aXNoZWQgYnkgY29sb3IgYWNjb3JkaW5nIHRvIFJlcHVibGljYW4gb3IgRGVtb2NyYXQgYWR2YW50YWdlLiBZb3UgY2FuIHNlZSB0aGF0IHBsYWNlcyBzdWNoIGFzIEJvemVtYW4sIE1pc3NvdWxhLCBhbmQgdGhlIENyb3cgUmVzZXJ2YXRpb24gaGF2ZSBhIHZlcnkgbG93IFJlcHVibGljYW4gYWR2YW50YWdlLgoKYGBge3J9CnZvdGVfY29sb3JzIDwtIGNvbG9yTnVtZXJpYyhwYWxldHRlID0gInZpcmlkaXMiLCBkb21haW4gPSBzZW5hdGVfZWxlY3Rpb24kUmVwdWJfYWR2YW50YWdlKQoKc2VuYXRlX2VsZWN0aW9uICU+JQogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyh3ZWlnaHQgPSAxLAogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH52b3RlX2NvbG9ycyhSZXB1Yl9hZHZhbnRhZ2UpLCAKICAgICAgICAgICAgICBsYWJlbCA9IH5wYXN0ZTAoQ291bnR5LCAiLCBSZXB1YmxpY2FuIGFkdmFudGFnZSA9ICIsIFJlcHViX2FkdmFudGFnZSksCiAgICAgICAgICAgICAgaGlnaGxpZ2h0ID0gaGlnaGxpZ2h0T3B0aW9ucyh3ZWlnaHQgPSAyKSkgJT4lIAogIHNldFZpZXcoLTExMCwgNDcsIHpvb20gPSA2KSAlPiUgCiAgYWRkTGVnZW5kKHBhbCA9IHZvdGVfY29sb3JzLCB2YWx1ZXMgPSB+UmVwdWJfYWR2YW50YWdlKQpgYGAKCjQuIE5leHQsIEkgY3JlYXRlZCBhIHRhYmxlIG9mIGEgbGluZWFyIHJlZ3Jlc3Npb24gb2YgdGhlIFJlcHVibGljYW4gYWR2YW50YWdlIGR1ZSB0byBwb3B1bGF0aW9uLiBUaGVyZSBpcyBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gaGF2aW5nIGEgaGlnaGVyIHBvcHVsYXRpb24sIGFuZCBoYXZpbmcgYSBoaWdoZXIgRGVtb2NyYXRpYyB2b3RlIGFkdmFudGFnZS4KCmBgYHtyfQpwb3BfbW9kZWwgPC0gbG0oUmVwdWJfYWR2YW50YWdlIH4gUG9wdWxhdGlvbiwgZGF0YSA9IHNlbmF0ZV9lbGVjdGlvbikKCnRpZHkocG9wX21vZGVsKQpgYGAKCmBgYHtyfQpnbGFuY2UocG9wX21vZGVsKQpgYGAKCgoKNS4gVGhlIGZvbGxvd2luZyBncmFwaCBncmFwaCBzaG93cyB0aGUgcG9wdWxhdGlvbiBieSBjb3VudHksIGFuZCB0aGUgUmVwdWJsaWNhbi9EZW1vY3JhdCBhZHZhbnRhZ2UgaXMgc2hvd24gYnkgdGhlIGxpbmUuIFRoZSBsaW5lYXIgcmVncmVzc2lvbiBpbGx1c3RyYXRlcyBhIHBhdHRlcm4gYmV0d2VlbiB0aGUgcG9wdWxhdGlvbiBvZiBhIGNvdW50eSBhbmQgaXTigJlzIHBvbGl0aWNhbCBhZHZhbnRhZ2UuIEVhc3Rlcm4gY291bnRpZXMgbGVhbmVkIG1vcmUgdG93YXJkcyBSb3NlbmRhbGUsIHdoaWxlIHdlc3Rlcm4gY291bnRpZXMgdGVuZGVkIHRvIGxlYWIgdG93YXJkcyBUZXN0ZXIuCgpgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uICU+JQogIHBsb3RfbHkoeCA9IH5Qb3B1bGF0aW9uLCAKICAgICAgICAgIHkgPSB+UmVwdWJfYWR2YW50YWdlLAogICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLCAKICAgICAgICAgIHRleHQgPSB+cGFzdGUoIkNvdW50eToiLCAKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnR5LCAiPGJyPiIsIAogICAgICAgICAgICAgICAgICAgICAgICAiUG9wdWxhdGlvbjogIiwgUG9wdWxhdGlvbiwgIjxicj4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlJlcHVibGljYW4gYWR2YW50YWdlOiAiLCBSZXB1Yl9hZHZhbnRhZ2UpKSAlPiUgCiAgYWRkX21hcmtlcnMoc2hvd2xlZ2VuZCA9IEYsIG1hcmtlciA9IGxpc3Qob3BhY2l0eSA9IDAuNykpICU+JQogIGxheW91dCh0aXRsZSA9ICJQcmVkaWN0aW5nIFJlcHVibGljYW4gVm90ZSBBZHZhbnRhZ2UgZnJvbSBQb3B1bGF0aW9uLCBieSBDb3VudHkiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnR5IFBvcHVsYXRpb24iKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlcHVibGljYW4gVm90aW5nIEFkdmFudGFnZSIpKSAlPiUgCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKHBvcF9tb2RlbCkpCmBgYAoKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gPC0gc2VuYXRlX2VsZWN0aW9uICU+JSAKICBtdXRhdGUoTG9uZ2l0dWRlID0gYXNfdGliYmxlKHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKHNlbmF0ZV9lbGVjdGlvbiRnZW9tZXRyeSkpKSRYKSAlPiUgCiAgbXV0YXRlKExhdGl0dWRlID0gYXNfdGliYmxlKHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKHNlbmF0ZV9lbGVjdGlvbiRnZW9tZXRyeSkpKSRZKQpgYGAKCjYuIFRoZSBmb2xsb3dpbmcgZ3JhcGggc2hvd3MgdGhlIOKAnGNlbnRlcuKAnSBvZiBlYWNoIGNvdW50eSwgZ2VvZ3JhcGhpY2FsbHkuCgpgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uICU+JQogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyh3ZWlnaHQgPSAxKSAlPiUgCiAgc2V0VmlldygtMTEwLCA0Nywgem9vbSA9IDYpICU+JSAKYWRkQ2lyY2xlTWFya2Vycyh+TG9uZ2l0dWRlLCB+TGF0aXR1ZGUpCmBgYAoKNy4gVGhpcyB0YWJsZSBzaG93cyBhIGxpbmVhciByZWdyZXNzaW9uIG9mIHBvcHVsYXRpb24gYnkgZ2VvZ3JhcGh5LiAKCmBgYHtyfQpsb25naXR1ZGVfbG0gPC0gbG0oUmVwdWJfYWR2YW50YWdlIH4gTG9uZ2l0dWRlLCBkYXRhID0gc2VuYXRlX2VsZWN0aW9uKQp0aWR5KGxvbmdpdHVkZV9sbSkKYGBgCgpgYGB7cn0KZ2xhbmNlKGxvbmdpdHVkZV9sbSkKYGBgCgo4LiBUaGlzIGdyYXBoIGRlcGljdHMgdGhlIHBvcHVsYXRpb24gZGVuc2l0eSBvZiBNb250YW5hIGJ5IGdlb2dyYXBoeSwgd2l0aCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gaW5kaWNhdGluZyBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gZWFzdGVybiBjb3VudGllcyB2b3RpbmcgbW9yZSBSZXB1YmxpY2FuIGluIHRoZSBzZW5hdGUgZWxlY3Rpb24uIAoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUgCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgCiAgICAgICAgICB5ID0gflJlcHViX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgQ291bnR5LCAiPGJyPiIsICJMb25naXR1ZGU6ICIsIExvbmdpdHVkZSwgIjxicj4iLCAiUmVwdWJsaWNhbiBhZHZhbnRhZ2U6ICIsIFJlcHViX2FkdmFudGFnZSkpICU+JSAKICBhZGRfbWFya2VycyhtYXJrZXIgPSBsaXN0KG9wYWNpdHkgPSAwLjcpLCBzaG93bGVnZW5kID0gRikgJT4lCiAgbGF5b3V0KHRpdGxlID0gIlByZWRpY3RpbmcgUmVwdWJsaWNhbiBWb3RlIEFkdmFudGFnZSBmcm9tIExvbmdpdHVkZSwgYnkgQ291bnR5IiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50eSBMb25naXR1ZGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlcHVibGljYW4gVm90ZSBBZHZhbnRhZ2UiKSkgJT4lIAogIGFkZF9saW5lcyh5ID0gfmZpdHRlZChsb25naXR1ZGVfbG0pKQpgYGAKCgo5LiBOZXh0LCB3ZSBoYXZlIGEgbXVsdGlwbGUgcmVncmVzc2lvbiBwcmVkaWN0aW5nIHRoZSBnZW9ncmFwaGljIGFyZWEgKGVhc3Qgb3Igd2VzdCkgYW5kIHBvcHVsYXRpb24uCgpgYGB7cn0KbXVsdGlwbGVfbG0gPC0gbG0oUmVwdWJfYWR2YW50YWdlIH4gUG9wdWxhdGlvbiArIExvbmdpdHVkZSwgZGF0YSA9IHNlbmF0ZV9lbGVjdGlvbikKdGlkeShtdWx0aXBsZV9sbSkKYGBgCgpgYGB7cn0KZ2xhbmNlKG11bHRpcGxlX2xtKQpgYGAKCgoxMC4gRmluYWxseSwgaGVyZSBpcyBhIDNEIGdyYXBoIHNob3dpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGxvbmdpdHVkZSwgcG9wdWxhdGlvbiwgYW5kIHZvdGluZyBiZWhhdmlvciBpbiBNb250YW5hLiBUaGUgZmFydGhlciBlYXN0IHlvdSBnZXQsIHRoZSBtb3JlIHZvdGVzIGZvciBSb3NlbmRhbGUuIFRoZSBmYXJ0aGVyIHdlc3QsIHRoZSBtb3JlIHZvdGVzIGZvciBUZXN0ZXIuIAoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUgCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgeSA9IH5Qb3B1bGF0aW9uLCB6ID0gflJlcHViX2FkdmFudGFnZSwgCiAgICAgICAgICB0ZXh0ID0gfkNvdW50eSwgaG92ZXJpbmZvID0gInRleHQiKSAlPiUgCiAgYWRkX21hcmtlcnMob3BhY2l0eSA9IC43LCBzaG93bGVnZW5kID0gRikKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK