Jennifer Ganeles
5/5/19

Marriage Rate and Population by U.S. County: Are people less likely to commit in areas with more options for partners?

This week’s homework uses spatial mapping to explore how population size might compare with marriage rates across the United States. Do higher concentrations of people affect the decision to commit to marriage? Using Social Explorer, I retrieved my data from the American Community Survey (5-Year Estimates). For this analysis, “Marriage Rate” refers to those who made the decision to get married, including both currently married as well as formerly married individuals (e.g. widows, divorcées..etc.).

Using Social Explorer to retrieve county-level information:

Marriage rate was calculated by dividing the total number of people in each county who have made the decision to get married by the total population in each county of those over the age of 15.

library(readr)
library(dplyr)
library(magrittr)
acsdata<-read_csv("/Users/jenniferganeles/Downloads/R12142286_SL050.csv")%>%
    rename(Total_Pop=SE_A00001_001,
         STATEFP=Geo_STATE,
         COUNTYFP=Geo_COUNTY,
         GEOID=Geo_FIPS,
         PopOver15=SE_A11001_001,
         Never_Married=SE_A11001_002,
         Married=SE_A11001_003,
         Separated=SE_A11001_004,
         Widowed=SE_A11001_005,
         Divorced=SE_A11001_006)%>%
  mutate(NM_Rate=Never_Married/PopOver15*100,
         Has_Been_Married=Married+Separated+Widowed+Divorced,
         Marriage_Rate=Has_Been_Married/PopOver15*100)%>%
      select(STATEFP, COUNTYFP, GEOID, Never_Married, Has_Been_Married, PopOver15, NM_Rate, Marriage_Rate)
   
head(acsdata)
summary(acsdata)
   STATEFP            COUNTYFP            GEOID           Never_Married    
 Length:3220        Length:3220        Length:3220        Min.   :     13  
 Class :character   Class :character   Class :character   1st Qu.:   2354  
 Mode  :character   Mode  :character   Mode  :character   Median :   5802  
                                                          Mean   :  27087  
                                                          3rd Qu.:  15678  
                                                          Max.   :3429945  
 Has_Been_Married    PopOver15          NM_Rate      Marriage_Rate  
 Min.   :     54   Min.   :     67   Min.   :10.14   Min.   :32.12  
 1st Qu.:   6737   1st Qu.:   9080   1st Qu.:22.84   1st Qu.:68.36  
 Median :  15218   Median :  21318   Median :26.43   Median :73.57  
 Mean   :  54551   Mean   :  81638   Mean   :27.89   Mean   :72.11  
 3rd Qu.:  38217   3rd Qu.:  54564   3rd Qu.:31.64   3rd Qu.:77.16  
 Max.   :4797906   Max.   :8227851   Max.   :67.88   Max.   :89.86  

Using the Tigris Package to Retrieve County-Level Shapefiles:

library(sf)
library(tigris)
options(tigris_class="sf")
t_county<-counties(cb=TRUE)
names(t_county)
 [1] "STATEFP"  "COUNTYFP" "COUNTYNS" "AFFGEOID" "GEOID"    "NAME"     "LSAD"    
 [8] "ALAND"    "AWATER"   "geometry"

Merging the Data:

comb_data<-t_county%>%
  left_join(acsdata, by="GEOID")

Excluding Peripheral States:

t_comb_data_sub<-comb_data%>%
  filter(STATEFP.x !="02")%>%
  filter(STATEFP.x !="15")%>%
  filter(STATEFP.x !="60")%>%
  filter(STATEFP.x !="66")%>%
  filter(STATEFP.x !="69")%>%
  filter(STATEFP.x !="72")%>%
  filter(STATEFP.x !="78")

Map #1: Population by U.S. County:

library(tmap)
library(tmaptools)
library(RColorBrewer)
us_states<-t_comb_data_sub%>%
  aggregate_map(by="STATEFP.x")
USPopulationRate<-tm_shape(t_comb_data_sub, projection=2163) +tm_fill("PopOver15", title="Population", breaks=c(74,11214,25848,66608,10105722), style="fixed", palette="PuBu", border.col="grey", border.alpha=.4)+tm_shape(us_states)+tm_borders(lwd=.36, col="black", alpha=1) +tm_layout(panel.labels="Population By U.S. County", legend.outside = TRUE, legend.outside.position = "bottom")
USPopulationRate

Due to the large range of population sizes across the country, I manually included legend breaks using the minimum, 1st quartile, median, 3rd quartile, and maximum values.

Map #2: Marriage Rate by U.S. County:

MarriageRate<-tm_shape(t_comb_data_sub, projection = 2163)+tm_fill("Marriage_Rate", title="Marriage_Rate", breaks=c(32.12, 68.36, 73.57, 77.16, 89.86), style="fixed", palette="Reds", border.col="grey", border.alpha=.4)+tm_shape(us_states)+tm_borders(lwd=.36, col="black", alpha=1)+tm_layout(panel.labels="Marriage Rate by U.S. County", legend.outside=TRUE, legend.outside.position = "bottom")
MarriageRate

Once again, I created legend breaks using the minimum, 1st quartile, median, 3rd quartile, and maximum values.

library(grid)
grid.newpage()
pushViewport(viewport(layout=grid.layout(1,2)))
print(USPopulationRate, vp=viewport(layout.pos.col=1))
print(MarriageRate, vp=viewport(layout.pos.col=2))

As one can see from the maps above, there seems to be an inverse relationship between population size and the decision to get married, though this relationship is not perfect. Unsurprisingly, population size is largest along the coast and arond major cities. Marriage rates, on the other hand, appear to be lower in more populated states, such as California and New York. This may suggest that people are less likley to commit when more options for partners are available. However, my analysis is limited as I have not controlled for other factors such as migration and age.

Non-Spatial County-Level Information:

library(ggplot2)
library(ggthemes)
ggplot(data=acsdata, aes(Marriage_Rate))+geom_histogram(aes(fill="Red"))+theme_tufte()+ labs(x="Marriage Rate", y="Number of U.S. Counties")+theme(legend.position="none")

As the histogram above shows, county marriage rates range from around 32% to about 90% with the highest number of counties having a marriage rate of about 73%.

ggplot(data=acsdata, aes(x=PopOver15,y=Marriage_Rate))+
  geom_point()+stat_smooth(method="lm")+ theme_tufte()+labs(x="Population", y="Marriage Rate")

The above linear model graph suggests that as county populations increase, marriage rates tend to decrease.

Spatial vs. Non-Spatial Information:

Spatial mapping describes the absolute and relative location of geographic features, whereas non-spatial data can only describe the characteristics of a geographical feature using numbers, characters, or logical statements. Non-spatial data is oftentimes presented in a way that is difficult for the layman to comprehend or conceptualize. When research is centered around patterns connected to location (e.g. the suitability of a place for a specific activity or event), spatial mapping provides a more understandable visualization of complex spatial issues. However, spatial mapping cannot always provide the level of specificity needed for certain analyses. Non-spatial statistical analysis is therefore needed as well. In my case, spatial mapping provided understandable and intriguing information regarding location, population size, and the tendency to get married, but I used non-spatial data, such as summary statistics, in order to help create the maps in a way that presented the most information.

Example of cb=TRUE vs. cb=FALSE:

When “Cb” (cartographic boundary shapefiles) is set to true, the map is more detailed and precise, whereas “cb”= FALSE produces a less detailed map (see both versions below). The most obvious differences between the below maps is the presence or absence of negative space. When cb=FALSE, certain details, such as lakes and other bodies of water, become non-existent, whereas cb=TRUE is able to differentiate between land and water in areas that are unclear.

t_county2<-counties(cb=FALSE)
names(t_county2)
 [1] "STATEFP"  "COUNTYFP" "COUNTYNS" "GEOID"    "NAME"     "NAMELSAD" "LSAD"    
 [8] "CLASSFP"  "MTFCC"    "CSAFP"    "CBSAFP"   "METDIVFP" "FUNCSTAT" "ALAND"   
[15] "AWATER"   "INTPTLAT" "INTPTLON" "geometry"
comb_data2<-t_county2%>%
  left_join(acsdata, by="GEOID")
t_comb_data_sub2<-comb_data2%>%
  filter(STATEFP.x !="02")%>%
  filter(STATEFP.x !="15")%>%
  filter(STATEFP.x !="60")%>%
  filter(STATEFP.x !="66")%>%
  filter(STATEFP.x !="69")%>%
  filter(STATEFP.x !="72")%>%
  filter(STATEFP.x !="78")
us_states2<-t_comb_data_sub2%>%
  aggregate_map(by="STATEFP.x")
#cb=TRUE
tm_shape(t_comb_data_sub, projection = 2163)+tm_fill("Marriage_Rate", title="Marriage Rate", breaks=c(32.12, 68.36, 73.57, 77.16, 89.86), style="fixed", palette="Reds", border.col="grey", border.alpha=.4)+tm_shape(us_states)+tm_borders(lwd=.36, col="black", alpha=1)+tm_layout(panel.labels="cb=TRUE")

#cb=FALSE
tm_shape(t_comb_data_sub2, projection=2163) +tm_fill("Marriage_Rate", title="Marriage Rate", breaks=c(32.12, 68.36, 73.57, 77.16, 89.86), style="fixed", palette="Reds", border.col="grey", border.alpha=.4)+tm_shape(us_states2)+tm_borders(lwd=.36, col="black", alpha=1) +tm_layout(panel.labels="cb=FALSE")

LS0tCnRpdGxlOiAiU29jIDcxMjogSG9tZXdvcmsgMTAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KKkplbm5pZmVyIEdhbmVsZXMqCjxici8+KjUvNS8xOSoKCiNNYXJyaWFnZSBSYXRlIGFuZCBQb3B1bGF0aW9uIGJ5IFUuUy4gQ291bnR5OiBBcmUgcGVvcGxlIGxlc3MgbGlrZWx5IHRvIGNvbW1pdCBpbiBhcmVhcyB3aXRoIG1vcmUgb3B0aW9ucyBmb3IgcGFydG5lcnM/CgpUaGlzIHdlZWsncyBob21ld29yayB1c2VzIHNwYXRpYWwgbWFwcGluZyB0byBleHBsb3JlIGhvdyBwb3B1bGF0aW9uIHNpemUgbWlnaHQgY29tcGFyZSB3aXRoIG1hcnJpYWdlIHJhdGVzIGFjcm9zcyB0aGUgVW5pdGVkIFN0YXRlcy4gRG8gaGlnaGVyIGNvbmNlbnRyYXRpb25zIG9mIHBlb3BsZSBhZmZlY3QgdGhlIGRlY2lzaW9uIHRvIGNvbW1pdCB0byBtYXJyaWFnZT8gVXNpbmcgU29jaWFsIEV4cGxvcmVyLCBJIHJldHJpZXZlZCBteSBkYXRhIGZyb20gdGhlIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgKDUtWWVhciBFc3RpbWF0ZXMpLiBGb3IgdGhpcyBhbmFseXNpcywgIk1hcnJpYWdlIFJhdGUiIHJlZmVycyB0byB0aG9zZSB3aG8gbWFkZSB0aGUgZGVjaXNpb24gdG8gZ2V0IG1hcnJpZWQsIGluY2x1ZGluZyBib3RoIGN1cnJlbnRseSBtYXJyaWVkIGFzIHdlbGwgYXMgZm9ybWVybHkgbWFycmllZCBpbmRpdmlkdWFscyAoZS5nLiB3aWRvd3MsIGRpdm9yY8OpZXMuLmV0Yy4pLiAKCiMjI1VzaW5nIFNvY2lhbCBFeHBsb3JlciB0byByZXRyaWV2ZSBjb3VudHktbGV2ZWwgaW5mb3JtYXRpb246Ck1hcnJpYWdlIHJhdGUgd2FzIGNhbGN1bGF0ZWQgYnkgZGl2aWRpbmcgKnRoZSB0b3RhbCBudW1iZXIgb2YgcGVvcGxlIGluIGVhY2ggY291bnR5IHdobyBoYXZlIG1hZGUgdGhlIGRlY2lzaW9uIHRvIGdldCBtYXJyaWVkKiBieSAqdGhlIHRvdGFsIHBvcHVsYXRpb24gaW4gZWFjaCBjb3VudHkgb2YgdGhvc2Ugb3ZlciB0aGUgYWdlIG9mIDE1Ki4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShtYWdyaXR0cikKCmFjc2RhdGE8LXJlYWRfY3N2KCIvVXNlcnMvamVubmlmZXJnYW5lbGVzL0Rvd25sb2Fkcy9SMTIxNDIyODZfU0wwNTAuY3N2IiklPiUKICAgIHJlbmFtZShUb3RhbF9Qb3A9U0VfQTAwMDAxXzAwMSwKICAgICAgICAgU1RBVEVGUD1HZW9fU1RBVEUsCiAgICAgICAgIENPVU5UWUZQPUdlb19DT1VOVFksCiAgICAgICAgIEdFT0lEPUdlb19GSVBTLAogICAgICAgICBQb3BPdmVyMTU9U0VfQTExMDAxXzAwMSwKICAgICAgICAgTmV2ZXJfTWFycmllZD1TRV9BMTEwMDFfMDAyLAogICAgICAgICBNYXJyaWVkPVNFX0ExMTAwMV8wMDMsCiAgICAgICAgIFNlcGFyYXRlZD1TRV9BMTEwMDFfMDA0LAogICAgICAgICBXaWRvd2VkPVNFX0ExMTAwMV8wMDUsCiAgICAgICAgIERpdm9yY2VkPVNFX0ExMTAwMV8wMDYpJT4lCiAgbXV0YXRlKE5NX1JhdGU9TmV2ZXJfTWFycmllZC9Qb3BPdmVyMTUqMTAwLAogICAgICAgICBIYXNfQmVlbl9NYXJyaWVkPU1hcnJpZWQrU2VwYXJhdGVkK1dpZG93ZWQrRGl2b3JjZWQsCiAgICAgICAgIE1hcnJpYWdlX1JhdGU9SGFzX0JlZW5fTWFycmllZC9Qb3BPdmVyMTUqMTAwKSU+JQogICAgICBzZWxlY3QoU1RBVEVGUCwgQ09VTlRZRlAsIEdFT0lELCBOZXZlcl9NYXJyaWVkLCBIYXNfQmVlbl9NYXJyaWVkLCBQb3BPdmVyMTUsIE5NX1JhdGUsIE1hcnJpYWdlX1JhdGUpCiAgIApoZWFkKGFjc2RhdGEpCnN1bW1hcnkoYWNzZGF0YSkKYGBgCgoKCgojIyNVc2luZyB0aGUgVGlncmlzIFBhY2thZ2UgdG8gUmV0cmlldmUgQ291bnR5LUxldmVsIFNoYXBlZmlsZXM6CmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoc2YpCmxpYnJhcnkodGlncmlzKQpvcHRpb25zKHRpZ3Jpc19jbGFzcz0ic2YiKQp0X2NvdW50eTwtY291bnRpZXMoY2I9VFJVRSkKbmFtZXModF9jb3VudHkpCmBgYAojIyNNZXJnaW5nIHRoZSBEYXRhOgpgYGB7cn0KY29tYl9kYXRhPC10X2NvdW50eSU+JQogIGxlZnRfam9pbihhY3NkYXRhLCBieT0iR0VPSUQiKQpgYGAKCiMjI0V4Y2x1ZGluZyBQZXJpcGhlcmFsIFN0YXRlczoKYGBge3J9CnRfY29tYl9kYXRhX3N1YjwtY29tYl9kYXRhJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSIwMiIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSIxNSIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI2MCIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI2NiIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI2OSIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI3MiIpJT4lCiAgZmlsdGVyKFNUQVRFRlAueCAhPSI3OCIpCmBgYAoKCiMjIyBNYXAgIzE6IFBvcHVsYXRpb24gYnkgVS5TLiBDb3VudHk6CgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRtYXApCmxpYnJhcnkodG1hcHRvb2xzKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKdXNfc3RhdGVzPC10X2NvbWJfZGF0YV9zdWIlPiUKICBhZ2dyZWdhdGVfbWFwKGJ5PSJTVEFURUZQLngiKQpVU1BvcHVsYXRpb25SYXRlPC10bV9zaGFwZSh0X2NvbWJfZGF0YV9zdWIsIHByb2plY3Rpb249MjE2MykgK3RtX2ZpbGwoIlBvcE92ZXIxNSIsIHRpdGxlPSJQb3B1bGF0aW9uIiwgYnJlYWtzPWMoNzQsMTEyMTQsMjU4NDgsNjY2MDgsMTAxMDU3MjIpLCBzdHlsZT0iZml4ZWQiLCBwYWxldHRlPSJQdUJ1IiwgYm9yZGVyLmNvbD0iZ3JleSIsIGJvcmRlci5hbHBoYT0uNCkrdG1fc2hhcGUodXNfc3RhdGVzKSt0bV9ib3JkZXJzKGx3ZD0uMzYsIGNvbD0iYmxhY2siLCBhbHBoYT0xKSArdG1fbGF5b3V0KHBhbmVsLmxhYmVscz0iUG9wdWxhdGlvbiBCeSBVLlMuIENvdW50eSIsIGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSAiYm90dG9tIikKVVNQb3B1bGF0aW9uUmF0ZQpgYGAKRHVlIHRvIHRoZSBsYXJnZSByYW5nZSBvZiBwb3B1bGF0aW9uIHNpemVzIGFjcm9zcyB0aGUgY291bnRyeSwgSSBtYW51YWxseSBpbmNsdWRlZCBsZWdlbmQgYnJlYWtzIHVzaW5nIHRoZSBtaW5pbXVtLCAxc3QgcXVhcnRpbGUsIG1lZGlhbiwgM3JkIHF1YXJ0aWxlLCBhbmQgbWF4aW11bSB2YWx1ZXMuIAoKIyMjTWFwICMyOiBNYXJyaWFnZSBSYXRlIGJ5IFUuUy4gQ291bnR5OgoKYGBge3J9Ck1hcnJpYWdlUmF0ZTwtdG1fc2hhcGUodF9jb21iX2RhdGFfc3ViLCBwcm9qZWN0aW9uID0gMjE2MykrdG1fZmlsbCgiTWFycmlhZ2VfUmF0ZSIsIHRpdGxlPSJNYXJyaWFnZV9SYXRlIiwgYnJlYWtzPWMoMzIuMTIsIDY4LjM2LCA3My41NywgNzcuMTYsIDg5Ljg2KSwgc3R5bGU9ImZpeGVkIiwgcGFsZXR0ZT0iUmVkcyIsIGJvcmRlci5jb2w9ImdyZXkiLCBib3JkZXIuYWxwaGE9LjQpK3RtX3NoYXBlKHVzX3N0YXRlcykrdG1fYm9yZGVycyhsd2Q9LjM2LCBjb2w9ImJsYWNrIiwgYWxwaGE9MSkrdG1fbGF5b3V0KHBhbmVsLmxhYmVscz0iTWFycmlhZ2UgUmF0ZSBieSBVLlMuIENvdW50eSIsIGxlZ2VuZC5vdXRzaWRlPVRSVUUsIGxlZ2VuZC5vdXRzaWRlLnBvc2l0aW9uID0gImJvdHRvbSIpCk1hcnJpYWdlUmF0ZQpgYGAKT25jZSBhZ2FpbiwgSSBjcmVhdGVkIGxlZ2VuZCBicmVha3MgdXNpbmcgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIHZhbHVlcy4KCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoZ3JpZCkKZ3JpZC5uZXdwYWdlKCkKcHVzaFZpZXdwb3J0KHZpZXdwb3J0KGxheW91dD1ncmlkLmxheW91dCgxLDIpKSkKcHJpbnQoVVNQb3B1bGF0aW9uUmF0ZSwgdnA9dmlld3BvcnQobGF5b3V0LnBvcy5jb2w9MSkpCnByaW50KE1hcnJpYWdlUmF0ZSwgdnA9dmlld3BvcnQobGF5b3V0LnBvcy5jb2w9MikpCmBgYAoKQXMgb25lIGNhbiBzZWUgZnJvbSB0aGUgbWFwcyBhYm92ZSwgdGhlcmUgc2VlbXMgdG8gYmUgYW4gaW52ZXJzZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3B1bGF0aW9uIHNpemUgYW5kIHRoZSBkZWNpc2lvbiB0byBnZXQgbWFycmllZCwgdGhvdWdoIHRoaXMgcmVsYXRpb25zaGlwIGlzIG5vdCBwZXJmZWN0LiBVbnN1cnByaXNpbmdseSwgcG9wdWxhdGlvbiBzaXplIGlzIGxhcmdlc3QgYWxvbmcgdGhlIGNvYXN0IGFuZCBhcm9uZCBtYWpvciBjaXRpZXMuIE1hcnJpYWdlIHJhdGVzLCBvbiB0aGUgb3RoZXIgaGFuZCwgYXBwZWFyIHRvIGJlIGxvd2VyIGluIG1vcmUgcG9wdWxhdGVkIHN0YXRlcywgc3VjaCBhcyBDYWxpZm9ybmlhIGFuZCBOZXcgWW9yay4gVGhpcyBtYXkgc3VnZ2VzdCB0aGF0IHBlb3BsZSBhcmUgbGVzcyBsaWtsZXkgdG8gY29tbWl0IHdoZW4gbW9yZSBvcHRpb25zIGZvciBwYXJ0bmVycyBhcmUgYXZhaWxhYmxlLiBIb3dldmVyLCBteSBhbmFseXNpcyBpcyBsaW1pdGVkIGFzIEkgaGF2ZSBub3QgY29udHJvbGxlZCBmb3Igb3RoZXIgZmFjdG9ycyBzdWNoIGFzIG1pZ3JhdGlvbiBhbmQgYWdlLiAKCiMjI05vbi1TcGF0aWFsIENvdW50eS1MZXZlbCBJbmZvcm1hdGlvbjogCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2d0aGVtZXMpCmdncGxvdChkYXRhPWFjc2RhdGEsIGFlcyhNYXJyaWFnZV9SYXRlKSkrZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGw9IlJlZCIpKSt0aGVtZV90dWZ0ZSgpKyBsYWJzKHg9Ik1hcnJpYWdlIFJhdGUiLCB5PSJOdW1iZXIgb2YgVS5TLiBDb3VudGllcyIpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYApBcyB0aGUgaGlzdG9ncmFtIGFib3ZlIHNob3dzLCBjb3VudHkgbWFycmlhZ2UgcmF0ZXMgcmFuZ2UgZnJvbSBhcm91bmQgMzIlIHRvIGFib3V0IDkwJSB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjb3VudGllcyBoYXZpbmcgYSBtYXJyaWFnZSByYXRlIG9mIGFib3V0IDczJS4KCmBgYHtyfQpnZ3Bsb3QoZGF0YT1hY3NkYXRhLCBhZXMoeD1Qb3BPdmVyMTUseT1NYXJyaWFnZV9SYXRlKSkrCiAgZ2VvbV9wb2ludCgpK3N0YXRfc21vb3RoKG1ldGhvZD0ibG0iKSsgdGhlbWVfdHVmdGUoKStsYWJzKHg9IlBvcHVsYXRpb24iLCB5PSJNYXJyaWFnZSBSYXRlIikKYGBgClRoZSBhYm92ZSBsaW5lYXIgbW9kZWwgZ3JhcGggc3VnZ2VzdHMgdGhhdCBhcyBjb3VudHkgcG9wdWxhdGlvbnMgaW5jcmVhc2UsIG1hcnJpYWdlIHJhdGVzIHRlbmQgdG8gZGVjcmVhc2UuIAoKIyMjU3BhdGlhbCB2cy4gTm9uLVNwYXRpYWwgSW5mb3JtYXRpb246ClNwYXRpYWwgbWFwcGluZyBkZXNjcmliZXMgdGhlIGFic29sdXRlIGFuZCByZWxhdGl2ZSBsb2NhdGlvbiBvZiBnZW9ncmFwaGljIGZlYXR1cmVzLCB3aGVyZWFzIG5vbi1zcGF0aWFsIGRhdGEgY2FuIG9ubHkgZGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIGdlb2dyYXBoaWNhbCBmZWF0dXJlIHVzaW5nIG51bWJlcnMsIGNoYXJhY3RlcnMsIG9yIGxvZ2ljYWwgc3RhdGVtZW50cy4gTm9uLXNwYXRpYWwgZGF0YSBpcyBvZnRlbnRpbWVzIHByZXNlbnRlZCBpbiBhIHdheSB0aGF0IGlzIGRpZmZpY3VsdCBmb3IgdGhlIGxheW1hbiB0byBjb21wcmVoZW5kIG9yIGNvbmNlcHR1YWxpemUuIFdoZW4gcmVzZWFyY2ggaXMgY2VudGVyZWQgYXJvdW5kIHBhdHRlcm5zIGNvbm5lY3RlZCB0byBsb2NhdGlvbiAoZS5nLiB0aGUgc3VpdGFiaWxpdHkgb2YgYSBwbGFjZSBmb3IgYSBzcGVjaWZpYyBhY3Rpdml0eSBvciBldmVudCksIHNwYXRpYWwgbWFwcGluZyBwcm92aWRlcyBhIG1vcmUgdW5kZXJzdGFuZGFibGUgdmlzdWFsaXphdGlvbiBvZiBjb21wbGV4IHNwYXRpYWwgaXNzdWVzLiAgSG93ZXZlciwgc3BhdGlhbCBtYXBwaW5nIGNhbm5vdCBhbHdheXMgcHJvdmlkZSB0aGUgbGV2ZWwgb2Ygc3BlY2lmaWNpdHkgbmVlZGVkIGZvciBjZXJ0YWluIGFuYWx5c2VzLiBOb24tc3BhdGlhbCBzdGF0aXN0aWNhbCBhbmFseXNpcyBpcyB0aGVyZWZvcmUgbmVlZGVkIGFzIHdlbGwuIEluIG15IGNhc2UsIHNwYXRpYWwgbWFwcGluZyBwcm92aWRlZCB1bmRlcnN0YW5kYWJsZSBhbmQgaW50cmlndWluZyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgbG9jYXRpb24sIHBvcHVsYXRpb24gc2l6ZSwgYW5kIHRoZSB0ZW5kZW5jeSB0byBnZXQgbWFycmllZCwgYnV0IEkgdXNlZCBub24tc3BhdGlhbCBkYXRhLCBzdWNoIGFzIHN1bW1hcnkgc3RhdGlzdGljcywgaW4gb3JkZXIgdG8gaGVscCBjcmVhdGUgdGhlIG1hcHMgaW4gYSB3YXkgdGhhdCBwcmVzZW50ZWQgdGhlIG1vc3QgaW5mb3JtYXRpb24uIAoKCiMjI0V4YW1wbGUgb2YgY2I9VFJVRSB2cy4gY2I9RkFMU0U6IApXaGVuICJDYiIgKGNhcnRvZ3JhcGhpYyBib3VuZGFyeSBzaGFwZWZpbGVzKSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIG1hcCBpcyBtb3JlIGRldGFpbGVkIGFuZCBwcmVjaXNlLCB3aGVyZWFzICJjYiI9IEZBTFNFIHByb2R1Y2VzIGEgbGVzcyBkZXRhaWxlZCBtYXAgKHNlZSBib3RoIHZlcnNpb25zIGJlbG93KS4gVGhlIG1vc3Qgb2J2aW91cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBiZWxvdyBtYXBzIGlzIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIG5lZ2F0aXZlIHNwYWNlLiBXaGVuIGNiPUZBTFNFLCBjZXJ0YWluIGRldGFpbHMsIHN1Y2ggYXMgbGFrZXMgYW5kIG90aGVyIGJvZGllcyBvZiB3YXRlciwgYmVjb21lIG5vbi1leGlzdGVudCwgd2hlcmVhcyBjYj1UUlVFIGlzIGFibGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxhbmQgYW5kIHdhdGVyIGluIGFyZWFzIHRoYXQgYXJlIHVuY2xlYXIuCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CnRfY291bnR5MjwtY291bnRpZXMoY2I9RkFMU0UpCm5hbWVzKHRfY291bnR5MikKYGBgCgpgYGB7cn0KY29tYl9kYXRhMjwtdF9jb3VudHkyJT4lCiAgbGVmdF9qb2luKGFjc2RhdGEsIGJ5PSJHRU9JRCIpCmBgYApgYGB7cn0KdF9jb21iX2RhdGFfc3ViMjwtY29tYl9kYXRhMiU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iMDIiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iMTUiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNjAiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNjYiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNjkiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNzIiKSU+JQogIGZpbHRlcihTVEFURUZQLnggIT0iNzgiKQpgYGAKCmBgYHtyfQp1c19zdGF0ZXMyPC10X2NvbWJfZGF0YV9zdWIyJT4lCiAgYWdncmVnYXRlX21hcChieT0iU1RBVEVGUC54IikKYGBgIAoKYGBge3J9CiNjYj1UUlVFCnRtX3NoYXBlKHRfY29tYl9kYXRhX3N1YiwgcHJvamVjdGlvbiA9IDIxNjMpK3RtX2ZpbGwoIk1hcnJpYWdlX1JhdGUiLCB0aXRsZT0iTWFycmlhZ2UgUmF0ZSIsIGJyZWFrcz1jKDMyLjEyLCA2OC4zNiwgNzMuNTcsIDc3LjE2LCA4OS44NiksIHN0eWxlPSJmaXhlZCIsIHBhbGV0dGU9IlJlZHMiLCBib3JkZXIuY29sPSJncmV5IiwgYm9yZGVyLmFscGhhPS40KSt0bV9zaGFwZSh1c19zdGF0ZXMpK3RtX2JvcmRlcnMobHdkPS4zNiwgY29sPSJibGFjayIsIGFscGhhPTEpK3RtX2xheW91dChwYW5lbC5sYWJlbHM9ImNiPVRSVUUiKQojY2I9RkFMU0UKdG1fc2hhcGUodF9jb21iX2RhdGFfc3ViMiwgcHJvamVjdGlvbj0yMTYzKSArdG1fZmlsbCgiTWFycmlhZ2VfUmF0ZSIsIHRpdGxlPSJNYXJyaWFnZSBSYXRlIiwgYnJlYWtzPWMoMzIuMTIsIDY4LjM2LCA3My41NywgNzcuMTYsIDg5Ljg2KSwgc3R5bGU9ImZpeGVkIiwgcGFsZXR0ZT0iUmVkcyIsIGJvcmRlci5jb2w9ImdyZXkiLCBib3JkZXIuYWxwaGE9LjQpK3RtX3NoYXBlKHVzX3N0YXRlczIpK3RtX2JvcmRlcnMobHdkPS4zNiwgY29sPSJibGFjayIsIGFscGhhPTEpICt0bV9sYXlvdXQocGFuZWwubGFiZWxzPSJjYj1GQUxTRSIpCmBgYAoK