1 message in com.perforce.perforce-userreporting lines of code added/changed...| From | Sent On | Attachments |
|---|---|---|
| Scot...@symantec.com | 27 May 1999 11:08 |
| Subject: | reporting lines of code added/changed/deleted in depot![]() |
|---|---|
| From: | Scot...@symantec.com (Scot...@symantec.com) |
| Date: | 05/27/1999 11:08:01 AM |
| List: | com.perforce.perforce-user |
---0__=Kd0d0xGdnOvYiEwaatgReoF8TMFnzafgFRQZcQ5inLA0x2ktv414ftIt Content-type: text/plain; charset=us-ascii Content-Disposition: inline
Please accept my apologies for not getting back to the mailing list.
We did complete a set of basic metrics scripts.(See attached file: changemetrics.py)(See attached file: excelmetrics.py)(See attached file: filemetrics.py)(See attached file: treemetrics.py)(See attached file: usermetrics.py) I can't guarantee they are bug free but they seem satisfy QA for now...
Try these...
Each python script takes the following parameters...
//depot/somelocation/... @label1 @label2
Label1 and 2 could be dates ( at least that's what the perforce docs imply )
You can simply specify //depot/... and let the two label's figure out which files your talking about.
If you want to get specific you can limit the depot location to a specific area like..
//depot/my_product/my_project/...
And you will get data that only applies to my_project and deeper...
Nothing is optional... you must have all three params... and there is no parameter checking so be careful..
Overview:
Excelmetrics.py puts out exhaust you can pipe to a file and then import to excel. It's all line count stuff.. organized by individual file. I could not decide on any particular diff routine so I did them all (I think).
The Fields in order for the excel metrics script are:
Depot path File status Rcs adds Rcs deletes Context adds Context changes Context deletes Summary adds Summary add chunks Summary deletes Summary delete chunks Summary changes Summary change chunks Summary change lines Unified adds Unified deletes
Chantemetrics.py puts our a report of change list numbers that have been submitted Then it gives you the details of that changelist, it tells you by USER who submitted which file. Then it lists the number of lines changed by in that changelist.
Filemetrics.py give just the line counts for the whole swath between the labels. Nothing else.
Usermetrics.py is the same a change metrics only its oriented towards user data. Each paragraph represents a user. The change lists submitted by that user. and so on...
Treemetrics.py gives a report of file counts. Like how many files are in each label, how many changed, how many changed type ....
Try these and let me know what you think.
ScottP
Chris Beaudette <chrisbe at wrq.com> on 05/26/99 06:38:57 PM
Please respond to "chrisbe at wrq.com" <chrisbe at wrq.com>
To: Scott Pasnikowski/SanMon/Cal/SYMANTEC, "'support at perforce.com'" <support at perforce.com> cc: "Chris Beaudette (E-mail)" <chrisbe at wrq.com> Subject: reporting lines of code added/changed/deleted in depot
howdy scott:
remember this? well, i'm off to a good start (w/ a perl script tho -- not python savvy yet).
however, i have to go thru some hoops to find the number of lines for added or deleted files, and those hoops include a major kludge of writing to disk. for some operations, this is timing out.
was wondering if you got the diff2 methods to work (i.e if you can get this information from completely w/in p4 commands w/o having to write/read to/from disk).
here's what i'm doing:
- - run "p4 changes" for specified dates to get the changelists between those dates - - run "p4 describe" on those changelists - parse out "Affected files" information - if files of any "text" types have been added or deleted, then: - do a "p4 print" on the file to a temp file (tip rev if file was added, tip rev - 1 if file was deleted) - do a unix "wc" command on the temp file, output results to a 2nd temp file - parse the 2nd temp file (the one w/ the wc results) for the number of lines in the p4 source code file - delete all temp files - parse out rest of diff output from "p4 describe" to find number of lines added, changed, deleted in source files - increment accumulators accordingly - - print results
if i run a "today" report, no prob: runs fine, prints output fine. but if i enter dates of "yesterday" and "today" to print a "yesterday" report, then it takes bloody forever and the process eventually times out. while it's running, i can see the temp files created and deleted by running "ls" commands in the directory where they're created. they continue to be created/destroyed for a *very* long time, even if i interrupt the process (by clicking "Stop" in my web browser, which probably doesn't stop perl from doing its thing in the background).
i looked at diff2 to see if it was a viable solution to the "added/deleted" files problem, but this doesn't work: you can't define a "rev 0" for an added file, and diffing the tip (ie. deleted) version of a deleted file against the previous version doesn't work, either. "p4 diff2" returns something to the effect of "==== //<depot>/.../<filename#1 - <none> ===", assuming the deleted version is #2.
any ideas???
is it possible to find out the number of lines of an added and/or deleted file from p4 using p4 commands? this would greatly simplify my life.
thanks,
~~crb
------Original Message----- From: SPasnikowski at symantec.com [SMTP:SPasnikowski at symantec.com] Sent: Monday, March 22, 1999 10:35 AM To: perforce-user at perforce.com; chrisbe at wrq.com Subject: Re: 2 unlrelated topics: history for branched file; report
I am presently working on some metrics scripts in python to tally changes. ( adds/deletes/changes ) Using all 5 diff2 methods.
I was disappointed to see that perforce had not posted anything like this. I would have thought someone would have done this already.
As soon as I finish I am going to ask permission to post these for public use. While they may not be the best Python code they are a good starting point.
My scripts basically parse the output of the diff2 command. You can supply 2 labels between which you get counts.. or 2 dates.
I will post another message when I get the OK.
ScottP Symantec
Stuff deleted----------------------------------------------------------------
2. it's a little less likely that anyone has done this one, but we also have need for a report that summarizes: - # lines of code changed - # lines of code added - # lines of code deleted between 2 dates (provided by the user) for a given depot.
most likely method would be to modify perfbrowse.pl and add it to the reports, probably parsing the output of "p4 describe" command(s).
so, anyone done that one? end of stuff------------------------------------------------------------
------ << File: RFC822 message headers.txt >>
---0__=Kd0d0xGdnOvYiEwaatgReoF8TMFnzafgFRQZcQ5inLA0x2ktv414ftIt Content-type: application/octet-stream; name="changemetrics.py" Content-Disposition: attachment; filename="changemetrics.py" Content-transfer-encoding: base64
IyMNCiMjICBXcml0dGVuIGJ5IFNjb3R0IFBhc25pa293c2tpIGFyb3VuZCB0aGUgdGltZSBvZiA0 LzIyLzk5DQojIyAgQHN5bWFudGVjIGNvcnAuICAgSG9tZSBvZiB0aGUgTm9ydG9uIHV0aWxpdGll cw0KIyMNCiMjICBVbmRlciBkdXJlc3Mgb2YgcGVza3kgUUEgcGVvcGxlLi4uDQojIw0KIyMgIFRo aXMgY29tZXMgd2l0aCBubyBndWFyYW50ZWUgd2hhdHNvZXZlci4uLiBvbiBhbnkgbGV2ZWwuDQoj Iw0KIyMgIENvbnNpZGVyIHRoaXMgdG8gYmUgdW5kZXIgdGhlIGxpbnV4IHR5cGUgbGlzY2Vuc2Ug dGhpbmd5DQojIyAgKCBEb24ndCByZWNhbGwgd2hhdCBpdHMgY2FsbGVkIEdOVSBvciBjb3B5bGVm dCBvciB3aGF0ZXZlciApIA0KIyMgIGFuZCBpZiBhbnlvbmUgY29tcGxhaW5zIG15IG1hbmFnZXIg ZHUgam91ciBzYWlkIEkgY291bGQgZ2l2ZSBpdCBhd2F5Lg0KIyMgICggaGUgcmVhbGx5IGRpZCAp DQojIw0KDQojIS91c3IvbG9jYWwvYmluL3B5dGhvbg0KIw0KaW1wb3J0IHN5cywgb3MsIHN0cmlu ZywgcmUgDQoNCg0KIyBldmVyeWJvZHkgaXMgdXNpbmcgdGhpcyANCmV4cEZpbGVOYW1lRmllbGQg PSByZS5jb21waWxlKCByJ14oLy8uKykvKC4rKScgKQ0KDQoNCiMgVGhpcyBmdW5jIGNvcnJlc3Bv bmRzIHRvIHA0IGRpZmYyIHdpdGggdGhlIC1kbiBzd2l0Y2ggICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX3Jjc19maWxldG9maWxlKCBkZXBvdF9maWxl X2FuZF9yZXYxLCBkZXBvdF9maWxlX2FuZF9yZXYyICk6DQoJIyBEb2VzIGEgcDQgY2hhbmdlcyBk ZXBvdF9yb290QGxhYmVsX29uZSBkZXBvdF9yb290QGxhYmVsX3R3bw0KICAgICMgZGVwb3Rfcm9v dCBpcyB1c2VkIHRvIGxpbWl0IHRoZSBkaWZmIHJhbmdlIHRvIGEgc2luZ2xlICJwcm9qZWN0Ig0K ICAgICMgb3Igc29tZXRoaW5nIGV2ZW4gc21hbGxlci4uIGxpa2UgYSBzaW5nbGUgZmlsZQ0KICAg ICMgd2UgdGhlbiBwYXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQgdXAgdGhlIHRvdGFscw0KDQogIGNv bW1hbmQgPSAncDQgZGlmZjIgLWRuIFwiJyArIGRlcG90X2ZpbGVfYW5kX3JldjEgKyAnXCIgXCIn ICsgZGVwb3RfZmlsZV9hbmRfcmV2MiArICdcIicNCiAgbGluZXNfYWRkZWQgPSAwDQogIGxpbmVz X2NoYW5nZWQgPSAwDQogIGxpbmVzX2RlbGV0ZWQgPSAwDQogIA0KICAjc3lzLnN0ZG91dC53cml0 ZSgnRXh0cmFjdGlvbiBmdW5jdGlvbiB1c2luZyAnICsgY29tbWFuZCArJyAgXG4nICkNCg0KICAj IGJyZWFrIHRoZSBsaW5lIHVwIGFjY29yZGluZyB0by4uLg0KICAjIHNhbXBsZSBsaW5lOiBhODUg Mg0KICAjICAgICAgICAgICAgICBvcGVyYXRpb24gKGxpbmUpbG9jYXRpb24gKE51bWJlciBvZiBs aW5lcyBhZmZlY3RlZCljb3VudCANCiAgcCA9IHJlLmNvbXBpbGUoIHInXihbYWRdKShbMC05XSsp IChcZCspJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29tbWFuZCwncicpLnJlYWRs aW5lcygpOg0KICAgIHRtcCA9IGxpbmVbMDoxXSAgDQogICAgaWYgdG1wID09ICdhJyBvciB0bXAg PT0gJ2QnOg0KICAgICAgICAgICMgb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgYSBtYXRjaCBvdGhl cndpc2UgZ3JvdXBzKCkgd2lsbCBibG93IGNodW5rcyBkaWZmaW5nIGFuIHJ0Zg0KICAgICAgICAg IG0gPSBwLm1hdGNoKCBsaW5lICkNCiAgICAgICAgICBpZiBtOg0KICAgICAgICAgICAgKG9wZXJh dGlvbiwgbG9jYXRpb24sIGNvdW50KSA9IHJlLm1hdGNoKCByJ14oW2FkXSkoWzAtOV0rKSAoXGQr KScsIGxpbmUpLmdyb3VwcygpDQogICAgICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggJz4nICsg b3BlcmF0aW9uICsgJzwgICAgPicgKyBsb2NhdGlvbiArICc8ICAgPicgKyBjb3VudCArICc8XG4n ICkNCiAgICAgICAgICAgIGlmIHRtcCA9PSAnYSc6DQogICAgICAgICAgICAgICBsaW5lc19hZGRl ZCA9IGxpbmVzX2FkZGVkICsgaW50KCBjb3VudCApDQogICAgICAgICAgICBlbGlmIHRtcCA9PSAn ZCc6ICAgDQogICAgICAgICAgICAgICBsaW5lc19kZWxldGVkID0gbGluZXNfZGVsZXRlZCArIGlu dCggY291bnQgKQ0KICAgICAgICAgICAgICAgICAgICAgIA0KICByZXR1cm4gbGluZXNfYWRkZWQs IGxpbmVzX2RlbGV0ZWQNCg0KICANCiMgVGhpcyBmdW5jIGNvcnJlc3BvbmRzIHRvIHA0IGRpZmYy IHdpdGggdGhlIC1kYyBzd2l0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIA0KICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX2NvbnRleHRfZmls ZXRvZmlsZSggZGVwb3RfZmlsZV9hbmRfcmV2MSwgZGVwb3RfZmlsZV9hbmRfcmV2MiApOg0KCSMg RG9lcyBhIHA0IGNoYW5nZXMgZGVwb3Rfcm9vdEBsYWJlbF9vbmUgZGVwb3Rfcm9vdEBsYWJlbF90 d28NCiAgICAjIGRlcG90X3Jvb3QgaXMgdXNlZCB0byBsaW1pdCB0aGUgZGlmZiByYW5nZSB0byBh IHNpbmdsZSAicHJvamVjdCINCiAgICAjIG9yIHNvbWV0aGluZyBldmVuIHNtYWxsZXIuLiBsaWtl IGEgc2luZ2xlIGZpbGUNCiAgICAjIHdlIHRoZW4gcGFyc2UgdGhlIG91dHB1dCBhbmQgYWRkIHVw IHRoZSB0b3RhbHMNCg0KICBjb21tYW5kID0gJ3A0IGRpZmYyIC1kYyBcIicgKyBkZXBvdF9maWxl X2FuZF9yZXYxICsgJ1wiIFwiJyArIGRlcG90X2ZpbGVfYW5kX3JldjIgKyAnXCInDQogIGxpbmVz X2FkZGVkID0gMA0KICBsaW5lc19jaGFuZ2VkID0gMA0KICBsaW5lc19kZWxldGVkID0gMA0KICAN CiAgI3N5cy5zdGRvdXQud3JpdGUoJ0V4dHJhY3Rpb24gZnVuY3Rpb24gdXNpbmcgJyArIGNvbW1h bmQgKycgIFxuJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29tbWFuZCwncicpLnJl YWRsaW5lcygpOg0KICAgICMgc2FtcGxlIGxpbmU6IENoYW5nZSBudW1iZXIgb24gZGF0ZSBieSBu YW1lQG1hY2hpbmUgJ2NvbW1lbnQnDQogICAgIyAgICAgICAgICAgICAgZHVtbXkgIGNoIyAgIA0K ICAgICNzeXMuc3Rkb3V0LndyaXRlKCBsaW5lICsgJ1xuJyApDQogICAgdG1wID0gbGluZVswOjFd ICANCiAgICBpZiB0bXAgPT0gJysnOg0KICAgICAgIGxpbmVzX2FkZGVkID0gbGluZXNfYWRkZWQg KyAxDQogICAgZWxpZiB0bXAgPT0gJy0nOg0KICAgICAgIGxpbmVzX2RlbGV0ZWQgPSBsaW5lc19k ZWxldGVkICsgMQ0KICAgIGVsaWYgdG1wID09ICchJzoNCiAgICAgICBsaW5lc19jaGFuZ2VkID0g bGluZXNfY2hhbmdlZCArMQ0KDQogIHJldHVybiBsaW5lc19hZGRlZCxsaW5lc19jaGFuZ2VkLGxp bmVzX2RlbGV0ZWQNCiAgDQogIA0KZGVmIGV4dHJhY3RfbWV0cmljc19jb3VudHNfc3VtbWFyeV9m aWxldG9maWxlKCBkZXBvdF9maWxlX2FuZF9yZXYxLCBkZXBvdF9maWxlX2FuZF9yZXYyICk6DQoJ IyBEb2VzIGEgcDQgY2hhbmdlcyBkZXBvdF9yb290QGxhYmVsX29uZSBkZXBvdF9yb290QGxhYmVs X3R3bw0KICAgICMgZGVwb3Rfcm9vdCBpcyB1c2VkIHRvIGxpbWl0IHRoZSBkaWZmIHJhbmdlIHRv IGEgc2luZ2xlICJwcm9qZWN0Ig0KICAgICMgb3Igc29tZXRoaW5nIGV2ZW4gc21hbGxlci4uIGxp a2UgYSBzaW5nbGUgZmlsZQ0KICAgICMgd2UgdGhlbiBwYXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQg dXAgdGhlIHRvdGFscw0KDQogIGNvbW1hbmQgPSAncDQgZGlmZjIgLWRzIFwiJyArIGRlcG90X2Zp bGVfYW5kX3JldjEgKyAnXCIgXCInICsgZGVwb3RfZmlsZV9hbmRfcmV2MiArICdcIicNCiAgbGlu ZXNfYWRkZWQgPSAwDQogIGFkZF9jaHVua3MgPSAwDQogIGxpbmVzX2RlbGV0ZWQgPSAwDQogIGRl bGV0ZV9jaHVua3MgPSAwDQoNCiAgbGluZXNfY2hhbmdlZCA9IDANCiAgY2hhbmdlX2NodW5rcyA9 IDANCiAgZXh0cmFfZGF0YSA9IDAgIA0KDQogICNzeXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9u IGZ1bmN0aW9uIHVzaW5nICcgKyBjb21tYW5kICsnICBcbicgKQ0KDQogICMgVGhpcyB3aWxsIG1h dGNoIGxpbmVzIHN0YXJ0aW5nIHdpdGggDQogIGV4cDEgPSByZS5jb21waWxlKCByJ15bImFkZCIi ZGVsZXRlZCIiY2hhbmdlZF0iJyApDQogICMNCiAgIyBUaGUgbmV4dCAzIGVhdCB0aGUgYWRkIGRl bGV0ZWQgYW5kIGNoYW5nZWQgbGluZXMNCiAgIyAgaXQgY291bGQgYmUgb25lIGV4cHJlc3Npb24g SSBzdXBwb3NlDQogICMNCiAgZXhwMiA9IHJlLmNvbXBpbGUoIHInXihhZGQpIChcZCspIChjaHVu a3MpIChcZCspJyApDQogIGV4cDMgPSByZS5jb21waWxlKCByJ14oZGVsZXRlZCkgKFxkKykgKGNo dW5rcykgKFxkKyknICkNCiAgZXhwNCA9IHJlLmNvbXBpbGUoIHInXihjaGFuZ2VkKSAoXGQrKSAo Y2h1bmtzKSAoXGQrKSAvIChcZCspJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29t bWFuZCwncicpLnJlYWRsaW5lcygpOg0KICAgICAjIG9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlIGEg bWF0Y2gNCiAgICAgbTIgPSBleHAyLnNlYXJjaCggbGluZSApDQogICAgIG0zID0gZXhwMy5zZWFy Y2goIGxpbmUgKQ0KICAgICBtNCA9IGV4cDQuc2VhcmNoKCBsaW5lICkNCiAgICAgDQogICAgIGlm IG0yOg0KICAgICAgICAgKCBvcGVyYXRpb24sIGNvdW50MSwgY2h1bmtzLCBjb3VudDIgKSA9IG0y Lmdyb3VwcygpDQogICAgICAgICBhZGRfY2h1bmtzID0gYWRkX2NodW5rcyArIGludCggY291bnQx ICkNCiAgICAgICAgIGxpbmVzX2FkZGVkID0gbGluZXNfYWRkZWQgKyBpbnQoIGNvdW50MiApDQog ICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggY291bnQyICsgJ1xuJyApDQogICAgICAgIA0KICAg ICBlbGlmIG0zOg0KICAgICAgICAgKCBvcGVyYXRpb24sIGNvdW50MSwgY2h1bmtzLCBjb3VudDIg KSA9IG0zLmdyb3VwcygpDQogICAgICAgICBkZWxldGVfY2h1bmtzID0gZGVsZXRlX2NodW5rcyAr IGludCggY291bnQxICkNCiAgICAgICAgIGxpbmVzX2RlbGV0ZWQgPSBsaW5lc19kZWxldGVkICsg aW50KCBjb3VudDIgKQ0KICAgICAgICAgI3N5cy5zdGRvdXQud3JpdGUoIGNvdW50MiArICdcbicg KQ0KICAgICAgICANCiAgICAgZWxpZiBtNDoNCiAgICAgICAgICggb3BlcmF0aW9uLCBjb3VudDEs IGNodW5rcywgY291bnQyLCBjb3VudDMgKSA9IG00Lmdyb3VwcygpDQogICAgICAgICBjaGFuZ2Vf Y2h1bmtzID0gY2hhbmdlX2NodW5rcyArIGludCggY291bnQxICkNCiAgICAgICAgIGV4dHJhX2Rh dGEgPSBleHRyYV9kYXRhICsgaW50KCBjb3VudDIgKQ0KICAgICAgICAgbGluZXNfY2hhbmdlZCA9 IGxpbmVzX2NoYW5nZWQgKyBpbnQoIGNvdW50MyApDQogICAgICAgICAjc3lzLnN0ZG91dC53cml0 ZSggY291bnQzICsgJ1xuJyApDQogICAgICAgICAgICAgICAgICAgICAgDQogIHJldHVybiBsaW5l c19hZGRlZCxhZGRfY2h1bmtzLGxpbmVzX2RlbGV0ZWQsZGVsZXRlX2NodW5rcyxsaW5lc19jaGFu Z2VkLGNoYW5nZV9jaHVua3MsIGV4dHJhX2RhdGENCiAgDQogIA0KIyBUaGlzIGZ1bmMgY29ycmVz cG9uZHMgdG8gcDQgZGlmZjIgd2l0aCB0aGUgLWR1IHN3aXRjaCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX3Vu aWZpZWRfZmlsZXRvZmlsZSggZGVwb3RfZmlsZV9hbmRfcmV2MSwgZGVwb3RfZmlsZV9hbmRfcmV2 MiApOg0KCSMgRG9lcyBhIHA0IGNoYW5nZXMgZGVwb3Rfcm9vdEBsYWJlbF9vbmUgZGVwb3Rfcm9v dEBsYWJlbF90d28NCiAgICAjIGRlcG90X3Jvb3QgaXMgdXNlZCB0byBsaW1pdCB0aGUgZGlmZiBy YW5nZSB0byBhIHNpbmdsZSAicHJvamVjdCINCiAgICAjIG9yIHNvbWV0aGluZyBldmVuIHNtYWxs ZXIuLiBsaWtlIGEgc2luZ2xlIGZpbGUNCiAgICAjIHdlIHRoZW4gcGFyc2UgdGhlIG91dHB1dCBh bmQgYWRkIHVwIHRoZSB0b3RhbHMNCg0KICBjb21tYW5kID0gJ3A0IGRpZmYyIC1kdSBcIicgKyBk ZXBvdF9maWxlX2FuZF9yZXYxICsgJ1wiIFwiJyArIGRlcG90X2ZpbGVfYW5kX3JldjIgKyAnXCIn DQogIGxpbmVzX2FkZGVkID0gMA0KICBsaW5lc19kZWxldGVkID0gMA0KICANCiAgI3N5cy5zdGRv dXQud3JpdGUoJ0V4dHJhY3Rpb24gZnVuY3Rpb24gdXNpbmcgJyArIGNvbW1hbmQgKycgIFxuJyAp DQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29tbWFuZCwncicpLnJlYWRsaW5lcygpOg0K ICAgICMgc2FtcGxlIGxpbmU6IENoYW5nZSBudW1iZXIgb24gZGF0ZSBieSBuYW1lQG1hY2hpbmUg J2NvbW1lbnQnDQogICAgIyAgICAgICAgICAgICAgZHVtbXkgIGNoIyAgIA0KICAgICNzeXMuc3Rk b3V0LndyaXRlKCBsaW5lICsgJ1xuJyApDQogICAgdG1wID0gbGluZVswOjFdICANCiAgICBpZiB0 bXAgPT0gJysnOg0KICAgICAgIGxpbmVzX2FkZGVkID0gbGluZXNfYWRkZWQgKyAxDQogICAgZWxp ZiB0bXAgPT0gJy0nOg0KICAgICAgIGxpbmVzX2RlbGV0ZWQgPSBsaW5lc19kZWxldGVkICsgMQ0K DQogIHJldHVybiBsaW5lc19hZGRlZCwgbGluZXNfZGVsZXRlZA0KICANCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgDQojIFRoaXMgZnVuYyBnZW5lcmF0ZXMgYSBsaXN0IG9mIGNoYW5nZSBu dW1iZXJzIHRoYXQgaGF2ZSBiZWVuDQojIGFkZGVkIGJldHdlZW4gdGhlIDIgcG9pbnRzLg0KIyBJ dCdzIGVxdWl2YWxlbnQgdG8gcDQgY2hhbmdlcyAvL2RlcG90L3NvbWUgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICANCmRlZiBleHRyYWN0X2NoYW5nZV9udW1iZXJzKCBkZXBvdF9yb290LCBsYWJlbF9v bmUsIGxhYmVsX3R3byApOg0KICAjIERvZXMgYSBwNCBjaGFuZ2VzIGRlcG90X3Jvb3RAbGFiZWxf b25lIGRlcG90X3Jvb3RAbGFiZWxfdHdvDQogICMgZGVwb3Rfcm9vdCBpcyB1c2VkIHRvIGxpbWl0 IHRoZSBkaWZmIHJhbmdlIHRvIGEgc2luZ2xlICJwcm9qZWN0Ig0KICAjIG9yIHNvbWV0aGluZyBl dmVuIHNtYWxsZXIuLiBsaWtlIGEgc2luZ2xlIGZpbGUNCiAgIyB3ZSB0aGVuIHBhcnNlIHRoZSBv dXRwdXQgYW5kIGFkZCB1cCB0aGUgdG90YWxzDQoNCiAgY29tbWFuZDEgPSAncDQgY2hhbmdlcyAn ICsgZGVwb3Rfcm9vdCArIGxhYmVsX29uZSAgIA0KICBjb21tYW5kMiA9ICdwNCBjaGFuZ2VzICcg KyBkZXBvdF9yb290ICsgbGFiZWxfdHdvICANCg0KICBmaXJzdF9saXN0ID0gW10NCiAgc2Vjb25k X2xpc3QgPSBbXSAgICANCiAgZGlmZmxpc3QgPSBbXQ0KIA0KICAjIGJyZWFrIHRoZSBsaW5lIHVw IGFjY29yZGluZyB0by4uLg0KICAjDQogICMgVGhpcyBzZWVtcyB0byB3b3JrIGJlc3Qgd2l0aCAy IGdyb3Vwcw0KICBleHBDaGFuZ2VOdW1iZXIgPSByZS5jb21waWxlKCByJ14oQ2hhbmdlICkoXGQr KScgKQ0KDQogICNzeXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1bmN0aW9uIHVzaW5nICcg KyBjb21tYW5kMSArJyAgXG4nICkNCiAgZm9yIGxpbmUgaW4gb3MucG9wZW4oIGNvbW1hbmQxLCdy JykucmVhZGxpbmVzKCk6DQogICAgIHMxID0gZXhwQ2hhbmdlTnVtYmVyLnNlYXJjaCggbGluZSAp DQogICAgICgganVuaywgY2hhbmdlTnVtYmVyMSApID0gczEuZ3JvdXBzKCkNCiAgICAgI3N5cy5z dGRvdXQud3JpdGUoJ0NoYW5nZSBOdW1iZXIgbGlzdCAxLT4gJyArIGBjaGFuZ2VOdW1iZXIxYCAr JyAgXG4nICkNCiAgICAgZmlyc3RfbGlzdC5hcHBlbmQoIGNoYW5nZU51bWJlcjEgKQ0KDQogICNz eXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1bmN0aW9uIHVzaW5nICcgKyBjb21tYW5kMiAr JyAgXG4nICkNCiAgZm9yIGxpbmUgaW4gb3MucG9wZW4oIGNvbW1hbmQyLCdyJykucmVhZGxpbmVz KCk6DQogICAgIHMxID0gZXhwQ2hhbmdlTnVtYmVyLnNlYXJjaCggbGluZSApDQogICAgICgganVu aywgY2hhbmdlTnVtYmVyMiApID0gczEuZ3JvdXBzKCkNCiAgICAgI3N5cy5zdGRvdXQud3JpdGUo J0NoYW5nZSBOdW1iZXIgbGlzdCAyLT4gJyArIGBjaGFuZ2VOdW1iZXIyYCArJyAgXG4nICkNCiAg ICAgc2Vjb25kX2xpc3QuYXBwZW5kKCBjaGFuZ2VOdW1iZXIyICkNCg0KICAjIFRoZSBmb2xsb3dp bmcgaXMgYSB2ZXJ5IGJhc2ljIGRpZmYgcm91dGluZSBmb3IgMiBsaXN0cw0KICAjIFN1bSBib3Ro IGxpc3RzIHRoZW4gaWYgY29uc2VjdHV0aXZlIGVsZW1lbnRzIG1hdGNoIA0KICAjIHdlIHdpbGwg bm90IGFkZCBlaXRoZXIgdG8gZmluYWwgc3VtbWF0aW9uIGxpc3QNCg0KICBzdW1tYXRpb24gPSBm aXJzdF9saXN0ICsgc2Vjb25kX2xpc3QNCiAgc3VtbWF0aW9uLnNvcnQoKQ0KDQogIGluZGV4ID0g MA0KICBkaWZmbGlzdF9sZW5ndGggPSAwDQogIHdoaWxlIGluZGV4IDw9IGxlbiggc3VtbWF0aW9u ICk6DQogICAgICNzeXMuc3Rkb3V0LndyaXRlKCAnSW5kZXggJyArIGBpbmRleGAgKyAnXG4nICkN CiAgICAgaWYgaW5kZXggKyAxID49IGxlbiggc3VtbWF0aW9uICk6DQogICAgICAgIGlmIGluZGV4 ICE9IGxlbiggc3VtbWF0aW9uICk6DQogICAgICAgICAgICBkaWZmbGlzdF9sZW5ndGggPSBkaWZm bGlzdF9sZW5ndGggKyAxDQogICAgICAgICAgICBkaWZmbGlzdC5hcHBlbmQoIHN1bW1hdGlvblsg aW5kZXggXSApDQogICAgICAgIGJyZWFrDQogICAgIGVsc2U6DQogICAgICAgIGlmIHN1bW1hdGlv blsgaW5kZXggXSA9PSBzdW1tYXRpb25bIGluZGV4ICsgMSBdOg0KICAgICAgICAgICBpbmRleCA9 IGluZGV4ICsgMg0KICAgICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggJ0luZGV4IGlzICcgKyBg aW5kZXhgICsgJyBBZnRlciBqdW1waW4gb3ZlclxuJyApDQogICAgICAgIGVsc2U6DQogICAgICAg ICAgICNzeXMuc3Rkb3V0LndyaXRlKCBzdW1tYXRpb25bIGluZGV4IF0gKyAnXG4nICkNCiAgICAg ICAgICAgZGlmZmxpc3RfbGVuZ3RoID0gZGlmZmxpc3RfbGVuZ3RoICsgMQ0KICAgICAgICAgICBk aWZmbGlzdC5hcHBlbmQoIHN1bW1hdGlvblsgaW5kZXggXSApDQogICAgICAgICAgIGluZGV4ID0g aW5kZXggKyAxDQoNCiAgIyBMZXRzIHByaW50IG91dCBzb21lIHN1bW1hcnkgZGF0YSAgDQogIHN5 cy5zdGRvdXQud3JpdGUoICdcbicgKyBgZGlmZmxpc3RfbGVuZ3RoYCArICcgQ2hhbmdlbGlzdHMg c3VibWl0dGVkOlxuJyApDQogIGZvciBjaGFuZ2VOdW1iZXIgaW4gZGlmZmxpc3Q6DQogICAgIHN5 cy5zdGRvdXQud3JpdGUoIGNoYW5nZU51bWJlciArICcgJyApDQoNCiAgc3lzLnN0ZG91dC53cml0 ZSggJ1xuXG4nICkNCg0KICByZXR1cm4gZGlmZmxpc3QNCg0KZGVmIGdlbl9jaGFuZ2VfZGF0YSgg bGlzdG9mX2NoYW5nZW51bXMgKToNCiAgIyBQYXJzZSB0aGUgZGF0YSBmb3IgZWFjaCBjaGFuZ2UN Cg0KICBjb21tYW5kID0gJ3A0IGRlc2NyaWJlIC1zICcgICANCiANCiAgY2hhbmdlX2RpY3QgPSB7 fQ0KDQogICMgYnJlYWsgdGhlIGxpbmUgdXAgYWNjb3JkaW5nIHRvLi4uDQogICMNCiAgIyBUaGlz IHNlZW1zIHRvIHdvcmsgYmVzdCB3aXRoIDIgZ3JvdXBzDQogIGV4cENoYW5nZUZpZWxkcyA9IHJl LmNvbXBpbGUoIHInXkNoYW5nZSAoXGQrKSBieSAoLispIG9uIChcZCspLyhcZCspLyhcZCspIChc ZCspOihcZCspOihcZCspJyApDQogIGV4cEZpbGVGaWVsZHMgPSByZS5jb21waWxlKCByJ14uLi4g KC4rKSMoXGQrKSAoLispJyApDQogIGV4cEZpbGVOYW1lRmllbGQgPSByZS5jb21waWxlKCByJ14o Ly8uKykvKC4rKScgKQ0KDQogICNzeXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1bmN0aW9u IHVzaW5nICcgKyBjb21tYW5kICsnICBcbicgKQ0KDQogICMgZm9yIGV2ZXJ5IGNoYW5nZSBudW1i ZXIgZG8gYSBwNCBkZXNjcmliZQ0KICAjDQogIGZvciBudW0gaW4gbGlzdG9mX2NoYW5nZW51bXM6 DQogICAgICMgIE5vdyBmb3IgZWFjaCBwNCBkZXNjcmliZSwgc3VjayBpbiBhbGwgdGhlIG91dHB1 dCBsaW5lcw0KICAgICAjDQogICAgIGxpc3Rfb2ZfZmlsZXMgPSBbXQ0KICAgICBmb3IgbGluZSBp biBvcy5wb3BlbiggY29tbWFuZCArIG51bSwncicpLnJlYWRsaW5lcygpOg0KICAgICAgICAjICBO b3cgdXNlIHJlIHRvIHJlY29nbml6ZSB0aGUgaGVhZGVyIGxpbmUgb3IgdGhlIGZpbGUgbGluZXMN CiAgICAgICAgIw0KICAgICAgICBzZGF0YSA9IGV4cENoYW5nZUZpZWxkcy5zZWFyY2goIGxpbmUg KQ0KICAgICAgICBzZmlsZSA9IGV4cEZpbGVGaWVsZHMuc2VhcmNoKCBsaW5lICkNCg0KICAgICAg ICBpZiBzZGF0YToNCiAgICAgICAgICAgIyBBaGEhIHRoaXMgaXMgZmlyc3QgbGluZSB0aGF0IGNv bnRhaW5zIHRoZSB1c2VyIG5hbWUgc3R1ZmYuLi4NCiAgICAgICAgICAgIw0KICAgICAgICAgICAo IGNoYW5nZU51bWJlciwgdXNlciwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMgICkg PSBzZGF0YS5ncm91cHMoKQ0KDQogICAgICAgIGlmIHNmaWxlOg0KICAgICAgICAgICAjIFRoaXMg aXMgYSBsaW5lIGxpc3RpbmcgYSBmaWxlIHRoYXQgYmVsb25ncyB0byB0aGlzIGNoYW5nZQ0KICAg ICAgICAgICAjDQogICAgICAgICAgICggZGVwb3RQYXRoLCByZXZudW0sIGFjdGlvbiAgKSA9IHNm aWxlLmdyb3VwcygpDQogICAgICAgICAgIHNmaWxlYW5kcGF0aCA9IGV4cEZpbGVOYW1lRmllbGQu c2VhcmNoKCBkZXBvdFBhdGggKQ0KICAgICAgICAgICBpZiBzZmlsZWFuZHBhdGg6DQogICAgICAg ICAgICAgICggcGF0aE9ubHksIGZpbGVOYW1lICkgPSBzZmlsZWFuZHBhdGguZ3JvdXBzKCkNCiAg ICAgICAgICAgICAgI3N5cy5zdGRvdXQud3JpdGUoIHBhdGhPbmx5ICsgJywnICsgZmlsZU5hbWUg KyAnLCcgKQ0KICAgICAgICAgICAgICBsaXN0X29mX2ZpbGVzLmFwcGVuZCggIFsgZGVwb3RQYXRo LCByZXZudW0sIGFjdGlvbiwgdXNlciBdICkNCg0KICAgICAgICAgICAjc3lzLnN0ZG91dC53cml0 ZSggcmV2bnVtICAgICAgICsgJywnICsgDQogICAgICAgICAgICMgICAgICAgICAgICAgICAgICBh Y3Rpb24gICAgICAgKyAnLCcgKyAgIA0KICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgY2hh bmdlTnVtYmVyICsgJywnICsgICANCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIHVzZXIg ICAgICAgICArICcsJyArICAgDQogICAgICAgICAgICMgICAgICAgICAgICAgICAgICB5ZWFyICAg ICAgICAgKyAnLCcgKyAgIA0KICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgbW9udGggICAg ICAgICsgJywnICsgICANCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGRheSAgICAgICAg ICArICcsJyArICAgDQogICAgICAgICAgICMgICAgICAgICAgICAgICAgICBob3VyICAgICAgICAg KyAnLCcgKyAgIA0KICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgbWluICAgICAgICAgICsg JywnICsgICANCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIHNlYyAgICAgICAgICArICdc bicgKSAgDQoNCiAgICAgIyBhZnRlciBwcm9jZXNzaW5nIHRoZSBjaGFuZ2UgbGlzdCBhZGQgdGhl IGRhdGEgZ2FpbmVkIGludG8gdGhlDQogICAgICMgaW50byB0aGUgZGljdGlvbmFyeSBvZiBjaGFu Z2xpc3Rzcw0KICAgICAjIFVzZSB0aGUgS2V5RXJyb3IgZXhjZXB0aW9uIHRvIGFkZCBrZXlzIHRo YXQgYXJlIG1pc3NpbmcNCiAgICAgIyBvdGhlcndpc2UganVzdCBzdW0gdGhlIGxpc3Qgb2YgZmls ZXMgZm9yIGVhY2ggdXNlcg0KICAgICAjDQogICAgIHRyeToNCiAgICAgICAgY2hhbmdlX2RpY3Rb IGBjaGFuZ2VOdW1iZXJgIF0gPSBjaGFuZ2VfZGljdFsgYGNoYW5nZU51bWJlcmAgXSArIGxpc3Rf b2ZfZmlsZXMNCiAgICAgZXhjZXB0IEtleUVycm9yOg0KICAgICAgICBjaGFuZ2VfZGljdFsgYGNo YW5nZU51bWJlcmAgXSA9IGxpc3Rfb2ZfZmlsZXMNCg0KICAjdGVtcF9saXN0ID0gW10NCiAgI2Zv ciBzdHVmZiBpbiB1c2VyX2RpY3Qua2V5cygpOg0KICAjICAgc3lzLnN0ZG91dC53cml0ZSggJ1xu XG5Vc2VyIC0tPiAnICsgc3R1ZmYgICsgJ1xuXG4nICkNCiAgIyAgIHRlbXBfbGlzdCA9IHVzZXJf ZGljdFsgc3R1ZmYgXQ0KICAjICAgdGVtcF9saXN0LnNvcnQoKQ0KICAjICAgZm9yIGp1bmsgaW4g dGVtcF9saXN0Og0KICAjICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ1x0JyArIGp1bmsgKyAnXG4n ICkgDQoNCg0KICByZXR1cm4gY2hhbmdlX2RpY3QNCg0KDQpkZWYgZ2VuX21ldHJpY3NfZGF0YSgg ZGF0YV9kaWN0ICk6DQogIHRlbXBfbGlzdCA9IFtdDQogICMNCiAgIyBGb3IgZXZlcnkgZW50cnkg aW4gdGhlIGRpY3Rpb25hcnkNCiAgIyBFYWNoIGtleSBiZWluZyBhIGRpZmZlcmVudCBVc2VyDQog IGZvciBzdHVmZiBpbiBkYXRhX2RpY3Qua2V5cygpOg0KICAgICAjIA0KICAgICAjIENvcHkgdGhl IGxpc3Qgb3V0IG9mIHRoZSBkaWN0aW9uYXJ5IHNvIEkgZG9uJ3QgaGF2ZSB0byANCiAgICAgIyB1 c2UgW11bXVtdDQogICAgIHRlbXBfbGlzdCA9IGRhdGFfZGljdFsgc3R1ZmYgXQ0KICAgICB0ZW1w X2xpc3Quc29ydCgpDQogICAgICMNCiAgICAgIyBMZXRzIHN0YXJ0IHdyaXRpbmcgb3VyIHJlcG9y dCBkYXRhDQogICAgIHN5cy5zdGRvdXQud3JpdGUoICdcblxuQ2hhbmdlIC0tPiAnICsgc3R1ZmYg ICsgJyAgQXBwbGllZCB0byAnICsgYGxlbiggdGVtcF9saXN0IClgICsgJyBGaWxlcyAnICsgXA0K ICAgICAgICAgICAgICAgICAgICAgICAnXHQgQnkgVXNlciAtLT4gJyArIGRhdGFfZGljdFsgc3R1 ZmYgXVswXVszXSArICdcblxuJyApDQogICAgICMNCiAgICAgIyBjbGVhbnVwIGFmdGVyIGxhc3Qg cGFzcw0KICAgICByY3NfYWRkcyA9IHJjc19kZWxldGVzID0gY3R4X2FkZHMgPSBjdHhfY2hhbmdl cyA9IGN0eF9kZWxldGVzID0wDQogICAgIHN1bV9hZGRzID0gc3VtX2FkZGNodW5rcyA9IHN1bV9k ZWxldGVzID0gc3VtX2RlbGV0ZWNodW5rcyA9IHN1bV9jaGFuZ2VzID0gc3VtX2NoYW5nZWNodW5r cyA9IHN1bV9leHRyYSA9IDAgICAgICAgICAgDQogICAgIHVuaV9hZGRzID0gdW5pX2RlbGV0ZXMg PSAwDQogICAgICMNCiAgICAgIw0KICAgICBmb3IganVuayBpbiB0ZW1wX2xpc3Q6DQogICAgICAg IHN5cy5zdGRvdXQud3JpdGUoICdcdCcgKyBqdW5rWzBdICsgJyAtICcgKyBqdW5rWzFdICsgJyAt ICcgKyBqdW5rWzJdICsgJ1xuJyApDQogICAgIGZvciBqdW5rIGluIHRlbXBfbGlzdDoNCiAgICAg ICAgI3N5cy5zdGRvdXQud3JpdGUoICdcdCcgKyBqdW5rWzBdICsgJyAtICcgKyBqdW5rWzFdICsg JyAtICcgKyBqdW5rWzJdICsgJ1xuJyApDQogICAgICAgICMNCiAgICAgICAgIyBUaGlzIGZpbGUg aGFkIGEgcmV2IHRoYXQgY2FuIGJlIGRpZmZlZCAoYXMgZXZpZGVuY2VkIGJ5IHRoZSBlZGl0KQ0K ICAgICAgICBpZiBqdW5rWzJdID09ICdlZGl0JzoNCiAgICAgICAgICAgIyBPbmx5IHByaW50IGRh dGEgaWYgeW91IGhhdmUgYW4gZWRpdCBpbiB0aGUgbGlzdCB0aGF0IGNhbiBwcm92aWRlIGRhdGEN CiAgICAgICAgICAgQ2hhbmdlQ29uZmlybWVkID0gMQ0KICAgICAgICAgICByZXZfbnVtYmVyMSA9 IGludCgganVua1sxXSApDQogICAgICAgICAgICMgVGhlIGltcGxpY2F0aW9uIGhlcmUgaXMgdGhh dCBpbiBhbnkgY2hhbmdlbGlzdCB5b3VyIG9ubHkgc3VibWl0dGluZyB0aGUgbmV4dCByZXYNCiAg ICAgICAgICAgcmV2X251bWJlcjIgPSByZXZfbnVtYmVyMSAtIDENCiAgICAgICAgICAgKCBhZGRz LCBkZWxldGVzICkgPSBleHRyYWN0X21ldHJpY3NfY291bnRzX3Jjc19maWxldG9maWxlKCBqdW5r WzBdICsgJyMnICsgYHJldl9udW1iZXIyYCwganVua1swXSArICcjJyArIGByZXZfbnVtYmVyMWAg KQ0KICAgICAgICAgICByY3NfYWRkcyAgICA9IHJjc19hZGRzICsgYWRkcw0KICAgICAgICAgICBy Y3NfZGVsZXRlcyA9IHJjc19kZWxldGVzICsgZGVsZXRlcw0KICAgICAgICAgICAoIGFkZHMsIGNo YW5nZXMsIGRlbGV0ZXMpID0gZXh0cmFjdF9tZXRyaWNzX2NvdW50c19jb250ZXh0X2ZpbGV0b2Zp bGUoIGp1bmtbMF0gKyAnIycgKyBgcmV2X251bWJlcjJgLCBqdW5rWzBdICsgJyMnICsgYHJldl9u dW1iZXIxYCApDQogICAgICAgICAgIGN0eF9hZGRzICAgID0gY3R4X2FkZHMgKyBhZGRzDQogICAg ICAgICAgIGN0eF9jaGFuZ2VzID0gY3R4X2NoYW5nZXMgKyBjaGFuZ2VzIA0KICAgICAgICAgICBj dHhfZGVsZXRlcyA9IGN0eF9kZWxldGVzICsgZGVsZXRlcw0KICAgICAgICAgICAoIGFkZHMsIGFk ZGNodW5rcywgZGVsZXRlcywgZGVsZXRlY2h1bmtzLCBjaGFuZ2VzLCBjaGFuZ2VjaHVua3MsIGV4 dHJhICkgPSBleHRyYWN0X21ldHJpY3NfY291bnRzX3N1bW1hcnlfZmlsZXRvZmlsZSgganVua1sw XSArICcjJyArIGByZXZfbnVtYmVyMmAsIGp1bmtbMF0gKyAnIycgKyBgcmV2X251bWJlcjFgICkN CiAgICAgICAgICAgc3VtX2FkZHMgICAgICAgICAgID0gc3VtX2FkZHMgICAgICAgICAgKyBhZGRz DQogICAgICAgICAgIHN1bV9hZGRjaHVua3MgICAgICA9IHN1bV9hZGRjaHVua3MgICAgICsgYWRk Y2h1bmtzDQogICAgICAgICAgIHN1bV9kZWxldGVzICAgICAgICA9IHN1bV9kZWxldGVzICAgICAg ICsgZGVsZXRlcw0KICAgICAgICAgICBzdW1fZGVsZXRlY2h1bmtzICAgPSBzdW1fZGVsZXRlY2h1 bmtzICArIGRlbGV0ZWNodW5rcw0KICAgICAgICAgICBzdW1fY2hhbmdlcyAgICAgICAgPSBzdW1f Y2hhbmdlcyAgICAgICArIGNoYW5nZXMNCiAgICAgICAgICAgc3VtX2NoYW5nZWNodW5rcyAgID0g c3VtX2NoYW5nZWNodW5rcyAgKyBjaGFuZ2VjaHVua3MNCiAgICAgICAgICAgc3VtX2V4dHJhICAg ICAgICAgID0gc3VtX2V4dHJhICAgICAgICAgKyBleHRyYSAgICAgICANCiAgICAgICAgICAgKCBh ZGRzLCBkZWxldGVzKSA9IGV4dHJhY3RfbWV0cmljc19jb3VudHNfdW5pZmllZF9maWxldG9maWxl KCBqdW5rWzBdICsgJyMnICsgYHJldl9udW1iZXIyYCwganVua1swXSArICcjJyArIGByZXZfbnVt YmVyMWAgKQ0KICAgICAgICAgICB1bmlfYWRkcyAgICAgPSB1bmlfYWRkcyAgICAgKyBhZGRzICAg IA0KICAgICAgICAgICB1bmlfZGVsZXRlcyAgPSB1bmlfZGVsZXRlcyAgKyBkZWxldGVzIA0KICAg ICBzeXMuc3Rkb3V0LndyaXRlKCAnXG5cblxuJyApDQogICAgIGlmIENoYW5nZUNvbmZpcm1lZCA9 PSAxOg0KICAgICAgICAjDQogICAgICAgICMgUHJpbnQgb3V0IHRoZSBmaW5hbCByZXBvcnQgYWJv dXQgdGhpcyBVc2VyDQogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdcdE1ldHJpY3MgdmlhIFJD UyBkaWZmIG1ldGhvZCAgICAgIExpbmVzIEFkZGVkICAtLT4gJyArIGByY3NfYWRkc2AgKyAnXG4n ICkNCiAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ1x0ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgTGluZXMgRGVsZXRlZC0tPiAnICsgYHJjc19kZWxldGVzYCArICdcblxuJyApDQog ICAgICAgIA0KICAgICAgICAjDQogICAgICAgICMNCiAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgg J1x0TWV0cmljcyB2aWEgQ29udGV4dCBkaWZmIG1ldGhvZCAgTGluZXMgQWRkZWQgIC0tPiAnICsg YGN0eF9hZGRzYCArICdcbicgKQ0KICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnXHQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lcyBDaGFuZ2VkLS0+ICcgKyBgY3R4X2NoYW5n ZXNgICsgJ1xuJyApDQogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdcdCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIExpbmVzIERlbGV0ZWQtLT4gJyArIGBjdHhfZGVsZXRlc2AgKyAn XG5cbicgKQ0KICAgICAgICANCiAgICAgICAgIw0KICAgICAgICAjDQogICAgICAgIHN5cy5zdGRv dXQud3JpdGUoICdcdE1ldHJpY3MgdmlhIFN1bW1hcnkgZGlmZiBtZXRob2QgIEFkZCAgICAtLT4g JyArIGBzdW1fYWRkY2h1bmtzYCArICcgQ2h1bmtzXG4nICkNCiAgICAgICAgc3lzLnN0ZG91dC53 cml0ZSggJ1x0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICsg YHN1bV9hZGRzYCArICcgTGluZXNcbicgKQ0KICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnXHQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVkLS0+ICcgKyBgc3VtX2RlbGV0 ZWNodW5rc2AgKyAnIENodW5rc1xuJyApDQogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdcdCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyArIGBzdW1fZGVsZXRl Y2h1bmtzYCArICcgTGluZXNcbicgKQ0KICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnXHQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkLS0+ICcgKyBgc3VtX2NoYW5nZWNo dW5rc2AgKyAnIENodW5rc1xuJyApDQogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdcdCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyArIGBzdW1fY2hhbmdlc2Ag KyAnIC8gJyArIGBzdW1fZXh0cmFgICsgJyBMaW5lc1xuXG4nICkNCiAgICAgICAgDQogICAgICAg ICMNCiAgICAgICAgIw0KICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnXHRNZXRyaWNzIHZpYSBV bmlmaWVkIGRpZmYgbWV0aG9kICBMaW5lcyBBZGRlZCAgLS0+ICcgKyBgdW5pX2FkZHNgICsgJ1xu JyApDQogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdcdCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIExpbmVzIERlbGV0ZWQtLT4gJyArIGB1bmlfZGVsZXRlc2AgKyAnXG5cbicgKQ0K ICAgICAgICAjIHJlc2V0IHRoaXMgZm9yIHRoZSBuZXh0IHBhc3MNCiAgICAgICAgQ2hhbmdlQ29u ZmlybWVkID0gMA0KDQoNCg0KDQojIE1haW4gYm9keSBvZiBwcm9ncmFtIA0KIw0KIw0KZGVwb3Rf bG9jYXRpb24gPSBzeXMuYXJndlsxXSAgICAgICAgICAgICAgDQpkaWZmX2xhYmVsMSA9IHN5cy5h cmd2WzJdDQpkaWZmX2xhYmVsMiA9IHN5cy5hcmd2WzNdDQoNCnN5cy5zdGRvdXQud3JpdGUoICdT dGFydGluZyBwcm9jZXNzaW5nLi4uLlxuXG4nICkNCg0KIyBjYWxsIHRoZSBkaWZmIHdpdGggdGhl IHN1bW1hcnkgZmxhZ3MNCiMNCiMNCiMgZnlpDQpzeXMuc3Rkb3V0LndyaXRlKCdTdGFydCBwb2lu dCAgJyArIGRpZmZfbGFiZWwxICsgJyAgRW5kIFBvaW50ICAnICsgZGlmZl9sYWJlbDIgKyAnXG4n ICkNCnN5cy5zdGRvdXQud3JpdGUoJ0RlcG90IFJhbmdlICcgKyBkZXBvdF9sb2NhdGlvbiArICdc blxuJyApDQoNCmNoYW5nZWxpc3RfbnVtYmVycyA9IGV4dHJhY3RfY2hhbmdlX251bWJlcnMoIGRl cG90X2xvY2F0aW9uLCBkaWZmX2xhYmVsMSwgZGlmZl9sYWJlbDIgKQ0KZGF0YV9kaWN0ID0gZ2Vu X2NoYW5nZV9kYXRhKCBjaGFuZ2VsaXN0X251bWJlcnMgKQ0KZ2VuX21ldHJpY3NfZGF0YSggZGF0 YV9kaWN0ICkNCg0KDQoNCg0K
---0__=Kd0d0xGdnOvYiEwaatgReoF8TMFnzafgFRQZcQ5inLA0x2ktv414ftIt Content-type: application/octet-stream; name="excelmetrics.py" Content-Disposition: attachment; filename="excelmetrics.py" Content-transfer-encoding: base64
IyMNCiMjICBXcml0dGVuIGJ5IFNjb3R0IFBhc25pa293c2tpIGFyb3VuZCB0aGUgdGltZSBvZiA0 LzIyLzk5DQojIyAgQHN5bWFudGVjIGNvcnAuICAgSG9tZSBvZiB0aGUgTm9ydG9uIHV0aWxpdGll cw0KIyMNCiMjICBVbmRlciBkdXJlc3Mgb2YgcGVza3kgUUEgcGVvcGxlLi4uDQojIw0KIyMgIFRo aXMgY29tZXMgd2l0aCBubyBndWFyYW50ZWUgd2hhdHNvZXZlci4uLiBvbiBhbnkgbGV2ZWwuDQoj Iw0KIyMgIENvbnNpZGVyIHRoaXMgdG8gYmUgdW5kZXIgdGhlIGxpbnV4IHR5cGUgbGlzY2Vuc2Ug dGhpbmd5DQojIyAgKCBEb24ndCByZWNhbGwgd2hhdCBpdHMgY2FsbGVkIEdOVSBvciBjb3B5bGVm dCBvciB3aGF0ZXZlciApIA0KIyMgIGFuZCBpZiBhbnlvbmUgY29tcGxhaW5zIG15IG1hbmFnZXIg ZHUgam91ciBzYWlkIEkgY291bGQgZ2l2ZSBpdCBhd2F5Lg0KIyMgICggaGUgcmVhbGx5IGRpZCAp DQojIw0KDQojIS91c3IvbG9jYWwvYmluL3B5dGhvbg0KIw0KaW1wb3J0IHN5cywgb3MsIHN0cmlu ZywgcmUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIyBldmVyeWJvZHkgaXMgdXNp bmcgdGhpcyANCmV4cEZpbGVOYW1lRmllbGQgPSByZS5jb21waWxlKCByJ14oLy8uKykvKC4rKScg KQ0KDQoNCiMgVGhpcyBmdW5jIGNvcnJlc3BvbmRzIHRvIHA0IGRpZmYyIHdpdGggdGhlIC1kbiBz d2l0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRz X3JjcyggZGVwb3Rfcm9vdCwgbGFiZWxfb25lLCBsYWJlbF90d28gKToNCgkjIERvZXMgYSBwNCBj aGFuZ2VzIGRlcG90X3Jvb3RAbGFiZWxfb25lIGRlcG90X3Jvb3RAbGFiZWxfdHdvDQogICAgIyBk ZXBvdF9yb290IGlzIHVzZWQgdG8gbGltaXQgdGhlIGRpZmYgcmFuZ2UgdG8gYSBzaW5nbGUgInBy b2plY3QiDQogICAgIyBvciBzb21ldGhpbmcgZXZlbiBzbWFsbGVyLi4gbGlrZSBhIHNpbmdsZSBm aWxlDQogICAgIyB3ZSB0aGVuIHBhcnNlIHRoZSBvdXRwdXQgYW5kIGFkZCB1cCB0aGUgdG90YWxz DQoNCiAgY29tbWFuZCA9ICdwNCBkaWZmMiAtZG4gXCInICsgZGVwb3Rfcm9vdCArIGxhYmVsX29u ZSArICdcIiBcIicgKyBkZXBvdF9yb290ICsgbGFiZWxfdHdvICsgJ1wiJw0KICBsaW5lc19hZGRl ZCA9IDANCiAgbGluZXNfY2hhbmdlZCA9IDANCiAgbGluZXNfZGVsZXRlZCA9IDANCiAgDQogICNz eXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1bmN0aW9uIHVzaW5nICcgKyBjb21tYW5kICsn ICBcbicgKQ0KDQogICMgYnJlYWsgdGhlIGxpbmUgdXAgYWNjb3JkaW5nIHRvLi4uDQogICMgc2Ft cGxlIGxpbmU6IGE4NSAyDQogICMgICAgICAgICAgICAgIG9wZXJhdGlvbiAobGluZSlsb2NhdGlv biAoTnVtYmVyIG9mIGxpbmVzIGFmZmVjdGVkKWNvdW50IA0KICBwID0gcmUuY29tcGlsZSggcide KFthZF0pKFswLTldKykgKFxkKyknICkNCiAgDQogIGZvciBsaW5lIGluIG9zLnBvcGVuKCBjb21t YW5kLCdyJykucmVhZGxpbmVzKCk6DQogICAgdG1wID0gbGluZVswOjFdICANCiAgICBpZiB0bXAg PT0gJ2EnIG9yIHRtcCA9PSAnZCc6DQogICAgICAgICAgIyBvbmx5IGRvIHRoaXMgaWYgd2UgaGF2 ZSBhIG1hdGNoIG90aGVyd2lzZSBncm91cHMoKSB3aWxsIGJsb3cgY2h1bmtzIGRpZmZpbmcgYW4g cnRmDQogICAgICAgICAgbSA9IHAubWF0Y2goIGxpbmUgKQ0KICAgICAgICAgIGlmIG06DQogICAg ICAgICAgICAob3BlcmF0aW9uLCBsb2NhdGlvbiwgY291bnQpID0gcmUubWF0Y2goIHInXihbYWRd KShbMC05XSspIChcZCspJywgbGluZSkuZ3JvdXBzKCkNCiAgICAgICAgICAgICNzeXMuc3Rkb3V0 LndyaXRlKCAnPicgKyBvcGVyYXRpb24gKyAnPCAgICA+JyArIGxvY2F0aW9uICsgJzwgICA+JyAr IGNvdW50ICsgJzxcbicgKQ0KICAgICAgICAgICAgaWYgdG1wID09ICdhJzoNCiAgICAgICAgICAg ICAgIGxpbmVzX2FkZGVkID0gbGluZXNfYWRkZWQgKyBpbnQoIGNvdW50ICkNCiAgICAgICAgICAg IGVsaWYgdG1wID09ICdkJzogICANCiAgICAgICAgICAgICAgIGxpbmVzX2RlbGV0ZWQgPSBsaW5l c19kZWxldGVkICsgaW50KCBjb3VudCApDQogICAgICAgICAgICAgICAgICAgICAgDQogIHJldHVy biBsaW5lc19hZGRlZCwgbGluZXNfZGVsZXRlZA0KDQogIA0KIyBUaGlzIGZ1bmMgY29ycmVzcG9u ZHMgdG8gcDQgZGlmZjIgd2l0aCB0aGUgLWRjIHN3aXRjaCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIA0KZGVmIGV4dHJhY3RfbWV0cmljc19jb3Vu dHNfY29udGV4dCggZGVwb3Rfcm9vdCwgbGFiZWxfb25lLCBsYWJlbF90d28gKToNCgkjIERvZXMg YSBwNCBjaGFuZ2VzIGRlcG90X3Jvb3RAbGFiZWxfb25lIGRlcG90X3Jvb3RAbGFiZWxfdHdvDQog ICAgIyBkZXBvdF9yb290IGlzIHVzZWQgdG8gbGltaXQgdGhlIGRpZmYgcmFuZ2UgdG8gYSBzaW5n bGUgInByb2plY3QiDQogICAgIyBvciBzb21ldGhpbmcgZXZlbiBzbWFsbGVyLi4gbGlrZSBhIHNp bmdsZSBmaWxlDQogICAgIyB3ZSB0aGVuIHBhcnNlIHRoZSBvdXRwdXQgYW5kIGFkZCB1cCB0aGUg dG90YWxzDQoNCiAgY29tbWFuZCA9ICdwNCBkaWZmMiAtZGMgXCInICsgZGVwb3Rfcm9vdCArIGxh YmVsX29uZSArICdcIiBcIicgKyBkZXBvdF9yb290ICsgbGFiZWxfdHdvICsgJ1wiJw0KICBsaW5l c19hZGRlZCA9IDANCiAgbGluZXNfY2hhbmdlZCA9IDANCiAgbGluZXNfZGVsZXRlZCA9IDANCiAg DQogICNzeXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1bmN0aW9uIHVzaW5nICcgKyBjb21t YW5kICsnICBcbicgKQ0KICANCiAgZm9yIGxpbmUgaW4gb3MucG9wZW4oIGNvbW1hbmQsJ3InKS5y ZWFkbGluZXMoKToNCiAgICAjIHNhbXBsZSBsaW5lOiBDaGFuZ2UgbnVtYmVyIG9uIGRhdGUgYnkg bmFtZUBtYWNoaW5lICdjb21tZW50Jw0KICAgICMgICAgICAgICAgICAgIGR1bW15ICBjaCMgICAN CiAgICAjc3lzLnN0ZG91dC53cml0ZSggbGluZSArICdcbicgKQ0KICAgIHRtcCA9IGxpbmVbMDox XSAgDQogICAgaWYgdG1wID09ICcrJzoNCiAgICAgICBsaW5lc19hZGRlZCA9IGxpbmVzX2FkZGVk ICsgMQ0KICAgIGVsaWYgdG1wID09ICctJzoNCiAgICAgICBsaW5lc19kZWxldGVkID0gbGluZXNf ZGVsZXRlZCArIDENCiAgICBlbGlmIHRtcCA9PSAnISc6DQogICAgICAgbGluZXNfY2hhbmdlZCA9 IGxpbmVzX2NoYW5nZWQgKzENCg0KICByZXR1cm4gbGluZXNfYWRkZWQsbGluZXNfY2hhbmdlZCxs aW5lc19kZWxldGVkDQogIA0KICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX3N1bW1hcnko IGRlcG90X3Jvb3QsIGxhYmVsX29uZSwgbGFiZWxfdHdvICk6DQoJIyBEb2VzIGEgcDQgY2hhbmdl cyBkZXBvdF9yb290QGxhYmVsX29uZSBkZXBvdF9yb290QGxhYmVsX3R3bw0KICAgICMgZGVwb3Rf cm9vdCBpcyB1c2VkIHRvIGxpbWl0IHRoZSBkaWZmIHJhbmdlIHRvIGEgc2luZ2xlICJwcm9qZWN0 Ig0KICAgICMgb3Igc29tZXRoaW5nIGV2ZW4gc21hbGxlci4uIGxpa2UgYSBzaW5nbGUgZmlsZQ0K ICAgICMgd2UgdGhlbiBwYXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQgdXAgdGhlIHRvdGFscw0KDQog IGNvbW1hbmQgPSAncDQgZGlmZjIgLWRzIFwiJyArIGRlcG90X3Jvb3QgKyBsYWJlbF9vbmUgKyAn XCIgXCInICsgZGVwb3Rfcm9vdCArIGxhYmVsX3R3byArICdcIicNCiAgbGluZXNfYWRkZWQgPSAw DQogIGFkZF9jaHVua3MgPSAwDQogIGxpbmVzX2RlbGV0ZWQgPSAwDQogIGRlbGV0ZV9jaHVua3Mg PSAwDQoNCiAgbGluZXNfY2hhbmdlZCA9IDANCiAgY2hhbmdlX2NodW5rcyA9IDANCiAgZXh0cmFf ZGF0YSA9IDAgIA0KDQogICNzeXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1bmN0aW9uIHVz aW5nICcgKyBjb21tYW5kICsnICBcbicgKQ0KDQogICMgVGhpcyB3aWxsIG1hdGNoIGxpbmVzIHN0 YXJ0aW5nIHdpdGggDQogIGV4cDEgPSByZS5jb21waWxlKCByJ15bImFkZCIiZGVsZXRlZCIiY2hh bmdlZF0iJyApDQogICMNCiAgIyBUaGUgbmV4dCAzIGVhdCB0aGUgYWRkIGRlbGV0ZWQgYW5kIGNo YW5nZWQgbGluZXMNCiAgIyAgaXQgY291bGQgYmUgb25lIGV4cHJlc3Npb24gSSBzdXBwb3NlDQog ICMNCiAgZXhwMiA9IHJlLmNvbXBpbGUoIHInXihhZGQpIChcZCspIChjaHVua3MpIChcZCspJyAp DQogIGV4cDMgPSByZS5jb21waWxlKCByJ14oZGVsZXRlZCkgKFxkKykgKGNodW5rcykgKFxkKykn ICkNCiAgZXhwNCA9IHJlLmNvbXBpbGUoIHInXihjaGFuZ2VkKSAoXGQrKSAoY2h1bmtzKSAoXGQr KSAvIChcZCspJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29tbWFuZCwncicpLnJl YWRsaW5lcygpOg0KICAgICAjIG9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlIGEgbWF0Y2gNCiAgICAg bTIgPSBleHAyLnNlYXJjaCggbGluZSApDQogICAgIG0zID0gZXhwMy5zZWFyY2goIGxpbmUgKQ0K ICAgICBtNCA9IGV4cDQuc2VhcmNoKCBsaW5lICkNCiAgICAgDQogICAgIGlmIG0yOg0KICAgICAg ICAgKCBvcGVyYXRpb24sIGNvdW50MSwgY2h1bmtzLCBjb3VudDIgKSA9IG0yLmdyb3VwcygpDQog ICAgICAgICBhZGRfY2h1bmtzID0gYWRkX2NodW5rcyArIGludCggY291bnQxICkNCiAgICAgICAg IGxpbmVzX2FkZGVkID0gbGluZXNfYWRkZWQgKyBpbnQoIGNvdW50MiApDQogICAgICAgICAjc3lz LnN0ZG91dC53cml0ZSggY291bnQyICsgJ1xuJyApDQogICAgICAgIA0KICAgICBlbGlmIG0zOg0K ICAgICAgICAgKCBvcGVyYXRpb24sIGNvdW50MSwgY2h1bmtzLCBjb3VudDIgKSA9IG0zLmdyb3Vw cygpDQogICAgICAgICBkZWxldGVfY2h1bmtzID0gZGVsZXRlX2NodW5rcyArIGludCggY291bnQx ICkNCiAgICAgICAgIGxpbmVzX2RlbGV0ZWQgPSBsaW5lc19kZWxldGVkICsgaW50KCBjb3VudDIg KQ0KICAgICAgICAgI3N5cy5zdGRvdXQud3JpdGUoIGNvdW50MiArICdcbicgKQ0KICAgICAgICAN CiAgICAgZWxpZiBtNDoNCiAgICAgICAgICggb3BlcmF0aW9uLCBjb3VudDEsIGNodW5rcywgY291 bnQyLCBjb3VudDMgKSA9IG00Lmdyb3VwcygpDQogICAgICAgICBjaGFuZ2VfY2h1bmtzID0gY2hh bmdlX2NodW5rcyArIGludCggY291bnQxICkNCiAgICAgICAgIGV4dHJhX2RhdGEgPSBleHRyYV9k YXRhICsgaW50KCBjb3VudDIgKQ0KICAgICAgICAgbGluZXNfY2hhbmdlZCA9IGxpbmVzX2NoYW5n ZWQgKyBpbnQoIGNvdW50MyApDQogICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggY291bnQzICsg J1xuJyApDQogICAgICAgICAgICAgICAgICAgICAgDQogIHJldHVybiBsaW5lc19hZGRlZCxhZGRf Y2h1bmtzLGxpbmVzX2RlbGV0ZWQsZGVsZXRlX2NodW5rcyxsaW5lc19jaGFuZ2VkLGNoYW5nZV9j aHVua3MsIGV4dHJhX2RhdGENCiAgDQogIA0KIyBUaGlzIGZ1bmMgY29ycmVzcG9uZHMgdG8gcDQg ZGlmZjIgd2l0aCB0aGUgLWR1IHN3aXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgDQogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX3VuaWZpZWQoIGRlcG90 X3Jvb3QsIGxhYmVsX29uZSwgbGFiZWxfdHdvICk6DQoJIyBEb2VzIGEgcDQgY2hhbmdlcyBkZXBv dF9yb290QGxhYmVsX29uZSBkZXBvdF9yb290QGxhYmVsX3R3bw0KICAgICMgZGVwb3Rfcm9vdCBp cyB1c2VkIHRvIGxpbWl0IHRoZSBkaWZmIHJhbmdlIHRvIGEgc2luZ2xlICJwcm9qZWN0Ig0KICAg ICMgb3Igc29tZXRoaW5nIGV2ZW4gc21hbGxlci4uIGxpa2UgYSBzaW5nbGUgZmlsZQ0KICAgICMg d2UgdGhlbiBwYXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQgdXAgdGhlIHRvdGFscw0KDQogIGNvbW1h bmQgPSAncDQgZGlmZjIgLWR1IFwiJyArIGRlcG90X3Jvb3QgKyBsYWJlbF9vbmUgKyAnXCIgXCIn ICsgZGVwb3Rfcm9vdCArIGxhYmVsX3R3byAgKyAnXCInDQogIGxpbmVzX2FkZGVkID0gMA0KICBs aW5lc19kZWxldGVkID0gMA0KICANCiAgI3N5cy5zdGRvdXQud3JpdGUoJ0V4dHJhY3Rpb24gZnVu Y3Rpb24gdXNpbmcgJyArIGNvbW1hbmQgKycgIFxuJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5w b3BlbiggY29tbWFuZCwncicpLnJlYWRsaW5lcygpOg0KICAgICMgc2FtcGxlIGxpbmU6IENoYW5n ZSBudW1iZXIgb24gZGF0ZSBieSBuYW1lQG1hY2hpbmUgJ2NvbW1lbnQnDQogICAgIyAgICAgICAg ICAgICAgZHVtbXkgIGNoIyAgIA0KICAgICNzeXMuc3Rkb3V0LndyaXRlKCBsaW5lICsgJ1xuJyAp DQogICAgdG1wID0gbGluZVswOjFdICANCiAgICBpZiB0bXAgPT0gJysnOg0KICAgICAgIGxpbmVz X2FkZGVkID0gbGluZXNfYWRkZWQgKyAxDQogICAgZWxpZiB0bXAgPT0gJy0nOg0KICAgICAgIGxp bmVzX2RlbGV0ZWQgPSBsaW5lc19kZWxldGVkICsgMQ0KDQogIHJldHVybiBsaW5lc19hZGRlZCwg bGluZXNfZGVsZXRlZA0KICANCiMgVGhpcyBmdW5jIGNvcnJlc3BvbmRzIHRvIHA0IGRpZmYyIHdp dGggbm8gc3dpdGNocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgDQoNCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX2ZsYXQoIGRlcG90X3Jvb3QsIGxh YmVsX29uZSwgbGFiZWxfdHdvICk6DQoJIyBEb2VzIGEgcDQgY2hhbmdlcyBkZXBvdF9yb290QGxh YmVsX29uZSBkZXBvdF9yb290QGxhYmVsX3R3bw0KICAgICMgZGVwb3Rfcm9vdCBpcyB1c2VkIHRv IGxpbWl0IHRoZSBkaWZmIHJhbmdlIHRvIGEgc2luZ2xlICJwcm9qZWN0Ig0KICAgICMgb3Igc29t ZXRoaW5nIGV2ZW4gc21hbGxlci4uIGxpa2UgYSBzaW5nbGUgZmlsZQ0KICAgICMgd2UgdGhlbiBw YXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQgdXAgdGhlIHRvdGFscw0KDQogIGNvbW1hbmQgPSAncDQg ZGlmZjIgJyArIGRlcG90X3Jvb3QgKyBsYWJlbF9vbmUgKyAnICcgKyBkZXBvdF9yb290ICsgbGFi ZWxfdHdvICANCiAgbGluZXNfYWRkZWQgPSAwDQogIGxpbmVzX2RlbGV0ZWQgPSAwDQogIGxpbmVz X2NoYW5nZWQgPSAwDQogIA0KICAjc3lzLnN0ZG91dC53cml0ZSgnRXh0cmFjdGlvbiBmdW5jdGlv biB1c2luZyAnICsgY29tbWFuZCArJyAgXG4nICkNCg0KICBleHBGaWxlID0gcmUuY29tcGlsZSgg cidePT09PScgKQ0KICAjIFRoZSBuZXh0IDQgZWF0IHRoZSBhZGQgZGVsZXRlZCBhbmQgY2hhbmdl ZCBsaW5lcw0KICAjIGl0IGNvdWxkIGJlIG9uZSBleHByZXNzaW9uIEkgc3VwcG9zZQ0KICAjDQog IGV4cDEgPSByZS5jb21waWxlKCByJ14oXGQrKShbYWNkXSkoXGQrKScgKQ0KICBleHAyID0gcmUu Y29tcGlsZSggcideKFxkKyksKFxkKykoW2FjZF0pKFxkKyknICkNCiAgZXhwMyA9IHJlLmNvbXBp bGUoIHInXihcZCspKFthY2RdKShcZCspLChcZCspJyApDQogIGV4cDQgPSByZS5jb21waWxlKCBy J14oXGQrKSwoXGQrKShbYWNkXSkoXGQrKSwoXGQrKScgKQ0KICANCiAgDQogIGZvciBsaW5lIGlu IG9zLnBvcGVuKCBjb21tYW5kLCdyJykucmVhZGxpbmVzKCk6DQogICAgICMgb25seSBkbyB0aGlz IGlmIHdlIGhhdmUgYSBtYXRjaA0KICAgICBtMSA9IGV4cDEuc2VhcmNoKCBsaW5lICkNCiAgICAg bTIgPSBleHAyLnNlYXJjaCggbGluZSApDQogICAgIG0zID0gZXhwMy5zZWFyY2goIGxpbmUgKQ0K ICAgICBtNCA9IGV4cDQuc2VhcmNoKCBsaW5lICkNCg0KICAgICBpZiBtNDoNCiAgICAgICAgICgg Y291bnQxLCBjb3VudDIsIG9wZXJhdGlvbiwgY291bnQzLCBjb3VudDQgKSA9IG00Lmdyb3Vwcygp DQogICAgICAgICBtTGluZSA9IGV4cEZpbGUubWF0Y2goIHByZXZfbGluZSApDQogICAgICAgICBp ZiBtTGluZToNCiAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIHByZXZfbGluZSArICdcbicg KQ0KICAgICAgICAgICAgDQogICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBjb3VudDEgKyAnICcg KyBjb3VudDIgKyAnICcgKyBvcGVyYXRpb24gKyAnICcgKyBjb3VudDMgKyAnICcgKyBjb3VudDQg KyAnXG4nICkNCg0KICAgICBlbGlmIG0zOg0KICAgICAgICAgKCBjb3VudDEsIG9wZXJhdGlvbiwg Y291bnQyLCBjb3VudDMgKT0gbTMuZ3JvdXBzKCkNCiAgICAgICAgIG1MaW5lID0gZXhwRmlsZS5t YXRjaCggcHJldl9saW5lICkNCiAgICAgICAgIGlmIG1MaW5lOg0KICAgICAgICAgICAgc3lzLnN0 ZG91dC53cml0ZSggcHJldl9saW5lICsgJ1xuJyApDQogICAgICAgICBzeXMuc3Rkb3V0LndyaXRl KCBjb3VudDEgKyAnICcgKyBvcGVyYXRpb24gKyAnICcgKyBjb3VudDIgKyAnICcgKyBjb3VudDMg KyAnXG4nICkNCiANCiAgICAgZWxpZiBtMjoNCiAgICAgICAgICggY291bnQxLCBjb3VudDIsIG9w ZXJhdGlvbiwgY291bnQzICkgPSBtMi5ncm91cHMoKQ0KICAgICAgICAgbUxpbmUgPSBleHBGaWxl Lm1hdGNoKCBwcmV2X2xpbmUgKQ0KICAgICAgICAgaWYgbUxpbmU6DQogICAgICAgICAgICBzeXMu c3Rkb3V0LndyaXRlKCBwcmV2X2xpbmUgKyAnXG4nICkNCg0KICAgICAgICAgc3lzLnN0ZG91dC53 cml0ZSggY291bnQxICsgJyAnICsgY291bnQyICsgJyAnICsgb3BlcmF0aW9uICsgJyAnICsgY291 bnQzICsgJ1xuJyApDQoNCiAgICAgZWxpZiBtMToNCiAgICAgICAgICggY291bnQxLCBvcGVyYXRp b24sIGNvdW50MiApID0gbTEuZ3JvdXBzKCkNCiAgICAgICAgIG1MaW5lID0gZXhwRmlsZS5tYXRj aCggcHJldl9saW5lICkNCiAgICAgICAgIGlmIG1MaW5lOg0KICAgICAgICAgICAgc3lzLnN0ZG91 dC53cml0ZSggcHJldl9saW5lICsgJ1xuJyApDQoNCiAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUo IGNvdW50MSArICcgJyArIG9wZXJhdGlvbiArICcgJyArIGNvdW50MiArICdcbicgKQ0KDQogICAg IHByZXZfbGluZSA9IGxpbmUgICAgDQogICAgICAgICAgICAgICAgICAgICAgDQogIHJldHVybiBs aW5lc19hZGRlZCwgbGluZXNfZGVsZXRlZCwgbGluZXNfY2hhbmdlZA0KICANCg0KZGVmIGV4dHJh Y3RfbWV0cmljc19jb3VudHNfZmlsZSggZGVwb3Rfcm9vdCwgbGFiZWxfb25lLCBsYWJlbF90d28g KToNCgkjIERvZXMgYSBwNCBjaGFuZ2VzIGRlcG90X3Jvb3RAbGFiZWxfb25lIGRlcG90X3Jvb3RA bGFiZWxfdHdvDQogICAgIyBkZXBvdF9yb290IGlzIHVzZWQgdG8gbGltaXQgdGhlIGRpZmYgcmFu Z2UgdG8gYSBzaW5nbGUgInByb2plY3QiDQogICAgIyBvciBzb21lIHN1YnNldCBldmVuIHNtYWxs ZXIuLiAgIA0KICAgICMgd2UgdGhlbiBwYXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQgdXAgdGhlIHRv dGFscw0KDQogICMgVXNlIHF1b3RlcyBhcm91bmQgdGhlIGZpbGUgcGFyYW1zIGluIGNhc2Ugc29t ZW9uZSBpbnB1dHMgYSBwYXRoIHRoYXQgY29udGFpbnMgc3BhY2UgY2hhcnMNCiAgY29tbWFuZCA9 ICdwNCBkaWZmMiBcIicgKyBkZXBvdF9yb290ICsgbGFiZWxfb25lICsgJ1wiIFwiJyArIGRlcG90 X3Jvb3QgKyBsYWJlbF90d28gICsgJ1wiJw0KICAgDQogIGRlYnVnID0gMA0KICANCiAgZmlsZXNf YWRkZWQgPSAwDQogIGZpbGVzX2RlbGV0ZWQgPSAwDQogIGZpbGVzX3R5cGVjaGFuZ2UgPSAwDQog IGZpbGVzX2NoYW5nZWQgPSAwDQogIHJldmlzaW9uc19hZGRlZCA9IDANCg0KICBmaWxlX2NvdW50 MSA9IDANCiAgZmlsZV9jb3VudDIgPSAwDQogIGZpbGVfbGlzdCA9IFtdDQogICAgDQogICMgZnlp DQogICNzeXMuc3Rkb3V0LndyaXRlKCdTdGFydCBwb2ludCAgJyArIGxhYmVsX29uZSArICcgIEVu ZCBQb2ludCAgJyArIGxhYmVsX3R3byArICdcbicgKQ0KICAjc3lzLnN0ZG91dC53cml0ZSgnRGVw b3QgUmFuZ2UgJyArIGRlcG90X3Jvb3QgKyAnXG5cbicgKQ0KDQogICMgT25seSBwcm9jZXNzIHRo ZSBsaW5lcyB0aGF0IGxpc3QgZmlsZXNwZWMxIC0gZmlsZXNwZWMyDQogIGV4cE1haW4gPSByZS5j b21waWxlKCByJ149PT09JyApDQogIA0KICAjIElmIHRoZSBmaXJzdCBmaWxlIGlzIG1pc3Npbmcg aXQgd2lsbCBzaG93IHVwIGFzIHRoZSBmb2xsb3dpbmcNCiAgZXhwTWlzc2luZ0ZpcnN0ID0gcmUu Y29tcGlsZSggcic8IG5vbmUgPicgKSAgDQogIA0KICAjIElmIHRoZSBzZWNvbmQgZmlsZSBpcyBt aXNzaW5nIGlzIHdpbGwgc2hvdyB1cCBhcyAoIG5vdGljZSBtaXNzaW5nIHNwYWNlcykNCiAgZXhw TWlzc2luZ1NlY29uZCA9IHJlLmNvbXBpbGUoIHInPG5vbmU+JyApICANCiAgDQogICMgc3BlY2lh bCBjYXNlIG9mIG5vIHNlY29uZCBmaWxlDQogIGV4cDEgPSByZS5jb21waWxlKCByJyAtIDwnICkN CiAgIyBpbiBhbGwgb3RoZXIgY2FzZXMgdGhpcyBpcyB0aGUgc2VwYXJhdG9yDQogIGV4cDIgPSBy ZS5jb21waWxlKCByJyAtIC8vJyApDQogICMgV2Ugd2lsbCB1c2UgdGhlICMgdG8gc3BsaXQgdGhl IGZpbGUgc3BlYyBmcm9tIHRoZSByZXZpc2lvbiBudW1iZXINCiAgZXhwMyA9IHJlLmNvbXBpbGUo IHInIycgKQ0KICBzcGFjZUV4cCA9IHJlLmNvbXBpbGUoIHInICcgKQ0KICANCiAgZm9yIGxpbmUg aW4gb3MucG9wZW4oIGNvbW1hbmQsJ3InKS5yZWFkbGluZXMoKToNCiAgICAgIyBvbmx5IGZvciBs aW5lcyBsaXN0aW5nIGZpbGUgc3BlY3MNCiAgICAgbU1haW4gPSBleHBNYWluLnNlYXJjaCggbGlu ZSApDQogICAgIGlmIG1NYWluOg0KDQogICAgICAgIGlmIGRlYnVnOg0KICAgICAgICAgICBzeXMu c3Rkb3V0LndyaXRlKCBsaW5lICkNCiAgICAgDQogICAgICAgICMgUHJldmVudGl2ZSBjbGVhbnVw DQogICAgICAgIGZpbGUxX3NlY3Rpb24xID0gZmlsZTFfc2VjdGlvbjIgPSBmaWxlMl9zZWN0aW9u MSA9IGZpbGUyX3NlY3Rpb24yID0gJycNCiAgICAgICAgZmlsZTFfcmV2bnVtID0gZmlsZTJfcmV2 bnVtID0gZmlsZTFfdHlwZSA9ZmlsZTJfdHlwZSA9IGRlbGltaXRlciA9IGNvbXBhcmVfc3RhdHVz ID0gJycNCiAgICAgICAgdGVtcCA9IDANCg0KICAgICAgICBtTWlzc2luZ0ZpcnN0ID0gZXhwTWlz c2luZ0ZpcnN0LnNlYXJjaCggbGluZSApDQogICAgICAgIG1NaXNzaW5nU2Vjb25kID0gZXhwTWlz c2luZ1NlY29uZC5zZWFyY2goIGxpbmUgKQ0KICAgICAgICANCiAgICAgICAgIyBsZXRzIHN0YXJ0 IG9mZiB0aGlua2luZyB0aGF0IGVhY2ggZmlsZSBoYXMgMSByZXYgdGhlbg0KICAgICAgICAjIGxh dGVyIHdlIHdpbGwgYnJlYWsgdGhlICJyZWFsIiByZXYgbnVtYmVyIG91dCBvZiBlYWNoIGZpbGVz cGVjDQogICAgICAgICMgYW5kIHBsYWNlIGl0IGluIG9uZSBvZiB0aGVzZQ0KICAgICAgICAjDQog ICAgICAgIHJldl9udW1iZXIxID0gMQ0KICAgICAgICByZXZfbnVtYmVyMiA9IDENCgkNCgkJDQoJ CSMgU3RyaW5nIHNwbGl0dGluZyBmb3IgZmlyc3QgZmlsZQ0KCQkjDQogICAgICAgIGlmIG1NaXNz aW5nRmlyc3Q6DQoJCSAgICMgRmlyc3QgZmlsZSBpcyBlbXB0eSBzbyB0aGlzIGlzIGFuIGFkZGVk IGZpbGUNCiAgICAgICAgICAgaWYgZGVidWc6DQogICAgICAgICAgICAgIHN5cy5zdGRvdXQud3Jp dGUoICdBZGRlZCEhISFcbicgKQ0KICAgICAgICAgICBmaWxlc19hZGRlZCA9IGZpbGVzX2FkZGVk ICsgMQ0KICAgICAgICAgICByZXZfbnVtYmVyMSA9IDANCiAgICAgICAgZWxzZToNCiAgICAgICAg ICAgIyBicmVhayB0aGUgbGluZSB1cCBpbnRvIGVhY2ggb2YgaXRzIGZpbGUgcGFydHMgCQ0KICAg ICAgICAgICAjIHdlIG11c3QgY2hlY2sgaGVyZSBpZiB3ZSBhcmUgbWlzc2luZyB0aGUgc2Vjb25k IGZpbGVzcGVjIGJlY2F1c2UNCiAgICAgICAgICAgIyB0aGVuIHRoZSBkZWxpbWl0ZXIgY2hhbmdl cyBmcm9tICItIC8vJyB0byAiLSA8Ig0KICAgICAgICAgICAjIFdlIGNhbnQgdXNlIHBsYWluICIt IiBiZWNhdXNlIGl0IG1heSBiZSBpbiBhIGZpbGVuYW1lDQogICAgICAgICAgIGlmIG1NaXNzaW5n U2Vjb25kOg0KICAgICAgICAgICAgICAoIHNlY3Rpb24xLCBzZWN0aW9uMiApID0gZXhwMS5zcGxp dCggbGluZSApDQogICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICggc2VjdGlvbjEsIHNl Y3Rpb24yICkgPSBleHAyLnNwbGl0KCBsaW5lICkNCiAgICAgICAgICAgDQogICAgICAgICAgIGlm IGRlYnVnOg0KICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnc2VjdGlvbjEtPicgKyBz ZWN0aW9uMSArICdcbicgKQ0KICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnc2VjdGlv bjItPicgKyBzZWN0aW9uMiArICdcbicgKQ0KICAgICAgICAgICANCiAgICAgICAgICAgIyBtYWlu IGNvdW50IGZpbGVzIGluIGZpcnN0IEBsYWJlbA0KICAgICAgICAgICBmaWxlX2NvdW50MSA9IGZp bGVfY291bnQxICsgMQ0KCSAgICAgICANCgkgICAgICAgIyBub3cgc3BsaXQgdGhlIHBhdGggZnJv bSB0aGUgcmV2IG51bWJlcg0KICAgICAgICAgICAoIGZpbGUxX3NlY3Rpb24xLCBmaWxlMV9zZWN0 aW9uMiApID0gZXhwMy5zcGxpdCggc2VjdGlvbjEgKQ0KICAgICAgICAgICBpZiBkZWJ1ZzoNCiAg ICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ2ZpbGUxX3NlY3Rpb24xLT4nICsgZmlsZTFf c2VjdGlvbjEgKyAnXG4nICkNCiAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ2ZpbGUx X3NlY3Rpb24yLT4nICsgZmlsZTFfc2VjdGlvbjIgKyAnXG4nICkNCgkJICAgDQogICAgICAgICAg IGlmIG1NaXNzaW5nU2Vjb25kOg0KICAgICAgICAgICAgICAjIElmIHlvdXIgbWlzc2luZyBzZWNv bmQgZmlsZSB0aGVyZSB3aWxsIGJlIG5vIGZpbGUgdHlwZSB0byANCiAgICAgICAgICAgICAgIyBz cGxpdCBvZmYNCiAgICAgICAgICAgICAgcmV2X251bWJlcjEgPSBpbnQoIGZpbGUxX3NlY3Rpb24y ICkNCiAgICAgICAgICAgICAgaWYgZGVidWc6DQogICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQu d3JpdGUoICdmaWxlMSByZXYgbnVtYmVyLT4nICsgZmlsZTFfc2VjdGlvbjIgKyAnXG4nICkNCiAg ICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgKCBmaWxlMV9yZXZudW0sIGZpbGUxX3R5cGUg KSA9IHJlLnNwbGl0KCAnICcsIGZpbGUxX3NlY3Rpb24yLCAyICkNCiAgICAgICAgICAgICAgcmV2 X251bWJlcjEgPSBpbnQoIGZpbGUxX3Jldm51bSApDQogICAgICAgICAgICAgIGlmIGRlYnVnOg0K ICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnZmlsZTEgcmV2IG51bWJlci0+JyAr IGZpbGUxX3Jldm51bSArICdcbicgKQ0KICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRl KCAnZmlsZTEgdHlwZS0+JyArIGZpbGUxX3R5cGUgKyAnXG4nICkNCg0KICAgICAgICAgICAgICAN CiAgICAgICAgIyBTdHJpbmcgc3BsaXR0aW5nIGZvciBzZWNvbmQgZmlsZQ0KICAgICAgICAjDQog ICAgICAgIGlmIG1NaXNzaW5nU2Vjb25kOg0KICAgICAgICAgICAjIFNlY29uZCBmaWxlIGlzIGVt cHR5IHNvIHRoaXMgaXMgYSBkZWxldGVkIGZpbGUNCiAgICAgICAgICAgZmlsZXNfZGVsZXRlZCA9 IGZpbGVzX2RlbGV0ZWQgKyAxDQogICAgICAgICAgIHJldl9udW1iZXIyID0gMA0KDQogICAgICAg ICAgICMgUmVzdG9yZSBmaWxlIG5hbWUgZm9yIHJlIHNlYXJjaCAoYWRkIC8vKSBhbmQgcHJpbnQg b3V0IGV4Y2VsIGxpbmUNCiAgICAgICAgICAgIyANCiAgICAgICAgICAgczEgPSBleHBGaWxlTmFt ZUZpZWxkLnNlYXJjaCggJy8vJyArIGZpbGUyX3NlY3Rpb24xICkNCiAgICAgICAgICAgaWYgczE6 DQogICAgICAgICAgICAgICggZGVwb3RQYXRoLCBmaWxlTmFtZSApID0gczEuZ3JvdXBzKCkNCiAg ICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggZGVwb3RQYXRoICsgJywnICsgZmlsZTJfc2Vj dGlvbjEgKyAnLERlbGV0ZWQsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXG4nICApDQoNCiAg ICAgICAgICAgaWYgZGVidWc6DQogICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdEZWxl dGVkISEhIVxuJyApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIFdlIGFyZSBoZXJlIHNv IHdlIGRvbnQgbmVlZCB0byB0ZXN0IGZvciBzZWNvbmQgZmlsZXNwZWMgbWlzc2luZw0KICAgICAg ICAgICAgKCBzZWN0aW9uMSwgc2VjdGlvbjIgKSA9IGV4cDIuc3BsaXQoIGxpbmUgKQ0KICAgICAg ICAgICAgaWYgZGVidWc6DQogICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnc2VjdGlv bjEtPicgKyBzZWN0aW9uMSArICdcbicgKQ0KICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0 ZSggJ3NlY3Rpb24yLT4nICsgc2VjdGlvbjIgKyAnXG4nICkNCiAgICAgICAgICAgIA0KICAgICAg ICAgICAgIyBtYWluIGNvdW50IG9mIGZpbGVzIGluIHNlY29uZCBAbGFiZWwNCiAgICAgICAgICAg IGZpbGVfY291bnQyID0gZmlsZV9jb3VudDIgKyAxDQogICAgICAgICAgICANCiAgICAgICAgICAg ICggZmlsZTJfc2VjdGlvbjEsIGZpbGUyX3NlY3Rpb24yICkgPSBleHAzLnNwbGl0KCBzZWN0aW9u MiApDQogICAgICAgICAgICBpZiBkZWJ1ZzoNCiAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3Jp dGUoICdmaWxlMl9zZWN0aW9uMi0+JyArIGZpbGUyX3NlY3Rpb24yICsgJ1xuJyApDQogICAgICAg ICAgICBpZiBtTWlzc2luZ0ZpcnN0Og0KICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgZmlsZSB0 aGF0IGhhcyBiZWVuIGFkZGVkDQogICAgICAgICAgICAgICAjDQogICAgICAgICAgICAgICBzMSA9 IGV4cEZpbGVOYW1lRmllbGQuc2VhcmNoKCAnLy8nICsgZmlsZTJfc2VjdGlvbjEgKQ0KICAgICAg ICAgICAgICAgaWYgczE6DQogICAgICAgICAgICAgICAgICAoIGRlcG90UGF0aCwgZmlsZU5hbWUg KSA9IHMxLmdyb3VwcygpDQogICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBkZXBv dFBhdGggKyAnLCcgKyBmaWxlTmFtZSArICcsQWRkZWQsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAs MCwwXG4nICApDQogICAgICAgICAgICAgICAoIGZpbGUyX3Jldm51bSwgY29tcGFyZV9zdGF0dXMg KSA9IHJlLnNwbGl0KCAnICcsIGZpbGUyX3NlY3Rpb24yLCAyICkNCiAgICAgICAgICAgICAgIGlm IGRlYnVnOg0KICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ2ZpbGUyIHJldiBu dW1iZXItPicgKyBmaWxlMl9yZXZudW0gKyAnXG5cbicgKQ0KICAgICAgICAgICAgICAgcmV2aXNp b25zX2FkZGVkID0gcmV2aXNpb25zX2FkZGVkICsgaW50KCBmaWxlMl9yZXZudW0gKQkJDQogICAg ICAgICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggJ0FkZGVkLC8vJyArIGZpbGUyX3NlY3Rpb24x ICkNCiAgICAgICAgICAgICAgICNzeXMuc3Rkb3V0LndyaXRlKCAnLCcgKyBgaW50KCBmaWxlMl9y ZXZudW0pYCArICdcbicgKQ0KICAgICAgICAgICAgZWxzZToJCQ0KICAgICAgICAgICAgICAgKCBm aWxlMl9yZXZudW0sIGZpbGUyX3R5cGUsIGRlbGltaXRlciwgY29tcGFyZV9zdGF0dXMgKSA9IHJl LnNwbGl0KCAnICcsIGZpbGUyX3NlY3Rpb24yLCA0ICkNCiAgICAgICAgICAgICAgIGlmIGRlYnVn Og0KICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ2ZpbGUyIHJldiBudW1iZXIt PicgKyBmaWxlMl9yZXZudW0gKyAnXG4nICkNCiAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQu d3JpdGUoICdmaWxlMiB0eXBlLT4nICsgZmlsZTJfdHlwZSArICdcbicgKQ0KICAgICAgICAgICAg ICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ2ZpbGUgY29tcGFyZSBzdGF0dXMtPicgKyBjb21wYXJl X3N0YXR1cyArICdcbicgKQ0KICAgICAgICAgICAgICAgcmV2X251bWJlcjIgPSBpbnQoIGZpbGUy X3Jldm51bSApDQogICAgICAgICAgICAgICB0ZW1wID0gcmV2X251bWJlcjIgLSByZXZfbnVtYmVy MSANCiAgICAgICAgICAgICAgIHJldmlzaW9uc19hZGRlZCA9IHJldmlzaW9uc19hZGRlZCArIHRl bXANCiAgICAgICAgICAgICAgIGlmIHJldl9udW1iZXIxICE9IHJldl9udW1iZXIyOg0KICAgICAg ICAgICAgICAgICAgZmlsZV9saXN0LmFwcGVuZCggJy8vJyArIGZpbGUyX3NlY3Rpb24xICkNCiAg ICAgICAgICAgICAgICAgICNzeXMuc3Rkb3V0LndyaXRlKCAnLy8nICsgZmlsZTJfc2VjdGlvbjEg KyAnXG4nICkNCiAgICAgICAgICAgICAgICAgIGZpbGVzX2NoYW5nZWQgPSBmaWxlc19jaGFuZ2Vk ICsgMQ0KICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgIHMxID0gZXhwRmls ZU5hbWVGaWVsZC5zZWFyY2goICcvLycgKyBmaWxlMl9zZWN0aW9uMSApDQogICAgICAgICAgICAg ICAgICBpZiBzMToNCiAgICAgICAgICAgICAgICAgICAgICggZGVwb3RQYXRoLCBmaWxlTmFtZSAp ID0gczEuZ3JvdXBzKCkNCiAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIGRl cG90UGF0aCArICcsJyArIGZpbGVOYW1lICsgJyxVbmNoYW5nZWQsMCwwLDAsMCwwLDAsMCwwLDAs MCwwLDAsMCwwXG4nICApDQoNCiAgICAgICAgICAgICAgIGlmIGZpbGUxX3R5cGUgIT0gZmlsZTJf dHlwZToNCiAgICAgICAgICAgICAgICAgIGZpbGVzX3R5cGVjaGFuZ2UgPSBmaWxlc190eXBlY2hh bmdlICsgMQ0KICAgICAgICAgICAgICAgDQogIHJldHVybiBmaWxlc19hZGRlZCwgZmlsZXNfZGVs ZXRlZCwgZmlsZXNfdHlwZWNoYW5nZSwgZmlsZXNfY2hhbmdlZCwgcmV2aXNpb25zX2FkZGVkLCBm aWxlX2NvdW50MSwgZmlsZV9jb3VudDIsIGZpbGVfbGlzdA0KICANCiAgDQoNCg0KDQojICANCiMg VGhpcyBzY3JpcHQgdGFrZXMgYSBkZXBvdCBwYXRoIGFuZCB0d28gbGFiZWxzIChsaWtlIEBqYWNr YWxvcGUuMjAgKSANCiMgT1IgdHdvIGRhdGUtdGltZSBjb21ib3MgKGxpa2UgQDE5OTkvMDIvMDIg KQ0KIw0KIyBUaGUgb3V0cHV0IHRoZW4gZ2l2ZXMgeW91IHRoZSBkZXBvdCBwYXRoLCBmaWxlIG5h bWUsIGFjdGlvbiB0eXBlIGFuZCBsaW5lIGNoYW5nZSBjb3VudHMgDQojIG9mIGZpbGVzIGNoYW5n ZWQgZGVsZXRlZCBvciBhZGRlZC4gIFlvdSBjYW4gdGhlbiBmZWVkIHRoZSBvdXRwdXQgdG8gZXhj ZWwgYXMgYSBjb21tYSANCiMgZGVsaW1pdGVkIGRhdGFiYXNlICouY3N2IGFuZCBtYWtlIHByZXR0 eSBjaGFydHMgKGJhcmYpDQojDQoNCg0KIyBNYWluIGJvZHkgb2YgcHJvZ3JhbSANCiMNCiMNCmRl cG90X2xvY2F0aW9uID0gc3lzLmFyZ3ZbMV0gICAgICAgICAgICAgIA0KZGlmZl9sYWJlbDEgPSBz eXMuYXJndlsyXQ0KZGlmZl9sYWJlbDIgPSBzeXMuYXJndlszXQ0KICAgICAgICANCiNzeXMuc3Rk b3V0LndyaXRlKCAnU3RhcnRpbmcgcHJvY2Vzc2luZyB0cmVlIGRhdGEuLi4uXG5cbicgKQ0KDQoj Y2FsbCB0aGUgZGlmZiB3aXRoIHRoZSBSQ1MgZmxhZ3MNCiMNCiMNCmFkZHMgPSBjaGFuZ2VzID0g ZGVsZXRlcyA9IDANCg0KKCBhZGRlZCwgZGVsZXRlZCwgdHlwZWNoYW5nZSwgY2hhbmdlZCwgcmV2 c19hZGRlZCwgY291bnQxLCBjb3VudDIsIGxpc3Rfb2ZfY2hhbmdlZF9maWxlcyApID0gXA0KICAg ICBleHRyYWN0X21ldHJpY3NfY291bnRzX2ZpbGUoIGRlcG90X2xvY2F0aW9uLCBkaWZmX2xhYmVs MSwgZGlmZl9sYWJlbDIgKQ0KDQoNCg0KZm9yIGRpZmZlcmVudF9maWxlIGluIGxpc3Rfb2ZfY2hh bmdlZF9maWxlczoNCiAgICNzeXMuc3Rkb3V0LndyaXRlKCBkaWZmZXJlbnRfZmlsZSAgKyAnXG4n ICkgDQoNCiAgICggcmNzYWRkcywgcmNzZGVsZXRlcykgPSBcDQogICAgICAgICAgICAgIGV4dHJh Y3RfbWV0cmljc19jb3VudHNfcmNzKCBkaWZmZXJlbnRfZmlsZSwgZGlmZl9sYWJlbDEsIGRpZmZf bGFiZWwyICkNCg0KICAgKCBjdHhhZGRzLCBjdHhjaGFuZ2VzLCBjdHhkZWxldGVzKSA9IFwNCiAg ICAgICAgICAgICAgZXh0cmFjdF9tZXRyaWNzX2NvdW50c19jb250ZXh0KCBkaWZmZXJlbnRfZmls ZSwgZGlmZl9sYWJlbDEsIGRpZmZfbGFiZWwyICkNCg0KICAgKCBzdW1hZGRzLCBzdW1hZGRjaHVu a3MsIHN1bWRlbGV0ZXMsIHN1bWRlbGV0ZWNodW5rcywgc3VtY2hhbmdlcywgc3VtY2hhbmdlY2h1 bmtzLCBzdW1leHRyYSApID0gXA0KICAgICAgICAgICAgICBleHRyYWN0X21ldHJpY3NfY291bnRz X3N1bW1hcnkoIGRpZmZlcmVudF9maWxlLCBkaWZmX2xhYmVsMSwgZGlmZl9sYWJlbDIgKQ0KDQog ICAoIHVuaWFkZHMsIHVuaWRlbGV0ZXMpID0gXA0KICAgICAgICAgICAgICBleHRyYWN0X21ldHJp Y3NfY291bnRzX3VuaWZpZWQoIGRpZmZlcmVudF9maWxlLCBkaWZmX2xhYmVsMSwgZGlmZl9sYWJl bDIgKQ0KDQogICBzMSA9IGV4cEZpbGVOYW1lRmllbGQuc2VhcmNoKCBkaWZmZXJlbnRfZmlsZSAp DQogICBpZiBzMToNCiAgICAgICggZGVwb3RQYXRoLCBmaWxlTmFtZSApID0gczEuZ3JvdXBzKCkN CiAgICANCiAgIHN5cy5zdGRvdXQud3JpdGUoIGRlcG90UGF0aCAgICAgICAgICAgKyAnLCcgKw0K ICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgICAgICAgICAgICArICcsJyArDQogICAgICAg ICAgICAgICAgICAgICAnQ2hhbmdlZCcgICAgICAgICAgICsgJywnICsNCiAgICAgICAgICAgICAg ICAgICAgIGByY3NhZGRzYCAgICAgICAgICAgKyAnLCcgKw0KICAgICAgICAgICAgICAgICAgICAg YHJjc2RlbGV0ZXNgICAgICAgICArICcsJyArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgIGBjdHhhZGRzYCAgICAgICAgICAgKyAn LCcgKw0KICAgICAgICAgICAgICAgICAgICAgYGN0eGNoYW5nZXNgICAgICAgICArICcsJyArDQog ICAgICAgICAgICAgICAgICAgICBgY3R4ZGVsZXRlc2AgICAgICAgICsgJywnICsNCiAgICAgICAg ICAgICAgICAgICAgIGBzdW1hZGRzYCAgICAgICAgICAgKyAnLCcgKw0KICAgICAgICAgICAgICAg ICAgICAgYHN1bWFkZGNodW5rc2AgICAgICArICcsJyArDQogICAgICAgICAgICAgICAgICAgICBg c3VtZGVsZXRlc2AgICAgICAgICsgJywnICsNCiAgICAgICAgICAgICAgICAgICAgIGBzdW1kZWxl dGVjaHVua3NgICAgKyAnLCcgKw0KICAgICAgICAgICAgICAgICAgICAgYHN1bWNoYW5nZXNgICAg ICAgICArICcsJyArDQogICAgICAgICAgICAgICAgICAgICBgc3VtY2hhbmdlY2h1bmtzYCAgICsg JywnICsNCiAgICAgICAgICAgICAgICAgICAgIGBzdW1leHRyYWAgICAgICAgICAgKyAnLCcgKw0K ICAgICAgICAgICAgICAgICAgICAgYHVuaWFkZHNgICAgICAgICAgICArICcsJyArDQogICAgICAg ICAgICAgICAgICAgICBgdW5pZGVsZXRlc2AgICAgICAgICsgJ1xuJyApIA0KDQo=
---0__=Kd0d0xGdnOvYiEwaatgReoF8TMFnzafgFRQZcQ5inLA0x2ktv414ftIt Content-type: application/octet-stream; name="filemetrics.py" Content-Disposition: attachment; filename="filemetrics.py" Content-transfer-encoding: base64
IyMNCiMjICBXcml0dGVuIGJ5IFNjb3R0IFBhc25pa293c2tpIGFyb3VuZCB0aGUgdGltZSBvZiA0 LzIyLzk5DQojIyAgQHN5bWFudGVjIGNvcnAuICAgSG9tZSBvZiB0aGUgTm9ydG9uIHV0aWxpdGll cw0KIyMNCiMjICBVbmRlciBkdXJlc3Mgb2YgcGVza3kgUUEgcGVvcGxlLi4uDQojIw0KIyMgIFRo aXMgY29tZXMgd2l0aCBubyBndWFyYW50ZWUgd2hhdHNvZXZlci4uLiBvbiBhbnkgbGV2ZWwuDQoj Iw0KIyMgIENvbnNpZGVyIHRoaXMgdG8gYmUgdW5kZXIgdGhlIGxpbnV4IHR5cGUgbGlzY2Vuc2Ug dGhpbmd5DQojIyAgKCBEb24ndCByZWNhbGwgd2hhdCBpdHMgY2FsbGVkIEdOVSBvciBjb3B5bGVm dCBvciB3aGF0ZXZlciApIA0KIyMgIGFuZCBpZiBhbnlvbmUgY29tcGxhaW5zIG15IG1hbmFnZXIg ZHUgam91ciBzYWlkIEkgY291bGQgZ2l2ZSBpdCBhd2F5Lg0KIyMgICggaGUgcmVhbGx5IGRpZCAp DQojIw0KDQojIS91c3IvbG9jYWwvYmluL3B5dGhvbg0KIw0KaW1wb3J0IHN5cywgb3MsIHN0cmlu ZywgcmUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIyBUaGlzIGZ1bmMgY29ycmVz cG9uZHMgdG8gcDQgZGlmZjIgd2l0aCB0aGUgLWRuIHN3aXRjaCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgIA0KZGVmIGV4dHJhY3RfbWV0cmljc19jb3VudHNfcmNzKCBkZXBvdF9yb290LCBsYWJlbF9v bmUsIGxhYmVsX3R3byApOg0KCSMgRG9lcyBhIHA0IGNoYW5nZXMgZGVwb3Rfcm9vdEBsYWJlbF9v bmUgZGVwb3Rfcm9vdEBsYWJlbF90d28NCiAgICAjIGRlcG90X3Jvb3QgaXMgdXNlZCB0byBsaW1p dCB0aGUgZGlmZiByYW5nZSB0byBhIHNpbmdsZSAicHJvamVjdCINCiAgICAjIG9yIHNvbWV0aGlu ZyBldmVuIHNtYWxsZXIuLiBsaWtlIGEgc2luZ2xlIGZpbGUNCiAgICAjIHdlIHRoZW4gcGFyc2Ug dGhlIG91dHB1dCBhbmQgYWRkIHVwIHRoZSB0b3RhbHMNCg0KICAjIHF1b3RlIHRoZSAyIHBhcmFt cyBmb3IgdGhlIGNhc2VzIHdoZXJlIHRoZSBkZXBvdCBwYXRoIGNvbnRhaW5zIGEgc3BhY2UNCiAg Y29tbWFuZCA9ICdwNCBkaWZmMiAtZG4gXCInICsgZGVwb3Rfcm9vdCArIGxhYmVsX29uZSArICdc IiBcIicgKyBkZXBvdF9yb290ICsgbGFiZWxfdHdvICsgJ1wiJyAgDQogIGxpbmVzX2FkZGVkID0g MA0KICBsaW5lc19jaGFuZ2VkID0gMA0KICBsaW5lc19kZWxldGVkID0gMA0KICANCiAgI3N5cy5z dGRvdXQud3JpdGUoJ0V4dHJhY3Rpb24gZnVuY3Rpb24gdXNpbmcgJyArIGNvbW1hbmQgKycgIFxu JyApDQoNCiAgIyBicmVhayB0aGUgbGluZSB1cCBhY2NvcmRpbmcgdG8uLi4NCiAgIyBzYW1wbGUg bGluZTogYTg1IDINCiAgIyAgICAgICAgICAgICAgb3BlcmF0aW9uIChsaW5lKWxvY2F0aW9uIChO dW1iZXIgb2YgbGluZXMgYWZmZWN0ZWQpY291bnQgDQogIHAgPSByZS5jb21waWxlKCByJ14oW2Fk XSkoWzAtOV0rKSAoXGQrKScgKQ0KICANCiAgZm9yIGxpbmUgaW4gb3MucG9wZW4oIGNvbW1hbmQs J3InKS5yZWFkbGluZXMoKToNCiAgICB0bXAgPSBsaW5lWzA6MV0gIA0KICAgIGlmIHRtcCA9PSAn YScgb3IgdG1wID09ICdkJzoNCiAgICAgICAgICAjIG9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlIGEg bWF0Y2ggb3RoZXJ3aXNlIGdyb3VwcygpIHdpbGwgYmxvdyBjaHVua3MgZGlmZmluZyBhbiBydGYN CiAgICAgICAgICBtID0gcC5tYXRjaCggbGluZSApDQogICAgICAgICAgaWYgbToNCiAgICAgICAg ICAgIChvcGVyYXRpb24sIGxvY2F0aW9uLCBjb3VudCkgPSByZS5tYXRjaCggcideKFthZF0pKFsw LTldKykgKFxkKyknLCBsaW5lKS5ncm91cHMoKQ0KICAgICAgICAgICAgI3N5cy5zdGRvdXQud3Jp dGUoICc+JyArIG9wZXJhdGlvbiArICc8ICAgID4nICsgbG9jYXRpb24gKyAnPCAgID4nICsgY291 bnQgKyAnPFxuJyApDQogICAgICAgICAgICBpZiB0bXAgPT0gJ2EnOg0KICAgICAgICAgICAgICAg bGluZXNfYWRkZWQgPSBsaW5lc19hZGRlZCArIGludCggY291bnQgKQ0KICAgICAgICAgICAgZWxp ZiB0bXAgPT0gJ2QnOiAgIA0KICAgICAgICAgICAgICAgbGluZXNfZGVsZXRlZCA9IGxpbmVzX2Rl bGV0ZWQgKyBpbnQoIGNvdW50ICkNCiAgICAgICAgICAgICAgICAgICAgICANCiAgcmV0dXJuIGxp bmVzX2FkZGVkLCBsaW5lc19kZWxldGVkDQoNCiAgDQojIFRoaXMgZnVuYyBjb3JyZXNwb25kcyB0 byBwNCBkaWZmMiB3aXRoIHRoZSAtZGMgc3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICANCiAgDQpkZWYgZXh0cmFjdF9tZXRyaWNzX2NvdW50c19j b250ZXh0KCBkZXBvdF9yb290LCBsYWJlbF9vbmUsIGxhYmVsX3R3byApOg0KCSMgRG9lcyBhIHA0 IGNoYW5nZXMgZGVwb3Rfcm9vdEBsYWJlbF9vbmUgZGVwb3Rfcm9vdEBsYWJlbF90d28NCiAgICAj IGRlcG90X3Jvb3QgaXMgdXNlZCB0byBsaW1pdCB0aGUgZGlmZiByYW5nZSB0byBhIHNpbmdsZSAi cHJvamVjdCINCiAgICAjIG9yIHNvbWV0aGluZyBldmVuIHNtYWxsZXIuLiBsaWtlIGEgc2luZ2xl IGZpbGUNCiAgICAjIHdlIHRoZW4gcGFyc2UgdGhlIG91dHB1dCBhbmQgYWRkIHVwIHRoZSB0b3Rh bHMNCg0KICAjIHF1b3RlIHRoZSAyIHBhcmFtcyBmb3IgdGhlIGNhc2VzIHdoZXJlIHRoZSBkZXBv dCBwYXRoIGNvbnRhaW5zIGEgc3BhY2UNCiAgY29tbWFuZCA9ICdwNCBkaWZmMiAtZGMgXCInICsg ZGVwb3Rfcm9vdCArIGxhYmVsX29uZSArICdcIiBcIicgKyBkZXBvdF9yb290ICsgbGFiZWxfdHdv ICsgJ1wiJyAgDQogIGxpbmVzX2FkZGVkID0gMA0KICBsaW5lc19jaGFuZ2VkID0gMA0KICBsaW5l c19kZWxldGVkID0gMA0KICANCiAgI3N5cy5zdGRvdXQud3JpdGUoJ0V4dHJhY3Rpb24gZnVuY3Rp b24gdXNpbmcgJyArIGNvbW1hbmQgKycgIFxuJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3Bl biggY29tbWFuZCwncicpLnJlYWRsaW5lcygpOg0KICAgICMgc2FtcGxlIGxpbmU6IENoYW5nZSBu dW1iZXIgb24gZGF0ZSBieSBuYW1lQG1hY2hpbmUgJ2NvbW1lbnQnDQogICAgIyAgICAgICAgICAg ICAgZHVtbXkgIGNoIyAgIA0KICAgICNzeXMuc3Rkb3V0LndyaXRlKCBsaW5lICsgJ1xuJyApDQog ICAgdG1wID0gbGluZVswOjFdICANCiAgICBpZiB0bXAgPT0gJysnOg0KICAgICAgIGxpbmVzX2Fk ZGVkID0gbGluZXNfYWRkZWQgKyAxDQogICAgZWxpZiB0bXAgPT0gJy0nOg0KICAgICAgIGxpbmVz X2RlbGV0ZWQgPSBsaW5lc19kZWxldGVkICsgMQ0KICAgIGVsaWYgdG1wID09ICchJzoNCiAgICAg ICBsaW5lc19jaGFuZ2VkID0gbGluZXNfY2hhbmdlZCArMQ0KDQogIHJldHVybiBsaW5lc19hZGRl ZCxsaW5lc19jaGFuZ2VkLGxpbmVzX2RlbGV0ZWQNCiAgDQogIA0KZGVmIGV4dHJhY3RfbWV0cmlj c19jb3VudHNfc3VtbWFyeSggZGVwb3Rfcm9vdCwgbGFiZWxfb25lLCBsYWJlbF90d28gKToNCgkj IERvZXMgYSBwNCBjaGFuZ2VzIGRlcG90X3Jvb3RAbGFiZWxfb25lIGRlcG90X3Jvb3RAbGFiZWxf dHdvDQogICAgIyBkZXBvdF9yb290IGlzIHVzZWQgdG8gbGltaXQgdGhlIGRpZmYgcmFuZ2UgdG8g YSBzaW5nbGUgInByb2plY3QiDQogICAgIyBvciBzb21ldGhpbmcgZXZlbiBzbWFsbGVyLi4gbGlr ZSBhIHNpbmdsZSBmaWxlDQogICAgIyB3ZSB0aGVuIHBhcnNlIHRoZSBvdXRwdXQgYW5kIGFkZCB1 cCB0aGUgdG90YWxzDQoNCiAgIyBxdW90ZSB0aGUgMiBwYXJhbXMgZm9yIHRoZSBjYXNlcyB3aGVy ZSB0aGUgZGVwb3QgcGF0aCBjb250YWlucyBhIHNwYWNlDQogIGNvbW1hbmQgPSAncDQgZGlmZjIg LWRzIFwiJyArIGRlcG90X3Jvb3QgKyBsYWJlbF9vbmUgKyAnXCIgXCInICsgZGVwb3Rfcm9vdCAr IGxhYmVsX3R3byArICdcIicgIA0KICBsaW5lc19hZGRlZCA9IDANCiAgYWRkX2NodW5rcyA9IDAN CiAgbGluZXNfZGVsZXRlZCA9IDANCiAgZGVsZXRlX2NodW5rcyA9IDANCg0KICBsaW5lc19jaGFu Z2VkID0gMA0KICBjaGFuZ2VfY2h1bmtzID0gMA0KICBleHRyYV9kYXRhID0gMCAgDQoNCiAgI3N5 cy5zdGRvdXQud3JpdGUoJ0V4dHJhY3Rpb24gZnVuY3Rpb24gdXNpbmcgJyArIGNvbW1hbmQgKycg IFxuJyApDQoNCiAgIyBUaGlzIHdpbGwgbWF0Y2ggbGluZXMgc3RhcnRpbmcgd2l0aCANCiAgZXhw MSA9IHJlLmNvbXBpbGUoIHInXlsiYWRkIiJkZWxldGVkIiJjaGFuZ2VkXSInICkNCiAgIw0KICAj IFRoZSBuZXh0IDMgZWF0IHRoZSBhZGQgZGVsZXRlZCBhbmQgY2hhbmdlZCBsaW5lcw0KICAjICBp dCBjb3VsZCBiZSBvbmUgZXhwcmVzc2lvbiBJIHN1cHBvc2UNCiAgIw0KICBleHAyID0gcmUuY29t cGlsZSggcideKGFkZCkgKFxkKykgKGNodW5rcykgKFxkKyknICkNCiAgZXhwMyA9IHJlLmNvbXBp bGUoIHInXihkZWxldGVkKSAoXGQrKSAoY2h1bmtzKSAoXGQrKScgKQ0KICBleHA0ID0gcmUuY29t cGlsZSggcideKGNoYW5nZWQpIChcZCspIChjaHVua3MpIChcZCspIC8gKFxkKyknICkNCiAgDQog IGZvciBsaW5lIGluIG9zLnBvcGVuKCBjb21tYW5kLCdyJykucmVhZGxpbmVzKCk6DQogICAgICMg b25seSBkbyB0aGlzIGlmIHdlIGhhdmUgYSBtYXRjaA0KICAgICBtMiA9IGV4cDIuc2VhcmNoKCBs aW5lICkNCiAgICAgbTMgPSBleHAzLnNlYXJjaCggbGluZSApDQogICAgIG00ID0gZXhwNC5zZWFy Y2goIGxpbmUgKQ0KICAgICANCiAgICAgaWYgbTI6DQogICAgICAgICAoIG9wZXJhdGlvbiwgY291 bnQxLCBjaHVua3MsIGNvdW50MiApID0gbTIuZ3JvdXBzKCkNCiAgICAgICAgIGFkZF9jaHVua3Mg PSBhZGRfY2h1bmtzICsgaW50KCBjb3VudDEgKQ0KICAgICAgICAgbGluZXNfYWRkZWQgPSBsaW5l c19hZGRlZCArIGludCggY291bnQyICkNCiAgICAgICAgICNzeXMuc3Rkb3V0LndyaXRlKCBjb3Vu dDIgKyAnXG4nICkNCiAgICAgICAgDQogICAgIGVsaWYgbTM6DQogICAgICAgICAoIG9wZXJhdGlv biwgY291bnQxLCBjaHVua3MsIGNvdW50MiApID0gbTMuZ3JvdXBzKCkNCiAgICAgICAgIGRlbGV0 ZV9jaHVua3MgPSBkZWxldGVfY2h1bmtzICsgaW50KCBjb3VudDEgKQ0KICAgICAgICAgbGluZXNf ZGVsZXRlZCA9IGxpbmVzX2RlbGV0ZWQgKyBpbnQoIGNvdW50MiApDQogICAgICAgICAjc3lzLnN0 ZG91dC53cml0ZSggY291bnQyICsgJ1xuJyApDQogICAgICAgIA0KICAgICBlbGlmIG00Og0KICAg ICAgICAgKCBvcGVyYXRpb24sIGNvdW50MSwgY2h1bmtzLCBjb3VudDIsIGNvdW50MyApID0gbTQu Z3JvdXBzKCkNCiAgICAgICAgIGNoYW5nZV9jaHVua3MgPSBjaGFuZ2VfY2h1bmtzICsgaW50KCBj b3VudDEgKQ0KICAgICAgICAgZXh0cmFfZGF0YSA9IGV4dHJhX2RhdGEgKyBpbnQoIGNvdW50MiAp DQogICAgICAgICBsaW5lc19jaGFuZ2VkID0gbGluZXNfY2hhbmdlZCArIGludCggY291bnQzICkN CiAgICAgICAgICNzeXMuc3Rkb3V0LndyaXRlKCBjb3VudDMgKyAnXG4nICkNCiAgICAgICAgICAg ICAgICAgICAgICANCiAgcmV0dXJuIGxpbmVzX2FkZGVkLGFkZF9jaHVua3MsbGluZXNfZGVsZXRl ZCxkZWxldGVfY2h1bmtzLGxpbmVzX2NoYW5nZWQsY2hhbmdlX2NodW5rcywgZXh0cmFfZGF0YQ0K ICANCiAgDQojIFRoaXMgZnVuYyBjb3JyZXNwb25kcyB0byBwNCBkaWZmMiB3aXRoIHRoZSAtZHUg c3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAN CiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZGVm IGV4dHJhY3RfbWV0cmljc19jb3VudHNfdW5pZmllZCggZGVwb3Rfcm9vdCwgbGFiZWxfb25lLCBs YWJlbF90d28gKToNCgkjIERvZXMgYSBwNCBjaGFuZ2VzIGRlcG90X3Jvb3RAbGFiZWxfb25lIGRl cG90X3Jvb3RAbGFiZWxfdHdvDQogICAgIyBkZXBvdF9yb290IGlzIHVzZWQgdG8gbGltaXQgdGhl IGRpZmYgcmFuZ2UgdG8gYSBzaW5nbGUgInByb2plY3QiDQogICAgIyBvciBzb21ldGhpbmcgZXZl biBzbWFsbGVyLi4gbGlrZSBhIHNpbmdsZSBmaWxlDQogICAgIyB3ZSB0aGVuIHBhcnNlIHRoZSBv dXRwdXQgYW5kIGFkZCB1cCB0aGUgdG90YWxzDQoNCiAgIyBxdW90ZSB0aGUgMiBwYXJhbXMgZm9y IHRoZSBjYXNlcyB3aGVyZSB0aGUgZGVwb3QgcGF0aCBjb250YWlucyBhIHNwYWNlDQogIGNvbW1h bmQgPSAncDQgZGlmZjIgLWR1IFwiJyArIGRlcG90X3Jvb3QgKyBsYWJlbF9vbmUgKyAnXCIgXCIn ICsgZGVwb3Rfcm9vdCArIGxhYmVsX3R3byArICdcIicgIA0KICBsaW5lc19hZGRlZCA9IDANCiAg bGluZXNfZGVsZXRlZCA9IDANCiAgDQogICNzeXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1 bmN0aW9uIHVzaW5nICcgKyBjb21tYW5kICsnICBcbicgKQ0KICANCiAgZm9yIGxpbmUgaW4gb3Mu cG9wZW4oIGNvbW1hbmQsJ3InKS5yZWFkbGluZXMoKToNCiAgICAjIHNhbXBsZSBsaW5lOiBDaGFu Z2UgbnVtYmVyIG9uIGRhdGUgYnkgbmFtZUBtYWNoaW5lICdjb21tZW50Jw0KICAgICMgICAgICAg ICAgICAgIGR1bW15ICBjaCMgICANCiAgICAjc3lzLnN0ZG91dC53cml0ZSggbGluZSArICdcbicg KQ0KICAgIHRtcCA9IGxpbmVbMDoxXSAgDQogICAgaWYgdG1wID09ICcrJzoNCiAgICAgICBsaW5l c19hZGRlZCA9IGxpbmVzX2FkZGVkICsgMQ0KICAgIGVsaWYgdG1wID09ICctJzoNCiAgICAgICBs aW5lc19kZWxldGVkID0gbGluZXNfZGVsZXRlZCArIDENCg0KICByZXR1cm4gbGluZXNfYWRkZWQs IGxpbmVzX2RlbGV0ZWQNCiAgDQojIFRoaXMgZnVuYyBjb3JyZXNwb25kcyB0byBwNCBkaWZmMiB3 aXRoIG5vIHN3aXRjaHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIA0KDQpkZWYgZXh0cmFjdF9tZXRyaWNzX2NvdW50c19mbGF0KCBkZXBvdF9yb290LCBs YWJlbF9vbmUsIGxhYmVsX3R3byApOg0KCSMgRG9lcyBhIHA0IGNoYW5nZXMgZGVwb3Rfcm9vdEBs YWJlbF9vbmUgZGVwb3Rfcm9vdEBsYWJlbF90d28NCiAgICAjIGRlcG90X3Jvb3QgaXMgdXNlZCB0 byBsaW1pdCB0aGUgZGlmZiByYW5nZSB0byBhIHNpbmdsZSAicHJvamVjdCINCiAgICAjIG9yIHNv bWV0aGluZyBldmVuIHNtYWxsZXIuLiBsaWtlIGEgc2luZ2xlIGZpbGUNCiAgICAjIHdlIHRoZW4g cGFyc2UgdGhlIG91dHB1dCBhbmQgYWRkIHVwIHRoZSB0b3RhbHMNCg0KICAjIHF1b3RlIHRoZSAy IHBhcmFtcyBmb3IgdGhlIGNhc2VzIHdoZXJlIHRoZSBkZXBvdCBwYXRoIGNvbnRhaW5zIGEgc3Bh Y2UNCiAgY29tbWFuZCA9ICdwNCBkaWZmMiBcIicgKyBkZXBvdF9yb290ICsgbGFiZWxfb25lICsg J1wiIFwiJyArIGRlcG90X3Jvb3QgKyBsYWJlbF90d28gKyAnXCInICANCiAgbGluZXNfYWRkZWQg PSAwDQogIGxpbmVzX2RlbGV0ZWQgPSAwDQogIGxpbmVzX2NoYW5nZWQgPSAwDQogIA0KICAjc3lz LnN0ZG91dC53cml0ZSgnRXh0cmFjdGlvbiBmdW5jdGlvbiB1c2luZyAnICsgY29tbWFuZCArJyAg XG4nICkNCg0KICBleHBGaWxlID0gcmUuY29tcGlsZSggcidePT09PScgKQ0KICAjIFRoZSBuZXh0 IDQgZWF0IHRoZSBhZGQgZGVsZXRlZCBhbmQgY2hhbmdlZCBsaW5lcw0KICAjIGl0IGNvdWxkIGJl IG9uZSBleHByZXNzaW9uIEkgc3VwcG9zZQ0KICAjDQogIGV4cDEgPSByZS5jb21waWxlKCByJ14o XGQrKShbYWNkXSkoXGQrKScgKQ0KICBleHAyID0gcmUuY29tcGlsZSggcideKFxkKyksKFxkKyko W2FjZF0pKFxkKyknICkNCiAgZXhwMyA9IHJlLmNvbXBpbGUoIHInXihcZCspKFthY2RdKShcZCsp LChcZCspJyApDQogIGV4cDQgPSByZS5jb21waWxlKCByJ14oXGQrKSwoXGQrKShbYWNkXSkoXGQr KSwoXGQrKScgKQ0KICANCiAgDQogIGZvciBsaW5lIGluIG9zLnBvcGVuKCBjb21tYW5kLCdyJyku cmVhZGxpbmVzKCk6DQogICAgICMgb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgYSBtYXRjaA0KICAg ICBtMSA9IGV4cDEuc2VhcmNoKCBsaW5lICkNCiAgICAgbTIgPSBleHAyLnNlYXJjaCggbGluZSAp DQogICAgIG0zID0gZXhwMy5zZWFyY2goIGxpbmUgKQ0KICAgICBtNCA9IGV4cDQuc2VhcmNoKCBs aW5lICkNCg0KICAgICBpZiBtNDoNCiAgICAgICAgICggY291bnQxLCBjb3VudDIsIG9wZXJhdGlv biwgY291bnQzLCBjb3VudDQgKSA9IG00Lmdyb3VwcygpDQogICAgICAgICBtTGluZSA9IGV4cEZp bGUubWF0Y2goIHByZXZfbGluZSApDQogICAgICAgICBpZiBtTGluZToNCiAgICAgICAgICAgIHN5 cy5zdGRvdXQud3JpdGUoIHByZXZfbGluZSArICdcbicgKQ0KICAgICAgICAgICAgDQogICAgICAg ICBzeXMuc3Rkb3V0LndyaXRlKCBjb3VudDEgKyAnICcgKyBjb3VudDIgKyAnICcgKyBvcGVyYXRp b24gKyAnICcgKyBjb3VudDMgKyAnICcgKyBjb3VudDQgKyAnXG4nICkNCg0KICAgICBlbGlmIG0z Og0KICAgICAgICAgKCBjb3VudDEsIG9wZXJhdGlvbiwgY291bnQyLCBjb3VudDMgKT0gbTMuZ3Jv dXBzKCkNCiAgICAgICAgIG1MaW5lID0gZXhwRmlsZS5tYXRjaCggcHJldl9saW5lICkNCiAgICAg ICAgIGlmIG1MaW5lOg0KICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggcHJldl9saW5lICsg J1xuJyApDQogICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBjb3VudDEgKyAnICcgKyBvcGVyYXRp b24gKyAnICcgKyBjb3VudDIgKyAnICcgKyBjb3VudDMgKyAnXG4nICkNCiANCiAgICAgZWxpZiBt MjoNCiAgICAgICAgICggY291bnQxLCBjb3VudDIsIG9wZXJhdGlvbiwgY291bnQzICkgPSBtMi5n cm91cHMoKQ0KICAgICAgICAgbUxpbmUgPSBleHBGaWxlLm1hdGNoKCBwcmV2X2xpbmUgKQ0KICAg ICAgICAgaWYgbUxpbmU6DQogICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBwcmV2X2xpbmUg KyAnXG4nICkNCg0KICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggY291bnQxICsgJyAnICsgY291 bnQyICsgJyAnICsgb3BlcmF0aW9uICsgJyAnICsgY291bnQzICsgJ1xuJyApDQoNCiAgICAgZWxp ZiBtMToNCiAgICAgICAgICggY291bnQxLCBvcGVyYXRpb24sIGNvdW50MiApID0gbTEuZ3JvdXBz KCkNCiAgICAgICAgIG1MaW5lID0gZXhwRmlsZS5tYXRjaCggcHJldl9saW5lICkNCiAgICAgICAg IGlmIG1MaW5lOg0KICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggcHJldl9saW5lICsgJ1xu JyApDQoNCiAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIGNvdW50MSArICcgJyArIG9wZXJhdGlv biArICcgJyArIGNvdW50MiArICdcbicgKQ0KDQogICAgIHByZXZfbGluZSA9IGxpbmUgICAgDQog ICAgICAgICAgICAgICAgICAgICAgDQogIHJldHVybiBsaW5lc19hZGRlZCwgbGluZXNfZGVsZXRl ZCwgbGluZXNfY2hhbmdlZA0KICANCiAgDQojICANCiMgVGhpcyBzY3JpcHQgdGFrZXMgYSBkZXBv dCBwYXRoIGFuZCB0d28gbGFiZWxzIChsaWtlIEBqYWtjYWxvcGUuMjAgKSANCiMgT1IgdHdvIGRh dGUtdGltZSBjb21ib3MgKGxpa2UgQDE5OTkvMDIvMDIgKQ0KIw0KIyBUaGUgb3V0cHV0IHRoZW4g Z2l2ZXMgeW91IHRoZSBjb3VudHMgb2YgbGluZXMgY2hhbmdlZCBkZWxldGVkIG9yIGFkZGVkDQoj IGJ5IGVhY2ggb2YgdGhlIHZhcmlvdXMgInA0IGRpZmYyIC1kPyIgZm9ybWF0cy4gKG1ldHJpY3Mp DQojDQojDQoNCg0KDQojIE1haW4gYm9keSBvZiBwcm9ncmFtIA0KIw0KIw0KZGVwb3RfbG9jYXRp b24gPSBzeXMuYXJndlsxXSAgICAgICAgICAgICAgDQpkaWZmX2xhYmVsMSA9IHN5cy5hcmd2WzJd DQpkaWZmX2xhYmVsMiA9IHN5cy5hcmd2WzNdDQogICAgICAgIA0KDQpzeXMuc3Rkb3V0LndyaXRl KCAnU3RhcnRpbmcgcHJvY2Vzc2luZy4uLi5cblxuJyApDQoNCiMgZnlpDQpzeXMuc3Rkb3V0Lndy aXRlKCdTdGFydCBwb2ludCAgJyArIGRpZmZfbGFiZWwxICsgJyAgRW5kIFBvaW50ICAnICsgZGlm Zl9sYWJlbDIgKyAnXG4nICkNCnN5cy5zdGRvdXQud3JpdGUoJ0RlcG90IFJhbmdlICcgKyBkZXBv dF9sb2NhdGlvbiArICdcblxuJyApDQoNCiNjYWxsIHRoZSBkaWZmIHdpdGggdGhlIFJDUyBmbGFn cw0KIw0KIw0KYWRkcyA9IGNoYW5nZXMgPSBkZWxldGVzID0gMA0KDQooIGFkZHMsIGRlbGV0ZXMp ID0gZXh0cmFjdF9tZXRyaWNzX2NvdW50c19yY3MoIGRlcG90X2xvY2F0aW9uLCBkaWZmX2xhYmVs MSwgZGlmZl9sYWJlbDIgKQ0Kc3lzLnN0ZG91dC53cml0ZSggJ01ldHJpY3MgdmlhIFJDUyBkaWZm IG1ldGhvZCAgICAgIExpbmVzIEFkZGVkICAtLT4gJyArIGBhZGRzYCArICdcbicgKQ0Kc3lzLnN0 ZG91dC53cml0ZSggJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVzIERlbGV0 ZWQtLT4gJyArIGBkZWxldGVzYCArICdcblxuJyApDQoNCiNjYWxsIHRoZSBkaWZmIHdpdGggdGhl IGNvbnRleHQgZmxhZ3MNCiMNCiMNCmFkZHMgPSBjaGFuZ2VzID0gZGVsZXRlcyA9IDANCg0KKCBh ZGRzLCBjaGFuZ2VzLCBkZWxldGVzKSA9IGV4dHJhY3RfbWV0cmljc19jb3VudHNfY29udGV4dCgg ZGVwb3RfbG9jYXRpb24sIGRpZmZfbGFiZWwxLCBkaWZmX2xhYmVsMiApDQpzeXMuc3Rkb3V0Lndy aXRlKCAnTWV0cmljcyB2aWEgQ29udGV4dCBkaWZmIG1ldGhvZCAgTGluZXMgQWRkZWQgIC0tPiAn ICsgYGFkZHNgICsgJ1xuJyApDQpzeXMuc3Rkb3V0LndyaXRlKCAnICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgTGluZXMgQ2hhbmdlZC0tPiAnICsgYGNoYW5nZXNgICsgJ1xuJyApDQpz eXMuc3Rkb3V0LndyaXRlKCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZXMg RGVsZXRlZC0tPiAnICsgYGRlbGV0ZXNgICsgJ1xuXG4nICkNCg0KDQojY2FsbCB0aGUgZGlmZiB3 aXRoIHRoZSBzdW1tYXJ5IGZsYWdzDQojDQojDQphZGRzID0gY2hhbmdlcyA9IGRlbGV0ZXMgPSAw DQoNCiggYWRkcywgYWRkY2h1bmtzLCBkZWxldGVzLCBkZWxldGVjaHVua3MsIGNoYW5nZXMsIGNo YW5nZWNodW5rcywgZXh0cmEgKSA9IGV4dHJhY3RfbWV0cmljc19jb3VudHNfc3VtbWFyeSggZGVw b3RfbG9jYXRpb24sIGRpZmZfbGFiZWwxLCBkaWZmX2xhYmVsMiApDQpzeXMuc3Rkb3V0LndyaXRl KCAnTWV0cmljcyB2aWEgU3VtbWFyeSBkaWZmIG1ldGhvZCAgQWRkICAgIC0tPiAnICsgYGFkZGNo dW5rc2AgKyAnIENodW5rc1xuJyApDQpzeXMuc3Rkb3V0LndyaXRlKCAnICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICsgYGFkZHNgICsgJyBMaW5lc1xuJyApDQpz eXMuc3Rkb3V0LndyaXRlKCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRl ZC0tPiAnICsgYGRlbGV0ZWNodW5rc2AgKyAnIENodW5rc1xuJyApDQpzeXMuc3Rkb3V0LndyaXRl KCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICsgYGRlbGV0 ZWNodW5rc2AgKyAnIExpbmVzXG4nICkNCnN5cy5zdGRvdXQud3JpdGUoICcgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkLS0+ICcgKyBgY2hhbmdlY2h1bmtzYCArICcgQ2h1 bmtzXG4nICkNCnN5cy5zdGRvdXQud3JpdGUoICcgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICcgKyBgY2hhbmdlc2AgKyAnIC8gJyArIGBleHRyYWAgKyAnIExpbmVz XG5cbicgKQ0KDQoNCiNjYWxsIHRoZSBkaWZmIHdpdGggdGhlIHVuaWZpZWQgZmxhZ3MNCiMNCiMN CmFkZHMgPSBjaGFuZ2VzID0gZGVsZXRlcyA9IDANCg0KKCBhZGRzLCBkZWxldGVzKSA9IGV4dHJh Y3RfbWV0cmljc19jb3VudHNfdW5pZmllZCggZGVwb3RfbG9jYXRpb24sIGRpZmZfbGFiZWwxLCBk aWZmX2xhYmVsMiApDQpzeXMuc3Rkb3V0LndyaXRlKCAnTWV0cmljcyB2aWEgVW5pZmllZCBkaWZm IG1ldGhvZCAgTGluZXMgQWRkZWQgIC0tPiAnICsgYGFkZHNgICsgJ1xuJyApDQpzeXMuc3Rkb3V0 LndyaXRlKCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZXMgRGVsZXRlZC0t PiAnICsgYGRlbGV0ZXNgICsgJ1xuXG4nICkNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgDQo=
---0__=Kd0d0xGdnOvYiEwaatgReoF8TMFnzafgFRQZcQ5inLA0x2ktv414ftIt Content-type: application/octet-stream; name="treemetrics.py" Content-Disposition: attachment; filename="treemetrics.py" Content-transfer-encoding: base64
IyMNCiMjICBXcml0dGVuIGJ5IFNjb3R0IFBhc25pa293c2tpIGFyb3VuZCB0aGUgdGltZSBvZiA0 LzIyLzk5DQojIyAgQHN5bWFudGVjIGNvcnAuICAgSG9tZSBvZiB0aGUgTm9ydG9uIHV0aWxpdGll cw0KIyMNCiMjICBVbmRlciBkdXJlc3Mgb2YgcGVza3kgUUEgcGVvcGxlLi4uDQojIw0KIyMgIFRo aXMgY29tZXMgd2l0aCBubyBndWFyYW50ZWUgd2hhdHNvZXZlci4uLiBvbiBhbnkgbGV2ZWwuDQoj Iw0KIyMgIENvbnNpZGVyIHRoaXMgdG8gYmUgdW5kZXIgdGhlIGxpbnV4IHR5cGUgbGlzY2Vuc2Ug dGhpbmd5DQojIyAgKCBEb24ndCByZWNhbGwgd2hhdCBpdHMgY2FsbGVkIEdOVSBvciBjb3B5bGVm dCBvciB3aGF0ZXZlciApIA0KIyMgIGFuZCBpZiBhbnlvbmUgY29tcGxhaW5zIG15IG1hbmFnZXIg ZHUgam91ciBzYWlkIEkgY291bGQgZ2l2ZSBpdCBhd2F5Lg0KIyMgICggaGUgcmVhbGx5IGRpZCAp DQojIw0KDQojIS91c3IvbG9jYWwvYmluL3B5dGhvbg0KIw0KaW1wb3J0IHN5cywgb3MsIHN0cmlu ZywgcmUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZGVmIGV4dHJhY3RfbWV0cmlj c19jb3VudHNfZmlsZSggZGVwb3Rfcm9vdCwgbGFiZWxfb25lLCBsYWJlbF90d28gKToNCgkjIERv ZXMgYSBwNCBjaGFuZ2VzIGRlcG90X3Jvb3RAbGFiZWxfb25lIGRlcG90X3Jvb3RAbGFiZWxfdHdv DQogICAgIyBkZXBvdF9yb290IGlzIHVzZWQgdG8gbGltaXQgdGhlIGRpZmYgcmFuZ2UgdG8gYSBz aW5nbGUgInByb2plY3QiDQogICAgIyBvciBzb21lIHN1YnNldCBldmVuIHNtYWxsZXIuLiAgIA0K ICAgICMgd2UgdGhlbiBwYXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQgdXAgdGhlIHRvdGFscw0KDQog IGNvbW1hbmQgPSAncDQgZGlmZjIgJyArIGRlcG90X3Jvb3QgKyBsYWJlbF9vbmUgKyAnICcgKyBk ZXBvdF9yb290ICsgbGFiZWxfdHdvICANCiAgIA0KICBkZWJ1ZyA9IDANCiAgDQogIGZpbGVzX2Fk ZGVkID0gMA0KICBmaWxlc19kZWxldGVkID0gMA0KICBmaWxlc190eXBlY2hhbmdlID0gMA0KICBm aWxlc19jaGFuZ2VkID0gMA0KICByZXZpc2lvbnNfYWRkZWQgPSAwDQoNCiAgZmlsZV9jb3VudDEg PSAwDQogIGZpbGVfY291bnQyID0gMA0KICANCiAgIyBmeWkNCiAgc3lzLnN0ZG91dC53cml0ZSgn U3RhcnQgcG9pbnQgICcgKyBsYWJlbF9vbmUgKyAnICBFbmQgUG9pbnQgICcgKyBsYWJlbF90d28g KyAnXG4nICkNCiAgc3lzLnN0ZG91dC53cml0ZSgnRGVwb3QgUmFuZ2UgJyArIGRlcG90X3Jvb3Qg KyAnXG5cbicgKQ0KDQogICMgT25seSBwcm9jZXNzIHRoZSBsaW5lcyB0aGF0IGxpc3QgZmlsZXNw ZWMxIC0gZmlsZXNwZWMyDQogIGV4cE1haW4gPSByZS5jb21waWxlKCByJ149PT09JyApDQogIA0K ICAjIElmIHRoZSBmaXJzdCBmaWxlIGlzIG1pc3NpbmcgaXQgd2lsbCBzaG93IHVwIGFzIHRoZSBm b2xsb3dpbmcNCiAgZXhwTWlzc2luZ0ZpcnN0ID0gcmUuY29tcGlsZSggcic8IG5vbmUgPicgKSAg DQogIA0KICAjIElmIHRoZSBzZWNvbmQgZmlsZSBpcyBtaXNzaW5nIGlzIHdpbGwgc2hvdyB1cCBh cyAoIG5vdGljZSBtaXNzaW5nIHNwYWNlcykNCiAgZXhwTWlzc2luZ1NlY29uZCA9IHJlLmNvbXBp bGUoIHInPG5vbmU+JyApICANCiAgDQogICMgc3BlY2lhbCBjYXNlIG9mIG5vIHNlY29uZCBmaWxl DQogIGV4cDEgPSByZS5jb21waWxlKCByJyAtIDwnICkNCiAgIyBpbiBhbGwgb3RoZXIgY2FzZXMg dGhpcyBpcyB0aGUgc2VwYXJhdG9yDQogIGV4cDIgPSByZS5jb21waWxlKCByJyAtIC8vJyApDQog ICMgV2Ugd2lsbCB1c2UgdGhlICMgdG8gc3BsaXQgdGhlIGZpbGUgc3BlYyBmcm9tIHRoZSByZXZp c2lvbiBudW1iZXINCiAgZXhwMyA9IHJlLmNvbXBpbGUoIHInIycgKQ0KICBzcGFjZUV4cCA9IHJl LmNvbXBpbGUoIHInICcgKQ0KICANCiAgZm9yIGxpbmUgaW4gb3MucG9wZW4oIGNvbW1hbmQsJ3In KS5yZWFkbGluZXMoKToNCiAgICAgIyBvbmx5IGZvciBsaW5lcyBsaXN0aW5nIGZpbGUgc3BlY3MN CiAgICAgbU1haW4gPSBleHBNYWluLnNlYXJjaCggbGluZSApDQogICAgIGlmIG1NYWluOg0KDQog ICAgICAgIGlmIGRlYnVnOg0KICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBsaW5lICkNCiAg ICAgDQogICAgICAgICMgUHJldmVudGl2ZSBjbGVhbnVwDQogICAgICAgIGZpbGUxX3NlY3Rpb24x ID0gZmlsZTFfc2VjdGlvbjIgPSBmaWxlMl9zZWN0aW9uMSA9IGZpbGUyX3NlY3Rpb24yID0gJycN CiAgICAgICAgZmlsZTFfcmV2bnVtID0gZmlsZTJfcmV2bnVtID0gZmlsZTFfdHlwZSA9ZmlsZTJf dHlwZSA9IGRlbGltaXRlciA9IGNvbXBhcmVfc3RhdHVzID0gJycNCiAgICAgICAgdGVtcCA9IDAN Cg0KICAgICAgICBtTWlzc2luZ0ZpcnN0ID0gZXhwTWlzc2luZ0ZpcnN0LnNlYXJjaCggbGluZSAp DQogICAgICAgIG1NaXNzaW5nU2Vjb25kID0gZXhwTWlzc2luZ1NlY29uZC5zZWFyY2goIGxpbmUg KQ0KICAgICAgICANCiAgICAgICAgIyBsZXRzIHN0YXJ0IG9mZiB0aGlua2luZyB0aGF0IGVhY2gg ZmlsZSBoYXMgMSByZXYgdGhlbg0KICAgICAgICAjIGxhdGVyIHdlIHdpbGwgYnJlYWsgdGhlICJy ZWFsIiByZXYgbnVtYmVyIG91dCBvZiBlYWNoIGZpbGVzcGVjDQogICAgICAgICMgYW5kIHBsYWNl IGl0IGluIG9uZSBvZiB0aGVzZQ0KICAgICAgICAjDQogICAgICAgIHJldl9udW1iZXIxID0gMQ0K ICAgICAgICByZXZfbnVtYmVyMiA9IDENCgkNCgkJDQoJCSMgU3RyaW5nIHNwbGl0dGluZyBmb3Ig Zmlyc3QgZmlsZQ0KCQkjDQogICAgICAgIGlmIG1NaXNzaW5nRmlyc3Q6DQoJCSAgICMgRmlyc3Qg ZmlsZSBpcyBlbXB0eSBzbyB0aGlzIGlzIGFuIGFkZGVkIGZpbGUNCiAgICAgICAgICAgaWYgZGVi dWc6DQogICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdBZGRlZCEhISFcbicgKQ0KICAg ICAgICAgICBmaWxlc19hZGRlZCA9IGZpbGVzX2FkZGVkICsgMQ0KICAgICAgICAgICByZXZfbnVt YmVyMSA9IDANCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIyBicmVhayB0aGUgbGluZSB1cCBp bnRvIGVhY2ggb2YgaXRzIGZpbGUgcGFydHMgCQ0KICAgICAgICAgICAjIHdlIG11c3QgY2hlY2sg aGVyZSBpZiB3ZSBhcmUgbWlzc2luZyB0aGUgc2Vjb25kIGZpbGVzcGVjIGJlY2F1c2UNCiAgICAg ICAgICAgIyB0aGVuIHRoZSBkZWxpbWl0ZXIgY2hhbmdlcyBmcm9tICItIC8vJyB0byAiLSA8Ig0K ICAgICAgICAgICAjIFdlIGNhbnQgdXNlIHBsYWluICItIiBiZWNhdXNlIGl0IG1heSBiZSBpbiBh IGZpbGVuYW1lDQogICAgICAgICAgIGlmIG1NaXNzaW5nU2Vjb25kOg0KICAgICAgICAgICAgICAo IHNlY3Rpb24xLCBzZWN0aW9uMiApID0gZXhwMS5zcGxpdCggbGluZSApDQogICAgICAgICAgIGVs c2U6DQogICAgICAgICAgICAgICggc2VjdGlvbjEsIHNlY3Rpb24yICkgPSBleHAyLnNwbGl0KCBs aW5lICkNCiAgICAgICAgICAgDQogICAgICAgICAgIGlmIGRlYnVnOg0KICAgICAgICAgICAgICBz eXMuc3Rkb3V0LndyaXRlKCAnc2VjdGlvbjEtPicgKyBzZWN0aW9uMSArICdcbicgKQ0KICAgICAg ICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnc2VjdGlvbjItPicgKyBzZWN0aW9uMiArICdcbicg KQ0KICAgICAgICAgICANCiAgICAgICAgICAgIyBtYWluIGNvdW50IGZpbGVzIGluIGZpcnN0IEBs YWJlbA0KICAgICAgICAgICBmaWxlX2NvdW50MSA9IGZpbGVfY291bnQxICsgMQ0KCSAgICAgICAN CgkgICAgICAgIyBub3cgc3BsaXQgdGhlIHBhdGggZnJvbSB0aGUgcmV2IG51bWJlcg0KICAgICAg ICAgICAoIGZpbGUxX3NlY3Rpb24xLCBmaWxlMV9zZWN0aW9uMiApID0gZXhwMy5zcGxpdCggc2Vj dGlvbjEgKQ0KICAgICAgICAgICBpZiBkZWJ1ZzoNCiAgICAgICAgICAgICAgc3lzLnN0ZG91dC53 cml0ZSggJ2ZpbGUxX3NlY3Rpb24xLT4nICsgZmlsZTFfc2VjdGlvbjEgKyAnXG4nICkNCiAgICAg ICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ2ZpbGUxX3NlY3Rpb24yLT4nICsgZmlsZTFfc2Vj dGlvbjIgKyAnXG4nICkNCgkJICAgDQogICAgICAgICAgIGlmIG1NaXNzaW5nU2Vjb25kOg0KICAg ICAgICAgICAgICAjIElmIHlvdXIgbWlzc2luZyBzZWNvbmQgZmlsZSB0aGVyZSB3aWxsIGJlIG5v IGZpbGUgdHlwZSB0byANCiAgICAgICAgICAgICAgIyBzcGxpdCBvZmYNCiAgICAgICAgICAgICAg cmV2X251bWJlcjEgPSBpbnQoIGZpbGUxX3NlY3Rpb24yICkNCiAgICAgICAgICAgICAgaWYgZGVi dWc6DQogICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdmaWxlMSByZXYgbnVtYmVy LT4nICsgZmlsZTFfc2VjdGlvbjIgKyAnXG4nICkNCiAgICAgICAgICAgZWxzZToNCiAgICAgICAg ICAgICAgKCBmaWxlMV9yZXZudW0sIGZpbGUxX3R5cGUgKSA9IHJlLnNwbGl0KCAnICcsIGZpbGUx X3NlY3Rpb24yLCAyICkNCiAgICAgICAgICAgICAgcmV2X251bWJlcjEgPSBpbnQoIGZpbGUxX3Jl dm51bSApDQogICAgICAgICAgICAgIGlmIGRlYnVnOg0KICAgICAgICAgICAgICAgICBzeXMuc3Rk b3V0LndyaXRlKCAnZmlsZTEgcmV2IG51bWJlci0+JyArIGZpbGUxX3Jldm51bSArICdcbicgKQ0K ICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnZmlsZTEgdHlwZS0+JyArIGZpbGUx X3R5cGUgKyAnXG4nICkNCg0KICAgICAgICAgICAgICANCiAgICAgICAgIyBTdHJpbmcgc3BsaXR0 aW5nIGZvciBzZWNvbmQgZmlsZQ0KICAgICAgICAjDQogICAgICAgIGlmIG1NaXNzaW5nU2Vjb25k Og0KICAgICAgICAgICAjIFNlY29uZCBmaWxlIGlzIGVtcHR5IHNvIHRoaXMgaXMgYSBkZWxldGVk IGZpbGUNCiAgICAgICAgICAgZmlsZXNfZGVsZXRlZCA9IGZpbGVzX2RlbGV0ZWQgKyAxDQogICAg ICAgICAgIHJldl9udW1iZXIyID0gMA0KICAgICAgICAgICBpZiBkZWJ1ZzoNCiAgICAgICAgICAg ICAgc3lzLnN0ZG91dC53cml0ZSggJ0RlbGV0ZWQhISEhXG4nICkNCiAgICAgICAgZWxzZToNCiAg ICAgICAgICAgICMgV2UgZG9udCBuZWVkIHRvIHRlc3QgaGVyZSBmb3Igc2Vjb25kIGZpbGVzcGVj IG1pc3NpbmcNCiAgICAgICAgICAgICggc2VjdGlvbjEsIHNlY3Rpb24yICkgPSBleHAyLnNwbGl0 KCBsaW5lICkNCiAgICAgICAgICAgIGlmIGRlYnVnOg0KICAgICAgICAgICAgICAgc3lzLnN0ZG91 dC53cml0ZSggJ3NlY3Rpb24xLT4nICsgc2VjdGlvbjEgKyAnXG4nICkNCiAgICAgICAgICAgICAg IHN5cy5zdGRvdXQud3JpdGUoICdzZWN0aW9uMi0+JyArIHNlY3Rpb24yICsgJ1xuJyApDQogICAg ICAgICAgICANCiAgICAgICAgICAgICMgbWFpbiBjb3VudCBvZiBmaWxlcyBpbiBzZWNvbmQgQGxh YmVsDQogICAgICAgICAgICBmaWxlX2NvdW50MiA9IGZpbGVfY291bnQyICsgMQ0KICAgICAgICAg ICAgDQogICAgICAgICAgICAoIGZpbGUyX3NlY3Rpb24xLCBmaWxlMl9zZWN0aW9uMiApID0gZXhw My5zcGxpdCggc2VjdGlvbjIgKQ0KICAgICAgICAgICAgaWYgZGVidWc6DQogICAgICAgICAgICAg ICBzeXMuc3Rkb3V0LndyaXRlKCAnZmlsZTJfc2VjdGlvbjItPicgKyBmaWxlMl9zZWN0aW9uMiAr ICdcbicgKQ0KICAgICAgICAgICAgaWYgbU1pc3NpbmdGaXJzdDoNCiAgICAgICAgICAgICAgICMg VGhpcyBpcyBhIGZpbGUgdGhhdCBoYXMgYmVlbiBhZGRlZA0KICAgICAgICAgICAgICAgIw0KICAg ICAgICAgICAgICAgKCBmaWxlMl9yZXZudW0sIGNvbXBhcmVfc3RhdHVzICkgPSByZS5zcGxpdCgg JyAnLCBmaWxlMl9zZWN0aW9uMiwgMiApDQogICAgICAgICAgICAgICBpZiBkZWJ1ZzoNCiAgICAg ICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdmaWxlMiByZXYgbnVtYmVyLT4nICsgZmls ZTJfcmV2bnVtICsgJ1xuXG4nICkNCiAgICAgICAgICAgICAgIHJldmlzaW9uc19hZGRlZCA9IHJl dmlzaW9uc19hZGRlZCArIGludCggZmlsZTJfcmV2bnVtICkJCQ0KICAgICAgICAgICAgICAgI3N5 cy5zdGRvdXQud3JpdGUoICdBZGRlZCwvLycgKyBmaWxlMl9zZWN0aW9uMSApDQogICAgICAgICAg ICAgICAjc3lzLnN0ZG91dC53cml0ZSggJywnICsgYGludCggZmlsZTJfcmV2bnVtKWAgKyAnXG4n ICkNCiAgICAgICAgICAgIGVsc2U6CQkNCiAgICAgICAgICAgICAgICggZmlsZTJfcmV2bnVtLCBm aWxlMl90eXBlLCBkZWxpbWl0ZXIsIGNvbXBhcmVfc3RhdHVzICkgPSByZS5zcGxpdCggJyAnLCBm aWxlMl9zZWN0aW9uMiwgNCApDQogICAgICAgICAgICAgICBpZiBkZWJ1ZzoNCiAgICAgICAgICAg ICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdmaWxlMiByZXYgbnVtYmVyLT4nICsgZmlsZTJfcmV2 bnVtICsgJ1xuJyApDQogICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnZmlsZTIg dHlwZS0+JyArIGZpbGUyX3R5cGUgKyAnXG4nICkNCiAgICAgICAgICAgICAgICAgIHN5cy5zdGRv dXQud3JpdGUoICdmaWxlIGNvbXBhcmUgc3RhdHVzLT4nICsgY29tcGFyZV9zdGF0dXMgKyAnXG4n ICkNCiAgICAgICAgICAgICAgIHJldl9udW1iZXIyID0gaW50KCBmaWxlMl9yZXZudW0gKQ0KICAg ICAgICAgICAgICAgdGVtcCA9IHJldl9udW1iZXIyIC0gcmV2X251bWJlcjEgDQogICAgICAgICAg ICAgICByZXZpc2lvbnNfYWRkZWQgPSByZXZpc2lvbnNfYWRkZWQgKyB0ZW1wDQogICAgICAgICAg ICAgICBpZiByZXZfbnVtYmVyMSAhPSByZXZfbnVtYmVyMjoNCiAgICAgICAgICAgICAgICAgICNz eXMuc3Rkb3V0LndyaXRlKCAnQ2hhbmdlZCwvLycgKyBmaWxlMl9zZWN0aW9uMSApDQogICAgICAg ICAgICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggJywnICsgYHRlbXBgICsgJ1xuJyApDQogICAg ICAgICAgICAgICAgICBmaWxlc19jaGFuZ2VkID0gZmlsZXNfY2hhbmdlZCArIDENCiAgICAgICAg ICAgICAgIGlmIGZpbGUxX3R5cGUgIT0gZmlsZTJfdHlwZToNCiAgICAgICAgICAgICAgICAgIGZp bGVzX3R5cGVjaGFuZ2UgPSBmaWxlc190eXBlY2hhbmdlICsgMQ0KICAgICAgICAgICAgICAgDQog IHJldHVybiBmaWxlc19hZGRlZCwgZmlsZXNfZGVsZXRlZCwgZmlsZXNfdHlwZWNoYW5nZSwgZmls ZXNfY2hhbmdlZCwgcmV2aXNpb25zX2FkZGVkLCBmaWxlX2NvdW50MSwgZmlsZV9jb3VudDINCiAg DQogIA0KIyAgDQojIFRoaXMgc2NyaXB0IHRha2VzIGEgZGVwb3QgcGF0aCBhbmQgdHdvIGxhYmVs cyAobGlrZSBAamFrY2Fsb3BlLjIwICkgDQojIE9SIHR3byBkYXRlLXRpbWUgY29tYm9zIChsaWtl IEAxOTk5LzAyLzAyICkNCiMNCiMgVGhlIG91dHB1dCB0aGVuIGdpdmVzIHlvdSB0aGUgY291bnRz IG9mIGZpbGVzIGNoYW5nZWQgZGVsZXRlZCBvciBhZGRlZA0KIyBhbiB2YXJpb3VzIGNvdW50cy4g KG1ldHJpY3MpDQojDQoNCg0KIyBNYWluIGJvZHkgb2YgcHJvZ3JhbSANCiMNCiMNCmRlcG90X2xv Y2F0aW9uID0gc3lzLmFyZ3ZbMV0gICAgICAgICAgICAgIA0KZGlmZl9sYWJlbDEgPSBzeXMuYXJn dlsyXQ0KZGlmZl9sYWJlbDIgPSBzeXMuYXJndlszXQ0KICAgICAgICANCg0Kc3lzLnN0ZG91dC53 cml0ZSggJ1N0YXJ0aW5nIHByb2Nlc3NpbmcgdHJlZSBkYXRhLi4uLlxuXG4nICkNCg0KI2NhbGwg dGhlIGRpZmYgd2l0aCB0aGUgUkNTIGZsYWdzDQojDQojDQphZGRzID0gY2hhbmdlcyA9IGRlbGV0 ZXMgPSAwDQoNCiggYWRkZWQsIGRlbGV0ZWQsIHR5cGVjaGFuZ2UsIGNoYW5nZWQsIHJldnNfYWRk ZWQsIGNvdW50MSwgY291bnQyICkgPSBcDQogICAgIGV4dHJhY3RfbWV0cmljc19jb3VudHNfZmls ZSggZGVwb3RfbG9jYXRpb24sIGRpZmZfbGFiZWwxLCBkaWZmX2xhYmVsMiApDQoNCnN5cy5zdGRv dXQud3JpdGUoICdDb3VudCBvZiBmaWxlcyBhdCBzdGFydCBwb2ludC0tPiAnICsgYGNvdW50MWAg KyAnXG4nICkNCnN5cy5zdGRvdXQud3JpdGUoICdDb3VudCBvZiBmaWxlcyBhdCBlbmQgcG9pbnQt LT4gJyArIGBjb3VudDJgICsgJ1xuJyApDQpzeXMuc3Rkb3V0LndyaXRlKCAnQ291bnQgb2YgZmls ZXMgYWRkZWQtLT4gJyArIGBhZGRlZGAgKyAnXG4nICkNCnN5cy5zdGRvdXQud3JpdGUoICdDb3Vu dCBvZiBmaWxlcyByZW1vdmVkLS0+ICcgKyBgZGVsZXRlZGAgKyAnXG4nICkNCnN5cy5zdGRvdXQu d3JpdGUoICdDb3VudCBvZiBmaWxlcyB0aGF0IGNoYW5nZWQgdHlwZS0tPiAnICsgYHR5cGVjaGFu Z2VgICsgJ1xuJyApDQpzeXMuc3Rkb3V0LndyaXRlKCAnQ291bnQgb2YgZmlsZXMgdGhhdCBjaGFu Z2VkLS0+ICcgKyBgY2hhbmdlZGAgKyAnXG4nICkNCnN5cy5zdGRvdXQud3JpdGUoICdUb3RhbCBu dW1iZXIgb2YgcmV2aXNpb25zIGFkZGVkLS0+ICcgKyBgcmV2c19hZGRlZGAgKyAnXG4nICkNCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0K
---0__=Kd0d0xGdnOvYiEwaatgReoF8TMFnzafgFRQZcQ5inLA0x2ktv414ftIt Content-type: application/octet-stream; name="usermetrics.py" Content-Disposition: attachment; filename="usermetrics.py" Content-transfer-encoding: base64
IyMNCiMjICBXcml0dGVuIGJ5IFNjb3R0IFBhc25pa293c2tpIGFyb3VuZCB0aGUgdGltZSBvZiA0 LzIyLzk5DQojIyAgQHN5bWFudGVjIGNvcnAuICAgSG9tZSBvZiB0aGUgTm9ydG9uIHV0aWxpdGll cw0KIyMNCiMjICBVbmRlciBkdXJlc3Mgb2YgcGVza3kgUUEgcGVvcGxlLi4uDQojIw0KIyMgIFRo aXMgY29tZXMgd2l0aCBubyBndWFyYW50ZWUgd2hhdHNvZXZlci4uLiBvbiBhbnkgbGV2ZWwuDQoj Iw0KIyMgIENvbnNpZGVyIHRoaXMgdG8gYmUgdW5kZXIgdGhlIGxpbnV4IHR5cGUgbGlzY2Vuc2Ug dGhpbmd5DQojIyAgKCBEb24ndCByZWNhbGwgd2hhdCBpdHMgY2FsbGVkIEdOVSBvciBjb3B5bGVm dCBvciB3aGF0ZXZlciApIA0KIyMgIGFuZCBpZiBhbnlvbmUgY29tcGxhaW5zIG15IG1hbmFnZXIg ZHUgam91ciBzYWlkIEkgY291bGQgZ2l2ZSBpdCBhd2F5Lg0KIyMgICggaGUgcmVhbGx5IGRpZCAp DQojIw0KDQojIS91c3IvbG9jYWwvYmluL3B5dGhvbg0KIw0KaW1wb3J0IHN5cywgb3MsIHN0cmlu ZywgcmUgDQoNCg0KIyBldmVyeWJvZHkgaXMgdXNpbmcgdGhpcyANCmV4cEZpbGVOYW1lRmllbGQg PSByZS5jb21waWxlKCByJ14oLy8uKykvKC4rKScgKQ0KDQoNCiMgVGhpcyBmdW5jIGNvcnJlc3Bv bmRzIHRvIHA0IGRpZmYyIHdpdGggdGhlIC1kbiBzd2l0Y2ggICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX3Jjc19maWxldG9maWxlKCBkZXBvdF9maWxl X2FuZF9yZXYxLCBkZXBvdF9maWxlX2FuZF9yZXYyICk6DQoJIyBEb2VzIGEgcDQgY2hhbmdlcyBk ZXBvdF9yb290QGxhYmVsX29uZSBkZXBvdF9yb290QGxhYmVsX3R3bw0KICAgICMgZGVwb3Rfcm9v dCBpcyB1c2VkIHRvIGxpbWl0IHRoZSBkaWZmIHJhbmdlIHRvIGEgc2luZ2xlICJwcm9qZWN0Ig0K ICAgICMgb3Igc29tZXRoaW5nIGV2ZW4gc21hbGxlci4uIGxpa2UgYSBzaW5nbGUgZmlsZQ0KICAg ICMgd2UgdGhlbiBwYXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQgdXAgdGhlIHRvdGFscw0KDQogIGNv bW1hbmQgPSAncDQgZGlmZjIgLWRuIFwiJyArIGRlcG90X2ZpbGVfYW5kX3JldjEgKyAnXCIgXCIn ICsgZGVwb3RfZmlsZV9hbmRfcmV2MiArICdcIicNCiAgbGluZXNfYWRkZWQgPSAwDQogIGxpbmVz X2NoYW5nZWQgPSAwDQogIGxpbmVzX2RlbGV0ZWQgPSAwDQogIA0KICAjc3lzLnN0ZG91dC53cml0 ZSgnRXh0cmFjdGlvbiBmdW5jdGlvbiB1c2luZyAnICsgY29tbWFuZCArJyAgXG4nICkNCg0KICAj IGJyZWFrIHRoZSBsaW5lIHVwIGFjY29yZGluZyB0by4uLg0KICAjIHNhbXBsZSBsaW5lOiBhODUg Mg0KICAjICAgICAgICAgICAgICBvcGVyYXRpb24gKGxpbmUpbG9jYXRpb24gKE51bWJlciBvZiBs aW5lcyBhZmZlY3RlZCljb3VudCANCiAgcCA9IHJlLmNvbXBpbGUoIHInXihbYWRdKShbMC05XSsp IChcZCspJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29tbWFuZCwncicpLnJlYWRs aW5lcygpOg0KICAgIHRtcCA9IGxpbmVbMDoxXSAgDQogICAgaWYgdG1wID09ICdhJyBvciB0bXAg PT0gJ2QnOg0KICAgICAgICAgICMgb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgYSBtYXRjaCBvdGhl cndpc2UgZ3JvdXBzKCkgd2lsbCBibG93IGNodW5rcyBkaWZmaW5nIGFuIHJ0Zg0KICAgICAgICAg IG0gPSBwLm1hdGNoKCBsaW5lICkNCiAgICAgICAgICBpZiBtOg0KICAgICAgICAgICAgKG9wZXJh dGlvbiwgbG9jYXRpb24sIGNvdW50KSA9IHJlLm1hdGNoKCByJ14oW2FkXSkoWzAtOV0rKSAoXGQr KScsIGxpbmUpLmdyb3VwcygpDQogICAgICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggJz4nICsg b3BlcmF0aW9uICsgJzwgICAgPicgKyBsb2NhdGlvbiArICc8ICAgPicgKyBjb3VudCArICc8XG4n ICkNCiAgICAgICAgICAgIGlmIHRtcCA9PSAnYSc6DQogICAgICAgICAgICAgICBsaW5lc19hZGRl ZCA9IGxpbmVzX2FkZGVkICsgaW50KCBjb3VudCApDQogICAgICAgICAgICBlbGlmIHRtcCA9PSAn ZCc6ICAgDQogICAgICAgICAgICAgICBsaW5lc19kZWxldGVkID0gbGluZXNfZGVsZXRlZCArIGlu dCggY291bnQgKQ0KICAgICAgICAgICAgICAgICAgICAgIA0KICByZXR1cm4gbGluZXNfYWRkZWQs IGxpbmVzX2RlbGV0ZWQNCg0KICANCiMgVGhpcyBmdW5jIGNvcnJlc3BvbmRzIHRvIHA0IGRpZmYy IHdpdGggdGhlIC1kYyBzd2l0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIA0KICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX2NvbnRleHRfZmls ZXRvZmlsZSggZGVwb3RfZmlsZV9hbmRfcmV2MSwgZGVwb3RfZmlsZV9hbmRfcmV2MiApOg0KCSMg RG9lcyBhIHA0IGNoYW5nZXMgZGVwb3Rfcm9vdEBsYWJlbF9vbmUgZGVwb3Rfcm9vdEBsYWJlbF90 d28NCiAgICAjIGRlcG90X3Jvb3QgaXMgdXNlZCB0byBsaW1pdCB0aGUgZGlmZiByYW5nZSB0byBh IHNpbmdsZSAicHJvamVjdCINCiAgICAjIG9yIHNvbWV0aGluZyBldmVuIHNtYWxsZXIuLiBsaWtl IGEgc2luZ2xlIGZpbGUNCiAgICAjIHdlIHRoZW4gcGFyc2UgdGhlIG91dHB1dCBhbmQgYWRkIHVw IHRoZSB0b3RhbHMNCg0KICBjb21tYW5kID0gJ3A0IGRpZmYyIC1kYyBcIicgKyBkZXBvdF9maWxl X2FuZF9yZXYxICsgJ1wiIFwiJyArIGRlcG90X2ZpbGVfYW5kX3JldjIgKyAnXCInDQogIGxpbmVz X2FkZGVkID0gMA0KICBsaW5lc19jaGFuZ2VkID0gMA0KICBsaW5lc19kZWxldGVkID0gMA0KICAN CiAgI3N5cy5zdGRvdXQud3JpdGUoJ0V4dHJhY3Rpb24gZnVuY3Rpb24gdXNpbmcgJyArIGNvbW1h bmQgKycgIFxuJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29tbWFuZCwncicpLnJl YWRsaW5lcygpOg0KICAgICMgc2FtcGxlIGxpbmU6IENoYW5nZSBudW1iZXIgb24gZGF0ZSBieSBu YW1lQG1hY2hpbmUgJ2NvbW1lbnQnDQogICAgIyAgICAgICAgICAgICAgZHVtbXkgIGNoIyAgIA0K ICAgICNzeXMuc3Rkb3V0LndyaXRlKCBsaW5lICsgJ1xuJyApDQogICAgdG1wID0gbGluZVswOjFd ICANCiAgICBpZiB0bXAgPT0gJysnOg0KICAgICAgIGxpbmVzX2FkZGVkID0gbGluZXNfYWRkZWQg KyAxDQogICAgZWxpZiB0bXAgPT0gJy0nOg0KICAgICAgIGxpbmVzX2RlbGV0ZWQgPSBsaW5lc19k ZWxldGVkICsgMQ0KICAgIGVsaWYgdG1wID09ICchJzoNCiAgICAgICBsaW5lc19jaGFuZ2VkID0g bGluZXNfY2hhbmdlZCArMQ0KDQogIHJldHVybiBsaW5lc19hZGRlZCxsaW5lc19jaGFuZ2VkLGxp bmVzX2RlbGV0ZWQNCiAgDQogIA0KZGVmIGV4dHJhY3RfbWV0cmljc19jb3VudHNfc3VtbWFyeV9m aWxldG9maWxlKCBkZXBvdF9maWxlX2FuZF9yZXYxLCBkZXBvdF9maWxlX2FuZF9yZXYyICk6DQoJ IyBEb2VzIGEgcDQgY2hhbmdlcyBkZXBvdF9yb290QGxhYmVsX29uZSBkZXBvdF9yb290QGxhYmVs X3R3bw0KICAgICMgZGVwb3Rfcm9vdCBpcyB1c2VkIHRvIGxpbWl0IHRoZSBkaWZmIHJhbmdlIHRv IGEgc2luZ2xlICJwcm9qZWN0Ig0KICAgICMgb3Igc29tZXRoaW5nIGV2ZW4gc21hbGxlci4uIGxp a2UgYSBzaW5nbGUgZmlsZQ0KICAgICMgd2UgdGhlbiBwYXJzZSB0aGUgb3V0cHV0IGFuZCBhZGQg dXAgdGhlIHRvdGFscw0KDQogIGNvbW1hbmQgPSAncDQgZGlmZjIgLWRzIFwiJyArIGRlcG90X2Zp bGVfYW5kX3JldjEgKyAnXCIgXCInICsgZGVwb3RfZmlsZV9hbmRfcmV2MiArICdcIicNCiAgbGlu ZXNfYWRkZWQgPSAwDQogIGFkZF9jaHVua3MgPSAwDQogIGxpbmVzX2RlbGV0ZWQgPSAwDQogIGRl bGV0ZV9jaHVua3MgPSAwDQoNCiAgbGluZXNfY2hhbmdlZCA9IDANCiAgY2hhbmdlX2NodW5rcyA9 IDANCiAgZXh0cmFfZGF0YSA9IDAgIA0KDQogICNzeXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9u IGZ1bmN0aW9uIHVzaW5nICcgKyBjb21tYW5kICsnICBcbicgKQ0KDQogICMgVGhpcyB3aWxsIG1h dGNoIGxpbmVzIHN0YXJ0aW5nIHdpdGggDQogIGV4cDEgPSByZS5jb21waWxlKCByJ15bImFkZCIi ZGVsZXRlZCIiY2hhbmdlZF0iJyApDQogICMNCiAgIyBUaGUgbmV4dCAzIGVhdCB0aGUgYWRkIGRl bGV0ZWQgYW5kIGNoYW5nZWQgbGluZXMNCiAgIyAgaXQgY291bGQgYmUgb25lIGV4cHJlc3Npb24g SSBzdXBwb3NlDQogICMNCiAgZXhwMiA9IHJlLmNvbXBpbGUoIHInXihhZGQpIChcZCspIChjaHVu a3MpIChcZCspJyApDQogIGV4cDMgPSByZS5jb21waWxlKCByJ14oZGVsZXRlZCkgKFxkKykgKGNo dW5rcykgKFxkKyknICkNCiAgZXhwNCA9IHJlLmNvbXBpbGUoIHInXihjaGFuZ2VkKSAoXGQrKSAo Y2h1bmtzKSAoXGQrKSAvIChcZCspJyApDQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29t bWFuZCwncicpLnJlYWRsaW5lcygpOg0KICAgICAjIG9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlIGEg bWF0Y2gNCiAgICAgbTIgPSBleHAyLnNlYXJjaCggbGluZSApDQogICAgIG0zID0gZXhwMy5zZWFy Y2goIGxpbmUgKQ0KICAgICBtNCA9IGV4cDQuc2VhcmNoKCBsaW5lICkNCiAgICAgDQogICAgIGlm IG0yOg0KICAgICAgICAgKCBvcGVyYXRpb24sIGNvdW50MSwgY2h1bmtzLCBjb3VudDIgKSA9IG0y Lmdyb3VwcygpDQogICAgICAgICBhZGRfY2h1bmtzID0gYWRkX2NodW5rcyArIGludCggY291bnQx ICkNCiAgICAgICAgIGxpbmVzX2FkZGVkID0gbGluZXNfYWRkZWQgKyBpbnQoIGNvdW50MiApDQog ICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggY291bnQyICsgJ1xuJyApDQogICAgICAgIA0KICAg ICBlbGlmIG0zOg0KICAgICAgICAgKCBvcGVyYXRpb24sIGNvdW50MSwgY2h1bmtzLCBjb3VudDIg KSA9IG0zLmdyb3VwcygpDQogICAgICAgICBkZWxldGVfY2h1bmtzID0gZGVsZXRlX2NodW5rcyAr IGludCggY291bnQxICkNCiAgICAgICAgIGxpbmVzX2RlbGV0ZWQgPSBsaW5lc19kZWxldGVkICsg aW50KCBjb3VudDIgKQ0KICAgICAgICAgI3N5cy5zdGRvdXQud3JpdGUoIGNvdW50MiArICdcbicg KQ0KICAgICAgICANCiAgICAgZWxpZiBtNDoNCiAgICAgICAgICggb3BlcmF0aW9uLCBjb3VudDEs IGNodW5rcywgY291bnQyLCBjb3VudDMgKSA9IG00Lmdyb3VwcygpDQogICAgICAgICBjaGFuZ2Vf Y2h1bmtzID0gY2hhbmdlX2NodW5rcyArIGludCggY291bnQxICkNCiAgICAgICAgIGV4dHJhX2Rh dGEgPSBleHRyYV9kYXRhICsgaW50KCBjb3VudDIgKQ0KICAgICAgICAgbGluZXNfY2hhbmdlZCA9 IGxpbmVzX2NoYW5nZWQgKyBpbnQoIGNvdW50MyApDQogICAgICAgICAjc3lzLnN0ZG91dC53cml0 ZSggY291bnQzICsgJ1xuJyApDQogICAgICAgICAgICAgICAgICAgICAgDQogIHJldHVybiBsaW5l c19hZGRlZCxhZGRfY2h1bmtzLGxpbmVzX2RlbGV0ZWQsZGVsZXRlX2NodW5rcyxsaW5lc19jaGFu Z2VkLGNoYW5nZV9jaHVua3MsIGV4dHJhX2RhdGENCiAgDQogIA0KIyBUaGlzIGZ1bmMgY29ycmVz cG9uZHMgdG8gcDQgZGlmZjIgd2l0aCB0aGUgLWR1IHN3aXRjaCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICANCmRlZiBleHRyYWN0X21ldHJpY3NfY291bnRzX3Vu aWZpZWRfZmlsZXRvZmlsZSggZGVwb3RfZmlsZV9hbmRfcmV2MSwgZGVwb3RfZmlsZV9hbmRfcmV2 MiApOg0KCSMgRG9lcyBhIHA0IGNoYW5nZXMgZGVwb3Rfcm9vdEBsYWJlbF9vbmUgZGVwb3Rfcm9v dEBsYWJlbF90d28NCiAgICAjIGRlcG90X3Jvb3QgaXMgdXNlZCB0byBsaW1pdCB0aGUgZGlmZiBy YW5nZSB0byBhIHNpbmdsZSAicHJvamVjdCINCiAgICAjIG9yIHNvbWV0aGluZyBldmVuIHNtYWxs ZXIuLiBsaWtlIGEgc2luZ2xlIGZpbGUNCiAgICAjIHdlIHRoZW4gcGFyc2UgdGhlIG91dHB1dCBh bmQgYWRkIHVwIHRoZSB0b3RhbHMNCg0KICBjb21tYW5kID0gJ3A0IGRpZmYyIC1kdSBcIicgKyBk ZXBvdF9maWxlX2FuZF9yZXYxICsgJ1wiIFwiJyArIGRlcG90X2ZpbGVfYW5kX3JldjIgKyAnXCIn DQogIGxpbmVzX2FkZGVkID0gMA0KICBsaW5lc19kZWxldGVkID0gMA0KICANCiAgI3N5cy5zdGRv dXQud3JpdGUoJ0V4dHJhY3Rpb24gZnVuY3Rpb24gdXNpbmcgJyArIGNvbW1hbmQgKycgIFxuJyAp DQogIA0KICBmb3IgbGluZSBpbiBvcy5wb3BlbiggY29tbWFuZCwncicpLnJlYWRsaW5lcygpOg0K ICAgICMgc2FtcGxlIGxpbmU6IENoYW5nZSBudW1iZXIgb24gZGF0ZSBieSBuYW1lQG1hY2hpbmUg J2NvbW1lbnQnDQogICAgIyAgICAgICAgICAgICAgZHVtbXkgIGNoIyAgIA0KICAgICNzeXMuc3Rk b3V0LndyaXRlKCBsaW5lICsgJ1xuJyApDQogICAgdG1wID0gbGluZVswOjFdICANCiAgICBpZiB0 bXAgPT0gJysnOg0KICAgICAgIGxpbmVzX2FkZGVkID0gbGluZXNfYWRkZWQgKyAxDQogICAgZWxp ZiB0bXAgPT0gJy0nOg0KICAgICAgIGxpbmVzX2RlbGV0ZWQgPSBsaW5lc19kZWxldGVkICsgMQ0K DQogIHJldHVybiBsaW5lc19hZGRlZCwgbGluZXNfZGVsZXRlZA0KICANCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgDQojIFRoaXMgZnVuYyBnZW5lcmF0ZXMgYSBsaXN0IG9mIGNoYW5nZSBu dW1iZXJzIHRoYXQgaGF2ZSBiZWVuDQojIGFkZGVkIGJldHdlZW4gdGhlIDIgcG9pbnRzLg0KIyBJ dCdzIGVxdWl2YWxlbnQgdG8gcDQgY2hhbmdlcyAvL2RlcG90L3NvbWUgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICANCmRlZiBleHRyYWN0X2NoYW5nZV9udW1iZXJzKCBkZXBvdF9yb290LCBsYWJlbF9v bmUsIGxhYmVsX3R3byApOg0KICAjIERvZXMgYSBwNCBjaGFuZ2VzIGRlcG90X3Jvb3RAbGFiZWxf b25lIGRlcG90X3Jvb3RAbGFiZWxfdHdvDQogICMgZGVwb3Rfcm9vdCBpcyB1c2VkIHRvIGxpbWl0 IHRoZSBkaWZmIHJhbmdlIHRvIGEgc2luZ2xlICJwcm9qZWN0Ig0KICAjIG9yIHNvbWV0aGluZyBl dmVuIHNtYWxsZXIuLiBsaWtlIGEgc2luZ2xlIGZpbGUNCiAgIyB3ZSB0aGVuIHBhcnNlIHRoZSBv dXRwdXQgYW5kIGFkZCB1cCB0aGUgdG90YWxzDQoNCiAgY29tbWFuZDEgPSAncDQgY2hhbmdlcyAn ICsgZGVwb3Rfcm9vdCArIGxhYmVsX29uZSAgIA0KICBjb21tYW5kMiA9ICdwNCBjaGFuZ2VzICcg KyBkZXBvdF9yb290ICsgbGFiZWxfdHdvICANCg0KICBmaXJzdF9saXN0ID0gW10NCiAgc2Vjb25k X2xpc3QgPSBbXSAgICANCiAgZGlmZmxpc3QgPSBbXQ0KIA0KICAjIGJyZWFrIHRoZSBsaW5lIHVw IGFjY29yZGluZyB0by4uLg0KICAjDQogICMgVGhpcyBzZWVtcyB0byB3b3JrIGJlc3Qgd2l0aCAy IGdyb3Vwcw0KICBleHBDaGFuZ2VOdW1iZXIgPSByZS5jb21waWxlKCByJ14oQ2hhbmdlICkoXGQr KScgKQ0KDQogICNzeXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1bmN0aW9uIHVzaW5nICcg KyBjb21tYW5kMSArJyAgXG4nICkNCiAgZm9yIGxpbmUgaW4gb3MucG9wZW4oIGNvbW1hbmQxLCdy JykucmVhZGxpbmVzKCk6DQogICAgIHMxID0gZXhwQ2hhbmdlTnVtYmVyLnNlYXJjaCggbGluZSAp DQogICAgICgganVuaywgY2hhbmdlTnVtYmVyMSApID0gczEuZ3JvdXBzKCkNCiAgICAgI3N5cy5z dGRvdXQud3JpdGUoJ0NoYW5nZSBOdW1iZXIgbGlzdCAxLT4gJyArIGBjaGFuZ2VOdW1iZXIxYCAr JyAgXG4nICkNCiAgICAgZmlyc3RfbGlzdC5hcHBlbmQoIGNoYW5nZU51bWJlcjEgKQ0KDQogICNz eXMuc3Rkb3V0LndyaXRlKCdFeHRyYWN0aW9uIGZ1bmN0aW9uIHVzaW5nICcgKyBjb21tYW5kMiAr JyAgXG4nICkNCiAgZm9yIGxpbmUgaW4gb3MucG9wZW4oIGNvbW1hbmQyLCdyJykucmVhZGxpbmVz KCk6DQogICAgIHMxID0gZXhwQ2hhbmdlTnVtYmVyLnNlYXJjaCggbGluZSApDQogICAgICgganVu aywgY2hhbmdlTnVtYmVyMiApID0gczEuZ3JvdXBzKCkNCiAgICAgI3N5cy5zdGRvdXQud3JpdGUo J0NoYW5nZSBOdW1iZXIgbGlzdCAyLT4gJyArIGBjaGFuZ2VOdW1iZXIyYCArJyAgXG4nICkNCiAg ICAgc2Vjb25kX2xpc3QuYXBwZW5kKCBjaGFuZ2VOdW1iZXIyICkNCg0KICAjIFRoZSBmb2xsb3dp bmcgaXMgYSB2ZXJ5IGJhc2ljIGRpZmYgcm91dGluZSBmb3IgMiBsaXN0cw0KICAjIFN1bSBib3Ro IGxpc3RzIHRoZW4gaWYgY29uc2VjdHV0aXZlIGVsZW1lbnRzIG1hdGNoIA0KICAjIHdlIHdpbGwg bm90IGFkZCBlaXRoZXIgdG8gZmluYWwgc3VtbWF0aW9uIGxpc3QNCg0KICBzdW1tYXRpb24gPSBm aXJzdF9saXN0ICsgc2Vjb25kX2xpc3QNCiAgc3VtbWF0aW9uLnNvcnQoKQ0KDQogIGluZGV4ID0g MA0KICBkaWZmbGlzdF9sZW5ndGggPSAwDQogIHdoaWxlIGluZGV4IDw9IGxlbiggc3VtbWF0aW9u ICk6DQogICAgICNzeXMuc3Rkb3V0LndyaXRlKCAnSW5kZXggJyArIGBpbmRleGAgKyAnXG4nICkN CiAgICAgaWYgaW5kZXggKyAxID49IGxlbiggc3VtbWF0aW9uICk6DQogICAgICAgIGlmIGluZGV4 ICE9IGxlbiggc3VtbWF0aW9uICk6DQogICAgICAgICAgICBkaWZmbGlzdF9sZW5ndGggPSBkaWZm bGlzdF9sZW5ndGggKyAxDQogICAgICAgICAgICBkaWZmbGlzdC5hcHBlbmQoIHN1bW1hdGlvblsg aW5kZXggXSApDQogICAgICAgIGJyZWFrDQogICAgIGVsc2U6DQogICAgICAgIGlmIHN1bW1hdGlv blsgaW5kZXggXSA9PSBzdW1tYXRpb25bIGluZGV4ICsgMSBdOg0KICAgICAgICAgICBpbmRleCA9 IGluZGV4ICsgMg0KICAgICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggJ0luZGV4IGlzICcgKyBg aW5kZXhgICsgJyBBZnRlciBqdW1waW4gb3ZlclxuJyApDQogICAgICAgIGVsc2U6DQogICAgICAg ICAgICNzeXMuc3Rkb3V0LndyaXRlKCBzdW1tYXRpb25bIGluZGV4IF0gKyAnXG4nICkNCiAgICAg ICAgICAgZGlmZmxpc3RfbGVuZ3RoID0gZGlmZmxpc3RfbGVuZ3RoICsgMQ0KICAgICAgICAgICBk aWZmbGlzdC5hcHBlbmQoIHN1bW1hdGlvblsgaW5kZXggXSApDQogICAgICAgICAgIGluZGV4ID0g aW5kZXggKyAxDQoNCiAgIyBMZXRzIHByaW50IG91dCBzb21lIHN1bW1hcnkgZGF0YSAgDQogIHN5 cy5zdGRvdXQud3JpdGUoICdcbicgKyBgZGlmZmxpc3RfbGVuZ3RoYCArICcgQ2hhbmdlbGlzdHMg c3VibWl0dGVkOlxuJyApDQogIGZvciBjaGFuZ2VOdW1iZXIgaW4gZGlmZmxpc3Q6DQogICAgIHN5 cy5zdGRvdXQud3JpdGUoIGNoYW5nZU51bWJlciArICcgJyApDQoNCiAgc3lzLnN0ZG91dC53cml0 ZSggJ1xuXG4nICkNCg0KICByZXR1cm4gZGlmZmxpc3QNCg0KZGVmIGdlbl9jaGFuZ2VfZGF0YSgg bGlzdG9mX2NoYW5nZW51bXMgKToNCiAgIyBQYXJzZSB0aGUgZGF0YSBmb3IgZWFjaCBjaGFuZ2UN Cg0KICBjb21tYW5kID0gJ3A0IGRlc2NyaWJlIC1zICcgICANCiANCiAgdXNlcl9kaWN0ID0ge30N Cg0KICAjIGJyZWFrIHRoZSBsaW5lIHVwIGFjY29yZGluZyB0by4uLg0KICAjDQogICMgVGhpcyBz ZWVtcyB0byB3b3JrIGJlc3Qgd2l0aCAyIGdyb3Vwcw0KICBleHBDaGFuZ2VGaWVsZHMgPSByZS5j b21waWxlKCByJ15DaGFuZ2UgKFxkKykgYnkgKC4rKSBvbiAoXGQrKS8oXGQrKS8oXGQrKSAoXGQr KTooXGQrKTooXGQrKScgKQ0KICBleHBGaWxlRmllbGRzID0gcmUuY29tcGlsZSggcideLi4uICgu KykjKFxkKykgKC4rKScgKQ0KICBleHBGaWxlTmFtZUZpZWxkID0gcmUuY29tcGlsZSggcideKC8v LispLyguKyknICkNCg0KICAjc3lzLnN0ZG91dC53cml0ZSgnRXh0cmFjdGlvbiBmdW5jdGlvbiB1 c2luZyAnICsgY29tbWFuZCArJyAgXG4nICkNCg0KICAjIGZvciBldmVyeSBjaGFuZ2UgbnVtYmVy IGRvIGEgcDQgZGVzY3JpYmUNCiAgIw0KICBmb3IgbnVtIGluIGxpc3RvZl9jaGFuZ2VudW1zOg0K ICAgICAjICBOb3cgZm9yIGVhY2ggcDQgZGVzY3JpYmUsIHN1Y2sgaW4gYWxsIHRoZSBvdXRwdXQg bGluZXMNCiAgICAgIw0KICAgICBsaXN0X29mX2ZpbGVzID0gW10NCiAgICAgZm9yIGxpbmUgaW4g b3MucG9wZW4oIGNvbW1hbmQgKyBudW0sJ3InKS5yZWFkbGluZXMoKToNCiAgICAgICAgIyAgTm93 IHVzZSByZSB0byByZWNvZ25pemUgdGhlIGhlYWRlciBsaW5lIG9yIHRoZSBmaWxlIGxpbmVzDQog ICAgICAgICMNCiAgICAgICAgc2RhdGEgPSBleHBDaGFuZ2VGaWVsZHMuc2VhcmNoKCBsaW5lICkN CiAgICAgICAgc2ZpbGUgPSBleHBGaWxlRmllbGRzLnNlYXJjaCggbGluZSApDQoNCiAgICAgICAg aWYgc2RhdGE6DQogICAgICAgICAgICMgQWhhISB0aGlzIGlzIGZpcnN0IGxpbmUgdGhhdCBjb250 YWlucyB0aGUgdXNlciBuYW1lIHN0dWZmLi4uDQogICAgICAgICAgICMNCiAgICAgICAgICAgKCBj aGFuZ2VOdW1iZXIsIHVzZXIsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjICApID0g c2RhdGEuZ3JvdXBzKCkNCg0KICAgICAgICBpZiBzZmlsZToNCiAgICAgICAgICAgIyBUaGlzIGlz IGEgbGluZSBsaXN0aW5nIGEgZmlsZSB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBjaGFuZ2UNCiAgICAg ICAgICAgIw0KICAgICAgICAgICAoIGRlcG90UGF0aCwgcmV2bnVtLCBhY3Rpb24gICkgPSBzZmls ZS5ncm91cHMoKQ0KICAgICAgICAgICBzZmlsZWFuZHBhdGggPSBleHBGaWxlTmFtZUZpZWxkLnNl YXJjaCggZGVwb3RQYXRoICkNCiAgICAgICAgICAgaWYgc2ZpbGVhbmRwYXRoOg0KICAgICAgICAg ICAgICAoIHBhdGhPbmx5LCBmaWxlTmFtZSApID0gc2ZpbGVhbmRwYXRoLmdyb3VwcygpDQogICAg ICAgICAgICAgICNzeXMuc3Rkb3V0LndyaXRlKCBwYXRoT25seSArICcsJyArIGZpbGVOYW1lICsg JywnICkNCiAgICAgICAgICAgICAgbGlzdF9vZl9maWxlcy5hcHBlbmQoICBbIGRlcG90UGF0aCwg cmV2bnVtLCBhY3Rpb24sIGNoYW5nZU51bWJlciBdICkNCg0KICAgICAgICAgICAjc3lzLnN0ZG91 dC53cml0ZSggcmV2bnVtICAgICAgICsgJywnICsgDQogICAgICAgICAgICMgICAgICAgICAgICAg ICAgICBhY3Rpb24gICAgICAgKyAnLCcgKyAgIA0KICAgICAgICAgICAjICAgICAgICAgICAgICAg ICAgY2hhbmdlTnVtYmVyICsgJywnICsgICANCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAg IHVzZXIgICAgICAgICArICcsJyArICAgDQogICAgICAgICAgICMgICAgICAgICAgICAgICAgICB5 ZWFyICAgICAgICAgKyAnLCcgKyAgIA0KICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgbW9u dGggICAgICAgICsgJywnICsgICANCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIGRheSAg ICAgICAgICArICcsJyArICAgDQogICAgICAgICAgICMgICAgICAgICAgICAgICAgICBob3VyICAg ICAgICAgKyAnLCcgKyAgIA0KICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgbWluICAgICAg ICAgICsgJywnICsgICANCiAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgIHNlYyAgICAgICAg ICArICdcbicgKSAgDQoNCiAgICAgIyBhZnRlciBwcm9jZXNzaW5nIHRoZSBjaGFuZ2UgbGlzdCBh ZGQgdGhlIGRhdGEgZ2FpbmVkIGludG8gdGhlDQogICAgICMgaW50byB0aGUgZGljdGlvbmFyeSBv ZiB1c2Vycw0KICAgICAjIFVzZSB0aGUgS2V5RXJyb3IgZXhjZXB0aW9uIHRvIGFkZCBrZXlzIHRo YXQgYXJlIG1pc3NpbmcNCiAgICAgIyBvdGhlcndpc2UganVzdCBzdW0gdGhlIGxpc3Qgb2YgZmls ZXMgZm9yIGVhY2ggdXNlcg0KICAgICAjDQogICAgIHRyeToNCiAgICAgICAgdXNlcl9kaWN0WyBg dXNlcmAgXSA9IHVzZXJfZGljdFsgYHVzZXJgIF0gKyBsaXN0X29mX2ZpbGVzDQogICAgIGV4Y2Vw dCBLZXlFcnJvcjoNCiAgICAgICAgdXNlcl9kaWN0WyBgdXNlcmAgXSA9IGxpc3Rfb2ZfZmlsZXMN Cg0KICAjdGVtcF9saXN0ID0gW10NCiAgI2ZvciBzdHVmZiBpbiB1c2VyX2RpY3Qua2V5cygpOg0K ICAjICAgc3lzLnN0ZG91dC53cml0ZSggJ1xuXG5Vc2VyIC0tPiAnICsgc3R1ZmYgICsgJ1xuXG4n ICkNCiAgIyAgIHRlbXBfbGlzdCA9IHVzZXJfZGljdFsgc3R1ZmYgXQ0KICAjICAgdGVtcF9saXN0 LnNvcnQoKQ0KICAjICAgZm9yIGp1bmsgaW4gdGVtcF9saXN0Og0KICAjICAgICAgc3lzLnN0ZG91 dC53cml0ZSggJ1x0JyArIGp1bmsgKyAnXG4nICkgDQoNCg0KICByZXR1cm4gdXNlcl9kaWN0DQoN Cg0KZGVmIGdlbl9tZXRyaWNzX2RhdGEoIGRhdGFfZGljdCApOg0KICB0ZW1wX2xpc3QgPSBbXQ0K ICAjDQogICMgRm9yIGV2ZXJ5IGVudHJ5IGluIHRoZSBkaWN0aW9uYXJ5DQogICMgRWFjaCBrZXkg YmVpbmcgYSBkaWZmZXJlbnQgVXNlcg0KICBmb3Igc3R1ZmYgaW4gZGF0YV9kaWN0LmtleXMoKToN CiAgICAgIw0KICAgICAjIExldHMgc3RhcnQgd3JpdGluZyBvdXIgcmVwb3J0IGRhdGENCiAgICAg c3lzLnN0ZG91dC53cml0ZSggJ1xuXG5Vc2VyIC0tPiAnICsgc3R1ZmYgICsgJyBNb2RpZmllZCB0 aGUgZm9sbG93aW5nOlxuXG4nICkNCiAgICAgIw0KICAgICAjIGNsZWFudXAgYWZ0ZXIgbGFzdCBw YXNzDQogICAgIHJjc19hZGRzID0gcmNzX2RlbGV0ZXMgPSBjdHhfYWRkcyA9IGN0eF9jaGFuZ2Vz ID0gY3R4X2RlbGV0ZXMgPTANCiAgICAgc3VtX2FkZHMgPSBzdW1fYWRkY2h1bmtzID0gc3VtX2Rl bGV0ZXMgPSBzdW1fZGVsZXRlY2h1bmtzID0gc3VtX2NoYW5nZXMgPSBzdW1fY2hhbmdlY2h1bmtz ID0gc3VtX2V4dHJhID0gMCAgICAgICAgICANCiAgICAgdW5pX2FkZHMgPSB1bmlfZGVsZXRlcyA9 IDANCiAgICAgIyANCiAgICAgIyBDb3B5IHRoZSBsaXN0IG91dCBvZiB0aGUgZGljdGlvbmFyeSBz byBJIGRvbid0IGhhdmUgdG8gDQogICAgICMgdXNlIFtdW11bXQ0KICAgICB0ZW1wX2xpc3QgPSBk YXRhX2RpY3RbIHN0dWZmIF0NCiAgICAgdGVtcF9saXN0LnNvcnQoKQ0KICAgICAjIA0KICAgICAj IFVzZSB0aGlzIHRvIGNvbGxlY3QgdGhlIGNoYW5nZWxpc3RzIHRoaXMgdXNlciBoYXMgc3VibWl0 dGVkDQogICAgIGNoTnVtYmVyc19kaWN0ID0ge30NCiAgICAgIw0KICAgICAjIEZvciBldmVyeSBm aWxlIGluIHRoZSBsaXN0IGF0dGFjaGVkIHRvIHRoZSB1bmlxdWUgdXNlcg0KICAgICBmb3IganVu ayBpbiB0ZW1wX2xpc3Q6DQogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICdcdCcgKyBqdW5rWzBd ICsgJyAtICcgKyBqdW5rWzFdICsgJyAtICcgKyBqdW5rWzJdICsgJyAtICcgKyBqdW5rWzNdICsg J1xuJyApDQogICAgICAgICMNCiAgICAgICAgIyBVc2UgdGhlIEtleUVycm9yIGV4Y2VwdGlvbiB0 byBhZGQga2V5cyB0aGF0IGFyZSBtaXNzaW5nDQogICAgICAgICMgdGhlIGRpY3Rpb25hcnkgaXMg anVzdCBiZWluZyB1c2VkIGFzIGEgZ2lhbiBjb2xsYXRvciB0byByZW1vdmUgZHVwbGljYXRlcw0K ICAgICAgICB0cnk6DQogICAgICAgICAgICBjaE51bWJlcnNfZGljdFsgYGp1bmtbM11gIF0gPSBq dW5rWzNdDQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgIGNoTnVtYmVyc19k aWN0WyBganVua1szXWAgXSA9IGp1bmtbM10NCg0KICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnXG5c dEFuZCBzdWJtaXR0ZWQgdGhlc2UgY2hhbmdlbGlzdHNcblx0JyApDQogICAgIGZvciB1c2VyQ2hh bmdlTnVtYmVyIGluIGNoTnVtYmVyc19kaWN0LmtleXMoKToNCiAgICAgICAgc3lzLnN0ZG91dC53 cml0ZSggY2hOdW1iZXJzX2RpY3RbIHVzZXJDaGFuZ2VOdW1iZXIgXSArICcgJyApDQoNCiAgICAg Zm9yIGp1bmsgaW4gdGVtcF9saXN0Og0KICAgICAgICAjc3lzLnN0ZG91dC53cml0ZSggJ1x0JyAr IGp1bmtbMF0gKyAnIC0gJyArIGp1bmtbMV0gKyAnIC0gJyArIGp1bmtbMl0gKyAnXG4nICkNCiAg ICAgICAgIw0KICAgICAgICAjIFRoaXMgZmlsZSBoYWQgYSByZXYgdGhhdCBjYW4gYmUgZGlmZmVk IChhcyBldmlkZW5jZWQgYnkgdGhlIGVkaXQpDQogICAgICAgIGlmIGp1bmtbMl0gPT0gJ2VkaXQn Og0KICAgICAgICAgICByZXZfbnVtYmVyMSA9IGludCgganVua1sxXSApDQogICAgICAgICAgICMg VGhlIGltcGxpY2F0aW9uIGhlcmUgaXMgdGhhdCBpbiBhbnkgY2hhbmdlbGlzdCB5b3VyIG9ubHkg c3VibWl0dGluZyB0aGUgbmV4dCByZXYNCiAgICAgICAgICAgcmV2X251bWJlcjIgPSByZXZfbnVt YmVyMSAtIDENCiAgICAgICAgICAgKCBhZGRzLCBkZWxldGVzICkgPSBleHRyYWN0X21ldHJpY3Nf Y291bnRzX3Jjc19maWxldG9maWxlKCBqdW5rWzBdICsgJyMnICsgYHJldl9udW1iZXIyYCwganVu a1swXSArICcjJyArIGByZXZfbnVtYmVyMWAgKQ0KICAgICAgICAgICByY3NfYWRkcyAgICA9IHJj c19hZGRzICsgYWRkcw0KICAgICAgICAgICByY3NfZGVsZXRlcyA9IHJjc19kZWxldGVzICsgZGVs ZXRlcw0KICAgICAgICAgICAoIGFkZHMsIGNoYW5nZXMsIGRlbGV0ZXMpID0gZXh0cmFjdF9tZXRy aWNzX2NvdW50c19jb250ZXh0X2ZpbGV0b2ZpbGUoIGp1bmtbMF0gKyAnIycgKyBgcmV2X251bWJl cjJgLCBqdW5rWzBdICsgJyMnICsgYHJldl9udW1iZXIxYCApDQogICAgICAgICAgIGN0eF9hZGRz ICAgID0gY3R4X2FkZHMgKyBhZGRzDQogICAgICAgICAgIGN0eF9jaGFuZ2VzID0gY3R4X2NoYW5n ZXMgKyBjaGFuZ2VzIA0KICAgICAgICAgICBjdHhfZGVsZXRlcyA9IGN0eF9kZWxldGVzICsgZGVs ZXRlcw0KICAgICAgICAgICAoIGFkZHMsIGFkZGNodW5rcywgZGVsZXRlcywgZGVsZXRlY2h1bmtz LCBjaGFuZ2VzLCBjaGFuZ2VjaHVua3MsIGV4dHJhICkgPSBleHRyYWN0X21ldHJpY3NfY291bnRz X3N1bW1hcnlfZmlsZXRvZmlsZSgganVua1swXSArICcjJyArIGByZXZfbnVtYmVyMmAsIGp1bmtb MF0gKyAnIycgKyBgcmV2X251bWJlcjFgICkNCiAgICAgICAgICAgc3VtX2FkZHMgICAgICAgICAg ID0gc3VtX2FkZHMgICAgICAgICAgKyBhZGRzDQogICAgICAgICAgIHN1bV9hZGRjaHVua3MgICAg ICA9IHN1bV9hZGRjaHVua3MgICAgICsgYWRkY2h1bmtzDQogICAgICAgICAgIHN1bV9kZWxldGVz ICAgICAgICA9IHN1bV9kZWxldGVzICAgICAgICsgZGVsZXRlcw0KICAgICAgICAgICBzdW1fZGVs ZXRlY2h1bmtzICAgPSBzdW1fZGVsZXRlY2h1bmtzICArIGRlbGV0ZWNodW5rcw0KICAgICAgICAg ICBzdW1fY2hhbmdlcyAgICAgICAgPSBzdW1fY2hhbmdlcyAgICAgICArIGNoYW5nZXMNCiAgICAg ICAgICAgc3VtX2NoYW5nZWNodW5rcyAgID0gc3VtX2NoYW5nZWNodW5rcyAgKyBjaGFuZ2VjaHVu a3MNCiAgICAgICAgICAgc3VtX2V4dHJhICAgICAgICAgID0gc3VtX2V4dHJhICAgICAgICAgKyBl eHRyYSAgICAgICANCiAgICAgICAgICAgKCBhZGRzLCBkZWxldGVzKSA9IGV4dHJhY3RfbWV0cmlj c19jb3VudHNfdW5pZmllZF9maWxldG9maWxlKCBqdW5rWzBdICsgJyMnICsgYHJldl9udW1iZXIy YCwganVua1swXSArICcjJyArIGByZXZfbnVtYmVyMWAgKQ0KICAgICAgICAgICB1bmlfYWRkcyAg ICAgPSB1bmlfYWRkcyAgICAgKyBhZGRzICAgIA0KICAgICAgICAgICB1bmlfZGVsZXRlcyAgPSB1 bmlfZGVsZXRlcyAgKyBkZWxldGVzIA0KICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnXG5cblxuJyAp DQogICAgICMNCiAgICAgIyBQcmludCBvdXQgdGhlIGZpbmFsIHJlcG9ydCBhYm91dCB0aGlzIFVz ZXINCiAgICAgc3lzLnN0ZG91dC53cml0ZSggJ1x0TWV0cmljcyB2aWEgUkNTIGRpZmYgbWV0aG9k ICAgICAgTGluZXMgQWRkZWQgIC0tPiAnICsgYHJjc19hZGRzYCArICdcbicgKQ0KICAgICBzeXMu c3Rkb3V0LndyaXRlKCAnXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lcyBE ZWxldGVkLS0+ICcgKyBgcmNzX2RlbGV0ZXNgICsgJ1xuXG4nICkNCg0KICAgICAjDQogICAgICMN CiAgICAgc3lzLnN0ZG91dC53cml0ZSggJ1x0TWV0cmljcyB2aWEgQ29udGV4dCBkaWZmIG1ldGhv ZCAgTGluZXMgQWRkZWQgIC0tPiAnICsgYGN0eF9hZGRzYCArICdcbicgKQ0KICAgICBzeXMuc3Rk b3V0LndyaXRlKCAnXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lcyBDaGFu Z2VkLS0+ICcgKyBgY3R4X2NoYW5nZXNgICsgJ1xuJyApDQogICAgIHN5cy5zdGRvdXQud3JpdGUo ICdcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVzIERlbGV0ZWQtLT4gJyAr IGBjdHhfZGVsZXRlc2AgKyAnXG5cbicgKQ0KDQogICAgICMNCiAgICAgIw0KICAgICBzeXMuc3Rk b3V0LndyaXRlKCAnXHRNZXRyaWNzIHZpYSBTdW1tYXJ5IGRpZmYgbWV0aG9kICBBZGQgICAgLS0+ ICcgKyBgc3VtX2FkZGNodW5rc2AgKyAnIENodW5rc1xuJyApDQogICAgIHN5cy5zdGRvdXQud3Jp dGUoICdcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyArIGBz dW1fYWRkc2AgKyAnIExpbmVzXG4nICkNCiAgICAgc3lzLnN0ZG91dC53cml0ZSggJ1x0ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlZC0tPiAnICsgYHN1bV9kZWxldGVjaHVu a3NgICsgJyBDaHVua3NcbicgKQ0KICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnXHQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgKyBgc3VtX2RlbGV0ZWNodW5rc2Ag KyAnIExpbmVzXG4nICkNCiAgICAgc3lzLnN0ZG91dC53cml0ZSggJ1x0ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgQ2hhbmdlZC0tPiAnICsgYHN1bV9jaGFuZ2VjaHVua3NgICsgJyBD aHVua3NcbicgKQ0KICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnXHQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICcgKyBgc3VtX2NoYW5nZXNgICsgJyAvICcgKyBgc3Vt X2V4dHJhYCArICcgTGluZXNcblxuJyApDQoNCiAgICAgIw0KICAgICAjDQogICAgIHN5cy5zdGRv dXQud3JpdGUoICdcdE1ldHJpY3MgdmlhIFVuaWZpZWQgZGlmZiBtZXRob2QgIExpbmVzIEFkZGVk ICAtLT4gJyArIGB1bmlfYWRkc2AgKyAnXG4nICkNCiAgICAgc3lzLnN0ZG91dC53cml0ZSggJ1x0 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZXMgRGVsZXRlZC0tPiAnICsgYHVu aV9kZWxldGVzYCArICdcblxuJyApDQoNCg0KDQoNCiMgTWFpbiBib2R5IG9mIHByb2dyYW0gDQoj DQojDQpkZXBvdF9sb2NhdGlvbiA9IHN5cy5hcmd2WzFdICAgICAgICAgICAgICANCmRpZmZfbGFi ZWwxID0gc3lzLmFyZ3ZbMl0NCmRpZmZfbGFiZWwyID0gc3lzLmFyZ3ZbM10NCg0Kc3lzLnN0ZG91 dC53cml0ZSggJ1N0YXJ0aW5nIHByb2Nlc3NpbmcuLi4uXG5cbicgKQ0KDQojIGNhbGwgdGhlIGRp ZmYgd2l0aCB0aGUgc3VtbWFyeSBmbGFncw0KIw0KIw0KIyBmeWkNCnN5cy5zdGRvdXQud3JpdGUo J1N0YXJ0IHBvaW50ICAnICsgZGlmZl9sYWJlbDEgKyAnICBFbmQgUG9pbnQgICcgKyBkaWZmX2xh YmVsMiArICdcbicgKQ0Kc3lzLnN0ZG91dC53cml0ZSgnRGVwb3QgUmFuZ2UgJyArIGRlcG90X2xv Y2F0aW9uICsgJ1xuXG4nICkNCg0KY2hhbmdlbGlzdF9udW1iZXJzID0gZXh0cmFjdF9jaGFuZ2Vf bnVtYmVycyggZGVwb3RfbG9jYXRpb24sIGRpZmZfbGFiZWwxLCBkaWZmX2xhYmVsMiApDQpkYXRh X2RpY3QgPSBnZW5fY2hhbmdlX2RhdGEoIGNoYW5nZWxpc3RfbnVtYmVycyApDQpnZW5fbWV0cmlj c19kYXRhKCBkYXRhX2RpY3QgKQ0KDQoNCg0KDQo=
---0__=Kd0d0xGdnOvYiEwaatgReoF8TMFnzafgFRQZcQ5inLA0x2ktv414ftIt--




