1 Section - Objectives

The objective of this project is to create a relational database and pull various data sets together into in order to perform exploratory data analysis of Election, Unemployment, Poverty, and Education data. The goal is to learn how to use sql and data management skills to pull needed variables into one dataframe to perform necessary Exploratory Data Analysis.

1.1 Data Integration

1.1.1 Data Preparation - Initial Download and Analysis

In order to create a database all four of the datasets needed must be downloaded. Once all data is incorporated it is necessary to get a basic understanding of each dataset. The four datasets used in this project as education, which contains variables looking at education levels in various states. The second dataset is unemployment, which contains information pertaining to unemployment rates in different states and counties. The third dataset is poverty, which pertains information about poverty rates across the united states. The final dataset is contains election data, such as parties and the winning party for previous elections.

Here is a quick summary of the four datasets. A connection is then made to a sqlite database and data tables are input. Now the process of data integration can begin.

1.1.2 Data Preparation - Presidential Election Data

When preparing the first data set, Presidential Election Data, it must fit the following requirements: 1.only use the 2020 election data 2.only keep the data for the two major parties: Democrats and Republicans 3.aggregate the total votes and keep the winning party in the data 4.county FIPS code, State name, county name, total votes received in the winning party, and the name of the party.

SELECT 
    county_fips AS fips_code,
    state,
    county_name,
    SUM(totalvotes) AS total_votes,
    CASE 
        WHEN SUM(CASE WHEN party = 'DEMOCRAT' THEN candidatevotes ELSE 0 END) > 
             SUM(CASE WHEN party = 'REPUBLICAN' THEN candidatevotes ELSE 0 END) 
        THEN 'DEMOCRAT'
        ELSE 'REPUBLICAN'
    END AS winning_party
FROM 
    election
WHERE 
    year = 2020 
    AND party IN ('DEMOCRAT', 'REPUBLICAN')
GROUP BY 
    county_fips, state, county_name;

1.1.3 Data Preparation - Unemployment Data

When preparing the second data set, Unemployment Data, it must fit the following requirements: 1.Only keep the unemployment date in the year 2020 or the most recent year if the 2020 employment rate is unavailable 2.County FIPS code 3.Unemployment rate

I renamed ‘FIPS_Code’ to ‘fips_code’ for data consistency. Value was also renamed to unemployment_rate for clarity when it comes to merging datasets. The substring function was used on the ‘Attribute’ varible in order to extract the year 2020. This was aptly named ‘year’.

SELECT 
    FIPS_Code AS fips_code,
    Value AS unemployment_rate, 
    SUBSTR(Attribute, -4) AS year
FROM 
    unemployment
WHERE 
    year = "2020"

1.1.4 Data Preparation - Poverty Data

When preparing the third data set, Poverty Data, it must fit the following requirements: 1.Keep only 2019 poverty rate 2.County FIPS code

I renamed ‘FIPStxt’ to ‘fips_code’ for data consistancy. Value was also renamed to poverty_rate for clarity when it comes to merging datasets.

SELECT 
    FIPStxt AS fips_code,
    Value as poverty_rate
FROM 
    poverty
WHERE 
    Attribute = "PCTPOVALL_2019";

1.1.5 Data Preparation - Education Data

When preparing the final data set, Education Data, it must fit the following requirements: 1.only keep the percentage of education levels between 2015 and 2019. a.Education levels b.less than a high school diploma c.high school diploma d.completed some college (1-3 years) e.completed four years of college 2.County FIPS code

I renamed the variables above to ‘fips_code’ and replaced all “.” with “_” in order to run a sql query.

SELECT 
    fips_code,
    Percent_of_adults_with_less_than_a_high_school_diploma__2015_19,
    Percent_of_adults_with_a_high_school_diploma_only__2015_19,
    Percent_of_adults_completing_some_college_or_associate_s_degree__2015_19,
    Percent_of_adults_with_a_bachelor_s_degree_or_higher__2015_19
FROM 
    education
GROUP BY 
    fips_code;

1.1.6 Merge Datasets

Here I left joined all datasets together. Then, using the dplyr library, I removed all duplicates based on the fips_code and any missing observations. The final dataset is called fips_202_elections. This dataset has 3113 observations consisting of 12 variables of interest.

2 Exploratory Data Anaylsis

2.1 Univariate Analysis

The first EDA I want to do is a univariate analysis of the variable “winning_party” Below is pie chart that shows the distribution of winning parties.

From this chart we can see that the republican party has a higher amount of winning counties than the democratic party. However, in the electoral college, it is not how many counties your party wins, but how many delegates belong to that county. In 2020 the Democratic party won the presidency, this was done by winning fewer but larger counties with more delegates.

2.2 Bivariate Anaylsis

In looking at two continous varibles “poverty_rate” and “unemployment_rate” the best way to visualize if there is any association is through a scatterplot. The plot can be seen below.

Here we can see that there does not seem to be an association between poverty rate and unemployment rate in the 2020 presidential election. A statistical test to confirm this would be Pearson’s Correlation test. ## Pairwise comparisons

A pairwise comparisons was conducted for adults and various educational levels. The graphic can be seen below.

# Results and Discussions In this project four datasets were queried in a SQLite database and merged into one dataframe in order to perform Exploratory Data Analysis. When looking at the distribution of winning parties, we see that the Republication Party won a larger amount of counties compared to the Democratic Party. In a Bivariate analysis looking for an association between poverty rate and unemployment rate, none was found. Finally a pairwise analysis was conducted looking at correlations between party and educational levels. Here it can be seen higher education had a negative correlation both parties, except for republicans with a bachelor degree or higher. This can be due to where colleges are located in specific counties or job opportunists for professionals.

DQotLS0NCnRpdGxlOiAiU1FMIGFuZCBFREEgb2YgRWxlY3Rpb24gRGF0YSINCmF1dGhvcjogIkplc3NpY2EgR29yciINCmRhdGU6ICI5LzI1LzIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICAgIGZvbnQtd2VpZ2h0OmJvbGQ7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6Ym9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OmJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpvcHRpb25zKHJlcG9zID0gbGlzdChDUkFOPSJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJvZGJjIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIm9kYmMiKQ0KICAgbGlicmFyeShvZGJjKQ0KfQ0KaWYgKCFyZXF1aXJlKCJEQkkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiREJJIikNCiAgIGxpYnJhcnkoREJJKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSU1FMaXRlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlJTUUxpdGUiKQ0KICAgbGlicmFyeShSU1FMaXRlKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KDQoNClwNCg0KIyBTZWN0aW9uIC0gT2JqZWN0aXZlcw0KVGhlIG9iamVjdGl2ZSBvZiB0aGlzIHByb2plY3QgaXMgdG8gY3JlYXRlIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBhbmQgcHVsbCB2YXJpb3VzIGRhdGEgc2V0cyB0b2dldGhlciBpbnRvIGluIG9yZGVyIHRvIHBlcmZvcm0gZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyBvZiBFbGVjdGlvbiwgVW5lbXBsb3ltZW50LCBQb3ZlcnR5LCBhbmQgRWR1Y2F0aW9uIGRhdGEuIFRoZSBnb2FsIGlzIHRvIGxlYXJuIGhvdyB0byB1c2Ugc3FsIGFuZCBkYXRhIG1hbmFnZW1lbnQgc2tpbGxzIHRvIHB1bGwgbmVlZGVkIHZhcmlhYmxlcyBpbnRvIG9uZSBkYXRhZnJhbWUgdG8gcGVyZm9ybSBuZWNlc3NhcnkgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcy4NCg0KIyMgRGF0YSBJbnRlZ3JhdGlvbg0KIyMjIERhdGEgUHJlcGFyYXRpb24gLSBJbml0aWFsIERvd25sb2FkIGFuZCBBbmFseXNpcw0KSW4gb3JkZXIgdG8gY3JlYXRlIGEgZGF0YWJhc2UgYWxsIGZvdXIgb2YgdGhlIGRhdGFzZXRzIG5lZWRlZCBtdXN0IGJlIGRvd25sb2FkZWQuIE9uY2UgYWxsIGRhdGEgaXMgaW5jb3Jwb3JhdGVkIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQgYSBiYXNpYyB1bmRlcnN0YW5kaW5nIG9mIGVhY2ggZGF0YXNldC4gVGhlIGZvdXIgZGF0YXNldHMgdXNlZCBpbiB0aGlzIHByb2plY3QgYXMgZWR1Y2F0aW9uLCB3aGljaCBjb250YWlucyB2YXJpYWJsZXMgbG9va2luZyBhdCBlZHVjYXRpb24gbGV2ZWxzIGluIHZhcmlvdXMgc3RhdGVzLiBUaGUgc2Vjb25kIGRhdGFzZXQgaXMgdW5lbXBsb3ltZW50LCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIHRvIHVuZW1wbG95bWVudCByYXRlcyBpbiBkaWZmZXJlbnQgc3RhdGVzIGFuZCBjb3VudGllcy4gVGhlIHRoaXJkIGRhdGFzZXQgaXMgcG92ZXJ0eSwgd2hpY2ggcGVydGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgcG92ZXJ0eSByYXRlcyBhY3Jvc3MgdGhlIHVuaXRlZCBzdGF0ZXMuIFRoZSBmaW5hbCBkYXRhc2V0IGlzIGNvbnRhaW5zIGVsZWN0aW9uIGRhdGEsIHN1Y2ggYXMgcGFydGllcyBhbmQgdGhlIHdpbm5pbmcgcGFydHkgZm9yIHByZXZpb3VzIGVsZWN0aW9ucy4NCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiNMb2FkIHRoZSBzYW1wbGUgZGF0YQ0KZWR1Y2F0aW9uIDwtIHJlYWQuY3N2KCJodHRwczovL2plc3Nnb3JyMDEuZ2l0aHViLmlvL1NUQTU1MS9FZHVjYXRpb24uY3N2IikNCnBvdmVydHkgPC0gcmVhZC5jc3YoImh0dHBzOi8vamVzc2dvcnIwMS5naXRodWIuaW8vU1RBNTUxL1BvdmVydHlFc3RpbWF0ZXMuY3N2IikNCnVuZW1wbG95bWVudCA8LSByZWFkLmNzdigiaHR0cHM6Ly9qZXNzZ29ycjAxLmdpdGh1Yi5pby9TVEE1NTEvVW5lbXBsb3ltZW50LmNzdiIpDQplbGVjdGlvbiA8LSByZWFkLmNzdigiaHR0cHM6Ly9qZXNzZ29ycjAxLmdpdGh1Yi5pby9TVEE1NTEvY291bnR5cHJlc2lkZW50aWFsX2VsZWN0aW9uXzIwMDAtMjAyMC5jc3YiKQ0KDQplZHVjYXRpb24gPC0gZWR1Y2F0aW9uICU+JQ0KICByZW5hbWUoZmlwc19jb2RlID0gRklQUy5Db2RlLA0KICAgICAgICAgUGVyY2VudF9vZl9hZHVsdHNfd2l0aF9sZXNzX3RoYW5fYV9oaWdoX3NjaG9vbF9kaXBsb21hX18yMDE1XzE5ID0gUGVyY2VudC5vZi5hZHVsdHMud2l0aC5sZXNzLnRoYW4uYS5oaWdoLnNjaG9vbC5kaXBsb21hLi4yMDE1LjE5LA0KICAgICAgICAgUGVyY2VudF9vZl9hZHVsdHNfd2l0aF9hX2hpZ2hfc2Nob29sX2RpcGxvbWFfb25seV9fMjAxNV8xOSA9IFBlcmNlbnQub2YuYWR1bHRzLndpdGguYS5oaWdoLnNjaG9vbC5kaXBsb21hLm9ubHkuLjIwMTUuMTksDQogICAgICAgICBQZXJjZW50X29mX2FkdWx0c19jb21wbGV0aW5nX3NvbWVfY29sbGVnZV9vcl9hc3NvY2lhdGVfc19kZWdyZWVfXzIwMTVfMTkgPSBQZXJjZW50Lm9mLmFkdWx0cy5jb21wbGV0aW5nLnNvbWUuY29sbGVnZS5vci5hc3NvY2lhdGUucy5kZWdyZWUuLjIwMTUuMTksDQogICAgICAgICBQZXJjZW50X29mX2FkdWx0c193aXRoX2FfYmFjaGVsb3Jfc19kZWdyZWVfb3JfaGlnaGVyX18yMDE1XzE5ID0gUGVyY2VudC5vZi5hZHVsdHMud2l0aC5hLmJhY2hlbG9yLnMuZGVncmVlLm9yLmhpZ2hlci4uMjAxNS4xOSkNCmBgYA0KSGVyZSBpcyBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlIGZvdXIgZGF0YXNldHMuIEEgY29ubmVjdGlvbiBpcyB0aGVuIG1hZGUgdG8gYSBzcWxpdGUgZGF0YWJhc2UgYW5kIGRhdGEgdGFibGVzIGFyZSBpbnB1dC4gTm93IHRoZSBwcm9jZXNzIG9mIGRhdGEgaW50ZWdyYXRpb24gY2FuIGJlZ2luLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpzdW1tYXJ5KGVkdWNhdGlvbikNCnN1bW1hcnkocG92ZXJ0eSkNCnN1bW1hcnkodW5lbXBsb3ltZW50KQ0Kc3VtbWFyeShlbGVjdGlvbikNCmBgYA0KYGBgYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI0NyZWF0ZSBkYXRhYmFzZQ0KY29uIDwtIGRiQ29ubmVjdChkcnYgPSBTUUxpdGUoKSwNCiAgICAgICAgICAgICAgICAgZGJuYW1lID0gIjptZW1vcnk6IikNCg0KI3N0b3JlIHNhbXBsZSBkYXRhIGluIHRoZSBkYXRhYmFzZQ0KZGJXcml0ZVRhYmxlKGNvbm4gPSBjb24sIA0KICAgICAgICAgICAgIG5hbWUgPSAiZWR1Y2F0aW9uIiwNCiAgICAgICAgICAgICB2YWx1ZSA9IGVkdWNhdGlvbikNCg0KZGJXcml0ZVRhYmxlKGNvbm4gPSBjb24sIA0KICAgICAgICAgICAgIG5hbWUgPSAicG92ZXJ0eSIsDQogICAgICAgICAgICAgdmFsdWUgPSBwb3ZlcnR5KQ0KDQpkYldyaXRlVGFibGUoY29ubiA9IGNvbiwgDQogICAgICAgICAgICAgbmFtZSA9ICJ1bmVtcGxveW1lbnQiLA0KICAgICAgICAgICAgIHZhbHVlID0gdW5lbXBsb3ltZW50KQ0KZGJXcml0ZVRhYmxlKGNvbm4gPSBjb24sIA0KICAgICAgICAgICAgIG5hbWUgPSAiZWxlY3Rpb24iLA0KICAgICAgICAgICAgIHZhbHVlID0gZWxlY3Rpb24pDQogDQojcmVtb3ZlIHRoZSBsb2NhbCBkYXRhIGZyb20gdGhlIGVudmlyb25tZW50DQpybShlZHVjYXRpb24scG92ZXJ0eSwgdW5lbXBsb3ltZW50LCBlbGVjdGlvbikNCmBgYA0KDQpgYGBgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQp0Ymwoc3JjID0gY29uLCAgICAgICAgICMgIHRoZSBzb3VyY2UgaWYgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZQ0KICAgIGMoImVkdWNhdGlvbiIpKSAgICAgICMgIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBwcmV2aWV3DQp0Ymwoc3JjID0gY29uLCAicG92ZXJ0eSIpDQp0Ymwoc3JjID0gY29uLCAidW5lbXBsb3ltZW50IikNCnRibChzcmMgPSBjb24sICJlbGVjdGlvbiIpDQpgYGANCiMjIyBEYXRhIFByZXBhcmF0aW9uIC0gUHJlc2lkZW50aWFsIEVsZWN0aW9uIERhdGENCg0KV2hlbiBwcmVwYXJpbmcgdGhlIGZpcnN0IGRhdGEgc2V0LCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gRGF0YSwgaXQgbXVzdCBmaXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQogIDEub25seSB1c2UgdGhlIDIwMjAgZWxlY3Rpb24gZGF0YQ0KICAyLm9ubHkga2VlcCB0aGUgZGF0YSBmb3IgdGhlIHR3byBtYWpvciBwYXJ0aWVzOiBEZW1vY3JhdHMgYW5kIFJlcHVibGljYW5zDQogIDMuYWdncmVnYXRlIHRoZSB0b3RhbCB2b3RlcyBhbmQga2VlcCB0aGUgd2lubmluZyBwYXJ0eSBpbiB0aGUgZGF0YQ0KICA0LmNvdW50eSBGSVBTIGNvZGUsIFN0YXRlIG5hbWUsIGNvdW50eSBuYW1lLCB0b3RhbCB2b3RlcyByZWNlaXZlZCBpbiB0aGUgd2lubmluZyBwYXJ0eSwgYW5kIHRoZSBuYW1lIG9mIHRoZSBwYXJ0eS4NCiAgDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gImNvbiIsIG91dHB1dC52YXIgPSAiZWxlY3Rpb25fbmV3In0NClNFTEVDVCANCiAgICBjb3VudHlfZmlwcyBBUyBmaXBzX2NvZGUsDQogICAgc3RhdGUsDQogICAgY291bnR5X25hbWUsDQogICAgU1VNKHRvdGFsdm90ZXMpIEFTIHRvdGFsX3ZvdGVzLA0KICAgIENBU0UgDQogICAgICAgIFdIRU4gU1VNKENBU0UgV0hFTiBwYXJ0eSA9ICdERU1PQ1JBVCcgVEhFTiBjYW5kaWRhdGV2b3RlcyBFTFNFIDAgRU5EKSA+IA0KICAgICAgICAgICAgIFNVTShDQVNFIFdIRU4gcGFydHkgPSAnUkVQVUJMSUNBTicgVEhFTiBjYW5kaWRhdGV2b3RlcyBFTFNFIDAgRU5EKSANCiAgICAgICAgVEhFTiAnREVNT0NSQVQnDQogICAgICAgIEVMU0UgJ1JFUFVCTElDQU4nDQogICAgRU5EIEFTIHdpbm5pbmdfcGFydHkNCkZST00gDQogICAgZWxlY3Rpb24NCldIRVJFIA0KICAgIHllYXIgPSAyMDIwIA0KICAgIEFORCBwYXJ0eSBJTiAoJ0RFTU9DUkFUJywgJ1JFUFVCTElDQU4nKQ0KR1JPVVAgQlkgDQogICAgY291bnR5X2ZpcHMsIHN0YXRlLCBjb3VudHlfbmFtZTsNCg0KYGBgDQojIyMgRGF0YSBQcmVwYXJhdGlvbiAtIFVuZW1wbG95bWVudCBEYXRhDQpXaGVuIHByZXBhcmluZyB0aGUgc2Vjb25kIGRhdGEgc2V0LCBVbmVtcGxveW1lbnQgRGF0YSwgaXQgbXVzdCBmaXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQogIDEuT25seSBrZWVwIHRoZSB1bmVtcGxveW1lbnQgZGF0ZSBpbiB0aGUgeWVhciAyMDIwIG9yIHRoZSBtb3N0IHJlY2VudCB5ZWFyIGlmIHRoZSAyMDIwIGVtcGxveW1lbnQgcmF0ZSBpcyB1bmF2YWlsYWJsZQ0KICAyLkNvdW50eSBGSVBTIGNvZGUNCiAgMy5VbmVtcGxveW1lbnQgcmF0ZQ0KICANCkkgcmVuYW1lZCAnRklQU19Db2RlJyB0byAnZmlwc19jb2RlJyBmb3IgZGF0YSBjb25zaXN0ZW5jeS4gVmFsdWUgd2FzIGFsc28gcmVuYW1lZCB0byB1bmVtcGxveW1lbnRfcmF0ZSBmb3IgY2xhcml0eSB3aGVuIGl0IGNvbWVzIHRvIG1lcmdpbmcgZGF0YXNldHMuIFRoZSBzdWJzdHJpbmcgZnVuY3Rpb24gd2FzIHVzZWQgb24gdGhlICdBdHRyaWJ1dGUnIHZhcmlibGUgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgeWVhciAyMDIwLiBUaGlzIHdhcyBhcHRseSBuYW1lZCAneWVhcicuDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gImNvbiIsIG91dHB1dC52YXIgPSAidW5lbXBsb3ltZW50X25ldyJ9DQpTRUxFQ1QgDQogICAgRklQU19Db2RlIEFTIGZpcHNfY29kZSwNCiAgICBWYWx1ZSBBUyB1bmVtcGxveW1lbnRfcmF0ZSwgDQogICAgU1VCU1RSKEF0dHJpYnV0ZSwgLTQpIEFTIHllYXINCkZST00gDQogICAgdW5lbXBsb3ltZW50DQpXSEVSRSANCiAgICB5ZWFyID0gIjIwMjAiDQoNCmBgYA0KICANCiMjIyBEYXRhIFByZXBhcmF0aW9uIC0gUG92ZXJ0eSBEYXRhDQpXaGVuIHByZXBhcmluZyB0aGUgdGhpcmQgZGF0YSBzZXQsIFBvdmVydHkgRGF0YSwgaXQgbXVzdCBmaXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQogIDEuS2VlcCBvbmx5IDIwMTkgcG92ZXJ0eSByYXRlDQogIDIuQ291bnR5IEZJUFMgY29kZQ0KDQpJIHJlbmFtZWQgJ0ZJUFN0eHQnIHRvICdmaXBzX2NvZGUnIGZvciBkYXRhIGNvbnNpc3RhbmN5LiBWYWx1ZSB3YXMgYWxzbyByZW5hbWVkIHRvIHBvdmVydHlfcmF0ZSBmb3IgY2xhcml0eSB3aGVuIGl0IGNvbWVzIHRvIG1lcmdpbmcgZGF0YXNldHMuICANCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSAiY29uIiwgb3V0cHV0LnZhciA9ICJwb3ZlcnR5X25ldyJ9DQpTRUxFQ1QgDQogICAgRklQU3R4dCBBUyBmaXBzX2NvZGUsDQogICAgVmFsdWUgYXMgcG92ZXJ0eV9yYXRlDQpGUk9NIA0KICAgIHBvdmVydHkNCldIRVJFIA0KICAgIEF0dHJpYnV0ZSA9ICJQQ1RQT1ZBTExfMjAxOSI7DQpgYGANCg0KIyMjIERhdGEgUHJlcGFyYXRpb24gLSBFZHVjYXRpb24gRGF0YQ0KV2hlbiBwcmVwYXJpbmcgdGhlIGZpbmFsIGRhdGEgc2V0LCBFZHVjYXRpb24gRGF0YSwgaXQgbXVzdCBmaXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQogIDEub25seSBrZWVwIHRoZSBwZXJjZW50YWdlIG9mIGVkdWNhdGlvbiBsZXZlbHMgYmV0d2VlbiAyMDE1IGFuZCAyMDE5Lg0KICAgICAgYS5FZHVjYXRpb24gbGV2ZWxzDQogICAgICBiLmxlc3MgdGhhbiBhIGhpZ2ggc2Nob29sIGRpcGxvbWENCiAgICAgIGMuaGlnaCBzY2hvb2wgZGlwbG9tYQ0KICAgICAgZC5jb21wbGV0ZWQgc29tZSBjb2xsZWdlICgxLTMgeWVhcnMpDQogICAgICBlLmNvbXBsZXRlZCBmb3VyIHllYXJzIG9mIGNvbGxlZ2UNCiAgMi5Db3VudHkgRklQUyBjb2RlDQoNCkkgcmVuYW1lZCB0aGUgdmFyaWFibGVzIGFib3ZlIHRvICdmaXBzX2NvZGUnIGFuZCByZXBsYWNlZCBhbGwgIi4iIHdpdGggIl8iIGluIG9yZGVyIHRvIHJ1biBhIHNxbCBxdWVyeS4NCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSAiY29uIiwgb3V0cHV0LnZhciA9ICJlZHVjYXRpb25fbmV3In0NClNFTEVDVCANCiAgICBmaXBzX2NvZGUsDQogICAgUGVyY2VudF9vZl9hZHVsdHNfd2l0aF9sZXNzX3RoYW5fYV9oaWdoX3NjaG9vbF9kaXBsb21hX18yMDE1XzE5LA0KICAgIFBlcmNlbnRfb2ZfYWR1bHRzX3dpdGhfYV9oaWdoX3NjaG9vbF9kaXBsb21hX29ubHlfXzIwMTVfMTksDQogICAgUGVyY2VudF9vZl9hZHVsdHNfY29tcGxldGluZ19zb21lX2NvbGxlZ2Vfb3JfYXNzb2NpYXRlX3NfZGVncmVlX18yMDE1XzE5LA0KICAgIFBlcmNlbnRfb2ZfYWR1bHRzX3dpdGhfYV9iYWNoZWxvcl9zX2RlZ3JlZV9vcl9oaWdoZXJfXzIwMTVfMTkNCkZST00gDQogICAgZWR1Y2F0aW9uDQpHUk9VUCBCWSANCiAgICBmaXBzX2NvZGU7DQpgYGANCiMjIyBNZXJnZSBEYXRhc2V0cw0KSGVyZSBJIGxlZnQgam9pbmVkIGFsbCBkYXRhc2V0cyB0b2dldGhlci4gVGhlbiwgdXNpbmcgdGhlIGRwbHlyIGxpYnJhcnksIEkgcmVtb3ZlZCBhbGwgZHVwbGljYXRlcyBiYXNlZCBvbiB0aGUgZmlwc19jb2RlIGFuZCBhbnkgbWlzc2luZyBvYnNlcnZhdGlvbnMuIFRoZSBmaW5hbCBkYXRhc2V0IGlzIGNhbGxlZCBmaXBzXzIwMl9lbGVjdGlvbnMuIFRoaXMgZGF0YXNldCBoYXMgMzExMyBvYnNlcnZhdGlvbnMgY29uc2lzdGluZyBvZiAxMiB2YXJpYWJsZXMgb2YgaW50ZXJlc3QuDQpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIExvYWQgZHBseXIgZm9yIGRhdGEgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIE1lcmdlIGRhdGFzZXRzDQpjb21iaW5lZF9kYXRhIDwtIGVsZWN0aW9uX25ldyAlPiUNCiAgICBsZWZ0X2pvaW4odW5lbXBsb3ltZW50X25ldywgYnkgPSAiZmlwc19jb2RlIikgJT4lDQogICAgbGVmdF9qb2luKHBvdmVydHlfbmV3LCBieSA9ICJmaXBzX2NvZGUiKSAlPiUNCiAgICBsZWZ0X2pvaW4oZWR1Y2F0aW9uX25ldywgYnkgPSAiZmlwc19jb2RlIikNCiNyZW1vdmUgYW55IGR1cGxpY2F0ZXMNCmZpcHNfMjAyMF9lbGVjdGlvbiA8LWNvbWJpbmVkX2RhdGEgJT4lDQogIGRpc3RpbmN0KGZpcHNfY29kZSwgLmtlZXBfYWxsID0gVFJVRSklPiUNCiAgZHJvcF9uYSgpDQoNCiMgVmlldyB0aGUgZmluYWwgY29tYmluZWQgZGF0YXNldA0KaGVhZChmaXBzXzIwMjBfZWxlY3Rpb24pDQp3cml0ZV9jc3YoZmlwc18yMDIwX2VsZWN0aW9uLCAiQzovVXNlcnMvamVzc2cvT25lRHJpdmUgLSBXZXN0IENoZXN0ZXIgVW5pdmVyc2l0eSBvZiBQQS9zdGE1NTEvZmlwc18yMDIwX2VsZWN0aW9uLmNzdiIpDQojd3JpdGUuY3N2KGZpcHNfMjAyMF9lbGVjdGlvbiwgZmlsZSA9ICJmaXBzXzIwMjBfZWxlY3Rpb24uY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KIyBFeHBsb3JhdG9yeSBEYXRhIEFuYXlsc2lzDQoNCiMjIFVuaXZhcmlhdGUgQW5hbHlzaXMNClRoZSBmaXJzdCBFREEgSSB3YW50IHRvIGRvIGlzIGEgdW5pdmFyaWF0ZSBhbmFseXNpcyBvZiB0aGUgdmFyaWFibGUgIndpbm5pbmdfcGFydHkiIEJlbG93IGlzIHBpZSBjaGFydCB0aGF0IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2Ygd2lubmluZyBwYXJ0aWVzLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZnJlcS50YmwgPSB0YWJsZShmaXBzXzIwMjBfZWxlY3Rpb24kd2lubmluZ19wYXJ0eSkNCnBpZShmcmVxLnRibCwgeGxhYj0iV2lubmluZyBQYXJ0eSIsIHlsYWIgPSAiQ291bnRzIiwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFdpbm5pbmcgUGFydHkgaW4gdGhlIDIwMjAgRWxlY3Rpb24iKQ0KDQpgYGANCkZyb20gdGhpcyBjaGFydCB3ZSBjYW4gc2VlIHRoYXQgdGhlIHJlcHVibGljYW4gcGFydHkgaGFzIGEgaGlnaGVyIGFtb3VudCBvZiB3aW5uaW5nIGNvdW50aWVzIHRoYW4gdGhlIGRlbW9jcmF0aWMgcGFydHkuIEhvd2V2ZXIsIGluIHRoZSBlbGVjdG9yYWwgY29sbGVnZSwgaXQgaXMgbm90IGhvdyBtYW55IGNvdW50aWVzIHlvdXIgcGFydHkgd2lucywgYnV0IGhvdyBtYW55IGRlbGVnYXRlcyBiZWxvbmcgdG8gdGhhdCBjb3VudHkuIEluIDIwMjAgdGhlIERlbW9jcmF0aWMgcGFydHkgd29uIHRoZSBwcmVzaWRlbmN5LCB0aGlzIHdhcyBkb25lIGJ5IHdpbm5pbmcgZmV3ZXIgYnV0IGxhcmdlciBjb3VudGllcyB3aXRoIG1vcmUgZGVsZWdhdGVzLg0KDQojIyBCaXZhcmlhdGUgQW5heWxzaXMNCkluIGxvb2tpbmcgYXQgdHdvIGNvbnRpbm91cyB2YXJpYmxlcyAicG92ZXJ0eV9yYXRlIiBhbmQgInVuZW1wbG95bWVudF9yYXRlIiB0aGUgYmVzdCB3YXkgdG8gdmlzdWFsaXplIGlmIHRoZXJlIGlzIGFueSBhc3NvY2lhdGlvbiBpcyB0aHJvdWdoIGEgc2NhdHRlcnBsb3QuIFRoZSBwbG90IGNhbiBiZSBzZWVuIGJlbG93Lg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3Bsb3QoZmlwc18yMDIwX2VsZWN0aW9uJHBvdmVydHlfcmF0ZSwgZmlwc18yMDIwX2VsZWN0aW9uJHVuZW1wbG95bWVudF9yYXRlKQ0KDQpwbG90KGZpcHNfMjAyMF9lbGVjdGlvbiRwb3ZlcnR5X3JhdGUsIGZpcHNfMjAyMF9lbGVjdGlvbiR1bmVtcGxveW1lbnRfcmF0ZSwNCiAgICAgbWFpbiA9ICJBc3NvY2lhdGlvbiBiZXR3ZWVuIFBvdmVydHkgUmF0ZSBhbmQgVW5lbXBsb3ltZW50IFJhdGUiLCAgICAgIyBUaXRsZQ0KICAgICB4bGFiID0gIlBvdmVydHkgUmF0ZSIsICAgICAgICAgICAgICMgWC1heGlzIGxhYmVsDQogICAgIHlsYWIgPSAiVW5lbXBsb3ltZW50IFJhdGUiLCAgICAgICAgICAgICAjIFktYXhpcyBsYWJlbA0KICAgICBwY2ggPSAxOSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgUG9pbnQgdHlwZQ0KICAgICBjb2wgPSAiYmx1ZSIpICAgICAgICAgICAgICAgICAgICAgIyBQb2ludCBjb2xvcg0KYGBgDQoNCg0KSGVyZSB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHBvdmVydHkgcmF0ZSBhbmQgdW5lbXBsb3ltZW50IHJhdGUgaW4gdGhlIDIwMjAgcHJlc2lkZW50aWFsIGVsZWN0aW9uLiBBIHN0YXRpc3RpY2FsIHRlc3QgdG8gY29uZmlybSB0aGlzIHdvdWxkIGJlIFBlYXJzb24ncyBDb3JyZWxhdGlvbiB0ZXN0Lg0KIyMgUGFpcndpc2UgY29tcGFyaXNvbnMNCg0KQSBwYWlyd2lzZSBjb21wYXJpc29ucyB3YXMgY29uZHVjdGVkIGZvciBhZHVsdHMgYW5kIHZhcmlvdXMgZWR1Y2F0aW9uYWwgbGV2ZWxzLiBUaGUgZ3JhcGhpYyBjYW4gYmUgc2VlbiBiZWxvdy4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KEdHYWxseSkNCmdncGFpcnMoZmlwc18yMDIwX2VsZWN0aW9uLCBjb2x1bW5zID0gOToxMiwgYWVzKGNvbG9yPXdpbm5pbmdfcGFydHksIGFscGhhID0gMC41KSwNCiAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpgYGANCiMgUmVzdWx0cyBhbmQgRGlzY3Vzc2lvbnMNCkluIHRoaXMgcHJvamVjdCBmb3VyIGRhdGFzZXRzIHdlcmUgcXVlcmllZCBpbiBhIFNRTGl0ZSBkYXRhYmFzZSBhbmQgbWVyZ2VkIGludG8gb25lIGRhdGFmcmFtZSBpbiBvcmRlciB0byBwZXJmb3JtIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMuIFdoZW4gbG9va2luZyBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHdpbm5pbmcgcGFydGllcywgd2Ugc2VlIHRoYXQgdGhlIFJlcHVibGljYXRpb24gUGFydHkgd29uIGEgbGFyZ2VyIGFtb3VudCBvZiBjb3VudGllcyBjb21wYXJlZCB0byB0aGUgRGVtb2NyYXRpYyBQYXJ0eS4gSW4gYSBCaXZhcmlhdGUgYW5hbHlzaXMgbG9va2luZyBmb3IgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBwb3ZlcnR5IHJhdGUgYW5kIHVuZW1wbG95bWVudCByYXRlLCBub25lIHdhcyBmb3VuZC4gRmluYWxseSBhIHBhaXJ3aXNlIGFuYWx5c2lzIHdhcyBjb25kdWN0ZWQgbG9va2luZyBhdCBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJ0eSBhbmQgZWR1Y2F0aW9uYWwgbGV2ZWxzLiBIZXJlIGl0IGNhbiBiZSBzZWVuIGhpZ2hlciBlZHVjYXRpb24gaGFkIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gYm90aCBwYXJ0aWVzLCBleGNlcHQgZm9yIHJlcHVibGljYW5zIHdpdGggYSBiYWNoZWxvciBkZWdyZWUgb3IgaGlnaGVyLiBUaGlzIGNhbiBiZSBkdWUgdG8gd2hlcmUgY29sbGVnZXMgYXJlIGxvY2F0ZWQgaW4gc3BlY2lmaWMgY291bnRpZXMgb3Igam9iIG9wcG9ydHVuaXN0cyBmb3IgcHJvZmVzc2lvbmFscy4NClwNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=