Methods 1 Final Project | December 2023
Zoe Moskowitz

Purpose:

This research hopes to identify discrepancies in temperature between Manhattan County and Bronx County utilizing Hyperlocal Temperature Data collected from the summer of 2019.

Introduction & Background:

Temperatures in New York City are rising every year. As greenhouse gas emissions continue to warm our planet, dense urban cities are experiencing more frequent heatwaves and longer periods of extreme heat. According to the Mayor’s Office of Climate & Environmental Justice, the average number of days above 90℉ will likely triple by the 2050s and quadruple by the 2080s.

Due to a multitude of factors, extreme heat is not felt evenly throughout New York City. Marginalized populations and low-income neighborhoods experience higher temperatures as a result of the urban heat island effect and pervasive inequalities. In areas like the South Bronx, which is considered an urban heat island, temperatures can report anywhere from 1℉ to 7℉ warmer in the daytime and 2℉ to 5℉ warmer in the evening (compared to Manhattan).

An urban heat island is defined by Resources for the Future as “the increase in temperature caused by the built environment.” In the South Bronx there is a major lack of parks, shade coverage and green spaces, a large amount of industrial/polluting facilities (12+ in total), and the presence of the Cross Bronx Expressway - which exposes the population to air pollution and increases asthma rates.

Another reason that low-income neighborhoods and populations suffer from a disproportionate rate of extreme heat is due to decades of redlining and disinvestment. These areas lack adequate housing and typically have poor maintenance, making it difficult to avoid heat and properly cool ones home. Residents are often left with the choice to independently put in expensive cooling measures such as air conditioning or rely on external resources.

Data Source:

The dataset I will be utilizing for this report is available on NYC Open Data and is titled “Hyperlocal Temperature Monitoring.” This dataset was created as a part of the Cool Neighborhoods Initiative and facilitated by the NYC Parks Department, Office of Resilience and NYC Department of Health and Mental Hygiene.

The purpose of this data was to monitor street level temperature on a subset of city blocks in certain neighborhoods with the highest heat mortality risk during the summers of 2018 and 2019. For the purpose of my analysis, I decided to use only the most recent data collected from the year 2019 and narrow the data collection period to 06/15 - 09/21.

Research Questions:

Results

The scatterplots below (Fig. 1-4) show the maximum hyperlocal air temperature by date. The blue colored points represent data taken from Bronx County and the red colored points represent data taken from New York County. When I was done filtering my data, there were 99 data points for each county that I wanted to work with. Due to this, I thought it best to split the scatterplots up by month.

In order to create these visuals, I filtered the NYC Open Data by “borough” and “year”. Due to each date having multiple temperature readings, I then used the group_by and summarise functions to find the maximum hyperlocal temperature per day.

Fig. 1

Figure 1 represents data collected from June, 2019. Out of the 16 datapoints shown, nine show higher max temperature in the Bronx, while seven show higher max temperature in Manhattan.

Fig. 2

Figure 2 represents data collected from July, 2019. Out of the 30 datapoints shown, sixteen show higher max temperature in the Bronx, while fifteen show higher max temperature in Manhattan.

Fig. 3

Figure 3 represents data collected from August, 2019. Out of the 30 datapoints shown, ten show higher max temperature in the Bronx, while twenty show higher max temperature in Manhattan.

Fig. 4

Figure 4 represents data collected from August, 2019. Out of the 21 datapoints shown, seven show higher max temperature in the Bronx, while thirteen show higher max temperature in Manhattan.

Fig. 5

Figure 5 is a map that shows two layers of data in Bronx County. The first layer displays where the sensors that collected the Hyperlocal Temperature data are located. The second layer shows all of the “parks” in the county. This is labeled as “Type of Green Space”.

Fig. 6

To compare sensor location and park coverage, I made an identical map to Figure 4 but for New York County. The first layer displays where the sensors that collected the Hyperlocal Temperature data are located. The second layer shows all of the “parks” in the county. This is labeled as “Type of Green Space”.

Discussion

Going into this research project I expected Figures 1-4 to show Bronx County having more days with a higher “Maximum Temp.” than New York County. Although this was not the case, when we look at some of the individual data points for the warmer days in Bronx County, temperature difference was significant. The data shows days that were around 4-6 degrees warmer and one day in July that was 12 degrees warmer.

After creating the maps for Bronx and Manhattan County, it was interesting to see where the sensors were placed for collecting data. In Manhattan County, they are clustered in Central and East Harlem which are low-income areas that suffer from extreme heat. It would be interesting to see what the temperature difference between Bronx County and Manhattan County would be if the sensors were placed in Lower Manhattan or even the Upper West Side as these have a greater amount of green space.

Next Steps

There is still a fair amount to be uncovered about Hyperlocal Temperature in New York and Bronx County. Some ideas include:

  1. Deeper analysis into where the rest of the sensors are located per county
  1. Pollution data for Manhattan County and Bronx County
  1. “Average” temperature recorded by local weather stations compared to “Max” temperature reflected in data

Methods Appendix

NYC Open Data

The main datasource I used came from NYC Open Data. Hyperlocal Temperature Monitoring was published on August 20th, 2021 through the Cool Neighborhoods Initiative and was created and monitored by multiple teams within the NYC government. These teams include: NYC Parks Department, Mayor’s Office of Climate and Resiliency, and NYC Department of Health and Mental Hygiene.

Within this dataset there were ten columns for each point of data:

  • Sensor.ID = Unique identifier of sensor

  • AirTemp = Average hourly air temperature, degrees; Fahrenheit

  • Hour = Hour of day, military time

  • Latitude = Latitude of sensor

  • Longitude = Longitude of sensor

  • Year = Year

  • Install.Type = Type of mounting - street tree/street light

  • Borough = Borough

  • ntacode = Neighborhood Tabulation Area (NTA) Code

One of the pitfalls of this data is that the sensors used to collect data are not spread across counties. When I made the map that showed Hispanic or Latino population in Bronx county with the overlay of where the sensors were, it was enlightening to see that the sensors lived only in three pockets of the county. If one wanted to have a more accurate read on hyperlocal temperature throughout the entire county, there would be additional sensors.

The second datasource I used also came from NYC Open Data. The Parks Properties was created January 29th, 2019 by NYC Parks Open Data Team. The data included only represents property that is partially or solely managed by NYC Parks.

In one part of this data that I utilized, one of the pitfalls is the scope and scale of the “Type Category” column. NYC Parks included almost every type of green space in this data. Some of these categories would not be considered “parks” by all: Cemetery’s, Lot, and Undeveloped.

LS0tCnRpdGxlOiAiSHlwZXJsb2NhbCBUZW1wZXJhdHVyZSBNb25pdG9yaW5nOyBIZWF0IGluIE5ZQyBhbmQgdGhlIEJyb254IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCiMjIyMjIE1ldGhvZHMgMSBGaW5hbCBQcm9qZWN0IHwgRGVjZW1iZXIgMjAyMwojIyMjIyAqWm9lIE1vc2tvd2l0eioKCiMjIyBQdXJwb3NlOiAKIyMjIyBUaGlzIHJlc2VhcmNoIGhvcGVzIHRvIGlkZW50aWZ5IGRpc2NyZXBhbmNpZXMgaW4gdGVtcGVyYXR1cmUgYmV0d2VlbiBNYW5oYXR0YW4gQ291bnR5IGFuZCBCcm9ueCBDb3VudHkgdXRpbGl6aW5nIEh5cGVybG9jYWwgVGVtcGVyYXR1cmUgRGF0YSBjb2xsZWN0ZWQgZnJvbSB0aGUgc3VtbWVyIG9mIDIwMTkuIAoKIyMjIEludHJvZHVjdGlvbiAmIEJhY2tncm91bmQ6IApUZW1wZXJhdHVyZXMgaW4gTmV3IFlvcmsgQ2l0eSBhcmUgcmlzaW5nIGV2ZXJ5IHllYXIuIEFzIGdyZWVuaG91c2UgZ2FzIGVtaXNzaW9ucyBjb250aW51ZSB0byB3YXJtIG91ciBwbGFuZXQsIGRlbnNlIHVyYmFuIGNpdGllcyBhcmUgZXhwZXJpZW5jaW5nIG1vcmUgZnJlcXVlbnQgaGVhdHdhdmVzIGFuZCBsb25nZXIgcGVyaW9kcyBvZiBleHRyZW1lIGhlYXQuIEFjY29yZGluZyB0byB0aGUgTWF5b3LigJlzIE9mZmljZSBvZiBDbGltYXRlICYgRW52aXJvbm1lbnRhbCBKdXN0aWNlLCB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZGF5cyBhYm92ZSA5MOKEiSB3aWxsIGxpa2VseSB0cmlwbGUgYnkgdGhlIDIwNTBzIGFuZCBxdWFkcnVwbGUgYnkgdGhlIDIwODBzLgoKRHVlIHRvIGEgbXVsdGl0dWRlIG9mIGZhY3RvcnMsIGV4dHJlbWUgaGVhdCBpcyBub3QgZmVsdCBldmVubHkgdGhyb3VnaG91dCBOZXcgWW9yayBDaXR5LiBNYXJnaW5hbGl6ZWQgcG9wdWxhdGlvbnMgYW5kIGxvdy1pbmNvbWUgbmVpZ2hib3Job29kcyBleHBlcmllbmNlIGhpZ2hlciB0ZW1wZXJhdHVyZXMgYXMgYSByZXN1bHQgb2YgdGhlIHVyYmFuIGhlYXQgaXNsYW5kIGVmZmVjdCBhbmQgcGVydmFzaXZlIGluZXF1YWxpdGllcy4gSW4gYXJlYXMgbGlrZSB0aGUgU291dGggQnJvbngsIHdoaWNoIGlzIGNvbnNpZGVyZWQgYW4gdXJiYW4gaGVhdCBpc2xhbmQsIHRlbXBlcmF0dXJlcyBjYW4gcmVwb3J0IGFueXdoZXJlIGZyb20gMeKEiSB0byA34oSJIHdhcm1lciBpbiB0aGUgZGF5dGltZSBhbmQgMuKEiSB0byA14oSJIHdhcm1lciBpbiB0aGUgZXZlbmluZyAoY29tcGFyZWQgdG8gTWFuaGF0dGFuKS4gCgpBbiB1cmJhbiBoZWF0IGlzbGFuZCBpcyBkZWZpbmVkIGJ5IFJlc291cmNlcyBmb3IgdGhlIEZ1dHVyZSBhcyDigJx0aGUgaW5jcmVhc2UgaW4gdGVtcGVyYXR1cmUgY2F1c2VkIGJ5IHRoZSBidWlsdCBlbnZpcm9ubWVudC7igJ0gSW4gdGhlIFNvdXRoIEJyb254IHRoZXJlIGlzIGEgbWFqb3IgbGFjayBvZiBwYXJrcywgc2hhZGUgY292ZXJhZ2UgYW5kIGdyZWVuIHNwYWNlcywgYSBsYXJnZSBhbW91bnQgb2YgaW5kdXN0cmlhbC9wb2xsdXRpbmcgZmFjaWxpdGllcyAoMTIrIGluIHRvdGFsKSwgYW5kIHRoZSBwcmVzZW5jZSBvZiB0aGUgQ3Jvc3MgQnJvbnggRXhwcmVzc3dheSAtIHdoaWNoIGV4cG9zZXMgdGhlIHBvcHVsYXRpb24gdG8gYWlyIHBvbGx1dGlvbiBhbmQgaW5jcmVhc2VzIGFzdGhtYSByYXRlcy4gCgpBbm90aGVyIHJlYXNvbiB0aGF0IGxvdy1pbmNvbWUgbmVpZ2hib3Job29kcyBhbmQgcG9wdWxhdGlvbnMgc3VmZmVyIGZyb20gYSBkaXNwcm9wb3J0aW9uYXRlIHJhdGUgb2YgZXh0cmVtZSBoZWF0IGlzIGR1ZSB0byBkZWNhZGVzIG9mIHJlZGxpbmluZyBhbmQgZGlzaW52ZXN0bWVudC4gVGhlc2UgYXJlYXMgbGFjayBhZGVxdWF0ZSBob3VzaW5nIGFuZCB0eXBpY2FsbHkgaGF2ZSBwb29yIG1haW50ZW5hbmNlLCBtYWtpbmcgaXQgZGlmZmljdWx0IHRvIGF2b2lkIGhlYXQgYW5kIHByb3Blcmx5IGNvb2wgb25lcyBob21lLiBSZXNpZGVudHMgYXJlIG9mdGVuIGxlZnQgd2l0aCB0aGUgY2hvaWNlIHRvIGluZGVwZW5kZW50bHkgcHV0IGluIGV4cGVuc2l2ZSBjb29saW5nIG1lYXN1cmVzIHN1Y2ggYXMgYWlyIGNvbmRpdGlvbmluZyBvciByZWx5IG9uIGV4dGVybmFsIHJlc291cmNlcy4gCgojIyMgRGF0YSBTb3VyY2U6IApUaGUgZGF0YXNldCBJIHdpbGwgYmUgdXRpbGl6aW5nIGZvciB0aGlzIHJlcG9ydCBpcyBhdmFpbGFibGUgb24gTllDIE9wZW4gRGF0YSBhbmQgaXMgdGl0bGVkIOKAnEh5cGVybG9jYWwgVGVtcGVyYXR1cmUgTW9uaXRvcmluZy7igJ0gVGhpcyBkYXRhc2V0IHdhcyBjcmVhdGVkIGFzIGEgcGFydCBvZiB0aGUgQ29vbCBOZWlnaGJvcmhvb2RzIEluaXRpYXRpdmUgYW5kIGZhY2lsaXRhdGVkIGJ5IHRoZSBOWUMgUGFya3MgRGVwYXJ0bWVudCwgT2ZmaWNlIG9mIFJlc2lsaWVuY2UgYW5kIE5ZQyBEZXBhcnRtZW50IG9mIEhlYWx0aCBhbmQgTWVudGFsIEh5Z2llbmUuIAoKVGhlIHB1cnBvc2Ugb2YgdGhpcyBkYXRhIHdhcyB0byBtb25pdG9yIHN0cmVldCBsZXZlbCB0ZW1wZXJhdHVyZSBvbiBhIHN1YnNldCBvZiBjaXR5IGJsb2NrcyBpbiBjZXJ0YWluIG5laWdoYm9yaG9vZHMgd2l0aCB0aGUgaGlnaGVzdCBoZWF0IG1vcnRhbGl0eSByaXNrIGR1cmluZyB0aGUgc3VtbWVycyBvZiAyMDE4IGFuZCAyMDE5LiBGb3IgdGhlIHB1cnBvc2Ugb2YgbXkgYW5hbHlzaXMsIEkgZGVjaWRlZCB0byB1c2Ugb25seSB0aGUgbW9zdCByZWNlbnQgZGF0YSBjb2xsZWN0ZWQgZnJvbSB0aGUgeWVhciAyMDE5IGFuZCBuYXJyb3cgdGhlIGRhdGEgY29sbGVjdGlvbiBwZXJpb2QgdG8gMDYvMTUgLSAwOS8yMS4KCgojIyMgUmVzZWFyY2ggUXVlc3Rpb25zOiAKCiogV2hhdCBhcmUgdGhlIGRpZmZlcmVuY2VzIGluIG1heGltdW0gYWlyIHRlbXBlcmF0dXJlIGR1cmluZyB0aGUgc3VtbWVyIG1vbnRocyBvZiBKdW5lLCBKdWx5LCBBdWd1c3QgYW5kIFNlcHRlbWJlcj8gU3BlY2lmaWNhbGx5IGJldHdlZW4gTmV3IFlvcmsgQ291bnR5IGFuZCBTb3V0aCBCcm9ueCBDb3VudHk/CgoqIFdoZXJlIGFyZSB0aGUgbW9uaXRvcnMgbG9jYXRlZCB0aGF0IGNvbGxlY3QgdGhpcyBpbmZvcm1hdGlvbj8KCiogV2hhdCBpcyB0aGUgZ3JlZW4gc3BhY2UgY292ZXJhZ2UgaW4gZWFjaCBvZiB0aGVzZSBjb3VudGllcz8KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiNsb2FkIGxpYnJhcmllcyBhbmQgZGF0YSAKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoUlNvY3JhdGEpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoRFQpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRpZHljZW5zdXMpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlncmlzKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkocGxvdGx5KQoKaHlwZXJfbG9jYWxfdGVtcF9kYXRhIDwtIHJlYWQuY3N2KCJkYXRhL0h5cGVybG9jYWxfVGVtcGVyYXR1cmVfTW9uaXRvcmluZ18yMDIzMTIxMC5jc3YiKQoKYm9yb3MgPC0gc3RfcmVhZCgifi9EZXNrdG9wL1VFUy9NRVRIT0RTL3BhcnQyL0Jvcm91Z2ggQm91bmRhcmllcy5nZW9qc29uIikKCm5hYmVzIDwtIHN0X3JlYWQgKCJ+L0Rlc2t0b3AvVUVTL01FVEhPRFMvcGFydDIvbnludGEyMDIwXzIzYy9ueW50YTIwMjAuc2hwIikKCm1hcF9vZl9wYXJrcyA8LSBzdF9yZWFkKCJ+L0Rlc2t0b3AvVUVTL01FVEhPRFMvcGFydDIvUGFya3MgUHJvcGVydGllc18yMDIzMTIxMi5nZW9qc29uIikKYGBgCgojIyMgUmVzdWx0cyAKClRoZSBzY2F0dGVycGxvdHMgYmVsb3cgKEZpZy4gMS00KSBzaG93IHRoZSBtYXhpbXVtIGh5cGVybG9jYWwgYWlyIHRlbXBlcmF0dXJlIGJ5IGRhdGUuIFRoZSBibHVlIGNvbG9yZWQgcG9pbnRzIHJlcHJlc2VudCBkYXRhIHRha2VuIGZyb20gQnJvbnggQ291bnR5IGFuZCB0aGUgcmVkIGNvbG9yZWQgcG9pbnRzIHJlcHJlc2VudCBkYXRhIHRha2VuIGZyb20gTmV3IFlvcmsgQ291bnR5LiBXaGVuIEkgd2FzIGRvbmUgZmlsdGVyaW5nIG15IGRhdGEsIHRoZXJlIHdlcmUgOTkgZGF0YSBwb2ludHMgZm9yIGVhY2ggY291bnR5IHRoYXQgSSB3YW50ZWQgdG8gd29yayB3aXRoLiBEdWUgdG8gdGhpcywgSSB0aG91Z2h0IGl0IGJlc3QgdG8gc3BsaXQgdGhlIHNjYXR0ZXJwbG90cyB1cCBieSBtb250aC4gCgpJbiBvcmRlciB0byBjcmVhdGUgdGhlc2UgdmlzdWFscywgSSBmaWx0ZXJlZCB0aGUgTllDIE9wZW4gRGF0YSBieSDigJxib3JvdWdo4oCdIGFuZCDigJx5ZWFy4oCdLiBEdWUgdG8gZWFjaCBkYXRlIGhhdmluZyBtdWx0aXBsZSB0ZW1wZXJhdHVyZSByZWFkaW5ncywgSSB0aGVuIHVzZWQgdGhlICpncm91cF9ieSogYW5kICpzdW1tYXJpc2UqIGZ1bmN0aW9ucyB0byBmaW5kIHRoZSBtYXhpbXVtIGh5cGVybG9jYWwgdGVtcGVyYXR1cmUgcGVyIGRheS4gCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQojQnJvbnggZGF0YSBmb3IgMjAxOQpCcm9ueF9kYXRhIDwtIGh5cGVyX2xvY2FsX3RlbXBfZGF0YSB8PgogIGZpbHRlcihCb3JvdWdoID09ICJCcm9ueCIpIHw+CiAgZmlsdGVyKFllYXIgPT0gIjIwMTkiKSB8PgogIHNlbGVjdChTZW5zb3IuSUQsIEFpclRlbXAsIERheSwgSG91ciwgTGF0aXR1ZGUsIExvbmdpdHVkZSwgWWVhciwgSW5zdGFsbC5UeXBlLCBCb3JvdWdoLCBudGFjb2RlKQoKI01heCB0ZW1wLiBhY3Jvc3MgQnJvbnggYnkgZGF5IApEYWlseV9Ccm9ueF9kYXRhIDwtIEJyb254X2RhdGEgfD4KICBncm91cF9ieShEYXksIEJvcm91Z2gpIHw+CiAgc3VtbWFyaXNlKE1heF9UZW1wID0gbWF4KEFpclRlbXAsIG5hLnJtID0gVCkpCgojQnJpbmcgaW4gYmVzdCB0aW1lZnJhbWUgZGF0YWZyYW1lCkJlc3RfVGltZWZyYW1lX0Jyb254IDwtIERhaWx5X0Jyb254X2RhdGEgfD4KICBzbGljZSgxOjk5KQoKI0luZGl2aWR1YWwgZGF0YWZyYW1lcyBmb3IgZWFjaCBzY2F0dGVycGxvdCAtIEJyb254Ckp1bmVfQnJvbnggPC0gQmVzdF9UaW1lZnJhbWVfQnJvbnhbMToxNiwgXQpKdWx5X0Jyb254IDwtIEJlc3RfVGltZWZyYW1lX0Jyb254WzE3OjQ3LCBdCkF1Z3VzdF9Ccm9ueCA8LSBCZXN0X1RpbWVmcmFtZV9Ccm9ueFs0ODo3OCwgXQpTZXB0ZW1iZXJfQnJvbnggPC0gQmVzdF9UaW1lZnJhbWVfQnJvbnhbNzk6OTksIF0KCiNNYW5oYXR0YW4gZGF0YSBmb3IgMjAxOQpNYW5oYXR0YW5fZGF0YSA8LSBoeXBlcl9sb2NhbF90ZW1wX2RhdGEgfD4KICBmaWx0ZXIoQm9yb3VnaCA9PSAiTWFuaGF0dGFuIikgfD4KICBmaWx0ZXIoWWVhciA9PSAiMjAxOSIpIHw+CiAgc2VsZWN0KFNlbnNvci5JRCwgQWlyVGVtcCwgRGF5LCBIb3VyLCBMYXRpdHVkZSwgTG9uZ2l0dWRlLCBZZWFyLCBJbnN0YWxsLlR5cGUsIEJvcm91Z2gsIG50YWNvZGUpCgojTWF4IHRlbXAuIGFjcm9zcyBNYW5oYXR0YW4gYnkgZGF5IApEYWlseV9NYW5oYXR0YW5fZGF0YSA8LSBNYW5oYXR0YW5fZGF0YSB8PgogIGdyb3VwX2J5KERheSkgfD4KICBzdW1tYXJpc2UoTWF4X1RlbXAgPSBtYXgoQWlyVGVtcCwgbmEucm0gPSBUKSkKCiNJbmRpdmlkdWFsIGRhdGFmcmFtZXMgZm9yIGVhY2ggc2NhdHRlcnBsb3QgLSBNYW5oYXR0YW4KSnVuZV9NIDwtIERhaWx5X01hbmhhdHRhbl9kYXRhWzE6MTYsIF0KSnVseV9NIDwtIERhaWx5X01hbmhhdHRhbl9kYXRhWzE3OjQ3LCBdCkF1Z3VzdF9NIDwtIERhaWx5X01hbmhhdHRhbl9kYXRhWzQ4Ojc4LCBdClNlcHRlbWJlcl9NIDwtIERhaWx5X01hbmhhdHRhbl9kYXRhWzc5OjEwOCwgXQoKYGBgCgojIyMjIEZpZy4gMQoKRmlndXJlIDEgcmVwcmVzZW50cyBkYXRhIGNvbGxlY3RlZCBmcm9tIEp1bmUsIDIwMTkuIE91dCBvZiB0aGUgMTYgZGF0YXBvaW50cyBzaG93biwgbmluZSBzaG93IGhpZ2hlciBtYXggdGVtcGVyYXR1cmUgaW4gdGhlIEJyb254LCB3aGlsZSBzZXZlbiBzaG93IGhpZ2hlciBtYXggdGVtcGVyYXR1cmUgaW4gTWFuaGF0dGFuLiAKCmBgYHtyIGVjaG89RkFMU0V9CmdncGxvdChkYXRhID0gSnVuZV9Ccm9ueCwKICAgICAgIGFlcyh4ID0gRGF5LAogICAgICAgICAgIHkgPSBNYXhfVGVtcCkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImRvZGdlcmJsdWUyIikgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0xLHZqdXN0PTAuNSwgc2l6ZSA9OCkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBKdW5lX00sIGNvbG9yID0gInJlZDIiKSArCiAgbGFicyh4ID0gIlRpbWVmcmFtZSAoRGF0ZSkiLCB5ID0gIk1heCBBaXIgVGVtcGVyYXR1cmUgKEYpIiwKICAgICAgIHRpdGxlID0gIkh5cGVybG9jYWwgVGVtcGVyYXR1cmUgaW4gQnJvbnggYW5kIE1hbmhhdHRhbiAoSnVuZSAyMDE5KSIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZXM6IE5ZQyBPcGVuIERhdGEiKQpgYGAKCiMjIyMgRmlnLiAyCgpGaWd1cmUgMiByZXByZXNlbnRzIGRhdGEgY29sbGVjdGVkIGZyb20gSnVseSwgMjAxOS4gT3V0IG9mIHRoZSAzMCBkYXRhcG9pbnRzIHNob3duLCBzaXh0ZWVuIHNob3cgaGlnaGVyIG1heCB0ZW1wZXJhdHVyZSBpbiB0aGUgQnJvbngsIHdoaWxlIGZpZnRlZW4gc2hvdyBoaWdoZXIgbWF4IHRlbXBlcmF0dXJlIGluIE1hbmhhdHRhbi4KCmBgYHtyIGVjaG89RkFMU0V9CmdncGxvdChkYXRhID0gSnVseV9Ccm9ueCwgCiAgICAgICBhZXMoeCA9IERheSwgCiAgICAgICAgICAgeSA9IE1heF9UZW1wKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiZG9kZ2VyYmx1ZTIiKSArIAogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0xLHZqdXN0PTAuNSwgc2l6ZSA9OCkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBKdWx5X00sIGNvbG9yID0gInJlZDIiKSArIAogIGxhYnMoeCA9ICJUaW1lZnJhbWUgKERhdGUpIiwgeSA9ICJNYXggQWlyIFRlbXBlcmF0dXJlIChGKSIsCiAgICAgICB0aXRsZSA9ICJIeXBlcmxvY2FsIFRlbXBlcmF0dXJlIGluIEJyb254IGFuZCBNYW5oYXR0YW4gKEp1bHkgMjAxOSkiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBOWUMgT3BlbiBEYXRhIikKYGBgCgojIyMjIEZpZy4gMwoKRmlndXJlIDMgcmVwcmVzZW50cyBkYXRhIGNvbGxlY3RlZCBmcm9tIEF1Z3VzdCwgMjAxOS4gT3V0IG9mIHRoZSAzMCBkYXRhcG9pbnRzIHNob3duLCB0ZW4gc2hvdyBoaWdoZXIgbWF4IHRlbXBlcmF0dXJlIGluIHRoZSBCcm9ueCwgd2hpbGUgdHdlbnR5IHNob3cgaGlnaGVyIG1heCB0ZW1wZXJhdHVyZSBpbiBNYW5oYXR0YW4uCgpgYGB7ciBlY2hvPUZBTFNFfQpnZ3Bsb3QoZGF0YSA9IEF1Z3VzdF9Ccm9ueCwgCiAgICAgICBhZXMoeCA9IERheSwgCiAgICAgICAgICAgeSA9IE1heF9UZW1wKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiZG9kZ2VyYmx1ZTIiKSArIAogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0xLHZqdXN0PTAuNSwgc2l6ZSA9OCkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBBdWd1c3RfTSwgY29sb3IgPSAicmVkMiIpICsgCiAgbGFicyh4ID0gIlRpbWVmcmFtZSAoRGF0ZSkiLCB5ID0gIk1heCBBaXIgVGVtcGVyYXR1cmUgKEYpIiwKICAgICAgIHRpdGxlID0gIkh5cGVybG9jYWwgVGVtcGVyYXR1cmUgaW4gQnJvbnggYW5kIE1hbmhhdHRhbiAoQXVndXN0IDIwMTkpIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlczogTllDIE9wZW4gRGF0YSIpCmBgYAoKIyMjIyBGaWcuIDQKCkZpZ3VyZSA0IHJlcHJlc2VudHMgZGF0YSBjb2xsZWN0ZWQgZnJvbSBBdWd1c3QsIDIwMTkuIE91dCBvZiB0aGUgMjEgZGF0YXBvaW50cyBzaG93biwgc2V2ZW4gc2hvdyBoaWdoZXIgbWF4IHRlbXBlcmF0dXJlIGluIHRoZSBCcm9ueCwgd2hpbGUgdGhpcnRlZW4gc2hvdyBoaWdoZXIgbWF4IHRlbXBlcmF0dXJlIGluIE1hbmhhdHRhbi4KCmBgYHtyIGVjaG89RkFMU0V9CmdncGxvdChkYXRhID0gU2VwdGVtYmVyX0Jyb254LCAKICAgICAgIGFlcyh4ID0gRGF5LCAKICAgICAgICAgICB5ID0gTWF4X1RlbXApKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJkb2RnZXJibHVlMiIpICsgCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTEsdmp1c3Q9MC41LCBzaXplID04KSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IFNlcHRlbWJlcl9NLCBjb2xvciA9ICJyZWQyIikgKyAKICBsYWJzKHggPSAiVGltZWZyYW1lIChEYXRlKSIsIHkgPSAiTWF4IEFpciBUZW1wZXJhdHVyZSAoRikiLAogICAgICAgdGl0bGUgPSAiSHlwZXJsb2NhbCBUZW1wZXJhdHVyZSBpbiBCcm9ueCBhbmQgTWFuaGF0dGFuIChTZXB0ZW1iZXIgMjAxOSkiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBOWUMgT3BlbiBEYXRhIikKYGBgCgojIyMjIEZpZy4gNQoKRmlndXJlIDUgaXMgYSBtYXAgdGhhdCBzaG93cyB0d28gbGF5ZXJzIG9mIGRhdGEgaW4gQnJvbnggQ291bnR5LiBUaGUgZmlyc3QgbGF5ZXIgZGlzcGxheXMgd2hlcmUgdGhlIHNlbnNvcnMgdGhhdCBjb2xsZWN0ZWQgdGhlIEh5cGVybG9jYWwgVGVtcGVyYXR1cmUgZGF0YSBhcmUgbG9jYXRlZC4gVGhlIHNlY29uZCBsYXllciBzaG93cyBhbGwgb2YgdGhlICJwYXJrcyIgaW4gdGhlIGNvdW50eS4gVGhpcyBpcyBsYWJlbGVkIGFzICJUeXBlIG9mIEdyZWVuIFNwYWNlIi4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojQ3JlYXRlIG5ldyBkYXRhZnJhbWUgd2l0aCBwYXJrcyBpbmZvIApwYXJrc19tYXAgPC0gbWFwX29mX3BhcmtzIHw+CiAgc2VsZWN0KGJvcm91Z2gsIGdlb21ldHJ5LCBuYW1lMzExLCB0eXBlY2F0ZWdvcnkpIHw+CiAgZmlsdGVyKGJvcm91Z2ggPT0gIlgiKQoKI01heCB0ZW1wLiBmb3IgZWFjaCBzZW5zb3IgYnkgZGF5IChCcm9ueCkKQnJvbnhfZGF0YV9ieV9zZW5zb3IgPC0gQnJvbnhfZGF0YSB8PgogIGdyb3VwX2J5KFNlbnNvci5JRCkgfD4KICBzdW1tYXJpc2UoTWF4X1RlbXAgPSBtYXgoQWlyVGVtcCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIGxhdCA9IGZpcnN0KExhdGl0dWRlKSwKICAgICAgICAgICAgbG9uZyA9IGZpcnN0KExvbmdpdHVkZSkpCgojYnJvbnggZGF0YSBzZW5zb3Igc3BhdGlhbCBkYXRhZnJhbWUKQnJvbnhfc3BhdGlhbCA8LSBzdF9hc19zZihCcm9ueF9kYXRhX2J5X3NlbnNvciwgY29vcmRzID0gYygibG9uZyIsICJsYXQiKSwgY3JzID0gNDMyNikKCiMjIyBNQVAgb24gbG9jYXRpb24gb2YgcGFya3MsIG1heGltdW0gdGVtcC4gb3ZlcmFsbCBmb3IgZWFjaCBzZW5zb3IsIG5hYmVzIG9mIGJyb254IApCcm9ueF9zZW5zb3JfYW5kX3BhcmtzIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBuYWJlcyB8PiBmaWx0ZXIoQm9yb05hbWUgPT0gIkJyb254IiksIAogICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIGx3ZCA9IDAuMjUpICsKICB0aGVtZV92b2lkKCkgKyAKICBnZW9tX3NmKGRhdGEgPSBCcm9ueF9zcGF0aWFsLCBhZXMoY29sb3IgPSBNYXhfVGVtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIk1heGltdW0gVGVtcGVyYXR1cmU6ICIsIE1heF9UZW1wKSwgc2l6ZSA9IDEuNSkpICsKICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAieWVsbG93IiwgaGlnaCA9ICJyZWQiKSArCiAgZ2VvbV9zZihkYXRhID0gcGFya3NfbWFwLCBmaWxsID0gImZvcmVzdGdyZWVuIiwgY29sb3IgPSAiZm9yZXN0Z3JlZW4iLCAKICAgICAgICAgIGFlcyh0ZXh0ID0gcGFzdGUwKCJQYXJrOiAiLCBuYW1lMzExLCAiPGJyPlR5cGUgb2YgR3JlZW4gU3BhY2U6ICIsIHR5cGVjYXRlZ29yeSksIHNpemUgPSAxLjUpKQoKI21ha2UgaXQgaW50ZXJhY3RpdmUgCmdncGxvdGx5KEJyb254X3NlbnNvcl9hbmRfcGFya3MsIHRvb2x0aXAgPSAidGV4dCIpCmBgYAoKIyMjIyBGaWcuIDYKClRvIGNvbXBhcmUgc2Vuc29yIGxvY2F0aW9uIGFuZCBwYXJrIGNvdmVyYWdlLCBJIG1hZGUgYW4gaWRlbnRpY2FsIG1hcCB0byBGaWd1cmUgNCBidXQgZm9yIE5ldyBZb3JrIENvdW50eS4gVGhlIGZpcnN0IGxheWVyIGRpc3BsYXlzIHdoZXJlIHRoZSBzZW5zb3JzIHRoYXQgY29sbGVjdGVkIHRoZSBIeXBlcmxvY2FsIFRlbXBlcmF0dXJlIGRhdGEgYXJlIGxvY2F0ZWQuIFRoZSBzZWNvbmQgbGF5ZXIgc2hvd3MgYWxsIG9mIHRoZSAicGFya3MiIGluIHRoZSBjb3VudHkuIFRoaXMgaXMgbGFiZWxlZCBhcyAiVHlwZSBvZiBHcmVlbiBTcGFjZSIuCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojUGFya3MgbWFwIGZvciBNYW5oYXR0YW4gIApwYXJrc19tYXBfTWFuaGF0dGFuIDwtIG1hcF9vZl9wYXJrcyB8PgogIHNlbGVjdChib3JvdWdoLCBnZW9tZXRyeSwgbmFtZTMxMSwgdHlwZWNhdGVnb3J5KSB8PgogIGZpbHRlcihib3JvdWdoID09ICJNIikKCiNNYXggdGVtcC4gZm9yIGVhY2ggc2Vuc29yIGJ5IGRheSAoTWFuaGF0dG4pCk1hbmhhdHRhbl9kYXRhX2J5X3NlbnNvciA8LSBNYW5oYXR0YW5fZGF0YSB8PgogIGdyb3VwX2J5KFNlbnNvci5JRCkgfD4KICBzdW1tYXJpc2UoTWF4X1RlbXAgPSBtYXgoQWlyVGVtcCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIGxhdCA9IGZpcnN0KExhdGl0dWRlKSwKICAgICAgICAgICAgbG9uZyA9IGZpcnN0KExvbmdpdHVkZSkpCgojbWFuaGF0dGFuIGRhdGEgc2Vuc29yIHNwYXRpYWwgZGF0YWZyYW1lCk1hbmhhdHRhbl9zcGF0aWFsIDwtIHN0X2FzX3NmKE1hbmhhdHRhbl9kYXRhX2J5X3NlbnNvciwgY29vcmRzID0gYygibG9uZyIsICJsYXQiKSwgY3JzID0gNDMyNikKCiMjIyBNYW5oYXR0YW4gTUFQIG9uIGxvY2F0aW9uIG9mIHBhcmtzLCBtYXhpbXVtIHRlbXAuIG92ZXJhbGwgZm9yIGVhY2ggc2Vuc29yLCBuYWJlcyBvZiBtYW5oYXR0YW4gCk1hbmhhdHRhbl9zZW5zb3JfYW5kX3BhcmtzIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBuYWJlcyB8PiBmaWx0ZXIoQm9yb05hbWUgPT0gIk1hbmhhdHRhbiIpLCAKICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9IE5BLCBsd2QgPSAwLjI1KSArCiAgdGhlbWVfdm9pZCgpICsgCiAgZ2VvbV9zZihkYXRhID0gTWFuaGF0dGFuX3NwYXRpYWwsIGFlcyhjb2xvciA9IE1heF9UZW1wLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgiTWF4aW11bSBUZW1wZXJhdHVyZTogIiwgTWF4X1RlbXApLCBzaXplID0gMS41KSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICJ5ZWxsb3ciLCBoaWdoID0gInJlZCIpICsKICBnZW9tX3NmKGRhdGEgPSBwYXJrc19tYXBfTWFuaGF0dGFuLCBmaWxsID0gImZvcmVzdGdyZWVuIiwgY29sb3IgPSAiZm9yZXN0Z3JlZW4iLCAKICAgICAgICAgIGFlcyh0ZXh0ID0gcGFzdGUwKCJQYXJrOiAiLCBuYW1lMzExLCAiPGJyPlR5cGUgb2YgR3JlZW4gU3BhY2U6ICIsIHR5cGVjYXRlZ29yeSksIHNpemUgPSAxLjUpKQoKI21ha2UgaXQgaW50ZXJhY3RpdmUgCmdncGxvdGx5KE1hbmhhdHRhbl9zZW5zb3JfYW5kX3BhcmtzLCB0b29sdGlwID0gInRleHQiKQpgYGAKCgojIyMgRGlzY3Vzc2lvbgoKR29pbmcgaW50byB0aGlzIHJlc2VhcmNoIHByb2plY3QgSSBleHBlY3RlZCBGaWd1cmVzIDEtNCB0byBzaG93IEJyb254IENvdW50eSBoYXZpbmcgbW9yZSBkYXlzIHdpdGggYSBoaWdoZXIgIk1heGltdW0gVGVtcC4iIHRoYW4gTmV3IFlvcmsgQ291bnR5LiBBbHRob3VnaCB0aGlzIHdhcyBub3QgdGhlIGNhc2UsIHdoZW4gd2UgbG9vayBhdCBzb21lIG9mIHRoZSBpbmRpdmlkdWFsIGRhdGEgcG9pbnRzIGZvciB0aGUgd2FybWVyIGRheXMgaW4gQnJvbnggQ291bnR5LCB0ZW1wZXJhdHVyZSBkaWZmZXJlbmNlIHdhcyBzaWduaWZpY2FudC4gVGhlIGRhdGEgc2hvd3MgZGF5cyB0aGF0IHdlcmUgYXJvdW5kIDQtNiBkZWdyZWVzIHdhcm1lciBhbmQgb25lIGRheSBpbiBKdWx5IHRoYXQgd2FzIDEyIGRlZ3JlZXMgd2FybWVyLgoKQWZ0ZXIgY3JlYXRpbmcgdGhlIG1hcHMgZm9yIEJyb254IGFuZCBNYW5oYXR0YW4gQ291bnR5LCBpdCB3YXMgaW50ZXJlc3RpbmcgdG8gc2VlIHdoZXJlIHRoZSBzZW5zb3JzIHdlcmUgcGxhY2VkIGZvciBjb2xsZWN0aW5nIGRhdGEuIEluIE1hbmhhdHRhbiBDb3VudHksIHRoZXkgYXJlIGNsdXN0ZXJlZCBpbiBDZW50cmFsIGFuZCBFYXN0IEhhcmxlbSB3aGljaCBhcmUgbG93LWluY29tZSBhcmVhcyB0aGF0IHN1ZmZlciBmcm9tIGV4dHJlbWUgaGVhdC4gSXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIHdoYXQgdGhlIHRlbXBlcmF0dXJlIGRpZmZlcmVuY2UgYmV0d2VlbiBCcm9ueCBDb3VudHkgYW5kIE1hbmhhdHRhbiBDb3VudHkgd291bGQgYmUgaWYgdGhlIHNlbnNvcnMgd2VyZSBwbGFjZWQgaW4gTG93ZXIgTWFuaGF0dGFuIG9yIGV2ZW4gdGhlIFVwcGVyIFdlc3QgU2lkZSBhcyB0aGVzZSBoYXZlIGEgZ3JlYXRlciBhbW91bnQgb2YgZ3JlZW4gc3BhY2UuIAoKIyMjIE5leHQgU3RlcHMKClRoZXJlIGlzIHN0aWxsIGEgZmFpciBhbW91bnQgdG8gYmUgdW5jb3ZlcmVkIGFib3V0IEh5cGVybG9jYWwgVGVtcGVyYXR1cmUgaW4gTmV3IFlvcmsgYW5kIEJyb254IENvdW50eS4gU29tZSBpZGVhcyBpbmNsdWRlOiAKCjEuIERlZXBlciBhbmFseXNpcyBpbnRvIHdoZXJlIHRoZSByZXN0IG9mIHRoZSBzZW5zb3JzIGFyZSBsb2NhdGVkIHBlciBjb3VudHkKKyBIb3cgdGhpcyBwbGFjZW1lbnQgd2FzIGRlY2lkZWQ/CgoyLiBQb2xsdXRpb24gZGF0YSBmb3IgTWFuaGF0dGFuIENvdW50eSBhbmQgQnJvbnggQ291bnR5CisgRG9lcyB0aGlzIGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gbWF4LiB0ZW1wZXJhdHVyZT8gCgozLiAiQXZlcmFnZSIgdGVtcGVyYXR1cmUgcmVjb3JkZWQgYnkgbG9jYWwgd2VhdGhlciBzdGF0aW9ucyBjb21wYXJlZCB0byAiTWF4IiB0ZW1wZXJhdHVyZSByZWZsZWN0ZWQgaW4gZGF0YSAKKyBNb250aGx5IGF2ZXJhZ2UgCgojIyMgTWV0aG9kcyBBcHBlbmRpeAoKIyMjIyBOWUMgT3BlbiBEYXRhCgpUaGUgbWFpbiBkYXRhc291cmNlIEkgdXNlZCBjYW1lIGZyb20gTllDIE9wZW4gRGF0YS4gKkh5cGVybG9jYWwgVGVtcGVyYXR1cmUgTW9uaXRvcmluZyogd2FzIHB1Ymxpc2hlZCBvbiBBdWd1c3QgMjB0aCwgMjAyMSB0aHJvdWdoIHRoZSBDb29sIE5laWdoYm9yaG9vZHMgSW5pdGlhdGl2ZSBhbmQgd2FzIGNyZWF0ZWQgYW5kIG1vbml0b3JlZCBieSBtdWx0aXBsZSB0ZWFtcyB3aXRoaW4gdGhlIE5ZQyBnb3Zlcm5tZW50LiBUaGVzZSB0ZWFtcyBpbmNsdWRlOiBOWUMgUGFya3MgRGVwYXJ0bWVudCwgTWF5b3LigJlzIE9mZmljZSBvZiBDbGltYXRlIGFuZCBSZXNpbGllbmN5LCBhbmQgTllDIERlcGFydG1lbnQgb2YgSGVhbHRoIGFuZCBNZW50YWwgSHlnaWVuZS4gCgpXaXRoaW4gdGhpcyBkYXRhc2V0IHRoZXJlIHdlcmUgdGVuIGNvbHVtbnMgZm9yIGVhY2ggcG9pbnQgb2YgZGF0YTogCgoqIFNlbnNvci5JRCA9IFVuaXF1ZSBpZGVudGlmaWVyIG9mIHNlbnNvcgoKKiBBaXJUZW1wID0gQXZlcmFnZSBob3VybHkgYWlyIHRlbXBlcmF0dXJlLCBkZWdyZWVzOyBGYWhyZW5oZWl0CgoqIEhvdXIgPSBIb3VyIG9mIGRheSwgbWlsaXRhcnkgdGltZQoKKiBMYXRpdHVkZSA9IExhdGl0dWRlIG9mIHNlbnNvcgoKKiBMb25naXR1ZGUgPSBMb25naXR1ZGUgb2Ygc2Vuc29yCgoqIFllYXIgPSBZZWFyCgoqIEluc3RhbGwuVHlwZSA9IFR5cGUgb2YgbW91bnRpbmcgLSBzdHJlZXQgdHJlZS9zdHJlZXQgbGlnaHQKCiogQm9yb3VnaCA9IEJvcm91Z2gKCiAqIG50YWNvZGUgPSBOZWlnaGJvcmhvb2QgVGFidWxhdGlvbiBBcmVhIChOVEEpIENvZGUKIApPbmUgb2YgdGhlIHBpdGZhbGxzIG9mIHRoaXMgZGF0YSBpcyB0aGF0IHRoZSBzZW5zb3JzIHVzZWQgdG8gY29sbGVjdCBkYXRhIGFyZSBub3Qgc3ByZWFkIGFjcm9zcyBjb3VudGllcy4gV2hlbiBJIG1hZGUgdGhlIG1hcCB0aGF0IHNob3dlZCBIaXNwYW5pYyBvciBMYXRpbm8gcG9wdWxhdGlvbiBpbiBCcm9ueCBjb3VudHkgd2l0aCB0aGUgb3ZlcmxheSBvZiB3aGVyZSB0aGUgc2Vuc29ycyB3ZXJlLCBpdCB3YXMgZW5saWdodGVuaW5nIHRvIHNlZSB0aGF0IHRoZSBzZW5zb3JzIGxpdmVkIG9ubHkgaW4gdGhyZWUgcG9ja2V0cyBvZiB0aGUgY291bnR5LiBJZiBvbmUgd2FudGVkIHRvIGhhdmUgYSBtb3JlIGFjY3VyYXRlIHJlYWQgb24gaHlwZXJsb2NhbCB0ZW1wZXJhdHVyZSB0aHJvdWdob3V0IHRoZSBlbnRpcmUgY291bnR5LCB0aGVyZSB3b3VsZCBiZSBhZGRpdGlvbmFsIHNlbnNvcnMuIAoKVGhlIHNlY29uZCBkYXRhc291cmNlIEkgdXNlZCBhbHNvIGNhbWUgZnJvbSBOWUMgT3BlbiBEYXRhLiBUaGUgKlBhcmtzIFByb3BlcnRpZXMqIHdhcyBjcmVhdGVkIEphbnVhcnkgMjl0aCwgMjAxOSBieSBOWUMgUGFya3MgT3BlbiBEYXRhIFRlYW0uIFRoZSBkYXRhIGluY2x1ZGVkIG9ubHkgcmVwcmVzZW50cyBwcm9wZXJ0eSB0aGF0IGlzIHBhcnRpYWxseSBvciBzb2xlbHkgbWFuYWdlZCBieSBOWUMgUGFya3MuIAoKSW4gb25lIHBhcnQgb2YgdGhpcyBkYXRhIHRoYXQgSSB1dGlsaXplZCwgb25lIG9mIHRoZSBwaXRmYWxscyBpcyB0aGUgc2NvcGUgYW5kIHNjYWxlIG9mIHRoZSAiVHlwZSBDYXRlZ29yeSIgY29sdW1uLiBOWUMgUGFya3MgaW5jbHVkZWQgYWxtb3N0IGV2ZXJ5IHR5cGUgb2YgZ3JlZW4gc3BhY2UgaW4gdGhpcyBkYXRhLiBTb21lIG9mIHRoZXNlIGNhdGVnb3JpZXMgd291bGQgbm90IGJlIGNvbnNpZGVyZWQgInBhcmtzIiBieSBhbGw6IENlbWV0ZXJ5J3MsIExvdCwgYW5kIFVuZGV2ZWxvcGVkLiAKCgoKCg==