2017 Cycling Stats

By Bike

Data were recorded from 1/1/17 to 12/31/17

Bike names were truncated for ease of visualization:
1. Masi FG = Masi Speciale Fixed FG Road
2. Masi LTD = Masi Speciale Fixed LTD FG Road
3. Lang FG = Specialized Langster FG Road
4. Roub EXP = Specialized Roubaix EXPERT Road
5. Tri COMP = Specialized Tricross COMP CX Road
6. Tri EXP = Specialized Tricross EXPERT CX Road
7. Tri SING = Specialized TriCross SINGLE CX Road

90.3% of rides are covered by only 4 bikes.

90.6% of distance is coverd by only 3 bikes.

By Day of the Week

Speed doesn’t vary day to day, but Distance definitely does: longer rides on the weekends, shorter rides on weekdays. Monday has slightly longer rides, likely because Monday is sometimes part of a 3 day weekend.

Over Time

Altitude Gain and Distance


Call:
lm(formula = Altitude.Gain..ft. ~ Distance..miles., data = bikes)

Residuals:
    Min      1Q  Median      3Q     Max 
-656.05 -185.36  -47.61  143.65 1268.33 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -198.335     70.816  -2.801  0.00586 ** 
Distance..miles.   44.786      1.827  24.510  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 325.1 on 133 degrees of freedom
Multiple R-squared:  0.8187,    Adjusted R-squared:  0.8174 
F-statistic: 600.7 on 1 and 133 DF,  p-value: < 2.2e-16

Year-by-year Comparison

Year-by-year Overview

Seems like he’s going on longer rides (the number of rides used to outpace the distance, but that hasn’t been the case over the past 3 years). Let’s see if this is true based on average distance.

Average ride distance was almost identitical over the first 3 years and has definitely decreased in recent years.

Here’s an alternative barplot visualization of Ride Frequency and Distance.

The highest total distance occurred in 2012, while the lowest total distance occurred in 2014. 2017 was about par for the case, with total distance around 4800 miles in 2013, 2015, and 2017.

Altitude gained follows a similar trend to the distance gained. Let’s take a closer look at the highest distance year, lowest distance year, and last year.

He was on an even slower pace than he was in 2014 headed into the summer months, but made up a lot of ground and finished around the average mileage total. The mileage gain in 2012 was consistently paced throughout.

Although 2012 was by far the best year in terms of distance gained, the average speeds were a lot more erratic. Much more consistent riding in 2017.

2016 consisted of much longer rides than any other year (shown by the higher median and longer upper whisker than other years). The individual points show outliers (greater than 1.5*IQR higher than the 75th percentile). The plot shows that the large total distance in 2016 is explained by longer rides, while the large total distance in 2012 is explained by a greater volume of bike rides.

An alternative representation that proves the hypothesis above. The violin plots show the relative density of points. In 2012, there’s a greater density of shorter-distance rides, while in 2016, the density is higher around the median.

Ride Type by Year

An overwhelming majority of the rides are Rolling Road rides over the past 6 years. Last year, no off-road rides were recorded and only one Hills Road ride has been recorded in the past 4 years.

Bike Type

Finally, we’ll look at the bikes used for the road rides over the past 6 years.

The 10 bikes used over the past 6 years are shown in the table below. Values for altitude gain, distance, and speed are average values for each bike.

Bike Rides Alt. Gain (ft) Distance (mi) Speed (mph)
Masi Speciale Fixed FG Road 33 560.3636 20.68303 13.311976
Specialized Langster FG Road 102 923.1275 29.45637 14.854365
Specialized Rockhopper EXPERT 29er 2 441.5000 12.65000 8.899292
Specialized Roubaix EXPERT Road 310 2117.2774 47.41097 15.208614
Specialized Tricross COMP CX Road 241 1274.5643 33.17975 14.394964
Specialized Tricross SPORT CX Road 18 678.6667 16.50889 13.841827
Centurion Super Le Mans FG Road 63 665.6349 20.63762 13.897439
Masi Speciale Fixed LTD FG Road 28 564.6429 19.96429 13.514350
Specialized Tricross EXPERT CX Road 41 1437.4390 35.49049 14.458006
Specialized TriCross SINGLE CX Road 8 346.3750 21.51250 12.514158

Rides by Day

A lot more weekday rides in 2012 and 2017 than there were in other years. Pretty consistent Sunday and Saturday riding, with a couple of years exhibiting more than 52 rides on those days.

As expected, a lot more distance is accumulated on the weekends while weekdays are usually shorter rides.

LS0tDQp0aXRsZTogIjIwMTcgQmlrZSBTdGF0cyINCmF1dGhvcjogIkFsZXggU3RyYW5za3kiDQpkYXRlOiAiSmFudWFyeSAxLCAyMDE4Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMgMjAxNyBDeWNsaW5nIFN0YXRzDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpzZXR3ZCgifi9SIikNCnNvdXJjZSgiZnRlcGxvdHMuUiIpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCnNldHdkKCJ+L1IvZnVuIikNCmJpa2VzIDwtIHJlYWQuY3N2KCJzdHJhbnNreV8yMDE3X2pvdXJuYWwuY3N2IikNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzY2FsZXMpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgQ29udmVydCByaWRlIGRhdGUgdG8gZGF0ZSBmb3JtYXQNCmJpa2VzJFJpZGUuRGF0ZSA8LSBtZHkoYmlrZXMkUmlkZS5EYXRlKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpiaWtlcyA8LSBiaWtlcyAlPiUNCiAgbXV0YXRlKA0KICAgIGhyID0gYXMubnVtZXJpYyhzdHJfc3ViKFJpZGUuVGltZS4uaGgubW0uc3MuLCAxLCAxKSksDQogICAgbWluID0gYXMubnVtZXJpYyhzdHJfc3ViKFJpZGUuVGltZS4uaGgubW0uc3MuLCAzLDQpKSwNCiAgICBzZWMgPSBhcy5udW1lcmljKHN0cl9zdWIoUmlkZS5UaW1lLi5oaC5tbS5zcy4sIDYsNykpDQogICkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KYmlrZXMgPC0gYmlrZXMgJT4lDQogIG11dGF0ZSgNCiAgICBUb3RhbC5UaW1lID0gaHIgKyBtaW4gLyA2MCArIHNlYyAvIDM2MDAsDQogICAgQXZnLlNwZWVkID0gRGlzdGFuY2UuLm1pbGVzLiAvIFRvdGFsLlRpbWUNCiAgKQ0KYGBgDQoNCiMjIyBCeSBCaWtlDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpiaWtlLnR5cGUgPC0gYmlrZXMgJT4lDQogIGdyb3VwX2J5KEJpa2UpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICBBbHRpdHVkZSA9IG1lYW4oQWx0aXR1ZGUuR2Fpbi4uZnQuKSwNCiAgICBEaXN0YW5jZSA9IG1lYW4oRGlzdGFuY2UuLm1pbGVzLiksDQogICAgU3BlZWQgPSBtZWFuKEF2Zy5TcGVlZCkNCiAgKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpiaWtlLnR5cGUkQmlrZVRydW5jID0gYygiTWFzaSBGRyIsICJNYXNpIExURCIsICJMYW5nIEZHIiwgIlJvdWIgRVhQIiwgIlRyaSBDT01QIiwgIlRyaSBFWFAiLCAiVHJpIFNJTkciKQ0KYmlrZS50eXBlJEJpa2VDYXQgPSBjKCJNYXNpIFNwZWNpYWxlIiwgIk1hc2kgU3BlY2lhbGUiLCAiTGFuZ3N0ZXIiLCAiUm91YmFpeCIsICJUcmljcm9zcyIsICJUcmljcm9zcyIsICJUcmljcm9zcyIpDQpgYGANCg0KRGF0YSB3ZXJlIHJlY29yZGVkIGZyb20gMS8xLzE3IHRvIDEyLzMxLzE3DQoNCkJpa2UgbmFtZXMgd2VyZSB0cnVuY2F0ZWQgZm9yIGVhc2Ugb2YgdmlzdWFsaXphdGlvbjogPGJyPg0KMS4gTWFzaSBGRyA9IE1hc2kgU3BlY2lhbGUgRml4ZWQgRkcgUm9hZCA8YnI+DQoyLiBNYXNpIExURCA9IE1hc2kgU3BlY2lhbGUgRml4ZWQgTFREIEZHIFJvYWQgPGJyPg0KMy4gTGFuZyBGRyA9IFNwZWNpYWxpemVkIExhbmdzdGVyIEZHIFJvYWQgPGJyPg0KNC4gUm91YiBFWFAgPSBTcGVjaWFsaXplZCBSb3ViYWl4IEVYUEVSVCBSb2FkIDxicj4NCjUuIFRyaSBDT01QID0gU3BlY2lhbGl6ZWQgVHJpY3Jvc3MgQ09NUCBDWCBSb2FkIDxicj4NCjYuIFRyaSBFWFAgPSBTcGVjaWFsaXplZCBUcmljcm9zcyBFWFBFUlQgQ1ggUm9hZCA8YnI+DQo3LiBUcmkgU0lORyA9IFNwZWNpYWxpemVkIFRyaUNyb3NzIFNJTkdMRSBDWCBSb2FkIDxicj4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChiaWtlLnR5cGUsIGFlcyh4ID0gQmlrZVRydW5jKSkgKw0KICBnZW9tX2JhcihhZXMoeSA9IFNwZWVkLCBmaWxsID0gQmlrZUNhdCksIGNvbG91ciA9ICIjNTM1MzUzIiwgc3RhdCA9ICJpZGVudGl0eSIsIGFscGhhID0gMC44MCkgKw0KICBnZ3RpdGxlKCJCaWtlIFNwZWVkIikgKw0KICBmdGUgKw0KICB4bGFiKCJCaWtlIikgKyB5bGFiKCJBdmVyYWdlIFNwZWVkIChtcGgpIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNiwgYW5nbGUgPSA3NSkpICsNCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ2F0ZWdvcnkiKSkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KYmlrZS50eXBlIDwtIGJpa2UudHlwZSAlPiUNCiAgbXV0YXRlKA0KICAgIFRvdC5BbHQgPSBuICogQWx0aXR1ZGUsDQogICAgVG90LkRpc3QgPSBuICogRGlzdGFuY2UNCiAgKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQojU3Ryb2tlIG1vZGlmaWVzIHRoZSB3aWR0aCBvZiB0aGUgYm9yZGVyDQpnZ3Bsb3QoYmlrZS50eXBlLCBhZXMoeCA9IG4sIHkgPSBUb3QuRGlzdCkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMi41LCBhbHBoYSA9IDAuMywgc3Ryb2tlID0gMS41KSArDQogIGZ0ZSArDQogIGdndGl0bGUoIkJpa2UgRGlzdGFuY2UgYW5kIEZyZXF1ZW5jeSBvZiBVc2UiKSArDQogIHhsYWIoIk51bWJlciBvZiBSaWRlcyIpICsNCiAgeWxhYigiVG90YWwgRGlzdGFuY2UiKSArDQogIGdlb21fdGV4dChsYWJlbCA9IGlmX2Vsc2UoYmlrZS50eXBlJEJpa2VUcnVuYyAlaW4lIGMoIlJvdWIgRVhQIiwgIlRyaSBDT01QIiksIGJpa2UudHlwZSRCaWtlVHJ1bmMsICcgJyksIHNpemUgPSAzLjUsIGNvbG91ciA9ICJjaG9jb2xhdGUxIiwgZm9udGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLjUpICsNCiAgZ2VvbV90ZXh0KGxhYmVsID0gaWZfZWxzZShiaWtlLnR5cGUkQmlrZVRydW5jICVpbiUgYygiVHJpIEVYUCIpLCBiaWtlLnR5cGUkQmlrZVRydW5jLCAnICcpLCBzaXplID0gMy41LCBjb2xvdXIgPSAiY2hvY29sYXRlMSIsIGZvbnRmYWNlID0gImJvbGQiLCBoanVzdCA9IC0wLjEwLCB2anVzdCA9IC0wLjc1KSArDQogIGFubm90YXRlKCJzZWdtZW50IiwgeCA9IDksIHkgPSA1MDAsIHhlbmQgPSA4LCB5ZW5kID0gMjUwLCBzaXplID0gMC43NSwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDAuMiwgImNtIikpLCBjb2xvdXIgPSAiY2hvY29sYXRlMSIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gOS41LCB5ID0gNjAwLCBsYWJlbCA9ICJUcmkgU0lORyIsIGNvbG91ciA9ICJjaG9jb2xhdGUxIiwgZm9udGZhY2UgPSAiYm9sZCIsIHNpemUgPSAzLjUpICsNCiAgZ2VvbV90ZXh0KGxhYmVsID0gaWZfZWxzZShiaWtlLnR5cGUkQmlrZVRydW5jICVpbiUgYygiTWFzaSBMVEQgRkciLCAiTWFzaSBGRyIpLCBiaWtlLnR5cGUkQmlrZVRydW5jLCAnICcpLCBzaXplID0gMy41LCBjb2xvdXIgPSAiY2hvY29sYXRlMSIsIGZvbnRmYWNlID0gImJvbGQiLCBoanVzdCA9IC0wLjA1LCB2anVzdCA9IDEuMikgKw0KICBnZW9tX3RleHQobGFiZWwgPSBpZl9lbHNlKGJpa2UudHlwZSRCaWtlVHJ1bmMgJWluJSBjKCJMYW5nIEZHIiksIGJpa2UudHlwZSRCaWtlVHJ1bmMsICcgJyksIHNpemUgPSAzLjUsIGNvbG91ciA9ICJjaG9jb2xhdGUxIiwgZm9udGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC40MCwgdmp1c3QgPSAtMC44MCkgKw0KICBhbm5vdGF0ZSgic2VnbWVudCIsIHggPSAxMiwgeSA9IDI1LCB4ZW5kID0gOS41LCB5ZW5kID0gMTQwLCBzaXplID0gMC43NSwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDAuMiwgImNtIikpLCBjb2xvdXIgPSAiY2hvY29sYXRlMSIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTUuNSwgeSA9IDI1LCBsYWJlbCA9ICJNYXNpIExURCIsIGNvbG91ciA9ICJjaG9jb2xhdGUxIiwgZm9udGZhY2UgPSAiYm9sZCIsIHNpemUgPSAzLjUpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmJpa2UudHlwZSRSaWRlUGVyYyA8LSBzdHJfYyhyb3VuZCgxMDAgKiBiaWtlLnR5cGUkbiAvIHN1bShiaWtlLnR5cGUkbiksIDEpLCAiJSIsIHNlcCA9ICIiKQ0KcGllKGJpa2UudHlwZSRuLCBsYWJlbHMgPSBiaWtlLnR5cGUkUmlkZVBlcmMsIG1haW4gPSAiUmlkZSBQaWUgQ2hhcnQiLCBjb2wgPSB0b3BvLmNvbG9ycyhsZW5ndGgoYmlrZS50eXBlJG4pKSkNCmxlZ2VuZCgibGVmdCIsIGJpa2UudHlwZSRCaWtlVHJ1bmMsIGNleCA9IDAuOCwgZmlsbCA9IHRvcG8uY29sb3JzKGxlbmd0aChiaWtlLnR5cGUkbikpKQ0KYGBgDQoNCjkwLjMlIG9mIHJpZGVzIGFyZSBjb3ZlcmVkIGJ5IG9ubHkgNCBiaWtlcy4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmJpa2UudHlwZSREaXN0UGVyYyA8LSBzdHJfYyhyb3VuZCgxMDAgKiBiaWtlLnR5cGUkVG90LkRpc3QgLyBzdW0oYmlrZS50eXBlJFRvdC5EaXN0KSwgMSksICIlIiwgc2VwID0gIiIpDQpwaWUoYmlrZS50eXBlJFRvdC5EaXN0LCBsYWJlbHMgPSBiaWtlLnR5cGUkRGlzdFBlcmMsIG1haW4gPSAiRGlzdGFuY2UgUGllIENoYXJ0IiwgY29sID0gdG9wby5jb2xvcnMobGVuZ3RoKGJpa2UudHlwZSRuKSkpDQpsZWdlbmQoImxlZnQiLCBiaWtlLnR5cGUkQmlrZVRydW5jLCBjZXggPSAwLjgsIGZpbGwgPSB0b3BvLmNvbG9ycyhsZW5ndGgoYmlrZS50eXBlJG4pKSkNCmBgYA0KDQo5MC42JSBvZiBkaXN0YW5jZSBpcyBjb3ZlcmQgYnkgb25seSAzIGJpa2VzLg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbGlicmFyeShyZXNoYXBlMikNCmJpa2UudHlwZS5tZWx0IDwtIGJpa2UudHlwZSAlPiUNCiAgc2VsZWN0KEJpa2VUcnVuYywgU3BlZWQsIERpc3RhbmNlKQ0KYmlrZS50eXBlLm1lbHQgPC0gbWVsdChiaWtlLnR5cGUubWVsdCwgaWQudmFycyA9ICJCaWtlVHJ1bmMiKQ0KYmlrZS50eXBlLm1lbHQkdmFsdWUgPC0gYXMubnVtZXJpYyhiaWtlLnR5cGUubWVsdCR2YWx1ZSkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZ2dwbG90KGJpa2UudHlwZS5tZWx0LCBhZXMoeCA9IEJpa2VUcnVuYywgeSA9IHZhbHVlLCBmaWxsID0gdmFyaWFibGUpKSArDQogIGdlb21fYmFyKGNvbG91ciA9ICIjNTM1MzUzIiwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjgwKSArDQogIGZ0ZSArDQogIGdndGl0bGUoIkJldHRlciBWaXN1YWxpemF0aW9uIGZvciBSaWRlIEZyZXF1ZW5jeSBhbmQgRGlzdGFuY2UiKSArDQogIHhsYWIoIkJpa2UiKSArDQogIHlsYWIoIkF2ZXJhZ2UgTWlsZXMgKHBlciBIb3VyKSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsNCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiVmFyaWFibGUiKSkNCmBgYA0KDQojIyMgQnkgRGF5IG9mIHRoZSBXZWVrDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpiaWtlcyRkYXkgPC0gd2Vla2RheXMoYmlrZXMkUmlkZS5EYXRlLCBhYmJyZXZpYXRlID0gVCkNCg0KZGF5b2Z3ZWVrIDwtIGJpa2VzICU+JQ0KICBncm91cF9ieShkYXkpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICBBbHRpdHVkZSA9IG1lYW4oQWx0aXR1ZGUuR2Fpbi4uZnQuKSwNCiAgICBEaXN0YW5jZSA9IG1lYW4oRGlzdGFuY2UuLm1pbGVzLiksDQogICAgU3BlZWQgPSBtZWFuKEF2Zy5TcGVlZCkNCiAgKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQojUmVsZXZlbCB0aGUgZmFjdG9yIGluIG9yZGVyIG9mIHRoZSBkYXlzIG9mIHRoZSB3ZWVrDQpkYXlvZndlZWskZGF5IDwtIGFzLmZhY3RvcihkYXlvZndlZWskZGF5KQ0KZGF5b2Z3ZWVrJGRheSA8LSBmYWN0b3IoZGF5b2Z3ZWVrJGRheSwgYygiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IikpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChkYXlvZndlZWssIGFlcyh4ID0gZGF5KSkgKw0KICBnZW9tX2JhcihhZXMoeSA9IG4sIGZpbGwgPSBkYXkpLCBjb2xvdXIgPSAiIzUzNTM1MyIsIHN0YXQgPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuODApICsNCiAgZ2d0aXRsZSgiUmlkZXMgYnkgRGF5IikgKw0KICBmdGUgKw0KICB4bGFiKCJEYXkiKSArIHlsYWIoIlJpZGVzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmRheW9md2Vlay5tZWx0IDwtIGRheW9md2VlayAlPiUNCiAgc2VsZWN0KGRheSwgRGlzdGFuY2UsIFNwZWVkKQ0KZGF5b2Z3ZWVrLm1lbHQgPC0gbWVsdChkYXlvZndlZWsubWVsdCwgaWQudmFycyA9ICJkYXkiKQ0KZGF5b2Z3ZWVrLm1lbHQkdmFsdWUgPC0gYXMubnVtZXJpYyhkYXlvZndlZWsubWVsdCR2YWx1ZSkNCmBgYA0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpnZ3Bsb3QoZGF5b2Z3ZWVrLm1lbHQsIGFlcyh4ID0gZGF5LCB5ID0gdmFsdWUsIGZpbGwgPSB2YXJpYWJsZSkpICsNCiAgZ2VvbV9iYXIoY29sb3VyID0gIjUzNTM1MyIsIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGFscGhhID0gMC44MCkgKw0KICBmdGUgKw0KICBnZ3RpdGxlKCJEaXN0YW5jZSBhbmQgU3BlZWQgYnkgRGF5IikgKw0KICB4bGFiKCJEYXkiKSArDQogIHlsYWIoIkF2ZXJhZ2UgTWlsZXMgKHBlciBIb3VyKSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsNCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiVmFyaWFibGUiKSkNCmBgYA0KDQpTcGVlZCBkb2Vzbid0IHZhcnkgZGF5IHRvIGRheSwgYnV0IERpc3RhbmNlIGRlZmluaXRlbHkgZG9lczogbG9uZ2VyIHJpZGVzIG9uIHRoZSB3ZWVrZW5kcywgc2hvcnRlciByaWRlcyBvbiB3ZWVrZGF5cy4gTW9uZGF5IGhhcyBzbGlnaHRseSBsb25nZXIgcmlkZXMsIGxpa2VseSBiZWNhdXNlIE1vbmRheSBpcyBzb21ldGltZXMgcGFydCBvZiBhIDMgZGF5IHdlZWtlbmQuDQoNCiMjIyBPdmVyIFRpbWUNCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCm92ZXJ0aW1lIDwtIGJpa2VzICU+JQ0KICBzZWxlY3QoUmlkZS5EYXRlLCBEaXN0YW5jZS4ubWlsZXMuLCBBbHRpdHVkZS5HYWluLi5mdC4sIFRvdGFsLlRpbWUsIEF2Zy5TcGVlZCwgUmlkZS5UeXBlKSAlPiUNCiAgbXV0YXRlKA0KICAgIGN1bURpc3QgPSBjdW1zdW0oRGlzdGFuY2UuLm1pbGVzLiksDQogICAgY3VtQWx0ID0gY3Vtc3VtKEFsdGl0dWRlLkdhaW4uLmZ0LiksDQogICAgY3VtVGltZSA9IGN1bXN1bShUb3RhbC5UaW1lKQ0KICApDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChvdmVydGltZSwgYWVzKHggPSBSaWRlLkRhdGUsIHkgPSBjdW1EaXN0KSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEsIGNvbG91ciA9ICIjQkEwQzJFIikgKw0KICBmdGUgKw0KICBnZ3RpdGxlKCJEaXN0YW5jZSBvdmVyIHRoZSBZZWFyIikgKw0KICB4bGFiKCJEYXRlIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJEaXN0YW5jZSAobWlsZXMpIiwgbGFiZWxzID0gY29tbWEpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYXMuRGF0ZSgiMjAxNy0xMS0zMCIpLCB5ID0gNDkwMCwgbGFiZWwgPSAiVG90YWwgRGlzdGFuY2VcbjQsODA2LjEgbWkiLCBzaXplID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgY29sb3VyID0gIiNCQTBDMkUiKSArDQogIGFubm90YXRlKCJwb2ludCIsIHggPSBhcy5EYXRlKCIyMDE3LTEyLTMxIiksIHkgPSA0ODA2LjEsIGNvbG91ciA9ICIjQkEwQzJFIiwgc2l6ZSA9IDIpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChvdmVydGltZSwgYWVzKHggPSBSaWRlLkRhdGUsIHkgPSBjdW1UaW1lKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEsIGNvbG91ciA9ICIjMDAyRjZDIikgKw0KICBmdGUgKw0KICBnZ3RpdGxlKCJDdW11bGF0aXZlIFRpbWUgb3ZlciB0aGUgWWVhciIpICsNCiAgeGxhYigiRGF0ZSIpICsNCiAgeWxhYigiVGltZSAoaG91cnMpIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBhcy5EYXRlKCIyMDE3LTExLTMwIiksIHkgPSAzMzUsIGxhYmVsID0gIlRvdGFsIFRpbWVcbjMyOC44OCBociIsIHNpemUgPSAzLjUsIGZvbnRmYWNlID0gImJvbGQiLCBjb2xvdXIgPSAiIzAwMkY2QyIpICsNCiAgYW5ub3RhdGUoInBvaW50IiwgeCA9IGFzLkRhdGUoIjIwMTctMTItMzEiKSwgeSA9IDMyOC44ODQyLCBjb2xvdXIgPSAiIzAwMkY2QyIsIHNpemUgPSAyKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpnZ3Bsb3Qob3ZlcnRpbWUsIGFlcyh4ID0gUmlkZS5EYXRlLCB5ID0gY3VtQWx0KSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEsIGNvbG91ciA9ICIjMDA2MjAzIikgKw0KICBmdGUgKw0KICBnZ3RpdGxlKCJBbHRpdHVkZSBHYWluZWQgb3ZlciB0aGUgWWVhciIpICsNCiAgeGxhYigiRGF0ZSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQWx0aXR1ZGUgR2FpbmVkIChmZWV0KSIsIGxhYmVsID0gY29tbWEpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYXMuRGF0ZSgiMjAxNy0xMS0zMCIpLCB5ID0gMTkyMDAwLCBsYWJlbCA9ICJUb3RhbCBBbHRpdHVkZVxuMTg4LDQ3MyBmdCIsIHNpemUgPSAzLjUsIGZvbnRmYWNlID0gImJvbGQiLCBjb2xvdXIgPSAiIzAwNjIwMyIpICsNCiAgYW5ub3RhdGUoInBvaW50IiwgeCA9IGFzLkRhdGUoIjIwMTctMTItMzEiKSwgeSA9IDE4ODQ3MywgY29sb3VyID0gIiMwMDYyMDMiLCBzaXplID0gMikNCmBgYA0KDQojIyMgQWx0aXR1ZGUgR2FpbiBhbmQgRGlzdGFuY2UNCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChiaWtlcywgYWVzKHggPSBEaXN0YW5jZS4ubWlsZXMuLCB5ID0gQWx0aXR1ZGUuR2Fpbi4uZnQuKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IDAuNTApICsNCiAgZnRlICsNCiAgZ2d0aXRsZSgiQWx0aXR1ZGUgdmVyc3VzIERpc3RhbmNlIikgKw0KICB4bGFiKCJEaXN0YW5jZSAobWlsZXMpIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBbHRpdHVkZSBHYWluZWQgKGZlZXQpIiwgbGFiZWwgPSBjb21tYSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBzaXplID0gMS4yLCBjb2xvdXIgPSAiIzUzNTM1MyIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gNjYsIHkgPSA0MjUwLCBsYWJlbCA9ICI4LzUvMTdcbjQsMjA5IGZ0Iiwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIsIGNvbG91ciA9ICJjaG9jb2xhdGUxIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSA4NSwgeSA9IDI3NTAsIGxhYmVsID0gIjEwLzEvMTdcbjg0LjMgbWkiLCBzaXplID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgY29sb3VyID0gImNob2NvbGF0ZTEiKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpmbTAwIDwtIGxtKEFsdGl0dWRlLkdhaW4uLmZ0LiB+IERpc3RhbmNlLi5taWxlcy4sIGRhdGEgPSBiaWtlcykNCnN1bW1hcnkoZm0wMCkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZ2dwbG90KGJpa2VzLCBhZXMoeCA9IERpc3RhbmNlLi5taWxlcy4sIHkgPSBBbHRpdHVkZS5HYWluLi5mdC4pKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gMC41MCkgKw0KICBmdGUgKw0KICBnZ3RpdGxlKCJBbHRpdHVkZSB2ZXJzdXMgRGlzdGFuY2UiKSArDQogIHhsYWIoIkRpc3RhbmNlIChtaWxlcykiKSArDQogIHNjYWxlX3lfY29udGludW91cygiQWx0aXR1ZGUgR2FpbmVkIChmZWV0KSIsIGxhYmVsID0gY29tbWEpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDEuMiwgY29sb3VyID0gIiM1MzUzNTMiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDY2LCB5ID0gNDI1MCwgbGFiZWwgPSAiOC81LzE3XG40LDIwOSBmdCIsIHNpemUgPSAzLjUsIGZvbnRmYWNlID0gImJvbGQiLCBjb2xvdXIgPSAiY2hvY29sYXRlMSIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gODUsIHkgPSAyNzUwLCBsYWJlbCA9ICIxMC8xLzE3XG44NC4zIG1pIiwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIsIGNvbG91ciA9ICJjaG9jb2xhdGUxIikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geX54LCBzZSA9IFQsIGNvbG91ciA9ICJjaG9jb2xhdGUxIiwgc2l6ZSA9IDEpDQpgYGANCg0KIyMgWWVhci1ieS15ZWFyIENvbXBhcmlzb24NCg0KIyMjIFllYXItYnkteWVhciBPdmVydmlldw0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KYmlrZXMyMDE3IDwtIHJlYWQuY3N2KCJzdHJhbnNreV8yMDE3X2pvdXJuYWwuY3N2IikNCmJpa2VzMjAxNiA8LSByZWFkLmNzdigic3RyYW5za3lfMjAxNl9qb3VybmFsLmNzdiIpDQpiaWtlczIwMTUgPC0gcmVhZC5jc3YoInN0cmFuc2t5XzIwMTVfam91cm5hbC5jc3YiKQ0KYmlrZXMyMDE0IDwtIHJlYWQuY3N2KCJzdHJhbnNreV8yMDE0X2pvdXJuYWwuY3N2IikNCmJpa2VzMjAxMyA8LSByZWFkLmNzdigic3RyYW5za3lfMjAxM19qb3VybmFsLmNzdiIpDQpiaWtlczIwMTIgPC0gcmVhZC5jc3YoInN0cmFuc2t5XzIwMTJfam91cm5hbC5jc3YiKQ0KDQpiaWtlczIwMTckUmlkZS5EYXRlIDwtIG1keShiaWtlczIwMTckUmlkZS5EYXRlKQ0KYmlrZXMyMDE2JFJpZGUuRGF0ZSA8LSBtZHkoYmlrZXMyMDE2JFJpZGUuRGF0ZSkNCmJpa2VzMjAxNSRSaWRlLkRhdGUgPC0gbWR5KGJpa2VzMjAxNSRSaWRlLkRhdGUpDQpiaWtlczIwMTQkUmlkZS5EYXRlIDwtIG1keShiaWtlczIwMTQkUmlkZS5EYXRlKQ0KYmlrZXMyMDEzJFJpZGUuRGF0ZSA8LSBtZHkoYmlrZXMyMDEzJFJpZGUuRGF0ZSkNCmJpa2VzMjAxMiRSaWRlLkRhdGUgPC0gbWR5KGJpa2VzMjAxMiRSaWRlLkRhdGUpDQoNCmJpa2VzMjAxNyA8LSBiaWtlczIwMTcgJT4lDQogIG11dGF0ZSgNCiAgICBociA9IGFzLm51bWVyaWMoc3RyX3N1YihSaWRlLlRpbWUuLmhoLm1tLnNzLiwgMSwgMSkpLA0KICAgIG1pbiA9IGFzLm51bWVyaWMoc3RyX3N1YihSaWRlLlRpbWUuLmhoLm1tLnNzLiwgMyw0KSksDQogICAgc2VjID0gYXMubnVtZXJpYyhzdHJfc3ViKFJpZGUuVGltZS4uaGgubW0uc3MuLCA2LDcpKQ0KICApICU+JQ0KICBtdXRhdGUoDQogICAgVG90YWwuVGltZSA9IGhyICsgbWluIC8gNjAgKyBzZWMgLyAzNjAwLA0KICAgIEF2Zy5TcGVlZCA9IERpc3RhbmNlLi5taWxlcy4gLyBUb3RhbC5UaW1lDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBjdW1UaW1lID0gY3Vtc3VtKFRvdGFsLlRpbWUpLA0KICAgIGN1bURpc3QgPSBjdW1zdW0oRGlzdGFuY2UuLm1pbGVzLiksDQogICAgY3VtQWx0R2FpbiA9IGN1bXN1bShBbHRpdHVkZS5HYWluLi5mdC4pDQogICkNCg0KYmlrZXMyMDE2IDwtIGJpa2VzMjAxNiAlPiUNCiAgbXV0YXRlKA0KICAgIGhyID0gYXMubnVtZXJpYyhzdHJfc3ViKFJpZGUuVGltZS4uaGgubW0uc3MuLCAxLCAxKSksDQogICAgbWluID0gYXMubnVtZXJpYyhzdHJfc3ViKFJpZGUuVGltZS4uaGgubW0uc3MuLCAzLDQpKSwNCiAgICBzZWMgPSBhcy5udW1lcmljKHN0cl9zdWIoUmlkZS5UaW1lLi5oaC5tbS5zcy4sIDYsNykpDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBUb3RhbC5UaW1lID0gaHIgKyBtaW4gLyA2MCArIHNlYyAvIDM2MDAsDQogICAgQXZnLlNwZWVkID0gRGlzdGFuY2UuLm1pbGVzLiAvIFRvdGFsLlRpbWUNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGN1bVRpbWUgPSBjdW1zdW0oVG90YWwuVGltZSksDQogICAgY3VtRGlzdCA9IGN1bXN1bShEaXN0YW5jZS4ubWlsZXMuKSwNCiAgICBjdW1BbHRHYWluID0gY3Vtc3VtKEFsdGl0dWRlLkdhaW4uLmZ0LikNCiAgKQ0KDQpiaWtlczIwMTUgPC0gYmlrZXMyMDE1ICU+JQ0KICBtdXRhdGUoDQogICAgaHIgPSBhcy5udW1lcmljKHN0cl9zdWIoUmlkZS5UaW1lLi5oaC5tbS5zcy4sIDEsIDEpKSwNCiAgICBtaW4gPSBhcy5udW1lcmljKHN0cl9zdWIoUmlkZS5UaW1lLi5oaC5tbS5zcy4sIDMsNCkpLA0KICAgIHNlYyA9IGFzLm51bWVyaWMoc3RyX3N1YihSaWRlLlRpbWUuLmhoLm1tLnNzLiwgNiw3KSkNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIFRvdGFsLlRpbWUgPSBociArIG1pbiAvIDYwICsgc2VjIC8gMzYwMCwNCiAgICBBdmcuU3BlZWQgPSBEaXN0YW5jZS4ubWlsZXMuIC8gVG90YWwuVGltZQ0KICApICU+JQ0KICBtdXRhdGUoDQogICAgY3VtVGltZSA9IGN1bXN1bShUb3RhbC5UaW1lKSwNCiAgICBjdW1EaXN0ID0gY3Vtc3VtKERpc3RhbmNlLi5taWxlcy4pLA0KICAgIGN1bUFsdEdhaW4gPSBjdW1zdW0oQWx0aXR1ZGUuR2Fpbi4uZnQuKQ0KICApDQoNCmJpa2VzMjAxNCA8LSBiaWtlczIwMTQgJT4lDQogIG11dGF0ZSgNCiAgICBociA9IGFzLm51bWVyaWMoc3RyX3N1YihSaWRlLlRpbWUuLmhoLm1tLnNzLiwgMSwgMSkpLA0KICAgIG1pbiA9IGFzLm51bWVyaWMoc3RyX3N1YihSaWRlLlRpbWUuLmhoLm1tLnNzLiwgMyw0KSksDQogICAgc2VjID0gYXMubnVtZXJpYyhzdHJfc3ViKFJpZGUuVGltZS4uaGgubW0uc3MuLCA2LDcpKQ0KICApICU+JQ0KICBtdXRhdGUoDQogICAgVG90YWwuVGltZSA9IGhyICsgbWluIC8gNjAgKyBzZWMgLyAzNjAwLA0KICAgIEF2Zy5TcGVlZCA9IERpc3RhbmNlLi5taWxlcy4gLyBUb3RhbC5UaW1lDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBjdW1UaW1lID0gY3Vtc3VtKFRvdGFsLlRpbWUpLA0KICAgIGN1bURpc3QgPSBjdW1zdW0oRGlzdGFuY2UuLm1pbGVzLiksDQogICAgY3VtQWx0R2FpbiA9IGN1bXN1bShBbHRpdHVkZS5HYWluLi5mdC4pDQogICkNCg0KYmlrZXMyMDEzIDwtIGJpa2VzMjAxMyAlPiUNCiAgbXV0YXRlKA0KICAgIGhyID0gYXMubnVtZXJpYyhzdHJfc3ViKFJpZGUuVGltZS4uaGgubW0uc3MuLCAxLCAxKSksDQogICAgbWluID0gYXMubnVtZXJpYyhzdHJfc3ViKFJpZGUuVGltZS4uaGgubW0uc3MuLCAzLDQpKSwNCiAgICBzZWMgPSBhcy5udW1lcmljKHN0cl9zdWIoUmlkZS5UaW1lLi5oaC5tbS5zcy4sIDYsNykpDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBUb3RhbC5UaW1lID0gaHIgKyBtaW4gLyA2MCArIHNlYyAvIDM2MDAsDQogICAgQXZnLlNwZWVkID0gRGlzdGFuY2UuLm1pbGVzLiAvIFRvdGFsLlRpbWUNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGN1bVRpbWUgPSBjdW1zdW0oVG90YWwuVGltZSksDQogICAgY3VtRGlzdCA9IGN1bXN1bShEaXN0YW5jZS4ubWlsZXMuKSwNCiAgICBjdW1BbHRHYWluID0gY3Vtc3VtKEFsdGl0dWRlLkdhaW4uLmZ0LikNCiAgKQ0KDQpiaWtlczIwMTIgPC0gYmlrZXMyMDEyICU+JQ0KICBtdXRhdGUoDQogICAgaHIgPSBhcy5udW1lcmljKHN0cl9zdWIoUmlkZS5UaW1lLi5oaC5tbS5zcy4sIDEsIDEpKSwNCiAgICBtaW4gPSBhcy5udW1lcmljKHN0cl9zdWIoUmlkZS5UaW1lLi5oaC5tbS5zcy4sIDMsNCkpLA0KICAgIHNlYyA9IGFzLm51bWVyaWMoc3RyX3N1YihSaWRlLlRpbWUuLmhoLm1tLnNzLiwgNiw3KSkNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIFRvdGFsLlRpbWUgPSBociArIG1pbiAvIDYwICsgc2VjIC8gMzYwMCwNCiAgICBBdmcuU3BlZWQgPSBEaXN0YW5jZS4ubWlsZXMuIC8gVG90YWwuVGltZQ0KICApICU+JQ0KICBtdXRhdGUoDQogICAgY3VtVGltZSA9IGN1bXN1bShUb3RhbC5UaW1lKSwNCiAgICBjdW1EaXN0ID0gY3Vtc3VtKERpc3RhbmNlLi5taWxlcy4pLA0KICAgIGN1bUFsdEdhaW4gPSBjdW1zdW0oQWx0aXR1ZGUuR2Fpbi4uZnQuKQ0KICApDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmJpa2VzdG90YWwgPC0gcmJpbmQoYmlrZXMyMDEyLCBiaWtlczIwMTMsIGJpa2VzMjAxNCwgYmlrZXMyMDE1LCBiaWtlczIwMTYsIGJpa2VzMjAxNykNCmJpa2VzdG90YWwgPC0gZmlsdGVyKGJpa2VzdG90YWwsIERpc3RhbmNlLi5taWxlcy4gIT0gMCkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KYmlrZXN0b3RhbCRZZWFyIDwtIGZvcm1hdChiaWtlc3RvdGFsJFJpZGUuRGF0ZSwgIiVZIikNCmJ5eWVhciA8LSBiaWtlc3RvdGFsICU+JQ0KICBncm91cF9ieShZZWFyKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgQWx0R2FpbiA9IG1lYW4oQWx0aXR1ZGUuR2Fpbi4uZnQuKSwNCiAgICBTcGVlZCA9IG1lYW4oQXZnLlNwZWVkKSwNCiAgICBEaXN0YW5jZSA9IG1lYW4oRGlzdGFuY2UuLm1pbGVzLiksDQogICAgVG90QWx0R2FpbiA9IG4gKiBBbHRHYWluLA0KICAgIFRvdERpc3RhbmNlID0gbiAqIERpc3RhbmNlDQogICkNCmBgYA0KDQpgYGB7ciByZXN1bHRzID0gImhpZGUiLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KbWVhbihieXllYXIkbikNCm1lYW4oYnl5ZWFyJFRvdERpc3RhbmNlKQ0KbWVhbihieXllYXIkVG90RGlzdGFuY2UpIC8gbWVhbihieXllYXIkbikNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZ2dwbG90KGJ5eWVhciwgYWVzKHggPSBZZWFyLCBncm91cCA9IDEpKSArDQogIGdlb21fbGluZShhZXMoeSA9IG4sIGNvbG91ciA9ICJSaWRlcyIpLCBzaXplID0gMSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBUb3REaXN0YW5jZSAvIDM1LCBjb2xvdXIgPSAiRGlzdGFuY2UiKSwgc2l6ZSA9IDEpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IG4sIGNvbG91ciA9ICJSaWRlcyIpLCBzaXplID0gMikgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gVG90RGlzdGFuY2UgLyAzNSwgY29sb3VyID0gIkRpc3RhbmNlIiksIHNpemUgPSAyKSArDQogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4uKjM1LCBuYW1lID0gIkRpc3RhbmNlIChtaWxlcykiLCBsYWJlbHMgPSBjb21tYSkpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjQkEwQzJFIiwgIiMwMDJGNkMiKSkgKw0KICBnZ3RpdGxlKCJSaWRlIEZyZXF1ZW5jeSBhbmQgRGlzdGFuY2UgMjAxMi0yMDE3IikgKw0KICB4bGFiKCJZZWFyIikgKyB5bGFiKCJSaWRlcyIpICsNCiAgd2l0aGJvcmRlcmZ0ZSArDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiVmFyaWFibGUiKSkNCmBgYA0KDQpTZWVtcyBsaWtlIGhlJ3MgZ29pbmcgb24gbG9uZ2VyIHJpZGVzICh0aGUgbnVtYmVyIG9mIHJpZGVzIHVzZWQgdG8gb3V0cGFjZSB0aGUgZGlzdGFuY2UsIGJ1dCB0aGF0IGhhc24ndCBiZWVuIHRoZSBjYXNlIG92ZXIgdGhlIHBhc3QgMyB5ZWFycykuIExldCdzIHNlZSBpZiB0aGlzIGlzIHRydWUgYmFzZWQgb24gYXZlcmFnZSBkaXN0YW5jZS4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChieXllYXIsIGFlcyh4ID0gWWVhciwgeSA9IERpc3RhbmNlKSkgKw0KICBnZW9tX2JhcihhZXMoZmlsbCA9IFllYXIpLCBzdGF0ID0gImlkZW50aXR5IiwgY29sb3VyID0gIiM1MzUzNTMiLCBhbHBoYSA9IDAuODApICsNCiAgZnRlICsNCiAgZ2d0aXRsZSgiQXZlcmFnZSBEaXN0YW5jZSBieSBZZWFyIikgKw0KICB4bGFiKCJZZWFyIikgKyB5bGFiKCJBdmVyYWdlIERpc3RhbmNlIChtaWxlcykiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQpBdmVyYWdlIHJpZGUgZGlzdGFuY2Ugd2FzIGFsbW9zdCBpZGVudGl0aWNhbCBvdmVyIHRoZSBmaXJzdCAzIHllYXJzIGFuZCBoYXMgZGVmaW5pdGVseSBkZWNyZWFzZWQgaW4gcmVjZW50IHllYXJzLg0KDQpIZXJlJ3MgYW4gYWx0ZXJuYXRpdmUgYmFycGxvdCB2aXN1YWxpemF0aW9uIG9mIFJpZGUgRnJlcXVlbmN5IGFuZCBEaXN0YW5jZS4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmJ5eWVhcm1lbHQgPC0gc2VsZWN0KGJ5eWVhciwgWWVhciwgbiwgVG90RGlzdGFuY2UpDQpieXllYXJtZWx0JFRvdERpc3RhbmNlIDwtIGJ5eWVhcm1lbHQkVG90RGlzdGFuY2UgLyAzNQ0KYnl5ZWFybWVsdCA8LSBtZWx0KGJ5eWVhcm1lbHQsIGlkLnZhcnMgPSAiWWVhciIpDQpieXllYXJtZWx0JHZhbHVlIDwtIGFzLm51bWVyaWMoYnl5ZWFybWVsdCR2YWx1ZSkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZ2dwbG90KGJ5eWVhcm1lbHQsIGFlcyh4ID0gWWVhciwgeSA9IHZhbHVlLCBmaWxsID0gdmFyaWFibGUpKSArDQogIGdlb21fYmFyKGNvbG91ciA9ICIjNTM1MzUzIiwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjgwKSArDQogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4uKjM1LCBuYW1lID0gIkRpc3RhbmNlIChtaSkiLCBsYWJlbHMgPSBjb21tYSkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0Y4NzY2RCIsICIjMDBCRkM0IiksIGxhYmVscyA9IGMoIlJpZGVzIiwgIkRpc3RhbmNlIikpICsNCiAgZ2d0aXRsZSgiUmlkZSBGcmVxdWVuY3kgYW5kIERpc3RhbmNlIDIwMTItMjAxNyIpICsNCiAgeGxhYigiWWVhciIpICsgeWxhYigiUmlkZXMiKSArDQogIGZ0ZSArDQogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIlZhcmlhYmxlIikpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmJpa2VzdG90YWwkTW9udGhEYXkgPC0gZm9ybWF0KGJpa2VzdG90YWwkUmlkZS5EYXRlLCAiJWQtJWIiKQ0KYmlrZXN0b3RhbCRNb250aERheSA8LSB5ZG0ocGFzdGUwKDIwMTIsIGJpa2VzdG90YWwkTW9udGhEYXkpKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpnZ3Bsb3QoYmlrZXN0b3RhbCwgYWVzKHggPSBNb250aERheSwgeSA9IGN1bURpc3QpKSArDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gWWVhciksIHNpemUgPSAxKSArDQogIHNjYWxlX3hfZGF0ZSgNCiAgICBuYW1lID0gIkRhdGUiLA0KICAgIGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLA0KICAgIGRhdGVfbGFiZWxzID0gIiViIg0KICApICsNCiAgZnRlICsNCiAgZ2d0aXRsZSgiRGlzdGFuY2Ugb3ZlciB0aGUgWWVhciAyMDEyLTIwMTciKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkRpc3RhbmNlIChtaWxlcykiLCBsYWJlbHMgPSBjb21tYSkgKw0KICBhbm5vdGF0ZSgicG9pbnQiLCB4ID0gYXMuRGF0ZSgiMjAxMi0xMi0zMSIpLCB5ID0gNjMwNi4xOCwgY29sb3VyID0gIiNGODc2NkQiLCBzaXplID0gMikgKw0KICBhbm5vdGF0ZSgicG9pbnQiLCB4ID0gYXMuRGF0ZSgiMjAxMi0xMi0yOCIpLCB5ID0gMzk5MS4zMCwgY29sb3VyID0gIiMwMEJBMzgiLCBzaXplID0gMikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBhcy5EYXRlKCIyMDEyLTExLTAxIiksIHkgPSA2MzAwLCBsYWJlbCA9ICIyMDEyXG42LDMwNi4xOCBtaSIsIGNvbG91ciA9ICIjRjg3NjZEIiwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYXMuRGF0ZSgiMjAxMi0xMi0yMCIpLCB5ID0gMzU1MCwgbGFiZWwgPSAiMjAxNFxuMyw5OTEuMzAgbWkiLCBjb2xvdXIgPSAiIzAwQkEzOCIsIHNpemUgPSAzLjUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDUyMDAsIGx0eSA9IDIsIGNvbG91ciA9ICIjNTM1MzUzIiwgc2l6ZSA9IDAuNzUpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYXMuRGF0ZSgiMjAxMi0wMi0xNCIpLCB5ID0gNTAwMCwgbGFiZWwgPSAiVGFyZ2V0OiA1LDIwMCBtaSIsIGNvbG91ciA9ICIjNTM1MzUzIiwgZm9udGZhY2UgPSAiYm9sZCIsIHNpemUgPSAzLjUpDQpgYGANCg0KVGhlIGhpZ2hlc3QgdG90YWwgZGlzdGFuY2Ugb2NjdXJyZWQgaW4gMjAxMiwgd2hpbGUgdGhlIGxvd2VzdCB0b3RhbCBkaXN0YW5jZSBvY2N1cnJlZCBpbiAyMDE0LiAyMDE3IHdhcyBhYm91dCBwYXIgZm9yIHRoZSBjYXNlLCB3aXRoIHRvdGFsIGRpc3RhbmNlIGFyb3VuZCA0ODAwIG1pbGVzIGluIDIwMTMsIDIwMTUsIGFuZCAyMDE3Lg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZ2dwbG90KGJpa2VzdG90YWwsIGFlcyh4ID0gTW9udGhEYXksIHkgPSBjdW1BbHRHYWluKSkgKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IFllYXIpLCBzaXplID0gMSkgKw0KICBzY2FsZV94X2RhdGUoDQogICAgbmFtZSA9ICJEYXRlIiwNCiAgICBkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwNCiAgICBkYXRlX2xhYmVscyA9ICIlYiINCiAgKSArDQogIGZ0ZSArDQogIGdndGl0bGUoIkFsdGl0dWRlIEdhaW5lZCBvdmVyIHRoZSBZZWFyIDIwMTItMjAxNyIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQWx0aXR1ZGUgR2FpbmVkIChmZWV0KSIsIGxhYmVscyA9IGNvbW1hKQ0KYGBgDQoNCkFsdGl0dWRlIGdhaW5lZCBmb2xsb3dzIGEgc2ltaWxhciB0cmVuZCB0byB0aGUgZGlzdGFuY2UgZ2FpbmVkLiBMZXQncyB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIGhpZ2hlc3QgZGlzdGFuY2UgeWVhciwgbG93ZXN0IGRpc3RhbmNlIHllYXIsIGFuZCBsYXN0IHllYXIuDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpiaWtlc3RvdGZpbHQgPC0gYmlrZXN0b3RhbCAlPiUNCiAgZmlsdGVyKFllYXIgJWluJSBjKDIwMTIsIDIwMTQsIDIwMTcpKQ0KDQpnZ3Bsb3QoYmlrZXN0b3RmaWx0LCBhZXMoeCA9IE1vbnRoRGF5LCB5ID0gY3VtRGlzdCwgY29sb3VyID0gWWVhcikpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBZZWFyKSwgc2l6ZSA9IDEpICsNCiAgc2NhbGVfeF9kYXRlKA0KICAgIG5hbWUgPSAiRGF0ZSIsDQogICAgZGF0ZV9icmVha3MgPSAiMSBtb250aCIsDQogICAgZGF0ZV9sYWJlbHMgPSAiJWIiDQogICkgKw0KICBmdGUgKw0KICBnZ3RpdGxlKCJEaXN0YW5jZSBHYWluZWQgMjAxMiwgMjAxNCwgMjAxNyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiRGlzdGFuY2UgKG1pbGVzKSIsIGxhYmVscyA9IGNvbW1hKSArDQogIGZhY2V0X2dyaWQoZmFjZXRzID0gWWVhciB+IC4sIG1hcmdpbnMgPSBGKQ0KYGBgDQoNCkhlIHdhcyBvbiBhbiBldmVuIHNsb3dlciBwYWNlIHRoYW4gaGUgd2FzIGluIDIwMTQgaGVhZGVkIGludG8gdGhlIHN1bW1lciBtb250aHMsIGJ1dCBtYWRlIHVwIGEgbG90IG9mIGdyb3VuZCBhbmQgZmluaXNoZWQgYXJvdW5kIHRoZSBhdmVyYWdlIG1pbGVhZ2UgdG90YWwuIFRoZSBtaWxlYWdlIGdhaW4gaW4gMjAxMiB3YXMgY29uc2lzdGVudGx5IHBhY2VkIHRocm91Z2hvdXQuDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpnZ3Bsb3QoYmlrZXN0b3RmaWx0LCBhZXMoeCA9IE1vbnRoRGF5LCB5ID0gQXZnLlNwZWVkLCBjb2xvdXIgPSBZZWFyKSkgKw0KICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IFllYXIpLCBzaXplID0gMC43NSkgKw0KICBzY2FsZV94X2RhdGUoDQogICAgbmFtZSA9ICJEYXRlIiwNCiAgICBkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwNCiAgICBkYXRlX2xhYmVscyA9ICIlYiINCiAgKSArDQogIGZ0ZSArDQogIGdndGl0bGUoIkF2ZXJhZ2UgU3BlZWQgMjAxMiwgMjAxNCwgMjAxNyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiU3BlZWQgKG1waCkiKSArDQogIGZhY2V0X2dyaWQoZmFjZXRzID0gWWVhciB+IC4sIG1hcmdpbnMgPSBGKQ0KYGBgDQoNCkFsdGhvdWdoIDIwMTIgd2FzIGJ5IGZhciB0aGUgYmVzdCB5ZWFyIGluIHRlcm1zIG9mIGRpc3RhbmNlIGdhaW5lZCwgdGhlIGF2ZXJhZ2Ugc3BlZWRzIHdlcmUgYSBsb3QgbW9yZSBlcnJhdGljLiBNdWNoIG1vcmUgY29uc2lzdGVudCByaWRpbmcgaW4gMjAxNy4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChiaWtlc3RvdGFsLCBhZXMoeCA9IFllYXIsIHkgPSBEaXN0YW5jZS4ubWlsZXMuKSkgKw0KICBnZW9tX2JveHBsb3QoY29sb3VyID0gIiMwMDJGNkMiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGZ0ZSArDQogIGdndGl0bGUoIlJpZGUgRGlzdGFuY2UgQ29tcGFyaXNvbiAyMDEyLTIwMTciKSArDQogIHlsYWIoIkRpc3RhbmNlIChtaWxlcykiKQ0KYGBgDQoNCjIwMTYgY29uc2lzdGVkIG9mIG11Y2ggbG9uZ2VyIHJpZGVzIHRoYW4gYW55IG90aGVyIHllYXIgKHNob3duIGJ5IHRoZSBoaWdoZXIgbWVkaWFuIGFuZCBsb25nZXIgdXBwZXIgd2hpc2tlciB0aGFuIG90aGVyIHllYXJzKS4gVGhlIGluZGl2aWR1YWwgcG9pbnRzIHNob3cgb3V0bGllcnMgKGdyZWF0ZXIgdGhhbiAxLjUqSVFSIGhpZ2hlciB0aGFuIHRoZSA3NXRoIHBlcmNlbnRpbGUpLiBUaGUgcGxvdCBzaG93cyB0aGF0IHRoZSBsYXJnZSB0b3RhbCBkaXN0YW5jZSBpbiAyMDE2IGlzIGV4cGxhaW5lZCBieSBsb25nZXIgcmlkZXMsIHdoaWxlIHRoZSBsYXJnZSB0b3RhbCBkaXN0YW5jZSBpbiAyMDEyIGlzIGV4cGxhaW5lZCBieSBhIGdyZWF0ZXIgdm9sdW1lIG9mIGJpa2UgcmlkZXMuDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpnZ3Bsb3QoYmlrZXN0b3RhbCwgYWVzKHggPSBZZWFyLCB5ID0gRGlzdGFuY2UuLm1pbGVzLikpICsNCiAgZ2VvbV92aW9saW4oY29sb3VyID0gIiMwMDJGNkMiKSArDQogIGdlb21fYm94cGxvdChjb2xvdXIgPSAiIzAwMkY2QyIsIGFscGhhID0gMC43NSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBmdGUgKw0KICBnZ3RpdGxlKCJSaWRlIERpc3RhbmNlIENvbXBhcmlzb24gMjAxMi0yMDE3IikgKw0KICB5bGFiKCJEaXN0YW5jZSAobWlsZXMpIikNCmBgYA0KDQpBbiBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbiB0aGF0IHByb3ZlcyB0aGUgaHlwb3RoZXNpcyBhYm92ZS4gVGhlIHZpb2xpbiBwbG90cyBzaG93IHRoZSByZWxhdGl2ZSBkZW5zaXR5IG9mIHBvaW50cy4gSW4gMjAxMiwgdGhlcmUncyBhIGdyZWF0ZXIgZGVuc2l0eSBvZiBzaG9ydGVyLWRpc3RhbmNlIHJpZGVzLCB3aGlsZSBpbiAyMDE2LCB0aGUgZGVuc2l0eSBpcyBoaWdoZXIgYXJvdW5kIHRoZSBtZWRpYW4uDQoNCiMjIyBSaWRlIFR5cGUgYnkgWWVhcg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KcmlkZXR5cGUgPC0gYmlrZXN0b3RhbCAlPiUNCiAgZ3JvdXBfYnkoWWVhciwgUmlkZS5UeXBlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCkNCiAgKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpnZ3Bsb3QocmlkZXR5cGUsIGFlcyh4ID0gWWVhciwgeSA9IG4sIGZpbGwgPSBSaWRlLlR5cGUpKSArDQogIGdlb21fYmFyKGNvbG91ciA9ICIjNTM1MzUzIiwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjgwKSArDQogIGZ0ZSArDQogIGdndGl0bGUoIlJpZGUgVHlwZSBGcmVxdWVuY3kgYnkgWWVhciIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFJpZGVzIikgKw0KICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJSaWRlIFR5cGUiKSkNCmBgYA0KDQpBbiBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgb2YgdGhlIHJpZGVzIGFyZSBSb2xsaW5nIFJvYWQgcmlkZXMgb3ZlciB0aGUgcGFzdCA2IHllYXJzLiBMYXN0IHllYXIsIG5vIG9mZi1yb2FkIHJpZGVzIHdlcmUgcmVjb3JkZWQgYW5kIG9ubHkgb25lIEhpbGxzIFJvYWQgcmlkZSBoYXMgYmVlbiByZWNvcmRlZCBpbiB0aGUgcGFzdCA0IHllYXJzLg0KDQojIyMgQmlrZSBUeXBlDQoNCkZpbmFsbHksIHdlJ2xsIGxvb2sgYXQgdGhlIGJpa2VzIHVzZWQgZm9yIHRoZSByb2FkIHJpZGVzIG92ZXIgdGhlIHBhc3QgNiB5ZWFycy4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmJpa2V0eXBlcm9hZCA8LSBiaWtlc3RvdGFsICU+JQ0KICBmaWx0ZXIoUmlkZS5UeXBlICVpbiUgYygiUm9hZDogRmxhdCIsICJSb2FkOiBIaWxscyIsICJSb2FkOiBSb2xsaW5nIikpICU+JQ0KICBncm91cF9ieShCaWtlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgQWx0aXR1ZGUgPSBtZWFuKEFsdGl0dWRlLkdhaW4uLmZ0LiksDQogICAgRGlzdGFuY2UgPSBtZWFuKERpc3RhbmNlLi5taWxlcy4pLA0KICAgIFNwZWVkID0gbWVhbihBdmcuU3BlZWQpDQogICkNCg0KYmlrZXR5cGVyb2FkJEJpa2VUcnVuYyA8LSBjKCJNYXNpIEZHIiwgIkxhbmdzdGVyIiwgIlJvY2tob3BwZXIiLCAiUm91YmFpeCIsICJUcmkgQ09NUCIsICJUcmkgU1BPUlQiLCAiQ2VudHVyaW9uIiwgIk1hc2kgTFREIEZHIiwgIlRyaSBFWFAiLCAiVHJpIFNJTkciKQ0KYGBgDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpnZ3Bsb3QoYmlrZXR5cGVyb2FkLCBhZXMoeCA9IEJpa2VUcnVuYywgeSA9IG4sIGZpbGwgPSBCaWtlVHJ1bmMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvdXIgPSAiIzUzNTM1MyIsIGFscGhhID0gMC44MCkgKw0KICBmdGUgKw0KICBnZ3RpdGxlKCJCaWtlIEZyZXF1ZW5jeSBvZiBVc2UiKSArDQogIHhsYWIoIkJpa2UiKSArDQogIHlsYWIoIk51bWJlciBvZiBSaWRlcyIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjQsIGFuZ2xlID0gOTApKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZ2dwbG90KGJpa2V0eXBlcm9hZCwgYWVzKHggPSBCaWtlVHJ1bmMsIHkgPSBTcGVlZCwgZmlsbCA9IEJpa2VUcnVuYykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG91ciA9ICIjNTM1MzUzIiwgYWxwaGEgPSAwLjgwKSArDQogIGZ0ZSArDQogIGdndGl0bGUoIkJpa2UgQXZlcmFnZSBTcGVlZCIpICsNCiAgeGxhYigiQmlrZSIpICsNCiAgeWxhYigiQXZlcmFnZSBTcGVlZCAobXBoKSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjQsIGFuZ2xlID0gOTApKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQpUaGUgMTAgYmlrZXMgdXNlZCBvdmVyIHRoZSBwYXN0IDYgeWVhcnMgYXJlIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdy4gVmFsdWVzIGZvciBhbHRpdHVkZSBnYWluLCBkaXN0YW5jZSwgYW5kIHNwZWVkIGFyZSBhdmVyYWdlIHZhbHVlcyBmb3IgZWFjaCBiaWtlLg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0Ka25pdHI6OmthYmxlKGJpa2V0eXBlcm9hZCAlPiUNCiAgICAgICAgICAgICAgIHNlbGVjdChCaWtlLCAiUmlkZXMiID0gbiwgIkFsdC4gR2FpbiAoZnQpIiA9IEFsdGl0dWRlLCAiRGlzdGFuY2UgKG1pKSIgPSBEaXN0YW5jZSwgIlNwZWVkIChtcGgpIiA9IFNwZWVkKSkNCmBgYA0KDQojIyMgUmlkZXMgYnkgRGF5DQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQpiaWtlc3RvdGFsJGRvdyA8LSBpZl9lbHNlKA0KICBiaWtlc3RvdGFsJERheS5vZi5XZWVrID09ICJTdW4iLA0KICAiU3VuZGF5IiwNCiAgaWZfZWxzZSgNCiAgICBiaWtlc3RvdGFsJERheS5vZi5XZWVrID09ICJTYXQiLA0KICAgICJTYXR1cmRheSIsDQogICAgIldlZWtkYXkiDQogICkNCikNCg0KYnlkYXkgPC0gYmlrZXN0b3RhbCAlPiUNCiAgZ3JvdXBfYnkoWWVhciwgZG93KSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgRGlzdCA9IHN1bShEaXN0YW5jZS4ubWlsZXMuKSwNCiAgICBBbHQgPSBzdW0oQWx0aXR1ZGUuR2Fpbi4uZnQuKSwNCiAgICBhdmdEaXN0ID0gbWVhbihEaXN0YW5jZS4ubWlsZXMuKQ0KICApDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChieWRheSwgYWVzKHggPSBkb3csIHkgPSBuLCBmaWxsID0gWWVhcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG91ciA9ICIjNTM1MzUzIiwgYWxwaGEgPSAwLjgwLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZnRlICsNCiAgZ2d0aXRsZSgiUmlkZXMgYnkgRGF5IikgKw0KICB4bGFiKCJEYXkgVHlwZSIpICsNCiAgeWxhYigiUmlkZXMiKQ0KYGBgDQoNCkEgbG90IG1vcmUgd2Vla2RheSByaWRlcyBpbiAyMDEyIGFuZCAyMDE3IHRoYW4gdGhlcmUgd2VyZSBpbiBvdGhlciB5ZWFycy4gUHJldHR5IGNvbnNpc3RlbnQgU3VuZGF5IGFuZCBTYXR1cmRheSByaWRpbmcsIHdpdGggYSBjb3VwbGUgb2YgeWVhcnMgZXhoaWJpdGluZyBtb3JlIHRoYW4gNTIgcmlkZXMgb24gdGhvc2UgZGF5cy4NCg0KYGBge3IgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCmdncGxvdChieWRheSwgYWVzKHggPSBkb3csIHkgPSBhdmdEaXN0LCBmaWxsID0gWWVhcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG91ciA9ICIjNTM1MzUzIiwgYWxwaGEgPSAwLjgwLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZnRlICsNCiAgZ2d0aXRsZSgiRGlzdGFuY2UgYnkgRGF5IikgKw0KICB4bGFiKCJEYXkgVHlwZSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiRGlzdGFuY2UgKG1pbGVzKSIsIGxhYmVscyA9IGNvbW1hKQ0KYGBgDQoNCkFzIGV4cGVjdGVkLCBhIGxvdCBtb3JlIGRpc3RhbmNlIGlzIGFjY3VtdWxhdGVkIG9uIHRoZSB3ZWVrZW5kcyB3aGlsZSB3ZWVrZGF5cyBhcmUgdXN1YWxseSBzaG9ydGVyIHJpZGVzLg0KDQo=