Introduction
At the end of 2019, the first Covid-19 case was found in China. On January 21, 2020, the first domestic infection case in the United States appeared in Washington State. So far, the number of new coronavirus cases worldwide has exceeded 1.89 Billion. It took less than half a year for the virus to spread from its discovery to a widespread epidemic, and how to slow down the spread of the virus has also become a hot topic.
A number of studies have shown that the spread of the Covid-19 virus has a negative relationship with temperature, that is, the higher the temperature, the slower the spread. Some of these studies have estimated that 41-57 degrees Fahrenheit is the best spreading temperature range for Covid-19.
So does the spread of Covid-19 in the United States conform to this rule? Does the epidemic spread faster in colder places? In the same area, does the virus spread faster when the temperature is colder or between 41-57 degrees Fahrenheit?
Below we will use seven pictures to answer the above questions.
Breif Intro to the datasets
#Covid19 cases Dataset from New York Times, update everyday
covid19 <- read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-states.csv")
#Population data from census 2018
population <- read_csv("https://raw.githubusercontent.com/COVID19Tracking/associated-data/master/us_census_data/us_census_2018_population_estimates_states_agegroups.csv")
#Average Temperature by state 2021, from worldpopulationreview.com
temp <- read_csv("csvData.csv")
#Monthly Average Temperature for five states, collected from rssWeather.com
statetemp <- read_csv("temperature.csv")
Overview of Covid19 in each state in the United States
This graph is colored according to the current cumulative cases in each state. Place the mouse on each state, and you can see the number of cases per 1,000 people in this state, the earliest case occurrence time in the state, and the average temperature in this state.
Compare Covid19 Cases in States with Different Average Temperature
This is a scatter Plot of Cases and Average Temperature of all states, while the data points are colored according to the region of each state. Although it is not obvious, it can be seen that there are relatively more cases per thousand people in some states where the temperature is between 40-60 degrees. The smooth curve in the figure also shows that the peak appears at about 55 degrees.
Cases and Average Temperature of 10 randomly selected States
This graph contains the number of cases per thousand people and average temperature in 10 randomly selected states.
The above two figures compare the number of cases and average temperature in different states, but they do not prove the relationship between temperature and the spread of Covid19. Because the number of cases in a state is related to many other factors, including population density, economic level, medical level, the number of people undergoing Covid19 testing, etc., it is difficult to accurately analyze the temperature and the spread of Covid19 when there is no way to control the interference variables. Relationship between.
Compare the Growth Rate of Covid19 Cases in the Same Area at Different Temperature

This animation shows total Covid 19 cases and deaths in US over time, while the red line represent total cases and black line represent deaths. The scales of the two lines are different, but they have same unit: thousand people.
From the plot, we can clearly find that between November 2020 and February 2021, the slope of the curve of the number of cases and the number of deaths is very large. This means that the total number of cases has grown rapidly. This is in line with the law that Covid19 virus spreads faster when the temperature is lower.
By calculating the ratio of the number of new cases each month to the total number of cases at that time, we can get the growth rate. This plot shows the change of monthly grwoth rate of Covid19 over time.
As shown in the graph, before October 2020, the growth rate of cases gradually slowed down, but after November, the growth rate of cases suddenly increased, until it stopped around January and began to reduce.
Analyze the relationship between covid19 spread and temperature in selected states
In order to see more clearly the relationship between the change in case growth rate and temperature change, we selected six states to conduct a more detailed analysis on them. Geographically, these six states include southern, northern, central, and coastal areas.

This plot shows the monthly change of case growth rate and average temperature in six states. The red line represent growth rate of cases measured in percentage. The dark grey line represent the average temperature from 60°F to 10°F.
We can clearly see from the figure that the temperature reduction curve and the case growth curve reach their peaks at similar time periods, which shows that the spread between temperature and Covid19 has a negative relationship.

This is a boxplot of monthly case growth rate of this six states. All the months since June 2020 is divided into two group according to their monthly average tempareture. Months that have average temperature within the optimal spread temperature of Covid19 virus are color in red, the else are colored in blue. This also shows that temperature does have an impact on the spread of the covid19 virus.
Conclusion
To sum up, when we analyze the growth rate of cases at different temperatures(the rate of virus transmission) in the same area, we can clearly find that temperature has an negative impact on the spread of COVID-19. On the whole, when the temperature drops, the virus spreads faster; but if the temperature drops lower, the increase in cases will slow down, perhaps because the cold weather makes people unwilling to go out and reduces the chance of exposure to the virus. Author realy hoped that before the next cold winter which is suitable for the spread of the virus, people can defeat Covid-19 with the help of vaccines.
LS0tDQp0aXRsZTogIkRvZXMgVGVtcGVyYXR1cmUgQWZmZWN0IFRoZSBTcHJlYWQgb2YgQ09WSUQtMTk/Ig0KYXV0aG9yOiAiUml0YSBMaSINCmRhdGU6ICIyMDIxLzcvOCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgdGhlbWU6IHNpbXBsZXgNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KIyMgSW50cm9kdWN0aW9uDQoNCkF0IHRoZSBlbmQgb2YgMjAxOSwgdGhlIGZpcnN0IENvdmlkLTE5IGNhc2Ugd2FzIGZvdW5kIGluIENoaW5hLiBPbiBKYW51YXJ5IDIxLCAyMDIwLCB0aGUgZmlyc3QgZG9tZXN0aWMgaW5mZWN0aW9uIGNhc2UgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYXBwZWFyZWQgaW4gV2FzaGluZ3RvbiBTdGF0ZS4gU28gZmFyLCB0aGUgbnVtYmVyIG9mIG5ldyBjb3JvbmF2aXJ1cyBjYXNlcyB3b3JsZHdpZGUgaGFzIGV4Y2VlZGVkIDEuODkgQmlsbGlvbi4gSXQgdG9vayBsZXNzIHRoYW4gaGFsZiBhIHllYXIgZm9yIHRoZSB2aXJ1cyB0byBzcHJlYWQgZnJvbSBpdHMgZGlzY292ZXJ5IHRvIGEgd2lkZXNwcmVhZCBlcGlkZW1pYywgYW5kIGhvdyB0byBzbG93IGRvd24gdGhlIHNwcmVhZCBvZiB0aGUgdmlydXMgaGFzIGFsc28gYmVjb21lIGEgaG90IHRvcGljLg0KDQpBIG51bWJlciBvZiBzdHVkaWVzIGhhdmUgc2hvd24gdGhhdCB0aGUgc3ByZWFkIG9mIHRoZSBDb3ZpZC0xOSB2aXJ1cyBoYXMgYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgd2l0aCB0ZW1wZXJhdHVyZSwgdGhhdCBpcywgdGhlIGhpZ2hlciB0aGUgdGVtcGVyYXR1cmUsIHRoZSBzbG93ZXIgdGhlIHNwcmVhZC4gU29tZSBvZiB0aGVzZSBzdHVkaWVzIGhhdmUgZXN0aW1hdGVkIHRoYXQgNDEtNTcgZGVncmVlcyBGYWhyZW5oZWl0IGlzIHRoZSBiZXN0IHNwcmVhZGluZyB0ZW1wZXJhdHVyZSByYW5nZSBmb3IgQ292aWQtMTkuDQoNClNvIGRvZXMgdGhlIHNwcmVhZCBvZiBDb3ZpZC0xOSBpbiB0aGUgVW5pdGVkIFN0YXRlcyBjb25mb3JtIHRvIHRoaXMgcnVsZT8gRG9lcyB0aGUgZXBpZGVtaWMgc3ByZWFkIGZhc3RlciBpbiBjb2xkZXIgcGxhY2VzPyBJbiB0aGUgc2FtZSBhcmVhLCBkb2VzIHRoZSB2aXJ1cyBzcHJlYWQgZmFzdGVyIHdoZW4gdGhlIHRlbXBlcmF0dXJlIGlzIGNvbGRlciBvciBiZXR3ZWVuIDQxLTU3IGRlZ3JlZXMgRmFocmVuaGVpdD8NCg0KQmVsb3cgd2Ugd2lsbCB1c2Ugc2V2ZW4gcGljdHVyZXMgdG8gYW5zd2VyIHRoZSBhYm92ZSBxdWVzdGlvbnMuDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFKQ0KYGBgDQoNCmBgYHtyIGxpYnJhcmllc30NCmxpYnJhcnkodGlkeXZlcnNlKSAgICAgIyBmb3IgZGF0YSBjbGVhbmluZyBhbmQgcGxvdHRpbmcNCmxpYnJhcnkobHVicmlkYXRlKSAgICAgIyBmb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkob3BlbmludHJvKSAgICAgIyBmb3IgdGhlIGFiYnIyc3RhdGUoKSBmdW5jdGlvbg0KbGlicmFyeShtYXBzKSAgICAgICAgICAjIGZvciBtYXAgZGF0YQ0KbGlicmFyeShnZ21hcCkgICAgICAgICAjIGZvciBtYXBwaW5nIHBvaW50cyBvbiBtYXBzDQpsaWJyYXJ5KGdwbG90cykgICAgICAgICMgZm9yIGNvbDJoZXgoKSBmdW5jdGlvbg0KbGlicmFyeShSQ29sb3JCcmV3ZXIpICAjIGZvciBjb2xvciBwYWxldHRlcw0KbGlicmFyeShzZikgICAgICAgICAgICAjIGZvciB3b3JraW5nIHdpdGggc3BhdGlhbCBkYXRhDQpsaWJyYXJ5KGdndGhlbWVzKSAgICAgICMgZm9yIG1vcmUgdGhlbWVzIChpbmNsdWRpbmcgdGhlbWVfbWFwKCkpDQpsaWJyYXJ5KHBsb3RseSkgICAgICAgICMgZm9yIHRoZSBnZ3Bsb3RseSgpIC0gYmFzaWMgaW50ZXJhY3Rpdml0eQ0KbGlicmFyeShnZ2FuaW1hdGUpICAgICAjIGZvciBhZGRpbmcgYW5pbWF0aW9uIGxheWVycyB0byBnZ3Bsb3RzDQpsaWJyYXJ5KHRyYW5zZm9ybXIpICAgICMgZm9yICJ0d2VlbmluZyIgKGdnYW5pbWF0ZSkNCmxpYnJhcnkoZ2lmc2tpKSAgICAgICAgIyBuZWVkIHRoZSBsaWJyYXJ5IGZvciBjcmVhdGluZyBnaWZzIGJ1dCBkb24ndCBuZWVkIHRvIGxvYWQgZWFjaCB0aW1lDQpsaWJyYXJ5KGdnaW1hZ2UpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZ2VvZmFjZXQpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmBgYA0KDQoNCiMjIyMgQnJlaWYgSW50cm8gdG8gdGhlIGRhdGFzZXRzDQpgYGB7cixlY2hvPVRSVUUscmVzdWx0cyA9IEZBTFNFfQ0KI0NvdmlkMTkgY2FzZXMgRGF0YXNldCBmcm9tIE5ldyBZb3JrIFRpbWVzLCB1cGRhdGUgZXZlcnlkYXkNCmNvdmlkMTkgPC0gcmVhZF9jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ueXRpbWVzL2NvdmlkLTE5LWRhdGEvbWFzdGVyL3VzLXN0YXRlcy5jc3YiKQ0KDQojUG9wdWxhdGlvbiBkYXRhIGZyb20gY2Vuc3VzIDIwMTgNCnBvcHVsYXRpb24gPC0gcmVhZF9jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9DT1ZJRDE5VHJhY2tpbmcvYXNzb2NpYXRlZC1kYXRhL21hc3Rlci91c19jZW5zdXNfZGF0YS91c19jZW5zdXNfMjAxOF9wb3B1bGF0aW9uX2VzdGltYXRlc19zdGF0ZXNfYWdlZ3JvdXBzLmNzdiIpDQoNCiNBdmVyYWdlIFRlbXBlcmF0dXJlIGJ5IHN0YXRlIDIwMjEsIGZyb20gd29ybGRwb3B1bGF0aW9ucmV2aWV3LmNvbQ0KdGVtcCA8LSByZWFkX2NzdigiY3N2RGF0YS5jc3YiKQ0KDQojTW9udGhseSBBdmVyYWdlIFRlbXBlcmF0dXJlIGZvciBmaXZlIHN0YXRlcywgY29sbGVjdGVkIGZyb20gcnNzV2VhdGhlci5jb20NCnN0YXRldGVtcCA8LSByZWFkX2NzdigidGVtcGVyYXR1cmUuY3N2IikNCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpzdGF0ZSA8LSBkYXRhLmZyYW1lKCJzdGF0ZSI9c3RhdGUubmFtZSwgInJlZ2lvbiI9c3RhdGUucmVnaW9uLCAibGF0IiA9IHN0YXRlLmNlbnRlciR5KQ0Kc3RhdGVzX21hcCA8LSBtYXBfZGF0YSgic3RhdGUiKQ0KDQpwb3B1bGF0aW9uIDwtIHBvcHVsYXRpb24gJT4lIA0KICBncm91cF9ieShzdGF0ZV9uYW1lKSAlPiUgDQogIHN1bW1hcmlzZShwb3B1bGF0aW9uID0gc3VtKHBvcHVsYXRpb24pLC5ncm91cHMgPSAiZHJvcCIpDQoNCm5ldyA8LSBjb3ZpZDE5ICU+JSANCiAgbGVmdF9qb2luKHBvcHVsYXRpb24sIGJ5ID0gYygic3RhdGUiPSJzdGF0ZV9uYW1lIikpICU+JSAjIGFkZCBwb3B1bGF0aW9uDQogIGZpbHRlcihzdGF0ZSAhPSAiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLCBzdGF0ZSAhPSAiR3VhbSIsIHN0YXRlICE9ICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLCBzdGF0ZSAhPSJQdWVydG8gUmljbyIpICU+JQ0KICBmaWx0ZXIoc3RhdGUgIT0gIlZpcmdpbiBJc2xhbmRzIikgJT4lIA0KICBsZWZ0X2pvaW4odGVtcCxieT1jKCJzdGF0ZSI9IlN0YXRlIikpICU+JSAjIGFkZCB5ZWFybHkgdGVtcGVyYXR1cmUNCiAgbGVmdF9qb2luKHN0YXRlLCBieSA9IGMoInN0YXRlIiA9ICJzdGF0ZSIpKSAlPiUgICMgYWRkIHN0YXRlIHJlZ2lvbiBhbmQgbGF0aXR1ZGUNCiAgbXV0YXRlKHBjdF9jYXNlcyA9IChjYXNlcy9wb3B1bGF0aW9uKSoxMDAwLCAjIGNhc2VzIHBlciAxMDAwIHBlb3BsZSBpbiBlYWNoIHN0YXRlDQogICAgICAgICBkZWF0aF9yYXRlID0gZGVhdGhzL2Nhc2VzLA0KICAgICAgICAgY29sZCA9IGlmZWxzZShsYXQgPj0gNDAsICJDb2xkIiwiV2FybSIpKSAgIyBkZWF0aHMgcmF0ZQ0KDQptb250aGx5ZGF0YSA8LSBuZXcgJT4lIA0KICBtdXRhdGUoZGF5ID0gZGF5KGRhdGUpLCBtb250aD1tb250aChkYXRlKSx5ZWFyPSB5ZWFyKGRhdGUpKSAlPiUgDQogIGZpbHRlcigoZGF5ID09IDI4ICYgbW9udGg9PTIpfChkYXkgPT0gMzAgJiBtb250aCAhPTIpKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIG11dGF0ZShsYXN0bSA9IGxhZyhjYXNlcywgbj0xTCwgZGVmYXVsdCA9IDAsIG9yZGVyX2J5ID0gZGF0ZSksDQogICAgICAgICBuZXdjYXNlID0gY2FzZXMtbGFzdG0sDQogICAgICAgICBuZXdjX3JhdGUgPSBuZXdjYXNlL2xhc3RtKSANCmBgYA0KDQoNCiMjIyMgT3ZlcnZpZXcgb2YgQ292aWQxOSBpbiBlYWNoIHN0YXRlIGluIHRoZSBVbml0ZWQgU3RhdGVzDQoNClRoaXMgZ3JhcGggaXMgY29sb3JlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY3VtdWxhdGl2ZSBjYXNlcyBpbiBlYWNoIHN0YXRlLiBQbGFjZSB0aGUgbW91c2Ugb24gZWFjaCBzdGF0ZSwgYW5kIHlvdSBjYW4gc2VlIHRoZSBudW1iZXIgb2YgY2FzZXMgcGVyIDEsMDAwIHBlb3BsZSBpbiB0aGlzIHN0YXRlLCB0aGUgZWFybGllc3QgY2FzZSBvY2N1cnJlbmNlIHRpbWUgaW4gdGhlIHN0YXRlLCBhbmQgdGhlIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgaW4gdGhpcyBzdGF0ZS4NCmBgYHtyfQ0Kb3ZlcmFsbCA8LSBuZXcgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBtdXRhdGUoZmlyc3RfY2FzZSA9IG1pbihkYXRlKSwNCiAgICAgICAgIHN0YXRlbmFtZSA9IHRvbG93ZXIoc3RhdGUpLA0KICAgICAgICAgY2FzZXNfcGVyXzEwMDBfcGVvcGxlID0gcGN0X2Nhc2VzKSAlPiUgDQogIGZpbHRlcihkYXRlID09IG1heChkYXRlKSkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fbWFwKG1hcCA9IHN0YXRlc19tYXAsDQogICAgICAgICAgIGFlcyhtYXBfaWQgPSBzdGF0ZW5hbWUsZmlsbCA9IGNhc2VzX3Blcl8xMDAwX3Blb3BsZSwNCiAgICAgICAgICAgICAgIGFscGhhID0gZmlyc3RfY2FzZSxjb2xvdXIgPSBBdmVyYWdlVGVtcGVyYXR1cmUpKSArDQogIGV4cGFuZF9saW1pdHMoeCA9IHN0YXRlc19tYXAkbG9uZywgeSA9IHN0YXRlc19tYXAkbGF0KSArDQogIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICIjZmZmZmZmIixoaWdoPSIjZmZmZmZmIikrDQogIHNjYWxlX2FscGhhKHJhbmdlID0gYygxLDEpKSsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoKSsNCiAgdGhlbWVfbWFwKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KZ2dwbG90bHkob3ZlcmFsbCx0b29sdGlwID0gYygibWFwX2lkIiwiYWxwaGEiLCJmaWxsIiwiY29sb3VyIikpDQpgYGANCiAgDQoNCiMjIENvbXBhcmUgQ292aWQxOSBDYXNlcyBpbiBTdGF0ZXMgd2l0aCBEaWZmZXJlbnQgQXZlcmFnZSBUZW1wZXJhdHVyZQ0KDQpgYGB7cixmaWcud2lkdGg9NyxmaWcuaGVpZ2h0PTQsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KcGxvdF8yIDwtIG5ldyAlPiUgDQogIGZpbHRlcihkYXRlID09IG1heChkYXRlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBBdmVyYWdlVGVtcGVyYXR1cmUsIHkgPSBwY3RfY2FzZXMsY29sb3I9cmVnaW9uKSkrDQogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh0ZXh0ID0gc3RhdGUpLCBzaXplID0gMS41KSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNDQzZGNkYiLCIjRTZBNEE0IiwiIzlGMkMyQyIsIiNCMzRBNEEiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSAieSB+IHBvbHkoeCwyKSIsc2UgPSBGQUxTRSxjb2xvcj0iZ3JleSIsbGluZXR5cGUgPSAiZGFzaGVkIikrDQogIHRoZW1lX3RyYW5zcGFyZW50KCkrDQogIGxhYnModGl0bGUgPSAiU2NhdHRlciBQbG90IG9mIENhc2VzIGFuZCBBdmcgVGVtcGVyYXR1cmUgb2YgYWxsIHN0YXRlcyIseD0iQXZlcmFnZSBUZW1wZXJhdHVyZcKwRiIseT0iQ2FzZXMgcGVyIDEwMDAgcGVvcGxlIikrDQogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM5RjJDMkMiKSkrDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI0VGRkFGRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0wLjUsIGxpbmV0eXBlPSJub25lIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLGhqdXN0ID0gMCxjb2xvciA9ICIjMDA2YmIzIikpDQoNCmdncGxvdGx5KHBsb3RfMix0b29sdGlwID0gYygidGV4dCIsIngiLCJ5IiwiY29sb3VyIikpDQpgYGANClRoaXMgaXMgYSBzY2F0dGVyIFBsb3Qgb2YgQ2FzZXMgYW5kIEF2ZXJhZ2UgVGVtcGVyYXR1cmUgb2YgYWxsIHN0YXRlcywgd2hpbGUgdGhlIGRhdGEgcG9pbnRzIGFyZSBjb2xvcmVkIGFjY29yZGluZyB0byB0aGUgcmVnaW9uIG9mIGVhY2ggc3RhdGUuIEFsdGhvdWdoIGl0IGlzIG5vdCBvYnZpb3VzLCBpdCBjYW4gYmUgc2VlbiB0aGF0IHRoZXJlIGFyZSByZWxhdGl2ZWx5IG1vcmUgY2FzZXMgcGVyIHRob3VzYW5kIHBlb3BsZSBpbiBzb21lIHN0YXRlcyB3aGVyZSB0aGUgdGVtcGVyYXR1cmUgaXMgYmV0d2VlbiA0MC02MCBkZWdyZWVzLiBUaGUgc21vb3RoIGN1cnZlIGluIHRoZSBmaWd1cmUgYWxzbyBzaG93cyB0aGF0IHRoZSBwZWFrIGFwcGVhcnMgYXQgYWJvdXQgNTUgZGVncmVlcy4NCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsYXN0ZXN0IDwtIG5ldyAlPiUgDQogIGZpbHRlcihkYXRlID09IG1heChkYXRlKSkgJT4lIA0KICBmaWx0ZXIoYXMubnVtZXJpYyhmaXBzKSA9PSAyfGFzLm51bWVyaWMoZmlwcykgPT0gOXxmaXBzID09IDE2fGZpcHM9PTIyfCBmaXBzID09IDI3fA0KICAgICAgICAgZmlwcz09MzB8ZmlwcyA9PSAzN3xmaXBzPT00NHxmaXBzID09IDUxfCBmaXBzPT01NSkNCg0KcGxvdF8zIDwtIGdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGE9bGFzdGVzdCxhZXMoeCA9IHN0YXRlLHkgPSBBdmVyYWdlVGVtcGVyYXR1cmUsZ3JvdXA9MSksDQogICAgICAgICAgICAgY29sb3IgPSAiIzNGNDM0NSIpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBsYXN0ZXN0LCBhZXMoeCA9IHN0YXRlLCB5ID0gcGN0X2Nhc2VzLGdyb3VwPTEpLA0KICAgICAgICAgICAgIGNvbG9yID0gIiNiYjMwMDYiKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBsYXN0ZXN0LCANCiAgICAgICAgICAgIGFlcyh4ID0gc3RhdGUsIHkgPSBBdmVyYWdlVGVtcGVyYXR1cmUsIGdyb3VwPTEpLCANCiAgICAgICAgICAgIGNvbG9yID0gIiMzRjQzNDUiLCBzaXplID0gMC41KSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBsYXN0ZXN0LCANCiAgICAgICAgICAgIGFlcyh4ID0gc3RhdGUsIHkgPSBwY3RfY2FzZXMsZ3JvdXA9MSksDQogICAgICAgICAgICBjb2xvciA9ICIjYmIzMDA2Iiwgc2l6ZSA9IDAuNSkrDQogIGdlb21fdGV4dChhZXMoeCA9IDIsIHkgPSAxMTgsIGxhYmVsID0gIkNhc2VzIHBlciAxMDAwIHBlb3BsZSIpLGNvbG9yID0gIiNiYjMwMDYiLHNpemUgPSAzLCBjaGVja19vdmVybGFwID0gVFJVRSkrDQogIGdlb21fdGV4dChhZXMoeCA9IDksIHkgPSA2MiwgbGFiZWwgPSAiQXZlcmFnZSBUZW1wZXJhdHVyZcKwRiIpLGNvbG9yID0gIiMzRjQzNDUiLHNpemUgPSAzLCBjaGVja19vdmVybGFwID0gVFJVRSkrDQogIHRoZW1lX3RyYW5zcGFyZW50KCkrDQogIGxhYnModGl0bGUgPSAiQ2FzZXMgYW5kIEF2ZXJhZ2UgVGVtcGVyYXR1cmUgb2YgMTAgcmFuZG9tbHkgc2VsZWN0ZWQgU3RhdGVzIix4PSIiLHk9IiIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQwLCB2anVzdD0xLjEsIGhqdXN0PTEuMywgc2l6ZSA9IDEwKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsaGp1c3QgPSAwLGNvbG9yID0gIiMwMDZiYjMiKSwNCiAgICAgICAgYXhpcy50aXRsZS54LmJvdHRvbSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55LmxlZnQgPSBlbGVtZW50X2JsYW5rKCkpDQoNCnBsb3QgPC0gZ2dwbG90bHkocGxvdF8zKQ0KYGBgDQojIyMjIENhc2VzIGFuZCBBdmVyYWdlIFRlbXBlcmF0dXJlIG9mIDEwIHJhbmRvbWx5IHNlbGVjdGVkIFN0YXRlcw0KYGBge3IsZmlnLndpZHRoPTcsZmlnLmhlaWdodD00LGVjaG89RkFMU0V9DQpwbG90DQpgYGANClRoaXMgZ3JhcGggY29udGFpbnMgdGhlIG51bWJlciBvZiBjYXNlcyBwZXIgdGhvdXNhbmQgcGVvcGxlIGFuZCBhdmVyYWdlIHRlbXBlcmF0dXJlIGluIDEwIHJhbmRvbWx5IHNlbGVjdGVkIHN0YXRlcy4NCg0KVGhlIGFib3ZlIHR3byBmaWd1cmVzIGNvbXBhcmUgdGhlIG51bWJlciBvZiBjYXNlcyBhbmQgYXZlcmFnZSB0ZW1wZXJhdHVyZSBpbiBkaWZmZXJlbnQgc3RhdGVzLCBidXQgdGhleSBkbyBub3QgcHJvdmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRlbXBlcmF0dXJlIGFuZCB0aGUgc3ByZWFkIG9mIENvdmlkMTkuIEJlY2F1c2UgdGhlIG51bWJlciBvZiBjYXNlcyBpbiBhIHN0YXRlIGlzIHJlbGF0ZWQgdG8gbWFueSBvdGhlciBmYWN0b3JzLCBpbmNsdWRpbmcgcG9wdWxhdGlvbiBkZW5zaXR5LCBlY29ub21pYyBsZXZlbCwgbWVkaWNhbCBsZXZlbCwgdGhlIG51bWJlciBvZiBwZW9wbGUgdW5kZXJnb2luZyBDb3ZpZDE5IHRlc3RpbmcsIGV0Yy4sIGl0IGlzIGRpZmZpY3VsdCB0byBhY2N1cmF0ZWx5IGFuYWx5emUgdGhlIHRlbXBlcmF0dXJlIGFuZCB0aGUgc3ByZWFkIG9mIENvdmlkMTkgd2hlbiB0aGVyZSBpcyBubyB3YXkgdG8gY29udHJvbCB0aGUgaW50ZXJmZXJlbmNlIHZhcmlhYmxlcy4gUmVsYXRpb25zaGlwIGJldHdlZW4uDQoNCg0KDQojIyBDb21wYXJlIHRoZSBHcm93dGggUmF0ZSBvZiBDb3ZpZDE5IENhc2VzIGluIHRoZSBTYW1lIEFyZWEgYXQgRGlmZmVyZW50IFRlbXBlcmF0dXJlDQoNCg0KYGBge3IsZmlnLndpZHRoPTgsZmlnLmhlaWdodD02LGV2YWwgPUZBTFNFLGVjaG89RkFMU0V9DQp0b3RhbF9jYXNlcyA8LSBuZXcgJT4lIA0KICBncm91cF9ieShkYXRlKSAlPiUgDQogIHN1bW1hcml6ZShjYXNlcyA9IHN1bShjYXNlcykvMTAwMCxkZWF0aCA9IHN1bShkZWF0aHMpLzEwMDApDQoNCmNhc2VzX2FuaW0gPC0gZ2dwbG90KCkrDQogIGdlb21fbGluZShkYXRhID0gdG90YWxfY2FzZXMsIGFlcyh4PWRhdGUseT1jYXNlcyksY29sb3IgPSAiIzlGMkMyQyIsIHNpemUgPSAxKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSB0b3RhbF9jYXNlcywgYWVzKHg9ZGF0ZSx5PWRlYXRoKjIwKSxjb2xvciA9ICIjM0Y0MzQ1Iiwgc2l6ZSA9IDEpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBkYXRlKCIyMDIwLTExLTEiKSxsaW5ldHlwZSA9ICJkb3R0ZWQiKSsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gZGF0ZSgiMjAyMS0yLTI4IiksbGluZXR5cGUgPSAiZG90dGVkIikrDQogIGdlb21fdGV4dChhZXMoeD1kYXRlKCIyMDIwLTExLTQiKSwgbGFiZWw9Ik5vdiAyMDIwIiwgeT0zNTAwMCksIGNvbG91cj0iIzNGNDM0NSIsIGFuZ2xlPTAsIHNpemUgPSA0KSsNCiAgZ2VvbV90ZXh0KGFlcyh4PWRhdGUoIjIwMjEtMy04IiksIGxhYmVsPSJGZWIgMjAyMSIsIHk9MzUwMDApLCBjb2xvdXI9IiMzRjQzNDUiLCBhbmdsZT0wLCBzaXplID0gNCkrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlRvdGFsIGNhc2VzICh0aG91c2FuZHMpIiwNCiAgICAgICAgICAgICAgICAgICAgIHNlYy5heGlzID0gc2VjX2F4aXMofi4vMjAsIG5hbWUgPSAiVG90YWwgZGVhdGhzICh0aG91c2FuZHMpIikpKw0KICB0aGVtZV90cmFuc3BhcmVudCgpKw0KICBsYWJzKHRpdGxlID0gIlRvdGFsIENvdmlkIDE5IENhc2VzIGluIFVTQSBvdmVyIHRpbWUiLCBzdWJ0aXRsZSA9ICJEYXRlOiB7ZnJhbWVfYWxvbmd9IikrDQogIHRoZW1lKGF4aXMudGl0bGUueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM5RjJDMkMiLHNpemUgPSAxMiksDQogICAgICAgIGF4aXMudGl0bGUueS5yaWdodCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjM0Y0MzQ1IixzaXplID0gMTIpLA0KICAgICAgICBheGlzLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM5RjJDMkMiLHNpemUgPSA4KSwNCiAgICAgICAgYXhpcy50ZXh0LnkucmlnaHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzNGNDM0NSIsc2l6ZSA9IDgpLA0KICAgICAgICBheGlzLnRpdGxlLnguYm90dG9tID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiMwMDZiYjMiKSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDA2YmIzIikpKw0KICB0cmFuc2l0aW9uX3JldmVhbChkYXRlKQ0KDQphbmltX3NhdmUoImNhc2VzLmdpZiIsY2FzZXNfYW5pbSkNCmBgYA0KDQpgYGB7cixmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTZ9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiY2FzZXMuZ2lmIikNCmBgYA0KDQpUaGlzIGFuaW1hdGlvbiBzaG93cyB0b3RhbCBDb3ZpZCAxOSBjYXNlcyBhbmQgZGVhdGhzIGluIFVTIG92ZXIgdGltZSwgd2hpbGUgdGhlIHJlZCBsaW5lIHJlcHJlc2VudCB0b3RhbCBjYXNlcyBhbmQgYmxhY2sgbGluZSByZXByZXNlbnQgZGVhdGhzLiBUaGUgc2NhbGVzIG9mIHRoZSB0d28gbGluZXMgYXJlIGRpZmZlcmVudCwgYnV0IHRoZXkgaGF2ZSBzYW1lIHVuaXQ6IHRob3VzYW5kIHBlb3BsZS4gDQoNCkZyb20gdGhlIHBsb3QsIHdlIGNhbiBjbGVhcmx5IGZpbmQgdGhhdCBiZXR3ZWVuIE5vdmVtYmVyIDIwMjAgYW5kIEZlYnJ1YXJ5IDIwMjEsIHRoZSBzbG9wZSBvZiB0aGUgY3VydmUgb2YgdGhlIG51bWJlciBvZiBjYXNlcyBhbmQgdGhlIG51bWJlciBvZiBkZWF0aHMgaXMgdmVyeSBsYXJnZS4gVGhpcyBtZWFucyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgaGFzIGdyb3duIHJhcGlkbHkuIFRoaXMgaXMgaW4gbGluZSB3aXRoIHRoZSBsYXcgdGhhdCBDb3ZpZDE5IHZpcnVzIHNwcmVhZHMgZmFzdGVyIHdoZW4gdGhlIHRlbXBlcmF0dXJlIGlzIGxvd2VyLg0KDQoNCg0KYGBge3IsZmlnLndpZHRoPTYsZmlnLmhlaWdodD00fQ0KcmVnaW9uX21vbnRobHkgPC0gbW9udGhseWRhdGEgJT4lIA0KICBncm91cF9ieShyZWdpb24sZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoY2FzZXMgPSBzdW0oY2FzZXMpLCBkZWF0aCA9IHN1bShkZWF0aHMpLC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKGRheSA9IGRheShkYXRlKSwgbW9udGg9bW9udGgoZGF0ZSkseWVhciA9IHllYXIoZGF0ZSkpICU+JSANCiAgZmlsdGVyKChkYXkgPT0gMjggJiBtb250aD09Mil8KGRheSA9PSAzMCAmIG1vbnRoICE9MikpICU+JSANCiAgZ3JvdXBfYnkocmVnaW9uKSAlPiUgDQogIG11dGF0ZShsYXN0bSA9IGxhZyhjYXNlcywgbj0xTCwgZGVmYXVsdCA9IDAsIG9yZGVyX2J5ID0gZGF0ZSksDQogICAgICAgICBuZXdjYXNlID0gY2FzZXMtbGFzdG0sDQogICAgICAgICBjYXNlX2dyb3d0aF9yYXRlID0gbmV3Y2FzZS9sYXN0bSkgJT4lIA0KICBmaWx0ZXIoKG1vbnRoID49IDYgJiB5ZWFyID09IDIwMjApfHllYXIgPT0gMjAyMSApDQoNCnBsb3RfNSA8LSByZWdpb25fbW9udGhseSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjYXNlX2dyb3d0aF9yYXRlLGNvbG9yID0gcmVnaW9uKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgZ2VvbV9saW5lKCkrDQogIHRoZW1lX3RyYW5zcGFyZW50KCkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjQ0M2RjZGIiwiI0U2QTRBNCIsIiM5RjJDMkMiLCIjQjM0QTRBIikpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oYikgeyBwYXN0ZTAocm91bmQoYiAqIDEwMCwgMCksICIlIil9KSsNCiAgbGFicyh0aXRsZSA9ICJNb250aGx5IGdyb3d0aCByYXRlIG9mIGNhc2VzIGluIGZvdXIgcmVnaW9uIG9mIFVTIix4PSIiLHk9Ikdyb3d0aCByYXRlIG9mIGNhc2VzIikrDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI0VGRkFGRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0wLjUsIGxpbmV0eXBlPSJub25lIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLGhqdXN0ID0gMCxjb2xvciA9ICIjMDA2YmIzIikpDQoNCmdncGxvdGx5KHBsb3RfNSkNCmBgYA0KDQpCeSBjYWxjdWxhdGluZyB0aGUgcmF0aW8gb2YgdGhlIG51bWJlciBvZiBuZXcgY2FzZXMgZWFjaCBtb250aCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGNhc2VzIGF0IHRoYXQgdGltZSwgd2UgY2FuIGdldCB0aGUgZ3Jvd3RoIHJhdGUuIFRoaXMgcGxvdCBzaG93cyB0aGUgY2hhbmdlIG9mIG1vbnRobHkgZ3J3b3RoIHJhdGUgb2YgQ292aWQxOSBvdmVyIHRpbWUuDQoNCkFzIHNob3duIGluIHRoZSBncmFwaCwgYmVmb3JlIE9jdG9iZXIgMjAyMCwgdGhlIGdyb3d0aCByYXRlIG9mIGNhc2VzIGdyYWR1YWxseSBzbG93ZWQgZG93biwgYnV0IGFmdGVyIE5vdmVtYmVyLCB0aGUgZ3Jvd3RoIHJhdGUgb2YgY2FzZXMgc3VkZGVubHkgaW5jcmVhc2VkLCB1bnRpbCBpdCBzdG9wcGVkIGFyb3VuZCBKYW51YXJ5IGFuZCBiZWdhbiB0byByZWR1Y2UuDQoNCg0KIyMjIEFuYWx5emUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvdmlkMTkgc3ByZWFkIGFuZCB0ZW1wZXJhdHVyZSBpbiBzZWxlY3RlZCBzdGF0ZXMNCg0KSW4gb3JkZXIgdG8gc2VlIG1vcmUgY2xlYXJseSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGNoYW5nZSBpbiBjYXNlIGdyb3d0aCByYXRlIGFuZCB0ZW1wZXJhdHVyZSBjaGFuZ2UsIHdlIHNlbGVjdGVkIHNpeCBzdGF0ZXMgdG8gY29uZHVjdCBhIG1vcmUgZGV0YWlsZWQgYW5hbHlzaXMgb24gdGhlbS4gR2VvZ3JhcGhpY2FsbHksIHRoZXNlIHNpeCBzdGF0ZXMgaW5jbHVkZSBzb3V0aGVybiwgbm9ydGhlcm4sIGNlbnRyYWwsIGFuZCBjb2FzdGFsIGFyZWFzLg0KDQpgYGB7cn0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KbmV3ICU+JSANCiAgZmlsdGVyKGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUgDQogIGZpbHRlcihzdGF0ZSA9PSJNaW5uZXNvdGEifHN0YXRlID09ICJXYXNoaW5ndG9uInxzdGF0ZSA9PSAiR2VvcmdpYSJ8c3RhdGUgPT0gIk1haW5lInxzdGF0ZSA9PSAiQ2FsaWZvcm5pYSJ8c3RhdGUgPT0gIkNvbG9yYWRvIikgJT4lDQogIHNlbGVjdChzdGF0ZSwgcG9wdWxhdGlvbiwgcmVnaW9uLCBBdmVyYWdlVGVtcGVyYXR1cmUsIGNhc2VzKQ0KYGBgDQoNCg0KYGBge3IsZmlnLndpZHRoPTgsZmlnLmhlaWdodD02fQ0KYSA8LSBtb250aGx5ZGF0YSAlPiUgDQogIGZpbHRlcihzdGF0ZSA9PSJNaW5uZXNvdGEifHN0YXRlID09ICJXYXNoaW5ndG9uInxzdGF0ZSA9PSAiR2VvcmdpYSJ8c3RhdGUgPT0gIk1haW5lInxzdGF0ZSA9PSAiQ2FsaWZvcm5pYSJ8c3RhdGUgPT0gIkNvbG9yYWRvIikgJT4lIA0KICBtdXRhdGUobW9uID0gbW9udGguYWJiW21vbnRoXSklPiUgDQogIGxlZnRfam9pbihzdGF0ZXRlbXAsIGJ5ID0gYygic3RhdGUiPSJzdGF0ZSIsIm1vbiI9Ik1vbnRoIikpICU+JSANCiAgZmlsdGVyKChtb250aCA+PSA2ICYgeWVhciA9PSAyMDIwKXx5ZWFyID09IDIwMjEpICU+JSANCiAgbXV0YXRlKEF2ZVRlbXAgPSAoTG93K0hpZ2gpLzIpDQoNCmdncGxvdCgpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBhLCBhZXMoeCA9IGRhdGUsIHkgPSAtQXZlVGVtcCs2MCwgZ3JvdXAgPSBzdGF0ZSksDQogICAgICAgICAgICAgY29sb3IgPSAiIzNGNDM0NSIsc2l6ZT0wLjQpKw0KICBnZW9tX3BvaW50KGRhdGEgPSBhLCBhZXMoeCA9IGRhdGUsIHkgPSBuZXdjX3JhdGUqNTAsIGdyb3VwID0gc3RhdGUpLA0KICAgICAgICAgICAgIGNvbG9yID0gIiNiYjMwMDYiLHNpemU9MC40KSsNCiAgc3RhdF9zbW9vdGgoZGF0YSA9IGEsIGFlcyh4ID0gZGF0ZSwgeSA9IC1BdmVUZW1wKzYwLCBncm91cCA9IHN0YXRlKSxjb2xvciA9ICIjOEY4RjhGIixzaXplPTEsc2UgPSBGQUxTRSxtZXRob2QgPSAnbG9lc3MnLGZvcm11bGE9J3kgfiB4JykrDQogIHN0YXRfc21vb3RoKGRhdGEgPSBhLCBhZXMoeCA9IGRhdGUsIHkgPSBuZXdjX3JhdGUqNTAsIGdyb3VwID0gc3RhdGUpLGNvbG9yID0gIiM5RjJDMkMiLHNpemU9MSxzZSA9IEZBTFNFLG1ldGhvZCA9ICdsb2VzcycsZm9ybXVsYT0neSB+IHgnKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiVGVtcGVyYXR1cmXCsEYiLCBsYWJlbHMgPSBmdW5jdGlvbihhKXs2MC1hfSwNCiAgICAgICAgICAgICAgICAgICAgIHNlYy5heGlzID0gc2VjX2F4aXMofi4vNTAsIG5hbWUgPSAiTmV3IGNhc2VzIGdyb3d0aCByYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZnVuY3Rpb24oYikgeyBwYXN0ZTAocm91bmQoYiAqIDEwMCwgMCksICIlIil9KSkrDQogIHRoZW1lX3RyYW5zcGFyZW50KCkrDQogIHRoZW1lKGF4aXMudGV4dC55LmxlZnQgPSBlbGVtZW50X3RleHQoY29sb3I9IiMzRjQzNDUiKSwNCiAgICAgICAgYXhpcy50ZXh0LnkucmlnaHQgPSBlbGVtZW50X3RleHQoY29sb3I9IiM5RjJDMkMiKSwNCiAgICAgICAgYXhpcy50aXRsZS55LmxlZnQgPSBlbGVtZW50X3RleHQoY29sb3I9IiMzRjQzNDUiKSwNCiAgICAgICAgYXhpcy50aXRsZS55LnJpZ2h0ID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjOUYyQzJDIiksDQogICAgICAgIGF4aXMudGV4dC54LmJvdHRvbSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwKSkrDQogIGZhY2V0X3dyYXAofnN0YXRlLHNjYWxlcyA9ICJmcmVlIikrDQogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzUyOTVCQSIsc2l6ZT0xMixmYWNlID0gIml0YWxpYyIpKSsNCiAgbGFicyh0aXRsZSA9ICJDaGFuZ2Ugb2YgdGVtcGVyYXR1cmUgYW5kIGNhc2VzIGdyb3d0aCByYXRlIG92ZXIgdGltZSIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCxoanVzdCA9IDAsY29sb3IgPSAiIzAwNmJiMyIpKQ0KDQpgYGANCg0KVGhpcyBwbG90IHNob3dzIHRoZSBtb250aGx5IGNoYW5nZSBvZiBjYXNlIGdyb3d0aCByYXRlIGFuZCBhdmVyYWdlIHRlbXBlcmF0dXJlIGluIHNpeCBzdGF0ZXMuIFRoZSByZWQgbGluZSByZXByZXNlbnQgZ3Jvd3RoIHJhdGUgb2YgY2FzZXMgbWVhc3VyZWQgaW4gcGVyY2VudGFnZS4gVGhlIGRhcmsgZ3JleSBsaW5lIHJlcHJlc2VudCB0aGUgYXZlcmFnZSB0ZW1wZXJhdHVyZSBmcm9tIDYwwrBGIHRvIDEwwrBGLiANCg0KV2UgY2FuIGNsZWFybHkgc2VlIGZyb20gdGhlIGZpZ3VyZSB0aGF0IHRoZSB0ZW1wZXJhdHVyZSByZWR1Y3Rpb24gY3VydmUgYW5kIHRoZSBjYXNlIGdyb3d0aCBjdXJ2ZSByZWFjaCB0aGVpciBwZWFrcyBhdCBzaW1pbGFyIHRpbWUgcGVyaW9kcywgd2hpY2ggc2hvd3MgdGhhdCB0aGUgc3ByZWFkIGJldHdlZW4gdGVtcGVyYXR1cmUgYW5kIENvdmlkMTkgaGFzIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwLg0KDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NixmaWcud2lkdGg9Nyx3YXJuaW5nPUZBTFNFfQ0KZnVuX21lYW4gPC0gZnVuY3Rpb24oeCl7DQogIHJldHVybihkYXRhLmZyYW1lKHk9bWVhbih4KSxsYWJlbD1tZWFuKHgsbmEucm09VCkpKX0NCg0KYSAlPiUgDQogIG11dGF0ZShvcHRpbWFsX3RlbXAgPSBpZmVsc2UoQXZlVGVtcDw1NyZBdmVUZW1wPjQxLCJZZXMiLCJObyIpLA0KICAgICAgICAgcGN0X25ld2Nhc2UgPSBuZXdjYXNlL3BvcHVsYXRpb24qMTAwMCkgJT4lIA0KICBtdXRhdGUoc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSxsYXQsLmZ1bj1tYXgpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHN0YXRlLHk9cGN0X25ld2Nhc2UsZmlsbD1vcHRpbWFsX3RlbXApKSsNCiAgZ2VvbV9ib3hwbG90KHZhcndpZHRoID0gVFJVRSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM5N0MzREMiLCIjQzk3QTZEIiksbmFtZSA9ICIgIE9wdGltYWwgXG4gVGVtcGVyYXR1cmUiKSsNCiAgdGhlbWVfdHJhbnNwYXJlbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IG9mIG1vbnRobHkgbmV3IGNhc2VzIGluIDUgc3RhdGVzIiwgeD0iIiwgeT0iTW9udGhseSBuZXcgY2FzZXMgcGVyIDEwMDAgcGVvcGxlIikrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI0VGRkFGRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT0wLjUpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSxoanVzdCA9IDAsY29sb3IgPSAiIzAwNmJiMyIpKQ0KYGBgDQoNClRoaXMgaXMgYSBib3hwbG90IG9mIG1vbnRobHkgY2FzZSBncm93dGggcmF0ZSBvZiB0aGlzIHNpeCBzdGF0ZXMuIEFsbCB0aGUgbW9udGhzIHNpbmNlIEp1bmUgMjAyMCBpcyBkaXZpZGVkIGludG8gdHdvIGdyb3VwIGFjY29yZGluZyB0byB0aGVpciBtb250aGx5IGF2ZXJhZ2UgdGVtcGFyZXR1cmUuIE1vbnRocyB0aGF0IGhhdmUgYXZlcmFnZSB0ZW1wZXJhdHVyZSB3aXRoaW4gdGhlIG9wdGltYWwgc3ByZWFkIHRlbXBlcmF0dXJlIG9mIENvdmlkMTkgdmlydXMgYXJlIGNvbG9yIGluIHJlZCwgdGhlIGVsc2UgYXJlIGNvbG9yZWQgaW4gYmx1ZS4gVGhpcyBhbHNvIHNob3dzIHRoYXQgdGVtcGVyYXR1cmUgZG9lcyBoYXZlIGFuIGltcGFjdCBvbiB0aGUgc3ByZWFkIG9mIHRoZSBjb3ZpZDE5IHZpcnVzLg0KDQoNCiMjIENvbmNsdXNpb24NCg0KVG8gc3VtIHVwLCB3aGVuIHdlIGFuYWx5emUgdGhlIGdyb3d0aCByYXRlIG9mIGNhc2VzIGF0IGRpZmZlcmVudCB0ZW1wZXJhdHVyZXModGhlIHJhdGUgb2YgdmlydXMgdHJhbnNtaXNzaW9uKSBpbiB0aGUgc2FtZSBhcmVhLCB3ZSBjYW4gY2xlYXJseSBmaW5kIHRoYXQgdGVtcGVyYXR1cmUgaGFzIGFuIG5lZ2F0aXZlIGltcGFjdCBvbiB0aGUgc3ByZWFkIG9mIENPVklELTE5LiBPbiB0aGUgd2hvbGUsIHdoZW4gdGhlIHRlbXBlcmF0dXJlIGRyb3BzLCB0aGUgdmlydXMgc3ByZWFkcyBmYXN0ZXI7IGJ1dCBpZiB0aGUgdGVtcGVyYXR1cmUgZHJvcHMgbG93ZXIsIHRoZSBpbmNyZWFzZSBpbiBjYXNlcyB3aWxsIHNsb3cgZG93biwgcGVyaGFwcyBiZWNhdXNlIHRoZSBjb2xkIHdlYXRoZXIgbWFrZXMgcGVvcGxlIHVud2lsbGluZyB0byBnbyBvdXQgYW5kIHJlZHVjZXMgdGhlIGNoYW5jZSBvZiBleHBvc3VyZSB0byB0aGUgdmlydXMuIEF1dGhvciByZWFseSBob3BlZCB0aGF0IGJlZm9yZSB0aGUgbmV4dCBjb2xkIHdpbnRlciB3aGljaCBpcyBzdWl0YWJsZSBmb3IgdGhlIHNwcmVhZCBvZiB0aGUgdmlydXMsIHBlb3BsZSBjYW4gZGVmZWF0IENvdmlkLTE5IHdpdGggdGhlIGhlbHAgb2YgdmFjY2luZXMuDQoNCg0KDQo=