Let’s test two theories about Montana’s political landscape, based on election results data from the 2018 US Senate Race (where Democrat Jon Tester defeated Republic Matt Rosendale in a close race).

The first theory is that more populated counties support Democrats and their counterparts support Republics.

The second theory is that Democrats are more common in the Western parts of the state, and vice versa.

library(tidyverse)
library(leaflet)
library(sf)
library(readxl)
library(DT)
library(plotly)
library(broom)
library(tidycensus)
census_api_key("d41baf61ae7a8464397c04c3c41151966dd81cb1")
To install your API key for use in future sessions, run this function with `install = TRUE`.

I obtained election results data from http://mtelectionresults.gov

The election results are a spreadsheet, so I will load it now.

senate_counties <- read_xlsx("Statewide Results.xlsx", sheet = 1, range = "B7:E63")

When I first viewed the data, I saw there were unnecessary rows and columns. So I fixed that by giving a cells range in the R code.

senate_counties <- read_xlsx("Statewide Results.xlsx", sheet = 1)
New names:
* `` -> ...2
* `` -> ...3
* `` -> ...4
* `` -> ...5

When I look again, it looks good now.

Next, I will Use glimpse() to look at senate_counties.

glimpse(senate_counties)
Observations: 56
Variables: 4
$ County                             <chr> "Beaverhead", "Big Horn", "Blaine", "Broadwater", "Carbon", "Carter", "Cascade", "Choutea…
$ `JON TESTER\r\nDemocrat`           <dbl> 1876, 3027, 1961, 1071, 2680, 128, 17435, 1275, 1942, 281, 1233, 2892, 281, 1964, 19652, …
$ `MATT ROSENDALE\r\nRepublican`     <dbl> 2866, 1558, 982, 2086, 3209, 602, 15566, 1312, 2762, 631, 2700, 1208, 951, 3640, 26759, 2…
$ `RICK BRECKENRIDGE\r\nLibertarian` <dbl> 155, 91, 76, 104, 178, 22, 1008, 70, 179, 29, 140, 136, 57, 189, 1349, 1434, 30, 89, 21, …

I will use rename() to set terms “Republican” and “Democrat” instead of the names and the rest of the existing long chain of info, this will make the data easier to work with:

senate_counties <- senate_counties %>% 
  rename(Republican = "MATT ROSENDALE\r\nRepublican") %>% 
  rename(Democrat = "JON TESTER\r\nDemocrat") %>% 
  rename(Libertarian = "RICK BRECKENRIDGE\r\nLibertarian")

Now I’ll see if that looks better.

glimpse(senate_counties)
Observations: 56
Variables: 4
$ County      <chr> "Beaverhead", "Big Horn", "Blaine", "Broadwater", "Carbon", "Carter", "Cascade", "Chouteau", "Custer", "Daniels"…
$ Democrat    <dbl> 1876, 3027, 1961, 1071, 2680, 128, 17435, 1275, 1942, 281, 1233, 2892, 281, 1964, 19652, 33251, 81, 3754, 130, 6…
$ Republican  <dbl> 2866, 1558, 982, 2086, 3209, 602, 15566, 1312, 2762, 631, 2700, 1208, 951, 3640, 26759, 21248, 571, 1153, 303, 1…
$ Libertarian <dbl> 155, 91, 76, 104, 178, 22, 1008, 70, 179, 29, 140, 136, 57, 189, 1349, 1434, 30, 89, 21, 52, 227, 226, 51, 365, …

Yay, it does!

We want to know the Republican - Democrat difference in each county, as a percentage.

Since the Democrat candidate won this election, I want to see the Democrat minus Republic difference per county, and I want that number as a percentage.

The R code below accomplishes that task.

senate_counties <- senate_counties %>% 
  mutate(total_votes = Republican + Democrat + Libertarian) %>% 
  mutate(Dem_advantage = Democrat/total_votes - Republican/total_votes) %>% 
  mutate(Dem_advantage = round(Dem_advantage*100, 1))

senate_counties %>% 
  arrange(-Dem_advantage)
NA

Get census data for mapping

I also want to look at census data, in addition to election data.

The R code below brings that useful census data into the fold.

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%
  |                                                                                                                                   
  |======                                                                                                                       |   4%
  |                                                                                                                                   
  |======                                                                                                                       |   5%
  |                                                                                                                                   
  |=======                                                                                                                      |   5%
  |                                                                                                                                   
  |=======                                                                                                                      |   6%
  |                                                                                                                                   
  |========                                                                                                                     |   6%
  |                                                                                                                                   
  |========                                                                                                                     |   7%
  |                                                                                                                                   
  |=========                                                                                                                    |   7%
  |                                                                                                                                   
  |=========                                                                                                                    |   8%
  |                                                                                                                                   
  |==========                                                                                                                   |   8%
  |                                                                                                                                   
  |===========                                                                                                                  |   8%
  |                                                                                                                                   
  |===========                                                                                                                  |   9%
  |                                                                                                                                   
  |============                                                                                                                 |   9%
  |                                                                                                                                   
  |============                                                                                                                 |  10%
  |                                                                                                                                   
  |=============                                                                                                                |  10%
  |                                                                                                                                   
  |=============                                                                                                                |  11%
  |                                                                                                                                   
  |==============                                                                                                               |  11%
  |                                                                                                                                   
  |===============                                                                                                              |  12%
  |                                                                                                                                   
  |================                                                                                                             |  12%
  |                                                                                                                                   
  |================                                                                                                             |  13%
  |                                                                                                                                   
  |=================                                                                                                            |  13%
  |                                                                                                                                   
  |=================                                                                                                            |  14%
  |                                                                                                                                   
  |==================                                                                                                           |  14%
  |                                                                                                                                   
  |==================                                                                                                           |  15%
  |                                                                                                                                   
  |===================                                                                                                          |  15%
  |                                                                                                                                   
  |===================                                                                                                          |  16%
  |                                                                                                                                   
  |====================                                                                                                         |  16%
  |                                                                                                                                   
  |=====================                                                                                                        |  16%
  |                                                                                                                                   
  |=====================                                                                                                        |  17%
  |                                                                                                                                   
  |======================                                                                                                       |  17%
  |                                                                                                                                   
  |======================                                                                                                       |  18%
  |                                                                                                                                   
  |=======================                                                                                                      |  18%
  |                                                                                                                                   
  |=======================                                                                                                      |  19%
  |                                                                                                                                   
  |========================                                                                                                     |  19%
  |                                                                                                                                   
  |========================                                                                                                     |  20%
  |                                                                                                                                   
  |=========================                                                                                                    |  20%
  |                                                                                                                                   
  |==========================                                                                                                   |  21%
  |                                                                                                                                   
  |===========================                                                                                                  |  21%
  |                                                                                                                                   
  |===========================                                                                                                  |  22%
  |                                                                                                                                   
  |============================                                                                                                 |  22%
  |                                                                                                                                   
  |============================                                                                                                 |  23%
  |                                                                                                                                   
  |=============================                                                                                                |  23%
  |                                                                                                                                   
  |=============================                                                                                                |  24%
  |                                                                                                                                   
  |==============================                                                                                               |  24%
  |                                                                                                                                   
  |===============================                                                                                              |  25%
  |                                                                                                                                   
  |================================                                                                                             |  25%
  |                                                                                                                                   
  |================================                                                                                             |  26%
  |                                                                                                                                   
  |=================================                                                                                            |  26%
  |                                                                                                                                   
  |=================================                                                                                            |  27%
  |                                                                                                                                   
  |==================================                                                                                           |  27%
  |                                                                                                                                   
  |==================================                                                                                           |  28%
  |                                                                                                                                   
  |===================================                                                                                          |  28%
  |                                                                                                                                   
  |====================================                                                                                         |  28%
  |                                                                                                                                   
  |====================================                                                                                         |  29%
  |                                                                                                                                   
  |=====================================                                                                                        |  29%
  |                                                                                                                                   
  |=====================================                                                                                        |  30%
  |                                                                                                                                   
  |======================================                                                                                       |  30%
  |                                                                                                                                   
  |======================================                                                                                       |  31%
  |                                                                                                                                   
  |=======================================                                                                                      |  31%
  |                                                                                                                                   
  |=======================================                                                                                      |  32%
  |                                                                                                                                   
  |========================================                                                                                     |  32%
  |                                                                                                                                   
  |=========================================                                                                                    |  32%
  |                                                                                                                                   
  |=========================================                                                                                    |  33%
  |                                                                                                                                   
  |==========================================                                                                                   |  33%
  |                                                                                                                                   
  |==========================================                                                                                   |  34%
  |                                                                                                                                   
  |===========================================                                                                                  |  34%
  |                                                                                                                                   
  |===========================================                                                                                  |  35%
  |                                                                                                                                   
  |============================================                                                                                 |  35%
  |                                                                                                                                   
  |=============================================                                                                                |  36%
  |                                                                                                                                   
  |==============================================                                                                               |  36%
  |                                                                                                                                   
  |==============================================                                                                               |  37%
  |                                                                                                                                   
  |===============================================                                                                              |  37%
  |                                                                                                                                   
  |===============================================                                                                              |  38%
  |                                                                                                                                   
  |================================================                                                                             |  38%
  |                                                                                                                                   
  |================================================                                                                             |  39%
  |                                                                                                                                   
  |=================================================                                                                            |  39%
  |                                                                                                                                   
  |==================================================                                                                           |  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%
  |                                                                                                                                   
  |=======================================================================                                                      |  56%
  |                                                                                                                                   
  |=======================================================================                                                      |  57%
  |                                                                                                                                   
  |========================================================================                                                     |  57%
  |                                                                                                                                   
  |========================================================================                                                     |  58%
  |                                                                                                                                   
  |=========================================================================                                                    |  58%
  |                                                                                                                                   
  |=========================================================================                                                    |  59%
  |                                                                                                                                   
  |==========================================================================                                                   |  59%
  |                                                                                                                                   
  |==========================================================================                                                   |  60%
  |                                                                                                                                   
  |===========================================================================                                                  |  60%
  |                                                                                                                                   
  |============================================================================                                                 |  60%
  |                                                                                                                                   
  |============================================================================                                                 |  61%
  |                                                                                                                                   
  |=============================================================================                                                |  61%
  |                                                                                                                                   
  |=============================================================================                                                |  62%
  |                                                                                                                                   
  |==============================================================================                                               |  62%
  |                                                                                                                                   
  |==============================================================================                                               |  63%
  |                                                                                                                                   
  |===============================================================================                                              |  63%
  |                                                                                                                                   
  |================================================================================                                             |  64%
  |                                                                                                                                   
  |=================================================================================                                            |  64%
  |                                                                                                                                   
  |=================================================================================                                            |  65%
  |                                                                                                                                   
  |==================================================================================                                           |  65%
  |                                                                                                                                   
  |==================================================================================                                           |  66%
  |                                                                                                                                   
  |===================================================================================                                          |  66%
  |                                                                                                                                   
  |===================================================================================                                          |  67%
  |                                                                                                                                   
  |====================================================================================                                         |  67%
  |                                                                                                                                   
  |=====================================================================================                                        |  68%
  |                                                                                                                                   
  |======================================================================================                                       |  69%
  |                                                                                                                                   
  |=======================================================================================                                      |  69%
  |                                                                                                                                   
  |=======================================================================================                                      |  70%
  |                                                                                                                                   
  |========================================================================================                                     |  70%
  |                                                                                                                                   
  |========================================================================================                                     |  71%
  |                                                                                                                                   
  |=========================================================================================                                    |  71%
  |                                                                                                                                   
  |=========================================================================================                                    |  72%
  |                                                                                                                                   
  |==========================================================================================                                   |  72%
  |                                                                                                                                   
  |===========================================================================================                                  |  72%
  |                                                                                                                                   
  |===========================================================================================                                  |  73%
  |                                                                                                                                   
  |============================================================================================                                 |  73%
  |                                                                                                                                   
  |============================================================================================                                 |  74%
  |                                                                                                                                   
  |=============================================================================================                                |  74%
  |                                                                                                                                   
  |=============================================================================================                                |  75%
  |                                                                                                                                   
  |==============================================================================================                               |  75%
  |                                                                                                                                   
  |==============================================================================================                               |  76%
  |                                                                                                                                   
  |===============================================================================================                              |  76%
  |                                                                                                                                   
  |================================================================================================                             |  76%
  |                                                                                                                                   
  |================================================================================================                             |  77%
  |                                                                                                                                   
  |=================================================================================================                            |  77%
  |                                                                                                                                   
  |=================================================================================================                            |  78%
  |                                                                                                                                   
  |==================================================================================================                           |  78%
  |                                                                                                                                   
  |==================================================================================================                           |  79%
  |                                                                                                                                   
  |===================================================================================================                          |  79%
  |                                                                                                                                   
  |===================================================================================================                          |  80%
  |                                                                                                                                   
  |====================================================================================================                         |  80%
  |                                                                                                                                   
  |=====================================================================================================                        |  80%
  |                                                                                                                                   
  |=====================================================================================================                        |  81%
  |                                                                                                                                   
  |======================================================================================================                       |  81%
  |                                                                                                                                   
  |======================================================================================================                       |  82%
  |                                                                                                                                   
  |=======================================================================================================                      |  82%
  |                                                                                                                                   
  |=======================================================================================================                      |  83%
  |                                                                                                                                   
  |========================================================================================================                     |  83%
  |                                                                                                                                   
  |=========================================================================================================                    |  84%
  |                                                                                                                                   
  |==========================================================================================================                   |  84%
  |                                                                                                                                   
  |==========================================================================================================                   |  85%
  |                                                                                                                                   
  |===========================================================================================================                  |  85%
  |                                                                                                                                   
  |===========================================================================================================                  |  86%
  |                                                                                                                                   
  |============================================================================================================                 |  86%
  |                                                                                                                                   
  |============================================================================================================                 |  87%
  |                                                                                                                                   
  |=============================================================================================================                |  87%
  |                                                                                                                                   
  |=============================================================================================================                |  88%
  |                                                                                                                                   
  |==============================================================================================================               |  88%
  |                                                                                                                                   
  |===============================================================================================================              |  88%
  |                                                                                                                                   
  |===============================================================================================================              |  89%
  |                                                                                                                                   
  |================================================================================================================             |  89%
  |                                                                                                                                   
  |================================================================================================================             |  90%
  |                                                                                                                                   
  |=================================================================================================================            |  90%
  |                                                                                                                                   
  |=================================================================================================================            |  91%
  |                                                                                                                                   
  |==================================================================================================================           |  91%
  |                                                                                                                                   
  |==================================================================================================================           |  92%
  |                                                                                                                                   
  |===================================================================================================================          |  92%
  |                                                                                                                                   
  |====================================================================================================================         |  92%
  |                                                                                                                                   
  |====================================================================================================================         |  93%
  |                                                                                                                                   
  |=====================================================================================================================        |  93%
  |                                                                                                                                   
  |=====================================================================================================================        |  94%
  |                                                                                                                                   
  |======================================================================================================================       |  94%
  |                                                                                                                                   
  |======================================================================================================================       |  95%
  |                                                                                                                                   
  |=======================================================================================================================      |  95%
  |                                                                                                                                   
  |=======================================================================================================================      |  96%
  |                                                                                                                                   
  |========================================================================================================================     |  96%
  |                                                                                                                                   
  |=========================================================================================================================    |  97%
  |                                                                                                                                   
  |==========================================================================================================================   |  97%
  |                                                                                                                                   
  |==========================================================================================================================   |  98%
  |                                                                                                                                   
  |===========================================================================================================================  |  98%
  |                                                                                                                                   
  |===========================================================================================================================  |  99%
  |                                                                                                                                   
  |============================================================================================================================ |  99%
  |                                                                                                                                   
  |============================================================================================================================ | 100%
  |                                                                                                                                   
  |=============================================================================================================================| 100%

There are problems with minor differences in the two data sets I’m using (election and census data) with the name of Lewis and Clark county and with some unnecessary words in one dataset.

The code below fixes that issue, and renames the census column called estimate to Population, for later use:


senate_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'

Let’s join the two to make a new data set.

senate_election <- mt_counties %>% 
  full_join(senate_counties)
Joining, by = "County"

Let’s make a pretty table to look closer.

senate_election %>%
  as_tibble() %>% 
  select(County, Population, Democrat, Republican, Libertarian, total_votes, Dem_advantage) %>% 
  datatable()

NA

Montana counties choropleth

This code creates a beautiful and informative choropleth.


vote_colors <- colorNumeric(palette = "viridis", domain = senate_election$Dem_advantage)

senate_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1,
              fillColor = ~vote_colors(Dem_advantage), 
              label = ~paste0(County, ", Democrat advantage = ", Dem_advantage),
              highlight = highlightOptions(weight = 2)) %>% 
  setView(-110, 47, zoom = 6) %>% 
  addLegend(pal = vote_colors, values = ~Dem_advantage)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'

Notice that if you hover your mouse over each county, it shows the Democrat advantage (where ever there was actually a Democrat disadvantage, a negative number will be displayed). Many populous Montana counties (Missoula, Gallatin, Cascade, Silverbow, etc.) are colored in a yellow-green shade because they have large Democrat advantages. Meanwhile, the most populous county actually has a modest Democrat disadvantage. But certainly there still seems to be a trend that the other most populous counties seem to learn toward Democrat.

Predicting votes from population

So, do Democrats prevail in the more populated counties and vice versa? Let’s keep investigating with the data at hand.

A plotly graph can help us out with that.

senate_election %>%
  plot_ly(x = ~Population, y = ~Dem_advantage) %>% 
  add_markers()

It certainly still looks like Democrats do better in the more populous counties!

Let’s enhance this plotly graph.

senate_election %>%
  plot_ly(x = ~Population, 
          y = ~Dem_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", 
                        County, "<br>", 
                        "Population: ", Population, "<br>", 
                        "Democrat advantage: ", Dem_advantage)) %>% 
  add_markers(marker = list(opacity = 0.7)) %>%
  layout(title = "Predicting Democrat Vote Advantage from Population, by County",
         xaxis = list(title = "County population"),
         yaxis = list(title = "Democrat vote advantage"))     

NA

That looks better!

Now… Let’s create a regression model using a lineal modeal.

pop_model <- lm(Dem_advantage ~ Population, data = senate_election)

Summary is one way to look at the data from the model.

summary(pop_model)

Call:
lm(formula = Dem_advantage ~ Population, data = senate_election)

Residuals:
    Min      1Q  Median      3Q     Max 
-47.948 -15.782  -3.247  12.013  71.228 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -2.428e+01  4.084e+00  -5.946 2.08e-07 ***
Population   3.761e-04  1.100e-04   3.418  0.00121 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.44 on 54 degrees of freedom
Multiple R-squared:  0.1779,    Adjusted R-squared:  0.1626 
F-statistic: 11.68 on 1 and 54 DF,  p-value: 0.001207

But, hey that all looks like a mess! Not very easy on the eyes…

So let’s use the broom package in R to get some prettier tables to look at.

tidy(pop_model)
glance(pop_model)
NA
NA

R-squared is about .18, meaning 18% of the variance in vote is attributable to population counts. The correlation is about .4, which is statistically significant, providing evidence for the theory that the larger the population, the more dominant Democrats are in a given county.

Now I want to plot the regression line onto the chart.

senate_election %>%
  plot_ly(x = ~Population, 
          y = ~Dem_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", 
                        County, "<br>", 
                        "Population: ", Population, "<br>", 
                        "Democrat advantage: ", Dem_advantage)) %>% 
  add_markers(showlegend = F, marker = list(opacity = 0.7)) %>%
  layout(title = "Predicting Democrat Vote Advantage from Population, by County",
         xaxis = list(title = "County population"),
         yaxis = list(title = "Democrat vote advantage")) %>%
  add_lines(y = ~fitted(pop_model)) 

NA

That regression line is a nice visual cue for the case we’ve made.

Predicting vote from longitude

So, if you look further West in Montana, do you find more Democrats, and vice versa? Let’s look at geographic data per county to find out.

senate_election <- senate_election %>% 
  mutate(Longitude = as_tibble(st_coordinates(st_centroid(senate_election$geometry)))$X) %>% 
  mutate(Latitude = as_tibble(st_coordinates(st_centroid(senate_election$geometry)))$Y)
st_centroid does not give correct centroids for longitude/latitude datast_centroid does not give correct centroids for longitude/latitude data
  

The R code above and below is intended to show roughly the center of each county.


senate_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'

As the graph shows, in the farthest Easterly longtitudes, there is slight trend for a Republican advantage, and vice versa.

senate_election %>%
  plot_ly(x = ~Longitude, y = ~Dem_advantage) %>% 
  add_markers()

Now let’s do the linear regression for the same data.

longitude_lm <- lm(Dem_advantage ~ Longitude, data = senate_election)
tidy(longitude_lm)
glance(longitude_lm)

The r-squared is again about .18, and the correlation is about the same .4. This confirms that the West is Democrat territory.

Let’s make the graph more complete with the line, and some labels.

senate_election %>% 
  plot_ly(x = ~Longitude, 
          y = ~Dem_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", County, "<br>", "Longitude: ", Longitude, "<br>", "Democrat advantage: ", Dem_advantage)) %>% 
  add_markers(marker = list(opacity = 0.7), showlegend = F) %>%
  layout(title = "Predicting Democrat Vote Advantage from Longitude, by County",
         xaxis = list(title = "County longitude"),
         yaxis = list(title = "Democrat vote advantage")) %>% 
  add_lines(y = ~fitted(longitude_lm))

NA
NA

Multiple regression

How about a multiple regression to predict Democrat advantage from county population and longitude at the same time.

multiple_lm <- lm(Dem_advantage ~ Population + Longitude, data = senate_election)
tidy(multiple_lm)
glance(multiple_lm)

Wow, they both retain their statistical analysis. The case is looking ever-stronger for our theory.

2D this whole time is getting a bit repetitive; let’s do a sweet 3D graph for a change.

senate_election %>% 
  plot_ly(x = ~Longitude, y = ~Population, z = ~Dem_advantage, 
          text = ~County, hoverinfo = "text") %>% 
  add_markers(opacity = .7, showlegend = F)

Wow, that’s eye-popping! And informative!

Matching the broader trend across the entire country, the more populous areas in Montana tend to lean Democrat. The more rural areas tend to lean Republican. And yes, it really is true; on average, if you’re in the Western part of Montana, you’re surrounded by Democrats. If you’re in the Eastern part of Montana, you’re surrounded by Republicans. Meanwhile, Yellowstone county, home of MSU-Billings, seems to be a good place for everyone to hang out, with apparently plentiful Democrat and Republic voters–which makes sense, because it’s right in the middle of the state.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKTGV0J3MgdGVzdCB0d28gdGhlb3JpZXMgYWJvdXQgTW9udGFuYSdzIHBvbGl0aWNhbCBsYW5kc2NhcGUsIGJhc2VkIG9uIGVsZWN0aW9uIHJlc3VsdHMgZGF0YSBmcm9tIHRoZSAyMDE4IFVTIFNlbmF0ZSBSYWNlICh3aGVyZSBEZW1vY3JhdCBKb24gVGVzdGVyIGRlZmVhdGVkIFJlcHVibGljIE1hdHQgUm9zZW5kYWxlIGluIGEgY2xvc2UgcmFjZSkuIAoKVGhlIGZpcnN0IHRoZW9yeSBpcyB0aGF0IG1vcmUgcG9wdWxhdGVkIGNvdW50aWVzIHN1cHBvcnQgRGVtb2NyYXRzIGFuZCB0aGVpciBjb3VudGVycGFydHMgc3VwcG9ydCBSZXB1YmxpY3MuIAoKVGhlIHNlY29uZCB0aGVvcnkgaXMgdGhhdCBEZW1vY3JhdHMgYXJlIG1vcmUgY29tbW9uIGluIHRoZSBXZXN0ZXJuIHBhcnRzIG9mIHRoZSBzdGF0ZSwgYW5kIHZpY2UgdmVyc2EuIAoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShEVCkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGlkeWNlbnN1cykKYGBgCgpgYGB7cn0KY2Vuc3VzX2FwaV9rZXkoIiIpCmBgYAoKSSBvYnRhaW5lZCBlbGVjdGlvbiByZXN1bHRzIGRhdGEgZnJvbSBodHRwOi8vbXRlbGVjdGlvbnJlc3VsdHMuZ292CgoKVGhlIGVsZWN0aW9uIHJlc3VsdHMgYXJlIGEgc3ByZWFkc2hlZXQsIHNvIEkgd2lsbCBsb2FkIGl0IG5vdy4gCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzIDwtIHJlYWRfeGxzeCgiU3RhdGV3aWRlIFJlc3VsdHMueGxzeCIsIHNoZWV0ID0gMSwgcmFuZ2UgPSAiQjc6RTYzIikKYGBgCgpXaGVuIEkgZmlyc3Qgdmlld2VkIHRoZSBkYXRhLCBJIHNhdyB0aGVyZSB3ZXJlIHVubmVjZXNzYXJ5IHJvd3MgYW5kIGNvbHVtbnMuIFNvIEkgZml4ZWQgdGhhdCBieSBnaXZpbmcgYSBjZWxscyByYW5nZSBpbiB0aGUgUiBjb2RlLiAKCmBgYHtyfQpzZW5hdGVfY291bnRpZXMgPC0gcmVhZF94bHN4KCJTdGF0ZXdpZGUgUmVzdWx0cy54bHN4Iiwgc2hlZXQgPSAxKQpgYGAKCldoZW4gSSBsb29rIGFnYWluLCBpdCBsb29rcyBnb29kIG5vdy4gCgpOZXh0LCBJIHdpbGwgVXNlIGdsaW1wc2UoKSB0byBsb29rIGF0IHNlbmF0ZV9jb3VudGllcy4KCmBgYHtyfQpnbGltcHNlKHNlbmF0ZV9jb3VudGllcykKYGBgCgoKSSB3aWxsIHVzZSByZW5hbWUoKSB0byBzZXQgdGVybXMgIlJlcHVibGljYW4iIGFuZCAiRGVtb2NyYXQiIGluc3RlYWQgb2YgdGhlIG5hbWVzIGFuZCB0aGUgcmVzdCBvZiB0aGUgZXhpc3RpbmcgbG9uZyBjaGFpbiBvZiBpbmZvLCB0aGlzIHdpbGwgbWFrZSB0aGUgZGF0YSBlYXNpZXIgdG8gd29yayB3aXRoOgoKYGBge3J9CnNlbmF0ZV9jb3VudGllcyA8LSBzZW5hdGVfY291bnRpZXMgJT4lIAogIHJlbmFtZShSZXB1YmxpY2FuID0gIk1BVFQgUk9TRU5EQUxFXHJcblJlcHVibGljYW4iKSAlPiUgCiAgcmVuYW1lKERlbW9jcmF0ID0gIkpPTiBURVNURVJcclxuRGVtb2NyYXQiKSAlPiUgCiAgcmVuYW1lKExpYmVydGFyaWFuID0gIlJJQ0sgQlJFQ0tFTlJJREdFXHJcbkxpYmVydGFyaWFuIikKYGBgCgpOb3cgSSdsbCBzZWUgaWYgdGhhdCBsb29rcyBiZXR0ZXIuIAoKYGBge3J9CmdsaW1wc2Uoc2VuYXRlX2NvdW50aWVzKQpgYGAKCllheSwgaXQgZG9lcyEgCgpXZSB3YW50IHRvIGtub3cgdGhlIFJlcHVibGljYW4gLSBEZW1vY3JhdCBkaWZmZXJlbmNlIGluIGVhY2ggY291bnR5LCBhcyBhIHBlcmNlbnRhZ2UuCgpTaW5jZSB0aGUgRGVtb2NyYXQgY2FuZGlkYXRlIHdvbiB0aGlzIGVsZWN0aW9uLCBJIHdhbnQgdG8gc2VlIHRoZSBEZW1vY3JhdCBtaW51cyBSZXB1YmxpYyBkaWZmZXJlbmNlIHBlciBjb3VudHksIGFuZCBJIHdhbnQgdGhhdCBudW1iZXIgYXMgYSBwZXJjZW50YWdlLiAKClRoZSBSIGNvZGUgYmVsb3cgYWNjb21wbGlzaGVzIHRoYXQgdGFzay4gCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzIDwtIHNlbmF0ZV9jb3VudGllcyAlPiUgCiAgbXV0YXRlKHRvdGFsX3ZvdGVzID0gUmVwdWJsaWNhbiArIERlbW9jcmF0ICsgTGliZXJ0YXJpYW4pICU+JSAKICBtdXRhdGUoRGVtX2FkdmFudGFnZSA9IERlbW9jcmF0L3RvdGFsX3ZvdGVzIC0gUmVwdWJsaWNhbi90b3RhbF92b3RlcykgJT4lIAogIG11dGF0ZShEZW1fYWR2YW50YWdlID0gcm91bmQoRGVtX2FkdmFudGFnZSoxMDAsIDEpKQoKc2VuYXRlX2NvdW50aWVzICU+JSAKICBhcnJhbmdlKC1EZW1fYWR2YW50YWdlKQoKYGBgCgoKCiMjIyBHZXQgY2Vuc3VzIGRhdGEgZm9yIG1hcHBpbmcKCkkgYWxzbyB3YW50IHRvIGxvb2sgYXQgY2Vuc3VzIGRhdGEsIGluIGFkZGl0aW9uIHRvIGVsZWN0aW9uIGRhdGEuIAoKVGhlIFIgY29kZSBiZWxvdyBicmluZ3MgdGhhdCB1c2VmdWwgY2Vuc3VzIGRhdGEgaW50byB0aGUgZm9sZC4gCgoKYGBge3J9Cm10X2NvdW50aWVzIDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gIkIwMTAwM18wMDEiLAogICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gIk1UIiwKICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFRSVUUpIApgYGAKClRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIG1pbm9yIGRpZmZlcmVuY2VzIGluIHRoZSB0d28gZGF0YSBzZXRzIEknbSB1c2luZyAoZWxlY3Rpb24gYW5kIGNlbnN1cyBkYXRhKSB3aXRoIHRoZSBuYW1lIG9mIExld2lzIGFuZCBDbGFyayBjb3VudHkgYW5kIHdpdGggc29tZSB1bm5lY2Vzc2FyeSB3b3JkcyBpbiBvbmUgZGF0YXNldC4gCgpUaGUgY29kZSBiZWxvdyBmaXhlcyB0aGF0IGlzc3VlLCBhbmQgcmVuYW1lcyB0aGUgY2Vuc3VzIGNvbHVtbiBjYWxsZWQgZXN0aW1hdGUgdG8gUG9wdWxhdGlvbiwgZm9yIGxhdGVyIHVzZToKCmBgYHtyfQoKc2VuYXRlX2NvdW50aWVzWzI1LCAiQ291bnR5Il0gPC0gIkxld2lzIGFuZCBDbGFyayIgICAgICAgICAgICAgICMgQ2hhbmdlcyAgIiYiICJhbmQiCgptdF9jb3VudGllcyA8LSBtdF9jb3VudGllcyAlPiUgCiAgbXV0YXRlKENvdW50eSA9IGdzdWIoIiBDb3VudHksIE1vbnRhbmEiLCAiIiwgTkFNRSkpICU+JSAgICAgICMgUmVtb3ZlcyB1bm5lY2Vzc2FyeSB3b3JkcwogIHJlbmFtZShQb3B1bGF0aW9uID0gZXN0aW1hdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlbmFtZXMgdGhlICdlc3RpbWF0ZScgdG8gJ1BvcHVsYXRpb24nCmBgYAoKCkxldCdzIGpvaW4gdGhlIHR3byB0byBtYWtlIGEgbmV3IGRhdGEgc2V0LiAKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gPC0gbXRfY291bnRpZXMgJT4lIAogIGZ1bGxfam9pbihzZW5hdGVfY291bnRpZXMpCmBgYAoKCgpMZXQncyBtYWtlIGEgcHJldHR5IHRhYmxlIHRvIGxvb2sgY2xvc2VyLiAKCgpgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uICU+JQogIGFzX3RpYmJsZSgpICU+JSAKICBzZWxlY3QoQ291bnR5LCBQb3B1bGF0aW9uLCBEZW1vY3JhdCwgUmVwdWJsaWNhbiwgTGliZXJ0YXJpYW4sIHRvdGFsX3ZvdGVzLCBEZW1fYWR2YW50YWdlKSAlPiUgCiAgZGF0YXRhYmxlKCkKCmBgYAoKCgoKIyMjIE1vbnRhbmEgY291bnRpZXMgY2hvcm9wbGV0aAoKVGhpcyBjb2RlIGNyZWF0ZXMgYSBiZWF1dGlmdWwgYW5kIGluZm9ybWF0aXZlIGNob3JvcGxldGguIAoKYGBge3J9Cgp2b3RlX2NvbG9ycyA8LSBjb2xvck51bWVyaWMocGFsZXR0ZSA9ICJ2aXJpZGlzIiwgZG9tYWluID0gc2VuYXRlX2VsZWN0aW9uJERlbV9hZHZhbnRhZ2UpCgpzZW5hdGVfZWxlY3Rpb24gJT4lCiAgbGVhZmxldCgpICU+JSAKICBhZGRUaWxlcygpICU+JQogIGFkZFBvbHlnb25zKHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnZvdGVfY29sb3JzKERlbV9hZHZhbnRhZ2UpLCAKICAgICAgICAgICAgICBsYWJlbCA9IH5wYXN0ZTAoQ291bnR5LCAiLCBEZW1vY3JhdCBhZHZhbnRhZ2UgPSAiLCBEZW1fYWR2YW50YWdlKSwKICAgICAgICAgICAgICBoaWdobGlnaHQgPSBoaWdobGlnaHRPcHRpb25zKHdlaWdodCA9IDIpKSAlPiUgCiAgc2V0VmlldygtMTEwLCA0Nywgem9vbSA9IDYpICU+JSAKICBhZGRMZWdlbmQocGFsID0gdm90ZV9jb2xvcnMsIHZhbHVlcyA9IH5EZW1fYWR2YW50YWdlKQoKYGBgCgpOb3RpY2UgdGhhdCBpZiB5b3UgaG92ZXIgeW91ciBtb3VzZSBvdmVyIGVhY2ggY291bnR5LCBpdCBzaG93cyB0aGUgRGVtb2NyYXQgYWR2YW50YWdlICh3aGVyZSBldmVyIHRoZXJlIHdhcyBhY3R1YWxseSBhIERlbW9jcmF0IGRpc2FkdmFudGFnZSwgYSBuZWdhdGl2ZSBudW1iZXIgd2lsbCBiZSBkaXNwbGF5ZWQpLiBNYW55IHBvcHVsb3VzIE1vbnRhbmEgY291bnRpZXMgKE1pc3NvdWxhLCBHYWxsYXRpbiwgQ2FzY2FkZSwgU2lsdmVyYm93LCBldGMuKSBhcmUgY29sb3JlZCBpbiBhIHllbGxvdy1ncmVlbiBzaGFkZSBiZWNhdXNlIHRoZXkgaGF2ZSBsYXJnZSBEZW1vY3JhdCBhZHZhbnRhZ2VzLiBNZWFud2hpbGUsIHRoZSBtb3N0IHBvcHVsb3VzIGNvdW50eSBhY3R1YWxseSBoYXMgYSBtb2Rlc3QgRGVtb2NyYXQgZGlzYWR2YW50YWdlLiBCdXQgY2VydGFpbmx5IHRoZXJlIHN0aWxsIHNlZW1zIHRvIGJlIGEgdHJlbmQgdGhhdCB0aGUgb3RoZXIgbW9zdCBwb3B1bG91cyBjb3VudGllcyBzZWVtIHRvIGxlYXJuIHRvd2FyZCBEZW1vY3JhdC4gCgoKCgojIyMgUHJlZGljdGluZyB2b3RlcyBmcm9tIHBvcHVsYXRpb24KClNvLCBkbyBEZW1vY3JhdHMgcHJldmFpbCBpbiB0aGUgbW9yZSBwb3B1bGF0ZWQgY291bnRpZXMgYW5kIHZpY2UgdmVyc2E/IExldCdzIGtlZXAgaW52ZXN0aWdhdGluZyB3aXRoIHRoZSBkYXRhIGF0IGhhbmQuIAoKQSBwbG90bHkgZ3JhcGggY2FuIGhlbHAgdXMgb3V0IHdpdGggdGhhdC4gCgpgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uICU+JQogIHBsb3RfbHkoeCA9IH5Qb3B1bGF0aW9uLCB5ID0gfkRlbV9hZHZhbnRhZ2UpICU+JSAKICBhZGRfbWFya2VycygpCmBgYAoKSXQgY2VydGFpbmx5IHN0aWxsIGxvb2tzIGxpa2UgRGVtb2NyYXRzIGRvIGJldHRlciBpbiB0aGUgbW9yZSBwb3B1bG91cyBjb3VudGllcyEgCgpMZXQncyBlbmhhbmNlIHRoaXMgcGxvdGx5IGdyYXBoLiAKCgpgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uICU+JQogIHBsb3RfbHkoeCA9IH5Qb3B1bGF0aW9uLCAKICAgICAgICAgIHkgPSB+RGVtX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50eSwgIjxicj4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb246ICIsIFBvcHVsYXRpb24sICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJEZW1vY3JhdCBhZHZhbnRhZ2U6ICIsIERlbV9hZHZhbnRhZ2UpKSAlPiUgCiAgYWRkX21hcmtlcnMobWFya2VyID0gbGlzdChvcGFjaXR5ID0gMC43KSkgJT4lCiAgbGF5b3V0KHRpdGxlID0gIlByZWRpY3RpbmcgRGVtb2NyYXQgVm90ZSBBZHZhbnRhZ2UgZnJvbSBQb3B1bGF0aW9uLCBieSBDb3VudHkiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnR5IHBvcHVsYXRpb24iKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkRlbW9jcmF0IHZvdGUgYWR2YW50YWdlIikpICAgICAKICAgICAgICAgICAgICAgIApgYGAKClRoYXQgbG9va3MgYmV0dGVyISAKCgpOb3cuLi4gCkxldCdzIGNyZWF0ZSBhIHJlZ3Jlc3Npb24gbW9kZWwgdXNpbmcgYSBsaW5lYWwgbW9kZWFsLiAKCgoKYGBge3J9CnBvcF9tb2RlbCA8LSBsbShEZW1fYWR2YW50YWdlIH4gUG9wdWxhdGlvbiwgZGF0YSA9IHNlbmF0ZV9lbGVjdGlvbikKCmBgYAoKU3VtbWFyeSBpcyBvbmUgd2F5IHRvIGxvb2sgYXQgdGhlIGRhdGEgZnJvbSB0aGUgbW9kZWwuIAoKYGBge3J9CnN1bW1hcnkocG9wX21vZGVsKQpgYGAKCkJ1dCwgaGV5IHRoYXQgYWxsIGxvb2tzIGxpa2UgYSBtZXNzISBOb3QgdmVyeSBlYXN5IG9uIHRoZSBleWVzLi4uIAoKU28gbGV0J3MgdXNlIHRoZSBicm9vbSBwYWNrYWdlIGluIFIgdG8gZ2V0IHNvbWUgcHJldHRpZXIgdGFibGVzIHRvIGxvb2sgYXQuIAoKCmBgYHtyfQp0aWR5KHBvcF9tb2RlbCkKZ2xhbmNlKHBvcF9tb2RlbCkKCgpgYGAKClItc3F1YXJlZCBpcyBhYm91dCAuMTgsIG1lYW5pbmcgMTglIG9mIHRoZSB2YXJpYW5jZSBpbiB2b3RlIGlzIGF0dHJpYnV0YWJsZSB0byBwb3B1bGF0aW9uIGNvdW50cy4gVGhlIGNvcnJlbGF0aW9uIGlzIGFib3V0IC40LCB3aGljaCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCBwcm92aWRpbmcgZXZpZGVuY2UgZm9yIHRoZSB0aGVvcnkgdGhhdCB0aGUgbGFyZ2VyIHRoZSBwb3B1bGF0aW9uLCB0aGUgbW9yZSBkb21pbmFudCBEZW1vY3JhdHMgYXJlIGluIGEgZ2l2ZW4gY291bnR5LiAKCk5vdyBJIHdhbnQgdG8gcGxvdCB0aGUgcmVncmVzc2lvbiBsaW5lIG9udG8gdGhlIGNoYXJ0LiAKCgpgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uICU+JQogIHBsb3RfbHkoeCA9IH5Qb3B1bGF0aW9uLCAKICAgICAgICAgIHkgPSB+RGVtX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50eSwgIjxicj4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb246ICIsIFBvcHVsYXRpb24sICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJEZW1vY3JhdCBhZHZhbnRhZ2U6ICIsIERlbV9hZHZhbnRhZ2UpKSAlPiUgCiAgYWRkX21hcmtlcnMoc2hvd2xlZ2VuZCA9IEYsIG1hcmtlciA9IGxpc3Qob3BhY2l0eSA9IDAuNykpICU+JQogIGxheW91dCh0aXRsZSA9ICJQcmVkaWN0aW5nIERlbW9jcmF0IFZvdGUgQWR2YW50YWdlIGZyb20gUG9wdWxhdGlvbiwgYnkgQ291bnR5IiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50eSBwb3B1bGF0aW9uIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJEZW1vY3JhdCB2b3RlIGFkdmFudGFnZSIpKSAlPiUKICBhZGRfbGluZXMoeSA9IH5maXR0ZWQocG9wX21vZGVsKSkgCiAgICAgICAgICAgICAgICAKYGBgCgpUaGF0IHJlZ3Jlc3Npb24gbGluZSBpcyBhIG5pY2UgdmlzdWFsIGN1ZSBmb3IgdGhlIGNhc2Ugd2UndmUgbWFkZS4gCgoKCgojIyMgUHJlZGljdGluZyB2b3RlIGZyb20gbG9uZ2l0dWRlCgoKU28sIGlmIHlvdSBsb29rIGZ1cnRoZXIgV2VzdCBpbiBNb250YW5hLCBkbyB5b3UgZmluZCBtb3JlIERlbW9jcmF0cywgYW5kIHZpY2UgdmVyc2E/IExldCdzIGxvb2sgYXQgZ2VvZ3JhcGhpYyBkYXRhIHBlciBjb3VudHkgdG8gZmluZCBvdXQuIAoKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gPC0gc2VuYXRlX2VsZWN0aW9uICU+JSAKICBtdXRhdGUoTG9uZ2l0dWRlID0gYXNfdGliYmxlKHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKHNlbmF0ZV9lbGVjdGlvbiRnZW9tZXRyeSkpKSRYKSAlPiUgCiAgbXV0YXRlKExhdGl0dWRlID0gYXNfdGliYmxlKHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKHNlbmF0ZV9lbGVjdGlvbiRnZW9tZXRyeSkpKSRZKQogIApgYGAKClRoZSBSIGNvZGUgYWJvdmUgYW5kIGJlbG93IGlzIGludGVuZGVkIHRvIHNob3cgcm91Z2hseSB0aGUgY2VudGVyIG9mIGVhY2ggY291bnR5LiAKCmBgYHtyfQoKc2VuYXRlX2VsZWN0aW9uICU+JQogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyh3ZWlnaHQgPSAxKSAlPiUgCiAgc2V0VmlldygtMTEwLCA0Nywgem9vbSA9IDYpICU+JSAKYWRkQ2lyY2xlTWFya2Vycyh+TG9uZ2l0dWRlLCB+TGF0aXR1ZGUpCgpgYGAKCgoKQXMgdGhlIGdyYXBoIHNob3dzLCBpbiB0aGUgZmFydGhlc3QgRWFzdGVybHkgbG9uZ3RpdHVkZXMsIHRoZXJlIGlzIHNsaWdodCB0cmVuZCBmb3IgYSBSZXB1YmxpY2FuIGFkdmFudGFnZSwgYW5kIHZpY2UgdmVyc2EuIAoKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gJT4lCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgeSA9IH5EZW1fYWR2YW50YWdlKSAlPiUgCiAgYWRkX21hcmtlcnMoKQpgYGAKCgpOb3cgbGV0J3MgZG8gdGhlIGxpbmVhciByZWdyZXNzaW9uIGZvciB0aGUgc2FtZSBkYXRhLiAKCmBgYHtyfQpsb25naXR1ZGVfbG0gPC0gbG0oRGVtX2FkdmFudGFnZSB+IExvbmdpdHVkZSwgZGF0YSA9IHNlbmF0ZV9lbGVjdGlvbikKdGlkeShsb25naXR1ZGVfbG0pCmdsYW5jZShsb25naXR1ZGVfbG0pCmBgYAoKClRoZSByLXNxdWFyZWQgaXMgYWdhaW4gYWJvdXQgLjE4LCBhbmQgdGhlIGNvcnJlbGF0aW9uIGlzIGFib3V0IHRoZSBzYW1lIC40LiBUaGlzIGNvbmZpcm1zIHRoYXQgdGhlIFdlc3QgaXMgRGVtb2NyYXQgdGVycml0b3J5LiAKCkxldCdzIG1ha2UgdGhlIGdyYXBoIG1vcmUgY29tcGxldGUgd2l0aCB0aGUgbGluZSwgYW5kIHNvbWUgbGFiZWxzLiAKCgpgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uICU+JSAKICBwbG90X2x5KHggPSB+TG9uZ2l0dWRlLCAKICAgICAgICAgIHkgPSB+RGVtX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgQ291bnR5LCAiPGJyPiIsICJMb25naXR1ZGU6ICIsIExvbmdpdHVkZSwgIjxicj4iLCAiRGVtb2NyYXQgYWR2YW50YWdlOiAiLCBEZW1fYWR2YW50YWdlKSkgJT4lIAogIGFkZF9tYXJrZXJzKG1hcmtlciA9IGxpc3Qob3BhY2l0eSA9IDAuNyksIHNob3dsZWdlbmQgPSBGKSAlPiUKICBsYXlvdXQodGl0bGUgPSAiUHJlZGljdGluZyBEZW1vY3JhdCBWb3RlIEFkdmFudGFnZSBmcm9tIExvbmdpdHVkZSwgYnkgQ291bnR5IiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50eSBsb25naXR1ZGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkRlbW9jcmF0IHZvdGUgYWR2YW50YWdlIikpICU+JSAKICBhZGRfbGluZXMoeSA9IH5maXR0ZWQobG9uZ2l0dWRlX2xtKSkKICAgICAgICAgICAgICAgIAoKYGBgCgoKCiMjIyBNdWx0aXBsZSByZWdyZXNzaW9uCgpIb3cgYWJvdXQgYSBtdWx0aXBsZSByZWdyZXNzaW9uIHRvIHByZWRpY3QgRGVtb2NyYXQgYWR2YW50YWdlIGZyb20gIGNvdW50eSBwb3B1bGF0aW9uIGFuZCBsb25naXR1ZGUgYXQgdGhlIHNhbWUgdGltZS4gCgoKYGBge3J9Cm11bHRpcGxlX2xtIDwtIGxtKERlbV9hZHZhbnRhZ2UgfiBQb3B1bGF0aW9uICsgTG9uZ2l0dWRlLCBkYXRhID0gc2VuYXRlX2VsZWN0aW9uKQp0aWR5KG11bHRpcGxlX2xtKQpnbGFuY2UobXVsdGlwbGVfbG0pCmBgYAoKV293LCB0aGV5IGJvdGggcmV0YWluIHRoZWlyIHN0YXRpc3RpY2FsIGFuYWx5c2lzLiBUaGUgY2FzZSBpcyBsb29raW5nIGV2ZXItc3Ryb25nZXIgZm9yIG91ciB0aGVvcnkuIAoKMkQgdGhpcyB3aG9sZSB0aW1lIGlzIGdldHRpbmcgYSBiaXQgcmVwZXRpdGl2ZTsgbGV0J3MgZG8gYSBzd2VldCAzRCBncmFwaCBmb3IgYSBjaGFuZ2UuIAoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUgCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgeSA9IH5Qb3B1bGF0aW9uLCB6ID0gfkRlbV9hZHZhbnRhZ2UsIAogICAgICAgICAgdGV4dCA9IH5Db3VudHksIGhvdmVyaW5mbyA9ICJ0ZXh0IikgJT4lIAogIGFkZF9tYXJrZXJzKG9wYWNpdHkgPSAuNywgc2hvd2xlZ2VuZCA9IEYpCmBgYAoKV293LCB0aGF0J3MgZXllLXBvcHBpbmchIEFuZCBpbmZvcm1hdGl2ZSEgCgpNYXRjaGluZyB0aGUgYnJvYWRlciB0cmVuZCBhY3Jvc3MgdGhlIGVudGlyZSBjb3VudHJ5LCB0aGUgbW9yZSBwb3B1bG91cyBhcmVhcyBpbiBNb250YW5hIHRlbmQgdG8gbGVhbiBEZW1vY3JhdC4gVGhlIG1vcmUgcnVyYWwgYXJlYXMgdGVuZCB0byBsZWFuIFJlcHVibGljYW4uIEFuZCB5ZXMsIGl0IHJlYWxseSBpcyB0cnVlOyBvbiBhdmVyYWdlLCBpZiB5b3UncmUgaW4gdGhlIFdlc3Rlcm4gcGFydCBvZiBNb250YW5hLCB5b3UncmUgc3Vycm91bmRlZCBieSBEZW1vY3JhdHMuIElmIHlvdSdyZSBpbiB0aGUgRWFzdGVybiBwYXJ0IG9mIE1vbnRhbmEsIHlvdSdyZSBzdXJyb3VuZGVkIGJ5IFJlcHVibGljYW5zLiBNZWFud2hpbGUsIFllbGxvd3N0b25lIGNvdW50eSwgaG9tZSBvZiBNU1UtQmlsbGluZ3MsIHNlZW1zIHRvIGJlIGEgZ29vZCBwbGFjZSBmb3IgZXZlcnlvbmUgdG8gaGFuZyBvdXQsIHdpdGggYXBwYXJlbnRseSBwbGVudGlmdWwgRGVtb2NyYXQgYW5kIFJlcHVibGljIHZvdGVycy0td2hpY2ggbWFrZXMgc2Vuc2UsIGJlY2F1c2UgaXQncyByaWdodCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdGF0ZS4gCgo=