To run this you may be required to register an account through data.world
suppressMessages({
suppressPackageStartupMessages({
packages.list <- c('data.world', 'dplyr', 'plotly', 'sqldf', 'RColorBrewer')
non_installed <- packages.list[!(packages.list %in% installed.packages()[,"Package"])]
if(length(non_installed)) install.packages(non_installed)
library('dplyr')
library('data.world')
library('plotly')
library('sqldf')
library('RColorBrewer')
})
homeless_key <- "https://data.world/mschnars/2007-2016-homeless-point-in-time-count-by-coc"
tables_qry <- data.world::qry_sql("SELECT *
FROM Tables")
tables_df <- data.world::query(tables_qry, dataset = homeless_key)
})
This query shows the subset of data from the database that will be used in this survey. This data can be defined as the aggregate counts for measures of homelessness in all state across the range of years for which data is available. Since there are so many different measures used, with many having different names for reporting the same thing or only have data for certain year, this survey is limited on to data on total homelessness, chronic homelessness, veteran homlessness, and sheltered vs. unsheltered homeless:
if (length(tables_df$tableName) > 0) {
table_qry <- data.world::qry_sql(sprintf("SELECT year, state, measures, count
FROM %s
WHERE measures IN( \"Chronically Homeless Individuals\",
\"Sheltered Homeless\",
\"Total Homeless\",
\"Unsheltered Homeless\",
\"Homeless Veterans\")
GROUP BY year, state, measures
ORDER BY year, state", tables_df$tableName[[1]]))
homeless_df <- data.world::query(table_qry, dataset = homeless_key)
homeless_df
}
This Chart shows the counts for homeless populations in each state for the 2016 homeless count, grouped into the categories stated above (Total Homeless, Chronic Homeless, Homeless Veterans, and Sheltered vs. Unsheltered Homeless).
homeless_state_measures <- sqldf("SELECT *
FROM homeless_df
GROUP BY state, measures
ORDER BY state")
homeless_data_plotly <- plot_ly(data = homeless_state_measures, x = ~state, y = ~count, color = ~measures, type = "bar") %>%
layout(title = "Homeless Population in US by State 2016",
xaxis = list(title = "State"), yaxis = list(title = "Count"))
homeless_data_gg <- ggplot() +
geom_col(data = homeless_state_measures[homeless_state_measures$measures != "Total Homeless",],
aes(x = state, y = count, fill = measures))
#ggplot Graphics
homeless_data_gg

#Plotly Graphics
#embed_notebook(homeless_data_plotly, width = '1000px', height = '100%')
Since Washington State has the highest incidence of overall homelessness for the year of 2016, we can look at the trends of these measures over time with a focus on just WA with a specific focus on total homelessness, sheltered vs. unsheltered homelessnessness, chronic homelessness and veteran homelessness. This will give an idea of whether this level of homelessness in WA is particularly high in 2016 or if there is a long standing trend leading up to this.
WA_homeless_data_query <- data.world::qry_sql("SELECT year, measures, SUM(count)
FROM 2007_2016_point_in_time_count
WHERE state = \"WA\" AND measures IN( \"Chronically Homeless Individuals\",
\"Sheltered Homeless\",
\"Total Homeless\",
\"Unsheltered Homeless\",
\"Homeless Veterans\")
GROUP BY year, measures
ORDER BY year")
WA_homeless_data <- data.world::query(WA_homeless_data_query, dataset = homeless_key)
WA_homeless_plotly <- plot_ly(data = WA_homeless_data, x = ~year, y = ~count, color = ~measures, trace = "scatter") %>%
layout(title = "WA State Homeless Data 2008 - 2016",
xaxis = list(title = "Year"), yaxis = list(title = "Homeless Count"))
WA_homeless_gg <- ggplot()+
geom_point(data = WA_homeless_data, aes(x = year, y = count, color = measures))
#ggplot graphics
WA_homeless_gg

#plotly graphics
#embed_notebook(WA_homeless_plotly, width = '1000px', height = '100%')
Since this dataset goes into even greater resolution, we can look at how the homeless population is distributed across the counties of WA state between 2008-2016. From this data we can see that King County where Seattle is located is the largest contributor to total homelessness in WA State. The line marked in yellow shows the aggregate pattern for homeless population accross all the counties in WA.
WA_homeless_county_Query <- data.world::qry_sql("SELECT year, coc_name, measures, count
FROM 2007_2016_point_in_time_count
WHERE state = \"WA\" AND measures = \"Total Homeless\"
ORDER BY coc_name, year")
WA_homeless_county_data <- data.world::query(WA_homeless_county_Query , dataset = homeless_key)
colnames(WA_homeless_county_data) <- c("year", "county", "measures", "count")
WA_counties <- WA_homeless_county_data[WA_homeless_county_data$county != "Washington Balance of State CoC", 1:4]
WA_aggregate <- WA_homeless_county_data[WA_homeless_county_data$county == "Washington Balance of State CoC", 1:4]
WA_homeless_countyData_plotly <- plot_ly() %>% add_data(WA_counties) %>%
add_trace(x = ~year, y = ~count, color = ~county) %>%
add_lines(data = WA_aggregate, x = ~year, y = ~count, color = ~county) %>%
layout(title = "Total Homeless Count For WA State Counties 2008 - 2016", xaxis = list(title = "Year"),
yaxis = list(title = "Total Homeless Count"))
#ggplot graphic
WA_homeless_countyData_gg <- ggplot() +
geom_point(data = WA_counties, aes(x = year, y = count, color = county)) +
geom_line(data = WA_aggregate, aes(x = year, y = count, color = "Statewide Average"))
#ggplot graphic
WA_homeless_countyData_gg

#plotly graphic
#embed_notebook(WA_homeless_countyData_plotly, width = "1000px", height = "100%")
To get an idea of how the homeless population fluctuates during this time period, we can look at how the state with the highest total homeless populations count changes year by year during this time period.
max_state_count <- sqldf( 'SELECT year, MAX( count ) AS \"count\", state
FROM homeless_df
WHERE measures = "Total Homeless" GROUP BY year ORDER BY year')
max_state_count_plotly <- plot_ly(max_state_count, x = ~year, y = ~count, color = ~state) %>%
layout( title = "Yearly Max Homeless Count By State 2008 - 2016",
xaxis = list(title = "Year"), yaxis = list(title = "Total Homeless Count"))
max_state_count_gg <- ggplot(max_state_count) +
geom_point(aes(label = "Max State Homeless Population by Year", x = year, y = count, color = state))
#ggplot graphics
max_state_count_gg

#plotly graphics
#embed_notebook(max_state_count_plotly, width = "1000px", height = "100%")
Over the years the total count of homeless nationwide fluctuates quite a bit, but looking at this graph we can see that it declines over this period dramatically, with the peak appearing to be closely correlated with the beginning of the housing market crash in 2008.
hiTot_count_query <- data.world::qry_sql("SELECT year, AVG(count)
FROM 2007_2016_point_in_time_count
WHERE measures = \"Total Homeless\" AND count IN(
SELECT state, year, SUM(count)
FROM 2007_2016_point_in_time_count
WHERE measures = \"Total Homeless\"
GROUP BY year)
GROUP BY year
ORDER BY year")
avg_tot_count <- data.world::query(hiTot_count_query, dataset = homeless_key)
avg_tot_count_plotly <- plot_ly(avg_tot_count, x = ~year, y = ~count) %>%
layout( title = "Average State Homeless Count By Year 2008 - 2016",
xaxis = list(title = "Year"), yaxis = list(title = "Average Homeless Count"))
avg_tot_count_gg <- ggplot(avg_tot_count) +
geom_line(aes(x = year, y = count, color = "red")) +
geom_point(aes(x = year, y = count, color = "blue"))
#ggplot graphics
avg_tot_count_gg

#Plotly graphics
#embed_notebook(avg_tot_count_plotly)
DQotLS0NCnRpdGxlOiAiMjAwNy0yMDE2IEhvbWVsZXNzIFBvaW50IEluIFRpbWUgQ291bnQgYnkgQ29DIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCiNVc2luZyB0aGUgRGF0YXNldCBhdDogaHR0cHM6Ly9kYXRhLndvcmxkL21zY2huYXJzLzIwMDctMjAxNi1ob21lbGVzcy1wb2ludC1pbi10aW1lLWNvdW50LWJ5LWNvYyB0aHJvdWdoIGRhdGEud29ybGQNCiNUbyBydW4gdGhpcyB5b3UgbWF5IGJlIHJlcXVpcmVkIHRvIHJlZ2lzdGVyIGFuIGFjY291bnQgdGhyb3VnaCBkYXRhLndvcmxkDQojDQojDQpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCnN1cHByZXNzTWVzc2FnZXMoew0KICBzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoew0KICAgIHBhY2thZ2VzLmxpc3QgPC0gYygnZGF0YS53b3JsZCcsICdkcGx5cicsICdwbG90bHknLCAnc3FsZGYnLCAnUkNvbG9yQnJld2VyJykNCiAgICBub25faW5zdGFsbGVkIDwtIHBhY2thZ2VzLmxpc3RbIShwYWNrYWdlcy5saXN0ICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KICAgIGlmKGxlbmd0aChub25faW5zdGFsbGVkKSkgaW5zdGFsbC5wYWNrYWdlcyhub25faW5zdGFsbGVkKQ0KICAgIA0KICAgIGxpYnJhcnkoJ2RwbHlyJykNCiAgICBsaWJyYXJ5KCdkYXRhLndvcmxkJykNCiAgICBsaWJyYXJ5KCdwbG90bHknKQ0KICAgIGxpYnJhcnkoJ3NxbGRmJykNCiAgICBsaWJyYXJ5KCdSQ29sb3JCcmV3ZXInKQ0KICB9KQ0KICBob21lbGVzc19rZXkgPC0gImh0dHBzOi8vZGF0YS53b3JsZC9tc2NobmFycy8yMDA3LTIwMTYtaG9tZWxlc3MtcG9pbnQtaW4tdGltZS1jb3VudC1ieS1jb2MiDQogIA0KICB0YWJsZXNfcXJ5IDwtIGRhdGEud29ybGQ6OnFyeV9zcWwoIlNFTEVDVCAqIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBUYWJsZXMiKQ0KICB0YWJsZXNfZGYgPC0gZGF0YS53b3JsZDo6cXVlcnkodGFibGVzX3FyeSwgZGF0YXNldCA9IGhvbWVsZXNzX2tleSkNCn0pDQpgYGANCiMNCiMNCiMNClRoaXMgcXVlcnkgc2hvd3MgdGhlIHN1YnNldCBvZiBkYXRhIGZyb20gdGhlIGRhdGFiYXNlIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoaXMgc3VydmV5LiAgVGhpcyBkYXRhIGNhbiBiZSBkZWZpbmVkIGFzIHRoZSBhZ2dyZWdhdGUgY291bnRzIGZvciBtZWFzdXJlcyBvZiBob21lbGVzc25lc3MgaW4gYWxsIHN0YXRlIGFjcm9zcyB0aGUgcmFuZ2Ugb2YgeWVhcnMgZm9yIHdoaWNoIGRhdGEgaXMgYXZhaWxhYmxlLiBTaW5jZSB0aGVyZSBhcmUgc28gbWFueSBkaWZmZXJlbnQgbWVhc3VyZXMgdXNlZCwgd2l0aCBtYW55IGhhdmluZyBkaWZmZXJlbnQgbmFtZXMgZm9yIHJlcG9ydGluZyB0aGUgc2FtZSB0aGluZyBvciBvbmx5IGhhdmUgZGF0YSBmb3IgY2VydGFpbiB5ZWFyLCB0aGlzIHN1cnZleSBpcyBsaW1pdGVkIG9uIHRvIGRhdGEgb24gdG90YWwgaG9tZWxlc3NuZXNzLCBjaHJvbmljIGhvbWVsZXNzbmVzcywgdmV0ZXJhbiBob21sZXNzbmVzcywgYW5kIHNoZWx0ZXJlZCB2cy4gdW5zaGVsdGVyZWQgaG9tZWxlc3M6DQpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCmlmIChsZW5ndGgodGFibGVzX2RmJHRhYmxlTmFtZSkgPiAwKSB7DQogIHRhYmxlX3FyeSA8LSBkYXRhLndvcmxkOjpxcnlfc3FsKHNwcmludGYoIlNFTEVDVCB5ZWFyLCBzdGF0ZSwgbWVhc3VyZXMsIGNvdW50IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NICVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIG1lYXN1cmVzIElOKCBcIkNocm9uaWNhbGx5IEhvbWVsZXNzIEluZGl2aWR1YWxzXCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNoZWx0ZXJlZCBIb21lbGVzc1wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUb3RhbCBIb21lbGVzc1wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNoZWx0ZXJlZCBIb21lbGVzc1wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJIb21lbGVzcyBWZXRlcmFuc1wiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9VUCBCWSB5ZWFyLCBzdGF0ZSwgbWVhc3VyZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgeWVhciwgc3RhdGUiLCB0YWJsZXNfZGYkdGFibGVOYW1lW1sxXV0pKQ0KICBob21lbGVzc19kZiA8LSBkYXRhLndvcmxkOjpxdWVyeSh0YWJsZV9xcnksIGRhdGFzZXQgPSBob21lbGVzc19rZXkpDQogIGhvbWVsZXNzX2RmDQp9DQpgYGANCiMNCiMNCiMNClRoaXMgQ2hhcnQgc2hvd3MgdGhlIGNvdW50cyBmb3IgaG9tZWxlc3MgcG9wdWxhdGlvbnMgaW4gZWFjaCBzdGF0ZSBmb3IgdGhlIDIwMTYgaG9tZWxlc3MgY291bnQsIGdyb3VwZWQgaW50byB0aGUgY2F0ZWdvcmllcyBzdGF0ZWQgYWJvdmUgKFRvdGFsIEhvbWVsZXNzLCBDaHJvbmljIEhvbWVsZXNzLCBIb21lbGVzcyBWZXRlcmFucywgYW5kIFNoZWx0ZXJlZCB2cy4gVW5zaGVsdGVyZWQgSG9tZWxlc3MpLg0KYGBge3IgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQoNCmhvbWVsZXNzX3N0YXRlX21lYXN1cmVzIDwtIHNxbGRmKCJTRUxFQ1QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gaG9tZWxlc3NfZGYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9VUCBCWSBzdGF0ZSwgbWVhc3VyZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUkRFUiBCWSBzdGF0ZSIpDQoNCmhvbWVsZXNzX2RhdGFfcGxvdGx5IDwtIHBsb3RfbHkoZGF0YSA9IGhvbWVsZXNzX3N0YXRlX21lYXN1cmVzLCB4ID0gfnN0YXRlLCB5ID0gfmNvdW50LCBjb2xvciA9IH5tZWFzdXJlcywgdHlwZSA9ICJiYXIiKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gIkhvbWVsZXNzIFBvcHVsYXRpb24gaW4gVVMgYnkgU3RhdGUgMjAxNiIsIA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlN0YXRlIiksIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKQ0KDQoNCmhvbWVsZXNzX2RhdGFfZ2cgPC0gZ2dwbG90KCkgKyANCiAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZGF0YSA9IGhvbWVsZXNzX3N0YXRlX21lYXN1cmVzW2hvbWVsZXNzX3N0YXRlX21lYXN1cmVzJG1lYXN1cmVzICE9ICJUb3RhbCBIb21lbGVzcyIsXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBzdGF0ZSwgeSA9IGNvdW50LCBmaWxsID0gbWVhc3VyZXMpKQ0KDQojZ2dwbG90IEdyYXBoaWNzDQpob21lbGVzc19kYXRhX2dnDQoNCg0KI1Bsb3RseSBHcmFwaGljcw0KI2VtYmVkX25vdGVib29rKGhvbWVsZXNzX2RhdGFfcGxvdGx5LCB3aWR0aCA9ICcxMDAwcHgnLCBoZWlnaHQgPSAnMTAwJScpDQpgYGANCiMNCiMNCiMNClNpbmNlIFdhc2hpbmd0b24gU3RhdGUgaGFzIHRoZSBoaWdoZXN0IGluY2lkZW5jZSBvZiBvdmVyYWxsIGhvbWVsZXNzbmVzcyBmb3IgdGhlIHllYXIgb2YgMjAxNiwgd2UgY2FuIGxvb2sgYXQgdGhlIHRyZW5kcyBvZiB0aGVzZSBtZWFzdXJlcyBvdmVyIHRpbWUgd2l0aCBhIGZvY3VzIG9uIGp1c3QgV0Egd2l0aCBhIHNwZWNpZmljIGZvY3VzIG9uIHRvdGFsIGhvbWVsZXNzbmVzcywgc2hlbHRlcmVkIHZzLiB1bnNoZWx0ZXJlZCBob21lbGVzc25lc3NuZXNzLCBjaHJvbmljIGhvbWVsZXNzbmVzcyBhbmQgdmV0ZXJhbiBob21lbGVzc25lc3MuICBUaGlzIHdpbGwgZ2l2ZSBhbiBpZGVhIG9mIHdoZXRoZXIgdGhpcyBsZXZlbCBvZiBob21lbGVzc25lc3MgaW4gV0EgaXMgcGFydGljdWxhcmx5IGhpZ2ggaW4gMjAxNiBvciBpZiB0aGVyZSBpcyBhIGxvbmcgc3RhbmRpbmcgdHJlbmQgbGVhZGluZyB1cCB0byB0aGlzLg0KDQpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCldBX2hvbWVsZXNzX2RhdGFfcXVlcnkgPC0gZGF0YS53b3JsZDo6cXJ5X3NxbCgiU0VMRUNUIHllYXIsIG1lYXN1cmVzLCBTVU0oY291bnQpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIDIwMDdfMjAxNl9wb2ludF9pbl90aW1lX2NvdW50DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIHN0YXRlID0gXCJXQVwiIEFORCBtZWFzdXJlcyBJTiggXCJDaHJvbmljYWxseSBIb21lbGVzcyBJbmRpdmlkdWFsc1wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTaGVsdGVyZWQgSG9tZWxlc3NcIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVG90YWwgSG9tZWxlc3NcIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zaGVsdGVyZWQgSG9tZWxlc3NcIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSG9tZWxlc3MgVmV0ZXJhbnNcIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JPVVAgQlkgeWVhciwgbWVhc3VyZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgeWVhciIpDQpXQV9ob21lbGVzc19kYXRhIDwtIGRhdGEud29ybGQ6OnF1ZXJ5KFdBX2hvbWVsZXNzX2RhdGFfcXVlcnksIGRhdGFzZXQgPSBob21lbGVzc19rZXkpDQoNCg0KV0FfaG9tZWxlc3NfcGxvdGx5IDwtIHBsb3RfbHkoZGF0YSA9IFdBX2hvbWVsZXNzX2RhdGEsIHggPSB+eWVhciwgeSA9IH5jb3VudCwgY29sb3IgPSB+bWVhc3VyZXMsIHRyYWNlID0gInNjYXR0ZXIiKSAlPiUgDQogIGxheW91dCh0aXRsZSA9ICJXQSBTdGF0ZSBIb21lbGVzcyBEYXRhIDIwMDggLSAyMDE2IiwgDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiWWVhciIpLCB5YXhpcyA9IGxpc3QodGl0bGUgPSAiSG9tZWxlc3MgQ291bnQiKSkNCg0KDQpXQV9ob21lbGVzc19nZyA8LSBnZ3Bsb3QoKSsNCiAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoZGF0YSA9IFdBX2hvbWVsZXNzX2RhdGEsIGFlcyh4ID0geWVhciwgeSA9IGNvdW50LCBjb2xvciA9IG1lYXN1cmVzKSkNCg0KI2dncGxvdCBncmFwaGljcw0KV0FfaG9tZWxlc3NfZ2cNCg0KI3Bsb3RseSBncmFwaGljcw0KI2VtYmVkX25vdGVib29rKFdBX2hvbWVsZXNzX3Bsb3RseSwgd2lkdGggPSAnMTAwMHB4JywgaGVpZ2h0ID0gJzEwMCUnKSANCg0KYGBgDQojDQojDQojDQpTaW5jZSB0aGlzIGRhdGFzZXQgZ29lcyBpbnRvIGV2ZW4gZ3JlYXRlciByZXNvbHV0aW9uLCB3ZSBjYW4gbG9vayBhdCBob3cgdGhlIGhvbWVsZXNzIHBvcHVsYXRpb24gaXMgZGlzdHJpYnV0ZWQgYWNyb3NzIHRoZSBjb3VudGllcyBvZiBXQSBzdGF0ZSBiZXR3ZWVuIDIwMDgtMjAxNi4NCkZyb20gdGhpcyBkYXRhIHdlIGNhbiBzZWUgdGhhdCBLaW5nIENvdW50eSB3aGVyZSBTZWF0dGxlIGlzIGxvY2F0ZWQgaXMgdGhlIGxhcmdlc3QgY29udHJpYnV0b3IgdG8gdG90YWwgaG9tZWxlc3NuZXNzIGluIFdBIFN0YXRlLiAgVGhlIGxpbmUgbWFya2VkIGluIHllbGxvdyBzaG93cyB0aGUgYWdncmVnYXRlIHBhdHRlcm4gZm9yIGhvbWVsZXNzIHBvcHVsYXRpb24gYWNjcm9zcyBhbGwgdGhlIGNvdW50aWVzIGluIFdBLg0KYGBge3IgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQoNCldBX2hvbWVsZXNzX2NvdW50eV9RdWVyeSA8LSBkYXRhLndvcmxkOjpxcnlfc3FsKCJTRUxFQ1QgeWVhciwgY29jX25hbWUsIG1lYXN1cmVzLCBjb3VudA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gMjAwN18yMDE2X3BvaW50X2luX3RpbWVfY291bnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBzdGF0ZSA9IFwiV0FcIiBBTkQgbWVhc3VyZXMgPSBcIlRvdGFsIEhvbWVsZXNzXCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUkRFUiBCWSBjb2NfbmFtZSwgeWVhciIpDQoNCldBX2hvbWVsZXNzX2NvdW50eV9kYXRhIDwtIGRhdGEud29ybGQ6OnF1ZXJ5KFdBX2hvbWVsZXNzX2NvdW50eV9RdWVyeSAsIGRhdGFzZXQgPSBob21lbGVzc19rZXkpDQoNCmNvbG5hbWVzKFdBX2hvbWVsZXNzX2NvdW50eV9kYXRhKSA8LSBjKCJ5ZWFyIiwgImNvdW50eSIsICJtZWFzdXJlcyIsICJjb3VudCIpDQoNCldBX2NvdW50aWVzIDwtIFdBX2hvbWVsZXNzX2NvdW50eV9kYXRhW1dBX2hvbWVsZXNzX2NvdW50eV9kYXRhJGNvdW50eSAhPSAiV2FzaGluZ3RvbiBCYWxhbmNlIG9mIFN0YXRlIENvQyIsIDE6NF0NCldBX2FnZ3JlZ2F0ZSA8LSBXQV9ob21lbGVzc19jb3VudHlfZGF0YVtXQV9ob21lbGVzc19jb3VudHlfZGF0YSRjb3VudHkgPT0gIldhc2hpbmd0b24gQmFsYW5jZSBvZiBTdGF0ZSBDb0MiLCAxOjRdDQoNCg0KV0FfaG9tZWxlc3NfY291bnR5RGF0YV9wbG90bHkgPC0gcGxvdF9seSgpICU+JSBhZGRfZGF0YShXQV9jb3VudGllcykgJT4lDQogIGFkZF90cmFjZSh4ID0gfnllYXIsIHkgPSB+Y291bnQsIGNvbG9yID0gfmNvdW50eSkgJT4lDQogIGFkZF9saW5lcyhkYXRhID0gV0FfYWdncmVnYXRlLCB4ID0gfnllYXIsIHkgPSB+Y291bnQsIGNvbG9yID0gfmNvdW50eSkgJT4lDQogIGxheW91dCh0aXRsZSA9ICJUb3RhbCBIb21lbGVzcyBDb3VudCBGb3IgV0EgU3RhdGUgQ291bnRpZXMgMjAwOCAtIDIwMTYiLCB4YXhpcyA9IGxpc3QodGl0bGUgPSAiWWVhciIpLCANCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJUb3RhbCBIb21lbGVzcyBDb3VudCIpKQ0KDQojZ2dwbG90IGdyYXBoaWMNCldBX2hvbWVsZXNzX2NvdW50eURhdGFfZ2cgPC0gZ2dwbG90KCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvaW50KGRhdGEgPSBXQV9jb3VudGllcywgYWVzKHggPSB5ZWFyLCB5ID0gY291bnQsIGNvbG9yID0gY291bnR5KSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX2xpbmUoZGF0YSA9IFdBX2FnZ3JlZ2F0ZSwgYWVzKHggPSB5ZWFyLCB5ID0gY291bnQsIGNvbG9yID0gIlN0YXRld2lkZSBBdmVyYWdlIikpDQoNCiNnZ3Bsb3QgZ3JhcGhpYw0KV0FfaG9tZWxlc3NfY291bnR5RGF0YV9nZw0KDQojcGxvdGx5IGdyYXBoaWMNCiNlbWJlZF9ub3RlYm9vayhXQV9ob21lbGVzc19jb3VudHlEYXRhX3Bsb3RseSwgd2lkdGggPSAiMTAwMHB4IiwgaGVpZ2h0ID0gIjEwMCUiKQ0KDQpgYGANCiMNCiMNCiMNClRvIGdldCBhbiBpZGVhIG9mIGhvdyB0aGUgaG9tZWxlc3MgcG9wdWxhdGlvbiBmbHVjdHVhdGVzIGR1cmluZyB0aGlzIHRpbWUgcGVyaW9kLCB3ZSBjYW4gbG9vayBhdCBob3cgdGhlIHN0YXRlIHdpdGggdGhlIGhpZ2hlc3QgdG90YWwgaG9tZWxlc3MgcG9wdWxhdGlvbnMgY291bnQgY2hhbmdlcyB5ZWFyIGJ5IHllYXIgZHVyaW5nIHRoaXMgdGltZSBwZXJpb2QuDQpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCg0KbWF4X3N0YXRlX2NvdW50IDwtIHNxbGRmKCAnU0VMRUNUIHllYXIsIE1BWCggY291bnQgKSBBUyBcImNvdW50XCIsIHN0YXRlIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gaG9tZWxlc3NfZGYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgbWVhc3VyZXMgPSAiVG90YWwgSG9tZWxlc3MiIEdST1VQIEJZIHllYXIgT1JERVIgQlkgeWVhcicpDQoNCm1heF9zdGF0ZV9jb3VudF9wbG90bHkgPC0gcGxvdF9seShtYXhfc3RhdGVfY291bnQsIHggPSB+eWVhciwgeSA9IH5jb3VudCwgY29sb3IgPSB+c3RhdGUpICU+JQ0KICBsYXlvdXQoIHRpdGxlID0gIlllYXJseSBNYXggSG9tZWxlc3MgQ291bnQgQnkgU3RhdGUgMjAwOCAtIDIwMTYiLCANCiAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiWWVhciIpLCB5YXhpcyA9IGxpc3QodGl0bGUgPSAiVG90YWwgSG9tZWxlc3MgQ291bnQiKSkNCg0KDQptYXhfc3RhdGVfY291bnRfZ2cgPC0gZ2dwbG90KG1heF9zdGF0ZV9jb3VudCkgKyANCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvaW50KGFlcyh4ID0geWVhciwgeSA9IGNvdW50LCBjb2xvciA9IHN0YXRlKSkNCg0KI2dncGxvdCBncmFwaGljcw0KbWF4X3N0YXRlX2NvdW50X2dnDQoNCiNwbG90bHkgZ3JhcGhpY3MNCiNlbWJlZF9ub3RlYm9vayhtYXhfc3RhdGVfY291bnRfcGxvdGx5LCB3aWR0aCA9ICIxMDAwcHgiLCBoZWlnaHQgPSAiMTAwJSIpDQoNCmBgYA0KIw0KIw0KIw0KT3ZlciB0aGUgeWVhcnMgdGhlIHRvdGFsIGNvdW50IG9mIGhvbWVsZXNzIG5hdGlvbndpZGUgZmx1Y3R1YXRlcyBxdWl0ZSBhIGJpdCwgYnV0IGxvb2tpbmcgYXQgdGhpcyBncmFwaCB3ZSBjYW4gc2VlIHRoYXQgaXQgZGVjbGluZXMgb3ZlciB0aGlzIHBlcmlvZCBkcmFtYXRpY2FsbHksIHdpdGggdGhlIHBlYWsgYXBwZWFyaW5nIHRvIGJlIGNsb3NlbHkgY29ycmVsYXRlZCB3aXRoIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhvdXNpbmcgbWFya2V0IGNyYXNoIGluIDIwMDguDQpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCg0KaGlUb3RfY291bnRfcXVlcnkgPC0gZGF0YS53b3JsZDo6cXJ5X3NxbCgiU0VMRUNUIHllYXIsIEFWRyhjb3VudCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gMjAwN18yMDE2X3BvaW50X2luX3RpbWVfY291bnQgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBtZWFzdXJlcyA9IFwiVG90YWwgSG9tZWxlc3NcIiBBTkQgY291bnQgSU4oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBzdGF0ZSwgeWVhciwgU1VNKGNvdW50KSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAyMDA3XzIwMTZfcG9pbnRfaW5fdGltZV9jb3VudA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBtZWFzdXJlcyA9IFwiVG90YWwgSG9tZWxlc3NcIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9VUCBCWSB5ZWFyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JPVVAgQlkgeWVhcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgeWVhciIpDQoNCg0KYXZnX3RvdF9jb3VudCA8LSBkYXRhLndvcmxkOjpxdWVyeShoaVRvdF9jb3VudF9xdWVyeSwgZGF0YXNldCA9IGhvbWVsZXNzX2tleSkNCmF2Z190b3RfY291bnRfcGxvdGx5IDwtIHBsb3RfbHkoYXZnX3RvdF9jb3VudCwgeCA9IH55ZWFyLCB5ID0gfmNvdW50KSAlPiUNCiAgbGF5b3V0KCB0aXRsZSA9ICJBdmVyYWdlIFN0YXRlIEhvbWVsZXNzIENvdW50IEJ5IFllYXIgMjAwOCAtIDIwMTYiLA0KICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJZZWFyIiksIHlheGlzID0gbGlzdCh0aXRsZSA9ICJBdmVyYWdlIEhvbWVsZXNzIENvdW50IikpDQoNCg0KYXZnX3RvdF9jb3VudF9nZyA8LSBnZ3Bsb3QoYXZnX3RvdF9jb3VudCkgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gY291bnQsIGNvbG9yID0gInJlZCIpKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gY291bnQsIGNvbG9yID0gImJsdWUiKSkNCiAgICAgICAgICAgICAgICAgICAgDQoNCiNnZ3Bsb3QgZ3JhcGhpY3MNCmF2Z190b3RfY291bnRfZ2cNCg0KI1Bsb3RseSBncmFwaGljcw0KI2VtYmVkX25vdGVib29rKGF2Z190b3RfY291bnRfcGxvdGx5KQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQo=