Hi Doug and Binoy: Andrew Miller is using the JavaCC with Demeter/Java using his own *.jj file. This works fine, except: he cannot parse function and argument definitions unless they begin with a capital letter? The *.jj file is in: /proj/adaptive/www/DemeterJava/faq/JavaCC I was looking for TOKEN and ID and did not find a definition which forces identifiers to start with a capital letter. Please can you figure it out. This is part of a C++ to COM project. -- Karl From amiller@xis.xerox.com Sat Jun 6 11:25:44 1998 Received: from alpha.xerox.com (firewall-user@alpha.Xerox.COM [13.1.64.93]) by amber.ccs.neu.edu (8.8.6/8.8.6) with SMTP id LAA13274 for ; Sat, 6 Jun 1998 11:25:35 -0400 (EDT) Received: from terminator.xis.xerox.com ([13.246.76.26]) by alpha.xerox.com with SMTP id <53217(4)>; Sat, 6 Jun 1998 08:25:23 PDT Received: from intergate.xis.xerox.com (intergate.xis.xerox.com [13.246.76.177]) by terminator.xis.xerox.com (8.8.4/8.8.4) with SMTP id LAA22761 for ; Sat, 6 Jun 1998 11:20:38 -0400 (EDT) Received: from ccMail by intergate.xis.xerox.com (IMA Internet Exchange 2.12 Enterprise) id 0006FB4B; Sat, 6 Jun 1998 11:18:47 -0400 Mime-Version: 1.0 Date: Sat, 6 Jun 1998 08:14:22 PDT Message-ID: <0006FB4B.3399@xis.xerox.com> From: amiller@xis.xerox.com (Andrew Miller) To: Karl Lieberherr Subject: JavaCC Content-Type: multipart/mixed; boundary="IMA.Boundary.723641798" Status: RO --IMA.Boundary.723641798 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Description: cc:Mail note part Prof Lieberherr- Attached is the JavaCC grammar I am using for C++. I have also attached a sample C++ header file. Could you please take a look to see if you can figure out why I cannot parse function and argument definitions unless they begin with a capital letter? Thanks- Andrew --IMA.Boundary.723641798 Content-Type: application/octet-stream; name="cimage.h" Content-Transfer-Encoding: base64 Content-Description: Unknown data type Content-Disposition: attachment; filename="cimage.h" LyogbWV0aG9kcyBhbmQgdmFyaWFibGVzIG11c3Qgc3RhcnQgd2l0aCBjYXBsaXRhbCBsZXR0 ZXIgKi8KY2xhc3MgQ1hJbWFnZSANCnsgDQoJcHVibGljOiANCgkJfkNYSW1hZ2UoKTsgDQoJ CUNYSW1hZ2UoKTsgDQoNCiAgICAgICAgdm9pZCBHZXRTaXplKGludCogV2lkdGgsIGludCog SGVpZ2h0KTsNCiAgICAgICAgdm9pZCBHZXRQb3NpdGlvbihpbnQqIFgsIGludCogWSk7DQog ICAgICAgIA0KICAgICAgICBpbnQgUm90YXRlKGludCBBbmdsZURlZ3JlZXMpOw0KICAgICAg ICBpbnQgUmVzaXplKGludCBXaWR0aCwgaW50IEhlaWdodCk7DQoNCiAgICAgICAgaW50IExv YWQoY2hhciogRmlsZW5hbWUpOw0KICAgICAgICBpbnQgU2F2ZShjaGFyKiBGaWxlbmFtZSk7 DQoNCglwcml2YXRlOg0KCQlpbnQJbV9uV2lkdGg7DQoJCWludCBtX25IZWlnaHQ7DQoJCWlu dCBtX25YT2Zmc2V0Ow0KCQlpbnQgbV9uWU9mZnNldDsNCn07DQo= --IMA.Boundary.723641798 Content-Type: application/octet-stream; name="cplusp~1.jj" Content-Transfer-Encoding: base64 Content-Description: Unknown data type Content-Disposition: attachment; filename="cplusp~1.jj" LyoqDQogKg0KICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IFN1biBNaWNyb3N5c3RlbXMg SW5jLg0KICoNCiAqIFVzZSBvZiB0aGlzIGZpbGUgYW5kIHRoZSBzeXN0ZW0gaXQgaXMgcGFy dCBvZiBpcyBjb25zdHJhaW5lZCBieSB0aGUNCiAqIGZpbGUgQ09QWVJJR0hUIGluIHRoZSBy b290IGRpcmVjdG9yeSBvZiB0aGlzIHN5c3RlbS4gIFlvdSBtYXksIGhvd2V2ZXIsDQogKiBt YWtlIGFueSBtb2RpZmljYXRpb25zIHlvdSB3aXNoIHRvIHRoaXMgZmlsZS4NCiAqDQogKiBB dXRob3I6IFNyZWVuaXZhc2EgVmlzd2FuYWRoYQ0KICogRGF0ZTogMy8yMC85Nw0KICoNCiAq IFRoaXMgZmlsZSBjb250YWlucyBhIEphdmEgZ3JhbW1hciBhbmQgYWN0aW9ucyB0aGF0IGlt cGxlbWVudCBhIGZyb250LWVuZC4NCiAqDQogKg0KICogRGVyaXZlZCBpbiBwYXJ0IGZyb20g dGhlIGZvbGxvd2luZyB3b3JrOg0KICoNCiAqIFBVQkxJQyBET01BSU4gUENDVFMtQkFTRUQg QysrIEdSQU1NQVIgKGNwbHVzcGx1cy5nLCBzdGF0LmcsIGV4cHIuZykNCiAqDQogKiBBdXRo b3JzOiBTdW1hbmEgU3Jpbml2YXNhbiwgTmVYVCBJbmMuOyAgICAgICAgICAgIHN1bWFuYV9z cmluaXZhc2FuQG5leHQuY29tDQogKiAgICAgICAgICBUZXJlbmNlIFBhcnIsIFBhcnIgUmVz ZWFyY2ggQ29ycG9yYXRpb247IHBhcnJ0QHBhcnItcmVzZWFyY2guY29tDQogKiAgICAgICAg ICBSdXNzZWxsIFF1b25nLCBQdXJkdWUgVW5pdmVyc2l0eTsgICAgICAgIHF1b25nQGVjbi5w dXJkdWUuZWR1DQogKg0KICogVkVSU0lPTiAxLjENCiAqDQogKi8NCg0KUEFSU0VSX0JFR0lO KENQUFBhcnNlcikNCg0KDQpwdWJsaWMgZmluYWwgY2xhc3MgQ1BQUGFyc2VyIHsNCg0KICBw cml2YXRlIHN0YXRpYyBTdHJpbmcgdmVycyA9ICIwLjEiOw0KICBwcml2YXRlIHN0YXRpYyBT dHJpbmcgaWQgPSAiQysrIFBhcnNlciI7DQoNCiAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtc2co U3RyaW5nIHMpIHsNCiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpZCArICIgVmVyc2lvbiAi ICsgdmVycyArIjogIiArIHMpOw0KICB9DQoNCiAgcHVibGljIHN0YXRpYyBDUFBQcm9ncmFt IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7 DQogICAgICBDUFBQYXJzZXIgcGFyc2VyOw0KICAgICAgQ1BQUHJvZ3JhbSBwcm9nID0gbnVs bDsNCiAgICAgIHRyeSANCiAgICAgIHsNCiAgICAgICAgICBwYXJzZXIgPSBuZXcgQ1BQUGFy c2VyKGluKTsNCiAgICAgICAgICBwcm9nID0gbmV3IENQUFByb2dyYW0ocGFyc2VyLnRyYW5z bGF0aW9uX3VuaXQoKSk7DQogICAgICAgICAgbXNnKCJQcm9ncmFtIHBhcnNlZCBzdWNjZXNz ZnVsbHkuIik7DQogICAgICB9IA0KICAgICAgICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBl KSB7DQogICAgICAgICAgICBwcm9nID0gbnVsbDsNCiAgICAgICAgICAgIG1zZyhlLmdldE1l c3NhZ2UoKSk7DQogICAgICB9DQogICAgICByZXR1cm4gcHJvZzsNCiAgfQ0KDQogIHB1Ymxp YyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCiAgICBDUFBQYXJzZXIgcGFy c2VyOw0KICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQ7DQoNCiAgICBpbnQgYWkgPSAw Ow0KDQogICAgaWYgKGFpID09IChhcmdzLmxlbmd0aC0xKSkgew0KICAgICAgbXNnKCJSZWFk aW5nIGZyb20gZmlsZSAiICsgYXJnc1thaV0gKyAiIC4gLiAuIik7DQogICAgICB0cnkgew0K ICAgICAgICBpbnB1dCA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShhcmdzW2FpXSk7 DQogICAgICB9IGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQog ICAgICAgIG1zZygiRmlsZSAiICsgYXJnc1swXSArICIgbm90IGZvdW5kLiIpOw0KICAgICAg ICByZXR1cm47DQogICAgICB9DQogICAgfSBlbHNlIGlmIChhaSA+PSBhcmdzLmxlbmd0aCkg ew0KICAgICAgbXNnKCJSZWFkaW5nIGZyb20gc3RhbmRhcmQgaW5wdXQgLiAuIC4iKTsNCiAg ICAgIGlucHV0ID0gU3lzdGVtLmluOw0KICAgIH0gZWxzZSB7DQogICAgICBtc2coIlVzYWdl OiBqYXZhICIgKyBpZCArICIgWy1kXSBbaW5wdXRmaWxlXSIpOw0KICAgICAgcmV0dXJuOw0K ICAgIH0NCg0KICAgIHRyeSB7DQogICAgICBwYXJzZXIgPSBuZXcgQ1BQUGFyc2VyKGlucHV0 KTsNCiAgICAgIHBhcnNlci50cmFuc2xhdGlvbl91bml0KCk7DQogICAgICBtc2coIlByb2dy YW0gcGFyc2VkIHN1Y2Nlc3NmdWxseS4iKTsNCiAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlv biBlKSB7DQogICAgICBtc2coZS5nZXRNZXNzYWdlKCkpOw0KICAgIH0NCiAgfQ0KDQogIC8q Kg0KICAgKiBBIHN5bWJvbCB0YWJsZSBtYW5hZ2VyIG9iamVjdC4gQ3VycmVudGx5IG9ubHkg dHlwZXMgYXJlIHJlY29yZGVkIGZvcg0KICAgKiBkb2luZyBzZW1hbnRpYyBwcmVkaWNhdGVz IGZvciBwYXJzaW5nLg0KICAgKi8NCiAgc3RhdGljIFN5bXRhYk1hbmFnZXIgc3ltOw0KDQog IC8qDQogICAqIE1ldGhvZHMgdXNlZCBpbiBzZW1hbnRpY3MgcHJlZGljYXRlcy4NCiAgICov DQoNCiAgLyoqDQogICAqIFJlYWRzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgKHNpbmNlIGl0 IGlzIHVzZWQgZHVyaW5nIGxvb2thaGVhZCwgd2UgDQogICAqIGNhbm5vdCB1c2UgdG9rZW4u IFdlIGhhdmUgdG8gZXhwbGljaXRseSB1c2UgZ2V0VG9rZW4pLg0KICAgKi8NCiAgc3RhdGlj IFN0cmluZyBHZXRGdWxseVNjb3BlZE5hbWUoKQ0KICB7DQogICAgIFRva2VuIHQgPSBnZXRU b2tlbigxKTsNCg0KICAgICBpZiAodC5raW5kICE9IElEICYmIHQua2luZCAhPSBTQ09QRSkN CiAgICAgICAgcmV0dXJuIG51bGw7DQoNCiAgICAgU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3Ry aW5nQnVmZmVyKCk7DQoNCiAgICAgaW50IGk7DQogICAgIGlmICh0LmtpbmQgIT0gU0NPUEUp DQogICAgIHsNCiAgICAgICAgcy5hcHBlbmQodC5pbWFnZSk7DQogICAgICAgIHQgPSBnZXRU b2tlbigyKTsNCiAgICAgICAgaSA9IDM7DQogICAgIH0NCiAgICAgZWxzZSANCiAgICAgICAg aSA9IDI7DQoNCiAgICAgd2hpbGUgKHQua2luZCA9PSBTQ09QRSkNCiAgICAgew0KICAgICAg ICBzLmFwcGVuZCh0LmltYWdlKTsNCiAgICAgICAgcy5hcHBlbmQoKHQgPSBnZXRUb2tlbihp KyspKS5pbWFnZSk7DQogICAgICAgIHQgPSBnZXRUb2tlbihpKyspOw0KICAgICB9DQoNCiAg ICAgcmV0dXJuIHMudG9TdHJpbmcoKTsNCiAgfQ0KDQogIC8qKg0KICAgKiBUaGlzIG1ldGhv ZCBmaXJzdCB0cmllcyB0byByZWFkIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIG9mIHRoZSBmb3Jt IA0KICAgKiAgICAgICAgICAgICAoIjo6Iik/IDxJRD4gKCI6OiIgPElEPikqIA0KICAgKiBh bmQgaWYgaXQgc3VjY2VlZHMgdGhlbiBhc2tzIHRoZSBzeW1ib2wgdGFibGUgbWFuYWdlciAg aWYgdGhpcyBpcw0KICAgKiB0aGUgbmFtZSBvZiBhIGNvbnN0cnVjdG9yLg0KICAgKi8NCiAg c3RhdGljIGJvb2xlYW4gSXNDdG9yKCkNCiAgew0KICAgICAgcmV0dXJuIHN5bS5Jc0N0b3Io R2V0RnVsbHlTY29wZWROYW1lKCkpOw0KICB9DQp9DQoNClBBUlNFUl9FTkQoQ1BQUGFyc2Vy KQ0KDQpUT0tFTl9NR1JfREVDTFMgOg0Kew0KICAgc3RhdGljIGludCBiZWdpbkxpbmU7DQog ICBzdGF0aWMgaW50IGJlZ2luQ29sOw0KICAgc3RhdGljIGJvb2xlYW4gbGluZURpcmVjdGl2 ZSA9IGZhbHNlOw0KDQogICBzdGF0aWMgdm9pZCByZXNldEJlZ2luTGluZUNvbCgpDQogICB7 DQogICB9DQp9DQoNClNLSVAgOg0Kew0KICAiICINCnwNCiAgIlx0Ig0KfA0KICAiXG4iDQp8 DQogICJcciINCnwNCiAgIi8vIiA6IElOX0xJTkVfQ09NTUVOVA0KfA0KICAiLyoiIDogSU5f Q09NTUVOVA0KfA0KICA8ICIjIiAoWyIgIiwgIlx0Il0pKiAibGluZSIgPiA6IExJTkVfTlVN QkVSDQp8DQogIDwgIiMiIChbIiAiLCAiXHQiXSkqIFsiMCItIjkiXSA+IHsgaW5wdXRfc3Ry ZWFtLmJhY2t1cCgxKTsgfSA6IExJTkVfTlVNQkVSDQp8DQogICIjIiA6IFBSRVBST0NFU1NP Ul9PVVRQVVQNCn0NCg0KPExJTkVfTlVNQkVSPiBTS0lQOg0Kew0KICAgPCAoWyIwIi0iOSJd KSsgPg0KICAgew0KICAgICB0cnkNCiAgICAgew0KICAgICAgICBiZWdpbkxpbmUgPSBJbnRl Z2VyLnBhcnNlSW50KGltYWdlLnRvU3RyaW5nKCkpOw0KICAgICB9DQogICAgIGNhdGNoKE51 bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7IH0gLy8gV2lsbCBuZXZlciBjb21lIGhlcmUuDQog ICB9IDogTElORV9ESVJFQ1RJVkUNCn0NCg0KPExJTkVfRElSRUNUSVZFPiBTS0lQOg0Kew0K ICAiXG4iIDogQUZURVJfTElORV9ESVJFQ1RJVkUNCnwNCiAgPH5bXT4NCn0NCg0KPEFGVEVS X0xJTkVfRElSRUNUSVZFPiBTS0lQOg0Kew0KICAgICAgDQogIDx+W10+DQogIHsNCiAgICAg aW5wdXRfc3RyZWFtLmFkanVzdEJlZ2luTGluZUNvbHVtbihiZWdpbkxpbmUsIDEpOw0KICAg ICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOw0KICB9IDogREVGQVVMVA0KfQ0KDQo8SU5fTElO RV9DT01NRU5UPiBTS0lQOg0Kew0KICAgIlxuIiA6IERFRkFVTFQNCn0NCg0KPElOX0xJTkVf Q09NTUVOVD4gTU9SRToNCnsNCiAgPCB+W10gPg0KfQ0KDQo8SU5fQ09NTUVOVD4gU0tJUDoN CnsNCiAgICIqLyIgOiBERUZBVUxUDQp9DQoNCjxJTl9DT01NRU5UPiBNT1JFOg0Kew0KICA8 IH5bXSA+DQp9DQoNCjxQUkVQUk9DRVNTT1JfT1VUUFVUPiBTS0lQOg0Kew0KICAgIlxuIiA6 IERFRkFVTFQNCn0NCg0KPFBSRVBST0NFU1NPUl9PVVRQVVQ+IE1PUkU6DQp7DQogIDwgfltd ID4NCn0NCg0KVE9LRU4gOg0Kew0KICA8IExDVVJMWUJSQUNFOiAieyIgPg0KfCA8IFJDVVJM WUJSQUNFOiAifSIgPg0KfCA8IExTUVVBUkVCUkFDS0VUOiAiWyIgPg0KfCA8IFJTUVVBUkVC UkFDS0VUOiAiXSIgPg0KfCA8IExQQVJFTlRIRVNJUzogIigiID4NCnwgPCBSUEFSRU5USEVT SVM6ICIpIiA+DQp8IDwgU0NPUEU6ICI6OiIgPg0KfCA8IENPTE9OOiAiOiIgPg0KfCA8IFNF TUlDT0xPTjogIjsiID4NCnwgPCBDT01NQTogIiwiID4NCnwgPCBRVUVTVElPTk1BUks6ICI/ IiA+DQp8IDwgRUxMSVBTSVM6ICIuLi4iID4NCnwgPCBBU1NJR05FUVVBTDogIj0iID4NCnwg PCBUSU1FU0VRVUFMOiAiKj0iID4NCnwgPCBESVZJREVFUVVBTDogIi89IiA+DQp8IDwgTU9E RVFVQUw6ICIlPSIgPg0KfCA8IFBMVVNFUVVBTDogIis9IiA+DQp8IDwgTUlOVVNFUVVBTDog Ii09IiA+DQp8IDwgU0hJRlRMRUZURVFVQUw6ICI8PD0iID4NCnwgPCBTSElGVFJJR0hURVFV QUw6ICI+Pj0iID4NCnwgPCBCSVRXSVNFQU5ERVFVQUw6ICImPSIgPg0KfCA8IEJJVFdJU0VY T1JFUVVBTDogIl49IiA+DQp8IDwgQklUV0lTRU9SRVFVQUw6ICJ8PSIgPg0KfCA8IE9SOiAi fHwiID4NCnwgPCBBTkQ6ICImJiIgPg0KfCA8IEJJVFdJU0VPUjogInwiID4NCnwgPCBCSVRX SVNFWE9SOiAiXiIgPg0KfCA8IEFNUEVSU0FORDogIiYiID4NCnwgPCBFUVVBTDogIj09IiA+ DQp8IDwgTk9URVFVQUw6ICIhPSIgPg0KfCA8IExFU1NUSEFOOiAiPCIgPg0KfCA8IEdSRUFU RVJUSEFOOiAiPiIgPg0KfCA8IExFU1NUSEFOT1JFUVVBTFRPOiAiPD0iID4NCnwgPCBHUkVB VEVSVEhBTk9SRVFVQUxUTzogIj49IiA+DQp8IDwgU0hJRlRMRUZUOiAiPDwiID4NCnwgPCBT SElGVFJJR0hUOiAiPj4iID4NCnwgPCBQTFVTOiAiKyIgPg0KfCA8IE1JTlVTOiAiLSIgPg0K fCA8IFNUQVI6ICIqIiA+DQp8IDwgRElWSURFOiAiLyIgPg0KfCA8IE1PRDogIiUiID4NCnwg PCBQTFVTUExVUzogIisrIiA+DQp8IDwgTUlOVVNNSU5VUzogIi0tIiA+DQp8IDwgVElMREU6 ICJ+IiA+DQp8IDwgTk9UOiAiISIgPg0KfCA8IERPVDogIi4iID4NCnwgPCBQT0lOVEVSVE86 ICItPiIgPg0KfCA8IERPVFNUQVI6ICIuKiIgPg0KfCA8IEFSUk9XU1RBUjogIi0+KiIgPg0K fCA8IEFVVE86ICJhdXRvIiA+DQp8IDwgQlJFQUs6ICJicmVhayIgPg0KfCA8IENBU0U6ICJj YXNlIiA+DQp8IDwgQ0FUQ0g6ICJjYXRjaCIgPg0KfCA8IENIQVI6ICJjaGFyIiA+DQp8IDwg Q09OU1Q6ICJjb25zdCIgPg0KfCA8IENPTlRJTlVFOiAiY29udGludWUiID4NCnwgPCBfREVG QVVMVDogImRlZmF1bHQiID4NCnwgPCBERUxFVEU6ICJkZWxldGUiID4NCnwgPCBETzogImRv IiA+DQp8IDwgRE9VQkxFOiAiZG91YmxlIiA+DQp8IDwgRUxTRTogImVsc2UiID4NCnwgPCBF TlVNOiAiZW51bSIgPg0KfCA8IEVYVEVSTjogImV4dGVybiIgPg0KfCA8IEZMT0FUOiAiZmxv YXQiID4NCnwgPCBGT1I6ICJmb3IiID4NCnwgPCBGUklFTkQ6ICJmcmllbmQiID4NCnwgPCBH T1RPOiAiZ290byIgPg0KfCA8IElGOiAiaWYiID4NCnwgPCBJTkxJTkU6ICJpbmxpbmUiID4N CnwgPCBJTlQ6ICJpbnQiID4NCnwgPCBMT05HOiAibG9uZyIgPg0KfCA8IE5FVzogIm5ldyIg Pg0KfCA8IFBSSVZBVEU6ICJwcml2YXRlIiA+DQp8IDwgUFJPVEVDVEVEOiAicHJvdGVjdGVk IiA+DQp8IDwgUFVCTElDOiAicHVibGljIiA+DQp8IDwgUkVERUNMQVJFRDogInJlZGVjbGFy ZWQiID4NCnwgPCBSRUdJU1RFUjogInJlZ2lzdGVyIiA+DQp8IDwgUkVUVVJOOiAicmV0dXJu IiA+DQp8IDwgU0hPUlQ6ICJzaG9ydCIgPg0KfCA8IFNJR05FRDogInNpZ25lZCIgPg0KfCA8 IFNJWkVPRjogInNpemVvZiIgPg0KfCA8IFNUQVRJQzogInN0YXRpYyIgPg0KfCA8IFNUUlVD VDogInN0cnVjdCIgPg0KfCA8IENMQVNTIDogImNsYXNzIiA+DQp8IDwgU1dJVENIOiAic3dp dGNoIiA+DQp8IDwgVEVNUExBVEU6ICJ0ZW1wbGF0ZSIgPg0KfCA8IFRISVM6ICJ0aGlzIiA+ DQp8IDwgVFJZOiAidHJ5IiA+DQp8IDwgVFlQRURFRjogInR5cGVkZWYiID4NCnwgPCBVTklP TjogInVuaW9uIiA+DQp8IDwgVU5TSUdORUQ6ICJ1bnNpZ25lZCIgPg0KfCA8IFZJUlRVQUw6 ICJ2aXJ0dWFsIiA+DQp8IDwgVk9JRDogInZvaWQiID4NCnwgPCBWT0xBVElMRTogInZvbGF0 aWxlIiA+DQp8IDwgV0hJTEU6ICJ3aGlsZSIgPg0KfCA8IE9QRVJBVE9SOiAib3BlcmF0b3Ii ID4NCnwgPCBUUlVFVE9LOiAidHJ1ZSIgPg0KfCA8IEZBTFNFVE9LOiAiZmFsc2UiID4NCnwg PCBUSFJPVzogInRocm93IiA+DQp9DQoNClRPS0VOIFtJR05PUkVfQ0FTRV0gOg0Kew0KICA8 ICBPQ1RBTElOVCA6ICIwIiAoWyIwIi0iNyJdKSogPg0KfCA8ICBPQ1RBTExPTkcgOiA8T0NU QUxJTlQ+ICJsIiA+DQp8IDwgIFVOU0lHTkVEX09DVEFMSU5UIDogPE9DVEFMSU5UPiAidSIg Pg0KfCA8ICBVTlNJR05FRF9PQ1RBTExPTkcgOiA8T0NUQUxJTlQ+ICgidWwiIHwgImx1Iikg Pg0KDQp8IDwgIERFQ0lNQUxJTlQgOiBbIjEiLSI5Il0gKFsiMCItIjkiXSkqID4NCnwgPCAg REVDSU1BTExPTkcgOiA8REVDSU1BTElOVD4gWyJ1IiwibCJdID4NCnwgPCAgVU5TSUdORURf REVDSU1BTElOVCA6IDxERUNJTUFMSU5UPiAidSIgPg0KfCA8ICBVTlNJR05FRF9ERUNJTUFM TE9ORyA6IDxERUNJTUFMSU5UPiAoInVsIiB8ICJsdSIpID4NCg0KDQp8IDwgIEhFWEFERUNJ TUFMSU5UIDogIjB4IiAoWyIwIi0iOSIsImEiLSJmIl0pKyA+DQp8IDwgIEhFWEFERUNJTUFM TE9ORyA6IDxIRVhBREVDSU1BTElOVD4gKFsidSIsImwiXSk/ID4NCnwgPCAgVU5TSUdORURf SEVYQURFQ0lNQUxJTlQgOiA8SEVYQURFQ0lNQUxJTlQ+ICJ1IiA+DQp8IDwgIFVOU0lHTkVE X0hFWEFERUNJTUFMTE9ORyA6IDxIRVhBREVDSU1BTElOVD4gKCJ1bCIgfCAibHUiKSA+DQoN Cg0KfCA8ICBGTE9BVE9ORSA6ICgoWyIwIi0iOSJdKSsgIi4iIChbIjAiLSI5Il0pKiB8IChb IjAiLSI5Il0pKiAiLiIgKFsiMCItIjkiXSkrKQ0KICAgICAgICAgICAgICAoImUiIChbIi0i LCIrIl0pPyAoWyIwIi0iOSJdKSspPyAoWyJmIiwibCJdKT8gPg0KDQp8IDwgIEZMT0FUVFdP IDogKFsiMCItIjkiXSkrICJlIiAoWyItIiwiKyJdKT8gIChbIjAiLSI5Il0pKyAoWyJmIiwi bCJdKT8gPg0KfQ0KDQpUT0tFTiA6DQp7DQoNCiAgPCAgQ0hBUkFDVEVSIDogKCJMIik/ICIn Ig0KICAgKCAgICh+WyInIiwiXFwiLCJcbiIsIlxyIl0pDQogICB8ICgiXFwiICgNCiAgICAg ICAgICAgICBbIm4iLCJ0IiwidiIsImIiLCJyIiwiZiIsImEiLCJcXCIsIj8iLCInIiwiXCIi XQ0KICAgICAgICAgICAgfA0KICAgICAgICAgICAgICIwIiAoWyIwIi0iNyJdKSoNCiAgICAg ICAgICAgIHwNCiAgICAgICAgICAgICBbIjEiLSI5Il0gKFsiMCItIjkiXSkqDQogICAgICAg ICAgICB8DQogICAgICAgICAgICAgKCIweCIgfCAiMFgiKSAoWyIwIi0iOSIsImEiLSJmIiwi QSItIkYiXSkrDQogICAgICAgICAgICkNCiAgICAgKQ0KICAgKQ0KICAgIiciID4NCg0KfCA8 ICBTVFJJTkcgOiAoIkwiKT8gIlwiIg0KICAgKCAoIH5bIlwiIiwiXFwiLCJcbiIsIlxyIl0p DQogICB8ICgiXFwiICgNCiAgICAgICAgICAgICBbIm4iLCJ0IiwidiIsImIiLCJyIiwiZiIs ImEiLCJcXCIsIj8iLCInIiwiXCIiXQ0KICAgICAgICAgICAgfA0KICAgICAgICAgICAgICIw IiAoWyIwIi0iNyJdKSoNCiAgICAgICAgICAgIHwNCiAgICAgICAgICAgICBbIjEiLSI5Il0g KFsiMCItIjkiXSkqDQogICAgICAgICAgICB8DQogICAgICAgICAgICAgKCIweCIgfCAiMFgi KSAoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSkrDQogICAgICAgICAgICkNCiAgICAgKQ0K ICAgKSoNCiAgICJcIiIgPg0KfQ0KDQpUcmFuc2xhdGlvblVuaXQgdHJhbnNsYXRpb25fdW5p dCgpIDoNCnsNCiAgICBUcmFuc2xhdGlvblVuaXQgdHJhbnMgPSBuZXcgVHJhbnNsYXRpb25V bml0KCk7DQogICAgRXh0ZXJuYWxEZWNsYXJhdGlvbl9OUExpc3QgbGlzdCA9IG5ldyBFeHRl cm5hbERlY2xhcmF0aW9uX05QTGlzdCgpOw0KICAgIEV4dGVybmFsRGVjbGFyYXRpb24gZWQg PSBudWxsOw0KfQ0Kew0KICAgeyBzeW0uT3BlblNjb3BlKG51bGwsIGZhbHNlKTsgfQ0KICAg KCBMT09LQUhFQUQoMikgZWQ9ZXh0ZXJuYWxfZGVjbGFyYXRpb24oKSANCiAgIHsgDQogICAg IGlmKGVkICE9IG51bGwpDQogICAgIHsNCiAgICAgICAgbGlzdC5hZGRFbGVtZW50KGVkKTsN CiAgICAgfSANCiAgIH0NCiAgICkqIDxFT0Y+DQogICB7IA0KICAgICBzeW0uQ2xvc2VTY29w ZSgpOyANCiAgICAgdHJhbnMuc2V0X2V4dGVybmFsZGVjbGFyYXRpb25fbnBsaXN0KGxpc3Qp Ow0KICAgICByZXR1cm4gdHJhbnM7DQogICB9DQp9DQoNCkV4dGVybmFsRGVjbGFyYXRpb24g ZXh0ZXJuYWxfZGVjbGFyYXRpb24oKSA6DQp7IA0KICAgIEV4dGVybmFsRGVjbGFyYXRpb24g ZWQgPSBudWxsOw0KICAgIERlY2xhcmF0aW9uIGRlY2wgPSBudWxsOw0KICAgIERlY2xhcmF0 aW9uU3BlY2lmaWVycyBkZWNsc3BlYyA9IG51bGw7DQp9DQp7DQogICAoDQogICAgTE9PS0FI RUFEKCgidHlwZWRlZiIgfCB0ZW1wbGF0ZV9oZWFkKCkpPyBjbGFzc19oZWFkKCkgICJ7IikN CiAgICAgICAoIHRlbXBsYXRlX2hlYWQoKSApPyBkZWNsID0gZGVjbGFyYXRpb24oKQ0KICAg fA0KICAgIExPT0tBSEVBRCgiZW51bSIgKDxJRD4pPyAieyIpDQogICAgICAgZW51bV9zcGVj aWZpZXIoKSAoaW5pdF9kZWNsYXJhdG9yX2xpc3QoZmFsc2UpKT8gICI7Ig0KICAgfA0KICAg IExPT0tBSEVBRCAoKHRlbXBsYXRlX2hlYWQoKSk/IGR0b3JfY3Rvcl9kZWNsX3NwZWMoKQ0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b3JfZGVjbGFyYXRvcigpICJ7IikN CiAgICAgICBkdG9yX2RlZmluaXRpb24oKQ0KICAgfA0KICAgIExPT0tBSEVBRChkdG9yX2N0 b3JfZGVjbF9zcGVjKCkgY3Rvcl9kZWNsYXJhdG9yX2xvb2thaGVhZCgpKQ0KICAgICAgIGN0 b3JfZGVmaW5pdGlvbigpDQoNCiAgIHwNCiAgICBMT09LQUhFQUQoKGRlY2xhcmF0aW9uX3Nw ZWNpZmllcnMoKSk/ICBmdW5jdGlvbl9kZWNsYXJhdG9yX2xvb2thaGVhZCgpKQ0KICAgICAg IGZ1bmN0aW9uX2RlZmluaXRpb24oKQ0KDQogICB8DQogICAgTE9PS0FIRUFEKChzY29wZV9v dmVycmlkZSgpKT8gIm9wZXJhdG9yIikNCiAgICAgICAgIGNvbnZlcnNpb25fZnVuY3Rpb25f ZGVjbF9vcl9kZWYoKQ0KICAgfA0KICAgIHRlbXBsYXRlX2hlYWQoKQ0KICAgICAgKA0KICAg ICAgICBMT09LQUhFQUQoZHRvcl9jdG9yX2RlY2xfc3BlYygpIGN0b3JfZGVjbGFyYXRvcl9s b29rYWhlYWQoKSkNCiAgICAgICAgICAgY3Rvcl9kZWZpbml0aW9uKCkNCiAgICAgIHwNCiAg ICAgICAgTE9PS0FIRUFEKChkZWNsYXJhdGlvbl9zcGVjaWZpZXJzKCkpPyAgZnVuY3Rpb25f ZGVjbGFyYXRvcl9sb29rYWhlYWQoKSkNCiAgICAgICAgICAgZnVuY3Rpb25fZGVmaW5pdGlv bigpDQogICAgICB8DQogICAgICAgIGRlY2xzcGVjID0gZGVjbGFyYXRpb25fc3BlY2lmaWVy cygpDQogICAgICAgICAgICAgICAoaW5pdF9kZWNsYXJhdG9yX2xpc3QoZGVjbHNwZWMuZ2V0 X2lzVHlwZURlZigpKSk/ICAiOyINCiAgICAgICkNCiAgIHwNCiAgICBkZWNsID0gZGVjbGFy YXRpb24oKQ0KICAgfA0KICAgICI7Ig0KICAgKQ0Kew0KICAgIGlmKGRlY2wgIT0gbnVsbCkN CiAgICB7DQogICAgICAgIGVkID0gbmV3IEV4dGVybmFsRGVjbGFyYXRpb24oZGVjbCk7DQog ICAgfQ0KICAgIHJldHVybiBlZDsNCn0NCg0KfQ0KDQpGdW5jdGlvbkRlZmluaXRpb24gZnVu Y3Rpb25fZGVmaW5pdGlvbigpIDoNCnsNCiAgIC8vIFNjb3BlIHNjID0gbnVsbDsNCiAgIERl Y2xhcmF0aW9uU3BlY2lmaWVycyBkZWNsc3BlYyA9IG51bGw7DQogICBGdW5jdGlvbkRlZmlu aXRpb24gZnVuY2RlZiA9IG5ldyBGdW5jdGlvbkRlZmluaXRpb24oKTsNCg0KfQ0Kew0KCSgg IA0KICAgIExPT0tBSEVBRCgzKSBkZWNsc3BlYyA9IGRlY2xhcmF0aW9uX3NwZWNpZmllcnMo KQ0KICAgICAgICBmdW5jZGVmID0gZnVuY3Rpb25fZGVjbGFyYXRvcihkZWNsc3BlYy5nZXRf aXNUeXBlRGVmKCkpIGZ1bmNfZGVjbF9kZWYoZnVuY2RlZi5nZXRfc2NvcGUoKSkNCgl7DQog ICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICAgICAgZnVuY2RlZi5zZXRfcmV0 dXJudHlwZShuZXcgUmV0dXJuVHlwZSgoQnVpbHRJblR5cGVTcGVjaWZpZXIpZGVjbHNwZWMp KTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZSkNCiAg ICAgICAgew0KICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBubyB0eXBlIHNwZWNp ZmllZCwgZGVmYXVsdCBpcyBpbnRlZ2VyDQogICAgICAgICAgICAgICAgZnVuY2RlZi5zZXRf cmV0dXJudHlwZShuZXcgUmV0dXJuVHlwZShuZXcgQnVpbHRJblR5cGVTcGVjaWZpZXIoZmFs c2UsICJpbnQiKSkpOw0KICAgICAgICB9DQoJfQ0KICAgfA0KICAgIGZ1bmNkZWYgPSBmdW5j dGlvbl9kZWNsYXJhdG9yKGZhbHNlKSBmdW5jX2RlY2xfZGVmKGZ1bmNkZWYuZ2V0X3Njb3Bl KCkpDQoJKQ0KCXsNCgkJcmV0dXJuIGZ1bmNkZWY7DQoJfQ0KfQ0KDQp2b2lkIGZ1bmNfZGVj bF9kZWYoU2NvcGUgc2MpIDoNCnsNCiAgIGJvb2xlYW4gY2xvc2VSZXFkID0gZmFsc2U7DQp9 DQp7DQogIHsNCiAgICAgaWYgKGNsb3NlUmVxZCA9IChzYyAhPSBudWxsICYmIHNjICE9IHN5 bS5HZXRDdXJTY29wZSgpKSkNCiAgICAgICAgc3ltLk9wZW5TY29wZShzYyk7DQogIH0NCg0K ICAoDQogICAgIjsiDQogICB8DQogICAgY29tcG91bmRfc3RhdGVtZW50KCkNCiAgKQ0KDQog IHsgaWYgKGNsb3NlUmVxZCkgc3ltLkNsb3NlU2NvcGUoKTsgfQ0KfQ0KDQp2b2lkIGxpbmth Z2Vfc3BlY2lmaWNhdGlvbigpIDoNCnt9DQp7DQogICAiZXh0ZXJuIiA8U1RSSU5HPg0KICAg KA0KICAgICJ7IiAoIGV4dGVybmFsX2RlY2xhcmF0aW9uKCkgKSogIn0iIA0KICAgICAgKCBM T09LQUhFQUQoIjsiKSAiOyIpPw0KICAgfA0KICAgIGRlY2xhcmF0aW9uKCkNCiAgICkNCn0N Cg0KRGVjbGFyYXRpb24gZGVjbGFyYXRpb24oKSA6DQp7ICAgRGVjbGFyYXRpb24gZGVjbCA9 IG51bGw7DQogICAgRGVjbGFyYXRpb25TcGVjaWZpZXJzIGRlY2xzcGVjID0gbnVsbDsNCiAg ICBib29sZWFuIGlzVHlwZWRlZiA9IGZhbHNlOyB9DQp7DQogICAoDQogICAgTE9PS0FIRUFE KDIpDQogICAgICBkZWNsc3BlYyA9IGRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKQ0KICAgICAg ICAgICAgICAgKGluaXRfZGVjbGFyYXRvcl9saXN0KGRlY2xzcGVjLmdldF9pc1R5cGVEZWYo KSkpPyAiOyINCiAgIHwNCiAgICBsaW5rYWdlX3NwZWNpZmljYXRpb24oKQ0KICAgKQ0Kew0K ICAgIGlmKGRlY2xzcGVjICE9IG51bGwpDQogICAgew0KICAgICAgICBkZWNsID0gbmV3IERl Y2xhcmF0aW9uKGRlY2xzcGVjKTsNCiAgICB9DQoNCiAgICByZXR1cm4gZGVjbDsNCn0NCn0N Cg0KLyoqDQogKiBWZXJ5IHRlbXBvcmFyeS4gSnVzdCByZXR1cm5zIHRydWUgaWYgaXQgc2Vl cyBhIHR5cGVkZWYuIEZpbmFsbHksIHdlIHdpbGwNCiAqIG5lZWQgYSBzdHJ1Y3R1cmUgdGhh dCBzdG9yZXMgYWxsIHRoZSBhdHRyaWJ1dGVzLg0KICovDQpib29sZWFuIHR5cGVfbW9kaWZp ZXJzKCkgOg0KeyBib29sZWFuIGlzVHlwZWRlZiA9IGZhbHNlOyB9DQp7DQogICAoDQogICAg IGlzVHlwZWRlZiA9IHN0b3JhZ2VfY2xhc3Nfc3BlY2lmaWVyKCkNCiAgICB8DQogICAgIHR5 cGVfcXVhbGlmaWVyKCkNCiAgICB8DQogICAgICJpbmxpbmUiDQogICAgfA0KICAgICAidmly dHVhbCINCiAgICB8DQogICAgICJmcmllbmQiDQogICApDQoNCiAgIHsgcmV0dXJuIGlzVHlw ZWRlZjsgfQ0KfQ0KDQovKioNCiAqIFZlcnkgdGVtcG9yYXJ5LiBKdXN0IHJldHVybnMgdHJ1 ZSBpZiBpdCBzZWVzIGEgdHlwZWRlZi4gRmluYWxseSwgd2Ugd2lsbA0KICogbmVlZCBhIHN0 cnVjdHVyZSB0aGF0IHN0b3JlcyBhbGwgdGhlIGF0dHJpYnV0ZXMuDQogKi8NCkRlY2xhcmF0 aW9uU3BlY2lmaWVycyBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzKCkgOg0Kew0KICAgVG9rZW4g dDsNCiAgIERlY2xhcmF0aW9uU3BlY2lmaWVycyBkZWNsc3BlYyA9IG51bGw7DQogICBib29s ZWFuIGlzVHlwZURlZiA9IGZhbHNlLCB0bXA7DQp9DQp7DQogKA0KICAgKA0KICAgICAgTE9P S0FIRUFEKHR5cGVfbW9kaWZpZXJzKCkpIHRtcCA9IHR5cGVfbW9kaWZpZXJzKCkgeyBpc1R5 cGVEZWYgfD0gdG1wOyB9DQogICApKw0KDQoJLy8gQU0gLSBvbmx5IHN1cHBvcnRpbmcgMSBi dWlsdC1pbi10eXBlIHNwZWNpZmllciwgd2hpY2ggaXMgdXNlZCBmb3INCgkvLyBmdW5jdGlv biBhcmdzDQogICAgWyBMT09LQUhFQUQoMikgKA0KICAgICBMT09LQUhFQUQoYnVpbHRpbl90 eXBlX3NwZWNpZmllcigpKSBkZWNsc3BlYyA9IGJ1aWx0aW5fdHlwZV9zcGVjaWZpZXIoKQ0K ICAgICAgICAgKCAgTE9PS0FIRUFEKDIpICgNCiAgICAgICAgICAgIExPT0tBSEVBRChidWls dGluX3R5cGVfc3BlY2lmaWVyKCkpIGJ1aWx0aW5fdHlwZV9zcGVjaWZpZXIoKQ0KICAgICAg ICAgIHwNCiAgICAgICAgICAgIExPT0tBSEVBRCh0eXBlX21vZGlmaWVycygpKSB0bXAgPSB0 eXBlX21vZGlmaWVycygpICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB7IGlzVHlwZURlZiB8PSB0bXA7IH0NCiAgICAgICAgICkqDQogICAgfA0KICAgICAo DQogICAgICAgIGRlY2xzcGVjID0gY2xhc3Nfc3BlY2lmaWVyKCkNCiAgICAgIHwNCiAgICAg ICAgZW51bV9zcGVjaWZpZXIoKSANCiAgICAgIHwNCiAgICAgICAgcXVhbGlmaWVkX3R5cGUo KQ0KICAgICApDQogICAgIChMT09LQUhFQUQoMikgdG1wID0gdHlwZV9tb2RpZmllcnMoKSB7 IGlzVHlwZURlZiB8PSB0bXA7fSApKg0KICAgICkgXQ0KICAgfA0KCS8vIEFNIC0gb25seSBz dXBwb3J0aW5nIDEgYnVpbHQtaW4tdHlwZSBzcGVjaWZpZXIsIHdoaWNoIGlzIHVzZWQgZm9y DQoJLy8gZnVuY3Rpb24gYXJncw0KICAgIExPT0tBSEVBRChidWlsdGluX3R5cGVfc3BlY2lm aWVyKCkpIGRlY2xzcGVjID0gYnVpbHRpbl90eXBlX3NwZWNpZmllcigpDQogICAgICAgICAo IExPT0tBSEVBRCgyKSAoDQogICAgICAgICAgICBMT09LQUhFQUQoYnVpbHRpbl90eXBlX3Nw ZWNpZmllcigpKSBidWlsdGluX3R5cGVfc3BlY2lmaWVyKCkNCiAgICAgICAgICB8DQogICAg ICAgICAgICB0bXAgPSB0eXBlX21vZGlmaWVycygpIHsgaXNUeXBlRGVmIHw9IHRtcDsgfSAp DQogICAgICAgICApKg0KDQogICB8DQogICAgKA0KICAgICAgZGVjbHNwZWMgPSBjbGFzc19z cGVjaWZpZXIoKQ0KICAgICB8DQogICAgICBlbnVtX3NwZWNpZmllcigpDQogICAgIHwNCiAg ICAgIHF1YWxpZmllZF90eXBlKCkNCiAgICApDQogICAgKExPT0tBSEVBRCgyKSB0bXAgPSB0 eXBlX21vZGlmaWVycygpIHsgaXNUeXBlRGVmIHw9IHRtcDsgfSApKg0KICkNCg0KIHsgDQog ICBpZihkZWNsc3BlYyA9PSBudWxsKQ0KICAgew0KCSAgZGVjbHNwZWMgPSBuZXcgVW5rbm93 blR5cGVTcGVjaWZpZXIoKTsNCiAgIH0NCg0KICAgZGVjbHNwZWMuc2V0X2lzVHlwZURlZihp c1R5cGVEZWYpOw0KICAgDQogICByZXR1cm4gZGVjbHNwZWM7IA0KIH0NCn0NCg0KLyoNCnZv aWQgdHlwZV9zcGVjaWZpZXIoKSA6DQp7fQ0Kew0KICAgIHNpbXBsZV90eXBlX3NwZWNpZmll cigpDQogICB8DQogICAgY2xhc3Nfc3BlY2lmaWVyKCkNCiAgIHwNCiAgICBlbnVtX3NwZWNp ZmllcigpDQp9DQoqLw0KDQp2b2lkIHNpbXBsZV90eXBlX3NwZWNpZmllcigpIDoNCnt9DQp7 DQogICAoDQogICAgYnVpbHRpbl90eXBlX3NwZWNpZmllcigpDQogICB8DQogICAgcXVhbGlm aWVkX3R5cGUoKQ0KICAgKQ0KfQ0KDQp2b2lkIHNjb3BlX292ZXJyaWRlX2xvb2thaGVhZCgp IDoNCnt9DQp7DQogICAgIjo6Ig0KICAgfA0KICAgIDxJRD4gKCI8IiB0ZW1wbGF0ZV9hcmd1 bWVudF9saXN0KCkgIj4iKT8gIjo6Ig0KfQ0KDQpTdHJpbmcgc2NvcGVfb3ZlcnJpZGUoKSA6 DQp7DQogICBTdHJpbmcgbmFtZSA9ICIiOw0KICAgVG9rZW4gdDsNCn0NCnsNCiAgKA0KICAg ICgiOjoiKSAgeyBuYW1lICs9ICI6OiI7IH0NCiAgICAoDQogICAgICBMT09LQUhFQUQoMikg dCA9IDxJRD4gKCI8IiB0ZW1wbGF0ZV9hcmd1bWVudF9saXN0KCkgIj4iKT8gIjo6Ig0KICAg ICAgICAgICAgICAgICAgIHsgbmFtZSArPSB0LmltYWdlICsgIjo6IjsgfQ0KICAgICkqDQog ICB8DQogICAgKA0KICAgICAgTE9PS0FIRUFEKDIpIHQgPSA8SUQ+ICgiPCIgdGVtcGxhdGVf YXJndW1lbnRfbGlzdCgpICI+Iik/ICI6OiINCiAgICAgICAgICAgICAgICAgICB7IG5hbWUg Kz0gdC5pbWFnZSArICI6OiI7IH0NCiAgICApKw0KICApDQogIHsgcmV0dXJuIG5hbWU7IH0N Cn0NCg0KDQpTdHJpbmcgcXVhbGlmaWVkX2lkKCkgOg0Kew0KICAgU3RyaW5nIG5hbWUgPSAi IjsNCiAgIFRva2VuIHQ7DQp9DQp7DQogICAgWyBMT09LQUhFQUQoc2NvcGVfb3ZlcnJpZGVf bG9va2FoZWFkKCkpIG5hbWUgPSBzY29wZV9vdmVycmlkZSgpIF0NCiAgICAoDQogICAgICB0 ID0gPElEPiBbICI8IiB0ZW1wbGF0ZV9hcmd1bWVudF9saXN0KCkgICI+IiBdDQogICAgICB7 IHJldHVybiBuYW1lICsgdC5pbWFnZTsgfQ0KICAgICB8DQogICAgICAib3BlcmF0b3IiIG9w dG9yKCkgeyByZXR1cm4gIm9wZXJhdG9yIjsgfQ0KICAgICkNCn0NCg0Kdm9pZCBwdHJfdG9f bWVtYmVyKCkgOg0Ke30NCnsNCiAgICBzY29wZV9vdmVycmlkZSgpICAiKiINCn0NCg0Kdm9p ZCBxdWFsaWZpZWRfdHlwZSgpIDoNCnt9DQp7DQogICAgTE9PS0FIRUFEKHsgc3ltLklzRnVs bHlTY29wZWRUeXBlTmFtZShHZXRGdWxseVNjb3BlZE5hbWUoKSkgfSApDQogICAgICAgIHF1 YWxpZmllZF9pZCgpDQp9DQoNCnZvaWQgdHlwZV9xdWFsaWZpZXIoKSA6DQp7fQ0Kew0KICAg ICJjb25zdCIgfCAidm9sYXRpbGUiDQp9DQoNCi8qKg0KICogVmVyeSB0ZW1wb3JhcnkuIEp1 c3QgcmV0dXJucyB0cnVlIGlmIGl0IHNlZXMgYSB0eXBlZGVmLiBGaW5hbGx5LCB3ZSB3aWxs DQogKiBuZWVkIGEgc3RydWN0dXJlIHRoYXQgc3RvcmVzIGFsbCB0aGUgYXR0cmlidXRlcy4N CiAqLw0KYm9vbGVhbiBzdG9yYWdlX2NsYXNzX3NwZWNpZmllcigpIDoNCnt9DQp7DQogICAo ICJhdXRvIiB8ICJyZWdpc3RlciIgfCAic3RhdGljIiB8ICJleHRlcm4iICkgeyByZXR1cm4g ZmFsc2U7IH0NCiAgIHwgInR5cGVkZWYiICB7IHJldHVybiB0cnVlOyB9DQp9DQoNCkJ1aWx0 SW5UeXBlU3BlY2lmaWVyIGJ1aWx0aW5fdHlwZV9zcGVjaWZpZXIoKSA6DQp7fQ0Kew0KCSJ2 b2lkIiB7IHJldHVybiBuZXcgQnVpbHRJblR5cGVTcGVjaWZpZXIoZmFsc2UsICJ2b2lkIik7 IH0gDQoJfCANCgkiY2hhciIgeyByZXR1cm4gbmV3IEJ1aWx0SW5UeXBlU3BlY2lmaWVyKGZh bHNlLCAiY2hhciIpOyB9IA0KCXwgDQoJInNob3J0IiB7IHJldHVybiBuZXcgQnVpbHRJblR5 cGVTcGVjaWZpZXIoZmFsc2UsICJzaG9ydCIpOyB9IA0KCXwgDQoJImludCIgeyByZXR1cm4g bmV3IEJ1aWx0SW5UeXBlU3BlY2lmaWVyKGZhbHNlLCAiaW50Iik7IH0gDQoJfCANCgkibG9u ZyIgeyByZXR1cm4gbmV3IEJ1aWx0SW5UeXBlU3BlY2lmaWVyKGZhbHNlLCAibG9uZyIpOyB9 IA0KCXwgDQoJImZsb2F0IiB7IHJldHVybiBuZXcgQnVpbHRJblR5cGVTcGVjaWZpZXIoZmFs c2UsICJmbG9hdCIpOyB9IA0KCXwNCgkiZG91YmxlIiB7IHJldHVybiBuZXcgQnVpbHRJblR5 cGVTcGVjaWZpZXIoZmFsc2UsICJkb3VibGUiKTsgfSANCgl8IA0KCSJzaWduZWQiIHsgcmV0 dXJuIG5ldyBCdWlsdEluVHlwZVNwZWNpZmllcihmYWxzZSwgInNpZ25lZCIpOyB9IA0KCXwg DQoJInVuc2lnbmVkIiB7IHJldHVybiBuZXcgQnVpbHRJblR5cGVTcGVjaWZpZXIoZmFsc2Us ICJ1bnNpZ25lZCIpOyB9IA0KfQ0KDQp2b2lkIGluaXRfZGVjbGFyYXRvcl9saXN0KGJvb2xl YW4gaXNUeXBlZGVmKSA6DQp7fQ0Kew0KICAgaW5pdF9kZWNsYXJhdG9yKGlzVHlwZWRlZikg KCIsIiBpbml0X2RlY2xhcmF0b3IoaXNUeXBlZGVmKSkqDQp9DQoNCnZvaWQgaW5pdF9kZWNs YXJhdG9yKGJvb2xlYW4gaXNUeXBlZGVmKSA6DQp7IFN0cmluZyBuYW1lOyANCiAgRGVjbGFy YXRvciBkZWNsID0gbmV3IERlY2xhcmF0b3IoKTsNCn0NCnsNCiAgIGRlY2xhcmF0b3IoZGVj bCkNCiAgIHsNCiAgICAgIGlmIChpc1R5cGVkZWYpDQogICAgICAgICBzeW0uUHV0VHlwZU5h bWUoZGVjbC5nZXRfbmFtZSgpKTsNCiAgIH0NCiAgICgNCiAgICAiPSIgaW5pdGlhbGl6ZXIo KQ0KICAgfA0KICAgICIoIiBleHByZXNzaW9uX2xpc3QoKSAgIikiDQogICApPw0KfQ0KDQp2 b2lkIGNsYXNzX2hlYWQoKSA6DQp7fQ0Kew0KICAgKCJzdHJ1Y3QiIHwgInVuaW9uIiB8ICJj bGFzcyIpDQogICAoPElEPiAoYmFzZV9jbGF1c2UobnVsbCkpPyk/DQp9DQoNCkNsYXNzU3Bl Y2lmaWVyIGNsYXNzX3NwZWNpZmllcigpIDoNCnsNCiAgIENsYXNzU3BlY2lmaWVyIGNsYXNz c3BlYyA9IG5ldyBDbGFzc1NwZWNpZmllcigpOw0KICAgTWVtYmVyRGVjbGFyYXRpb25fTlBM aXN0IGxpc3QgPSBuZXcgTWVtYmVyRGVjbGFyYXRpb25fTlBMaXN0KCk7DQogICBNZW1iZXJE ZWNsYXJhdGlvbiBtZW1iZGVjbCA9IG51bGw7DQoNCiAgIENsYXNzU2NvcGUgc2MgPSBudWxs Ow0KICAgVG9rZW4gdDsNCn0NCnsNCiAgICgNCiAgICgic3RydWN0IiB8ICJ1bmlvbiIgfCAi Y2xhc3MiICkNCiAgICgNCiAgICAieyINCiAgICAgICAgew0KICAgICAgICAgICBzeW0uT3Bl blNjb3BlKG51bGwsIGZhbHNlKTsNCiAgICAgICAgfQ0KICAgICAgICAoIA0KICAgICAgICAg ICBtZW1iZGVjbCA9IG1lbWJlcl9kZWNsYXJhdGlvbigpDQogICAgICAgICAgIHsNCiAgICAg ICAgICAgICAgaWYobWVtYmRlY2wgIT0gbnVsbCkNCiAgICAgICAgICAgICAgew0KICAgICAg ICAgICAgICAgICBsaXN0LmFkZEVsZW1lbnQobWVtYmRlY2wpOw0KICAgICAgICAgICAgICB9 DQogICAgICAgICAgIH0NCiAgICAgICAgKSoNCiAgICAifSINCiAgICAgICAgew0KICAgICAg ICAgICBzeW0uQ2xvc2VTY29wZSgpOw0KICAgICAgICB9DQogICB8DQogICAgTE9PS0FIRUFE KDIpIHQgPSA8SUQ+DQogICAgIHsNCiAgICAgICAgc2MgPSAoQ2xhc3NTY29wZSlzeW0uT3Bl blNjb3BlKHQuaW1hZ2UsIHRydWUpOw0KDQoJCS8vIHJlbWVtYmVyIHRoZSBjbGFzc25hbWUN CgkJY2xhc3NzcGVjLnNldF9uYW1lKG5ldyBDbGFzc05hbWUodC5pbWFnZSkpOw0KICAgICB9 DQogICAgIChiYXNlX2NsYXVzZShzYykpPyANCiAgICAieyINCiAgICAgICgNCiAgICAgICAg bWVtYmRlY2wgPSBtZW1iZXJfZGVjbGFyYXRpb24oKQ0KICAgICAgICB7DQogICAgICAgICAg aWYobWVtYmRlY2wgIT0gbnVsbCkNCiAgICAgICAgICB7DQogICAgICAgICAgICAgbGlzdC5h ZGRFbGVtZW50KG1lbWJkZWNsKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICkq DQogICAgIn0iDQogICAgICAgIHsNCiAgICAgICAgICAgc3ltLkNsb3NlU2NvcGUoKTsNCiAg ICAgICAgfQ0KICAgfA0KICAgIHQ9PElEPiAoTE9PS0FIRUFEKDIpICI8IiB0ZW1wbGF0ZV9h cmd1bWVudF9saXN0KCkgICI+Iik/DQogICAgeyBzeW0uUHV0VHlwZU5hbWUodC5pbWFnZSk7 IA0KDQoJICAvLyByZW1lbWJlciB0aGUgY2xhc3NuYW1lDQogCSAgY2xhc3NzcGVjLnNldF9u YW1lKG5ldyBDbGFzc05hbWUodC5pbWFnZSkpOw0KCX0NCiAgICkNCiAgICkNCiB7DQogICAg Y2xhc3NzcGVjLnNldF9tZW1iZXJkZWNsYXJhdGlvbl9ucGxpc3QobGlzdCk7DQogICAgcmV0 dXJuIGNsYXNzc3BlYzsNCiB9DQp9DQoNCnZvaWQgYmFzZV9jbGF1c2UoQ2xhc3NTY29wZSBz Y29wZSkgOg0Ke30NCnsNCiAgICI6IiBiYXNlX3NwZWNpZmllcihzY29wZSkgKCAiLCIgYmFz ZV9zcGVjaWZpZXIoc2NvcGUpICkqDQp9DQoNCnZvaWQgYmFzZV9zcGVjaWZpZXIoQ2xhc3NT Y29wZSBzY29wZSkgOg0KeyBUb2tlbiB0OyB9DQp7DQogICAoInZpcnR1YWwiIChhY2Nlc3Nf c3BlY2lmaWVyKCkpPyB8IGFjY2Vzc19zcGVjaWZpZXIoKSAoInZpcnR1YWwiKT8pPw0KICAg KExPT0tBSEVBRChzY29wZV9vdmVycmlkZV9sb29rYWhlYWQoKSkgc2NvcGVfb3ZlcnJpZGUo KSk/DQogICB0ID0gPElEPiAoIjwiIHRlbXBsYXRlX2FyZ3VtZW50X2xpc3QoKSAgIj4iKT8N CiAgIHsNCiAgICAgIHNjb3BlLkFkZFN1cGVyKHN5bS5HZXRTY29wZSh0LmltYWdlKSk7DQog ICB9DQp9DQoNCnZvaWQgYWNjZXNzX3NwZWNpZmllcigpIDoNCnt9DQp7DQogICAicHVibGlj IiB8ICJwcm90ZWN0ZWQiIHwgInByaXZhdGUiDQp9DQoNCk1lbWJlckRlY2xhcmF0aW9uIG1l bWJlcl9kZWNsYXJhdGlvbigpIDoNCnsgTWVtYmVyRGVjbGFyYXRpb24gbWVtYmRlY2wgPSBu dWxsOw0KICBEZWNsYXJhdGlvblNwZWNpZmllcnMgZGVjbHNwZWMgPSBudWxsOyB9DQp7DQog ICgNCiAgICBMT09LQUhFQUQoKCJ0eXBlZGVmIik/IGNsYXNzX2hlYWQoKSAieyIpIGRlY2xh cmF0aW9uKCkNCg0KICAgfA0KICAgIExPT0tBSEVBRCgiZW51bSIgKDxJRD4pPyAieyIpIGVu dW1fc3BlY2lmaWVyKCkNCiAgICAgICAoIG1lbWJlcl9kZWNsYXJhdG9yX2xpc3QoZmFsc2Up ICk/ICAiOyINCiAgIHwNCiAgICBMT09LQUhFQUQoICJvcGVyYXRvciIgKQ0KICAgICAgIGNv bnZlcnNpb25fZnVuY3Rpb25fZGVjbF9vcl9kZWYoKQ0KICAgfA0KICAgIExPT0tBSEVBRChk dG9yX2N0b3JfZGVjbF9zcGVjKCkgZHRvcl9kZWNsYXJhdG9yKCkgInsiKQ0KICAgICAgIGR0 b3JfZGVmaW5pdGlvbigpDQogICB8DQogICAgTE9PS0FIRUFEKCgiaW5saW5lInwgInZpcnR1 YWwiKSogIn4iKQ0KICAgICAgIGR0b3JfY3Rvcl9kZWNsX3NwZWMoKSBzaW1wbGVfZHRvcl9k ZWNsYXJhdG9yKCkgICI7Ig0KICAgfA0KICAgIExPT0tBSEVBRChkdG9yX2N0b3JfZGVjbF9z cGVjKCkgY3Rvcl9kZWNsYXJhdG9yX2xvb2thaGVhZCgpKQ0KICAgICAgIGN0b3JfZGVmaW5p dGlvbigpDQogICB8DQogICAgTE9PS0FIRUFEKGR0b3JfY3Rvcl9kZWNsX3NwZWMoKSBjdG9y X2RlY2xhcmF0b3JfbG9va2FoZWFkKCkgIjsiKQ0KICAgICAgKGR0b3JfY3Rvcl9kZWNsX3Nw ZWMoKSBjdG9yX2RlY2xhcmF0b3IoKSAiOyIpDQogICB8DQogICAgTE9PS0FIRUFEKChkZWNs YXJhdGlvbl9zcGVjaWZpZXJzKCkpPyBmdW5jdGlvbl9kZWNsYXJhdG9yX2xvb2thaGVhZCgp KQ0KICAgICAgIG1lbWJkZWNsID0gZnVuY3Rpb25fZGVmaW5pdGlvbigpDQogICB8DQogICAg TE9PS0FIRUFEKGRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKSkNCiAgICAgICBkZWNsc3BlYyA9 IGRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKQ0KICAgICAgICAgICAobWVtYmVyX2RlY2xhcmF0 b3JfbGlzdChkZWNsc3BlYy5nZXRfaXNUeXBlRGVmKCkpKT8gIjsiDQogICB8DQogICAgTE9P S0FIRUFEKDxJRD4pIGZ1bmN0aW9uX2RlY2xhcmF0b3IoZmFsc2UpICI7Ig0KICAgfA0KICAg IExPT0tBSEVBRCgzKQ0KICAgICBxdWFsaWZpZWRfaWQoKSAiOyINCiAgIHwNCiAgICBhY2Nl c3Nfc3BlY2lmaWVyKCkgICI6Ig0KICAgfA0KICAgICI7Ig0KICApDQogew0KICAgIHJldHVy biBtZW1iZGVjbDsNCiB9DQp9DQoNCnZvaWQgbWVtYmVyX2RlY2xhcmF0b3JfbGlzdChib29s ZWFuIGlzVHlwZWRlZikgOg0Ke30NCnsNCiAgIG1lbWJlcl9kZWNsYXJhdG9yKGlzVHlwZWRl ZikgKCI9IiA8T0NUQUxJTlQ+KT8NCiAgICgiLCIgbWVtYmVyX2RlY2xhcmF0b3IoaXNUeXBl ZGVmKSAoIj0iIDxPQ1RBTElOVD4pPykqDQp9DQoNCnZvaWQgbWVtYmVyX2RlY2xhcmF0b3Io Ym9vbGVhbiBpc1R5cGVkZWYpIDoNCnsgU3RyaW5nIG5hbWU7IA0KICBEZWNsYXJhdG9yIGRl Y2wgPSBuZXcgRGVjbGFyYXRvcigpOw0KfQ0Kew0KICAgZGVjbGFyYXRvcihkZWNsKQ0KICAg ew0KICAgICAgaWYgKGlzVHlwZWRlZikNCiAgICAgICAgIHN5bS5QdXRUeXBlTmFtZShkZWNs LmdldF9uYW1lKCkpOw0KICAgfQ0KfQ0KDQp2b2lkIGNvbnZlcnNpb25fZnVuY3Rpb25fZGVj bF9vcl9kZWYoKSA6DQp7DQogICBTY29wZSBzYyA9IG51bGw7DQogICBTdHJpbmcgbmFtZSA9 IG51bGw7DQp9DQp7DQogICBbIExPT0tBSEVBRChzY29wZV9vdmVycmlkZV9sb29rYWhlYWQo KSkgbmFtZSA9IHNjb3BlX292ZXJyaWRlKCkgXQ0KDQogICAib3BlcmF0b3IiIGRlY2xhcmF0 aW9uX3NwZWNpZmllcnMoKSAoIioiIHwgIiYiKT8NCg0KICAgIigiIChwYXJhbWV0ZXJfbGlz dCgpKT8gIikiDQogICAoTE9PS0FIRUFEKDIpIHR5cGVfcXVhbGlmaWVyKCkpPyANCiAgIChl eGNlcHRpb25fc3BlYygpKT8NCiAgIGZ1bmNfZGVjbF9kZWYobnVsbCkgIC8vIFRlbXBvcmFy eSAoZml4IHRoZSBudWxsKQ0KfQ0KDQp2b2lkIGVudW1fc3BlY2lmaWVyKCkgOg0KeyBUb2tl biB0OyB9DQp7ICANCiAgICJlbnVtIg0KICAgKA0KICAgICJ7IiBlbnVtZXJhdG9yX2xpc3Qo KSAifSINCiAgIHwNCiAgICB0PTxJRD4gKExPT0tBSEVBRCgyKSAieyIgZW51bWVyYXRvcl9s aXN0KCkgIn0iKT8NCiAgICAgICAgICAgeyBzeW0uUHV0VHlwZU5hbWUodC5pbWFnZSk7IH0N CiAgICkNCn0NCg0Kdm9pZCBlbnVtZXJhdG9yX2xpc3QoKSA6DQp7fQ0Kew0KICAgZW51bWVy YXRvcigpICgiLCIgZW51bWVyYXRvcigpKSoNCn0NCg0Kdm9pZCBlbnVtZXJhdG9yKCkgOg0K e30NCnsNCiAgIDxJRD4gKCI9IiBjb25zdGFudF9leHByZXNzaW9uKCkpPw0KfQ0KDQpTdHJp bmcgcHRyX29wZXJhdG9yKCkgOg0Kew0KICBTdHJpbmcgb3AgPSBuZXcgU3RyaW5nKCk7DQp9 DQp7DQogICAoDQogICAgIiYiIGN2X3F1YWxpZmllcl9zZXEoKSB7b3AgPSAiJiI7IH0NCiAg IHwNCgkiKiIgY3ZfcXVhbGlmaWVyX3NlcSgpIHtvcCA9ICIqIjsgfQ0KICAgfA0KCXB0cl90 b19tZW1iZXIoKSBjdl9xdWFsaWZpZXJfc2VxKCkge21zZyAoIklnbm9yaW5nIHB0cl90b19t ZW1iZXIiKTsgfQ0KICAgKQ0KDQogICB7IHJldHVybiBvcDsgfQ0KfQ0KDQp2b2lkIGN2X3F1 YWxpZmllcl9zZXEoKSA6DQp7fQ0Kew0KICAgWyBMT09LQUhFQUQoMikgKA0KICAgICAiY29u c3QiIFsgTE9PS0FIRUFEKDIpICJ2b2xhdGlsZSIgXQ0KICAgIHwNCiAgICAgInZvbGF0aWxl IiBbIExPT0tBSEVBRCgyKSAiY29uc3QiIF0gKQ0KICAgXQ0KfQ0KDQp2b2lkIGRlY2xhcmF0 b3IoRGVjbGFyYXRvciBkZWNsKSA6DQp7IFN0cmluZyBuYW1lOyANCiAgU3RyaW5nIHB0cm9w Ow0KfQ0Kew0KICAoDQogICAgTE9PS0FIRUFEKHB0cl9vcGVyYXRvcigpKQ0KICAgIHB0cm9w ID0gcHRyX29wZXJhdG9yKCkgZGVjbGFyYXRvcihkZWNsKQ0KCXsNCgkgICAgaWYoZGVjbC5n ZXRfYW55cG9pbnRlcm9wZXJhdG9yX25wbGlzdCgpID09IG51bGwpCgkgICAgewoJCWRlY2wu c2V0X2FueXBvaW50ZXJvcGVyYXRvcl9ucGxpc3QobmV3IEFueVBvaW50ZXJPcGVyYXRvcl9O UExpc3QoKSk7CgkgICAgfQoJICAgIGRlY2wuZ2V0X2FueXBvaW50ZXJvcGVyYXRvcl9ucGxp c3QoKS5hZGRFbGVtZW50KG5ldyBQb2ludGVyT3BlcmF0b3IocHRyb3ApKTsNCgl9DQoNCiAg IHwNCgkgbmFtZSA9IGRpcmVjdF9kZWNsYXJhdG9yKCkNCiAgIHsNCgkgZGVjbC5zZXRfbmFt ZShuYW1lKTsNCiAgICAgaWYoZGVjbC5nZXRfYW55cG9pbnRlcm9wZXJhdG9yX25wbGlzdCgp ID09IG51bGwpDQogICAgIHsNCiAgICAgICAgZGVjbC5zZXRfYW55cG9pbnRlcm9wZXJhdG9y X25wbGlzdChuZXcgQW55UG9pbnRlck9wZXJhdG9yX05QTGlzdCgpKTsNCiAgICAgfQ0KCSBk ZWNsLmdldF9hbnlwb2ludGVyb3BlcmF0b3JfbnBsaXN0KCkuYWRkRWxlbWVudChuZXcgRVBv aW50ZXJPcGVyYXRvcigpKTsNCiAgIH0NCiAgKQ0KDQp9DQoNClN0cmluZyBkaXJlY3RfZGVj bGFyYXRvcigpIDoNCnsNCiAgIFN0cmluZyBuYW1lOw0KICAgVG9rZW4gdDsNCiAgIERlY2xh cmF0b3IgZGVjbCA9IG5ldyBEZWNsYXJhdG9yKCk7DQp9DQp7DQogICBMT09LQUhFQUQoMikN CiAgICAifiIgdCA9IDxJRD4gKExPT0tBSEVBRCgyKSBkZWNsYXJhdG9yX3N1ZmZpeGVzKCkp Pw0KICAgICAgICB7IHJldHVybiAoIn4iICsgdC5pbWFnZSk7IH0NCiAgIHwNCiAgICAiKCIg ZGVjbGFyYXRvcihkZWNsKSAiKSIgKExPT0tBSEVBRCgyKSBkZWNsYXJhdG9yX3N1ZmZpeGVz KCkpPw0KICAgICAgICB7IHJldHVybiAoZGVjbC5nZXRfbmFtZSgpKTsgfQ0KICAgfA0KICAg IG5hbWUgPSBxdWFsaWZpZWRfaWQoKSAoTE9PS0FIRUFEKDIpIGRlY2xhcmF0b3Jfc3VmZml4 ZXMoKSk/DQogICB7IHJldHVybiAobmFtZSk7IH0NCn0NCg0Kdm9pZCBkZWNsYXJhdG9yX3N1 ZmZpeGVzKCkgOg0Ke30NCnsNCiAgICAoIlsiIChjb25zdGFudF9leHByZXNzaW9uKCkpPyAi XSIgKSsNCiAgIHwNCiAgICAiKCIgKHBhcmFtZXRlcl9saXN0KCkpPyAiKSINCiAgICAoTE9P S0FIRUFEKDIpIHR5cGVfcXVhbGlmaWVyKCkpPw0KICAgIChleGNlcHRpb25fc3BlYygpKT8N Cn0NCg0KLyoqDQogKiBVc2VkIG9ubHkgZm9yIGxvb2thaGVhZC4NCiAqLw0Kdm9pZCBmdW5j dGlvbl9kZWNsYXJhdG9yX2xvb2thaGVhZCgpIDoNCnt9DQp7DQogICAoTE9PS0FIRUFEKDIp IHB0cl9vcGVyYXRvcigpICkqIHF1YWxpZmllZF9pZCgpICIoIg0KfQ0KDQpGdW5jdGlvbkRl ZmluaXRpb24gZnVuY3Rpb25fZGVjbGFyYXRvcihib29sZWFuIGlzVHlwZWRlZikgOg0KeyBG dW5jdGlvbkRlZmluaXRpb24gZnVuY2RlZiA9IG51bGw7DQp9DQp7DQogICgNCiAgICBMT09L QUhFQUQocHRyX29wZXJhdG9yKCkpDQogICAgICAgcHRyX29wZXJhdG9yKCkgZnVuY2RlZiA9 IGZ1bmN0aW9uX2RlY2xhcmF0b3IoaXNUeXBlZGVmKQ0KICAgfA0KICAgICBmdW5jZGVmID0g ZnVuY3Rpb25fZGlyZWN0X2RlY2xhcmF0b3IoaXNUeXBlZGVmKQ0KICApDQoNCiAgeyByZXR1 cm4gZnVuY2RlZjsgfQ0KfQ0KDQpGdW5jdGlvbkRlZmluaXRpb24gZnVuY3Rpb25fZGlyZWN0 X2RlY2xhcmF0b3IoYm9vbGVhbiBpc1R5cGVkZWYpIDoNCnsNCiAgU3RyaW5nIG5hbWU7IA0K ICBTY29wZSBzYyA9IG51bGw7DQogIGJvb2xlYW4gY2xvc2VSZXFkID0gZmFsc2U7DQogIEZ1 bmN0aW9uRGVmaW5pdGlvbiBmdW5jZGVmID0gbmV3IEZ1bmN0aW9uRGVmaW5pdGlvbigpOw0K ICBQYXJhbWV0ZXJEZWNsYXJhdGlvbl9OUExpc3QgcGFyYW1saXN0ID0gbnVsbDsNCn0NCnsN CiAgICAgbmFtZSA9IHF1YWxpZmllZF9pZCgpDQoNCiAgICAgew0KICAgICAgICBzYyA9IHN5 bS5HZXRTY29wZU9mRnVsbHlTY29wZWROYW1lKG5hbWUpOw0KDQogICAgICAgIGlmIChjbG9z ZVJlcWQgPSAoc2MgIT0gbnVsbCAmJiBzYyAhPSBzeW0uR2V0Q3VyU2NvcGUoKSkpDQogICAg ICAgICAgIHN5bS5PcGVuU2NvcGUoc2MpOw0KDQoJCS8vIHN0b3JlIHRoZSBuYW1lDQoJCWZ1 bmNkZWYuc2V0X25hbWUobmV3IEZ1bmN0aW9uTmFtZShuYW1lKSk7DQogICAgIH0NCg0KICAg ICAiKCIgKHBhcmFtbGlzdCA9IHBhcmFtZXRlcl9saXN0KCkpPyAgIikiDQogICAgIChMT09L QUhFQUQoMikgdHlwZV9xdWFsaWZpZXIoKSk/DQogICAgIChleGNlcHRpb25fc3BlYygpKT8N CiAgICAgKExPT0tBSEVBRCgiPSIpICI9IiA8T0NUQUxJTlQ+KT8gICAgIA0KDQogICAgIHsN CiAgICAgICAgaWYgKGNsb3NlUmVxZCkNCiAgICAgICAgICAgc3ltLkNsb3NlU2NvcGUoKTsN Cg0KICAgICAgICBpZiAoaXNUeXBlZGVmKQ0KICAgICAgICAgICBzeW0uUHV0VHlwZU5hbWUo bmFtZSk7DQoNCgkJLy8gcmVtZW1iZXIgcGFyYW1ldGVycw0KCQlmdW5jZGVmLnNldF9wYXJh bWV0ZXJkZWNsYXJhdGlvbl9ucGxpc3QocGFyYW1saXN0KTsNCiAgICAgICAgcmV0dXJuIGZ1 bmNkZWY7DQogICAgIH0NCn0NCg0Kdm9pZCBkdG9yX2N0b3JfZGVjbF9zcGVjKCkgOg0Ke30N CnsNCiAgIFsNCiAgICAidmlydHVhbCIgWyAiaW5saW5lIl0NCiAgIHwNCiAgICAiaW5saW5l IiAgWyAidmlydHVhbCJdDQogICBdDQp9DQoNCnZvaWQgZHRvcl9kZWZpbml0aW9uKCkgOg0K e30NCnsNCiAgICh0ZW1wbGF0ZV9oZWFkKCkpPw0KICAgZHRvcl9jdG9yX2RlY2xfc3BlYygp DQogICBkdG9yX2RlY2xhcmF0b3IoKQ0KICAgY29tcG91bmRfc3RhdGVtZW50KCkNCn0NCg0K dm9pZCBjdG9yX2RlZmluaXRpb24oKSA6DQp7DQogICBTY29wZSBzYyA9IG51bGw7DQogICBi b29sZWFuIGNsb3NlUmVxZCA9IGZhbHNlOw0KfQ0Kew0KICAgZHRvcl9jdG9yX2RlY2xfc3Bl YygpIHNjID0gY3Rvcl9kZWNsYXJhdG9yKCkNCg0KICAgew0KICAgICAgaWYgKGNsb3NlUmVx ZCA9IChzYyAhPSBudWxsICYmIHNjICE9IHN5bS5HZXRDdXJTY29wZSgpKSkNCiAgICAgICAg IHN5bS5PcGVuU2NvcGUoc2MpOyAgIA0KICAgfQ0KDQogICAoZXhjZXB0aW9uX3NwZWMoKSk/ DQogICANCiAgICgNCiAgICAgIjsiDQogICAgfA0KICAgICBbIGN0b3JfaW5pdGlhbGl6ZXIo KSBdIGNvbXBvdW5kX3N0YXRlbWVudCgpDQogICApDQoNCiAgIHsgaWYgKGNsb3NlUmVxZCkg c3ltLkNsb3NlU2NvcGUoKTsgDQogICB9DQp9DQoNCnZvaWQgY3Rvcl9kZWNsYXJhdG9yX2xv b2thaGVhZCgpIDoNCnt9DQp7DQogICBMT09LQUhFQUQoIHsgSXNDdG9yKCkgfSApIHF1YWxp ZmllZF9pZCgpICIoIg0KfQ0KDQpTY29wZSBjdG9yX2RlY2xhcmF0b3IoKSA6DQp7DQogIFN0 cmluZyBuYW1lOw0KICBTY29wZSBzYyA9IG51bGw7DQogIGJvb2xlYW4gY2xvc2VSZXFkID0g ZmFsc2U7ICAgICAgICAgIA0KfQ0Kew0KICAgTE9PS0FIRUFEKCB7IElzQ3RvcigpIH0gKQ0K ICAgICAgbmFtZSA9IHF1YWxpZmllZF9pZCgpDQogDQogICAgIHsNCiAgICAgICAgc2MgPSBz eW0uR2V0U2NvcGVPZkZ1bGx5U2NvcGVkTmFtZShuYW1lKTsNCiANCiAgICAgICAgaWYgKGNs b3NlUmVxZCA9IChzYyAhPSBudWxsICYmIHNjICE9IHN5bS5HZXRDdXJTY29wZSgpKSkNCiAg ICAgICAgICAgc3ltLk9wZW5TY29wZShzYyk7ICAgICAgICAgDQogICAgIH0NCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICIoIiBbIExPT0tBSEVBRCgy KSBwYXJhbWV0ZXJfbGlzdCgpIF0gICIpIg0KDQogICAgIFsgTE9PS0FIRUFEKDIpIGV4Y2Vw dGlvbl9zcGVjKCkgXQ0KICAgICAgDQogICAgIHsNCiAgICAgICAgaWYgKGNsb3NlUmVxZCkN CiAgICAgICAgICAgc3ltLkNsb3NlU2NvcGUoKTsgICAgICAgICAgDQogDQogICAgICAgIHJl dHVybiBzYzsgICAgICAgICAgICAgICAgICAgIA0KICAgICB9DQp9DQoNCnZvaWQgY3Rvcl9p bml0aWFsaXplcigpIDoNCnt9DQp7DQogICAiOiIgc3VwZXJjbGFzc19pbml0KCkgKCIsIiBz dXBlcmNsYXNzX2luaXQoKSkqDQp9DQoNCnZvaWQgc3VwZXJjbGFzc19pbml0KCkgOg0Ke30N CnsNCiAgIHF1YWxpZmllZF9pZCgpICAiKCIgKGV4cHJlc3Npb25fbGlzdCgpKT8gICIpIg0K fQ0KDQp2b2lkICBkdG9yX2RlY2xhcmF0b3IoKSA6DQp7fQ0Kew0KICAgKExPT0tBSEVBRChz Y29wZV9vdmVycmlkZV9sb29rYWhlYWQoKSkgc2NvcGVfb3ZlcnJpZGUoKSk/DQogICAgc2lt cGxlX2R0b3JfZGVjbGFyYXRvcigpDQp9DQoNCnZvaWQgIHNpbXBsZV9kdG9yX2RlY2xhcmF0 b3IoKSA6DQp7fQ0Kew0KICAgIn4iDQogICBMT09LQUhFQUQoIHsgSXNDdG9yKCkgfSApIDxJ RD4gIigiIChwYXJhbWV0ZXJfbGlzdCgpKT8gICIpIg0KfQ0KDQpQYXJhbWV0ZXJEZWNsYXJh dGlvbl9OUExpc3QgcGFyYW1ldGVyX2xpc3QoKSA6DQp7DQoJUGFyYW1ldGVyRGVjbGFyYXRp b25fTlBMaXN0IHBhcmFtbGlzdCA9IG51bGw7DQp9DQp7CiAgKA0KICAgIHBhcmFtbGlzdCA9 IHBhcmFtZXRlcl9kZWNsYXJhdGlvbl9saXN0KCkgWyBMT09LQUhFQUQoMikgWyAiLCIgXSAi Li4uIiBdDQogICB8DQogICAgIi4uLiIKICApDQoJew0KCQlyZXR1cm4gcGFyYW1saXN0Ow0K CX0NCn0NCg0KUGFyYW1ldGVyRGVjbGFyYXRpb25fTlBMaXN0IHBhcmFtZXRlcl9kZWNsYXJh dGlvbl9saXN0KCkgOg0Kew0KCVBhcmFtZXRlckRlY2xhcmF0aW9uX05QTGlzdCBwYXJhbWxp c3QgPSBuZXcgUGFyYW1ldGVyRGVjbGFyYXRpb25fTlBMaXN0KCk7DQoJUGFyYW1ldGVyRGVj bGFyYXRpb24gcGFyYW1kZWNsID0gbnVsbDsNCn0NCnsNCiAgIChwYXJhbWRlY2wgPSBwYXJh bWV0ZXJfZGVjbGFyYXRpb24oKSkNCiAgIHsNCgkgICBwYXJhbWxpc3QuYWRkRWxlbWVudChw YXJhbWRlY2wpOw0KICAgfQ0KDQogICAoTE9PS0FIRUFEKDIpICIsIiAocGFyYW1kZWNsID0g cGFyYW1ldGVyX2RlY2xhcmF0aW9uKCkpDQogICB7DQoJICAgcGFyYW1saXN0LmFkZEVsZW1l bnQocGFyYW1kZWNsKTsNCiAgIH0NCgkpKg0KDQoJew0KCQlyZXR1cm4gcGFyYW1saXN0Ow0K CX0NCn0NCg0KUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyX2RlY2xhcmF0aW9uKCkg Og0Kew0KCVBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZGVjbCA9IG5ldyBQYXJhbWV0ZXJE ZWNsYXJhdGlvbigpOw0KCURlY2xhcmF0aW9uU3BlY2lmaWVycyB0eXBlZGVjbHNwZWMgPSBu dWxsOw0KCURlY2xhcmF0b3IgZGVjbCA9IG5ldyBEZWNsYXJhdG9yKCk7DQp9DQp7DQogICB0 eXBlZGVjbHNwZWMgPSBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzKCkNCg0KICAgew0KCSAgIC8v IHZlcmlmeSB0aGUgZGVjbHNwZWMgaWYgYSBidWlsdCBpbiB0eXBlIHNwZWNpZmllciwNCgkg ICAvLyB0aHJvd3MgYW4gZXhjZXB0aW9uIG90aGVyd2lzZQ0KCSAgIHBhcmFtZGVjbC5zZXRf YnVpbHRpbnR5cGVzcGVjaWZpZXIoKEJ1aWx0SW5UeXBlU3BlY2lmaWVyKXR5cGVkZWNsc3Bl Yyk7DQogICB9DQoNCiAgICgNCiAgICBMT09LQUhFQUQoZGVjbGFyYXRvcihuZXcgRGVjbGFy YXRvcigpKSkgZGVjbGFyYXRvcihkZWNsKSANCiAgIHwNCiAgICBhYnN0cmFjdF9kZWNsYXJh dG9yKCkNCiAgICkNCiAgICgiPSIgYXNzaWdubWVudF9leHByZXNzaW9uKCkpPw0KDQogICB7 DQoJCXBhcmFtZGVjbC5zZXRfZGVjbGFyYXRvcihkZWNsKTsNCgkJcmV0dXJuIHBhcmFtZGVj bDsNCiAgIH0NCn0NCg0Kdm9pZCBpbml0aWFsaXplcigpIDoNCnt9DQp7DQogICAgTE9PS0FI RUFEKDMpDQogICAgICJ7IiBpbml0aWFsaXplcigpICgiLCIgaW5pdGlhbGl6ZXIoKSkqICJ9 Ig0KICAgfA0KICAgIGFzc2lnbm1lbnRfZXhwcmVzc2lvbigpDQp9DQoNCnZvaWQgdHlwZV9u YW1lKCkgOg0Ke30NCnsNCiAgIGRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKSBhYnN0cmFjdF9k ZWNsYXJhdG9yKCkNCn0NCg0Kdm9pZCBhYnN0cmFjdF9kZWNsYXJhdG9yKCkgOg0Ke30NCnsN CiAgIFsgTE9PS0FIRUFEKDIpICgNCiAgICAiKCIgYWJzdHJhY3RfZGVjbGFyYXRvcigpICAg IikiDQogICAgKGFic3RyYWN0X2RlY2xhcmF0b3Jfc3VmZml4KCkpKw0KICAgfA0KICAgICgi WyIgKGNvbnN0YW50X2V4cHJlc3Npb24oKSk/ICJdIikrDQogICB8DQogICAgcHRyX29wZXJh dG9yKCkgYWJzdHJhY3RfZGVjbGFyYXRvcigpICkNCiAgIF0NCn0NCg0Kdm9pZCBhYnN0cmFj dF9kZWNsYXJhdG9yX3N1ZmZpeCgpIDoNCnt9DQp7DQogICAgIlsiICggY29uc3RhbnRfZXhw cmVzc2lvbigpICk/ICAiXSINCiAgIHwNCiAgICAiKCIgKHBhcmFtZXRlcl9saXN0KCkpPyAi KSINCn0NCg0Kdm9pZCB0ZW1wbGF0ZV9oZWFkKCkgOg0Ke30NCnsNCiAgICJ0ZW1wbGF0ZSIg IjwiIHRlbXBsYXRlX3BhcmFtZXRlcl9saXN0KCkgIj4iDQp9DQoNCnZvaWQgdGVtcGxhdGVf cGFyYW1ldGVyX2xpc3QoKSA6DQp7fQ0Kew0KICAgdGVtcGxhdGVfcGFyYW1ldGVyKCkgKCIs IiB0ZW1wbGF0ZV9wYXJhbWV0ZXIoKSkqDQp9DQoNCnZvaWQgdGVtcGxhdGVfcGFyYW1ldGVy KCkgOg0KeyBUb2tlbiB0OyB9DQp7DQogICAgTE9PS0FIRUFEKDMpDQogICAgICAiY2xhc3Mi IHQ9PElEPiB7IHN5bS5QdXRUeXBlTmFtZSh0LmltYWdlKTsgfQ0KICAgfA0KICAgIHBhcmFt ZXRlcl9kZWNsYXJhdGlvbigpDQp9DQoNCnZvaWQgdGVtcGxhdGVfaWQoKSA6DQp7fQ0Kew0K ICAgPElEPiAiPCIgdGVtcGxhdGVfYXJndW1lbnRfbGlzdCgpICI+Ig0KfQ0KDQp2b2lkIHRl bXBsYXRlX2FyZ3VtZW50X2xpc3QoKSA6DQp7fQ0Kew0KICAgdGVtcGxhdGVfYXJndW1lbnQo KSAoIiwiIHRlbXBsYXRlX2FyZ3VtZW50KCkpKg0KfQ0KDQp2b2lkIHRlbXBsYXRlX2FyZ3Vt ZW50KCkgOg0Ke30NCnsNCiAgICBMT09LQUhFQUQoMykNCiAgICAgIHR5cGVfbmFtZSgpDQog ICB8DQogICAgc2hpZnRfZXhwcmVzc2lvbigpDQp9DQoNCnZvaWQgc3RhdGVtZW50X2xpc3Qo KSA6DQp7fQ0KeyAgDQogICAoTE9PS0FIRUFEKHN0YXRlbWVudCgpKSBzdGF0ZW1lbnQoKSkr DQp9DQoNCnZvaWQgc3RhdGVtZW50KCkgOg0Ke30NCnsNCiAgICBMT09LQUhFQUQoIGRlY2xh cmF0aW9uKCkgKQ0KICAgICAgZGVjbGFyYXRpb24oKQ0KICAgfA0KICAgIExPT0tBSEVBRCgg ZXhwcmVzc2lvbigpICI7IiApDQogICAgICBleHByZXNzaW9uKCkgIjsiDQogICB8DQogICAg Y29tcG91bmRfc3RhdGVtZW50KCkNCiAgIHwNCiAgICBzZWxlY3Rpb25fc3RhdGVtZW50KCkN CiAgIHwNCiAgICBqdW1wX3N0YXRlbWVudCgpDQogICB8DQogICAgIjsiDQogICB8DQogICAg dHJ5X2Jsb2NrKCkNCiAgIHwNCiAgICB0aHJvd19zdGF0ZW1lbnQoKQ0KICAgfA0KICAgIExP T0tBSEVBRCgyKQ0KICAgICAgbGFiZWxlZF9zdGF0ZW1lbnQoKQ0KICAgfA0KICAgIGl0ZXJh dGlvbl9zdGF0ZW1lbnQoKQ0KfQ0KDQp2b2lkIGxhYmVsZWRfc3RhdGVtZW50KCkgOg0Ke30N CnsNCiAgICA8SUQ+ICI6IiBzdGF0ZW1lbnQoKQ0KICAgfA0KICAgICJjYXNlIiBjb25zdGFu dF9leHByZXNzaW9uKCkgICI6IiBzdGF0ZW1lbnQoKQ0KICAgfA0KICAgICJkZWZhdWx0IiAg IjoiIHN0YXRlbWVudCgpDQp9DQoNCnZvaWQgY29tcG91bmRfc3RhdGVtZW50KCkgOg0Ke30N CnsNCiAgICJ7Ig0KDQogICB7IHN5bS5PcGVuU2NvcGUobnVsbCwgZmFsc2UpOyB9DQoNCiAg IChzdGF0ZW1lbnRfbGlzdCgpKT8NCg0KICAgeyBzeW0uQ2xvc2VTY29wZSgpOyB9DQoNCiAg ICJ9Ig0KfQ0KDQp2b2lkIHNlbGVjdGlvbl9zdGF0ZW1lbnQoKSA6DQp7fQ0Kew0KICAgICJp ZiIgIigiIGV4cHJlc3Npb24oKSAiKSIgc3RhdGVtZW50KCkNCiAgICAgKExPT0tBSEVBRCgy KSAiZWxzZSIgc3RhdGVtZW50KCkpPw0KICAgfA0KICAgICJzd2l0Y2giICIoIiBleHByZXNz aW9uKCkgIikiIHN0YXRlbWVudCgpDQp9DQoNCnZvaWQgaXRlcmF0aW9uX3N0YXRlbWVudCgp IDoNCnt9DQp7DQogICAgIndoaWxlIiAiKCIgZXhwcmVzc2lvbigpICIpIiBzdGF0ZW1lbnQo KQ0KICAgfA0KICAgICJkbyIgc3RhdGVtZW50KCkgIndoaWxlIiAiKCIgZXhwcmVzc2lvbigp ICIpIiAiOyINCiAgIHwNCiAgICAiZm9yIiAiKCIgKExPT0tBSEVBRCgzKSBkZWNsYXJhdGlv bigpIHwgZXhwcmVzc2lvbigpICI7IiB8ICI7IikNCiAgICAoZXhwcmVzc2lvbigpKT8gIjsi IChleHByZXNzaW9uKCkpPyAiKSIgc3RhdGVtZW50KCkNCn0NCg0Kdm9pZCBqdW1wX3N0YXRl bWVudCgpIDoNCnt9DQp7DQogICAgImdvdG8iIDxJRD4gIjsiDQogICB8DQogICAgImNvbnRp bnVlIiAiOyINCiAgIHwNCiAgICAiYnJlYWsiICI7Ig0KICAgfA0KICAgICJyZXR1cm4iIChl eHByZXNzaW9uKCkpPyAiOyINCn0NCg0Kdm9pZCB0cnlfYmxvY2soKSA6DQp7fQ0Kew0KICAg InRyeSIgY29tcG91bmRfc3RhdGVtZW50KCkgKGhhbmRsZXIoKSkqDQp9DQoNCnZvaWQgaGFu ZGxlcigpIDoNCnt9DQp7DQogICAiY2F0Y2giICIoIiBleGNlcHRpb25fZGVjbGFyYXRpb24o KSAiKSINCiAgIGNvbXBvdW5kX3N0YXRlbWVudCgpDQogfA0KICAgImZpbmFsbHkiIGNvbXBv dW5kX3N0YXRlbWVudCgpDQp9DQoNCnZvaWQgZXhjZXB0aW9uX2RlY2xhcmF0aW9uKCkgOg0K e30NCnsgICAgcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2xpc3QoKQ0KICAgfA0KICAgICAiLi4u Ig0KfQ0KDQp2b2lkIHRocm93X3N0YXRlbWVudCgpIDoNCnt9DQp7ICAgICJ0aHJvdyIgKGFz c2lnbm1lbnRfZXhwcmVzc2lvbigpKT8gIjsiDQp9DQoNCnZvaWQgZXhwcmVzc2lvbigpIDoN Cnt9DQp7DQogICBhc3NpZ25tZW50X2V4cHJlc3Npb24oKSAoIExPT0tBSEVBRCgyKSAiLCIg YXNzaWdubWVudF9leHByZXNzaW9uKCkpKg0KfQ0KDQp2b2lkIGFzc2lnbm1lbnRfZXhwcmVz c2lvbigpIDoNCnt9DQp7DQogICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbigpDQogICAgKCgi PSINCiAgIHwgIio9Ig0KICAgfCAiLz0iDQogICB8ICIlPSINCiAgIHwgIis9Ig0KICAgfCAi LT0iDQogICB8ICI8PD0iDQogICB8ICI+Pj0iDQogICB8ICImPSINCiAgIHwgIl49Ig0KICAg fCAifD0iDQogICApDQogICBhc3NpZ25tZW50X2V4cHJlc3Npb24oKQ0KICAgKT8NCn0NCg0K dm9pZCBjb25kaXRpb25hbF9leHByZXNzaW9uKCkgOg0Ke30NCnsgICBsb2dpY2FsX29yX2V4 cHJlc3Npb24oKQ0KICAgKCI/IiBjb25kaXRpb25hbF9leHByZXNzaW9uKCkgICI6IiBjb25k aXRpb25hbF9leHByZXNzaW9uKCkpPw0KfQ0KDQp2b2lkIGNvbnN0YW50X2V4cHJlc3Npb24o KSA6DQp7fQ0KeyAgICBjb25kaXRpb25hbF9leHByZXNzaW9uKCkNCn0NCg0Kdm9pZCBsb2dp Y2FsX29yX2V4cHJlc3Npb24oKSA6DQp7fQ0KeyAgICBsb2dpY2FsX2FuZF9leHByZXNzaW9u KCkgKCAifHwiIGxvZ2ljYWxfYW5kX2V4cHJlc3Npb24oKSkqDQp9DQoNCnZvaWQgbG9naWNh bF9hbmRfZXhwcmVzc2lvbigpIDoNCnt9DQp7ICAgIGluY2x1c2l2ZV9vcl9leHByZXNzaW9u KCkgKCAiJiYiIGluY2x1c2l2ZV9vcl9leHByZXNzaW9uKCkpKg0KfQ0KDQp2b2lkIGluY2x1 c2l2ZV9vcl9leHByZXNzaW9uKCkgOg0Ke30NCnsgICAgZXhjbHVzaXZlX29yX2V4cHJlc3Np b24oKSggInwiIGV4Y2x1c2l2ZV9vcl9leHByZXNzaW9uKCkpKg0KfQ0KDQp2b2lkIGV4Y2x1 c2l2ZV9vcl9leHByZXNzaW9uKCkgOg0Ke30NCnsgICAgYW5kX2V4cHJlc3Npb24oKSggIl4i IGFuZF9leHByZXNzaW9uKCkpKg0KfQ0KDQp2b2lkIGFuZF9leHByZXNzaW9uKCkgOg0Ke30N CnsgICAgZXF1YWxpdHlfZXhwcmVzc2lvbigpKCBMT09LQUhFQUQoMikgIiYiIGVxdWFsaXR5 X2V4cHJlc3Npb24oKSkqDQp9DQoNCnZvaWQgZXF1YWxpdHlfZXhwcmVzc2lvbigpIDoNCnt9 DQp7ICAgIHJlbGF0aW9uYWxfZXhwcmVzc2lvbigpKCggIiE9IiB8ICI9PSIpIHJlbGF0aW9u YWxfZXhwcmVzc2lvbigpKSoNCn0NCg0Kdm9pZCByZWxhdGlvbmFsX2V4cHJlc3Npb24oKSA6 DQp7fQ0KeyAgc2hpZnRfZXhwcmVzc2lvbigpDQogICAoIA0KICAgICBMT09LQUhFQUQoMikN CiAgICAgKCANCiAgICAgICAgICI8Ig0KICAgICAgIHwgIj4iDQogICAgICAgfCAiPD0iDQog ICAgICAgfCAiPj0iDQogICAgICkNCiAgICAgc2hpZnRfZXhwcmVzc2lvbigpDQogICApKg0K fQ0KDQp2b2lkIHNoaWZ0X2V4cHJlc3Npb24oKSA6DQp7fQ0KeyAgICBhZGRpdGl2ZV9leHBy ZXNzaW9uKCkoKCAiPDwiIHwgIj4+IikgYWRkaXRpdmVfZXhwcmVzc2lvbigpKSoNCn0NCg0K dm9pZCBhZGRpdGl2ZV9leHByZXNzaW9uKCkgOg0Ke30NCnsgICAgbXVsdGlwbGljYXRpdmVf ZXhwcmVzc2lvbigpDQogICAoTE9PS0FIRUFEKDIpICggIisiIHwgIi0iKSBtdWx0aXBsaWNh dGl2ZV9leHByZXNzaW9uKCkpKg0KfQ0KDQp2b2lkIG11bHRpcGxpY2F0aXZlX2V4cHJlc3Np b24oKSA6DQp7fQ0KeyAgcG1fZXhwcmVzc2lvbigpDQogICAoTE9PS0FIRUFEKDIpICggIioi IHwgIi8iIHwgIiUiKSBwbV9leHByZXNzaW9uKCkpKg0KfQ0KDQp2b2lkIHBtX2V4cHJlc3Np b24oKSA6DQp7fQ0Kew0KICAgIGNhc3RfZXhwcmVzc2lvbigpICgoICIuKiIgfCAiLT4qIiAp IGNhc3RfZXhwcmVzc2lvbigpKSoNCn0NCg0Kdm9pZCBjYXN0X2V4cHJlc3Npb24oKSA6DQp7 fQ0KeyAgDQogICAgTE9PS0FIRUFEKCAiKCIgdHlwZV9uYW1lKCkgIikiICkNCiAgICAgIigi IHR5cGVfbmFtZSgpICIpIiBjYXN0X2V4cHJlc3Npb24oKQ0KICAgfA0KICAgICB1bmFyeV9l eHByZXNzaW9uKCkgICAgDQp9DQoNCnZvaWQgdW5hcnlfZXhwcmVzc2lvbigpIDoNCnt9DQp7 ICANCiAgICAgIisrIiB1bmFyeV9leHByZXNzaW9uKCkNCiAgIHwNCiAgICAgIi0tIiB1bmFy eV9leHByZXNzaW9uKCkNCiAgIHwNCiAgICAgTE9PS0FIRUFEKDMpDQogICAgIHVuYXJ5X29w ZXJhdG9yKCkgY2FzdF9leHByZXNzaW9uKCkNCiAgIHwNCiAgICAgInNpemVvZiINCiAgICAg KCANCiAgICAgICBMT09LQUhFQUQoIigiKQ0KICAgICAgICIoIiB0eXBlX25hbWUoKSAgIiki DQogICAgIHwNCiAgICAgICB1bmFyeV9leHByZXNzaW9uKCkNCiAgICAgKQ0KICAgfA0KICAg ICBwb3N0Zml4X2V4cHJlc3Npb24oKQ0KfQ0KDQp2b2lkIG5ld19leHByZXNzaW9uKCkgOg0K e30NCnsgICAgDQogICAoTE9PS0FIRUFEKCI6OiIpICgiOjoiKSk/DQogICAibmV3Ig0KICAg KA0KICAgICBMT09LQUhFQUQoIigiIHR5cGVfbmFtZSgpICIpIiApDQogICAgICAiKCIgdHlw ZV9uYW1lKCkgIikiIA0KICAgIHwNCiAgICAgKExPT0tBSEVBRCgiKCIgZXhwcmVzc2lvbl9s aXN0KCkgKSAiKCIgZXhwcmVzc2lvbl9saXN0KCkgIikiKT8NCiAgICAgKA0KICAgICAgIExP T0tBSEVBRCgiKCIgdHlwZV9uYW1lKCkgIikiICkNCiAgICAgICAiKCIgdHlwZV9uYW1lKCkg IikiIA0KICAgICAgfA0KICAgICAgIExPT0tBSEVBRChkZWNsYXJhdGlvbl9zcGVjaWZpZXJz KCkpDQogICAgICAgIG5ld190eXBlX2lkKCkNCiAgICAgKQ0KICAgKQ0KICAgKExPT0tBSEVB RChuZXdfaW5pdGlhbGl6ZXIoKSkgbmV3X2luaXRpYWxpemVyKCkpPw0KfQ0KDQp2b2lkIG5l d190eXBlX2lkKCkgOg0Ke30NCnsNCiAgIGRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKSAgDQog ICAoIExPT0tBSEVBRChuZXdfZGVjbGFyYXRvcigpKSBuZXdfZGVjbGFyYXRvcigpICk/DQp9 DQoNCnZvaWQgbmV3X2RlY2xhcmF0b3IoKSA6DQp7fQ0KeyANCiAgICAgZGlyZWN0X25ld19k ZWNsYXJhdG9yKCkNCiAgIHwNCiAgICAgcHRyX29wZXJhdG9yKCkgY3ZfcXVhbGlmaWVyX3Nl cSgpICBbIExPT0tBSEVBRCgyKSBuZXdfZGVjbGFyYXRvcigpIF0NCn0NCg0Kdm9pZCBkaXJl Y3RfbmV3X2RlY2xhcmF0b3IoKSA6DQp7fQ0Kew0KICAgKExPT0tBSEVBRCgyKSAiWyIgZXhw cmVzc2lvbigpICJdIiApKw0KfQ0KDQp2b2lkIG5ld19pbml0aWFsaXplcigpIDoNCnt9DQp7 ICAgICIoIiAoIGV4cHJlc3Npb25fbGlzdCgpICk/ICIpIg0KfQ0KDQp2b2lkIGRlbGV0ZV9l eHByZXNzaW9uKCkgOg0Ke30NCnsgICAgKCAiOjoiICk/ICJkZWxldGUiICggIlsiICJdIiAp PyBjYXN0X2V4cHJlc3Npb24oKQ0KfQ0KDQp2b2lkIHVuYXJ5X29wZXJhdG9yKCkgOg0Ke30N CnsgICAgIiYiDQogICB8ICIqIg0KICAgfCAiKyINCiAgIHwgIi0iDQogICB8ICJ+Ig0KICAg fCAiISINCn0NCg0Kdm9pZCBwb3N0Zml4X2V4cHJlc3Npb24oKSA6DQp7fQ0KeyAgDQogICBM T09LQUhFQUQoMykNCiAgICBwcmltYXJ5X2V4cHJlc3Npb24oKQ0KICAgICggTE9PS0FIRUFE KDIpICgNCiAgICAgIlsiIGV4cHJlc3Npb24oKSAiXSINCiAgICB8DQogICAgICIoIiAoIGV4 cHJlc3Npb25fbGlzdCgpICk/ICIpIg0KICAgIHwNCiAgICAgIi4iIGlkX2V4cHJlc3Npb24o KQ0KICAgIHwNCiAgICAgIi0+IiBpZF9leHByZXNzaW9uKCkNCiAgICB8DQogICAgICIrKyIN CiAgICB8DQogICAgICItLSIgKQ0KICAgICkqDQogIHwgDQogICBzaW1wbGVfdHlwZV9zcGVj aWZpZXIoKSAiKCIgKCBleHByZXNzaW9uX2xpc3QoKSApPyAiKSINCn0NCg0Kdm9pZCBpZF9l eHByZXNzaW9uKCkgOg0Ke30NCnsgICANCiAgIChMT09LQUhFQUQoc2NvcGVfb3ZlcnJpZGVf bG9va2FoZWFkKCkpIHNjb3BlX292ZXJyaWRlKCkpPw0KICAgKCAgICAgPElEPg0KICAgfCAi b3BlcmF0b3IiIG9wdG9yKCkNCiAgIHwgIn4iICA8SUQ+DQogICApDQp9DQoNCnZvaWQgcHJp bWFyeV9leHByZXNzaW9uKCkgOg0Ke30NCnsgIA0KICAgICAidGhpcyINCiAgIHwgKCBMT09L QUhFQUQoMikgPFNUUklORz4gKSsNCiAgIHwgIigiIGV4cHJlc3Npb24oKSAgIikiDQogICB8 DQogICAgIExPT0tBSEVBRCggKCI6OiIpPyAibmV3IikNCiAgICAgbmV3X2V4cHJlc3Npb24o KQ0KICAgfA0KICAgICBMT09LQUhFQUQoICgiOjoiKT8gImRlbGV0ZSIpDQogICAgIGRlbGV0 ZV9leHByZXNzaW9uKCkNCiAgIHwgaWRfZXhwcmVzc2lvbigpDQogICB8IGNvbnN0YW50KCkN Cn0NCg0Kdm9pZCBleHByZXNzaW9uX2xpc3QoKSA6DQp7fQ0KeyAgICBhc3NpZ25tZW50X2V4 cHJlc3Npb24oKSggIiwiIGFzc2lnbm1lbnRfZXhwcmVzc2lvbigpKSoNCn0NCg0Kdm9pZCBj b25zdGFudCgpIDoNCnt9DQp7ICAgIDxPQ1RBTElOVD4NCiAgIHwgPE9DVEFMTE9ORz4NCiAg IHwgPERFQ0lNQUxJTlQ+DQogICB8IDxERUNJTUFMTE9ORz4NCiAgIHwgPEhFWEFERUNJTUFM SU5UPg0KICAgfCA8SEVYQURFQ0lNQUxMT05HPg0KDQogICB8IDxVTlNJR05FRF9PQ1RBTElO VD4NCiAgIHwgPFVOU0lHTkVEX09DVEFMTE9ORz4NCiAgIHwgPFVOU0lHTkVEX0RFQ0lNQUxJ TlQ+DQogICB8IDxVTlNJR05FRF9ERUNJTUFMTE9ORz4NCiAgIHwgPFVOU0lHTkVEX0hFWEFE RUNJTUFMSU5UPg0KICAgfCA8VU5TSUdORURfSEVYQURFQ0lNQUxMT05HPg0KDQogICB8IDxD SEFSQUNURVI+DQogICB8IDxGTE9BVE9ORT4NCiAgIHwgPEZMT0FUVFdPPg0KICAgfCAidHJ1 ZSINCiAgIHwgImZhbHNlIg0KfQ0KDQp2b2lkIG9wdG9yKCkgOg0Ke30NCnsNCiAgICAgIm5l dyIgWyBMT09LQUhFQUQoMikgIlsiICJdIiBdDQogICB8ICJkZWxldGUiIFsgTE9PS0FIRUFE KDIpICJbIiAiXSIgXQ0KICAgfCAiKyINCiAgIHwgIi0iDQogICB8ICIqIg0KICAgfCAiLyIN CiAgIHwgIiUiDQogICB8ICJeIg0KICAgfCAiJiINCiAgIHwgInwiDQogICB8ICJ+Ig0KICAg fCAiISINCiAgIHwgIj0iDQogICB8ICI8Ig0KICAgfCAiPiINCiAgIHwgIis9Ig0KICAgfCAi LT0iDQogICB8ICIqPSINCiAgIHwgIi89Ig0KICAgfCAiJT0iDQogICB8ICJePSINCiAgIHwg IiY9Ig0KICAgfCAifD0iDQogICB8ICI8PCINCiAgIHwgIj4+IiANCiAgIHwgIj4+PSINCiAg IHwgIjw8PSINCiAgIHwgIj09Ig0KICAgfCAiIT0iDQogICB8ICI8PSINCiAgIHwgIj49Ig0K ICAgfCAiJiYiDQogICB8ICJ8fCINCiAgIHwgIisrIg0KICAgfCAiLS0iDQogICB8ICIsIg0K ICAgfCAiLT4qIg0KICAgfCAiLT4iDQogICB8ICIoIiAiKSINCiAgIHwgIlsiICJdIg0KICAg fCBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzKCkgKExPT0tBSEVBRCgyKSAoIioifCImIikpPw0K fQ0KDQp2b2lkIGV4Y2VwdGlvbl9zcGVjKCkgOg0Ke30NCnsNCiAgICJ0aHJvdyIgIigiIGV4 Y2VwdGlvbl9saXN0KCkgIikiDQp9DQoNCnZvaWQgZXhjZXB0aW9uX2xpc3QoKSA6DQp7fQ0K ew0KICAgdHlwZV9uYW1lKCkgKCAiLCIgdHlwZV9uYW1lKCkpKg0KfQ0KDQpUT0tFTiA6DQp7 DQogIDwgIElEIDogWyJhIi0ieiIsIkEiLSJaIiwgIl8iXSAoWyJhIi0ieiIsIkEiLSJaIiwi MCItIjkiLCJfIl0pKiA+DQp9DQoNCg0KLyplbmQqLw0K --IMA.Boundary.723641798--