LyoNClRoZSBNSVQgTGljZW5zZQ0KDQpDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmcNCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0Kb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQpPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQpUSEUgU09GVFdBUkUuDQoqLw0KLyoqDQogKiBAbGljZW5zZSBBbmd1bGFySlMgdjEuMy44DQogKiAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZw0KICogTGljZW5zZTogTUlUDQogKi8NCihmdW5jdGlvbih3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkgeyd1c2Ugc3RyaWN0JzsNCg0KdmFyICRzYW5pdGl6ZU1pbkVyciA9IGFuZ3VsYXIuJCRtaW5FcnIoJyRzYW5pdGl6ZScpOw0KDQovKioNCiAqIEBuZ2RvYyBtb2R1bGUNCiAqIEBuYW1lIG5nU2FuaXRpemUNCiAqIEBkZXNjcmlwdGlvbg0KICoNCiAqICMgbmdTYW5pdGl6ZQ0KICoNCiAqIFRoZSBgbmdTYW5pdGl6ZWAgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gc2FuaXRpemUgSFRNTC4NCiAqDQogKg0KICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9Im5nU2FuaXRpemUiPjwvZGl2Pg0KICoNCiAqIFNlZSB7QGxpbmsgbmdTYW5pdGl6ZS4kc2FuaXRpemUgYCRzYW5pdGl6ZWB9IGZvciB1c2FnZS4NCiAqLw0KDQovKg0KICogSFRNTCBQYXJzZXIgQnkgTWlza28gSGV2ZXJ5IChtaXNrb0BoZXZlcnkuY29tKQ0KICogYmFzZWQgb246ICBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpDQogKiBPcmlnaW5hbCBjb2RlIGJ5IEVyaWsgQXJ2aWRzc29uLCBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlDQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcw0KICoNCiAqIC8vIFVzZSBsaWtlIHNvOg0KICogaHRtbFBhcnNlcihodG1sU3RyaW5nLCB7DQogKiAgICAgc3RhcnQ6IGZ1bmN0aW9uKHRhZywgYXR0cnMsIHVuYXJ5KSB7fSwNCiAqICAgICBlbmQ6IGZ1bmN0aW9uKHRhZykge30sDQogKiAgICAgY2hhcnM6IGZ1bmN0aW9uKHRleHQpIHt9LA0KICogICAgIGNvbW1lbnQ6IGZ1bmN0aW9uKHRleHQpIHt9DQogKiB9KTsNCiAqDQogKi8NCg0KDQovKioNCiAqIEBuZ2RvYyBzZXJ2aWNlDQogKiBAbmFtZSAkc2FuaXRpemUNCiAqIEBraW5kIGZ1bmN0aW9uDQogKg0KICogQGRlc2NyaXB0aW9uDQogKiAgIFRoZSBpbnB1dCBpcyBzYW5pdGl6ZWQgYnkgcGFyc2luZyB0aGUgSFRNTCBpbnRvIHRva2Vucy4gQWxsIHNhZmUgdG9rZW5zIChmcm9tIGEgd2hpdGVsaXN0KSBhcmUNCiAqICAgdGhlbiBzZXJpYWxpemVkIGJhY2sgdG8gcHJvcGVybHkgZXNjYXBlZCBodG1sIHN0cmluZy4gVGhpcyBtZWFucyB0aGF0IG5vIHVuc2FmZSBpbnB1dCBjYW4gbWFrZQ0KICogICBpdCBpbnRvIHRoZSByZXR1cm5lZCBzdHJpbmcsIGhvd2V2ZXIsIHNpbmNlIG91ciBwYXJzZXIgaXMgbW9yZSBzdHJpY3QgdGhhbiBhIHR5cGljYWwgYnJvd3Nlcg0KICogICBwYXJzZXIsIGl0J3MgcG9zc2libGUgdGhhdCBzb21lIG9ic2N1cmUgaW5wdXQsIHdoaWNoIHdvdWxkIGJlIHJlY29nbml6ZWQgYXMgdmFsaWQgSFRNTCBieSBhDQogKiAgIGJyb3dzZXIsIHdvbid0IG1ha2UgaXQgdGhyb3VnaCB0aGUgc2FuaXRpemVyLiBUaGUgaW5wdXQgbWF5IGFsc28gY29udGFpbiBTVkcgbWFya3VwLg0KICogICBUaGUgd2hpdGVsaXN0IGlzIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZ1bmN0aW9ucyBgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3RgIGFuZA0KICogICBgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0YCBvZiB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciBgJGNvbXBpbGVQcm92aWRlcmB9Lg0KICoNCiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIEhUTUwgaW5wdXQuDQogKiBAcmV0dXJucyB7c3RyaW5nfSBTYW5pdGl6ZWQgSFRNTC4NCiAqDQogKiBAZXhhbXBsZQ0KICAgPGV4YW1wbGUgbW9kdWxlPSJzYW5pdGl6ZUV4YW1wbGUiIGRlcHM9ImFuZ3VsYXItc2FuaXRpemUuanMiPg0KICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQogICAgIDxzY3JpcHQ+DQogICAgICAgICBhbmd1bGFyLm1vZHVsZSgnc2FuaXRpemVFeGFtcGxlJywgWyduZ1Nhbml0aXplJ10pDQogICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRzY2UnLCBmdW5jdGlvbigkc2NvcGUsICRzY2UpIHsNCiAgICAgICAgICAgICAkc2NvcGUuc25pcHBldCA9DQogICAgICAgICAgICAgICAnPHAgc3R5bGU9ImNvbG9yOmJsdWUiPmFuIGh0bWxcbicgKw0KICAgICAgICAgICAgICAgJzxlbSBvbm1vdXNlb3Zlcj0idGhpcy50ZXh0Q29udGVudD1cJ1BXTjNEIVwnIj5jbGljayBoZXJlPC9lbT5cbicgKw0KICAgICAgICAgICAgICAgJ3NuaXBwZXQ8L3A+JzsNCiAgICAgICAgICAgICAkc2NvcGUuZGVsaWJlcmF0ZWx5VHJ1c3REYW5nZXJvdXNTbmlwcGV0ID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICByZXR1cm4gJHNjZS50cnVzdEFzSHRtbCgkc2NvcGUuc25pcHBldCk7DQogICAgICAgICAgICAgfTsNCiAgICAgICAgICAgfV0pOw0KICAgICA8L3NjcmlwdD4NCiAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQogICAgICAgIFNuaXBwZXQ6IDx0ZXh0YXJlYSBuZy1tb2RlbD0ic25pcHBldCIgY29scz0iNjAiIHJvd3M9IjMiPjwvdGV4dGFyZWE+DQogICAgICAgPHRhYmxlPg0KICAgICAgICAgPHRyPg0KICAgICAgICAgICA8dGQ+RGlyZWN0aXZlPC90ZD4NCiAgICAgICAgICAgPHRkPkhvdzwvdGQ+DQogICAgICAgICAgIDx0ZD5Tb3VyY2U8L3RkPg0KICAgICAgICAgICA8dGQ+UmVuZGVyZWQ8L3RkPg0KICAgICAgICAgPC90cj4NCiAgICAgICAgIDx0ciBpZD0iYmluZC1odG1sLXdpdGgtc2FuaXRpemUiPg0KICAgICAgICAgICA8dGQ+bmctYmluZC1odG1sPC90ZD4NCiAgICAgICAgICAgPHRkPkF1dG9tYXRpY2FsbHkgdXNlcyAkc2FuaXRpemU8L3RkPg0KICAgICAgICAgICA8dGQ+PHByZT4mbHQ7ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldCImZ3Q7PGJyLz4mbHQ7L2RpdiZndDs8L3ByZT48L3RkPg0KICAgICAgICAgICA8dGQ+PGRpdiBuZy1iaW5kLWh0bWw9InNuaXBwZXQiPjwvZGl2PjwvdGQ+DQogICAgICAgICA8L3RyPg0KICAgICAgICAgPHRyIGlkPSJiaW5kLWh0bWwtd2l0aC10cnVzdCI+DQogICAgICAgICAgIDx0ZD5uZy1iaW5kLWh0bWw8L3RkPg0KICAgICAgICAgICA8dGQ+QnlwYXNzICRzYW5pdGl6ZSBieSBleHBsaWNpdGx5IHRydXN0aW5nIHRoZSBkYW5nZXJvdXMgdmFsdWU8L3RkPg0KICAgICAgICAgICA8dGQ+DQogICAgICAgICAgIDxwcmU+Jmx0O2RpdiBuZy1iaW5kLWh0bWw9ImRlbGliZXJhdGVseVRydXN0RGFuZ2Vyb3VzU25pcHBldCgpIiZndDsNCiZsdDsvZGl2Jmd0OzwvcHJlPg0KICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICA8dGQ+PGRpdiBuZy1iaW5kLWh0bWw9ImRlbGliZXJhdGVseVRydXN0RGFuZ2Vyb3VzU25pcHBldCgpIj48L2Rpdj48L3RkPg0KICAgICAgICAgPC90cj4NCiAgICAgICAgIDx0ciBpZD0iYmluZC1kZWZhdWx0Ij4NCiAgICAgICAgICAgPHRkPm5nLWJpbmQ8L3RkPg0KICAgICAgICAgICA8dGQ+QXV0b21hdGljYWxseSBlc2NhcGVzPC90ZD4NCiAgICAgICAgICAgPHRkPjxwcmU+Jmx0O2RpdiBuZy1iaW5kPSJzbmlwcGV0IiZndDs8YnIvPiZsdDsvZGl2Jmd0OzwvcHJlPjwvdGQ+DQogICAgICAgICAgIDx0ZD48ZGl2IG5nLWJpbmQ9InNuaXBwZXQiPjwvZGl2PjwvdGQ+DQogICAgICAgICA8L3RyPg0KICAgICAgIDwvdGFibGU+DQogICAgICAgPC9kaXY+DQogICA8L2ZpbGU+DQogICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCiAgICAgaXQoJ3Nob3VsZCBzYW5pdGl6ZSB0aGUgaHRtbCBzbmlwcGV0IGJ5IGRlZmF1bHQnLCBmdW5jdGlvbigpIHsNCiAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC1zYW5pdGl6ZSBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLg0KICAgICAgICAgdG9CZSgnPHA+YW4gaHRtbFxuPGVtPmNsaWNrIGhlcmU8L2VtPlxuc25pcHBldDwvcD4nKTsNCiAgICAgfSk7DQoNCiAgICAgaXQoJ3Nob3VsZCBpbmxpbmUgcmF3IHNuaXBwZXQgaWYgYm91bmQgdG8gYSB0cnVzdGVkIHZhbHVlJywgZnVuY3Rpb24oKSB7DQogICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjYmluZC1odG1sLXdpdGgtdHJ1c3QgZGl2JykpLmdldElubmVySHRtbCgpKS4NCiAgICAgICAgIHRvQmUoIjxwIHN0eWxlPVwiY29sb3I6Ymx1ZVwiPmFuIGh0bWxcbiIgKw0KICAgICAgICAgICAgICAiPGVtIG9ubW91c2VvdmVyPVwidGhpcy50ZXh0Q29udGVudD0nUFdOM0QhJ1wiPmNsaWNrIGhlcmU8L2VtPlxuIiArDQogICAgICAgICAgICAgICJzbmlwcGV0PC9wPiIpOw0KICAgICB9KTsNCg0KICAgICBpdCgnc2hvdWxkIGVzY2FwZSBzbmlwcGV0IHdpdGhvdXQgYW55IGZpbHRlcicsIGZ1bmN0aW9uKCkgew0KICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnI2JpbmQtZGVmYXVsdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLg0KICAgICAgICAgdG9CZSgiJmx0O3Agc3R5bGU9XCJjb2xvcjpibHVlXCImZ3Q7YW4gaHRtbFxuIiArDQogICAgICAgICAgICAgICImbHQ7ZW0gb25tb3VzZW92ZXI9XCJ0aGlzLnRleHRDb250ZW50PSdQV04zRCEnXCImZ3Q7Y2xpY2sgaGVyZSZsdDsvZW0mZ3Q7XG4iICsNCiAgICAgICAgICAgICAgInNuaXBwZXQmbHQ7L3AmZ3Q7Iik7DQogICAgIH0pOw0KDQogICAgIGl0KCdzaG91bGQgdXBkYXRlJywgZnVuY3Rpb24oKSB7DQogICAgICAgZWxlbWVudChieS5tb2RlbCgnc25pcHBldCcpKS5jbGVhcigpOw0KICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3NuaXBwZXQnKSkuc2VuZEtleXMoJ25ldyA8YiBvbmNsaWNrPSJhbGVydCgxKSI+dGV4dDwvYj4nKTsNCiAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC1zYW5pdGl6ZSBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLg0KICAgICAgICAgdG9CZSgnbmV3IDxiPnRleHQ8L2I+Jyk7DQogICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjYmluZC1odG1sLXdpdGgtdHJ1c3QgZGl2JykpLmdldElubmVySHRtbCgpKS50b0JlKA0KICAgICAgICAgJ25ldyA8YiBvbmNsaWNrPSJhbGVydCgxKSI+dGV4dDwvYj4nKTsNCiAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWRlZmF1bHQgZGl2JykpLmdldElubmVySHRtbCgpKS50b0JlKA0KICAgICAgICAgIm5ldyAmbHQ7YiBvbmNsaWNrPVwiYWxlcnQoMSlcIiZndDt0ZXh0Jmx0Oy9iJmd0OyIpOw0KICAgICB9KTsNCiAgIDwvZmlsZT4NCiAgIDwvZXhhbXBsZT4NCiAqLw0KZnVuY3Rpb24gJFNhbml0aXplUHJvdmlkZXIoKSB7DQogIHRoaXMuJGdldCA9IFsnJCRzYW5pdGl6ZVVyaScsIGZ1bmN0aW9uKCQkc2FuaXRpemVVcmkpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oaHRtbCkgew0KICAgICAgdmFyIGJ1ZiA9IFtdOw0KICAgICAgaHRtbFBhcnNlcihodG1sLCBodG1sU2FuaXRpemVXcml0ZXIoYnVmLCBmdW5jdGlvbih1cmksIGlzSW1hZ2UpIHsNCiAgICAgICAgcmV0dXJuICEvXnVuc2FmZS8udGVzdCgkJHNhbml0aXplVXJpKHVyaSwgaXNJbWFnZSkpOw0KICAgICAgfSkpOw0KICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKTsNCiAgICB9Ow0KICB9XTsNCn0NCg0KZnVuY3Rpb24gc2FuaXRpemVUZXh0KGNoYXJzKSB7DQogIHZhciBidWYgPSBbXTsNCiAgdmFyIHdyaXRlciA9IGh0bWxTYW5pdGl6ZVdyaXRlcihidWYsIGFuZ3VsYXIubm9vcCk7DQogIHdyaXRlci5jaGFycyhjaGFycyk7DQogIHJldHVybiBidWYuam9pbignJyk7DQp9DQoNCg0KLy8gUmVndWxhciBFeHByZXNzaW9ucyBmb3IgcGFyc2luZyB0YWdzIGFuZCBhdHRyaWJ1dGVzDQp2YXIgU1RBUlRfVEFHX1JFR0VYUCA9DQogICAgICAgL148KCg/OlthLXpBLVpdKVtcdzotXSopKCg/OlxzK1tcdzotXSsoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKihcLz8pXHMqKD4/KS8sDQogIEVORF9UQUdfUkVHRVhQID0gL148XC9ccyooW1x3Oi1dKylbXj5dKj4vLA0KICBBVFRSX1JFR0VYUCA9IC8oW1x3Oi1dKykoPzpccyo9XHMqKD86KD86IigoPzpbXiJdKSopIil8KD86JygoPzpbXiddKSopJyl8KFtePlxzXSspKSk/L2csDQogIEJFR0lOX1RBR19SRUdFWFAgPSAvXjwvLA0KICBCRUdJTkdfRU5EX1RBR0VfUkVHRVhQID0gL148XC8vLA0KICBDT01NRU5UX1JFR0VYUCA9IC88IS0tKC4qPyktLT4vZywNCiAgRE9DVFlQRV9SRUdFWFAgPSAvPCFET0NUWVBFKFtePl0qPyk+L2ksDQogIENEQVRBX1JFR0VYUCA9IC88IVxbQ0RBVEFcWyguKj8pXV0+L2csDQogIFNVUlJPR0FURV9QQUlSX1JFR0VYUCA9IC9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZywNCiAgLy8gTWF0Y2ggZXZlcnl0aGluZyBvdXRzaWRlIG9mIG5vcm1hbCBjaGFycyBhbmQgIiAocXVvdGUgY2hhcmFjdGVyKQ0KICBOT05fQUxQSEFOVU1FUklDX1JFR0VYUCA9IC8oW15cIy1+fCB8IV0pL2c7DQoNCg0KLy8gR29vZCBzb3VyY2Ugb2YgaW5mbyBhYm91dCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcw0KLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy9PdmVydmlldy5odG1sI3NlbWFudGljcw0KLy8gaHR0cDovL3NpbW9uLmh0bWw1Lm9yZy9odG1sLWVsZW1lbnRzDQoNCi8vIFNhZmUgVm9pZCBFbGVtZW50cyAtIEhUTUw1DQovLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjdm9pZC1lbGVtZW50cw0KdmFyIHZvaWRFbGVtZW50cyA9IG1ha2VNYXAoImFyZWEsYnIsY29sLGhyLGltZyx3YnIiKTsNCg0KLy8gRWxlbWVudHMgdGhhdCB5b3UgY2FuLCBpbnRlbnRpb25hbGx5LCBsZWF2ZSBvcGVuIChhbmQgd2hpY2ggY2xvc2UgdGhlbXNlbHZlcykNCi8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCNvcHRpb25hbC10YWdzDQp2YXIgb3B0aW9uYWxFbmRUYWdCbG9ja0VsZW1lbnRzID0gbWFrZU1hcCgiY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLA0KICAgIG9wdGlvbmFsRW5kVGFnSW5saW5lRWxlbWVudHMgPSBtYWtlTWFwKCJycCxydCIpLA0KICAgIG9wdGlvbmFsRW5kVGFnRWxlbWVudHMgPSBhbmd1bGFyLmV4dGVuZCh7fSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxFbmRUYWdJbmxpbmVFbGVtZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxFbmRUYWdCbG9ja0VsZW1lbnRzKTsNCg0KLy8gU2FmZSBCbG9jayBFbGVtZW50cyAtIEhUTUw1DQp2YXIgYmxvY2tFbGVtZW50cyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBvcHRpb25hbEVuZFRhZ0Jsb2NrRWxlbWVudHMsIG1ha2VNYXAoImFkZHJlc3MsYXJ0aWNsZSwiICsNCiAgICAgICAgImFzaWRlLGJsb2NrcXVvdGUsY2FwdGlvbixjZW50ZXIsZGVsLGRpcixkaXYsZGwsZmlndXJlLGZpZ2NhcHRpb24sZm9vdGVyLGgxLGgyLGgzLGg0LGg1LCIgKw0KICAgICAgICAiaDYsaGVhZGVyLGhncm91cCxocixpbnMsbWFwLG1lbnUsbmF2LG9sLHByZSxzY3JpcHQsc2VjdGlvbix0YWJsZSx1bCIpKTsNCg0KLy8gSW5saW5lIEVsZW1lbnRzIC0gSFRNTDUNCnZhciBpbmxpbmVFbGVtZW50cyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBvcHRpb25hbEVuZFRhZ0lubGluZUVsZW1lbnRzLCBtYWtlTWFwKCJhLGFiYnIsYWNyb255bSxiLCIgKw0KICAgICAgICAiYmRpLGJkbyxiaWcsYnIsY2l0ZSxjb2RlLGRlbCxkZm4sZW0sZm9udCxpLGltZyxpbnMsa2JkLGxhYmVsLG1hcCxtYXJrLHEscnVieSxycCxydCxzLCIgKw0KICAgICAgICAic2FtcCxzbWFsbCxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHR0LHUsdmFyIikpOw0KDQovLyBTVkcgRWxlbWVudHMNCi8vIGh0dHBzOi8vd2lraS53aGF0d2cub3JnL3dpa2kvU2FuaXRpemF0aW9uX3J1bGVzI3N2Z19FbGVtZW50cw0KdmFyIHN2Z0VsZW1lbnRzID0gbWFrZU1hcCgiYW5pbWF0ZSxhbmltYXRlQ29sb3IsYW5pbWF0ZU1vdGlvbixhbmltYXRlVHJhbnNmb3JtLGNpcmNsZSxkZWZzLCIgKw0KICAgICAgICAiZGVzYyxlbGxpcHNlLGZvbnQtZmFjZSxmb250LWZhY2UtbmFtZSxmb250LWZhY2Utc3JjLGcsZ2x5cGgsaGtlcm4saW1hZ2UsbGluZWFyR3JhZGllbnQsIiArDQogICAgICAgICJsaW5lLG1hcmtlcixtZXRhZGF0YSxtaXNzaW5nLWdseXBoLG1wYXRoLHBhdGgscG9seWdvbixwb2x5bGluZSxyYWRpYWxHcmFkaWVudCxyZWN0LHNldCwiICsNCiAgICAgICAgInN0b3Asc3ZnLHN3aXRjaCx0ZXh0LHRpdGxlLHRzcGFuLHVzZSIpOw0KDQovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykNCnZhciBzcGVjaWFsRWxlbWVudHMgPSBtYWtlTWFwKCJzY3JpcHQsc3R5bGUiKTsNCg0KdmFyIHZhbGlkRWxlbWVudHMgPSBhbmd1bGFyLmV4dGVuZCh7fSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZEVsZW1lbnRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0VsZW1lbnRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVFbGVtZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxFbmRUYWdFbGVtZW50cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZnRWxlbWVudHMpOw0KDQovL0F0dHJpYnV0ZXMgdGhhdCBoYXZlIGhyZWYgYW5kIGhlbmNlIG5lZWQgdG8gYmUgc2FuaXRpemVkDQp2YXIgdXJpQXR0cnMgPSBtYWtlTWFwKCJiYWNrZ3JvdW5kLGNpdGUsaHJlZixsb25nZGVzYyxzcmMsdXNlbWFwLHhsaW5rOmhyZWYiKTsNCg0KdmFyIGh0bWxBdHRycyA9IG1ha2VNYXAoJ2FiYnIsYWxpZ24sYWx0LGF4aXMsYmdjb2xvcixib3JkZXIsY2VsbHBhZGRpbmcsY2VsbHNwYWNpbmcsY2xhc3MsY2xlYXIsJyArDQogICAgJ2NvbG9yLGNvbHMsY29sc3Bhbixjb21wYWN0LGNvb3JkcyxkaXIsZmFjZSxoZWFkZXJzLGhlaWdodCxocmVmbGFuZyxoc3BhY2UsJyArDQogICAgJ2lzbWFwLGxhbmcsbGFuZ3VhZ2Usbm9ocmVmLG5vd3JhcCxyZWwscmV2LHJvd3Mscm93c3BhbixydWxlcywnICsNCiAgICAnc2NvcGUsc2Nyb2xsaW5nLHNoYXBlLHNpemUsc3BhbixzdGFydCxzdW1tYXJ5LHRhcmdldCx0aXRsZSx0eXBlLCcgKw0KICAgICd2YWxpZ24sdmFsdWUsdnNwYWNlLHdpZHRoJyk7DQoNCi8vIFNWRyBhdHRyaWJ1dGVzICh3aXRob3V0ICJpZCIgYW5kICJuYW1lIiBhdHRyaWJ1dGVzKQ0KLy8gaHR0cHM6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9TYW5pdGl6YXRpb25fcnVsZXMjc3ZnX0F0dHJpYnV0ZXMNCnZhciBzdmdBdHRycyA9IG1ha2VNYXAoJ2FjY2VudC1oZWlnaHQsYWNjdW11bGF0ZSxhZGRpdGl2ZSxhbHBoYWJldGljLGFyYWJpYy1mb3JtLGFzY2VudCwnICsNCiAgICAnYXR0cmlidXRlTmFtZSxhdHRyaWJ1dGVUeXBlLGJhc2VQcm9maWxlLGJib3gsYmVnaW4sYnksY2FsY01vZGUsY2FwLWhlaWdodCxjbGFzcyxjb2xvciwnICsNCiAgICAnY29sb3ItcmVuZGVyaW5nLGNvbnRlbnQsY3gsY3ksZCxkeCxkeSxkZXNjZW50LGRpc3BsYXksZHVyLGVuZCxmaWxsLGZpbGwtcnVsZSxmb250LWZhbWlseSwnICsNCiAgICAnZm9udC1zaXplLGZvbnQtc3RyZXRjaCxmb250LXN0eWxlLGZvbnQtdmFyaWFudCxmb250LXdlaWdodCxmcm9tLGZ4LGZ5LGcxLGcyLGdseXBoLW5hbWUsJyArDQogICAgJ2dyYWRpZW50VW5pdHMsaGFuZ2luZyxoZWlnaHQsaG9yaXotYWR2LXgsaG9yaXotb3JpZ2luLXgsaWRlb2dyYXBoaWMsayxrZXlQb2ludHMsJyArDQogICAgJ2tleVNwbGluZXMsa2V5VGltZXMsbGFuZyxtYXJrZXItZW5kLG1hcmtlci1taWQsbWFya2VyLXN0YXJ0LG1hcmtlckhlaWdodCxtYXJrZXJVbml0cywnICsNCiAgICAnbWFya2VyV2lkdGgsbWF0aGVtYXRpY2FsLG1heCxtaW4sb2Zmc2V0LG9wYWNpdHksb3JpZW50LG9yaWdpbixvdmVybGluZS1wb3NpdGlvbiwnICsNCiAgICAnb3ZlcmxpbmUtdGhpY2tuZXNzLHBhbm9zZS0xLHBhdGgscGF0aExlbmd0aCxwb2ludHMscHJlc2VydmVBc3BlY3RSYXRpbyxyLHJlZlgscmVmWSwnICsNCiAgICAncmVwZWF0Q291bnQscmVwZWF0RHVyLHJlcXVpcmVkRXh0ZW5zaW9ucyxyZXF1aXJlZEZlYXR1cmVzLHJlc3RhcnQscm90YXRlLHJ4LHJ5LHNsb3BlLHN0ZW1oLCcgKw0KICAgICdzdGVtdixzdG9wLWNvbG9yLHN0b3Atb3BhY2l0eSxzdHJpa2V0aHJvdWdoLXBvc2l0aW9uLHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzLHN0cm9rZSwnICsNCiAgICAnc3Ryb2tlLWRhc2hhcnJheSxzdHJva2UtZGFzaG9mZnNldCxzdHJva2UtbGluZWNhcCxzdHJva2UtbGluZWpvaW4sc3Ryb2tlLW1pdGVybGltaXQsJyArDQogICAgJ3N0cm9rZS1vcGFjaXR5LHN0cm9rZS13aWR0aCxzeXN0ZW1MYW5ndWFnZSx0YXJnZXQsdGV4dC1hbmNob3IsdG8sdHJhbnNmb3JtLHR5cGUsdTEsdTIsJyArDQogICAgJ3VuZGVybGluZS1wb3NpdGlvbix1bmRlcmxpbmUtdGhpY2tuZXNzLHVuaWNvZGUsdW5pY29kZS1yYW5nZSx1bml0cy1wZXItZW0sdmFsdWVzLHZlcnNpb24sJyArDQogICAgJ3ZpZXdCb3gsdmlzaWJpbGl0eSx3aWR0aCx3aWR0aHMseCx4LWhlaWdodCx4MSx4Mix4bGluazphY3R1YXRlLHhsaW5rOmFyY3JvbGUseGxpbms6cm9sZSwnICsNCiAgICAneGxpbms6c2hvdyx4bGluazp0aXRsZSx4bGluazp0eXBlLHhtbDpiYXNlLHhtbDpsYW5nLHhtbDpzcGFjZSx4bWxucyx4bWxuczp4bGluayx5LHkxLHkyLCcgKw0KICAgICd6b29tQW5kUGFuJyk7DQoNCnZhciB2YWxpZEF0dHJzID0gYW5ndWxhci5leHRlbmQoe30sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaUF0dHJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmdBdHRycywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJzKTsNCg0KZnVuY3Rpb24gbWFrZU1hcChzdHIpIHsNCiAgdmFyIG9iaiA9IHt9LCBpdGVtcyA9IHN0ci5zcGxpdCgnLCcpLCBpOw0KICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIG9ialtpdGVtc1tpXV0gPSB0cnVlOw0KICByZXR1cm4gb2JqOw0KfQ0KDQoNCi8qKg0KICogQGV4YW1wbGUNCiAqIGh0bWxQYXJzZXIoaHRtbFN0cmluZywgew0KICogICAgIHN0YXJ0OiBmdW5jdGlvbih0YWcsIGF0dHJzLCB1bmFyeSkge30sDQogKiAgICAgZW5kOiBmdW5jdGlvbih0YWcpIHt9LA0KICogICAgIGNoYXJzOiBmdW5jdGlvbih0ZXh0KSB7fSwNCiAqICAgICBjb21tZW50OiBmdW5jdGlvbih0ZXh0KSB7fQ0KICogfSk7DQogKg0KICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgc3RyaW5nDQogKiBAcGFyYW0ge29iamVjdH0gaGFuZGxlcg0KICovDQpmdW5jdGlvbiBodG1sUGFyc2VyKGh0bWwsIGhhbmRsZXIpIHsNCiAgaWYgKHR5cGVvZiBodG1sICE9PSAnc3RyaW5nJykgew0KICAgIGlmIChodG1sID09PSBudWxsIHx8IHR5cGVvZiBodG1sID09PSAndW5kZWZpbmVkJykgew0KICAgICAgaHRtbCA9ICcnOw0KICAgIH0gZWxzZSB7DQogICAgICBodG1sID0gJycgKyBodG1sOw0KICAgIH0NCiAgfQ0KICB2YXIgaW5kZXgsIGNoYXJzLCBtYXRjaCwgc3RhY2sgPSBbXSwgbGFzdCA9IGh0bWwsIHRleHQ7DQogIHN0YWNrLmxhc3QgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHN0YWNrWyBzdGFjay5sZW5ndGggLSAxIF07IH07DQoNCiAgd2hpbGUgKGh0bWwpIHsNCiAgICB0ZXh0ID0gJyc7DQogICAgY2hhcnMgPSB0cnVlOw0KDQogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHNjcmlwdCBvciBzdHlsZSBlbGVtZW50DQogICAgaWYgKCFzdGFjay5sYXN0KCkgfHwgIXNwZWNpYWxFbGVtZW50c1sgc3RhY2subGFzdCgpIF0pIHsNCg0KICAgICAgLy8gQ29tbWVudA0KICAgICAgaWYgKGh0bWwuaW5kZXhPZigiPCEtLSIpID09PSAwKSB7DQogICAgICAgIC8vIGNvbW1lbnRzIGNvbnRhaW5pbmcgLS0gYXJlIG5vdCBhbGxvd2VkIHVubGVzcyB0aGV5IHRlcm1pbmF0ZSB0aGUgY29tbWVudA0KICAgICAgICBpbmRleCA9IGh0bWwuaW5kZXhPZigiLS0iLCA0KTsNCg0KICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBodG1sLmxhc3RJbmRleE9mKCItLT4iLCBpbmRleCkgPT09IGluZGV4KSB7DQogICAgICAgICAgaWYgKGhhbmRsZXIuY29tbWVudCkgaGFuZGxlci5jb21tZW50KGh0bWwuc3Vic3RyaW5nKDQsIGluZGV4KSk7DQogICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKGluZGV4ICsgMyk7DQogICAgICAgICAgY2hhcnMgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgLy8gRE9DVFlQRQ0KICAgICAgfSBlbHNlIGlmIChET0NUWVBFX1JFR0VYUC50ZXN0KGh0bWwpKSB7DQogICAgICAgIG1hdGNoID0gaHRtbC5tYXRjaChET0NUWVBFX1JFR0VYUCk7DQoNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShtYXRjaFswXSwgJycpOw0KICAgICAgICAgIGNoYXJzID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgIC8vIGVuZCB0YWcNCiAgICAgIH0gZWxzZSBpZiAoQkVHSU5HX0VORF9UQUdFX1JFR0VYUC50ZXN0KGh0bWwpKSB7DQogICAgICAgIG1hdGNoID0gaHRtbC5tYXRjaChFTkRfVEFHX1JFR0VYUCk7DQoNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgbWF0Y2hbMF0ucmVwbGFjZShFTkRfVEFHX1JFR0VYUCwgcGFyc2VFbmRUYWcpOw0KICAgICAgICAgIGNoYXJzID0gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgLy8gc3RhcnQgdGFnDQogICAgICB9IGVsc2UgaWYgKEJFR0lOX1RBR19SRUdFWFAudGVzdChodG1sKSkgew0KICAgICAgICBtYXRjaCA9IGh0bWwubWF0Y2goU1RBUlRfVEFHX1JFR0VYUCk7DQoNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgLy8gV2Ugb25seSBoYXZlIGEgdmFsaWQgc3RhcnQtdGFnIGlmIHRoZXJlIGlzIGEgJz4nLg0KICAgICAgICAgIGlmIChtYXRjaFs0XSkgew0KICAgICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgICBtYXRjaFswXS5yZXBsYWNlKFNUQVJUX1RBR19SRUdFWFAsIHBhcnNlU3RhcnRUYWcpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBjaGFycyA9IGZhbHNlOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIC8vIG5vIGVuZGluZyB0YWcgZm91bmQgLS0tIHRoaXMgcGllY2Ugc2hvdWxkIGJlIGVuY29kZWQgYXMgYW4gZW50aXR5Lg0KICAgICAgICAgIHRleHQgKz0gJzwnOw0KICAgICAgICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZygxKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBpZiAoY2hhcnMpIHsNCiAgICAgICAgaW5kZXggPSBodG1sLmluZGV4T2YoIjwiKTsNCg0KICAgICAgICB0ZXh0ICs9IGluZGV4IDwgMCA/IGh0bWwgOiBodG1sLnN1YnN0cmluZygwLCBpbmRleCk7DQogICAgICAgIGh0bWwgPSBpbmRleCA8IDAgPyAiIiA6IGh0bWwuc3Vic3RyaW5nKGluZGV4KTsNCg0KICAgICAgICBpZiAoaGFuZGxlci5jaGFycykgaGFuZGxlci5jaGFycyhkZWNvZGVFbnRpdGllcyh0ZXh0KSk7DQogICAgICB9DQoNCiAgICB9IGVsc2Ugew0KICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShuZXcgUmVnRXhwKCIoLiopPFxccypcXC9cXHMqIiArIHN0YWNrLmxhc3QoKSArICJbXj5dKj4iLCAnaScpLA0KICAgICAgICBmdW5jdGlvbihhbGwsIHRleHQpIHsNCiAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKENPTU1FTlRfUkVHRVhQLCAiJDEiKS5yZXBsYWNlKENEQVRBX1JFR0VYUCwgIiQxIik7DQoNCiAgICAgICAgICBpZiAoaGFuZGxlci5jaGFycykgaGFuZGxlci5jaGFycyhkZWNvZGVFbnRpdGllcyh0ZXh0KSk7DQoNCiAgICAgICAgICByZXR1cm4gIiI7DQogICAgICB9KTsNCg0KICAgICAgcGFyc2VFbmRUYWcoIiIsIHN0YWNrLmxhc3QoKSk7DQogICAgfQ0KDQogICAgaWYgKGh0bWwgPT0gbGFzdCkgew0KICAgICAgdGhyb3cgJHNhbml0aXplTWluRXJyKCdiYWRwYXJzZScsICJUaGUgc2FuaXRpemVyIHdhcyB1bmFibGUgdG8gcGFyc2UgdGhlIGZvbGxvd2luZyBibG9jayAiICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgaHRtbDogezB9IiwgaHRtbCk7DQogICAgfQ0KICAgIGxhc3QgPSBodG1sOw0KICB9DQoNCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzDQogIHBhcnNlRW5kVGFnKCk7DQoNCiAgZnVuY3Rpb24gcGFyc2VTdGFydFRhZyh0YWcsIHRhZ05hbWUsIHJlc3QsIHVuYXJ5KSB7DQogICAgdGFnTmFtZSA9IGFuZ3VsYXIubG93ZXJjYXNlKHRhZ05hbWUpOw0KICAgIGlmIChibG9ja0VsZW1lbnRzWyB0YWdOYW1lIF0pIHsNCiAgICAgIHdoaWxlIChzdGFjay5sYXN0KCkgJiYgaW5saW5lRWxlbWVudHNbIHN0YWNrLmxhc3QoKSBdKSB7DQogICAgICAgIHBhcnNlRW5kVGFnKCIiLCBzdGFjay5sYXN0KCkpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChvcHRpb25hbEVuZFRhZ0VsZW1lbnRzWyB0YWdOYW1lIF0gJiYgc3RhY2subGFzdCgpID09IHRhZ05hbWUpIHsNCiAgICAgIHBhcnNlRW5kVGFnKCIiLCB0YWdOYW1lKTsNCiAgICB9DQoNCiAgICB1bmFyeSA9IHZvaWRFbGVtZW50c1sgdGFnTmFtZSBdIHx8ICEhdW5hcnk7DQoNCiAgICBpZiAoIXVuYXJ5KQ0KICAgICAgc3RhY2sucHVzaCh0YWdOYW1lKTsNCg0KICAgIHZhciBhdHRycyA9IHt9Ow0KDQogICAgcmVzdC5yZXBsYWNlKEFUVFJfUkVHRVhQLA0KICAgICAgZnVuY3Rpb24obWF0Y2gsIG5hbWUsIGRvdWJsZVF1b3RlZFZhbHVlLCBzaW5nbGVRdW90ZWRWYWx1ZSwgdW5xdW90ZWRWYWx1ZSkgew0KICAgICAgICB2YXIgdmFsdWUgPSBkb3VibGVRdW90ZWRWYWx1ZQ0KICAgICAgICAgIHx8IHNpbmdsZVF1b3RlZFZhbHVlDQogICAgICAgICAgfHwgdW5xdW90ZWRWYWx1ZQ0KICAgICAgICAgIHx8ICcnOw0KDQogICAgICAgIGF0dHJzW25hbWVdID0gZGVjb2RlRW50aXRpZXModmFsdWUpOw0KICAgIH0pOw0KICAgIGlmIChoYW5kbGVyLnN0YXJ0KSBoYW5kbGVyLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSk7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZUVuZFRhZyh0YWcsIHRhZ05hbWUpIHsNCiAgICB2YXIgcG9zID0gMCwgaTsNCiAgICB0YWdOYW1lID0gYW5ndWxhci5sb3dlcmNhc2UodGFnTmFtZSk7DQogICAgaWYgKHRhZ05hbWUpDQogICAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQ0KICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pDQogICAgICAgIGlmIChzdGFja1sgcG9zIF0gPT0gdGFnTmFtZSkNCiAgICAgICAgICBicmVhazsNCg0KICAgIGlmIChwb3MgPj0gMCkgew0KICAgICAgLy8gQ2xvc2UgYWxsIHRoZSBvcGVuIGVsZW1lbnRzLCB1cCB0aGUgc3RhY2sNCiAgICAgIGZvciAoaSA9IHN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gcG9zOyBpLS0pDQogICAgICAgIGlmIChoYW5kbGVyLmVuZCkgaGFuZGxlci5lbmQoc3RhY2tbIGkgXSk7DQoNCiAgICAgIC8vIFJlbW92ZSB0aGUgb3BlbiBlbGVtZW50cyBmcm9tIHRoZSBzdGFjaw0KICAgICAgc3RhY2subGVuZ3RoID0gcG9zOw0KICAgIH0NCiAgfQ0KfQ0KDQp2YXIgaGlkZGVuUHJlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpOw0KdmFyIHNwYWNlUmUgPSAvXihccyopKFtcc1xTXSo/KShccyopJC87DQovKioNCiAqIGRlY29kZXMgYWxsIGVudGl0aWVzIGludG8gcmVndWxhciBzdHJpbmcNCiAqIEBwYXJhbSB2YWx1ZQ0KICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmcgd2l0aCBkZWNvZGVkIGVudGl0aWVzLg0KICovDQpmdW5jdGlvbiBkZWNvZGVFbnRpdGllcyh2YWx1ZSkgew0KICBpZiAoIXZhbHVlKSB7IHJldHVybiAnJzsgfQ0KDQogIC8vIE5vdGU6IElFOCBkb2VzIG5vdCBwcmVzZXJ2ZSBzcGFjZXMgYXQgdGhlIHN0YXJ0L2VuZCBvZiBpbm5lckhUTUwNCiAgLy8gc28gd2UgbXVzdCBjYXB0dXJlIHRoZW0gYW5kIHJlYXR0YWNoIHRoZW0gYWZ0ZXJ3YXJkDQogIHZhciBwYXJ0cyA9IHNwYWNlUmUuZXhlYyh2YWx1ZSk7DQogIHZhciBzcGFjZUJlZm9yZSA9IHBhcnRzWzFdOw0KICB2YXIgc3BhY2VBZnRlciA9IHBhcnRzWzNdOw0KICB2YXIgY29udGVudCA9IHBhcnRzWzJdOw0KICBpZiAoY29udGVudCkgew0KICAgIGhpZGRlblByZS5pbm5lckhUTUw9Y29udGVudC5yZXBsYWNlKC88L2csIiZsdDsiKTsNCiAgICAvLyBpbm5lclRleHQgZGVwZW5kcyBvbiBzdHlsaW5nIGFzIGl0IGRvZXNuJ3QgZGlzcGxheSBoaWRkZW4gZWxlbWVudHMuDQogICAgLy8gVGhlcmVmb3JlLCBpdCdzIGJldHRlciB0byB1c2UgdGV4dENvbnRlbnQgbm90IHRvIGNhdXNlIHVubmVjZXNzYXJ5DQogICAgLy8gcmVmbG93cy4gSG93ZXZlciwgSUU8OSBkb24ndCBzdXBwb3J0IHRleHRDb250ZW50IHNvIHRoZSBpbm5lclRleHQNCiAgICAvLyBmYWxsYmFjayBpcyBuZWNlc3NhcnkuDQogICAgY29udGVudCA9ICd0ZXh0Q29udGVudCcgaW4gaGlkZGVuUHJlID8NCiAgICAgIGhpZGRlblByZS50ZXh0Q29udGVudCA6IGhpZGRlblByZS5pbm5lclRleHQ7DQogIH0NCiAgcmV0dXJuIHNwYWNlQmVmb3JlICsgY29udGVudCArIHNwYWNlQWZ0ZXI7DQp9DQoNCi8qKg0KICogRXNjYXBlcyBhbGwgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMsIHNvIHRoYXQgdGhlDQogKiByZXN1bHRpbmcgc3RyaW5nIGNhbiBiZSBzYWZlbHkgaW5zZXJ0ZWQgaW50byBhdHRyaWJ1dGUgb3INCiAqIGVsZW1lbnQgdGV4dC4NCiAqIEBwYXJhbSB2YWx1ZQ0KICogQHJldHVybnMge3N0cmluZ30gZXNjYXBlZCB0ZXh0DQogKi8NCmZ1bmN0aW9uIGVuY29kZUVudGl0aWVzKHZhbHVlKSB7DQogIHJldHVybiB2YWx1ZS4NCiAgICByZXBsYWNlKC8mL2csICcmYW1wOycpLg0KICAgIHJlcGxhY2UoU1VSUk9HQVRFX1BBSVJfUkVHRVhQLCBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgdmFyIGhpID0gdmFsdWUuY2hhckNvZGVBdCgwKTsNCiAgICAgIHZhciBsb3cgPSB2YWx1ZS5jaGFyQ29kZUF0KDEpOw0KICAgICAgcmV0dXJuICcmIycgKyAoKChoaSAtIDB4RDgwMCkgKiAweDQwMCkgKyAobG93IC0gMHhEQzAwKSArIDB4MTAwMDApICsgJzsnOw0KICAgIH0pLg0KICAgIHJlcGxhY2UoTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFAsIGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICByZXR1cm4gJyYjJyArIHZhbHVlLmNoYXJDb2RlQXQoMCkgKyAnOyc7DQogICAgfSkuDQogICAgcmVwbGFjZSgvPC9nLCAnJmx0OycpLg0KICAgIHJlcGxhY2UoLz4vZywgJyZndDsnKTsNCn0NCg0KLyoqDQogKiBjcmVhdGUgYW4gSFRNTC9YTUwgd3JpdGVyIHdoaWNoIHdyaXRlcyB0byBidWZmZXINCiAqIEBwYXJhbSB7QXJyYXl9IGJ1ZiB1c2UgYnVmLmphaW4oJycpIHRvIGdldCBvdXQgc2FuaXRpemVkIGh0bWwgc3RyaW5nDQogKiBAcmV0dXJucyB7b2JqZWN0fSBpbiB0aGUgZm9ybSBvZiB7DQogKiAgICAgc3RhcnQ6IGZ1bmN0aW9uKHRhZywgYXR0cnMsIHVuYXJ5KSB7fSwNCiAqICAgICBlbmQ6IGZ1bmN0aW9uKHRhZykge30sDQogKiAgICAgY2hhcnM6IGZ1bmN0aW9uKHRleHQpIHt9LA0KICogICAgIGNvbW1lbnQ6IGZ1bmN0aW9uKHRleHQpIHt9DQogKiB9DQogKi8NCmZ1bmN0aW9uIGh0bWxTYW5pdGl6ZVdyaXRlcihidWYsIHVyaVZhbGlkYXRvcikgew0KICB2YXIgaWdub3JlID0gZmFsc2U7DQogIHZhciBvdXQgPSBhbmd1bGFyLmJpbmQoYnVmLCBidWYucHVzaCk7DQogIHJldHVybiB7DQogICAgc3RhcnQ6IGZ1bmN0aW9uKHRhZywgYXR0cnMsIHVuYXJ5KSB7DQogICAgICB0YWcgPSBhbmd1bGFyLmxvd2VyY2FzZSh0YWcpOw0KICAgICAgaWYgKCFpZ25vcmUgJiYgc3BlY2lhbEVsZW1lbnRzW3RhZ10pIHsNCiAgICAgICAgaWdub3JlID0gdGFnOw0KICAgICAgfQ0KICAgICAgaWYgKCFpZ25vcmUgJiYgdmFsaWRFbGVtZW50c1t0YWddID09PSB0cnVlKSB7DQogICAgICAgIG91dCgnPCcpOw0KICAgICAgICBvdXQodGFnKTsNCiAgICAgICAgYW5ndWxhci5mb3JFYWNoKGF0dHJzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7DQogICAgICAgICAgdmFyIGxrZXk9YW5ndWxhci5sb3dlcmNhc2Uoa2V5KTsNCiAgICAgICAgICB2YXIgaXNJbWFnZSA9ICh0YWcgPT09ICdpbWcnICYmIGxrZXkgPT09ICdzcmMnKSB8fCAobGtleSA9PT0gJ2JhY2tncm91bmQnKTsNCiAgICAgICAgICBpZiAodmFsaWRBdHRyc1tsa2V5XSA9PT0gdHJ1ZSAmJg0KICAgICAgICAgICAgKHVyaUF0dHJzW2xrZXldICE9PSB0cnVlIHx8IHVyaVZhbGlkYXRvcih2YWx1ZSwgaXNJbWFnZSkpKSB7DQogICAgICAgICAgICBvdXQoJyAnKTsNCiAgICAgICAgICAgIG91dChrZXkpOw0KICAgICAgICAgICAgb3V0KCc9IicpOw0KICAgICAgICAgICAgb3V0KGVuY29kZUVudGl0aWVzKHZhbHVlKSk7DQogICAgICAgICAgICBvdXQoJyInKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBvdXQodW5hcnkgPyAnLz4nIDogJz4nKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIGVuZDogZnVuY3Rpb24odGFnKSB7DQogICAgICAgIHRhZyA9IGFuZ3VsYXIubG93ZXJjYXNlKHRhZyk7DQogICAgICAgIGlmICghaWdub3JlICYmIHZhbGlkRWxlbWVudHNbdGFnXSA9PT0gdHJ1ZSkgew0KICAgICAgICAgIG91dCgnPC8nKTsNCiAgICAgICAgICBvdXQodGFnKTsNCiAgICAgICAgICBvdXQoJz4nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGFnID09IGlnbm9yZSkgew0KICAgICAgICAgIGlnbm9yZSA9IGZhbHNlOw0KICAgICAgICB9DQogICAgICB9LA0KICAgIGNoYXJzOiBmdW5jdGlvbihjaGFycykgew0KICAgICAgICBpZiAoIWlnbm9yZSkgew0KICAgICAgICAgIG91dChlbmNvZGVFbnRpdGllcyhjaGFycykpOw0KICAgICAgICB9DQogICAgICB9DQogIH07DQp9DQoNCg0KLy8gZGVmaW5lIG5nU2FuaXRpemUgbW9kdWxlIGFuZCByZWdpc3RlciAkc2FuaXRpemUgc2VydmljZQ0KYW5ndWxhci5tb2R1bGUoJ25nU2FuaXRpemUnLCBbXSkucHJvdmlkZXIoJyRzYW5pdGl6ZScsICRTYW5pdGl6ZVByb3ZpZGVyKTsNCg0KLyogZ2xvYmFsIHNhbml0aXplVGV4dDogZmFsc2UgKi8NCg0KLyoqDQogKiBAbmdkb2MgZmlsdGVyDQogKiBAbmFtZSBsaW5reQ0KICogQGtpbmQgZnVuY3Rpb24NCiAqDQogKiBAZGVzY3JpcHRpb24NCiAqIEZpbmRzIGxpbmtzIGluIHRleHQgaW5wdXQgYW5kIHR1cm5zIHRoZW0gaW50byBodG1sIGxpbmtzLiBTdXBwb3J0cyBodHRwL2h0dHBzL2Z0cC9tYWlsdG8gYW5kDQogKiBwbGFpbiBlbWFpbCBhZGRyZXNzIGxpbmtzLg0KICoNCiAqIFJlcXVpcmVzIHRoZSB7QGxpbmsgbmdTYW5pdGl6ZSBgbmdTYW5pdGl6ZWB9IG1vZHVsZSB0byBiZSBpbnN0YWxsZWQuDQogKg0KICogQHBhcmFtIHtzdHJpbmd9IHRleHQgSW5wdXQgdGV4dC4NCiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgV2luZG93IChfYmxhbmt8X3NlbGZ8X3BhcmVudHxfdG9wKSBvciBuYW1lZCBmcmFtZSB0byBvcGVuIGxpbmtzIGluLg0KICogQHJldHVybnMge3N0cmluZ30gSHRtbC1saW5raWZpZWQgdGV4dC4NCiAqDQogKiBAdXNhZ2UNCiAgIDxzcGFuIG5nLWJpbmQtaHRtbD0ibGlua3lfZXhwcmVzc2lvbiB8IGxpbmt5Ij48L3NwYW4+DQogKg0KICogQGV4YW1wbGUNCiAgIDxleGFtcGxlIG1vZHVsZT0ibGlua3lFeGFtcGxlIiBkZXBzPSJhbmd1bGFyLXNhbml0aXplLmpzIj4NCiAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQogICAgICAgPHNjcmlwdD4NCiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdsaW5reUV4YW1wbGUnLCBbJ25nU2FuaXRpemUnXSkNCiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCiAgICAgICAgICAgICAkc2NvcGUuc25pcHBldCA9DQogICAgICAgICAgICAgICAnUHJldHR5IHRleHQgd2l0aCBzb21lIGxpbmtzOlxuJysNCiAgICAgICAgICAgICAgICdodHRwOi8vYW5ndWxhcmpzLm9yZy8sXG4nKw0KICAgICAgICAgICAgICAgJ21haWx0bzp1c0Bzb21ld2hlcmUub3JnLFxuJysNCiAgICAgICAgICAgICAgICdhbm90aGVyQHNvbWV3aGVyZS5vcmcsXG4nKw0KICAgICAgICAgICAgICAgJ2FuZCBvbmUgbW9yZTogZnRwOi8vMTI3LjAuMC4xLy4nOw0KICAgICAgICAgICAgICRzY29wZS5zbmlwcGV0V2l0aFRhcmdldCA9ICdodHRwOi8vYW5ndWxhcmpzLm9yZy8nOw0KICAgICAgICAgICB9XSk7DQogICAgICAgPC9zY3JpcHQ+DQogICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQogICAgICAgU25pcHBldDogPHRleHRhcmVhIG5nLW1vZGVsPSJzbmlwcGV0IiBjb2xzPSI2MCIgcm93cz0iMyI+PC90ZXh0YXJlYT4NCiAgICAgICA8dGFibGU+DQogICAgICAgICA8dHI+DQogICAgICAgICAgIDx0ZD5GaWx0ZXI8L3RkPg0KICAgICAgICAgICA8dGQ+U291cmNlPC90ZD4NCiAgICAgICAgICAgPHRkPlJlbmRlcmVkPC90ZD4NCiAgICAgICAgIDwvdHI+DQogICAgICAgICA8dHIgaWQ9Imxpbmt5LWZpbHRlciI+DQogICAgICAgICAgIDx0ZD5saW5reSBmaWx0ZXI8L3RkPg0KICAgICAgICAgICA8dGQ+DQogICAgICAgICAgICAgPHByZT4mbHQ7ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldCB8IGxpbmt5IiZndDs8YnI+Jmx0Oy9kaXYmZ3Q7PC9wcmU+DQogICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgIDx0ZD4NCiAgICAgICAgICAgICA8ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldCB8IGxpbmt5Ij48L2Rpdj4NCiAgICAgICAgICAgPC90ZD4NCiAgICAgICAgIDwvdHI+DQogICAgICAgICA8dHIgaWQ9Imxpbmt5LXRhcmdldCI+DQogICAgICAgICAgPHRkPmxpbmt5IHRhcmdldDwvdGQ+DQogICAgICAgICAgPHRkPg0KICAgICAgICAgICAgPHByZT4mbHQ7ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldFdpdGhUYXJnZXQgfCBsaW5reTonX2JsYW5rJyImZ3Q7PGJyPiZsdDsvZGl2Jmd0OzwvcHJlPg0KICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgPHRkPg0KICAgICAgICAgICAgPGRpdiBuZy1iaW5kLWh0bWw9InNuaXBwZXRXaXRoVGFyZ2V0IHwgbGlua3k6J19ibGFuayciPjwvZGl2Pg0KICAgICAgICAgIDwvdGQ+DQogICAgICAgICA8L3RyPg0KICAgICAgICAgPHRyIGlkPSJlc2NhcGVkLWh0bWwiPg0KICAgICAgICAgICA8dGQ+bm8gZmlsdGVyPC90ZD4NCiAgICAgICAgICAgPHRkPjxwcmU+Jmx0O2RpdiBuZy1iaW5kPSJzbmlwcGV0IiZndDs8YnI+Jmx0Oy9kaXYmZ3Q7PC9wcmU+PC90ZD4NCiAgICAgICAgICAgPHRkPjxkaXYgbmctYmluZD0ic25pcHBldCI+PC9kaXY+PC90ZD4NCiAgICAgICAgIDwvdHI+DQogICAgICAgPC90YWJsZT4NCiAgICAgPC9maWxlPg0KICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCiAgICAgICBpdCgnc2hvdWxkIGxpbmtpZnkgdGhlIHNuaXBwZXQgd2l0aCB1cmxzJywgZnVuY3Rpb24oKSB7DQogICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGlua3ktZmlsdGVyJykpLmVsZW1lbnQoYnkuYmluZGluZygnc25pcHBldCB8IGxpbmt5JykpLmdldFRleHQoKSkuDQogICAgICAgICAgICAgdG9CZSgnUHJldHR5IHRleHQgd2l0aCBzb21lIGxpbmtzOiBodHRwOi8vYW5ndWxhcmpzLm9yZy8sIHVzQHNvbWV3aGVyZS5vcmcsICcgKw0KICAgICAgICAgICAgICAgICAgJ2Fub3RoZXJAc29tZXdoZXJlLm9yZywgYW5kIG9uZSBtb3JlOiBmdHA6Ly8xMjcuMC4wLjEvLicpOw0KICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnI2xpbmt5LWZpbHRlciBhJykpLmNvdW50KCkpLnRvRXF1YWwoNCk7DQogICAgICAgfSk7DQoNCiAgICAgICBpdCgnc2hvdWxkIG5vdCBsaW5raWZ5IHNuaXBwZXQgd2l0aG91dCB0aGUgbGlua3kgZmlsdGVyJywgZnVuY3Rpb24oKSB7DQogICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZXNjYXBlZC1odG1sJykpLmVsZW1lbnQoYnkuYmluZGluZygnc25pcHBldCcpKS5nZXRUZXh0KCkpLg0KICAgICAgICAgICAgIHRvQmUoJ1ByZXR0eSB0ZXh0IHdpdGggc29tZSBsaW5rczogaHR0cDovL2FuZ3VsYXJqcy5vcmcvLCBtYWlsdG86dXNAc29tZXdoZXJlLm9yZywgJyArDQogICAgICAgICAgICAgICAgICAnYW5vdGhlckBzb21ld2hlcmUub3JnLCBhbmQgb25lIG1vcmU6IGZ0cDovLzEyNy4wLjAuMS8uJyk7DQogICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcjZXNjYXBlZC1odG1sIGEnKSkuY291bnQoKSkudG9FcXVhbCgwKTsNCiAgICAgICB9KTsNCg0KICAgICAgIGl0KCdzaG91bGQgdXBkYXRlJywgZnVuY3Rpb24oKSB7DQogICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzbmlwcGV0JykpLmNsZWFyKCk7DQogICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzbmlwcGV0JykpLnNlbmRLZXlzKCduZXcgaHR0cDovL2xpbmsuJyk7DQogICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGlua3ktZmlsdGVyJykpLmVsZW1lbnQoYnkuYmluZGluZygnc25pcHBldCB8IGxpbmt5JykpLmdldFRleHQoKSkuDQogICAgICAgICAgICAgdG9CZSgnbmV3IGh0dHA6Ly9saW5rLicpOw0KICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnI2xpbmt5LWZpbHRlciBhJykpLmNvdW50KCkpLnRvRXF1YWwoMSk7DQogICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZXNjYXBlZC1odG1sJykpLmVsZW1lbnQoYnkuYmluZGluZygnc25pcHBldCcpKS5nZXRUZXh0KCkpDQogICAgICAgICAgICAgLnRvQmUoJ25ldyBodHRwOi8vbGluay4nKTsNCiAgICAgICB9KTsNCg0KICAgICAgIGl0KCdzaG91bGQgd29yayB3aXRoIHRoZSB0YXJnZXQgcHJvcGVydHknLCBmdW5jdGlvbigpIHsNCiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmt5LXRhcmdldCcpKS4NCiAgICAgICAgICAgIGVsZW1lbnQoYnkuYmluZGluZygic25pcHBldFdpdGhUYXJnZXQgfCBsaW5reTonX2JsYW5rJyIpKS5nZXRUZXh0KCkpLg0KICAgICAgICAgICAgdG9CZSgnaHR0cDovL2FuZ3VsYXJqcy5vcmcvJyk7DQogICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnI2xpbmt5LXRhcmdldCBhJykpLmdldEF0dHJpYnV0ZSgndGFyZ2V0JykpLnRvRXF1YWwoJ19ibGFuaycpOw0KICAgICAgIH0pOw0KICAgICA8L2ZpbGU+DQogICA8L2V4YW1wbGU+DQogKi8NCmFuZ3VsYXIubW9kdWxlKCduZ1Nhbml0aXplJykuZmlsdGVyKCdsaW5reScsIFsnJHNhbml0aXplJywgZnVuY3Rpb24oJHNhbml0aXplKSB7DQogIHZhciBMSU5LWV9VUkxfUkVHRVhQID0NCiAgICAgICAgLygoZnRwfGh0dHBzPyk6XC9cL3wod3d3XC4pfChtYWlsdG86KT9bQS1aYS16MC05Ll8lKy1dK0ApXFMqW15ccy47LCgpe308PiLigJ3iP5ldLywNCiAgICAgIE1BSUxUT19SRUdFWFAgPSAvXm1haWx0bzovOw0KDQogIHJldHVybiBmdW5jdGlvbih0ZXh0LCB0YXJnZXQpIHsNCiAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0Ow0KICAgIHZhciBtYXRjaDsNCiAgICB2YXIgcmF3ID0gdGV4dDsNCiAgICB2YXIgaHRtbCA9IFtdOw0KICAgIHZhciB1cmw7DQogICAgdmFyIGk7DQogICAgd2hpbGUgKChtYXRjaCA9IHJhdy5tYXRjaChMSU5LWV9VUkxfUkVHRVhQKSkpIHsNCiAgICAgIC8vIFdlIGNhbiBub3QgZW5kIGluIHRoZXNlIGFzIHRoZXkgYXJlIHNvbWV0aW1lcyBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBzZW50ZW5jZQ0KICAgICAgdXJsID0gbWF0Y2hbMF07DQogICAgICAvLyBpZiB3ZSBkaWQgbm90IG1hdGNoIGZ0cC9odHRwL3d3dy9tYWlsdG8gdGhlbiBhc3N1bWUgbWFpbHRvDQogICAgICBpZiAoIW1hdGNoWzJdICYmICFtYXRjaFs0XSkgew0KICAgICAgICB1cmwgPSAobWF0Y2hbM10gPyAnaHR0cDovLycgOiAnbWFpbHRvOicpICsgdXJsOw0KICAgICAgfQ0KICAgICAgaSA9IG1hdGNoLmluZGV4Ow0KICAgICAgYWRkVGV4dChyYXcuc3Vic3RyKDAsIGkpKTsNCiAgICAgIGFkZExpbmsodXJsLCBtYXRjaFswXS5yZXBsYWNlKE1BSUxUT19SRUdFWFAsICcnKSk7DQogICAgICByYXcgPSByYXcuc3Vic3RyaW5nKGkgKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgIH0NCiAgICBhZGRUZXh0KHJhdyk7DQogICAgcmV0dXJuICRzYW5pdGl6ZShodG1sLmpvaW4oJycpKTsNCg0KICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dCkgew0KICAgICAgaWYgKCF0ZXh0KSB7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIGh0bWwucHVzaChzYW5pdGl6ZVRleHQodGV4dCkpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFkZExpbmsodXJsLCB0ZXh0KSB7DQogICAgICBodG1sLnB1c2goJzxhICcpOw0KICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKHRhcmdldCkpIHsNCiAgICAgICAgaHRtbC5wdXNoKCd0YXJnZXQ9IicsDQogICAgICAgICAgICAgICAgICB0YXJnZXQsDQogICAgICAgICAgICAgICAgICAnIiAnKTsNCiAgICAgIH0NCiAgICAgIGh0bWwucHVzaCgnaHJlZj0iJywNCiAgICAgICAgICAgICAgICB1cmwucmVwbGFjZSgvIi9nLCAnJnF1b3Q7JyksDQogICAgICAgICAgICAgICAgJyI+Jyk7DQogICAgICBhZGRUZXh0KHRleHQpOw0KICAgICAgaHRtbC5wdXNoKCc8L2E+Jyk7DQogICAgfQ0KICB9Ow0KfV0pOw0KDQoNCn0pKHdpbmRvdywgd2luZG93LmFuZ3VsYXIpOw0K