Methodology
After a lot of trials and errors, this is the model I came out with:
log(Members) = 𝛽0 + 𝛽1 Score + 𝛽2 Score ∧ 2 + 𝛽3 Score ∧ 3 + 𝛽4 Epi + 𝛽5 Producers + 𝛽6 Producers ∧ 2 + 𝛽7 Age+ 𝛽8 Age ∧ 2 + 𝛽9 Children + 𝛽10 All Ages + 𝛽11 R 17 + 𝛽12 Mild Nudity + 𝛽13 Kyoto Animation + 𝛽14 A 1 Pictures + 𝛽15 Bones + 𝛽16 Shin-Ei Animation + 𝛽17 Historical + 𝛽18 Harem + 𝛽19 Music + 𝛽20 Action + 𝛽21 Romance + 𝛽22 School + 𝛽23 Space + 𝛽24 Psychological + 𝛽25 Supernatural+𝛽26 Horror + 𝛽27 Fantasy + 𝛽28 Mecha + 𝛽29 Sports + 𝛽30 Game + 𝛽31 Demons + 𝛽32 Police + 𝛽33 Shounen + 𝛽34 Light.novel + 𝛽35 Sanrio + 𝛽36 Shueisha + 𝛽37 Toho Animation + 𝛽38 TBS + 𝛽39 Pony.Canyon + 𝛽40 Shogakukan + 𝜀
Now, I’ll go over the coefficients. It makes sense to start with the outcome we want to understand: the members variable.
The data is right-skewed; there are more “not that popular” shows than very popular ones. The median was 89418 and the most popular show had 2116123 members. When modeling this outcome, a strong argument can be made that it should be log-transformed.
Here’s the transformed data:
While not perfect (now it looks a bit left-skewed), our model results will probably be better.
Score is a user-generated variable that indicates the evaluation of MAL users towards a particular anime from 1 to 10. The mean and median are 7.2.
Epi is a dummy variable which takes the value 1 for shows with more than 26 episodes and 0 for shows with 26 or fewer episodes. Producers is the number of producers on the committee board of a given anime. Age is how old an anime is (in years). For example, 0 means 2020 and 15 means 2005. Here’s the number of shows animated by year.
Children, All Ages, R 17+ y Mild Nudity are part of the categorical variable rating. The reference level is the PG-13 category. A-1 Pictures, Bones, Kyoto Animation and Shin Ei Animation are dummy variables for those studios. Also, I made dummy variables for the studios:
Toei Animation, Sunrise, J.C Staff, Madhouse, TMS Entertainment, Production.I.G, Studio.Deen, Studio.Pierrot, OLM, Nippon.Animation, DLE, Tatsunoko.Production, Gonzo, Xebec, AIC, Shaft, Brain.Base, ufotable, Gainax and feel.
They were not considered in the final model, because the anova tests that I carried out reported that these studios did not contribute statistically to the model.
The coefficients from 𝛽17 to 𝛽33 are dummy variables for anime genres. It is necessary to mention that as with anime studios, I created variables for many genres that were not considered in the final model because they did not contribute statistically to our model: Among the genres dropped are:
Comedy, Adventure, Slice of Life, Drama, Sci Fi, Mystery, Seinen, Martial Arts, Samurai, Shoujo, Shoujo Ai, Shounen Ai, Josei, Vampire, Military, Demons, Magic and Thriller
Light Novel is a variable which takes the value 1, when the source material of a show is a light novel and 0 for anime with a different source. Finally, from 𝛽35 to 𝛽40 correspond to dummy variables for different anime production companies. As with genres and studios, there were many producers who were initially considered but were dropped for the same reasons. Among them were:
Kodansha, Bandai, Square Enix, Kadokawa, Aniplex, NHK, TV Tokyo, TV Asahi, Fuji TV, Gakken, Dentsu, Media Factory, Lantis, KlockWorx, Frontier Works, flying DOG, Nippon Television Network, Showgate, Starchild Records, Sony Music y VAP.
There were some influential observations so I decided to eliminate them one by one until there were no more shows with high leverage. The anime involved in the process were: “Naikaku Kenryoku Hanzai Kyousei Torishimarikan Zaizen Joutarou”, “Death Note”, ”Kaitou Joker 4th Season”, “Active Raid: Kidou Kyoushuushitsu Dai Hachi Gakari” and “Tsurune: Kazemai Koukou Kyuudoubu”.
After doing this it is possible to point out that the most important change is that the Shin Ei animation coefficient is no longer statistically significant. In addition, there are significant increases in the impact of certain variables such as “Police” and “Kyoto Animation”
I ran a Shapiro test to assess normality. And there wasn’t normality. So I decided to winsorize the data. There were 24 anime involved in the process, all of them had less than 1700 members. Lastly, I decided to run the model with robust standard errors because I detected heteroscedasticity.
Understanding Anime Popularity
|
|
|
|
Dependent Variable: Log (Members)
|
|
|
|
|
|
Model 1
|
Model 2
|
Model 3
|
|
|
|
Score
|
-13.849***
|
-14.570***
|
-14.570***
|
|
|
(3.396)
|
(3.374)
|
(3.555)
|
|
Score^2
|
1.970***
|
2.074***
|
2.074***
|
|
|
(0.482)
|
(0.479)
|
(0.503)
|
|
Score^3
|
-0.086***
|
-0.091***
|
-0.091***
|
|
|
(0.023)
|
(0.022)
|
(0.024)
|
|
Episode
|
-0.282***
|
-0.328***
|
-0.328***
|
|
|
(0.085)
|
(0.085)
|
(0.101)
|
|
Producers
|
0.210***
|
0.210***
|
0.210***
|
|
|
(0.026)
|
(0.026)
|
(0.030)
|
|
Producers^2
|
-0.013***
|
-0.013***
|
-0.013***
|
|
|
(0.002)
|
(0.002)
|
(0.003)
|
|
Anime Age
|
0.113***
|
0.111***
|
0.111***
|
|
|
(0.019)
|
(0.019)
|
(0.019)
|
|
Anime Age^2
|
-0.009***
|
-0.009***
|
-0.009***
|
|
|
(0.001)
|
(0.001)
|
(0.001)
|
|
Children
|
-0.940***
|
-0.878***
|
-0.878***
|
|
|
(0.108)
|
(0.109)
|
(0.125)
|
|
All Ages
|
-0.993***
|
-0.974***
|
-0.974***
|
|
|
(0.116)
|
(0.115)
|
(0.143)
|
|
R 17+
|
0.393***
|
0.402***
|
0.402***
|
|
|
(0.060)
|
(0.060)
|
(0.059)
|
|
Mild Nudity
|
0.369***
|
0.369***
|
0.369***
|
|
|
(0.079)
|
(0.078)
|
(0.080)
|
|
Kyoto Animation
|
0.792***
|
0.864***
|
0.864***
|
|
|
(0.175)
|
(0.177)
|
(0.129)
|
|
A1 Pictures
|
0.432***
|
0.435***
|
0.435***
|
|
|
(0.093)
|
(0.092)
|
(0.096)
|
|
Bones
|
0.276**
|
0.279**
|
0.279**
|
|
|
(0.128)
|
(0.127)
|
(0.122)
|
|
Shin Ei Animation
|
-0.559**
|
-0.289
|
-0.289
|
|
|
(0.228)
|
(0.243)
|
(0.258)
|
|
Historical
|
-0.594***
|
-0.592***
|
-0.592***
|
|
|
(0.080)
|
(0.080)
|
(0.083)
|
|
Harem
|
0.442***
|
0.447***
|
0.447***
|
|
|
(0.083)
|
(0.083)
|
(0.074)
|
|
Music
|
-0.592***
|
-0.599***
|
-0.599***
|
|
|
(0.094)
|
(0.093)
|
(0.095)
|
|
Action
|
0.372***
|
0.382***
|
0.382***
|
|
|
(0.047)
|
(0.047)
|
(0.048)
|
|
Romance
|
0.363***
|
0.360***
|
0.360***
|
|
|
(0.052)
|
(0.051)
|
(0.051)
|
|
School
|
0.316***
|
0.315***
|
0.315***
|
|
|
(0.050)
|
(0.049)
|
(0.047)
|
|
Space
|
-0.487***
|
-0.479***
|
-0.479***
|
|
|
(0.140)
|
(0.139)
|
(0.132)
|
|
Psychological
|
0.390***
|
0.364***
|
0.364***
|
|
|
(0.101)
|
(0.101)
|
(0.094)
|
|
Supernatural
|
0.249***
|
0.235***
|
0.235***
|
|
|
(0.054)
|
(0.054)
|
(0.052)
|
|
Horror
|
0.314***
|
0.322***
|
0.322***
|
|
|
(0.120)
|
(0.119)
|
(0.116)
|
|
Fantasy
|
0.234***
|
0.226***
|
0.226***
|
|
|
(0.050)
|
(0.049)
|
(0.049)
|
|
Mecha
|
-0.224***
|
-0.250***
|
-0.250***
|
|
|
(0.086)
|
(0.085)
|
(0.087)
|
|
Sports
|
-0.252***
|
-0.239***
|
-0.239***
|
|
|
(0.086)
|
(0.086)
|
(0.090)
|
|
Game
|
-0.206**
|
-0.208**
|
-0.208*
|
|
|
(0.097)
|
(0.096)
|
(0.116)
|
|
Demons
|
-0.307***
|
-0.299***
|
-0.299***
|
|
|
(0.093)
|
(0.092)
|
(0.099)
|
|
Police
|
-0.393**
|
-0.453**
|
-0.453**
|
|
|
(0.185)
|
(0.199)
|
(0.185)
|
|
Shounen
|
0.117**
|
0.122**
|
0.122**
|
|
|
(0.055)
|
(0.055)
|
(0.061)
|
|
Light Novel
|
0.416***
|
0.420***
|
0.420***
|
|
|
(0.059)
|
(0.059)
|
(0.055)
|
|
Sanrio
|
-0.813***
|
-0.819***
|
-0.819***
|
|
|
(0.265)
|
(0.263)
|
(0.266)
|
|
Shueisha
|
0.224**
|
0.207**
|
0.207**
|
|
|
(0.088)
|
(0.088)
|
(0.081)
|
|
Toho Animation
|
0.280**
|
0.272**
|
0.272**
|
|
|
(0.125)
|
(0.124)
|
(0.111)
|
|
TBS
|
0.175**
|
0.166**
|
0.166*
|
|
|
(0.084)
|
(0.084)
|
(0.085)
|
|
Pony Canyon
|
0.152**
|
0.158**
|
0.158**
|
|
|
(0.075)
|
(0.074)
|
(0.078)
|
|
Shogakukan
|
-0.362***
|
-0.347***
|
-0.347**
|
|
|
(0.114)
|
(0.113)
|
(0.142)
|
|
Constant
|
39.778***
|
41.433***
|
41.433***
|
|
|
(7.918)
|
(7.867)
|
(8.322)
|
|
|
|
Observations
|
1,718
|
1,712
|
|
|
R2
|
0.710
|
0.712
|
|
|
Adjusted R2
|
0.703
|
0.705
|
|
|
Residual Std. Error
|
0.797 (df = 1677)
|
0.791 (df = 1671)
|
|
|
F Statistic
|
102.633*** (df = 40; 1677)
|
103.043*** (df = 40; 1671)
|
|
|
|
|
Note:
|
p<0.1; p<0.05; p<0.01
|
Model 1 is the first model I came up with. Model 2 shows the results after I dropped the high leverage observations and fixed the normality issues. Model 3 is Model 2 with robust standard errors. All 3 models are present in the table so you can see how the results change. The most important model is number 3 and therefore, when I refer to the results from now on, I will be talking about the coefficients of this model. Finally, it is necessary to point out that when I interpret a coefficient in the way: “this or that variable has an effect of X% on popularity”. These effects are always on average and keeping the rest of the variables constant. I find it a bit repetitive to have to write it every time I interpret a coefficient, so I prefer to make it clear here.
Findings
Score
It is possible to say that, in general terms, shows with a high score tend to be more popular. That being said, the data show us that there is a cubic relationship between the variables members and score. As you can see on the graph. The curve (in orange) goes down, back up, then back down again. Which means that for shows with very low scores one more point in the score has a negative effect on popularity. Then, for shows over 5.5 an increase in the score has a positive effect on popularity. Finally, for shows with a high score (over 8.4 or 8.5) the marginal effect of a point seems to flatten out.
Age
There is a quadratic relationship between the age of an anime and its popularity. Specifically, an additional year has a positive effect until 2014 (6 years), which makes sense, since shows need time to gain members. After 6 years the effect of an additional year becomes negative, which also makes sense, since intuition would tell us that old shows are less popular.
Producers
When it comes to the number of producers, the relationship with the variable members is also quadratic. Because the coefficient on producers is positive and the coefficient on producers ^2 is negative, this equation literally implies that, at low numbers of “producers”, an additional producer has a positive effect on log(members). At 8 producers, the effect becomes negative. The quadratic shape means that the semi-elasticity of producers with respect to members is decreasing as the number of producers increases.
Number of Episodes
While I was exploring the database looking for a relationship between the number of episodes and the member variable. I noticed that shows with more than 26 episodes seemed to be less popular. Therefore, I decided to create a dummy variable, which takes the value 1, for shows with more than 26 episodes and 0 for shows with 26 or fewer episodes. The results indicate that shows with more than 26 episodes are on average 33% less popular than shows with fewer episodes.
Rating
Anime under the categories “Children” and “All Ages” are on average 85% and 92% less popular than shows listed as PG-13. This perhaps has to do with the variable “members” being generated by users. Children, who are the target audience for these shows, probably don’t have MAL accounts, hence why they are less popular. In relation to the above, anime under the categories “Mild Nudity” and “R +17” are 40% and 36% more popular than those in the PG-13 category.
Anime Studios
There are 3 studios that have a positive impact on the popularity of a show. The first one is Kyoto Animation, on average, the shows animated by this studio are 86% more popular than the rest of the anime (without considering the anime produced by Bones, A1 Pictures and Shin Ei Animation, it is necessary to clarify this, since the anime studios in this model are a categorical variable and not a mere dummy variable). On the other hand, Bones has a positive effect of 28% while A.1 Pictures has one of 44%. Shin Ei Animation doesn’t seem to have a statistically significant effect.
These results make sense to me. Kyoto Animation is probably one of the best studios in terms of animation quality. Despite not animating many shows, it must be considered that during the past decade each anime they made was a commercial success, (Air, Kanon, Clannad, Lucky Star, Suzumiya Haruhi, K-On!).
Top 10 Most Popular Anime Made by Kyoto Animation .
| Clannad |
965840 |
2007 |
| Clannad: After Story |
806320 |
2008 |
| Chuunibyou demo Koi ga Shitai! |
791911 |
2012 |
| Hyouka |
778324 |
2012 |
| Violet Evergarden |
776039 |
2018 |
| Kyoukai no Kanata |
725282 |
2013 |
| Suzumiya Haruhi no Yuuutsu |
681322 |
2006 |
| K-On! |
671464 |
2009 |
| Kobayashi-san Chi no Maid Dragon |
619021 |
2017 |
| Nichijou |
557696 |
2011 |
On the other hand, Bones is perhaps one of the most important anime studios ever. Many of their “old” shows like Eureka Seven, Darker than Black, Ouran Koukou Host Club or Soul Eater, have many members. Also, as you can see in the table, they are animating Boku No Hero Academia, which is one of the most popular anime shows at the moment.
Top 10 Most Popular Anime Made by Bones.
| Fullmetal Alchemist: Brotherhood |
1844434 |
2009 |
| Boku no Hero Academia |
1465688 |
2016 |
| Noragami |
1270201 |
2014 |
| Boku no Hero Academia 2nd Season |
1236998 |
2017 |
| Soul Eater |
1067021 |
2008 |
| Boku no Hero Academia 3rd Season |
986716 |
2018 |
| Mob Psycho 100 |
965277 |
2016 |
| Noragami Aragoto |
858029 |
2015 |
| Ouran Koukou Host Club |
707578 |
2006 |
| Darker than Black: Kuro no Keiyakusha |
696411 |
2007 |
Finally, A-1 Pictures is the one that surprises me the least. In the past decade they became the powerhouse of anime production (Sword Art Online, Ao no Exorcist, Shigatsu wa Kimi no Uso, Fairy Tail, Nanatsu no Taizai). Between 2014 and 2016 they produced 10 or more television shows per year. Which is a very high figure comparatively. The only studio that has done something similar is JC Staff in 2012 and 2017.
Top 10 Most Popular Anime Made by A-1 Pictures
| Sword Art Online |
1864435 |
2012 |
| Ao no Exorcist |
1210116 |
2011 |
| Sword Art Online II |
1202263 |
2014 |
| Shigatsu wa Kimi no Uso |
1146702 |
2014 |
| Fairy Tail |
1137434 |
2009 |
| Nanatsu no Taizai |
1106646 |
2014 |
| Boku dake ga Inai Machi |
1087139 |
2016 |
| Ano Hi Mita Hana no Namae wo Bokutachi wa Mada Shiranai. |
963519 |
2011 |
| Kuroshitsuji |
755402 |
2008 |
| Darling in the FranXX |
709474 |
2018 |
As you can see on the boxplot behind, It is clear that these 3 studios animate shows that are more popular than the shows animated by the rest of the anime studios.
Genres
The genre of an anime is perhaps one of the most important elements in determining the popularity of a show. Surprisingly, the genre that has the highest positive effect on the member variable is Harem, on average a show of this type is 45% more popular than a show that is not listed as Harem. Other genres that have a positive effect on popularity are: Action, Romance, School, Psychological, Supernatural, Horror, Shounen and Fantasy.
The genres with the biggest negative effect are “Music” and “Historical”. A show with these genres is, on average, 59% less popular than a show that’s not listed as “Music” or “Historical”. The other genres that have a negative effect are Space, Mecha, Sports, Demons and Police. In the graph behind you can look at the popularity density distribution of some of the most influential genres. I picked the two genres with the highest negative and positive effect on popularity.
Source Material
Of all the sources, the only one that has a significant effect is light novel. If you don’t know what a light novel is read this. Light novels adaptations are on average 42% more popular than anime whose source material comes from another medium. I think this is partly due to the rise in popularity of Isekai in the last decade, as Isekai anime are predominantly adaptations of light novels. If you don’t know what an isekai anime is read this
Most Popular Light Novel Adaptations
| Sword Art Online |
1864435 |
2012 |
| No Game No Life |
1459578 |
2014 |
| Toradora! |
1287796 |
2008 |
| Sword Art Online II |
1202263 |
2014 |
| Re:Zero kara Hajimeru Isekai Seikatsu |
1177143 |
2016 |
| Another |
1049527 |
2012 |
| Kono Subarashii Sekai ni Shukufuku wo! |
1017264 |
2016 |
| Durarara!! |
983181 |
2010 |
| Fate/Zero |
938115 |
2011 |
| Bakemonogatari |
921784 |
2009 |
Producers
There are two producers that have a negative effect on popularity. The first one is Sanrio. Shows Sanrio is part of the production committee are on average 82% less popular than shows Sanrio is not part of the committee. From wikipedia: “Sanrio is a Japanese company that designs, licenses and produces products focusing on the kawaii (‘cute’) segment of Japanese popular culture”. The other producer that has a negative effect is the publisher Shogakukan, the shows in which Shogakukan is involved are on average 35% less popular than the shows in which this publisher is not on the production committee.
The producers Shueisha, Toho Animation, and Pony Canyon have a positive effect on popularity. Shows in which Shūeisha is involved are on average 21% more popular than the anime in which this publisher is not involved. This makes sense since this publisher publishes the Weekly Shōnen Jump magazine.
Top 10 Most Popular Anime Produced by Shueisha
| Death Note |
2116123 |
2006 |
| One Punch Man |
1702381 |
2015 |
| Tokyo Ghoul |
1526793 |
2014 |
| Boku no Hero Academia |
1465688 |
2016 |
| Hunter x Hunter (2011) |
1264941 |
2011 |
| Boku no Hero Academia 2nd Season |
1236998 |
2017 |
| Naruto: Shippuuden |
1222099 |
2007 |
| Ao no Exorcist |
1210116 |
2011 |
| Boku no Hero Academia 3rd Season |
986716 |
2018 |
| Ansatsu Kyoushitsu |
970173 |
2015 |
Here’s a boxplot with the most important manga/light novel publishers (Kadokawa,Kodansha,Shogakukan and Shueisha). As can be seen, Shueisha has the highest log(members) median. On the other hand Shogakukan has the lowest one.
The other two producers that have a positive effect are 1) Toho Animation, which is an animation studio and film distributor. 2) Pony Canyon, which according to wikipedia is: “a Japanese company, which publishes music, DVD and VHS videos, movies, and video games”. Toho Animation has a positive effect of 27% while Pony Canyon has an effect of 16%. Finally, the television company TBS does not seem to have a statistically significant effect on the popularity of an anime.
LS0tDQp0aXRsZTogIldoYXQgTWFrZXMgYW4gQW5pbWUgUG9wdWxhcj8gU3RhdGlzdGljYWwgQW5hbHlzaXMgVXNpbmcgTUFMIERhdGEiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICB0b2M6IHllcw0KLS0tDQoNCiMjIyBSZXN1bHRzDQoNCg0KMSkgU2NvcmUgKHdoaWNoIGlzIHVzZXIgZ2VuZXJhdGVkKSBoYXMgYSBzdHJvbmcgcmVsYXRpb25zaGlwIHdpdGggdGhlIHBvcHVsYXJpdHkgb2YgYSBzaG93LiBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgY3ViaWMgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdmFyaWFibGVzLg0KDQoyKSBUaGUgbnVtYmVyIG9mIHByb2R1Y2VycyBvbiB0aGUgY29tbWl0dGVlIGJvYXJkIG9mIGEgZ2l2ZW4gYW5pbWUgaGF2ZSBhIHF1YWRyYXRpYyByZWxhdGlvbnNoaXAgd2l0aCBtZW1iZXJzIChjb25jYXZlKS4gVGhlIHNhbWUgY2FuIGJlIHNhaWQgYWJvdXQgdGhlIGFnZSBvZiBhbiBhbmltZS4gDQoNCjMpIFJhdGluZyBhbHNvIGhhcyBhbiBpbXBhY3QuIEFuaW1lIHJhdGVkIGFzIENoaWxkcmVuIGFuZCBBbGwgQWdlcyBhcmUgbGVzcyBwb3B1bGFyIHRoYW4gYW5pbWUgd2l0aCBhIFBHIDEzIHJhdGluZy4gT24gdGhlIG90aGVyIGhhbmQsIHNob3dzIHJhdGVkIGFzIE1pbGQgTnVkaXR5IGFuZCBSICsxNyBhcmUgbW9yZSBwb3B1bGFyIHRoYW4gUEcgMTMgcmF0ZWQgYW5pbWUuDQoNCjQpIFNob3dzIGFuaW1hdGVkIGJ5IHN0dWRpb3M6IEt5b3RvIEFuaW1hdGlvbiwgQm9uZXMgb3IgQS0xIFBpY3R1cmVzIGFyZSBtb3JlIHBvcHVsYXIgdGhhbiBzaG93cyBhbmltYXRlZCBieSBvdGhlciBzdHVkaW9zLg0KDQo1KSBBbmltZSBnZW5yZXMgYXJlIHZlcnkgaW1wb3J0YW50IGFzIHdlbGw6IEhhcmVtLCBBY3Rpb24sIFJvbWFuY2UsIFNjaG9vbCwgUHN5Y2hvbG9naWNhbCwgU3VwZXJuYXR1cmFsLCAgU2hvdW5lbiwgSG9ycm9yLCBhbmQgRmFudGFzeSBoYXZlIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHBvcHVsYXJpdHkuIE9uIHRoZSBvdGhlciBoYW5kLCBIaXN0b3JpY2FsLCBNdXNpYywgU3BhY2UsIE1lY2hhLCBTcG9ydHMsIERlbW9ucyBhbmQgUG9saWNlIGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gcG9wdWxhcml0eS4NCg0KNikgTGlnaHQgTm92ZWwgYWRhcHRhdGlvbnMgYXJlIG1vcmUgcG9wdWxhciB0aGFuIG9yaWdpbmFsIGFuaW1lLCBhbmQgYW5pbWUgd2l0aCBhIGRpZmZlcmVudCBzb3VyY2UgbWF0ZXJpYWwgKE1hbmdhLCBWaXN1YWwgTm92ZWwsIEJvb2tzLCBldGMpLg0KDQo3KSBQcm9kdWNlcnMgU2FucmlvIGFuZCBTaG9nYWt1a2FuIGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gcG9wdWxhcml0eS4gT24gdGhlIG90aGVyIGhhbmQsIFNodWVzaGlhLCBUb2hvIEFuaW1hdGlvbiBhbmQgUG9ueSBDYW55b24gaGF2ZSBhIHBvc2l0aXZlIGltcGFjdCBvbiBwb3B1bGFyaXR5Lg0KDQo4KSBTaG93cyB3aXRoIG1vcmUgdGhhbiAyNiBlcGlzb2RlcyBhcmUgbGVzcyBwb3B1bGFyIHRoYW4gc2hvd3Mgd2l0aCBmZXdlciBlcGlzb2Rlcy4gDQoNCg0KIyMjIEludHJvDQoNCg0KQSBmZXcgbW9udGhzIGFnbyBJIHN0dW1ibGVkIHVwb24gYSB0dXRvcmlhbCBhYm91dCBob3cgdG8gZG8gd2ViIHNjcmFwaW5nIGluIFIuIFNvIGkgZGVjaWRlZCB0byB0cnkgb24gW015IEFuaW1lIExpc3QuXShodHRwczovL215YW5pbWVsaXN0Lm5ldC8pIFdoaWNoIGlzIGEgaHVnZSBhbmltZSBhbmQgbWFuZ2EgZGF0YWJhc2UuIFNvbWUgZGF0YSBvbiB0aGUgd2Vic2l0ZSBpcyB1c2VyLWdlbmVyYXRlZCwgbGlrZSB0aGUgc2NvcmVzIGFuZCByZXZpZXdzIGdpdmVuIHRvIGFuIGFuaW1lLiBNeSBnb2FsIHdhcyB0byBkaXNjb3ZlciB3aGF0IG1ha2VzIGFuIGFuaW1lIHBvcHVsYXIuIEluIHRlcm1zIG9mIG1ldGhvZG9sb2d5IEkgdXNlZCBsaW5lYXIgcmVncmVzc2lvbnMuIFdpdGggdGhhdCBpbiBtaW5kIEkgc2VsZWN0ZWQgYSBmZXcgZmVhdHVyZXM6IEdlbnJlcywgQW5pbWUgU3R1ZGlvLCBQcm9kdWNlcnMsIFJhdGluZywgaG93IG9sZCBhbiBhbmltZSBpcywgU291cmNlIE1hdGVyaWFsLCBOdW1iZXIgb2YgcHJvZHVjZXJzIChhcyBhIHByb3h5IG9mIGJ1ZGdldCkgYW5kIG51bWJlciBvZiBlcGlzb2Rlcy4gDQoNClRvIG1lYXN1cmUg4oCccG9wdWxhcml0eeKAnSBJIHVzZWQgdGhlIHZhcmlhYmxlIOKAnG1lbWJlcnMiIHdoaWNoIGlzIHRoZSBzdW0gb2YgdXNlcnMgdGhhdCBhcmUgY3VycmVudGx5IHdhdGNoaW5nIGEgc2hvdywgY29tcGxldGVkIGEgc2hvdywgaGF2ZSBhIHNob3cgb24taG9sZCwgZHJvcHBlZCBpdCBvciBhcmUgcGxhbm5pbmcgdG8gd2F0Y2ggYSBzaG93IGluIHRoZSBmdXR1cmUuIA0KDQoNCiMjIyBTZWxlY3RpbmcgT2JzZXJ2YXRpb25zDQoNCg0KRmlyc3QsIEkgZGVjaWRlZCB0byBvbmx5IGFuYWx5emUgdHYgc2hvd3MsIG5vdCBtb3ZpZXMsIG9uYXMgb3Igb3Zhcy4gU2Vjb25kLCBJIHBpY2tlZCBzaG93cyB3aG9zZSBlcGlzb2RlcyByYW4gbG9uZ2VyIHRoYW4gMTggbWludXRlcy4gVGhpcmQsIEkgb25seSBjb25zaWRlcmVkIHNob3dzIGZyb20gMjAwNSB0byB0aGUgc3ByaW5nIHNlYXNvbiBvZiAyMDIwLiBNeSBBbmltZUxpc3Qgd2FzIGxhdW5jaGVkIGF0IHRoZSBlbmQgb2YgMjAwNCwgc28gaXQgbWFrZXMgc2Vuc2UgdG8gc3RhcnQgaW4gMjAwNS4gSSBzY3JhcGVkIE1BTCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSAyMDIwIHN1bW1lciBzZWFzb24gc28gdGhhdCdzIHdoeSB0aGUgbmV3ZXN0IHNob3dzIGluIHRoZSBkYXRhYmFzZSBhcmUgZnJvbSB0aGUgc3ByaW5nIDIwMjAgc2Vhc29uLg0KDQpGb3IgZmVhdHVyZSBzZWxlY3Rpb24gSSB1c2VkIG15IGtub3dsZWRnZSBhYm91dCB0aGUgYW5pbWUgaW5kdXN0cnkgYW5kIEkgcmFuIGEgbG90IG9mIEFub3ZhIHRlc3RzIHRvIHNlbGVjdCB2YXJpYWJsZXMuIChJIGFsc28gcmFuIGEgbGFzc28gcmVncmVzc2lvbiwgYW5kIHBpY2tlZCB0aGUgdmFyaWFibGVzIHRoYXQgd2VyZSBub3QgZHJvcHBlZCBhcyBhIHN0YXJ0aW5nIHBvaW50KS4gSSBoYWQgdG8gZHJvcCB0aGUgZ2VucmUgRWNjaGkgYmVjYXVzZSBpdCBjcmVhdGVkIG11bHRpY29sbGluZWFyaXR5IHdpdGggdGhlIHJhdGluZ3MuIFNwZWNpZmljYWxseSB3aXRoIOKAnE1pbGQtTnVkaXR54oCdLg0KDQojIyMgTWV0aG9kb2xvZ3kNCg0KQWZ0ZXIgYSBsb3Qgb2YgdHJpYWxzIGFuZCBlcnJvcnMsIHRoaXMgaXMgdGhlIG1vZGVsIEkgY2FtZSBvdXQgd2l0aDoNCg0KKmxvZyhNZW1iZXJzKSA9ICDwnZu9MCArIPCdm70xIFNjb3JlICsg8J2bvTIgU2NvcmUg4oinIDIgKyDwnZu9MyBTY29yZSDiiKcgMyArIPCdm700ICBFcGkgKyDwnZu9NSBQcm9kdWNlcnMgKyDwnZu9NiBQcm9kdWNlcnMg4oinIDIgKyDwnZu9NyBBZ2UrIPCdm704IEFnZSDiiKcgMiArICDwnZu9OSBDaGlsZHJlbiArIPCdm70xMCBBbGwgQWdlcyArIPCdm70xMSBSIDE3ICsg8J2bvTEyIE1pbGQgTnVkaXR5ICsg8J2bvTEzIEt5b3RvIEFuaW1hdGlvbiArIPCdm70xNCBBIDEgUGljdHVyZXMgKyAg8J2bvTE1IEJvbmVzICsgIPCdm70xNiBTaGluLUVpIEFuaW1hdGlvbiArIPCdm70xNyBIaXN0b3JpY2FsICsg8J2bvTE4IEhhcmVtICsg8J2bvTE5ICBNdXNpYyArICDwnZu9MjAgQWN0aW9uICsgIPCdm70yMSBSb21hbmNlICsgIPCdm70yMiBTY2hvb2wgKyDwnZu9MjMgU3BhY2UgKyDwnZu9MjQgIFBzeWNob2xvZ2ljYWwgKyAg8J2bvTI1IFN1cGVybmF0dXJhbCvwnZu9MjYgIEhvcnJvciArIPCdm70yNyBGYW50YXN5ICsg8J2bvTI4IE1lY2hhICsgIPCdm70yOSBTcG9ydHMgKyAg8J2bvTMwIEdhbWUgKyDwnZu9MzEgRGVtb25zICsgIPCdm70zMiBQb2xpY2UgKyDwnZu9MzMgU2hvdW5lbiArIPCdm70zNCAgTGlnaHQubm92ZWwgKyDwnZu9MzUgU2FucmlvICsg8J2bvTM2IFNodWVpc2hhICsg8J2bvTM3IFRvaG8gQW5pbWF0aW9uICsg8J2bvTM4IFRCUyArIPCdm70zOSBQb255LkNhbnlvbiArIPCdm700MCBTaG9nYWt1a2FuICArICrwnZyADQoNCg0KTm93LCBJJ2xsIGdvIG92ZXIgdGhlIGNvZWZmaWNpZW50cy4gSXQgbWFrZXMgc2Vuc2UgdG8gc3RhcnQgd2l0aCB0aGUgb3V0Y29tZSB3ZSB3YW50IHRvIHVuZGVyc3RhbmQ6IHRoZSBtZW1iZXJzIHZhcmlhYmxlLg0KDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KDQpwbG90X2x5KHggPSB+bnVldm8zJG1lbWJlcnMxLCB0eXBlID0gImhpc3RvZ3JhbSIpJT4lIA0KICBsYXlvdXQodGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIE1lbWJlcnMnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIm1lbWJlcnMiKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJjb3VudCIpKQ0KDQpgYGANCg0KVGhlIGRhdGEgaXMgcmlnaHQtc2tld2VkOyB0aGVyZSBhcmUgbW9yZSDigJxub3QgdGhhdCBwb3B1bGFy4oCdIHNob3dzIHRoYW4gdmVyeSBwb3B1bGFyIG9uZXMuIFRoZSBtZWRpYW4gd2FzIDg5NDE4IGFuZCB0aGUgbW9zdCBwb3B1bGFyIHNob3cgaGFkIDIxMTYxMjMgbWVtYmVycy4gV2hlbiBtb2RlbGluZyB0aGlzIG91dGNvbWUsIGEgc3Ryb25nIGFyZ3VtZW50IGNhbiBiZSBtYWRlIHRoYXQgaXQgc2hvdWxkIGJlIGxvZy10cmFuc2Zvcm1lZC4gDQoNCkhlcmUncyB0aGUgdHJhbnNmb3JtZWQgZGF0YToNClwNCg0KYGBge3IsIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9NCwgZWNobz1GQUxTRSxjb2xsYXBzZT1UUlVFfQ0KDQoNCnBsb3RfbHkoeCA9IH5sb2cobnVldm8zJG1lbWJlcnMxKSwgdHlwZSA9ICJoaXN0b2dyYW0iKSU+JSANCiAgbGF5b3V0KHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBsb2coTWVtYmVycyknLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gImxvZyhtZW1iZXJzKSIpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gImNvdW50IikpDQoNCmBgYA0KDQpXaGlsZSBub3QgcGVyZmVjdCAobm93IGl0IGxvb2tzIGEgYml0IGxlZnQtc2tld2VkKSwgb3VyIG1vZGVsIHJlc3VsdHMgd2lsbCBwcm9iYWJseSBiZSBiZXR0ZXIuDQoNClNjb3JlIGlzIGEgdXNlci1nZW5lcmF0ZWQgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV2YWx1YXRpb24gb2YgTUFMIHVzZXJzIHRvd2FyZHMgYSBwYXJ0aWN1bGFyIGFuaW1lIGZyb20gMSB0byAxMC4gVGhlIG1lYW4gYW5kIG1lZGlhbiBhcmUgNy4yLiANClwNCg0KYGBge3IsIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9NCwgZWNobz1GQUxTRSxjb2xsYXBzZT1UUlVFfQ0KcGxvdF9seShvcGFjaXR5PTAuNSkgJT4lIA0KICBhZGRfbGluZXMoeD1+ZGVuc2l0eTEkeCx5PX5kZW5zaXR5MSR5ICklPiUgDQogIGxheW91dCh0aXRsZSA9ICdEZW5zaXR5IERpc3RyaWJ1dGlvbiBvZiBNQUwgU2NvcmUnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gInNjb3JlIiksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiZGVuc2l0eSIpKQ0KYGBgDQoNCkVwaSBpcyBhIGR1bW15IHZhcmlhYmxlIHdoaWNoIHRha2VzIHRoZSB2YWx1ZSAxIGZvciBzaG93cyB3aXRoIG1vcmUgdGhhbiAyNiBlcGlzb2RlcyBhbmQgMCBmb3Igc2hvd3Mgd2l0aCAyNiBvciBmZXdlciBlcGlzb2Rlcy4gUHJvZHVjZXJzIGlzIHRoZSBudW1iZXIgb2YgcHJvZHVjZXJzIG9uIHRoZSBjb21taXR0ZWUgYm9hcmQgb2YgYSBnaXZlbiBhbmltZS4gQWdlIGlzIGhvdyBvbGQgYW4gYW5pbWUgaXMgKGluIHllYXJzKS4gRm9yIGV4YW1wbGUsIDAgbWVhbnMgMjAyMCBhbmQgMTUgbWVhbnMgMjAwNS4gSGVyZSdzIHRoZSBudW1iZXIgb2Ygc2hvd3MgYW5pbWF0ZWQgYnkgeWVhci4NClwNCg0KYGBge3IsZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQoNCm51ZXZvMyAlPiUgY291bnQoeWVhcjEpICU+JSANCnBsb3RfbHkoIHggPSB+IHllYXIxLCB5ID0gfm4sIG5hbWUgPSAndHJhY2UgMCcsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnKSAlPiUgDQogIGxheW91dCh0aXRsZSA9ICdBbmltZSBUViBTaG93cyBmcm9tIDIwMDUgdG8gU3ByaW5nIDIwMjAnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlllYXIiKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOdW1iZXIgb2Ygc2hvd3MiKSkNCg0KYGBgDQoNCkNoaWxkcmVuLCBBbGwgQWdlcywgUiAxNysgeSBNaWxkIE51ZGl0eSBhcmUgcGFydCBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgcmF0aW5nLiBUaGUgcmVmZXJlbmNlIGxldmVsIGlzIHRoZSBQRy0xMyBjYXRlZ29yeS4gQS0xIFBpY3R1cmVzLCBCb25lcywgS3lvdG8gQW5pbWF0aW9uIGFuZCBTaGluIEVpIEFuaW1hdGlvbiBhcmUgZHVtbXkgdmFyaWFibGVzIGZvciB0aG9zZSBzdHVkaW9zLiBBbHNvLCBJIG1hZGUgZHVtbXkgdmFyaWFibGVzIGZvciB0aGUgc3R1ZGlvczogCQ0KDQpUb2VpIEFuaW1hdGlvbiwgU3VucmlzZSwgSi5DIFN0YWZmLCBNYWRob3VzZSwgVE1TIEVudGVydGFpbm1lbnQsIFByb2R1Y3Rpb24uSS5HLCBTdHVkaW8uRGVlbiwgU3R1ZGlvLlBpZXJyb3QsIE9MTSwgTmlwcG9uLkFuaW1hdGlvbiwgRExFLCBUYXRzdW5va28uUHJvZHVjdGlvbiwgR29uem8sIFhlYmVjLCBBSUMsIFNoYWZ0LCBCcmFpbi5CYXNlLCB1Zm90YWJsZSwgR2FpbmF4IGFuZCBmZWVsLiANCg0KVGhleSB3ZXJlIG5vdCBjb25zaWRlcmVkIGluIHRoZSBmaW5hbCBtb2RlbCwgYmVjYXVzZSB0aGUgYW5vdmEgdGVzdHMgdGhhdCBJIGNhcnJpZWQgb3V0IHJlcG9ydGVkIHRoYXQgdGhlc2Ugc3R1ZGlvcyBkaWQgbm90IGNvbnRyaWJ1dGUgc3RhdGlzdGljYWxseSB0byB0aGUgbW9kZWwuDQoNClRoZSBjb2VmZmljaWVudHMgZnJvbSDwnZu9MTcgdG8g8J2bvTMzIGFyZSBkdW1teSB2YXJpYWJsZXMgZm9yIGFuaW1lIGdlbnJlcy4gSXQgaXMgbmVjZXNzYXJ5IHRvIG1lbnRpb24gdGhhdCBhcyB3aXRoIGFuaW1lIHN0dWRpb3MsIEkgY3JlYXRlZCB2YXJpYWJsZXMgZm9yIG1hbnkgZ2VucmVzIHRoYXQgd2VyZSBub3QgY29uc2lkZXJlZCBpbiB0aGUgZmluYWwgbW9kZWwgYmVjYXVzZSB0aGV5IGRpZCBub3QgY29udHJpYnV0ZSBzdGF0aXN0aWNhbGx5IHRvIG91ciBtb2RlbDogQW1vbmcgdGhlIGdlbnJlcyBkcm9wcGVkIGFyZToNCg0KQ29tZWR5LCBBZHZlbnR1cmUsIFNsaWNlIG9mIExpZmUsIERyYW1hLCBTY2kgRmksIE15c3RlcnksIFNlaW5lbiwgTWFydGlhbCBBcnRzLCBTYW11cmFpLCBTaG91am8sIFNob3VqbyBBaSwgU2hvdW5lbiBBaSwgSm9zZWksIFZhbXBpcmUsIE1pbGl0YXJ5LCBEZW1vbnMsIE1hZ2ljIGFuZCBUaHJpbGxlcg0KDQpMaWdodCBOb3ZlbCBpcyBhIHZhcmlhYmxlIHdoaWNoIHRha2VzIHRoZSB2YWx1ZSAxLCB3aGVuIHRoZSBzb3VyY2UgbWF0ZXJpYWwgb2YgYSBzaG93IGlzIGEgbGlnaHQgbm92ZWwgYW5kIDAgZm9yIGFuaW1lIHdpdGggYSBkaWZmZXJlbnQgc291cmNlLiBGaW5hbGx5LCBmcm9tIPCdm70zNSB0byDwnZu9NDAgY29ycmVzcG9uZCB0byBkdW1teSB2YXJpYWJsZXMgZm9yIGRpZmZlcmVudCBhbmltZSBwcm9kdWN0aW9uIGNvbXBhbmllcy4gQXMgd2l0aCBnZW5yZXMgYW5kIHN0dWRpb3MsIHRoZXJlIHdlcmUgbWFueSBwcm9kdWNlcnMgd2hvIHdlcmUgaW5pdGlhbGx5IGNvbnNpZGVyZWQgYnV0IHdlcmUgZHJvcHBlZCBmb3IgdGhlIHNhbWUgcmVhc29ucy4gQW1vbmcgdGhlbSB3ZXJlOg0KDQpLb2RhbnNoYSwgQmFuZGFpLCBTcXVhcmUgRW5peCwgS2Fkb2thd2EsIEFuaXBsZXgsIE5ISywgVFYgVG9reW8sIFRWIEFzYWhpLCBGdWppIFRWLCBHYWtrZW4sIERlbnRzdSwgTWVkaWEgRmFjdG9yeSwgTGFudGlzLCBLbG9ja1dvcngsIEZyb250aWVyIFdvcmtzLCBmbHlpbmcgRE9HLCBOaXBwb24gVGVsZXZpc2lvbiBOZXR3b3JrLCBTaG93Z2F0ZSwgU3RhcmNoaWxkIFJlY29yZHMsIFNvbnkgTXVzaWMgeSBWQVAuDQoNClRoZXJlIHdlcmUgc29tZSBpbmZsdWVudGlhbCBvYnNlcnZhdGlvbnMgc28gSSBkZWNpZGVkIHRvIGVsaW1pbmF0ZSB0aGVtIG9uZSBieSBvbmUgdW50aWwgdGhlcmUgd2VyZSBubyBtb3JlIHNob3dzIHdpdGggaGlnaCBsZXZlcmFnZS4gVGhlIGFuaW1lIGludm9sdmVkIGluIHRoZSBwcm9jZXNzIHdlcmU6IOKAnE5haWtha3UgS2Vucnlva3UgSGFuemFpIEt5b3VzZWkgVG9yaXNoaW1hcmlrYW4gWmFpemVuIEpvdXRhcm914oCdLCDigJxEZWF0aCBOb3Rl4oCdLCDigJ1LYWl0b3UgSm9rZXIgNHRoIFNlYXNvbuKAnSwg4oCcQWN0aXZlIFJhaWQ6IEtpZG91IEt5b3VzaHV1c2hpdHN1IERhaSBIYWNoaSBHYWthcmnigJ0gYW5kIOKAnFRzdXJ1bmU6IEthemVtYWkgS291a291IEt5dXVkb3VideKAnS4NCg0KQWZ0ZXIgZG9pbmcgdGhpcyBpdCBpcyBwb3NzaWJsZSB0byBwb2ludCBvdXQgdGhhdCB0aGUgbW9zdCBpbXBvcnRhbnQgY2hhbmdlIGlzIHRoYXQgdGhlIFNoaW4gRWkgYW5pbWF0aW9uIGNvZWZmaWNpZW50IGlzIG5vIGxvbmdlciBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHNpZ25pZmljYW50IGluY3JlYXNlcyBpbiB0aGUgaW1wYWN0IG9mIGNlcnRhaW4gdmFyaWFibGVzIHN1Y2ggYXMgIlBvbGljZSIgYW5kICJLeW90byBBbmltYXRpb24iDQoNCkkgcmFuIGEgU2hhcGlybyB0ZXN0IHRvIGFzc2VzcyBub3JtYWxpdHkuIEFuZCB0aGVyZSB3YXNu4oCZdCBub3JtYWxpdHkuIFNvIEkgZGVjaWRlZCB0byB3aW5zb3JpemUgdGhlIGRhdGEuIFRoZXJlIHdlcmUgMjQgYW5pbWUgaW52b2x2ZWQgaW4gdGhlIHByb2Nlc3MsIGFsbCBvZiB0aGVtIGhhZCBsZXNzIHRoYW4gMTcwMCBtZW1iZXJzLiBMYXN0bHksIEkgZGVjaWRlZCB0byBydW4gdGhlIG1vZGVsIHdpdGggcm9idXN0IHN0YW5kYXJkIGVycm9ycyBiZWNhdXNlIEkgZGV0ZWN0ZWQgaGV0ZXJvc2NlZGFzdGljaXR5LiANCg0KYGBge3IgdGFibGUsIHJlc3VsdHMgPSAiYXNpcyIsIGVjaG89RkFMU0UsY29sbGFwc2U9RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0Kc3RhcmdhemVyKG1vZGVsbzgsbW9kZWxvMTkscm9idXN0byx0eXBlPSJodG1sIiwNCiAgICAgICAgICB0aXRsZT0iVW5kZXJzdGFuZGluZyBBbmltZSBQb3B1bGFyaXR5IiwNCiAgICAgICAgICBkZXAudmFyLmxhYmVscy5pbmNsdWRlID0gRkFMU0UsDQogICAgICAgICAgZGVwLnZhci5jYXB0aW9uICA9ICJEZXBlbmRlbnQgVmFyaWFibGU6IExvZyAoTWVtYmVycykiLA0KICAgICAgICAgIG1vZGVsLm51bWJlcnMgPSBGQUxTRSwNCiAgICAgICAgICBtb2RlbC5uYW1lcyA9IEZBTFNFLA0KICAgICAgICAgIGNvbHVtbi5sYWJlbHMgPSBjKCJNb2RlbCAxIiwiTW9kZWwgMiIsIk1vZGVsIDMiKSwNCiAgICAgICAgICBjb3ZhcmlhdGUubGFiZWxzPWMoIlNjb3JlIiwiU2NvcmVcXF4yIiwiU2NvcmVcXF4zIiwiRXBpc29kZSIsICJQcm9kdWNlcnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZHVjZXJzXFxeMiIsIkFuaW1lIEFnZSIsIkFuaW1lIEFnZVxcXjIiLCJDaGlsZHJlbiIsIkFsbCBBZ2VzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlIgMTcrIiwiTWlsZCBOdWRpdHkiLCJLeW90byBBbmltYXRpb24iLCAiQTEgUGljdHVyZXMiLCJCb25lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGluIEVpIEFuaW1hdGlvbiIsIkhpc3RvcmljYWwiLCJIYXJlbSIsIk11c2ljIiwiQWN0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvbWFuY2UiLCJTY2hvb2wiLCJTcGFjZSIsIlBzeWNob2xvZ2ljYWwiLCJTdXBlcm5hdHVyYWwiLCJIb3Jyb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFudGFzeSIsIk1lY2hhIiwiU3BvcnRzIiwiR2FtZSIsIkRlbW9ucyIsIlBvbGljZSIsIlNob3VuZW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGlnaHQgTm92ZWwiLCJTYW5yaW8iLCJTaHVlaXNoYSIsIlRvaG8gQW5pbWF0aW9uIiwiVEJTIiwiUG9ueSBDYW55b24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2hvZ2FrdWthbiIpLA0KICAgICAgICAgIG91dD0idGFibGUxLmh0bWwiLCANCiAgICAgICAgICBhbGlnbj1UUlVFLA0KICAgICAgICAgIG5vLnNwYWNlPVRSVUUpDQpgYGANClwNCg0KTW9kZWwgMSBpcyB0aGUgZmlyc3QgbW9kZWwgSSBjYW1lIHVwIHdpdGguIE1vZGVsIDIgc2hvd3MgdGhlIHJlc3VsdHMgYWZ0ZXIgSSBkcm9wcGVkIHRoZSBoaWdoIGxldmVyYWdlIG9ic2VydmF0aW9ucyBhbmQgZml4ZWQgdGhlIG5vcm1hbGl0eSBpc3N1ZXMuIE1vZGVsIDMgaXMgTW9kZWwgMiB3aXRoIHJvYnVzdCBzdGFuZGFyZCBlcnJvcnMuIEFsbCAzIG1vZGVscyBhcmUgcHJlc2VudCBpbiB0aGUgdGFibGUgc28geW91IGNhbiBzZWUgaG93IHRoZSByZXN1bHRzIGNoYW5nZS4gIFRoZSBtb3N0IGltcG9ydGFudCAgbW9kZWwgaXMgbnVtYmVyIDMgYW5kIHRoZXJlZm9yZSwgd2hlbiBJIHJlZmVyIHRvIHRoZSByZXN1bHRzIGZyb20gbm93IG9uLCBJIHdpbGwgYmUgdGFsa2luZyBhYm91dCB0aGUgY29lZmZpY2llbnRzIG9mIHRoaXMgbW9kZWwuIEZpbmFsbHksIGl0IGlzIG5lY2Vzc2FyeSB0byBwb2ludCBvdXQgdGhhdCB3aGVuIEkgaW50ZXJwcmV0IGEgY29lZmZpY2llbnQgaW4gdGhlIHdheTogIOKAnHRoaXMgb3IgdGhhdCB2YXJpYWJsZSBoYXMgYW4gZWZmZWN0IG9mIFglIG9uIHBvcHVsYXJpdHnigJ0uIFRoZXNlIGVmZmVjdHMgYXJlIGFsd2F5cyBvbiBhdmVyYWdlIGFuZCBrZWVwaW5nIHRoZSByZXN0IG9mIHRoZSB2YXJpYWJsZXMgY29uc3RhbnQuIEkgZmluZCBpdCBhIGJpdCByZXBldGl0aXZlIHRvIGhhdmUgdG8gd3JpdGUgaXQgZXZlcnkgdGltZSBJIGludGVycHJldCBhIGNvZWZmaWNpZW50LCBzbyBJIHByZWZlciB0byBtYWtlIGl0IGNsZWFyIGhlcmUuDQoNCiMjIyBGaW5kaW5ncw0KDQojIyMjIFNjb3JlDQoNCkl0IGlzIHBvc3NpYmxlIHRvIHNheSB0aGF0LCBpbiBnZW5lcmFsIHRlcm1zLCBzaG93cyB3aXRoIGEgaGlnaCBzY29yZSB0ZW5kIHRvIGJlIG1vcmUgcG9wdWxhci4gVGhhdCBiZWluZyBzYWlkLCB0aGUgZGF0YSBzaG93IHVzIHRoYXQgdGhlcmUgaXMgYSBjdWJpYyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdmFyaWFibGVzIG1lbWJlcnMgYW5kIHNjb3JlLiBBcyB5b3UgY2FuIHNlZSBvbiB0aGUgZ3JhcGguIFRoZSBjdXJ2ZSAoaW4gb3JhbmdlKSBnb2VzIGRvd24sIGJhY2sgdXAsIHRoZW4gYmFjayBkb3duIGFnYWluLiBXaGljaCBtZWFucyB0aGF0IGZvciBzaG93cyB3aXRoIHZlcnkgbG93IHNjb3JlcyBvbmUgbW9yZSBwb2ludCBpbiB0aGUgc2NvcmUgaGFzIGEgbmVnYXRpdmUgZWZmZWN0IG9uIHBvcHVsYXJpdHkuIFRoZW4sIGZvciBzaG93cyBvdmVyIDUuNSBhbiBpbmNyZWFzZSBpbiB0aGUgc2NvcmUgaGFzIGEgcG9zaXRpdmUgZWZmZWN0IG9uIHBvcHVsYXJpdHkuIEZpbmFsbHksIGZvciBzaG93cyB3aXRoIGEgaGlnaCBzY29yZSAob3ZlciA4LjQgb3IgOC41KSB0aGUgbWFyZ2luYWwgZWZmZWN0IG9mIGEgcG9pbnQgc2VlbXMgdG8gZmxhdHRlbiBvdXQuIA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCmZpZyA8LXBsb3RfbHkoZGF0YSA9IG51ZXZvMywgeCA9IH5zY29yZSwgeSA9IH5sb2cobWVtYmVyczEpLGhvdmVyaW5mbyA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiTmFtZToiLG5hbWUsIjxicj4iLCJTY29yZToiLCBzY29yZSwgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtYmVyczoiLHJvdW5kKGxvZyhtZW1iZXJzMSksZGlnaXRzID0gMikpKQ0KDQpmaWcgJT4lIGxheW91dCh0aXRsZSA9ICdNQUwgTWVtYmVycyB2cy4gTUFMIFNjb3JlJywNCiAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJsb2cobWVtYmVycykiKSwNCiAgICAgICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJzY29yZSIpKSAlPiUNCiAgYWRkX21hcmtlcnMoc2hvd2xlZ2VuZCA9IEZBTFNFKSU+JQ0KICBhZGRfbGluZXMoeSA9IH5maXR0ZWQobTEpLCBuYW1lID0iUG9seW5vbWlhbCIpDQoNCmBgYA0KDQojIyMjIEFnZQ0KDQpUaGVyZSBpcyBhIHF1YWRyYXRpYyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgYWdlIG9mIGFuIGFuaW1lIGFuZCBpdHMgcG9wdWxhcml0eS4gU3BlY2lmaWNhbGx5LCBhbiBhZGRpdGlvbmFsIHllYXIgaGFzIGEgcG9zaXRpdmUgZWZmZWN0IHVudGlsIDIwMTQgKDYgeWVhcnMpLCB3aGljaCBtYWtlcyBzZW5zZSwgc2luY2Ugc2hvd3MgbmVlZCB0aW1lIHRvIGdhaW4gbWVtYmVycy4gQWZ0ZXIgNiB5ZWFycyB0aGUgZWZmZWN0IG9mIGFuIGFkZGl0aW9uYWwgeWVhciBiZWNvbWVzIG5lZ2F0aXZlLCB3aGljaCBhbHNvIG1ha2VzIHNlbnNlLCBzaW5jZSBpbnR1aXRpb24gd291bGQgdGVsbCB1cyB0aGF0IG9sZCBzaG93cyBhcmUgbGVzcyBwb3B1bGFyLg0KDQpgYGB7ciAsIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9NCwgZWNobz1GQUxTRSxjb2xsYXBzZT1UUlVFfQ0KbTIgPC0gbG0obG9nKG1lbWJlcnMxKSB+IHBvbHkoZWRhZCwgMiksIGRhdGEgPSBudWV2bzMpDQoNCmZpZyA8LXBsb3RfbHkoZGF0YSA9IG51ZXZvMywgeCA9IH5lZGFkLCB5ID0gfmxvZyhtZW1iZXJzMSksaG92ZXJpbmZvID0gInRleHQiLA0KICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJOYW1lOiIsbmFtZSwiPGJyPiIsIkFnZToiLCBlZGFkLCAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZW1iZXJzOiIscm91bmQobG9nKG1lbWJlcnMxKSxkaWdpdHMgPSAyKSkpDQoNCmZpZyAlPiUgbGF5b3V0KHRpdGxlID0gJ01BTCBNZW1iZXJzIHZzLiBBbmltZSBBZ2UnLA0KICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gImxvZyAobWVtYmVycykiKSwNCiAgICAgICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBZ2UiKSkgJT4lDQogIGFkZF9tYXJrZXJzKHNob3dsZWdlbmQgPSBGQUxTRSklPiUNCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKG0yKSwgbmFtZSA9IlBvbHlub21pYWwiKQ0KYGBgDQoNCg0KIyMjIyBQcm9kdWNlcnMNCg0KV2hlbiBpdCBjb21lcyB0byB0aGUgbnVtYmVyIG9mIHByb2R1Y2VycywgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSB2YXJpYWJsZSBtZW1iZXJzIGlzIGFsc28gcXVhZHJhdGljLiBCZWNhdXNlIHRoZSBjb2VmZmljaWVudCBvbiBwcm9kdWNlcnMgaXMgcG9zaXRpdmUgYW5kIHRoZSBjb2VmZmljaWVudCBvbiBwcm9kdWNlcnMgXjIgaXMgbmVnYXRpdmUsIHRoaXMgZXF1YXRpb24gbGl0ZXJhbGx5IGltcGxpZXMgdGhhdCwgYXQgbG93IG51bWJlcnMgb2Yg4oCccHJvZHVjZXJz4oCdLCBhbiBhZGRpdGlvbmFsIHByb2R1Y2VyIGhhcyBhIHBvc2l0aXZlIGVmZmVjdCBvbiBsb2cobWVtYmVycykuIEF0IDggcHJvZHVjZXJzLCB0aGUgZWZmZWN0IGJlY29tZXMgbmVnYXRpdmUuIFRoZSBxdWFkcmF0aWMgc2hhcGUgbWVhbnMgdGhhdCB0aGUgc2VtaS1lbGFzdGljaXR5IG9mIHByb2R1Y2VycyB3aXRoIHJlc3BlY3QgdG8gbWVtYmVycyBpcyBkZWNyZWFzaW5nIGFzIHRoZSBudW1iZXIgb2YgcHJvZHVjZXJzIGluY3JlYXNlcy4gDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KZmlnIDwtcGxvdF9seShkYXRhID0gbnVldm8zLCB4ID0gfnByb2R1Y2VycywgeSA9IH5sb2cobWVtYmVyczEpLGhvdmVyaW5mbyA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiTmFtZToiLG5hbWUsIjxicj4iLCJQcm9kdWNlcnM6IiwgcHJvZHVjZXJzLCAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZW1iZXJzOiIscm91bmQobG9nKG1lbWJlcnMxKSxkaWdpdHMgPSAyKSkpDQoNCmZpZyAlPiUgbGF5b3V0KHRpdGxlID0gJ01BTCBNZW1iZXJzIHZzLiBOdW1iZXIgb2YgcHJvZHVjZXJzIHBlciBBbmltZScsDQogICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAibG9nKG1lbWJlcnMpIiksDQogICAgICAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAicHJvZHVjZXJzIikpICU+JQ0KICBhZGRfbWFya2VycyhzaG93bGVnZW5kID0gRkFMU0UpJT4lDQogIGFkZF9saW5lcyh5ID0gfmZpdHRlZChtMyksbmFtZSA9IlBvbHlub21pYWwiKQ0KDQpgYGANCg0KIyMjIyBOdW1iZXIgb2YgRXBpc29kZXMNCg0KV2hpbGUgSSB3YXMgZXhwbG9yaW5nIHRoZSBkYXRhYmFzZSBsb29raW5nIGZvciBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgZXBpc29kZXMgYW5kIHRoZSBtZW1iZXIgdmFyaWFibGUuIEkgbm90aWNlZCB0aGF0IHNob3dzIHdpdGggbW9yZSB0aGFuIDI2IGVwaXNvZGVzIHNlZW1lZCB0byBiZSBsZXNzIHBvcHVsYXIuIFRoZXJlZm9yZSwgSSBkZWNpZGVkIHRvIGNyZWF0ZSBhIGR1bW15IHZhcmlhYmxlLCB3aGljaCB0YWtlcyB0aGUgdmFsdWUgMSwgZm9yIHNob3dzIHdpdGggbW9yZSB0aGFuIDI2IGVwaXNvZGVzIGFuZCAwIGZvciBzaG93cyB3aXRoIDI2IG9yIGZld2VyIGVwaXNvZGVzLiBUaGUgcmVzdWx0cyBpbmRpY2F0ZSB0aGF0IHNob3dzIHdpdGggbW9yZSB0aGFuIDI2IGVwaXNvZGVzIGFyZSBvbiBhdmVyYWdlIDMzJSBsZXNzIHBvcHVsYXIgdGhhbiBzaG93cyB3aXRoIGZld2VyIGVwaXNvZGVzLg0KDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KDQpwbG90X2x5KG9wYWNpdHk9MC41KSAlPiUgDQogIGFkZF9saW5lcyh4PX5kZW5zaXR5MSR4LHk9fmRlbnNpdHkxJHksbmFtZT0iU2hvd3Mgd2l0aCBtb3JlIHRoYW4gMjYgZXBpc29kZXMiKSAlPiUgDQogIGFkZF9saW5lcyh4PX5kZW5zaXR5MiR4LHk9fmRlbnNpdHkyJHksbmFtZT0iU2hvd3Mgd2l0aCBsZXNzIHRoYW4gMjYgZXBpc29kZXMiKSAlPiUgDQpsYXlvdXQodGl0bGUgPSAnRGVuc2l0eSBEaXN0cmlidXRpb24nLA0KICAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAibG9nKG1lbWJlcnMpIiksDQogICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJkZW5zaXR5IikpDQoNCg0KYGBgDQoNCiMjIyMgUmF0aW5nDQoNCkFuaW1lIHVuZGVyIHRoZSBjYXRlZ29yaWVzICJDaGlsZHJlbiIgYW5kICJBbGwgQWdlcyIgYXJlIG9uIGF2ZXJhZ2UgODUlIGFuZCA5MiUgbGVzcyBwb3B1bGFyIHRoYW4gc2hvd3MgbGlzdGVkIGFzIFBHLTEzLiBUaGlzIHBlcmhhcHMgaGFzIHRvIGRvIHdpdGggdGhlIHZhcmlhYmxlICJtZW1iZXJzIiBiZWluZyBnZW5lcmF0ZWQgYnkgdXNlcnMuIENoaWxkcmVuLCB3aG8gYXJlIHRoZSB0YXJnZXQgYXVkaWVuY2UgZm9yIHRoZXNlIHNob3dzLCBwcm9iYWJseSBkb24ndCBoYXZlIE1BTCBhY2NvdW50cywgaGVuY2Ugd2h5IHRoZXkgYXJlIGxlc3MgcG9wdWxhci4gSW4gcmVsYXRpb24gdG8gdGhlIGFib3ZlLCBhbmltZSB1bmRlciB0aGUgY2F0ZWdvcmllcyAiTWlsZCBOdWRpdHkiIGFuZCAiUiArMTciIGFyZSA0MCUgYW5kIDM2JSBtb3JlIHBvcHVsYXIgdGhhbiB0aG9zZSBpbiB0aGUgUEctMTMgY2F0ZWdvcnkuDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KDQpwbG90X2x5KCkgJT4lIA0KICBhZGRfdHJhY2UoZGF0YSA9IG51ZXZvMywNCiAgICAgICAgICAgIHkgPSB+bG9nKG1lbWJlcnMxKSwNCiAgICAgICAgICAgIGNvbG9yID0gflgyLjQsDQogICAgICAgICAgICB0eXBlID0gImJveCIpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gIk1BTCBNZW1iZXJzIHBlciBSYXRpbmciLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gInJhdGluZyIpKSANCg0KDQoNCmBgYA0KDQojIyMjIEFuaW1lIFN0dWRpb3MNCg0KVGhlcmUgYXJlIDMgc3R1ZGlvcyB0aGF0IGhhdmUgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gdGhlIHBvcHVsYXJpdHkgb2YgYSBzaG93LiBUaGUgZmlyc3Qgb25lIGlzIEt5b3RvIEFuaW1hdGlvbiwgb24gYXZlcmFnZSwgdGhlIHNob3dzIGFuaW1hdGVkIGJ5IHRoaXMgc3R1ZGlvIGFyZSA4NiUgbW9yZSBwb3B1bGFyIHRoYW4gdGhlIHJlc3Qgb2YgdGhlIGFuaW1lICh3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBhbmltZSBwcm9kdWNlZCBieSBCb25lcywgQTEgUGljdHVyZXMgYW5kIFNoaW4gRWkgQW5pbWF0aW9uLCBpdCBpcyBuZWNlc3NhcnkgdG8gY2xhcmlmeSB0aGlzLCBzaW5jZSB0aGUgYW5pbWUgc3R1ZGlvcyBpbiB0aGlzIG1vZGVsIGFyZSBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGFuZCBub3QgYSBtZXJlIGR1bW15IHZhcmlhYmxlKS4gT24gdGhlIG90aGVyIGhhbmQsIEJvbmVzIGhhcyBhIHBvc2l0aXZlIGVmZmVjdCBvZiAyOCUgd2hpbGUgQS4xIFBpY3R1cmVzIGhhcyBvbmUgb2YgNDQlLiBTaGluIEVpIEFuaW1hdGlvbiBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0Lg0KDQpUaGVzZSByZXN1bHRzIG1ha2Ugc2Vuc2UgdG8gbWUuIEt5b3RvIEFuaW1hdGlvbiBpcyBwcm9iYWJseSBvbmUgb2YgdGhlIGJlc3Qgc3R1ZGlvcyBpbiB0ZXJtcyBvZiBhbmltYXRpb24gcXVhbGl0eS4gRGVzcGl0ZSBub3QgYW5pbWF0aW5nIG1hbnkgc2hvd3MsIGl0IG11c3QgYmUgY29uc2lkZXJlZCB0aGF0IGR1cmluZyB0aGUgcGFzdCBkZWNhZGUgZWFjaCBhbmltZSB0aGV5IG1hZGUgd2FzIGEgY29tbWVyY2lhbCBzdWNjZXNzLCAoQWlyLCBLYW5vbiwgQ2xhbm5hZCwgTHVja3kgU3RhciwgU3V6dW1peWEgSGFydWhpLCBLLU9uISkuDQoNCmBgYHtyIHRhYmxlcywgZWNobz1GQUxTRSxjb2xsYXBzZT1UUlVFfQ0KDQprYWJsZShLeW90by5BbmltYXRpb25bMToxMCxdLCBjb2wubmFtZXM9YygiQW5pbWUiLCJNZW1iZXJzIiwiWWVhciIpLGFsaWduPSJsY2MiLGNhcHRpb24gPSAiVG9wIDEwIE1vc3QgUG9wdWxhciBBbmltZSBNYWRlIGJ5IEt5b3RvIEFuaW1hdGlvbiAuIikNCg0KYGBgDQoNCg0KT24gdGhlIG90aGVyIGhhbmQsIEJvbmVzIGlzIHBlcmhhcHMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBhbmltZSBzdHVkaW9zIGV2ZXIuIE1hbnkgb2YgdGhlaXIgIm9sZCIgc2hvd3MgbGlrZSBFdXJla2EgU2V2ZW4sIERhcmtlciB0aGFuIEJsYWNrLCBPdXJhbiBLb3Vrb3UgSG9zdCBDbHViIG9yIFNvdWwgRWF0ZXIsIGhhdmUgbWFueSBtZW1iZXJzLiBBbHNvLCBhcyB5b3UgY2FuIHNlZSBpbiB0aGUgdGFibGUsIHRoZXkgYXJlIGFuaW1hdGluZyBCb2t1IE5vIEhlcm8gQWNhZGVtaWEsIHdoaWNoIGlzIG9uZSBvZiB0aGUgbW9zdCBwb3B1bGFyIGFuaW1lIHNob3dzIGF0IHRoZSBtb21lbnQuDQoNCmBgYHtyIHRhYmxlczEsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0Ka2FibGUoQm9uZXNbMToxMCxdLCBjb2wubmFtZXM9YygiQW5pbWUiLCJNZW1iZXJzIiwiWWVhciIpLGFsaWduPSJsY2MiLGNhcHRpb24gPSAiVG9wIDEwIE1vc3QgUG9wdWxhciBBbmltZSBNYWRlIGJ5IEJvbmVzLiIpDQoNCmBgYA0KDQoNCkZpbmFsbHksIEEtMSBQaWN0dXJlcyBpcyB0aGUgb25lIHRoYXQgc3VycHJpc2VzIG1lIHRoZSBsZWFzdC4gSW4gdGhlIHBhc3QgZGVjYWRlIHRoZXkgYmVjYW1lIHRoZSBwb3dlcmhvdXNlIG9mIGFuaW1lIHByb2R1Y3Rpb24gKFN3b3JkIEFydCBPbmxpbmUsIEFvIG5vIEV4b3JjaXN0LCBTaGlnYXRzdSB3YSBLaW1pIG5vIFVzbywgRmFpcnkgVGFpbCwgTmFuYXRzdSBubyBUYWl6YWkpLiBCZXR3ZWVuIDIwMTQgYW5kIDIwMTYgdGhleSBwcm9kdWNlZCAxMCBvciBtb3JlIHRlbGV2aXNpb24gc2hvd3MgcGVyIHllYXIuIFdoaWNoIGlzIGEgdmVyeSBoaWdoIGZpZ3VyZSBjb21wYXJhdGl2ZWx5LiBUaGUgb25seSBzdHVkaW8gdGhhdCBoYXMgZG9uZSBzb21ldGhpbmcgc2ltaWxhciBpcyBKQyBTdGFmZiBpbiAyMDEyIGFuZCAyMDE3Lg0KDQpgYGB7ciB0YWJsZXMyLCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQprYWJsZShBLjFbMToxMCxdLCBjb2wubmFtZXM9YygiQW5pbWUiLCJNZW1iZXJzIiwiWWVhciIpLGFsaWduPSJsY2MiLGNhcHRpb24gPSAiVG9wIDEwIE1vc3QgUG9wdWxhciBBbmltZSBNYWRlIGJ5IEEtMSBQaWN0dXJlcyIpDQpgYGANCkFzIHlvdSBjYW4gc2VlIG9uIHRoZSBib3hwbG90IGJlaGluZCwgSXQgaXMgY2xlYXIgdGhhdCB0aGVzZSAzIHN0dWRpb3MgYW5pbWF0ZSBzaG93cyB0aGF0IGFyZSBtb3JlIHBvcHVsYXIgdGhhbiB0aGUgc2hvd3MgYW5pbWF0ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGFuaW1lIHN0dWRpb3MuDQoNCmBgYHtyLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0KcGxvdF9seSgpICU+JSANCiAgYWRkX3RyYWNlKGRhdGEgPSBudWV2bzMsDQogICAgICAgICAgICB5ID0gfmxvZyhtZW1iZXJzMSksDQogICAgICAgICAgICBjb2xvciA9IH5TdHVkaW9zLA0KICAgICAgICAgICAgdHlwZSA9ICJib3giKSAlPiUgDQogIGxheW91dCh0aXRsZSA9ICJNQUwgTWVtYmVycyBwZXIgQW5pbWUgU3R1ZGlvIiwNCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBbmltZSBTdHVkaW9zIikpIA0KDQpgYGANCg0KDQojIyMjIEdlbnJlcw0KDQpUaGUgZ2VucmUgb2YgYW4gYW5pbWUgaXMgcGVyaGFwcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGVsZW1lbnRzIGluIGRldGVybWluaW5nIHRoZSBwb3B1bGFyaXR5IG9mIGEgc2hvdy4gU3VycHJpc2luZ2x5LCB0aGUgZ2VucmUgdGhhdCBoYXMgdGhlIGhpZ2hlc3QgcG9zaXRpdmUgZWZmZWN0IG9uIHRoZSBtZW1iZXIgdmFyaWFibGUgaXMgSGFyZW0sIG9uIGF2ZXJhZ2UgYSBzaG93IG9mIHRoaXMgdHlwZSBpcyA0NSUgbW9yZSBwb3B1bGFyIHRoYW4gYSBzaG93IHRoYXQgaXMgbm90IGxpc3RlZCBhcyBIYXJlbS4gT3RoZXIgZ2VucmVzIHRoYXQgaGF2ZSBhIHBvc2l0aXZlIGVmZmVjdCBvbiBwb3B1bGFyaXR5IGFyZTogQWN0aW9uLCBSb21hbmNlLCBTY2hvb2wsIFBzeWNob2xvZ2ljYWwsIFN1cGVybmF0dXJhbCwgSG9ycm9yLCBTaG91bmVuIGFuZCBGYW50YXN5Lg0KDQpUaGUgZ2VucmVzIHdpdGggdGhlIGJpZ2dlc3QgbmVnYXRpdmUgZWZmZWN0IGFyZSAiTXVzaWMiIGFuZCAiSGlzdG9yaWNhbCIuIEEgc2hvdyB3aXRoIHRoZXNlIGdlbnJlcyBpcywgb24gYXZlcmFnZSwgNTklIGxlc3MgcG9wdWxhciB0aGFuIGEgc2hvdyB0aGF0J3Mgbm90IGxpc3RlZCBhcyAiTXVzaWMiIG9yICJIaXN0b3JpY2FsIi4gVGhlIG90aGVyIGdlbnJlcyB0aGF0IGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3QgYXJlIFNwYWNlLCBNZWNoYSwgU3BvcnRzLCBEZW1vbnMgYW5kIFBvbGljZS4gSW4gdGhlIGdyYXBoIGJlaGluZCB5b3UgY2FuIGxvb2sgYXQgdGhlIHBvcHVsYXJpdHkgZGVuc2l0eSBkaXN0cmlidXRpb24gb2Ygc29tZSBvZiB0aGUgbW9zdCBpbmZsdWVudGlhbCBnZW5yZXMuIEkgcGlja2VkIHRoZSB0d28gZ2VucmVzIHdpdGggdGhlIGhpZ2hlc3QgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIGVmZmVjdCBvbiBwb3B1bGFyaXR5Lg0KDQpgYGB7ciwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQoNCnBsb3RfbHkob3BhY2l0eT0wLjUpICU+JSANCiAgYWRkX2xpbmVzKHg9fmRlbnNpdHkxNCR4LHk9fmRlbnNpdHkxNCR5LG5hbWU9IkhhcmVtIikgJT4lIA0KICBhZGRfbGluZXMoeD1+ZGVuc2l0eTIkeCx5PX5kZW5zaXR5MiR5LG5hbWU9Ikhpc3RvcmljYWwiKSAlPiUgDQogIGFkZF9saW5lcyh4PX5kZW5zaXR5MTAkeCx5PX5kZW5zaXR5MTAkeSxuYW1lPSJNdXNpYyIpICU+JSANCiAgYWRkX2xpbmVzKHg9fmRlbnNpdHk5JHgseT1+ZGVuc2l0eTkkeSxuYW1lPSJBbGwgQW5pbWUiKSAlPiUgDQogIGFkZF9saW5lcyh4PX5kZW5zaXR5MTIkeCx5PX5kZW5zaXR5MTIkeSxuYW1lPSJQc3ljaG9sb2dpY2FsIikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSAnUG9wdWxhcml0eSBEZW5zaXR5IERpc3RyaWJ1dGlvbiBvZiB0aGUgTW9zdCBJbmZsdWVuY2lhbCBBbmltZSBHZW5yZXMnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gImxvZyhtZW1iZXJzKSIpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gImRlbnNpdHkiKSkNCg0KDQpgYGANCg0KDQojIyMjIFNvdXJjZSBNYXRlcmlhbA0KDQpPZiBhbGwgdGhlIHNvdXJjZXMsIHRoZSBvbmx5IG9uZSB0aGF0IGhhcyBhIHNpZ25pZmljYW50IGVmZmVjdCBpcyBsaWdodCBub3ZlbC4gSWYgeW91IGRvbid0IGtub3cgd2hhdCBhIGxpZ2h0IG5vdmVsIGlzIHJlYWQgW3RoaXNdKGh0dHBzOi8vcmFuZG9tYy5uZXQvMjAwOS8wNS8xOC9saWdodC1ub3ZlbHMtaW50cm9kdWN0aW9uLykuIExpZ2h0IG5vdmVscyBhZGFwdGF0aW9ucyBhcmUgb24gYXZlcmFnZSA0MiUgbW9yZSBwb3B1bGFyIHRoYW4gYW5pbWUgd2hvc2Ugc291cmNlIG1hdGVyaWFsIGNvbWVzIGZyb20gYW5vdGhlciBtZWRpdW0uIEkgdGhpbmsgdGhpcyBpcyBwYXJ0bHkgZHVlIHRvIHRoZSByaXNlIGluIHBvcHVsYXJpdHkgb2YgSXNla2FpIGluIHRoZSBsYXN0IGRlY2FkZSwgYXMgSXNla2FpIGFuaW1lIGFyZSBwcmVkb21pbmFudGx5IGFkYXB0YXRpb25zIG9mIGxpZ2h0IG5vdmVscy4gSWYgeW91IGRvbid0IGtub3cgd2hhdCBhbiBpc2VrYWkgYW5pbWUgaXMgcmVhZCBbdGhpc10oaHR0cHM6Ly9tYW5nYXBsYW5ldC5jb20vd2hhdC1pcy1pc2VrYWkvKQ0KDQpgYGB7ciwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQpudWV2bzMgJT4lIGZpbHRlcihzb3VyY2U9PSIgIExpZ2h0IG5vdmVsICAgICJ8c291cmNlPT0iICBNYW5nYSAgICAifA0KICAgICAgICAgICAgICAgICAgc291cmNlPT0iICBPcmlnaW5hbCAgICAifHNvdXJjZT09IiAgVmlzdWFsIG5vdmVsICAgICIpICU+JSANCnBsb3RfbHkoKSAlPiUgDQogIGFkZF90cmFjZSggeSA9IH5sb2cobWVtYmVyczEpLA0KICAgICAgICAgICAgY29sb3IgPSB+c291cmNlLA0KICAgICAgICAgICAgdHlwZSA9ICJib3giKSAlPiUgDQogIGxheW91dCh0aXRsZSA9ICJBbmltZSBQb3B1bGFyaXR5IGJ5IFNvdXJjZSBNYXRlcmlhbCIsDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU291cmNlIE1hdGVyaWFsIikpIA0KDQpgYGANCg0KDQpgYGB7ciB0YWJsZTQsIGVjaG89RkFMU0UsY29sbGFwc2U9VFJVRX0NCg0Ka2FibGUoTGlnaHQuTm92ZWxbMToxMCxdLCBjb2wubmFtZXM9YygiQW5pbWUiLCJNZW1iZXJzIiwiWWVhciIpLGFsaWduPSJsY2MiLGNhcHRpb24gPSAiTW9zdCBQb3B1bGFyIExpZ2h0IE5vdmVsIEFkYXB0YXRpb25zIikNCg0KDQpgYGANCg0KIyMjIyBQcm9kdWNlcnMNCg0KVGhlcmUgYXJlIHR3byBwcm9kdWNlcnMgdGhhdCBoYXZlIGEgbmVnYXRpdmUgZWZmZWN0IG9uIHBvcHVsYXJpdHkuIFRoZSBmaXJzdCBvbmUgaXMgU2FucmlvLiBTaG93cyBTYW5yaW8gaXMgcGFydCBvZiB0aGUgcHJvZHVjdGlvbiBjb21taXR0ZWUgYXJlIG9uIGF2ZXJhZ2UgODIlIGxlc3MgcG9wdWxhciB0aGFuIHNob3dzIFNhbnJpbyBpcyBub3QgcGFydCBvZiB0aGUgY29tbWl0dGVlLiBGcm9tIHdpa2lwZWRpYTogKiJTYW5yaW8gaXMgYSBKYXBhbmVzZSBjb21wYW55IHRoYXQgZGVzaWducywgbGljZW5zZXMgYW5kIHByb2R1Y2VzIHByb2R1Y3RzIGZvY3VzaW5nIG9uIHRoZSBrYXdhaWkgKCdjdXRlJykgc2VnbWVudCBvZiBKYXBhbmVzZSBwb3B1bGFyIGN1bHR1cmUiKi4gVGhlIG90aGVyIHByb2R1Y2VyIHRoYXQgaGFzIGEgbmVnYXRpdmUgZWZmZWN0IGlzIHRoZSBwdWJsaXNoZXIgU2hvZ2FrdWthbiwgdGhlIHNob3dzIGluIHdoaWNoIFNob2dha3VrYW4gaXMgaW52b2x2ZWQgYXJlIG9uIGF2ZXJhZ2UgMzUlIGxlc3MgcG9wdWxhciB0aGFuIHRoZSBzaG93cyBpbiB3aGljaCB0aGlzIHB1Ymxpc2hlciBpcyBub3Qgb24gdGhlIHByb2R1Y3Rpb24gY29tbWl0dGVlLg0KDQpUaGUgcHJvZHVjZXJzIFNodWVpc2hhLCBUb2hvIEFuaW1hdGlvbiwgYW5kIFBvbnkgQ2FueW9uIGhhdmUgYSBwb3NpdGl2ZSBlZmZlY3Qgb24gcG9wdWxhcml0eS4gU2hvd3MgaW4gd2hpY2ggU2jFq2Vpc2hhIGlzIGludm9sdmVkIGFyZSBvbiBhdmVyYWdlIDIxJSBtb3JlIHBvcHVsYXIgdGhhbiB0aGUgYW5pbWUgaW4gd2hpY2ggdGhpcyBwdWJsaXNoZXIgaXMgbm90IGludm9sdmVkLiBUaGlzIG1ha2VzIHNlbnNlIHNpbmNlIHRoaXMgcHVibGlzaGVyIHB1Ymxpc2hlcyB0aGUgV2Vla2x5IFNoxY1uZW4gSnVtcCBtYWdhemluZS4NCg0KYGBge3IgdGFibGU1LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQoNCmthYmxlKFNodWVpc2hhWzE6MTAsXSwgY29sLm5hbWVzPWMoIkFuaW1lIiwiTWVtYmVycyIsIlllYXIiKSxhbGlnbj0ibGNjIixjYXB0aW9uID0gIlRvcCAxMCBNb3N0IFBvcHVsYXIgQW5pbWUgUHJvZHVjZWQgYnkgU2h1ZWlzaGEiKQ0KDQpgYGANCkhlcmUncyBhIGJveHBsb3Qgd2l0aCB0aGUgbW9zdCBpbXBvcnRhbnQgbWFuZ2EvbGlnaHQgbm92ZWwgcHVibGlzaGVycyAoS2Fkb2thd2EsS29kYW5zaGEsU2hvZ2FrdWthbiBhbmQgU2h1ZWlzaGEpLiBBcyBjYW4gYmUgc2VlbiwgU2h1ZWlzaGEgaGFzIHRoZSBoaWdoZXN0IGxvZyhtZW1iZXJzKSBtZWRpYW4uIE9uIHRoZSBvdGhlciBoYW5kIFNob2dha3VrYW4gaGFzIHRoZSBsb3dlc3Qgb25lLg0KDQpgYGB7ciwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00LCBlY2hvPUZBTFNFLGNvbGxhcHNlPVRSVUV9DQpudWV2bzMgJT4lIGZpbHRlcihpcy5uYShlZGl0b3JpYWwpPT1GQUxTRSkgJT4lIA0KcGxvdF9seSgpICU+JSANCiAgYWRkX3RyYWNlKCB5ID0gfmxvZyhtZW1iZXJzMSksDQogICAgICAgICAgICAgY29sb3IgPSB+ZWRpdG9yaWFsLA0KICAgICAgICAgICAgIHR5cGUgPSAiYm94IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSAiQW5pbWUgUG9wdWxhcml0eSBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlB1Ymxpc2hlciIpKSANCmBgYA0KDQpUaGUgb3RoZXIgdHdvIHByb2R1Y2VycyB0aGF0IGhhdmUgYSBwb3NpdGl2ZSBlZmZlY3QgYXJlIDEpIFRvaG8gQW5pbWF0aW9uLCB3aGljaCBpcyBhbiBhbmltYXRpb24gc3R1ZGlvIGFuZCBmaWxtIGRpc3RyaWJ1dG9yLiAyKSBQb255IENhbnlvbiwgd2hpY2ggYWNjb3JkaW5nIHRvIHdpa2lwZWRpYSBpczogKiJhIEphcGFuZXNlIGNvbXBhbnksIHdoaWNoIHB1Ymxpc2hlcyBtdXNpYywgRFZEIGFuZCBWSFMgdmlkZW9zLCBtb3ZpZXMsIGFuZCB2aWRlbyBnYW1lcyIqLiBUb2hvIEFuaW1hdGlvbiBoYXMgYSBwb3NpdGl2ZSBlZmZlY3Qgb2YgMjclIHdoaWxlIFBvbnkgQ2FueW9uIGhhcyBhbiBlZmZlY3Qgb2YgMTYlLiBGaW5hbGx5LCB0aGUgdGVsZXZpc2lvbiBjb21wYW55IFRCUyBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGVmZmVjdCBvbiB0aGUgcG9wdWxhcml0eSBvZiBhbiBhbmltZS4NCg0KDQojIyMgRmluYWwgVGhvdWdodHMNCg0KT3VyIGFkanVzdGVkIHIgc3F1YXJlZCB0ZWxscyB1cyB0aGF0IHRoZSB2YXJpYWJsZXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFyZSBleHBsYWluaW5nIGFib3V0IDcwJSBvZiB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIG1lbWJlcnMgdmFyaWFibGUuIEhvd2V2ZXIgdGhlcmUgYXJlIGNlcnRhaW4gdGhpbmdzIHRvIGtlZXAgaW4gbWluZCB3aGVuIGFuYWx5emluZyB0aGVzZSByZXN1bHRzLiBGaXJzdCwgSSBkb24ndCBrbm93IHRoZSBnZW9ncmFwaGljIGRpc3RyaWJ1dGlvbiBvZiBNQUwgdXNlcnMuIEkgc3VzcGVjdCB0aGF0IHRoZXkgYXJlIG1vc3RseSBmcm9tIEVuZ2xpc2gtc3BlYWtpbmcgY291bnRyaWVzLiBUaGVyZWZvcmUsIG9uZSBtdXN0IGJlIGNhcmVmdWwgd2hlbiBtYWtpbmcgZ2VuZXJhbGl6YXRpb25zIHJlZ2FyZGluZyB0aGVzZSByZXN1bHRzLg0KDQpTZWNvbmQsIEkgY291bGRuJ3QgZmluZCBhIHdheSB0byBjb250cm9sIHRoZSBlZmZlY3QgcHJlcXVlbHMgaGF2ZSBvbiBzZXF1ZWxzLiBJZiB0aGUgZmlyc3Qgc2Vhc29uIG9mIGEgc2hvdyBpcyBwb3B1bGFyLCB0aGlzIHdpbGwgbWFrZSB0aGUgc2VxdWVscyB0byB0aGF0IHNob3cgdmVyeSBwb3B1bGFyIGFzIHdlbGwuIFdpdGggdGhlIGRhdGEgSSBoYXZlIHRoZXJlIGlzIG5vIHdheSB0byBjb250cm9sIHRoaXMgZWZmZWN0LiBUaGlyZCwgSSBjYW5ub3QgY29udHJvbCB0aGUgZWZmZWN0IHRoYXQgY2VydGFpbiBzdHJlYW1pbmcgcGxhdGZvcm1zIHN1Y2ggYXMgTmV0ZmxpeCwgQW1hem9uIG9yIENydW5jaHlyb2xsIG1heSBoYXZlLiBGb3VydGgsIHRoZSBkYXRhIG1heSBzaG93IG51bWJlcnMgdGhhdCBhcmUgbm90IHZlcnkgZmF2b3JhYmxlIHRvd2FyZHMgc2hvd3Mgd2hvc2UgdGFyZ2V0IGF1ZGllbmNlIGlzIGNoaWxkcmVuIHNpbmNlIGNoaWxkcmVuIHByb2JhYmx5IGRvIG5vdCBoYXZlIE1BTCBhY2NvdW50cy4NCg0KRGVzcGl0ZSBhbGwgb2YgdGhlIGFib3ZlLCBJIHRoaW5rIHRoaXMgZmlyc3QgYXBwcm9hY2ggc2hlZHMgc29tZSBsaWdodCBvbiB3aGF0IGVsZW1lbnRzIGNvbnRyaWJ1dGUgdG8gdGhlIHBvcHVsYXJpdHkgb2YgYW5pbWUuIEluIHRoZSBmdXR1cmUgSSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSBtYWNoaW5lIGxlYXJuaW5nIG1vZGVscyB0aGF0IHByZWRpY3QgdGhlIHBvcHVsYXJpdHkgb2YgYW5pbWUuDQoNCg0K