Introduction

De par le caractère important qu’elles ont sur la population et les décisions à l’échelle nationale et internationale, les élections présidentielles sont toujours des évènements grandement médiatisés. Il est alors naturel de se demander s’il est possible d’utiliser des méthodes statistiques afin d’étudier les liens de causalité entre médias et popularité des candidats, pour ainsi dégager des tendances globales sur l’avis de la population.

Nous nous proposons d’étudier trois jeux de données liées aux élections présidentielles françaises de 2017: -Le dataset baromètre INA qui contient le temps alloué à 14 thématiques (parmi “économie”, “sport”, “société”, etc…) sur les 6 principales chaînes de télévision françaises (TF1, France 2, France 3, Canal, Arte, M6). Nous avons accès à ces informations chaque mois, de 2005 à 2018. -Le dataset IPSOS, dans lequel nous avons relevé le baromètre de popularité de trois candidats aux élections présidentielles (Nicolas Sarkozy, Marine Le Pen, Jean-Luc Mélenchon), chaque mois de septembre 2014 à décembre 2018. -Le dataset Sondages, que nous avons constitué en récupérant les données de grands sondages sur Wikipédia en utilisant des méthodes de web scraping.

Dans un premier temps, nous allons charger les jeux de données, et effectuer une brève analyse exploratrice pour comprendre de quoi ils sont constitués.

Données INA

Le premier jeu de données que nous avons testé est celui fourni par l’INA (plus d’informations sont diponibles ici http://www.inatheque.fr/publications-evenements/ina-stat/ina-stat-methodologie.html). Il est à disposition dans un fichier nommé “ina-barometre-jt-tv-donnees-mensuelles-2005-2018-durees.csv”.

ABCDEFGHIJ0123456789
MOIS
<date>
THEMATIQUES
<chr>
TF1
<S3: hms>
France2
<S3: hms>
France3
<S3: hms>
Canal
<S3: hms>
Arte
<S3: hms>
M6
<S3: hms>
2005-01-01Catastrophes05:39:5005:13:5602:35:0100:22:4100:51:5101:07:28
2005-01-01Culture-loisirs00:50:2201:24:0401:12:2700:04:1200:00:0000:27:44
2005-01-01Economie00:52:2500:31:1200:16:3900:01:5900:07:5900:11:04
2005-01-01Education00:22:0000:20:4200:09:4600:02:1800:04:3500:13:10
2005-01-01Environnement00:45:0000:32:5500:23:0900:00:4100:02:1600:09:46
2005-01-01Faits divers00:37:2800:27:4300:15:5000:01:2200:00:2000:10:33

Nous pouvons réarranger les données afin de réordonner les éléments d’un sujet sur une chaîne de manière consécutive. Ainsi, au lieu d’avoir les 14 sujets sur toutes les chaînes à chaque mois, nous obtenons chaque sujet sur chaque chaîne, et nous pouvons ainsi les afficher.

ABCDEFGHIJ0123456789
MOIS
<date>
TF1Catastrophes
<S3: hms>
France2Catastrophes
<S3: hms>
France3Catastrophes
<S3: hms>
CanalCatastrophes
<S3: hms>
2005-01-0105:39:5005:13:5602:35:0100:22:41
2005-02-0100:59:3000:45:0600:18:3000:04:44
2005-03-0101:12:3401:00:4000:41:5000:01:11
2005-04-0100:23:0000:31:0600:08:1100:01:18
2005-05-0100:16:4200:12:5400:10:0800:00:23
2005-06-0100:59:0500:33:4900:36:1500:02:21

Par exemple, si nous nous intéressons au temps d’écran de certains sujets sur TF1, tels que la culture, le sport et la politique en France, nous obtenons

Le sport est majoritairement ponctué par les grandes compétitions ayant lieu une fois tous les deux ans, nous pouvons doncc remarquer que ce sujet présente une forte représentation à la télévision lors de ces moments là, puis une représentation plutôt faible le reste du temps. La culture a quant à elle un temps d’écran plutôt constant et n’est pas marquée par des évènements en particulier. Le sujet de la politique en France est devenu très médiatisé à partir de 2015, avec le plus fort taux de médiatisation à l’approche des présidentielles en 2017.

Nous remarquons également que nous avons une représentation inégale des données sur les chaînes de télévision française. Alors que TF1 et France 2 ont des programmes très similaires, Arte est une chaîne sur laquelle la politique n’est quasiment pas représentée.

Nous pouvons d’aillers vérifier ceci

Ce qui confirme le fait que TF1 et France 2 sont similaires, et qu’Arte ne diffuse que très peu de politique par rapport à eux. On notera que Canal+ est la chaîne qui diffuse ce sujet le moins.

Si nous nous intéressons maintenant à une vision plus locale de la médiatisation de ces élections, sur TF1 par exemple,

Nous pouvons apercevoir une forte augmentation de la médiatisation de la politique en 2015, notamment à cause de l’anticipation de l’élection présidentielle, des élections départementales et régionales. Nous assistons également à la montée du Front National après les attentats terrostistes de Charlie Hebdo, du Bataclan puis du Stade de France. Le F.N. effectue d’ailleurs cette année-là les meilleurs scores électoraux de son histoire, et s’ensuit la succession de Marine Le Pen à son père, exclu du parti après des propos antisémites.

##Travail sur les variables explicatives

Nous nous sommes intéressés aux liens pouvant exister entre les données et souhaitons notamment répondre aux questions: Quand une chaine parle d’un sujet, est ce que les autres chaines vont aussi en parler ? Certains sujets sont ils traités de manière différentes (en terme de temps d’antenne) entre les différentes chaînes ? Les données étant mensuelles, on ne peut pas regarder des variations fines mais bien des variations importantes où des chaînes vont collectivement beaucoup parler d’un sujet.

Sur cette matrice de corrélation, on peut voir que TF1, France2, France 3, M6 et Canal+ parlent de faits divers à peu près en même temps. Arte se distingue et en parle à des moments différents.

Cette différence entre les différents journaux est plus faible sur d’autres sujets comme celui des catastrophes.

[1] 113  85
[1] 49 85

Call:
 randomForest(formula = ArteCatastrophes ~ ., data = data.frame(train1),      importance = TRUE) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 28

          Mean of squared residuals: 514614
                    % Var explained: 34.1

On voit ici que si on cherchait à determiner le temps d’antenne des catastrophes sur Arte, on aurait seulement une explication d’autour de 25% due aux autres chaines.

[1] 113  85
[1] 49 85

Call:
 randomForest(formula = France2Catastrophes ~ ., data = data.frame(train1),      importance = TRUE) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 28

          Mean of squared residuals: 1652458
                    % Var explained: 82.36

Si on cherche à expliquer des variables liées à France2, on voit à l’inverse qu’on peut plus facilement l’expliquer à partir des autres variables.

Dataset IPSOS

Le second dataset que nous étudions est le dataset IPSOS, qui indique si sur un échantillon de 1000 personnes, la population est plutôt favorable ou non à un candidat (plus d’informations peuvent être trouvées ici https://www.ipsos.com/fr-fr/barometre-politique). Pour ce jeu de données, nous avons manuellement récupéré la popularité de 3 personnes politiques importantes: Nicolas Sarkozy, Marine Le Pen et Jean-Luc Melenchon. Nous les avons choisis car étant présents dans le champ politique depuis longtemps, IPSOS dispose de nombreuses données les concernant.

The following named parsers don't match the column names: MOIS, THEMATIQUES
      Date            Nicolas Sarkozy Marine Le Pen   Jean-Luc-Melenchon
 Min.   :2014-09-01   Min.   :23.00   Min.   :20.00   Min.   :23.00     
 1st Qu.:2015-09-16   1st Qu.:28.00   1st Qu.:24.00   1st Qu.:28.00     
 Median :2016-11-01   Median :30.00   Median :25.00   Median :30.00     
 Mean   :2016-10-14   Mean   :30.47   Mean   :26.15   Mean   :31.26     
 3rd Qu.:2017-11-16   3rd Qu.:32.50   3rd Qu.:27.00   3rd Qu.:33.00     
 Max.   :2018-12-01   Max.   :40.00   Max.   :34.00   Max.   :56.00     

Plot Data IPSOS

Nous observons que les candidats favoris sont globalement Nicolas Sarkozy suivi de Jean-Luc Mélenchon, qui s’envole en début 2017 où il est très présent médiatiquement parlant. Nous observons également qu’une partie importante de la population est favorable à la candidate du Front National.

Le candidat le plus populaire “globalement” sur la période est donc Jean-Luc Mélenchon.

On note que les popularités ne s’ajoutent pas pour faire 100% car on ne relève ici qu’une popularité globale sur la population, et pas un pourcentage de voix dans les sondages. Dans un climat politique où les candidats ne conviendraient pas à la population, on peut même imaginer un scénario hypothétoque où aucun candidat n’a plus de 10% de popularité par exemple.

Dataset Sondages

Nous créons un jeu de données Sondages en récoltant des résultats de sondages de différentes sources sur Wikipédia (plus d’informations sont disponibles ici https://en.wikipedia.org/wiki/Opinion_polling_for_the_2017_French_presidential_election).

NAs introduits lors de la conversion automatique
 1 failed to parse.
 1 failed to parse.

Plot Data Surveys

Nous apercevons l’ascension puis déclin de François Fillon à cause du “Pénélopegate” qui relève de l’accusation envers le candidat de créer des emplois fictifs pour sa femme. Entre le 31 décembre 2016 et le 31 mars 2017, 290 sujets ont rendu compte de l’affaire Fillon, soit 53,7% de la totalité des sujets consacrés au candidat de la Droite et du Centre (source: INA). Il est également intéressants de noter que Jean-Luc Mélenchon et François Fillons sont les deux candidats les plus cités dans les Tweets, et qu’ils seront tous deux éliminés au premier tour.

Ce plot de popularité nous permet de nous rendre compte que Macron ne partait clairement pas vainqueur de l’élection. Ce dernier a d’ailleurs été bien moins médiatisé que d’autres candidats au début de la campagne, pour l’être beaucoup sur la fin. Seuls 4 candidats (F. Fillon, E. Macron, B. Hamon et M. Le Pen) apparaissent plus de 100 fois à la télévision pendant la campagne présidentielle de février à avril 2017. Pour comparaison, F. Fillon apparaît 164 fois tandis que J.L. Mélenchon seulement 72 fois (source: INA).

LASSO régression sur le dataset IPSOS

Nous allons maintenant analyser ces données pour déterminer si nous pouvons trouver des liens entre la popularité des candidats et la médiatisation de certains sujets à la télévision française. Nous voulons savoir s’il est possible de déterminer un lien entre la médiatisation de certains sujets et la popularité des candidats.

Nous prenons l’example de Jean-Luc-Melenchon:

[1] 16.13989

Nous remarquons que même si nous sélectionnons le meilleur lambda pour la régularisation l1, nous obtenons quand même une erreur “importante” sur le risque empirique.

Ce plot permet de retrouver l’intuition derrière le LASSO, si lambda est grand, la solution sera très sparse et tous les coefficients seront amenés à zéro. S’il est petit et procche de zéro, le terme à minimiser sera le terme de fidélité avec les données et on se ramène à un problème des moindres carrés ordinaires. Si on zoomait sur la zone à droite, on pourrait observer une solution linéaire par morceaux, c’est dû à l’opérateur du soft thresholding, qui minimise le LASSO.

Option grouped=FALSE enforced in cv.glmnet, since < 3 observations per fold

Nous pouvons ici remarquer qu’il y a un lambda optimal près de 1 (son log est proche de zéro), et la MSE remonte après l’avoir atteint.

<sparse>[ <logic> ] : .M.sub.i.logical() maybe inefficient
[1]  3.352243e+01 -8.325441e-05 -7.154112e-04  3.431529e-04  1.124067e-04 -7.446715e-03
[1] "(Intercept)"                   "France3Catastrophes"           "France2Justice"               
[4] "`ArtePolitique France`"        "`M6Politique France`"          "`CanalSciences et techniques`"

Nous pouvons retrouver ici les variables que la régression LASSO a sélectionné. Comme attendu, nous retrouvons la politique en France sur deux chaînes, mais retrouvons également des variables plus discutables comme “Sciences et techniques” sur Canal+. Le fait que nous n’ayons que peu de données pour la régression nous amène à ne pas pouvoir réellement sélectionner toutes les variables. Un comportement à l’échelle plus locale aurait pu être désireux (avec des données INA toutes les semaines au lieu de tous les mois par exemple) afin d’analyser des séries temporelles de manière plus précise.

Random Forests

[1] 29 88
[1] 12 88

Call:
 randomForest(formula = Jean.Luc.Melenchon ~ ., data = train,      importance = TRUE) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 29

          Mean of squared residuals: 25.019
                    % Var explained: 25.64
    prediction
     30.8015666666667 31.2691333333333 31.3380333333333 31.4463 31.5000333333334 31.8460333333333 34.5885 34.6334
  26                0                1                0       0                0                0       0       0
  27                0                0                0       1                0                0       0       0
  28                1                0                0       0                0                0       0       0
  29                0                0                0       0                0                0       0       0
  30                0                0                1       0                0                0       0       0
  31                0                0                0       0                1                0       0       0
  32                0                0                0       0                0                1       0       0
  33                0                0                0       0                0                0       1       0
  34                0                0                0       0                0                0       0       0
  36                0                0                0       0                0                0       0       0
  38                0                0                0       0                0                0       0       1
    prediction
     34.793 35.6407666666667 35.7535666666667 39.3703666666666
  26      0                0                0                0
  27      0                0                0                0
  28      0                0                0                0
  29      0                0                1                0
  30      0                0                0                0
  31      0                1                0                0
  32      0                0                0                0
  33      0                0                0                0
  34      1                0                0                0
  36      0                0                0                1
  38      0                0                0                0

On voit que nous pouvons obtenir certaines corrélations, car le nombre de données est plus élevé. On se pose donc la question: Est ce qu’il y a une corrélation entre la popularité des candidats et les intentions de vote envers ces candidats ? Cela permettrait de se baser sur les données pré-élections pour voir les sujets qui ont un lien avec la popularité du candidat puis de voir l’évolution de ces sujets pour estimer les intentions de vote. On va ici regarder les coefficients de corrélation entre ces deux variables et voir si on peut expliquer le vote par la popularité. On étudie ici Jean-Luc Mélenchon et Marine Le Pen car ce sont les deux candidats dont on a les données IPSOS. Il serait intéressant d’étendre cette analyse aux autres candidats.

Pour Marine Le Pen:

[1] 0.05767579

On peut voir que pour Marine Le Pen, le coefficient de corrélation est très faible: 0.05767579. Il n’y a que peu de lien entre sa popularité et les intentions de vote. Ce peut être du au fait qu’elle peut mobiliser contre elle (effet repoussoir): si sa popularité augmente, des électeurs pensant qu’elle a une chance de gagner, vont choisir de voter pour un autre candidat et donc mécaniquement faire baisser son score. Ce peut être aussi dû aux redressements particuliers au vote FN effectué par les instituts de sondage (voir cet article du Monde: https://www.lemonde.fr/politique/article/2011/03/07/marine-le-pen-les-sondeurs-ont-ils-les-bonnes-methodes-d-evaluation_1487972_823448.html). Enfin, ce peut également être tout simplement dû au fait que sa popularité et ses intentions de vote sont restés relativement stable et complique le fait de vouloir trouver une tendance.

Pour Jean-Luc Melenchon:

[1] 0.7870257

À l’inverse, il y a un bien meilleur coefficient de corrélation (0.7870257), pour Jean-Luc Mélenchon.

On voit en regardant sur ce graphique que c’est en partie dû à une très bonne popularité (56%) concomitante avec une augmentation de ses intentions de vote, juste avant l’élection (Avril 2017).

Conclusion

Quelques points auquels nous avons abouti au cours de notre travail: - Il y a peu de données sur ce sujet et ces données sont en général peu précises (l’incertitudes des sondages est de l’ordre de quelques pourcents, ce qui est souvent plus important que les incertitudes). Cela a donc restreint les possibilités et nous a contraint à considérer des cas particuliers. - La base de données des Actus du journal TV est très intéressante et permet de voir des corrélations entre ce que traitent les différents journaux TV et des différences entre les différentes chaînes. - Il est possible de relever certaines corrélations pour la popularité (données IPSOS). - La popularité n’est pas forcément correlée avec les intentions de vote (par exemple dans le cas de Marine Le Pen).

Poursuites éventuelles: - Il pourrait être intéressant de mener un travail complémentaire en comparant la popularité et les intentions de vote. Cela pourrait permettre de voir si des candidats sont populaires mais n’arrivent pas à rassembler leur camp. On peut penser à Benoît Hamon qui était sans doute dans ce cas. - Une limite que l’on connaissait dès le début était le fait qu’il était impossible de connaître si une information était positive ou négative. Une amélioration possible serait de considérer des occurences des noms de certains candidats avec des mots mélioratifs/péjoratifs dans ces journaux pour établir une classification plus précise.

LS0tDQp0aXRsZTogIkVsZWN0aW9ucyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KIyMgSW50cm9kdWN0aW9uDQoNCkRlIHBhciBsZSBjYXJhY3TDqHJlIGltcG9ydGFudCBxdSdlbGxlcyBvbnQgc3VyIGxhIHBvcHVsYXRpb24gZXQgbGVzIGTDqWNpc2lvbnMgw6AgbCfDqWNoZWxsZSBuYXRpb25hbGUgZXQgaW50ZXJuYXRpb25hbGUsIGxlcyDDqWxlY3Rpb25zIHByw6lzaWRlbnRpZWxsZXMgc29udCB0b3Vqb3VycyBkZXMgw6l2w6huZW1lbnRzIGdyYW5kZW1lbnQgbcOpZGlhdGlzw6lzLiBJbCBlc3QgYWxvcnMgbmF0dXJlbCBkZSBzZSBkZW1hbmRlciBzJ2lsIGVzdCBwb3NzaWJsZSBkJ3V0aWxpc2VyIGRlcyBtw6l0aG9kZXMgc3RhdGlzdGlxdWVzIGFmaW4gZCfDqXR1ZGllciBsZXMgbGllbnMgZGUgY2F1c2FsaXTDqSBlbnRyZSBtw6lkaWFzIGV0IHBvcHVsYXJpdMOpIGRlcyBjYW5kaWRhdHMsIHBvdXIgYWluc2kgZMOpZ2FnZXIgZGVzIHRlbmRhbmNlcyBnbG9iYWxlcyBzdXIgbCdhdmlzIGRlIGxhIHBvcHVsYXRpb24uDQoNCk5vdXMgbm91cyBwcm9wb3NvbnMgZCfDqXR1ZGllciB0cm9pcyBqZXV4IGRlIGRvbm7DqWVzIGxpw6llcyBhdXggw6lsZWN0aW9ucyBwcsOpc2lkZW50aWVsbGVzIGZyYW7Dp2Fpc2VzIGRlIDIwMTc6DQotTGUgZGF0YXNldCBiYXJvbcOodHJlIElOQSBxdWkgY29udGllbnQgbGUgdGVtcHMgYWxsb3XDqSDDoCAxNCB0aMOpbWF0aXF1ZXMgKHBhcm1pICLDqWNvbm9taWUiLCAic3BvcnQiLCAic29jacOpdMOpIiwgZXRjLi4uKSBzdXIgbGVzIDYgcHJpbmNpcGFsZXMgY2hhw65uZXMgZGUgdMOpbMOpdmlzaW9uIGZyYW7Dp2Fpc2VzIChURjEsIEZyYW5jZSAyLCBGcmFuY2UgMywgQ2FuYWwsIEFydGUsIE02KS4gTm91cyBhdm9ucyBhY2PDqHMgw6AgY2VzIGluZm9ybWF0aW9ucyBjaGFxdWUgbW9pcywgZGUgMjAwNSDDoCAyMDE4Lg0KLUxlIGRhdGFzZXQgSVBTT1MsIGRhbnMgbGVxdWVsIG5vdXMgYXZvbnMgcmVsZXbDqSBsZSBiYXJvbcOodHJlIGRlIHBvcHVsYXJpdMOpIGRlIHRyb2lzIGNhbmRpZGF0cyBhdXggw6lsZWN0aW9ucyBwcsOpc2lkZW50aWVsbGVzIChOaWNvbGFzIFNhcmtvenksIE1hcmluZSBMZSBQZW4sIEplYW4tTHVjIE3DqWxlbmNob24pLCBjaGFxdWUgbW9pcyBkZSBzZXB0ZW1icmUgMjAxNCDDoCBkw6ljZW1icmUgMjAxOC4NCi1MZSBkYXRhc2V0IFNvbmRhZ2VzLCBxdWUgbm91cyBhdm9ucyBjb25zdGl0dcOpIGVuIHLDqWN1cMOpcmFudCBsZXMgZG9ubsOpZXMgZGUgZ3JhbmRzIHNvbmRhZ2VzIHN1ciBXaWtpcMOpZGlhIGVuIHV0aWxpc2FudCBkZXMgbcOpdGhvZGVzIGRlIHdlYiBzY3JhcGluZy4NCg0KRGFucyB1biBwcmVtaWVyIHRlbXBzLCBub3VzIGFsbG9ucyBjaGFyZ2VyIGxlcyBqZXV4IGRlIGRvbm7DqWVzLCBldCBlZmZlY3R1ZXIgdW5lIGJyw6h2ZSBhbmFseXNlIGV4cGxvcmF0cmljZSBwb3VyIGNvbXByZW5kcmUgZGUgcXVvaSBpbHMgc29udCBjb25zdGl0dcOpcy4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQojIyMjIyMgSW5pdGlhbGlzYXRpb24gZGUgbGEgc2Vzc2lvbiBSDQoNCnJtKGxpc3Q9b2JqZWN0cygpKQ0KbGlicmFyeShYTUwpDQpsaWJyYXJ5KFJDdXJsKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkobWdjdikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHdlYXRoZXJtZXRyaWNzKQ0KbGlicmFyeShyYW5nZXIpDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoZ2xtbmV0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkoaHJicnRoZW1lcykNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShlbGxpcHNlKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHh0cykNCmxpYnJhcnkoaG1zKQ0KbGlicmFyeShwbG90bW8pDQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkNCnJlcXVpcmUoY2FUb29scykNCg0Kc2V0d2QoIkM6L1VzZXJzL3Rob21hL09uZURyaXZlL0J1cmVhdS9DZW50cmFsZS8zQS9NYXN0ZXIvUHJvamV0TUwvQ29kZS9NYWNoaW5lLUxlYXJuaW5nLWZvci1QcmVkaWN0aW9uLyIpDQojc2V0d2QoIi9Vc2Vycy9hZG1pbi9EZXNrdG9wL1N0YXRNTC9NTFwgZm9yXCBGb3JlY2FzdGluZy9Qcm9qZXQiKQ0KYGBgDQoNCg0KDQojIyBEb25uw6llcyBJTkENCg0KTGUgcHJlbWllciBqZXUgZGUgZG9ubsOpZXMgcXVlIG5vdXMgYXZvbnMgdGVzdMOpIGVzdCBjZWx1aSBmb3VybmkgcGFyIGwnSU5BIChwbHVzIGQnaW5mb3JtYXRpb25zIHNvbnQgZGlwb25pYmxlcyBpY2kgaHR0cDovL3d3dy5pbmF0aGVxdWUuZnIvcHVibGljYXRpb25zLWV2ZW5lbWVudHMvaW5hLXN0YXQvaW5hLXN0YXQtbWV0aG9kb2xvZ2llLmh0bWwpLiBJbCBlc3Qgw6AgZGlzcG9zaXRpb24gZGFucyB1biBmaWNoaWVyIG5vbW3DqSAiaW5hLWJhcm9tZXRyZS1qdC10di1kb25uZWVzLW1lbnN1ZWxsZXMtMjAwNS0yMDE4LWR1cmVlcy5jc3YiLiANCg0KYGBge3J9DQojIyMgRG9ubsOpZXMgSU5BDQoNCiMgQ29sbGVjdGUgZGVzIGRvbm7DqWVzDQpkYXRhIDwtIHJlYWRfZGVsaW0oImluYS1iYXJvbWV0cmUtanQtdHYtZG9ubmVlcy1tZW5zdWVsbGVzLTIwMDUtMjAxOC1kdXJlZXMuY3N2IiwgY29sX25hbWVzID1UUlVFLCBkZWxpbT0nOycsY29sX3R5cGVzID0gY29scyhNT0lTID0gY29sX2NoYXJhY3RlcigpLCBUSEVNQVRJUVVFUyA9IGNvbF9jaGFyYWN0ZXIoKSkpDQpkYXRhJE1PSVMgPSBkbXkoZGF0YSRNT0lTKQ0KZGF0YUFjdHVzVFY9ZGF0YQ0KDQojIEluc3BlY3Rpb24gZHUgZGF0YXNldA0KaGVhZChkYXRhKQ0KYGBgDQoNCk5vdXMgcG91dm9ucyByw6lhcnJhbmdlciBsZXMgZG9ubsOpZXMgYWZpbiBkZSByw6lvcmRvbm5lciBsZXMgw6lsw6ltZW50cyBkJ3VuIHN1amV0IHN1ciB1bmUgY2hhw65uZSBkZSBtYW5pw6hyZSBjb25zw6ljdXRpdmUuIEFpbnNpLCBhdSBsaWV1IGQnYXZvaXIgbGVzIDE0IHN1amV0cyBzdXIgdG91dGVzIGxlcyBjaGHDrm5lcyDDoCBjaGFxdWUgbW9pcywgbm91cyBvYnRlbm9ucyBjaGFxdWUgc3VqZXQgc3VyIGNoYXF1ZSBjaGHDrm5lLCBldCBub3VzIHBvdXZvbnMgYWluc2kgbGVzIGFmZmljaGVyLg0KDQpgYGB7cn0NCiMgQXJyYW5nZW1lbnQgZGVzIGRvbm7DqWVzIGRhbnMgbGUgZm9ybWF0IFRoZW1hdGlxdWVzQ2hhaW5lVFYgDQpub21zPWMoIlRGMSIsIkZyYW5jZTIiLCJGcmFuY2UzIiwiQ2FuYWwiLCJBcnRlIiwiTTYiKQ0KQ2F0YXN0cm9waGVzPWZpbHRlcihkYXRhLFRIRU1BVElRVUVTID09ICJDYXRhc3Ryb3BoZXMiKVssLTJdDQpuYW1lcyhDYXRhc3Ryb3BoZXMpWy0xXSA9IHBhc3RlKG5vbXMsICJDYXRhc3Ryb3BoZXMiLCBzZXAgPSAnJykNCkFjdHVzVFYgPSBDYXRhc3Ryb3BoZXMNCg0KZm9yIChuYW1lIGluIGRhdGFbMjoxNCwyXSRUSEVNQVRJUVVFUyl7DQogICAgZGF0YTAgPSBmaWx0ZXIoZGF0YSxUSEVNQVRJUVVFUyA9PSBuYW1lKVssLTJdDQogICAgbmFtZXMoZGF0YTApWy0xXSA9IHBhc3RlKG5vbXMsIG5hbWUsIHNlcCA9ICcnKQ0KICAgIEFjdHVzVFYgPSBsZWZ0X2pvaW4oQWN0dXNUViwgZGF0YTAsIGJ5ID0gIk1PSVMiKQ0KfQ0KDQojIFN1cHByZXNzaW9uIGRlcyBwcm94eSB2YXJpYWJsZXMNCnJtKGRhdGEsIGRhdGEwLCBDYXRhc3Ryb3BoZXMsIG5hbWUsIG5vbXMpDQoNCiMgSW5zcGVjdGlvbiBkdSBkYXRhc2V0DQpoZWFkKEFjdHVzVFYpDQpgYGANCg0KDQpQYXIgZXhlbXBsZSwgc2kgbm91cyBub3VzIGludMOpcmVzc29ucyBhdSB0ZW1wcyBkJ8OpY3JhbiBkZSBjZXJ0YWlucyBzdWpldHMgc3VyIFRGMSwgdGVscyBxdWUgbGEgY3VsdHVyZSwgbGUgc3BvcnQgZXQgbGEgcG9saXRpcXVlIGVuIEZyYW5jZSwgbm91cyBvYnRlbm9ucw0KDQpgYGB7cn0NCiMgUGxvdCBkZXMgc3VqZXRzIGVuIGZvbmN0aW9uIGR1IHRlbXBzDQpjb2xvcnMgPC0gYygiVEYxIFBvbGl0aXF1ZSBGcmFuY2UiID0gImNvcm5mbG93ZXJibHVlIiwgIlRGMSBDdWx0dXJlLWxvaXNpcnMiID0gImJyb3duMiIsICJURjEgU3BvcnQiID0gImRhcmtvbGl2ZWdyZWVuMyIpDQoNCnAgPC0gZ2dwbG90KEFjdHVzVFYsIGFlcyh4ID0gTU9JUykpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gYFRGMVBvbGl0aXF1ZSBGcmFuY2VgLCBjb2xvciA9ICJURjEgUG9saXRpcXVlIEZyYW5jZSIpKSArDQogIGdlb21fbGluZShhZXMoeSA9IGBURjFDdWx0dXJlLWxvaXNpcnNgLCBjb2xvciA9ICJURjEgQ3VsdHVyZS1sb2lzaXJzIikpICsgDQogIGdlb21fbGluZShhZXMoeSA9IFRGMVNwb3J0LCBjb2xvciA9ICJURjEgU3BvcnQiKSkgKw0KICBsYWJzKHggPSAiRGF0ZSIsDQogICAgICAgeSA9ICJEdXLDqWUgKGhldXJlcykiLCANCiAgICAgICBjb2xvciA9ICJTdWpldCIpICsNCiAgZ2d0aXRsZSgiSW1wb3J0YW5jZSBkZXMgc3VqZXRzIHN1ciBURjEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMpDQoNCnANCmBgYA0KDQpMZSBzcG9ydCBlc3QgbWFqb3JpdGFpcmVtZW50IHBvbmN0dcOpIHBhciBsZXMgZ3JhbmRlcyBjb21ww6l0aXRpb25zIGF5YW50IGxpZXUgdW5lIGZvaXMgdG91cyBsZXMgZGV1eCBhbnMsIG5vdXMgcG91dm9ucyBkb25jYyByZW1hcnF1ZXIgcXVlIGNlIHN1amV0IHByw6lzZW50ZSB1bmUgZm9ydGUgcmVwcsOpc2VudGF0aW9uIMOgIGxhIHTDqWzDqXZpc2lvbiBsb3JzIGRlIGNlcyBtb21lbnRzIGzDoCwgcHVpcyB1bmUgcmVwcsOpc2VudGF0aW9uIHBsdXTDtHQgZmFpYmxlIGxlIHJlc3RlIGR1IHRlbXBzLiBMYSBjdWx0dXJlIGEgcXVhbnQgw6AgZWxsZSB1biB0ZW1wcyBkJ8OpY3JhbiBwbHV0w7R0IGNvbnN0YW50IGV0IG4nZXN0IHBhcyBtYXJxdcOpZSBwYXIgZGVzIMOpdsOobmVtZW50cyBlbiBwYXJ0aWN1bGllci4gTGUgc3VqZXQgZGUgbGEgcG9saXRpcXVlIGVuIEZyYW5jZSBlc3QgZGV2ZW51IHRyw6hzIG3DqWRpYXRpc8OpIMOgIHBhcnRpciBkZSAyMDE1LCBhdmVjIGxlIHBsdXMgZm9ydCB0YXV4IGRlIG3DqWRpYXRpc2F0aW9uIMOgIGwnYXBwcm9jaGUgZGVzIHByw6lzaWRlbnRpZWxsZXMgZW4gMjAxNy4NCg0KDQpgYGB7cn0NCiMgUGxvdCBkZXMgc3VqZXRzIGVuIGZvbmN0aW9uIGR1IHRlbXBzDQpjb2xvcnMgPC0gYygiVEYxIFBvbGl0aXF1ZSBGcmFuY2UiID0gImNvcm5mbG93ZXJibHVlIiwgIkZyYW5jZSAyIFBvbGl0aXF1ZSBGcmFuY2UiID0gImJyb3duMiIsICJBcnRlIFBvbGl0aXF1ZSBGcmFuY2UiID0gImRhcmtvbGl2ZWdyZWVuMyIpDQpwIDwtIGdncGxvdChBY3R1c1RWLCBhZXMoeCA9IE1PSVMpKSArDQogIGdlb21fbGluZShhZXMoeSA9IGBURjFQb2xpdGlxdWUgRnJhbmNlYCwgY29sb3IgPSAiVEYxIFBvbGl0aXF1ZSBGcmFuY2UiKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBgRnJhbmNlMlBvbGl0aXF1ZSBGcmFuY2VgLCBjb2xvciA9ICJGcmFuY2UgMiBQb2xpdGlxdWUgRnJhbmNlIikpICsgDQogIGdlb21fbGluZShhZXMoeSA9IGBBcnRlUG9saXRpcXVlIEZyYW5jZWAsIGNvbG9yID0gIkFydGUgUG9saXRpcXVlIEZyYW5jZSIpKSArDQogIGxhYnMoeCA9ICJEYXRlIiwNCiAgICAgICB5ID0gIkR1csOpZSAoaGV1cmVzKSIsIA0KICAgICAgIGNvbG9yID0gIlN1amV0IikgKw0KICBnZ3RpdGxlKCJNw6lkaWF0aXNhdGlvbiBkZSBsYSBwb2xpdGlxdWUgw6AgbGEgdMOpbMOpdmlzaW9uIGZyYW7Dp2Fpc2UiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMpDQoNCnANCmBgYA0KDQpOb3VzIHJlbWFycXVvbnMgw6lnYWxlbWVudCBxdWUgbm91cyBhdm9ucyB1bmUgcmVwcsOpc2VudGF0aW9uIGluw6lnYWxlIGRlcyBkb25uw6llcyBzdXIgbGVzIGNoYcOubmVzIGRlIHTDqWzDqXZpc2lvbiBmcmFuw6dhaXNlLiBBbG9ycyBxdWUgVEYxIGV0IEZyYW5jZSAyIG9udCBkZXMgcHJvZ3JhbW1lcyB0csOocyBzaW1pbGFpcmVzLCBBcnRlIGVzdCB1bmUgY2hhw65uZSBzdXIgbGFxdWVsbGUgbGEgcG9saXRpcXVlIG4nZXN0IHF1YXNpbWVudCBwYXMgcmVwcsOpc2VudMOpZS4NCg0KTm91cyBwb3V2b25zIGQnYWlsbGVycyB2w6lyaWZpZXIgY2VjaQ0KDQpgYGB7cn0NCiMgU8OpbGVjdGlvbm5lIGxlcyBjb2xvbm5lcyBxdWkgbm91cyBpbnTDqXJlc3NlbnQgcGVuZGFudCBsYSBww6lyaW9kZSAyMDE1LTIwMTgNCklOQV9wb2xpdGljcyA8LSBzZWxlY3QoQWN0dXNUViwgYE1PSVNgLCBgVEYxUG9saXRpcXVlIEZyYW5jZWAsIGBGcmFuY2UyUG9saXRpcXVlIEZyYW5jZWAsIGBGcmFuY2UzUG9saXRpcXVlIEZyYW5jZWAsIGBDYW5hbFBvbGl0aXF1ZSBGcmFuY2VgLCBgQXJ0ZVBvbGl0aXF1ZSBGcmFuY2VgLCBgTTZQb2xpdGlxdWUgRnJhbmNlYCkNCg0KSU5BX3BvbGl0aWNzIDwtIElOQV9wb2xpdGljc1tjKDExNzoxNjIpLCBdDQoNCiMgQ3LDqWUgdW5lIG5vdXZlbGxlIGRhdGEgZnJhbWUgc2FucyB1dGlsaXNlciBjb2xTdW1zIChuZSBmb25jdGlvbm5lIHBhcyBzdXIgbGUgZm9ybWF0IGhtcykNCklOQV9wb2xpdGljc19jdW11bGF0aXZlIDwtIGRhdGEuZnJhbWUoDQpuYW1lID0gYygiVEYxIiwgIkZyYW5jZSAyIiwgIkZyYW5jZSAzIiwgIkNhbmFsIiwgIkFydGUiLCAiTTYiKSAsIA0KdmFsdWUgPSBjKHN1bShJTkFfcG9saXRpY3MkYFRGMVBvbGl0aXF1ZSBGcmFuY2VgKSwgc3VtKElOQV9wb2xpdGljcyRgRnJhbmNlMlBvbGl0aXF1ZSBGcmFuY2VgKSwgc3VtKElOQV9wb2xpdGljcyRgRnJhbmNlM1BvbGl0aXF1ZSBGcmFuY2VgKSwgc3VtKElOQV9wb2xpdGljcyRgQ2FuYWxQb2xpdGlxdWUgRnJhbmNlYCksIHN1bShJTkFfcG9saXRpY3MkYEFydGVQb2xpdGlxdWUgRnJhbmNlYCksIHN1bShJTkFfcG9saXRpY3MkYE02UG9saXRpcXVlIEZyYW5jZWApKQ0KKQ0KDQojIFBsb3QgbGUgdGVtcHMgdG90YWwgYWxsb3XDqSDDoCBsYSBwb2xpdGlxdWUgZnJhbsOnYWlzZSBzdXIgY2hhcXVlIGNoYcOubmUNCmdncGxvdChJTkFfcG9saXRpY3NfY3VtdWxhdGl2ZSwgYWVzKHg9bmFtZSwgeT12YWx1ZSkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aD0wLjcsIGZpbGw9InN0ZWVsYmx1ZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZCh2YWx1ZSwgZGlnaXRzID0gMSkpLCB2anVzdD0xLjYsIGNvbG9yPSJ3aGl0ZSIsIHNpemU9My41KSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikgKw0KICB4bGFiKCJDaGHDrm5lIikgKw0KICB5bGFiKCJUZW1wcyBkJ8OpY3JhbiAocykiKSArDQogIGdndGl0bGUoIk3DqWRpYXRpc2F0aW9uIGRlIGxhIHBvbGl0aXF1ZSBlbiBmcmFuY2UiKQ0KYGBgDQoNCg0KQ2UgcXVpIGNvbmZpcm1lIGxlIGZhaXQgcXVlIFRGMSBldCBGcmFuY2UgMiBzb250IHNpbWlsYWlyZXMsIGV0IHF1J0FydGUgbmUgZGlmZnVzZSBxdWUgdHLDqHMgcGV1IGRlIHBvbGl0aXF1ZSBwYXIgcmFwcG9ydCDDoCBldXguIE9uIG5vdGVyYSBxdWUgQ2FuYWwrIGVzdCBsYSBjaGHDrm5lIHF1aSBkaWZmdXNlIGNlIHN1amV0IGxlIG1vaW5zLg0KDQpTaSBub3VzIG5vdXMgaW50w6lyZXNzb25zIG1haW50ZW5hbnQgw6AgdW5lIHZpc2lvbiBwbHVzIGxvY2FsZSBkZSBsYSBtw6lkaWF0aXNhdGlvbiBkZSBjZXMgw6lsZWN0aW9ucywgc3VyIFRGMSBwYXIgZXhlbXBsZSwNCg0KYGBge3J9DQojIFBsb3QgZGUgbGEgcG9saXRpcXVlIGZyYW7Dp2Fpc2Ugc3VyIFRGMSBsb3JzIGRlcyDDqWxlY3Rpb25zDQpJTkFfUG9saXRpY3MgPC0gZGF0YS5mcmFtZSgNCiAgZGF5ID0gQWN0dXNUViRNT0lTWzExNzoxNjJdLA0KICB2YWx1ZSA9IEFjdHVzVFYkYFRGMVBvbGl0aXF1ZSBGcmFuY2VgWzExNzoxNjJdDQopDQoNCnAgPC0gZ2dwbG90KElOQV9Qb2xpdGljcywgYWVzKHggPSBkYXksIHkgPSB2YWx1ZSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImNvcm5mbG93ZXJibHVlIikgKyANCiAgeGxhYigiRGF0ZSIpICsNCiAgeWxhYigiRHVyw6llIChoZXVyZXMpIikgKw0KICBnZ3RpdGxlKCJQb2xpdGlxdWUgZnJhbsOnYWlzZSBzdXJURjEiKQ0KDQpwDQpgYGANCk5vdXMgcG91dm9ucyBhcGVyY2V2b2lyIHVuZSBmb3J0ZSBhdWdtZW50YXRpb24gZGUgbGEgbcOpZGlhdGlzYXRpb24gZGUgbGEgcG9saXRpcXVlIGVuIDIwMTUsIG5vdGFtbWVudCDDoCBjYXVzZSBkZSBsJ2FudGljaXBhdGlvbiBkZSBsJ8OpbGVjdGlvbiBwcsOpc2lkZW50aWVsbGUsIGRlcyDDqWxlY3Rpb25zIGTDqXBhcnRlbWVudGFsZXMgZXQgcsOpZ2lvbmFsZXMuIE5vdXMgYXNzaXN0b25zIMOpZ2FsZW1lbnQgw6AgbGEgbW9udMOpZSBkdSBGcm9udCBOYXRpb25hbCBhcHLDqHMgbGVzIGF0dGVudGF0cyB0ZXJyb3N0aXN0ZXMgZGUgQ2hhcmxpZSBIZWJkbywgZHUgQmF0YWNsYW4gcHVpcyBkdSBTdGFkZSBkZSBGcmFuY2UuIExlIEYuTi4gZWZmZWN0dWUgZCdhaWxsZXVycyBjZXR0ZSBhbm7DqWUtbMOgIGxlcyBtZWlsbGV1cnMgc2NvcmVzIMOpbGVjdG9yYXV4IGRlIHNvbiBoaXN0b2lyZSwgZXQgcydlbnN1aXQgbGEgc3VjY2Vzc2lvbiBkZSBNYXJpbmUgTGUgUGVuIMOgIHNvbiBww6hyZSwgZXhjbHUgZHUgcGFydGkgYXByw6hzIGRlcyBwcm9wb3MgYW50aXPDqW1pdGVzLg0KDQoNCg0KIyNUcmF2YWlsIHN1ciBsZXMgdmFyaWFibGVzIGV4cGxpY2F0aXZlcw0KDQpOb3VzIG5vdXMgc29tbWVzIGludMOpcmVzc8OpcyBhdXggbGllbnMgcG91dmFudCBleGlzdGVyIGVudHJlIGxlcyBkb25uw6llcyBldCBzb3VoYWl0b25zIG5vdGFtbWVudCByw6lwb25kcmUgYXV4IHF1ZXN0aW9uczogUXVhbmQgdW5lIGNoYWluZSBwYXJsZSBkJ3VuIHN1amV0LCBlc3QgY2UgcXVlIGxlcyBhdXRyZXMgY2hhaW5lcyB2b250IGF1c3NpIGVuIHBhcmxlciA/IENlcnRhaW5zIHN1amV0cyBzb250IGlscyB0cmFpdMOpcyBkZSBtYW5pw6hyZSBkaWZmw6lyZW50ZXMgKGVuIHRlcm1lIGRlIHRlbXBzIGQnYW50ZW5uZSkgZW50cmUgbGVzIGRpZmbDqXJlbnRlcyBjaGHDrm5lcyA/DQpMZXMgZG9ubsOpZXMgw6l0YW50IG1lbnN1ZWxsZXMsIG9uIG5lIHBldXQgcGFzIHJlZ2FyZGVyIGRlcyB2YXJpYXRpb25zIGZpbmVzIG1haXMgYmllbiBkZXMgdmFyaWF0aW9ucyBpbXBvcnRhbnRlcyBvw7kgZGVzIGNoYcOubmVzIHZvbnQgY29sbGVjdGl2ZW1lbnQgYmVhdWNvdXAgcGFybGVyIGQndW4gc3VqZXQuDQoNCmBgYHtyfQ0KQWN0dXNUVlNlbGVjdD1zZWxlY3QoQWN0dXNUViwgZW5kc193aXRoKCJGYWl0cyBkaXZlcnMiKSkNCkFjdHVzVFZudW08LSBkYXRhLm1hdHJpeChBY3R1c1RWU2VsZWN0KQ0KZm9yIChpIGluIDE6ZGltKEFjdHVzVFZudW0pWzJdKSB7DQogIGZvciAoaiBpbiAxOiBkaW0oQWN0dXNUVm51bSlbMV0pew0KICAgIEFjdHVzVFZudW1baixpXSA8LSBhcy5udW1lcmljKEFjdHVzVFZTZWxlY3RbaixpXSkNCiAgfSANCn0NCm1jb3I9Y29yKEFjdHVzVFZudW0pDQpjb3JycGxvdChtY29yLCB0bC5jb2w9ImJsYWNrIikNCmBgYA0KDQpTdXIgY2V0dGUgbWF0cmljZSBkZSBjb3Jyw6lsYXRpb24sIG9uIHBldXQgdm9pciBxdWUgVEYxLCBGcmFuY2UyLCBGcmFuY2UgMywgTTYgZXQgQ2FuYWwrIHBhcmxlbnQgZGUgZmFpdHMgZGl2ZXJzIMOgIHBldSBwcsOocyBlbiBtw6ptZSB0ZW1wcy4gQXJ0ZSBzZSBkaXN0aW5ndWUgZXQgZW4gcGFybGUgw6AgZGVzIG1vbWVudHMgZGlmZsOpcmVudHMuDQoNCmBgYHtyfQ0KQWN0dXNUVlNlbGVjdD1zZWxlY3QoQWN0dXNUViwgZW5kc193aXRoKCJDYXRhc3Ryb3BoZXMiKSkNCkFjdHVzVFZudW08LSBkYXRhLm1hdHJpeChBY3R1c1RWU2VsZWN0KQ0KZm9yIChpIGluIDE6ZGltKEFjdHVzVFZudW0pWzJdKSB7DQogIGZvciAoaiBpbiAxOiBkaW0oQWN0dXNUVm51bSlbMV0pew0KICAgIEFjdHVzVFZudW1baixpXSA8LSBhcy5udW1lcmljKEFjdHVzVFZTZWxlY3RbaixpXSkNCiAgfSANCn0NCm1jb3I9Y29yKEFjdHVzVFZudW0pDQpjb3JycGxvdChtY29yLCB0bC5jb2w9ImJsYWNrIikNCmBgYA0KQ2V0dGUgZGlmZsOpcmVuY2UgZW50cmUgbGVzIGRpZmbDqXJlbnRzIGpvdXJuYXV4IGVzdCBwbHVzIGZhaWJsZSBzdXIgZCdhdXRyZXMgc3VqZXRzIGNvbW1lIGNlbHVpIGRlcyBjYXRhc3Ryb3BoZXMuDQoNCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgU8OpcGFyZSBsZSBqZXUgZGUgZG9ubsOpZXMgZW4gdHJhaW5pbmcgZXQgdGVzdGluZyBzZXQNCg0Kc2FtcGxlMSA9IHNhbXBsZS5zcGxpdChBY3R1c1RWJEFydGVDYXRhc3Ryb3BoZXMsIFNwbGl0UmF0aW8gPSAuNykNCnRyYWluMSA9IHN1YnNldChBY3R1c1RWLCBzYW1wbGUxID09IFRSVUUpDQp0ZXN0MSAgPSBzdWJzZXQoQWN0dXNUViwgc2FtcGxlMSA9PSBGQUxTRSkNCmRpbSh0cmFpbjEpDQpkaW0odGVzdDEpDQoNCiMgQ3LDqWF0aW9uIGR1IGNsYXNzaWZpZXVyIHBhciBmb3LDqnRzIGFsw6lhdG9pcmVzDQoNCnJmX2NsYXNzaWZpZXIgPC0gcmFuZG9tRm9yZXN0KA0KICBBcnRlQ2F0YXN0cm9waGVzIH4gLiwNCiAgZGF0YT1kYXRhLmZyYW1lKHRyYWluMSksDQogIGltcG9ydGFuY2UgPSBUUlVFDQopDQpyZl9jbGFzc2lmaWVyDQoNCnByZWRpY3Rpb24gPSBwcmVkaWN0KHJmX2NsYXNzaWZpZXIsIG5ld2RhdGE9ZGF0YS5mcmFtZSh0ZXN0MSkpDQoNCmBgYA0KDQpPbiB2b2l0IGljaSBxdWUgc2kgb24gY2hlcmNoYWl0IMOgIGRldGVybWluZXIgbGUgdGVtcHMgZCdhbnRlbm5lIGRlcyBjYXRhc3Ryb3BoZXMgc3VyIEFydGUsIG9uIGF1cmFpdCBzZXVsZW1lbnQgdW5lIGV4cGxpY2F0aW9uIGQnYXV0b3VyIGRlIDI1JSBkdWUgYXV4IGF1dHJlcyBjaGFpbmVzLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFfQ0KIyBTw6lwYXJlIGxlIGpldSBkZSBkb25uw6llcyBlbiB0cmFpbmluZyBldCB0ZXN0aW5nIHNldA0KDQpzYW1wbGUxID0gc2FtcGxlLnNwbGl0KEFjdHVzVFYkRnJhbmNlMkNhdGFzdHJvcGhlcywgU3BsaXRSYXRpbyA9IC43KQ0KDQp0cmFpbjEgPSBzdWJzZXQoQWN0dXNUViwgc2FtcGxlMSA9PSBUUlVFKQ0KdGVzdDEgID0gc3Vic2V0KEFjdHVzVFYsIHNhbXBsZTEgPT0gRkFMU0UpDQpkaW0odHJhaW4xKQ0KZGltKHRlc3QxKQ0KDQojIENyw6lhdGlvbiBkdSBjbGFzc2lmaWV1ciBwYXIgZm9yw6p0cyBhbMOpYXRvaXJlcw0KcmZfY2xhc3NpZmllciA8LSByYW5kb21Gb3Jlc3QoDQogIEZyYW5jZTJDYXRhc3Ryb3BoZXMgfiAuLA0KICBkYXRhPWRhdGEuZnJhbWUodHJhaW4xKSwNCiAgaW1wb3J0YW5jZSA9IFRSVUUNCikNCg0KcmZfY2xhc3NpZmllcg0KcHJlZGljdGlvbiA9IHByZWRpY3QocmZfY2xhc3NpZmllciwgbmV3ZGF0YT1kYXRhLmZyYW1lKHRlc3QxKSkNCmBgYA0KDQpTaSBvbiBjaGVyY2hlIMOgIGV4cGxpcXVlciBkZXMgdmFyaWFibGVzIGxpw6llcyDDoCBGcmFuY2UyLCBvbiB2b2l0IMOgIGwnaW52ZXJzZSBxdSdvbiBwZXV0IHBsdXMgZmFjaWxlbWVudCBsJ2V4cGxpcXVlciDDoCBwYXJ0aXIgZGVzIGF1dHJlcyB2YXJpYWJsZXMuDQoNCg0KDQojIyBEYXRhc2V0IElQU09TDQoNCkxlIHNlY29uZCBkYXRhc2V0IHF1ZSBub3VzIMOpdHVkaW9ucyBlc3QgbGUgZGF0YXNldCBJUFNPUywgcXVpIGluZGlxdWUgc2kgc3VyIHVuIMOpY2hhbnRpbGxvbiBkZSAxMDAwIHBlcnNvbm5lcywgbGEgcG9wdWxhdGlvbiBlc3QgcGx1dMO0dCBmYXZvcmFibGUgb3Ugbm9uIMOgIHVuIGNhbmRpZGF0IChwbHVzIGQnaW5mb3JtYXRpb25zIHBldXZlbnQgw6p0cmUgdHJvdXbDqWVzIGljaSBodHRwczovL3d3dy5pcHNvcy5jb20vZnItZnIvYmFyb21ldHJlLXBvbGl0aXF1ZSkuIFBvdXIgY2UgamV1IGRlIGRvbm7DqWVzLCBub3VzIGF2b25zIG1hbnVlbGxlbWVudCByw6ljdXDDqXLDqSBsYSBwb3B1bGFyaXTDqSBkZSAzIHBlcnNvbm5lcyBwb2xpdGlxdWVzIGltcG9ydGFudGVzOiBOaWNvbGFzIFNhcmtvenksIE1hcmluZSBMZSBQZW4gZXQgSmVhbi1MdWMgTWVsZW5jaG9uLiBOb3VzIGxlcyBhdm9ucyBjaG9pc2lzIGNhciDDqXRhbnQgcHLDqXNlbnRzIGRhbnMgbGUgY2hhbXAgcG9saXRpcXVlIGRlcHVpcyBsb25ndGVtcHMsIElQU09TIGRpc3Bvc2UgZGUgbm9tYnJldXNlcyBkb25uw6llcyBsZXMgY29uY2VybmFudC4NCg0KYGBge3J9DQojIyMgRG9ubsOpZXMgSVBTT1MNCg0KIyBSw6ljdXDDqXJhdGlvbiBkdSBkYXRhc2V0DQpJUFNPUyA8LSAgcmVhZF9kZWxpbSgiSVBTT1MuY3N2IiwgY29sX25hbWVzID0gVFJVRSwgZGVsaW0gPSAnOycsIGNvbF90eXBlcyA9IGNvbHMoTU9JUyA9IGNvbF9jaGFyYWN0ZXIoKSwgVEhFTUFUSVFVRVMgPSBjb2xfY2hhcmFjdGVyKCkpKQ0KSVBTT1MkRGF0ZSA9IGRteShJUFNPUyREYXRlKQ0KSVBTT1MgPC0gSVBTT1MgJT4lIG5hLm9taXQoKQ0KYGBgDQoNCmBgYHtyfQ0KIyBJbnNwZWN0aW9uIGR1IGRhdGFzZXQNCnN1bW1hcnkoSVBTT1MpDQpgYGANCg0KDQojIyBQbG90IERhdGEgSVBTT1MNCg0KYGBge3J9DQojIFBsb3QgbGUgZGF0YXNldCBJUFNPUyBlbiBmb25jdGlvbiBkdSB0ZW1wcw0KY29sb3JzIDwtIGMoIk5pY29sYXMgU2Fya296eSIgPSAiY29ybmZsb3dlcmJsdWUiLCAiTWFyaW5lIExlIFBlbiIgPSAiYnJvd24yIiwgIkplYW4tTHVjIE1lbGVuY2hvbiIgPSAiZGFya29saXZlZ3JlZW4zIikNCnAgPC0gZ2dwbG90KElQU09TLCBhZXMoeCA9IERhdGUpKSArDQogIGdlb21fbGluZShhZXMoeSA9IGBOaWNvbGFzIFNhcmtvenlgLCBjb2xvciA9ICJOaWNvbGFzIFNhcmtvenkiKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBgTWFyaW5lIExlIFBlbmAsIGNvbG9yID0gIk1hcmluZSBMZSBQZW4iKSkgKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gYEplYW4tTHVjLU1lbGVuY2hvbmAsIGNvbG9yID0gIkplYW4tTHVjIE1lbGVuY2hvbiIpKSArDQogIGxhYnMoeCA9ICJEYXRlIiwNCiAgICAgICB5ID0gIlBvcHVsYXJpdMOpICglKSIsIA0KICAgICAgIGNvbG9yID0gIkNhbmRpZGF0IikgKw0KICBnZ3RpdGxlKCJTb25kYWdlcyBwcsOpc2lkZW50aWVscyAyMDE3ICAoSVBTT1MpIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JzKQ0KDQpwDQpgYGANCg0KTm91cyBvYnNlcnZvbnMgcXVlIGxlcyBjYW5kaWRhdHMgZmF2b3JpcyBzb250IGdsb2JhbGVtZW50IE5pY29sYXMgU2Fya296eSBzdWl2aSBkZSBKZWFuLUx1YyBNw6lsZW5jaG9uLCBxdWkgcydlbnZvbGUgZW4gZMOpYnV0IDIwMTcgb8O5IGlsIGVzdCB0csOocyBwcsOpc2VudCBtw6lkaWF0aXF1ZW1lbnQgcGFybGFudC4gTm91cyBvYnNlcnZvbnMgw6lnYWxlbWVudCBxdSd1bmUgcGFydGllIGltcG9ydGFudGUgZGUgbGEgcG9wdWxhdGlvbiBlc3QgZmF2b3JhYmxlIMOgIGxhIGNhbmRpZGF0ZSBkdSBGcm9udCBOYXRpb25hbC4NCg0KDQpgYGB7cn0NCiMgUGxvdCBsZSBkYXRhc2V0IElQU09TIGVuIGZvbmN0aW9uIGRlIGxhIHBvcHVsYXJpdMOpIGdsb2JhbGUNCklQU09TX2N1bXVsYXRpdmUgPC0gZGF0YS5mcmFtZSgNCiAgbmFtZT1jKCJTYXJrb3p5IiwiTGUgUGVuIiwiTcOpbGVuY2hvbiIpICwgIA0KICB2YWx1ZT1jb2xTdW1zKElQU09TWy0xLC0xXSwgbmEucm0gPSBUUlVFKS9zdW0oIWlzLm5hKElQU09TJGBOaWNvbGFzIFNhcmtvenlgKSkNCikNCg0KZ2dwbG90KElQU09TX2N1bXVsYXRpdmUsIGFlcyh4PW5hbWUsIHk9dmFsdWUpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGg9MC43LCBmaWxsPSJzdGVlbGJsdWUiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWw9cm91bmQodmFsdWUsIGRpZ2l0cyA9IDEpKSwgdmp1c3Q9MS42LCBjb2xvcj0id2hpdGUiLCBzaXplPTMuNSkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIpICsNCiAgeGxhYigiQ2FuZGlkYXQiKSArDQogIHlsYWIoIlBvcHVsYXJpdMOpICglKSIpICsNCiAgZ2d0aXRsZSgiJSBtb3llbiBkZXMgcHJpbmNpcGF1eCBjYW5kaWRhdHMgKElQU09TKSIpDQpgYGANCg0KTGUgY2FuZGlkYXQgbGUgcGx1cyBwb3B1bGFpcmUgImdsb2JhbGVtZW50IiBzdXIgbGEgcMOpcmlvZGUgZXN0IGRvbmMgSmVhbi1MdWMgTcOpbGVuY2hvbi4NCg0KT24gbm90ZSBxdWUgbGVzIHBvcHVsYXJpdMOpcyBuZSBzJ2Fqb3V0ZW50IHBhcyBwb3VyIGZhaXJlIDEwMCUgY2FyIG9uIG5lIHJlbMOodmUgaWNpIHF1J3VuZSBwb3B1bGFyaXTDqSBnbG9iYWxlIHN1ciBsYSBwb3B1bGF0aW9uLCBldCBwYXMgdW4gcG91cmNlbnRhZ2UgZGUgdm9peCBkYW5zIGxlcyBzb25kYWdlcy4gRGFucyB1biBjbGltYXQgcG9saXRpcXVlIG/DuSBsZXMgY2FuZGlkYXRzIG5lIGNvbnZpZW5kcmFpZW50IHBhcyDDoCBsYSBwb3B1bGF0aW9uLCBvbiBwZXV0IG3Dqm1lIGltYWdpbmVyIHVuIHNjw6luYXJpbyBoeXBvdGjDqXRvcXVlIG/DuSBhdWN1biBjYW5kaWRhdCBuJ2EgcGx1cyBkZSAxMCUgZGUgcG9wdWxhcml0w6kgcGFyIGV4ZW1wbGUuDQoNCg0KDQojIyBEYXRhc2V0IFNvbmRhZ2VzDQoNCk5vdXMgY3LDqW9ucyB1biBqZXUgZGUgZG9ubsOpZXMgU29uZGFnZXMgZW4gcsOpY29sdGFudCBkZXMgcsOpc3VsdGF0cyBkZSBzb25kYWdlcyBkZSBkaWZmw6lyZW50ZXMgc291cmNlcyBzdXIgV2lraXDDqWRpYSAocGx1cyBkJ2luZm9ybWF0aW9ucyBzb250IGRpc3BvbmlibGVzIGljaSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGluaW9uX3BvbGxpbmdfZm9yX3RoZV8yMDE3X0ZyZW5jaF9wcmVzaWRlbnRpYWxfZWxlY3Rpb24pLg0KDQpgYGB7cn0NCiMjIyBEYXRhc2V0IFNvbmRhZ2VzDQoNCiMgRm9uY3Rpb25zIGRlIG5ldHRveWFnZSBkZXMgZG9ubsOpZXMNCnB0b24gPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuKGFzLm51bWVyaWMoc3Vic3RyKHgsIDAsbmNoYXIoeCktMSkpKQ0KfQ0KDQpGaXJzdE9mVGhlTW9udGggPC0gZnVuY3Rpb24oZCkgew0KICByZXR1cm4ocGFzdGUoIjEiLHN1YnN0cmluZyhkLG5jaGFyKGQpLTcpKSkNCiAgICByZXR1cm4ocGFzdGUoIjEiLCBzdWJzdHJpbmcoZCwgbmNoYXIoZCktNykpKQ0KDQp9DQoNCm1lYW5Nb250aD1mdW5jdGlvbihsLCBtKXsNCiAgICByZXR1cm4obWVhbihsW2wkYEZpZWxkd29yayBkYXRlYCA9PSBtXSwgbmEucm0gPSBUUlVFKSkNCn0NCg0KIyBGdW5jdGlvbiBwb3VyIGxlIHdlYiBzY3JhcGluZw0KcmVjdXBQb2xsID0gZnVuY3Rpb24ocGF0aCwgbmFtZVBhZ2Upew0KICAgICMgcGFyYW0gcGF0aCA6IHhwYXRoIHRvIGRhdGEgdGFibGUNCiAgICAjIHBhcmFtIG5hbWVQYWdlIDogbGluayB0byB3aWtpcGVkaWEgcGFnZQ0KICAgIHBhZ2UgPSByZWFkX2h0bWwobmFtZVBhZ2UpDQogICAgcG9sbHMgPSBodG1sX3RhYmxlKGh0bWxfbm9kZXMocGFnZSx4cGF0aCA9IHBhdGgpLCBoZWFkZXI9VFJVRSwgdHJpbT1UUlVFLCBkZWMgPSAiLCIpW1sxXV1bLTEsXQ0KICAgIGFzLm51bWVyaWMoZ3N1YigiXFwsIiwiIiwgcG9sbHMkU2FtcGxlc2l6ZSkpDQogICAgcG9sbHMkQWJzLiA9IHB0b24ocG9sbHMkQWJzLikNCiAgICBwb2xscyRNYWNyb25FTSA9IHB0b24ocG9sbHMkTWFjcm9uRU0pDQogICAgcG9sbHMkRmlsbG9uTFIgPSBwdG9uKHBvbGxzJEZpbGxvbkxSKQ0KICAgIHBvbGxzJGBNw6lsZW5jaG9uRklgID0gcHRvbihwb2xscyRNw6lsZW5jaG9uRkkpDQogICAgcG9sbHMkYExlIFBlbkZOYCA9IHB0b24ocG9sbHMkYExlIFBlbkZOYCkNCiAgICBmb3IgKGkgaW4gMjpsZW5ndGgocG9sbHMkYEZpZWxkd29yayBkYXRlYCkpIHsNCiAgICAgICAgcG9sbHMkYEZpZWxkd29yayBkYXRlYFtpXSA9IEZpcnN0T2ZUaGVNb250aChwb2xscyRgRmllbGR3b3JrIGRhdGVgW2ldKQ0KICAgIH0NCiAgICBwb2xscyRgRmllbGR3b3JrIGRhdGVgID0gZG15KHBvbGxzJGBGaWVsZHdvcmsgZGF0ZWApDQogICAgcmV0dXJuKHBvbGxzKQ0KfQ0KDQojIEZvbmN0aW9uIGRlIG1veWVubmFnZSBkZXMgc29uZGFnZXMNCmF2ZyA9IGZ1bmN0aW9uKHBvbCkgew0KICAgIHJldHVybihhZ2dyZWdhdGUoY2JpbmQoTWFjcm9uRU0sIGBMZSBQZW5GTmAsIEZpbGxvbkxSLCBgTcOpbGVuY2hvbkZJYCwgQWJzLikgfiBgRmllbGR3b3JrIGRhdGVgLCBwb2wsIEZVTiA9IG1lYW4sIG5hLnJtID0gVFJVRSwgbmEuYWN0aW9uID0gbmEucGFzcykpDQp9DQoNCiMgUsOpY29sdGUgZGVzIGRvbm7DqWVzIGRlcyBzb25kYWdlcyBwcsOpc2lkZW50aWVscyAyMDE3IA0KbmFtZVAyMDE3ID0gImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09waW5pb25fcG9sbGluZ19mb3JfdGhlXzIwMTdfRnJlbmNoX3ByZXNpZGVudGlhbF9lbGVjdGlvbiINCnBvbGxzID0gcmVjdXBQb2xsKCcvaHRtbC9ib2R5L2RpdlszXS9kaXZbM10vZGl2WzVdL2RpdlsxXS90YWJsZVsxXScsIG5hbWVQMjAxNykNCnBvbGxzID0gbWVyZ2UocG9sbHMsIHJlY3VwUG9sbCgnL2h0bWwvYm9keS9kaXZbM10vZGl2WzNdL2Rpdls1XS9kaXZbMV0vdGFibGVbMl0nLCBuYW1lUDIwMTcpLCBhbGw9VFJVRSkNCnBvbGxzID0gbWVyZ2UocG9sbHMsIHJlY3VwUG9sbCgnL2h0bWwvYm9keS9kaXZbM10vZGl2WzNdL2Rpdls1XS9kaXZbMV0vdGFibGVbNF0nLCBuYW1lUDIwMTcpLCBhbGw9VFJVRSkNCnBvbGxzID0gbWVyZ2UocG9sbHMsIHJlY3VwUG9sbCgnL2h0bWwvYm9keS9kaXZbM10vZGl2WzNdL2Rpdls1XS9kaXZbMV0vdGFibGVbNV0nLCBuYW1lUDIwMTcpLCBhbGw9VFJVRSkNCnBvbGxzTW9udGggPSBhdmcocG9sbHMpDQpwb2xsc01vbnRoID0gcmVuYW1lKHBvbGxzTW9udGgsIGZpZWxkd29ya0RhdGUgPSBgRmllbGR3b3JrIGRhdGVgKQ0KZGF0YSA8LSBtZXJnZSh4ID0gcG9sbHNNb250aCwgeSA9IEFjdHVzVFYsIGJ5LnggPSAiZmllbGR3b3JrRGF0ZSIsIGJ5LnkgPSAiTU9JUyIpDQpkYXRhMiA8LSBtZXJnZSh4ID0gSVBTT1MsIHkgPSBBY3R1c1RWLCBieS54ID0gIkRhdGUiLCBieS55ID0gIk1PSVMiKQ0KDQojIFLDqW9yZG9ubmUgbGVzIGRvbm7DqWVzIHBhciBkYXRlIGNyb2lzc2FudGUgY2FyIG9uIGNyb2lzZSBwbHVzaWV1cnMgc29uZGFnZXMgZGlmZsOpcmVudHMNCmRhdGEgPC0gZGF0YVtvcmRlcihhcy5EYXRlKGRhdGEkZmllbGR3b3JrRGF0ZSwgZm9ybWF0ID0gIiVkLyVtLyVZIikpLF0NCg0KcGxvdENvciA9IGZ1bmN0aW9uKGRhdGEsIGNhdGVnb3JpZSkgew0KICAgIGNvcnJwbG90KGNvcihBY3R1c1RWbnVtJT4lc2VsZWN0KGNvbnRhaW5zKGNhdGVnb3JpZSkpKSwgdHlwZSA9ICJ1cHBlciIsIG9yZGVyID0gImhjbHVzdCIsIHRsLmNvbCA9ICJibGFjayIsIHRsLnNydCA9IDQ1KQ0KfQ0KDQpjb252ZXJ0X21pbnV0ZXMgPSBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiggaG91cihkYXRlKSAqIDYwICsgbWludXRlKHgpICsgc2Vjb25kKHgpIC8gNjAgKQ0KfQ0KDQojIFN1cHByZXNzaW9uIGRlcyBwcm94eSB2YXJpYWJsZXMNCnJtKHBvbGxzLCBuYW1lUDIwMTcpDQpgYGANCg0KDQojIyBQbG90IERhdGEgU3VydmV5cw0KDQpgYGB7cn0NCiMgUGxvdCBsZSBkYXRhc2V0IFNvbmRhZ2VzIGVuIGZvbmN0aW9uIGR1IHRlbXBzDQpkYXRhX3Bsb3QgPC0gZGF0YSAlPiUgbmEub21pdCgpDQoNCmNvbG9ycyA8LSBjKCJFbW1hbnVlbCBNYWNyb24iID0gImNvcm5mbG93ZXJibHVlIiwgIk1hcmluZSBMZSBQZW4iID0gImJyb3duMiIsICJKZWFuLUZyYW7Dp29pcyBGaWxsb24iID0gImRhcmtvbGl2ZWdyZWVuMyIpDQoNCnAgPC0gZ2dwbG90KGRhdGFfcGxvdCwgYWVzKHggPSBmaWVsZHdvcmtEYXRlKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBNYWNyb25FTSwgY29sb3IgPSAiRW1tYW51ZWwgTWFjcm9uIikpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gYExlIFBlbkZOYCwgY29sb3IgPSAiTWFyaW5lIExlIFBlbiIpKSArIA0KICBnZW9tX2xpbmUoYWVzKHkgPSBGaWxsb25MUiwgY29sb3IgPSAiSmVhbi1GcmFuw6dvaXMgRmlsbG9uIikpICsNCiAgbGFicyh4ID0gIkRhdGUiLA0KICAgICAgIHkgPSAiJSIsIA0KICAgICAgIGNvbG9yID0gIkNhbmRpZGF0IikgKw0KICBnZ3RpdGxlKCJTb25kYWdlcyBwcsOpc2lkZW50aWVscyAyMDE3IChzb3VyY2VzIG11bHRpcGxlcykiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnMpDQoNCnANCmBgYA0KDQpOb3VzIGFwZXJjZXZvbnMgbCdhc2NlbnNpb24gcHVpcyBkw6ljbGluIGRlIEZyYW7Dp29pcyBGaWxsb24gw6AgY2F1c2UgZHUgIlDDqW7DqWxvcGVnYXRlIiBxdWkgcmVsw6h2ZSBkZSBsJ2FjY3VzYXRpb24gZW52ZXJzIGxlIGNhbmRpZGF0IGRlIGNyw6llciBkZXMgZW1wbG9pcyBmaWN0aWZzIHBvdXIgc2EgZmVtbWUuIEVudHJlIGxlIDMxIGTDqWNlbWJyZSAyMDE2IGV0IGxlIDMxIG1hcnMgMjAxNywgMjkwIHN1amV0cyBvbnQgcmVuZHUgY29tcHRlIGRlIGzigJlhZmZhaXJlIEZpbGxvbiwgc29pdCA1Myw3JSBkZSBsYSB0b3RhbGl0w6kgZGVzIHN1amV0cyBjb25zYWNyw6lzIGF1IGNhbmRpZGF0IGRlIGxhIERyb2l0ZSBldCBkdSBDZW50cmUgKHNvdXJjZTogSU5BKS4gSWwgZXN0IMOpZ2FsZW1lbnQgaW50w6lyZXNzYW50cyBkZSBub3RlciBxdWUgSmVhbi1MdWMgTcOpbGVuY2hvbiBldCBGcmFuw6dvaXMgRmlsbG9ucyBzb250IGxlcyBkZXV4IGNhbmRpZGF0cyBsZXMgcGx1cyBjaXTDqXMgZGFucyBsZXMgVHdlZXRzLCBldCBxdSdpbHMgc2Vyb250IHRvdXMgZGV1eCDDqWxpbWluw6lzIGF1IHByZW1pZXIgdG91ci4NCg0KDQpgYGB7cn0NCiMgUGxvdCBsZSBkYXRhc2V0IFNvbmRhZ2VzIGVuIGZvbmN0aW9uIGRlIGxhIHBvcHVsYXJpdMOpIGdsb2JhbGUNCmRhdGFfY3VtdWxhdGl2ZSA8LSBkYXRhLmZyYW1lKA0KICBuYW1lPWMoIk1hY3JvbiIsIkxlIFBlbiIsIkZpbGxvbiIpICwgIA0KICB2YWx1ZT1jb2xTdW1zKGRhdGFbMjo0XVstMSxdLCBuYS5ybSA9IFRSVUUpL3N1bSghaXMubmEoZGF0YSRNYWNyb25FTSkpDQopDQoNCmdncGxvdChkYXRhX2N1bXVsYXRpdmUsIGFlcyh4PW5hbWUsIHk9dmFsdWUpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjcsIGZpbGwgPSAic3RlZWxibHVlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKHZhbHVlLCBkaWdpdHMgPSAxKSksIHZqdXN0ID0gMS42LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJCbHVlcyIpICsNCiAgeGxhYigiQ2FuZGlkYXQiKSArDQogIHlsYWIoIiUgZGUgbCdvcGluaW9uIikgKw0KICBnZ3RpdGxlKCJQb3VyY2VudGFnZSBtb3llbiBkZXMgcHJpbmNpcGF1eCBjYW5kaWRhdHMgKHNvdXJjZXMgbXVsdGlwbGVzKSIpDQpgYGANCg0KQ2UgcGxvdCBkZSBwb3B1bGFyaXTDqSBub3VzIHBlcm1ldCBkZSBub3VzIHJlbmRyZSBjb21wdGUgcXVlIE1hY3JvbiBuZSBwYXJ0YWl0IGNsYWlyZW1lbnQgcGFzIHZhaW5xdWV1ciBkZSBsJ8OpbGVjdGlvbi4gQ2UgZGVybmllciBhIGQnYWlsbGV1cnMgw6l0w6kgYmllbiBtb2lucyBtw6lkaWF0aXPDqSBxdWUgZCdhdXRyZXMgY2FuZGlkYXRzIGF1IGTDqWJ1dCBkZSBsYSBjYW1wYWduZSwgcG91ciBsJ8OqdHJlIGJlYXVjb3VwIHN1ciBsYSBmaW4uIFNldWxzIDQgY2FuZGlkYXRzIChGLiBGaWxsb24sIEUuIE1hY3JvbiwgQi4gSGFtb24gZXQgTS4gTGUgUGVuKSBhcHBhcmFpc3NlbnQgcGx1cyBkZSAxMDAgZm9pcyDDoCBsYSB0w6lsw6l2aXNpb24gcGVuZGFudCBsYSBjYW1wYWduZSBwcsOpc2lkZW50aWVsbGUgZGUgZsOpdnJpZXIgw6AgYXZyaWwgMjAxNy4gUG91ciBjb21wYXJhaXNvbiwgRi4gRmlsbG9uIGFwcGFyYcOudCAxNjQgZm9pcyB0YW5kaXMgcXVlIEouTC4gTcOpbGVuY2hvbiBzZXVsZW1lbnQgNzIgZm9pcyAoc291cmNlOiBJTkEpLg0KDQoNCg0KIyMgTEFTU08gcsOpZ3Jlc3Npb24gc3VyIGxlIGRhdGFzZXQgSVBTT1MNCg0KTm91cyBhbGxvbnMgbWFpbnRlbmFudCBhbmFseXNlciBjZXMgZG9ubsOpZXMgcG91ciBkw6l0ZXJtaW5lciBzaSBub3VzIHBvdXZvbnMgdHJvdXZlciBkZXMgbGllbnMgZW50cmUgbGEgcG9wdWxhcml0w6kgZGVzIGNhbmRpZGF0cyBldCBsYSBtw6lkaWF0aXNhdGlvbiBkZSBjZXJ0YWlucyBzdWpldHMgw6AgbGEgdMOpbMOpdmlzaW9uIGZyYW7Dp2Fpc2UuIE5vdXMgdm91bG9ucyBzYXZvaXIgcydpbCBlc3QgcG9zc2libGUgZGUgZMOpdGVybWluZXIgdW4gbGllbiBlbnRyZSBsYSBtw6lkaWF0aXNhdGlvbiBkZSBjZXJ0YWlucyBzdWpldHMgZXQgbGEgcG9wdWxhcml0w6kgZGVzIGNhbmRpZGF0cy4NCg0KTm91cyBwcmVub25zIGwnZXhhbXBsZSBkZSBKZWFuLUx1Yy1NZWxlbmNob246DQoNCmBgYHtyfQ0KIyBUcmFuc2Zvcm1hdGlvbiBkZXMgZG9ubsOpZXMNCmRhdGEgPSBkYXRhMlstMSxdDQp4ID0gbW9kZWwubWF0cml4KGBKZWFuLUx1Yy1NZWxlbmNob25gfi4sIGRhdGEpWywtMV0NCnkgPSBkYXRhICU+JQ0KICBzZWxlY3QoYEplYW4tTHVjLU1lbGVuY2hvbmApICU+JQ0KICB1bmxpc3QoKSAlPiUNCiAgYXMubnVtZXJpYygpDQoNCiNTw6lwYXJhdGlvbiBkdSBkYXRhc2V0IGVuIHNldCBkJ2VudHJhaW5lbWVudCBldCBkZSB0ZXN0DQpzZXQuc2VlZCgxKQ0KDQp0cmFpbiA9IGRhdGEgJT4lDQogIHNhbXBsZV9mcmFjKDAuNykNCg0KdGVzdCA9IGRhdGEgJT4lDQogIHNldGRpZmYodHJhaW4pDQoNCnhfdHJhaW4gPSBtb2RlbC5tYXRyaXgoYEplYW4tTHVjLU1lbGVuY2hvbmB+LiwgdHJhaW4pWywtMV0NCnhfdGVzdCA9IG1vZGVsLm1hdHJpeChgSmVhbi1MdWMtTWVsZW5jaG9uYH4uLCB0ZXN0KVssLTFdDQoNCnlfdHJhaW4gPSB0cmFpbiAlPiUNCiAgc2VsZWN0KGBKZWFuLUx1Yy1NZWxlbmNob25gKSAlPiUNCiAgdW5saXN0KCkgJT4lDQogIGFzLm51bWVyaWMoKQ0KDQp5X3Rlc3QgPSB0ZXN0ICU+JQ0KICBzZWxlY3QoYEplYW4tTHVjLU1lbGVuY2hvbmApICU+JQ0KICB1bmxpc3QoKSAlPiUNCiAgYXMubnVtZXJpYygpDQoNCiMgRml0IHN1ciBsZSB0cmFpbmluZyBzZXQsIHZhbGlkYXRpb24gc3VyIGxlIHRlc3Qgc2V0DQpncmlkID0gMTBec2VxKDEwLCAtMiwgbGVuZ3RoID0gMTAwKQ0KbGFzc29fbW9kID0gZ2xtbmV0KHhfdHJhaW4sIHlfdHJhaW4sIGFscGhhPTEsIGxhbWJkYSA9IGdyaWQsIHRocmVzaCA9IDFlLTUpDQpsYXNzb19wcmVkID0gcHJlZGljdChsYXNzb19tb2QsIHMgPSA0LCBuZXd4ID0geF90ZXN0KQ0KbWVhbigobGFzc29fcHJlZCAtIHlfdGVzdCleMikNCmBgYA0KDQpOb3VzIHJlbWFycXVvbnMgcXVlIG3Dqm1lIHNpIG5vdXMgc8OpbGVjdGlvbm5vbnMgbGUgbWVpbGxldXIgbGFtYmRhIHBvdXIgbGEgcsOpZ3VsYXJpc2F0aW9uIGwxLCBub3VzIG9idGVub25zIHF1YW5kIG3Dqm1lIHVuZSBlcnJldXIgImltcG9ydGFudGUiIHN1ciBsZSByaXNxdWUgZW1waXJpcXVlLg0KDQpgYGB7cn0NCnBsb3RfZ2xtbmV0KGxhc3NvX21vZCkNCmBgYA0KDQpDZSBwbG90IHBlcm1ldCBkZSByZXRyb3V2ZXIgbCdpbnR1aXRpb24gZGVycmnDqHJlIGxlIExBU1NPLCBzaSBsYW1iZGEgZXN0IGdyYW5kLCBsYSBzb2x1dGlvbiBzZXJhIHRyw6hzIHNwYXJzZSBldCB0b3VzIGxlcyBjb2VmZmljaWVudHMgc2Vyb250IGFtZW7DqXMgw6AgesOpcm8uIFMnaWwgZXN0IHBldGl0IGV0IHByb2NjaGUgZGUgesOpcm8sIGxlIHRlcm1lIMOgIG1pbmltaXNlciBzZXJhIGxlIHRlcm1lIGRlIGZpZMOpbGl0w6kgYXZlYyBsZXMgZG9ubsOpZXMgZXQgb24gc2UgcmFtw6huZSDDoCB1biBwcm9ibMOobWUgZGVzIG1vaW5kcmVzIGNhcnLDqXMgb3JkaW5haXJlcy4gU2kgb24gem9vbWFpdCBzdXIgbGEgem9uZSDDoCBkcm9pdGUsIG9uIHBvdXJyYWl0IG9ic2VydmVyIHVuZSBzb2x1dGlvbiBsaW7DqWFpcmUgcGFyIG1vcmNlYXV4LCBjJ2VzdCBkw7sgw6AgbCdvcMOpcmF0ZXVyIGR1IHNvZnQgdGhyZXNob2xkaW5nLCBxdWkgbWluaW1pc2UgbGUgTEFTU08uDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMSkNCiMgRml0IGxhc3NvIHJlZ3Jlc3Npb24gbW9kZWwgb24gdHJhaW5pbmcgZGF0YQ0KY3Yub3V0ID0gY3YuZ2xtbmV0KHhfdHJhaW4sIHlfdHJhaW4sIGFscGhhID0gMSkgDQojIFPDqWxlY3Rpb25uZSBsZSBsYW1iZGEgcXVpIG1pbmltaXplIGxhIE1TRSBkJ2VudHJhw65uZW1lbnQNCmJlc3RsYW0gPSBjdi5vdXQkbGFtYmRhLm1pbiAgDQpwbG90KGN2Lm91dCkNCmBgYA0KDQpOb3VzIHBvdXZvbnMgaWNpIHJlbWFycXVlciBxdSdpbCB5IGEgdW4gbGFtYmRhIG9wdGltYWwgcHLDqHMgZGUgMSAoc29uIGxvZyBlc3QgcHJvY2hlIGRlIHrDqXJvKSwgZXQgbGEgTVNFIHJlbW9udGUgYXByw6hzIGwnYXZvaXIgYXR0ZWludC4NCg0KYGBge3J9DQpvdXQgPSBnbG1uZXQoeCwgeSwgYWxwaGEgPSAxLCBsYW1iZGEgPSBncmlkKQ0KbGFzc29fY29lZiA9IHByZWRpY3Qob3V0LCB0eXBlID0gImNvZWZmaWNpZW50cyIsIHMgPSBiZXN0bGFtKQ0KbGFzc29fY29lZltsYXNzb19jb2VmICE9IDBdDQpsYXNzb19jb2VmQERpbW5hbWVzW1sxXV1bd2hpY2gobGFzc29fY29lZiAhPSAwICkgXQ0KYGBgDQoNCk5vdXMgcG91dm9ucyByZXRyb3V2ZXIgaWNpIGxlcyB2YXJpYWJsZXMgcXVlIGxhIHLDqWdyZXNzaW9uIExBU1NPIGEgc8OpbGVjdGlvbm7DqS4gQ29tbWUgYXR0ZW5kdSwgbm91cyByZXRyb3V2b25zIGxhIHBvbGl0aXF1ZSBlbiBGcmFuY2Ugc3VyIGRldXggY2hhw65uZXMsIG1haXMgcmV0cm91dm9ucyDDqWdhbGVtZW50IGRlcyB2YXJpYWJsZXMgcGx1cyBkaXNjdXRhYmxlcyBjb21tZSAiU2NpZW5jZXMgZXQgdGVjaG5pcXVlcyIgc3VyIENhbmFsKy4gTGUgZmFpdCBxdWUgbm91cyBuJ2F5b25zIHF1ZSBwZXUgZGUgZG9ubsOpZXMgcG91ciBsYSByw6lncmVzc2lvbiBub3VzIGFtw6huZSDDoCBuZSBwYXMgcG91dm9pciByw6llbGxlbWVudCBzw6lsZWN0aW9ubmVyIHRvdXRlcyBsZXMgdmFyaWFibGVzLiBVbiBjb21wb3J0ZW1lbnQgw6AgbCfDqWNoZWxsZSBwbHVzIGxvY2FsZSBhdXJhaXQgcHUgw6p0cmUgZMOpc2lyZXV4IChhdmVjIGRlcyBkb25uw6llcyBJTkEgdG91dGVzIGxlcyBzZW1haW5lcyBhdSBsaWV1IGRlIHRvdXMgbGVzIG1vaXMgcGFyIGV4ZW1wbGUpIGFmaW4gZCdhbmFseXNlciBkZXMgc8OpcmllcyB0ZW1wb3JlbGxlcyBkZSBtYW5pw6hyZSBwbHVzIHByw6ljaXNlLg0KDQoNCiMjIFJhbmRvbSBGb3Jlc3RzDQoNCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgQ2hhcmdlbWVudCBkZXMgcGFja2FnZXMNCm5hbWVzKGRhdGEpIDwtIG1ha2UubmFtZXMobmFtZXMoZGF0YSksdW5pcXVlID0gVFJVRSkNCg0KIyBTw6lwYXJlIGxlIGpldSBkZSBkb25uw6llcyBlbiB0cmFpbmluZyBldCB0ZXN0aW5nIHNldA0Kc2FtcGxlID0gc2FtcGxlLnNwbGl0KGRhdGEkSmVhbi5MdWMuTWVsZW5jaG9uLCBTcGxpdFJhdGlvID0gLjcpDQp0cmFpbiA9IHN1YnNldChkYXRhLCBzYW1wbGUgPT0gVFJVRSkNCnRlc3QgID0gc3Vic2V0KGRhdGEsIHNhbXBsZSA9PSBGQUxTRSkNCmRpbSh0cmFpbikNCmRpbSh0ZXN0KQ0KDQojIENyw6lhdGlvbiBkdSBjbGFzc2lmaWV1ciBwYXIgZm9yw6p0cyBhbMOpYXRvaXJlcw0KcmZfY2xhc3NpZmllciA8LSByYW5kb21Gb3Jlc3QoDQogIEplYW4uTHVjLk1lbGVuY2hvbiB+IC4sDQogIGRhdGE9dHJhaW4sDQogIGltcG9ydGFuY2UgPSBUUlVFDQopDQpyZl9jbGFzc2lmaWVyDQoNCnByZWRpY3Rpb24gPSBwcmVkaWN0KHJmX2NsYXNzaWZpZXIsIG5ld2RhdGE9dGVzdCkNCmNvbmZ1c2lvbl9tYXRyaXggPSB0YWJsZSh0ZXN0JEplYW4uTHVjLk1lbGVuY2hvbiwgcHJlZGljdGlvbikNCmNvbmZ1c2lvbl9tYXRyaXgNCmBgYA0KDQpPbiB2b2l0IHF1ZSBub3VzIHBvdXZvbnMgb2J0ZW5pciBjZXJ0YWluZXMgY29ycsOpbGF0aW9ucywgY2FyIGxlIG5vbWJyZSBkZSBkb25uw6llcyBlc3QgcGx1cyDDqWxldsOpLiBPbiBzZSBwb3NlIGRvbmMgbGEgcXVlc3Rpb246IEVzdCBjZSBxdSdpbCB5IGEgdW5lIGNvcnLDqWxhdGlvbiBlbnRyZSBsYSBwb3B1bGFyaXTDqSBkZXMgY2FuZGlkYXRzIGV0IGxlcyBpbnRlbnRpb25zIGRlIHZvdGUgZW52ZXJzIGNlcyBjYW5kaWRhdHMgPyBDZWxhIHBlcm1ldHRyYWl0IGRlIHNlIGJhc2VyIHN1ciBsZXMgZG9ubsOpZXMgcHLDqS3DqWxlY3Rpb25zIHBvdXIgdm9pciBsZXMgc3VqZXRzIHF1aSBvbnQgdW4gbGllbiBhdmVjIGxhIHBvcHVsYXJpdMOpIGR1IGNhbmRpZGF0IHB1aXMgZGUgdm9pciBsJ8Opdm9sdXRpb24gZGUgY2VzIHN1amV0cyBwb3VyIGVzdGltZXIgbGVzIGludGVudGlvbnMgZGUgdm90ZS4gT24gdmEgaWNpIHJlZ2FyZGVyIGxlcyBjb2VmZmljaWVudHMgZGUgY29ycsOpbGF0aW9uIGVudHJlIGNlcyBkZXV4IHZhcmlhYmxlcyBldCB2b2lyIHNpIG9uIHBldXQgZXhwbGlxdWVyIGxlIHZvdGUgcGFyIGxhIHBvcHVsYXJpdMOpLiBPbiDDqXR1ZGllIGljaSBKZWFuLUx1YyBNw6lsZW5jaG9uIGV0IE1hcmluZSBMZSBQZW4gY2FyIGNlIHNvbnQgbGVzIGRldXggY2FuZGlkYXRzIGRvbnQgb24gYSBsZXMgZG9ubsOpZXMgSVBTT1MuIElsIHNlcmFpdCBpbnTDqXJlc3NhbnQgZCfDqXRlbmRyZSBjZXR0ZSBhbmFseXNlIGF1eCBhdXRyZXMgY2FuZGlkYXRzLg0KDQpQb3VyIE1hcmluZSBMZSBQZW46DQoNCg0KDQoNCg0KYGBge3J9DQpJUFNPU19EQVRBPW1lcmdlKElQU09TLHBvbGxzTW9udGgsYnkueD0nRGF0ZScsYnkueT0nZmllbGR3b3JrRGF0ZScpDQoNCiMgRXhwbGljYXRpb24gZGUgbGEgY29ycsOpbGF0aW9uDQpwcmludChjb3IoSVBTT1NfREFUQSRgTGUgUGVuRk5gLElQU09TX0RBVEEkYE1hcmluZSBMZSBQZW5gKSkNCmBgYA0KDQoNCmBgYHtyfQ0KbG0yIDwtIGxtKGBMZSBQZW5GTmB+YE1hcmluZSBMZSBQZW5gLCBkYXRhID0gSVBTT1NfREFUQSkNCg0KY29sb3JzIDwtIGMoImRhdGEiID0gImNvcm5mbG93ZXJibHVlIiwgImZpdCIgPSAiYnJvd24yIikNCg0KcCA8LSBnZ3Bsb3QoZGF0YSA9IE5VTEwsIGFlcyh4ID0gSVBTT1NfREFUQSRgTWFyaW5lIExlIFBlbmApKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBJUFNPU19EQVRBJGBMZSBQZW5GTmAsIGNvbG9yID0gImRhdGEiKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBsbTIkZml0dGVkLnZhbHVlcywgY29sb3IgPSAiZml0IikpICsNCiAgbGFicyh4ID0gJ1BvcHVsYXJpdMOpIGRlIE1hcmluZSBMZSBQZW4nLA0KICAgICAgIHkgPSAnSW50ZW50aW9ucyBkZSB2b3RlcyBwb3VyIE1hcmluZSBMZSBQZW4nLCANCiAgICAgICBjb2xvciA9ICJDYW5kaWRhdCIpICsNCiAgZ2d0aXRsZSgiRml0IGRlcyByYW5kb20gZm9yZXN0cyBzdXIgbGEgcG9wdWxhcml0w6kgZGUgTWFyaW5lIExlIFBlbiIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9ycykNCiAgDQpwDQpgYGANCg0KT24gcGV1dCB2b2lyIHF1ZSBwb3VyIE1hcmluZSBMZSBQZW4sIGxlIGNvZWZmaWNpZW50IGRlIGNvcnLDqWxhdGlvbiBlc3QgdHLDqHMgZmFpYmxlOiAwLjA1NzY3NTc5LiBJbCBuJ3kgYSBxdWUgcGV1IGRlIGxpZW4gZW50cmUgc2EgcG9wdWxhcml0w6kgZXQgbGVzIGludGVudGlvbnMgZGUgdm90ZS4gQ2UgcGV1dCDDqnRyZSBkdSBhdSBmYWl0IHF1J2VsbGUgcGV1dCBtb2JpbGlzZXIgY29udHJlIGVsbGUgKGVmZmV0IHJlcG91c3NvaXIpOiBzaSBzYSBwb3B1bGFyaXTDqSBhdWdtZW50ZSwgZGVzIMOpbGVjdGV1cnMgcGVuc2FudCBxdSdlbGxlIGEgdW5lIGNoYW5jZSBkZSBnYWduZXIsIHZvbnQgY2hvaXNpciBkZSB2b3RlciBwb3VyIHVuIGF1dHJlIGNhbmRpZGF0IGV0IGRvbmMgbcOpY2FuaXF1ZW1lbnQgZmFpcmUgYmFpc3NlciBzb24gc2NvcmUuIENlIHBldXQgw6p0cmUgYXVzc2kgZMO7IGF1eCByZWRyZXNzZW1lbnRzIHBhcnRpY3VsaWVycyBhdSB2b3RlIEZOIGVmZmVjdHXDqSBwYXIgbGVzIGluc3RpdHV0cyBkZSBzb25kYWdlICh2b2lyIGNldCBhcnRpY2xlIGR1IE1vbmRlOiBodHRwczovL3d3dy5sZW1vbmRlLmZyL3BvbGl0aXF1ZS9hcnRpY2xlLzIwMTEvMDMvMDcvbWFyaW5lLWxlLXBlbi1sZXMtc29uZGV1cnMtb250LWlscy1sZXMtYm9ubmVzLW1ldGhvZGVzLWQtZXZhbHVhdGlvbl8xNDg3OTcyXzgyMzQ0OC5odG1sKS4gRW5maW4sIGNlIHBldXQgw6lnYWxlbWVudCDDqnRyZSB0b3V0IHNpbXBsZW1lbnQgZMO7IGF1IGZhaXQgcXVlIHNhIHBvcHVsYXJpdMOpIGV0IHNlcyBpbnRlbnRpb25zIGRlIHZvdGUgc29udCByZXN0w6lzIHJlbGF0aXZlbWVudCBzdGFibGUgZXQgY29tcGxpcXVlIGxlIGZhaXQgZGUgdm91bG9pciB0cm91dmVyIHVuZSB0ZW5kYW5jZS4NCg0KUG91ciBKZWFuLUx1YyBNZWxlbmNob246DQoNCmBgYHtyfQ0KIyBFeHBsaWNhdGlvbiBkZSBsYSBjb3Jyw6lsYXRpb24NCnByaW50KGNvcihJUFNPU19EQVRBJGBKZWFuLUx1Yy1NZWxlbmNob25gLElQU09TX0RBVEEkTcOpbGVuY2hvbkZJKSkNCmBgYA0KDQrDgCBsJ2ludmVyc2UsIGlsIHkgYSB1biBiaWVuIG1laWxsZXVyIGNvZWZmaWNpZW50IGRlIGNvcnLDqWxhdGlvbiAoMC43ODcwMjU3KSwgcG91ciBKZWFuLUx1YyBNw6lsZW5jaG9uLiANCg0KYGBge3J9DQpsbTMgPC0gbG0oYE3DqWxlbmNob25GSWB+YEplYW4tTHVjLU1lbGVuY2hvbmAsIGRhdGEgPSBJUFNPU19EQVRBKQ0KDQpjb2xvcnMgPC0gYygiZGF0YSIgPSAiY29ybmZsb3dlcmJsdWUiLCAiZml0IiA9ICJicm93bjIiKQ0KDQpwIDwtIGdncGxvdChkYXRhID0gTlVMTCwgYWVzKHggPSBJUFNPU19EQVRBJGBKZWFuLUx1Yy1NZWxlbmNob25gKSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gSVBTT1NfREFUQSRgTcOpbGVuY2hvbkZJYCwgY29sb3IgPSAiZGF0YSIpKSArDQogIGdlb21fbGluZShhZXMoeSA9IGxtMyRmaXR0ZWQudmFsdWVzLCBjb2xvciA9ICJmaXQiKSkgKw0KICBsYWJzKHggPSAnUG9wdWxhcml0w6kgZGUgSmVhbi1MdWMgTcOpbGVuY2hvbicsDQogICAgICAgeSA9ICdJbnRlbnRpb25zIGRlIHZvdGVzIHBvdXIgSmVhbi1MdWMgTcOpbGVuY2hvbicsIA0KICAgICAgIGNvbG9yID0gIkNhbmRpZGF0IikgKw0KICBnZ3RpdGxlKCJGaXQgZGVzIHJhbmRvbSBmb3Jlc3RzIHN1ciBsYSBwb3B1bGFyaXTDqSBkZSBKZWFuLUx1YyBNw6lsZW5jaG9uIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JzKQ0KICANCnANCmBgYA0KDQoNCk9uIHZvaXQgZW4gcmVnYXJkYW50IHN1ciBjZSBncmFwaGlxdWUgcXVlIGMnZXN0IGVuIHBhcnRpZSBkw7sgw6AgdW5lIHRyw6hzIGJvbm5lIHBvcHVsYXJpdMOpICg1NiUpIGNvbmNvbWl0YW50ZSBhdmVjIHVuZSBhdWdtZW50YXRpb24gZGUgc2VzIGludGVudGlvbnMgZGUgdm90ZSwganVzdGUgYXZhbnQgbCfDqWxlY3Rpb24gKEF2cmlsIDIwMTcpLg0KDQojIyBDb25jbHVzaW9uDQoNClF1ZWxxdWVzIHBvaW50cyBhdXF1ZWxzIG5vdXMgYXZvbnMgYWJvdXRpIGF1IGNvdXJzIGRlIG5vdHJlIHRyYXZhaWw6DQotIElsIHkgYSBwZXUgZGUgZG9ubsOpZXMgc3VyIGNlIHN1amV0IGV0IGNlcyBkb25uw6llcyBzb250IGVuIGfDqW7DqXJhbCBwZXUgcHLDqWNpc2VzIChsJ2luY2VydGl0dWRlcyBkZXMgc29uZGFnZXMgZXN0IGRlIGwnb3JkcmUgZGUgcXVlbHF1ZXMgcG91cmNlbnRzLCBjZSBxdWkgZXN0IHNvdXZlbnQgcGx1cyBpbXBvcnRhbnQgcXVlIGxlcyBpbmNlcnRpdHVkZXMpLiBDZWxhIGEgZG9uYyByZXN0cmVpbnQgbGVzIHBvc3NpYmlsaXTDqXMgZXQgbm91cyBhIGNvbnRyYWludCDDoCBjb25zaWTDqXJlciBkZXMgY2FzIHBhcnRpY3VsaWVycy4NCi0gTGEgYmFzZSBkZSBkb25uw6llcyBkZXMgQWN0dXMgZHUgam91cm5hbCBUViBlc3QgdHLDqHMgaW50w6lyZXNzYW50ZSBldCBwZXJtZXQgZGUgdm9pciBkZXMgY29ycsOpbGF0aW9ucyBlbnRyZSBjZSBxdWUgdHJhaXRlbnQgbGVzIGRpZmbDqXJlbnRzIGpvdXJuYXV4IFRWIGV0IGRlcyBkaWZmw6lyZW5jZXMgZW50cmUgbGVzIGRpZmbDqXJlbnRlcyBjaGHDrm5lcy4NCi0gSWwgZXN0IHBvc3NpYmxlIGRlIHJlbGV2ZXIgY2VydGFpbmVzIGNvcnLDqWxhdGlvbnMgcG91ciBsYSBwb3B1bGFyaXTDqSAoZG9ubsOpZXMgSVBTT1MpLg0KLSBMYSBwb3B1bGFyaXTDqSBuJ2VzdCBwYXMgZm9yY8OpbWVudCBjb3JyZWzDqWUgYXZlYyBsZXMgaW50ZW50aW9ucyBkZSB2b3RlIChwYXIgZXhlbXBsZSBkYW5zIGxlIGNhcyBkZSBNYXJpbmUgTGUgUGVuKS4NCg0KUG91cnN1aXRlcyDDqXZlbnR1ZWxsZXM6DQotIElsIHBvdXJyYWl0IMOqdHJlIGludMOpcmVzc2FudCBkZSBtZW5lciB1biB0cmF2YWlsIGNvbXBsw6ltZW50YWlyZSBlbiBjb21wYXJhbnQgbGEgcG9wdWxhcml0w6kgZXQgbGVzIGludGVudGlvbnMgZGUgdm90ZS4gQ2VsYSBwb3VycmFpdCBwZXJtZXR0cmUgZGUgdm9pciBzaSBkZXMgY2FuZGlkYXRzIHNvbnQgcG9wdWxhaXJlcyBtYWlzIG4nYXJyaXZlbnQgcGFzIMOgIHJhc3NlbWJsZXIgbGV1ciBjYW1wLiBPbiBwZXV0IHBlbnNlciDDoCBCZW5vw650IEhhbW9uIHF1aSDDqXRhaXQgc2FucyBkb3V0ZSBkYW5zIGNlIGNhcy4NCi0gVW5lIGxpbWl0ZSBxdWUgbCdvbiBjb25uYWlzc2FpdCBkw6hzIGxlIGTDqWJ1dCDDqXRhaXQgbGUgZmFpdCBxdSdpbCDDqXRhaXQgaW1wb3NzaWJsZSBkZSBjb25uYcOudHJlIHNpIHVuZSBpbmZvcm1hdGlvbiDDqXRhaXQgcG9zaXRpdmUgb3UgbsOpZ2F0aXZlLiBVbmUgYW3DqWxpb3JhdGlvbiBwb3NzaWJsZSBzZXJhaXQgZGUgY29uc2lkw6lyZXIgZGVzIG9jY3VyZW5jZXMgZGVzIG5vbXMgZGUgY2VydGFpbnMgY2FuZGlkYXRzIGF2ZWMgZGVzIG1vdHMgbcOpbGlvcmF0aWZzL3DDqWpvcmF0aWZzIGRhbnMgY2VzIGpvdXJuYXV4IHBvdXIgw6l0YWJsaXIgdW5lIGNsYXNzaWZpY2F0aW9uIHBsdXMgcHLDqWNpc2UuDQo=