LyoKVGhlIE1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmcKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCiovCi8qKgogKiBAbGljZW5zZSBBbmd1bGFySlMgdjEuMy44CiAqIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCiAqIExpY2Vuc2U6IE1JVAogKi8KKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7J3VzZSBzdHJpY3QnOwoKdmFyICRzYW5pdGl6ZU1pbkVyciA9IGFuZ3VsYXIuJCRtaW5FcnIoJyRzYW5pdGl6ZScpOwoKLyoqCiAqIEBuZ2RvYyBtb2R1bGUKICogQG5hbWUgbmdTYW5pdGl6ZQogKiBAZGVzY3JpcHRpb24KICoKICogIyBuZ1Nhbml0aXplCiAqCiAqIFRoZSBgbmdTYW5pdGl6ZWAgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gc2FuaXRpemUgSFRNTC4KICoKICoKICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9Im5nU2FuaXRpemUiPjwvZGl2PgogKgogKiBTZWUge0BsaW5rIG5nU2FuaXRpemUuJHNhbml0aXplIGAkc2FuaXRpemVgfSBmb3IgdXNhZ2UuCiAqLwoKLyoKICogSFRNTCBQYXJzZXIgQnkgTWlza28gSGV2ZXJ5IChtaXNrb0BoZXZlcnkuY29tKQogKiBiYXNlZCBvbjogIEhUTUwgUGFyc2VyIEJ5IEpvaG4gUmVzaWcgKGVqb2huLm9yZykKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKgogKiAvLyBVc2UgbGlrZSBzbzoKICogaHRtbFBhcnNlcihodG1sU3RyaW5nLCB7CiAqICAgICBzdGFydDogZnVuY3Rpb24odGFnLCBhdHRycywgdW5hcnkpIHt9LAogKiAgICAgZW5kOiBmdW5jdGlvbih0YWcpIHt9LAogKiAgICAgY2hhcnM6IGZ1bmN0aW9uKHRleHQpIHt9LAogKiAgICAgY29tbWVudDogZnVuY3Rpb24odGV4dCkge30KICogfSk7CiAqCiAqLwoKCi8qKgogKiBAbmdkb2Mgc2VydmljZQogKiBAbmFtZSAkc2FuaXRpemUKICogQGtpbmQgZnVuY3Rpb24KICoKICogQGRlc2NyaXB0aW9uCiAqICAgVGhlIGlucHV0IGlzIHNhbml0aXplZCBieSBwYXJzaW5nIHRoZSBIVE1MIGludG8gdG9rZW5zLiBBbGwgc2FmZSB0b2tlbnMgKGZyb20gYSB3aGl0ZWxpc3QpIGFyZQogKiAgIHRoZW4gc2VyaWFsaXplZCBiYWNrIHRvIHByb3Blcmx5IGVzY2FwZWQgaHRtbCBzdHJpbmcuIFRoaXMgbWVhbnMgdGhhdCBubyB1bnNhZmUgaW5wdXQgY2FuIG1ha2UKICogICBpdCBpbnRvIHRoZSByZXR1cm5lZCBzdHJpbmcsIGhvd2V2ZXIsIHNpbmNlIG91ciBwYXJzZXIgaXMgbW9yZSBzdHJpY3QgdGhhbiBhIHR5cGljYWwgYnJvd3NlcgogKiAgIHBhcnNlciwgaXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgb2JzY3VyZSBpbnB1dCwgd2hpY2ggd291bGQgYmUgcmVjb2duaXplZCBhcyB2YWxpZCBIVE1MIGJ5IGEKICogICBicm93c2VyLCB3b24ndCBtYWtlIGl0IHRocm91Z2ggdGhlIHNhbml0aXplci4gVGhlIGlucHV0IG1heSBhbHNvIGNvbnRhaW4gU1ZHIG1hcmt1cC4KICogICBUaGUgd2hpdGVsaXN0IGlzIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZ1bmN0aW9ucyBgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3RgIGFuZAogKiAgIGBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3RgIG9mIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyIGAkY29tcGlsZVByb3ZpZGVyYH0uCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIEhUTUwgaW5wdXQuCiAqIEByZXR1cm5zIHtzdHJpbmd9IFNhbml0aXplZCBIVE1MLgogKgogKiBAZXhhbXBsZQogICA8ZXhhbXBsZSBtb2R1bGU9InNhbml0aXplRXhhbXBsZSIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+CiAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgogICAgIDxzY3JpcHQ+CiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdzYW5pdGl6ZUV4YW1wbGUnLCBbJ25nU2FuaXRpemUnXSkKICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICckc2NlJywgZnVuY3Rpb24oJHNjb3BlLCAkc2NlKSB7CiAgICAgICAgICAgICAkc2NvcGUuc25pcHBldCA9CiAgICAgICAgICAgICAgICc8cCBzdHlsZT0iY29sb3I6Ymx1ZSI+YW4gaHRtbFxuJyArCiAgICAgICAgICAgICAgICc8ZW0gb25tb3VzZW92ZXI9InRoaXMudGV4dENvbnRlbnQ9XCdQV04zRCFcJyI+Y2xpY2sgaGVyZTwvZW0+XG4nICsKICAgICAgICAgICAgICAgJ3NuaXBwZXQ8L3A+JzsKICAgICAgICAgICAgICRzY29wZS5kZWxpYmVyYXRlbHlUcnVzdERhbmdlcm91c1NuaXBwZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgcmV0dXJuICRzY2UudHJ1c3RBc0h0bWwoJHNjb3BlLnNuaXBwZXQpOwogICAgICAgICAgICAgfTsKICAgICAgICAgICB9XSk7CiAgICAgPC9zY3JpcHQ+CiAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CiAgICAgICAgU25pcHBldDogPHRleHRhcmVhIG5nLW1vZGVsPSJzbmlwcGV0IiBjb2xzPSI2MCIgcm93cz0iMyI+PC90ZXh0YXJlYT4KICAgICAgIDx0YWJsZT4KICAgICAgICAgPHRyPgogICAgICAgICAgIDx0ZD5EaXJlY3RpdmU8L3RkPgogICAgICAgICAgIDx0ZD5Ib3c8L3RkPgogICAgICAgICAgIDx0ZD5Tb3VyY2U8L3RkPgogICAgICAgICAgIDx0ZD5SZW5kZXJlZDwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgICAgIDx0ciBpZD0iYmluZC1odG1sLXdpdGgtc2FuaXRpemUiPgogICAgICAgICAgIDx0ZD5uZy1iaW5kLWh0bWw8L3RkPgogICAgICAgICAgIDx0ZD5BdXRvbWF0aWNhbGx5IHVzZXMgJHNhbml0aXplPC90ZD4KICAgICAgICAgICA8dGQ+PHByZT4mbHQ7ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldCImZ3Q7PGJyLz4mbHQ7L2RpdiZndDs8L3ByZT48L3RkPgogICAgICAgICAgIDx0ZD48ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldCI+PC9kaXY+PC90ZD4KICAgICAgICAgPC90cj4KICAgICAgICAgPHRyIGlkPSJiaW5kLWh0bWwtd2l0aC10cnVzdCI+CiAgICAgICAgICAgPHRkPm5nLWJpbmQtaHRtbDwvdGQ+CiAgICAgICAgICAgPHRkPkJ5cGFzcyAkc2FuaXRpemUgYnkgZXhwbGljaXRseSB0cnVzdGluZyB0aGUgZGFuZ2Vyb3VzIHZhbHVlPC90ZD4KICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgPHByZT4mbHQ7ZGl2IG5nLWJpbmQtaHRtbD0iZGVsaWJlcmF0ZWx5VHJ1c3REYW5nZXJvdXNTbmlwcGV0KCkiJmd0OwombHQ7L2RpdiZndDs8L3ByZT4KICAgICAgICAgICA8L3RkPgogICAgICAgICAgIDx0ZD48ZGl2IG5nLWJpbmQtaHRtbD0iZGVsaWJlcmF0ZWx5VHJ1c3REYW5nZXJvdXNTbmlwcGV0KCkiPjwvZGl2PjwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgICAgIDx0ciBpZD0iYmluZC1kZWZhdWx0Ij4KICAgICAgICAgICA8dGQ+bmctYmluZDwvdGQ+CiAgICAgICAgICAgPHRkPkF1dG9tYXRpY2FsbHkgZXNjYXBlczwvdGQ+CiAgICAgICAgICAgPHRkPjxwcmU+Jmx0O2RpdiBuZy1iaW5kPSJzbmlwcGV0IiZndDs8YnIvPiZsdDsvZGl2Jmd0OzwvcHJlPjwvdGQ+CiAgICAgICAgICAgPHRkPjxkaXYgbmctYmluZD0ic25pcHBldCI+PC9kaXY+PC90ZD4KICAgICAgICAgPC90cj4KICAgICAgIDwvdGFibGU+CiAgICAgICA8L2Rpdj4KICAgPC9maWxlPgogICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KICAgICBpdCgnc2hvdWxkIHNhbml0aXplIHRoZSBodG1sIHNuaXBwZXQgYnkgZGVmYXVsdCcsIGZ1bmN0aW9uKCkgewogICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjYmluZC1odG1sLXdpdGgtc2FuaXRpemUgZGl2JykpLmdldElubmVySHRtbCgpKS4KICAgICAgICAgdG9CZSgnPHA+YW4gaHRtbFxuPGVtPmNsaWNrIGhlcmU8L2VtPlxuc25pcHBldDwvcD4nKTsKICAgICB9KTsKCiAgICAgaXQoJ3Nob3VsZCBpbmxpbmUgcmF3IHNuaXBwZXQgaWYgYm91bmQgdG8gYSB0cnVzdGVkIHZhbHVlJywgZnVuY3Rpb24oKSB7CiAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC10cnVzdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLgogICAgICAgICB0b0JlKCI8cCBzdHlsZT1cImNvbG9yOmJsdWVcIj5hbiBodG1sXG4iICsKICAgICAgICAgICAgICAiPGVtIG9ubW91c2VvdmVyPVwidGhpcy50ZXh0Q29udGVudD0nUFdOM0QhJ1wiPmNsaWNrIGhlcmU8L2VtPlxuIiArCiAgICAgICAgICAgICAgInNuaXBwZXQ8L3A+Iik7CiAgICAgfSk7CgogICAgIGl0KCdzaG91bGQgZXNjYXBlIHNuaXBwZXQgd2l0aG91dCBhbnkgZmlsdGVyJywgZnVuY3Rpb24oKSB7CiAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWRlZmF1bHQgZGl2JykpLmdldElubmVySHRtbCgpKS4KICAgICAgICAgdG9CZSgiJmx0O3Agc3R5bGU9XCJjb2xvcjpibHVlXCImZ3Q7YW4gaHRtbFxuIiArCiAgICAgICAgICAgICAgIiZsdDtlbSBvbm1vdXNlb3Zlcj1cInRoaXMudGV4dENvbnRlbnQ9J1BXTjNEISdcIiZndDtjbGljayBoZXJlJmx0Oy9lbSZndDtcbiIgKwogICAgICAgICAgICAgICJzbmlwcGV0Jmx0Oy9wJmd0OyIpOwogICAgIH0pOwoKICAgICBpdCgnc2hvdWxkIHVwZGF0ZScsIGZ1bmN0aW9uKCkgewogICAgICAgZWxlbWVudChieS5tb2RlbCgnc25pcHBldCcpKS5jbGVhcigpOwogICAgICAgZWxlbWVudChieS5tb2RlbCgnc25pcHBldCcpKS5zZW5kS2V5cygnbmV3IDxiIG9uY2xpY2s9ImFsZXJ0KDEpIj50ZXh0PC9iPicpOwogICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjYmluZC1odG1sLXdpdGgtc2FuaXRpemUgZGl2JykpLmdldElubmVySHRtbCgpKS4KICAgICAgICAgdG9CZSgnbmV3IDxiPnRleHQ8L2I+Jyk7CiAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC10cnVzdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLnRvQmUoCiAgICAgICAgICduZXcgPGIgb25jbGljaz0iYWxlcnQoMSkiPnRleHQ8L2I+Jyk7CiAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWRlZmF1bHQgZGl2JykpLmdldElubmVySHRtbCgpKS50b0JlKAogICAgICAgICAibmV3ICZsdDtiIG9uY2xpY2s9XCJhbGVydCgxKVwiJmd0O3RleHQmbHQ7L2ImZ3Q7Iik7CiAgICAgfSk7CiAgIDwvZmlsZT4KICAgPC9leGFtcGxlPgogKi8KZnVuY3Rpb24gJFNhbml0aXplUHJvdmlkZXIoKSB7CiAgdGhpcy4kZ2V0ID0gWyckJHNhbml0aXplVXJpJywgZnVuY3Rpb24oJCRzYW5pdGl6ZVVyaSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGh0bWwpIHsKICAgICAgdmFyIGJ1ZiA9IFtdOwogICAgICBodG1sUGFyc2VyKGh0bWwsIGh0bWxTYW5pdGl6ZVdyaXRlcihidWYsIGZ1bmN0aW9uKHVyaSwgaXNJbWFnZSkgewogICAgICAgIHJldHVybiAhL151bnNhZmUvLnRlc3QoJCRzYW5pdGl6ZVVyaSh1cmksIGlzSW1hZ2UpKTsKICAgICAgfSkpOwogICAgICByZXR1cm4gYnVmLmpvaW4oJycpOwogICAgfTsKICB9XTsKfQoKZnVuY3Rpb24gc2FuaXRpemVUZXh0KGNoYXJzKSB7CiAgdmFyIGJ1ZiA9IFtdOwogIHZhciB3cml0ZXIgPSBodG1sU2FuaXRpemVXcml0ZXIoYnVmLCBhbmd1bGFyLm5vb3ApOwogIHdyaXRlci5jaGFycyhjaGFycyk7CiAgcmV0dXJuIGJ1Zi5qb2luKCcnKTsKfQoKCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgU1RBUlRfVEFHX1JFR0VYUCA9CiAgICAgICAvXjwoKD86W2EtekEtWl0pW1x3Oi1dKikoKD86XHMrW1x3Oi1dKyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopXHMqKFwvPylccyooPj8pLywKICBFTkRfVEFHX1JFR0VYUCA9IC9ePFwvXHMqKFtcdzotXSspW14+XSo+LywKICBBVFRSX1JFR0VYUCA9IC8oW1x3Oi1dKykoPzpccyo9XHMqKD86KD86IigoPzpbXiJdKSopIil8KD86JygoPzpbXiddKSopJyl8KFtePlxzXSspKSk/L2csCiAgQkVHSU5fVEFHX1JFR0VYUCA9IC9ePC8sCiAgQkVHSU5HX0VORF9UQUdFX1JFR0VYUCA9IC9ePFwvLywKICBDT01NRU5UX1JFR0VYUCA9IC88IS0tKC4qPyktLT4vZywKICBET0NUWVBFX1JFR0VYUCA9IC88IURPQ1RZUEUoW14+XSo/KT4vaSwKICBDREFUQV9SRUdFWFAgPSAvPCFcW0NEQVRBXFsoLio/KV1dPi9nLAogIFNVUlJPR0FURV9QQUlSX1JFR0VYUCA9IC9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZywKICAvLyBNYXRjaCBldmVyeXRoaW5nIG91dHNpZGUgb2Ygbm9ybWFsIGNoYXJzIGFuZCAiIChxdW90ZSBjaGFyYWN0ZXIpCiAgTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFAgPSAvKFteXCMtfnwgfCFdKS9nOwoKCi8vIEdvb2Qgc291cmNlIG9mIGluZm8gYWJvdXQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy9PdmVydmlldy5odG1sI3NlbWFudGljcwovLyBodHRwOi8vc2ltb24uaHRtbDUub3JnL2h0bWwtZWxlbWVudHMKCi8vIFNhZmUgVm9pZCBFbGVtZW50cyAtIEhUTUw1Ci8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCN2b2lkLWVsZW1lbnRzCnZhciB2b2lkRWxlbWVudHMgPSBtYWtlTWFwKCJhcmVhLGJyLGNvbCxocixpbWcsd2JyIik7CgovLyBFbGVtZW50cyB0aGF0IHlvdSBjYW4sIGludGVudGlvbmFsbHksIGxlYXZlIG9wZW4gKGFuZCB3aGljaCBjbG9zZSB0aGVtc2VsdmVzKQovLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjb3B0aW9uYWwtdGFncwp2YXIgb3B0aW9uYWxFbmRUYWdCbG9ja0VsZW1lbnRzID0gbWFrZU1hcCgiY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLAogICAgb3B0aW9uYWxFbmRUYWdJbmxpbmVFbGVtZW50cyA9IG1ha2VNYXAoInJwLHJ0IiksCiAgICBvcHRpb25hbEVuZFRhZ0VsZW1lbnRzID0gYW5ndWxhci5leHRlbmQoe30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxFbmRUYWdJbmxpbmVFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbEVuZFRhZ0Jsb2NrRWxlbWVudHMpOwoKLy8gU2FmZSBCbG9jayBFbGVtZW50cyAtIEhUTUw1CnZhciBibG9ja0VsZW1lbnRzID0gYW5ndWxhci5leHRlbmQoe30sIG9wdGlvbmFsRW5kVGFnQmxvY2tFbGVtZW50cywgbWFrZU1hcCgiYWRkcmVzcyxhcnRpY2xlLCIgKwogICAgICAgICJhc2lkZSxibG9ja3F1b3RlLGNhcHRpb24sY2VudGVyLGRlbCxkaXIsZGl2LGRsLGZpZ3VyZSxmaWdjYXB0aW9uLGZvb3RlcixoMSxoMixoMyxoNCxoNSwiICsKICAgICAgICAiaDYsaGVhZGVyLGhncm91cCxocixpbnMsbWFwLG1lbnUsbmF2LG9sLHByZSxzY3JpcHQsc2VjdGlvbix0YWJsZSx1bCIpKTsKCi8vIElubGluZSBFbGVtZW50cyAtIEhUTUw1CnZhciBpbmxpbmVFbGVtZW50cyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBvcHRpb25hbEVuZFRhZ0lubGluZUVsZW1lbnRzLCBtYWtlTWFwKCJhLGFiYnIsYWNyb255bSxiLCIgKwogICAgICAgICJiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscSxydWJ5LHJwLHJ0LHMsIiArCiAgICAgICAgInNhbXAsc21hbGwsc3BhbixzdHJpa2Usc3Ryb25nLHN1YixzdXAsdGltZSx0dCx1LHZhciIpKTsKCi8vIFNWRyBFbGVtZW50cwovLyBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1Nhbml0aXphdGlvbl9ydWxlcyNzdmdfRWxlbWVudHMKdmFyIHN2Z0VsZW1lbnRzID0gbWFrZU1hcCgiYW5pbWF0ZSxhbmltYXRlQ29sb3IsYW5pbWF0ZU1vdGlvbixhbmltYXRlVHJhbnNmb3JtLGNpcmNsZSxkZWZzLCIgKwogICAgICAgICJkZXNjLGVsbGlwc2UsZm9udC1mYWNlLGZvbnQtZmFjZS1uYW1lLGZvbnQtZmFjZS1zcmMsZyxnbHlwaCxoa2VybixpbWFnZSxsaW5lYXJHcmFkaWVudCwiICsKICAgICAgICAibGluZSxtYXJrZXIsbWV0YWRhdGEsbWlzc2luZy1nbHlwaCxtcGF0aCxwYXRoLHBvbHlnb24scG9seWxpbmUscmFkaWFsR3JhZGllbnQscmVjdCxzZXQsIiArCiAgICAgICAgInN0b3Asc3ZnLHN3aXRjaCx0ZXh0LHRpdGxlLHRzcGFuLHVzZSIpOwoKLy8gU3BlY2lhbCBFbGVtZW50cyAoY2FuIGNvbnRhaW4gYW55dGhpbmcpCnZhciBzcGVjaWFsRWxlbWVudHMgPSBtYWtlTWFwKCJzY3JpcHQsc3R5bGUiKTsKCnZhciB2YWxpZEVsZW1lbnRzID0gYW5ndWxhci5leHRlbmQoe30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZEVsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrRWxlbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lRWxlbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxFbmRUYWdFbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmdFbGVtZW50cyk7CgovL0F0dHJpYnV0ZXMgdGhhdCBoYXZlIGhyZWYgYW5kIGhlbmNlIG5lZWQgdG8gYmUgc2FuaXRpemVkCnZhciB1cmlBdHRycyA9IG1ha2VNYXAoImJhY2tncm91bmQsY2l0ZSxocmVmLGxvbmdkZXNjLHNyYyx1c2VtYXAseGxpbms6aHJlZiIpOwoKdmFyIGh0bWxBdHRycyA9IG1ha2VNYXAoJ2FiYnIsYWxpZ24sYWx0LGF4aXMsYmdjb2xvcixib3JkZXIsY2VsbHBhZGRpbmcsY2VsbHNwYWNpbmcsY2xhc3MsY2xlYXIsJyArCiAgICAnY29sb3IsY29scyxjb2xzcGFuLGNvbXBhY3QsY29vcmRzLGRpcixmYWNlLGhlYWRlcnMsaGVpZ2h0LGhyZWZsYW5nLGhzcGFjZSwnICsKICAgICdpc21hcCxsYW5nLGxhbmd1YWdlLG5vaHJlZixub3dyYXAscmVsLHJldixyb3dzLHJvd3NwYW4scnVsZXMsJyArCiAgICAnc2NvcGUsc2Nyb2xsaW5nLHNoYXBlLHNpemUsc3BhbixzdGFydCxzdW1tYXJ5LHRhcmdldCx0aXRsZSx0eXBlLCcgKwogICAgJ3ZhbGlnbix2YWx1ZSx2c3BhY2Usd2lkdGgnKTsKCi8vIFNWRyBhdHRyaWJ1dGVzICh3aXRob3V0ICJpZCIgYW5kICJuYW1lIiBhdHRyaWJ1dGVzKQovLyBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1Nhbml0aXphdGlvbl9ydWxlcyNzdmdfQXR0cmlidXRlcwp2YXIgc3ZnQXR0cnMgPSBtYWtlTWFwKCdhY2NlbnQtaGVpZ2h0LGFjY3VtdWxhdGUsYWRkaXRpdmUsYWxwaGFiZXRpYyxhcmFiaWMtZm9ybSxhc2NlbnQsJyArCiAgICAnYXR0cmlidXRlTmFtZSxhdHRyaWJ1dGVUeXBlLGJhc2VQcm9maWxlLGJib3gsYmVnaW4sYnksY2FsY01vZGUsY2FwLWhlaWdodCxjbGFzcyxjb2xvciwnICsKICAgICdjb2xvci1yZW5kZXJpbmcsY29udGVudCxjeCxjeSxkLGR4LGR5LGRlc2NlbnQsZGlzcGxheSxkdXIsZW5kLGZpbGwsZmlsbC1ydWxlLGZvbnQtZmFtaWx5LCcgKwogICAgJ2ZvbnQtc2l6ZSxmb250LXN0cmV0Y2gsZm9udC1zdHlsZSxmb250LXZhcmlhbnQsZm9udC13ZWlnaHQsZnJvbSxmeCxmeSxnMSxnMixnbHlwaC1uYW1lLCcgKwogICAgJ2dyYWRpZW50VW5pdHMsaGFuZ2luZyxoZWlnaHQsaG9yaXotYWR2LXgsaG9yaXotb3JpZ2luLXgsaWRlb2dyYXBoaWMsayxrZXlQb2ludHMsJyArCiAgICAna2V5U3BsaW5lcyxrZXlUaW1lcyxsYW5nLG1hcmtlci1lbmQsbWFya2VyLW1pZCxtYXJrZXItc3RhcnQsbWFya2VySGVpZ2h0LG1hcmtlclVuaXRzLCcgKwogICAgJ21hcmtlcldpZHRoLG1hdGhlbWF0aWNhbCxtYXgsbWluLG9mZnNldCxvcGFjaXR5LG9yaWVudCxvcmlnaW4sb3ZlcmxpbmUtcG9zaXRpb24sJyArCiAgICAnb3ZlcmxpbmUtdGhpY2tuZXNzLHBhbm9zZS0xLHBhdGgscGF0aExlbmd0aCxwb2ludHMscHJlc2VydmVBc3BlY3RSYXRpbyxyLHJlZlgscmVmWSwnICsKICAgICdyZXBlYXRDb3VudCxyZXBlYXREdXIscmVxdWlyZWRFeHRlbnNpb25zLHJlcXVpcmVkRmVhdHVyZXMscmVzdGFydCxyb3RhdGUscngscnksc2xvcGUsc3RlbWgsJyArCiAgICAnc3RlbXYsc3RvcC1jb2xvcixzdG9wLW9wYWNpdHksc3RyaWtldGhyb3VnaC1wb3NpdGlvbixzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyxzdHJva2UsJyArCiAgICAnc3Ryb2tlLWRhc2hhcnJheSxzdHJva2UtZGFzaG9mZnNldCxzdHJva2UtbGluZWNhcCxzdHJva2UtbGluZWpvaW4sc3Ryb2tlLW1pdGVybGltaXQsJyArCiAgICAnc3Ryb2tlLW9wYWNpdHksc3Ryb2tlLXdpZHRoLHN5c3RlbUxhbmd1YWdlLHRhcmdldCx0ZXh0LWFuY2hvcix0byx0cmFuc2Zvcm0sdHlwZSx1MSx1MiwnICsKICAgICd1bmRlcmxpbmUtcG9zaXRpb24sdW5kZXJsaW5lLXRoaWNrbmVzcyx1bmljb2RlLHVuaWNvZGUtcmFuZ2UsdW5pdHMtcGVyLWVtLHZhbHVlcyx2ZXJzaW9uLCcgKwogICAgJ3ZpZXdCb3gsdmlzaWJpbGl0eSx3aWR0aCx3aWR0aHMseCx4LWhlaWdodCx4MSx4Mix4bGluazphY3R1YXRlLHhsaW5rOmFyY3JvbGUseGxpbms6cm9sZSwnICsKICAgICd4bGluazpzaG93LHhsaW5rOnRpdGxlLHhsaW5rOnR5cGUseG1sOmJhc2UseG1sOmxhbmcseG1sOnNwYWNlLHhtbG5zLHhtbG5zOnhsaW5rLHkseTEseTIsJyArCiAgICAnem9vbUFuZFBhbicpOwoKdmFyIHZhbGlkQXR0cnMgPSBhbmd1bGFyLmV4dGVuZCh7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmlBdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmdBdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sQXR0cnMpOwoKZnVuY3Rpb24gbWFrZU1hcChzdHIpIHsKICB2YXIgb2JqID0ge30sIGl0ZW1zID0gc3RyLnNwbGl0KCcsJyksIGk7CiAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSBvYmpbaXRlbXNbaV1dID0gdHJ1ZTsKICByZXR1cm4gb2JqOwp9CgoKLyoqCiAqIEBleGFtcGxlCiAqIGh0bWxQYXJzZXIoaHRtbFN0cmluZywgewogKiAgICAgc3RhcnQ6IGZ1bmN0aW9uKHRhZywgYXR0cnMsIHVuYXJ5KSB7fSwKICogICAgIGVuZDogZnVuY3Rpb24odGFnKSB7fSwKICogICAgIGNoYXJzOiBmdW5jdGlvbih0ZXh0KSB7fSwKICogICAgIGNvbW1lbnQ6IGZ1bmN0aW9uKHRleHQpIHt9CiAqIH0pOwogKgogKiBAcGFyYW0ge3N0cmluZ30gaHRtbCBzdHJpbmcKICogQHBhcmFtIHtvYmplY3R9IGhhbmRsZXIKICovCmZ1bmN0aW9uIGh0bWxQYXJzZXIoaHRtbCwgaGFuZGxlcikgewogIGlmICh0eXBlb2YgaHRtbCAhPT0gJ3N0cmluZycpIHsKICAgIGlmIChodG1sID09PSBudWxsIHx8IHR5cGVvZiBodG1sID09PSAndW5kZWZpbmVkJykgewogICAgICBodG1sID0gJyc7CiAgICB9IGVsc2UgewogICAgICBodG1sID0gJycgKyBodG1sOwogICAgfQogIH0KICB2YXIgaW5kZXgsIGNoYXJzLCBtYXRjaCwgc3RhY2sgPSBbXSwgbGFzdCA9IGh0bWwsIHRleHQ7CiAgc3RhY2subGFzdCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3RhY2tbIHN0YWNrLmxlbmd0aCAtIDEgXTsgfTsKCiAgd2hpbGUgKGh0bWwpIHsKICAgIHRleHQgPSAnJzsKICAgIGNoYXJzID0gdHJ1ZTsKCiAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlIGVsZW1lbnQKICAgIGlmICghc3RhY2subGFzdCgpIHx8ICFzcGVjaWFsRWxlbWVudHNbIHN0YWNrLmxhc3QoKSBdKSB7CgogICAgICAvLyBDb21tZW50CiAgICAgIGlmIChodG1sLmluZGV4T2YoIjwhLS0iKSA9PT0gMCkgewogICAgICAgIC8vIGNvbW1lbnRzIGNvbnRhaW5pbmcgLS0gYXJlIG5vdCBhbGxvd2VkIHVubGVzcyB0aGV5IHRlcm1pbmF0ZSB0aGUgY29tbWVudAogICAgICAgIGluZGV4ID0gaHRtbC5pbmRleE9mKCItLSIsIDQpOwoKICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBodG1sLmxhc3RJbmRleE9mKCItLT4iLCBpbmRleCkgPT09IGluZGV4KSB7CiAgICAgICAgICBpZiAoaGFuZGxlci5jb21tZW50KSBoYW5kbGVyLmNvbW1lbnQoaHRtbC5zdWJzdHJpbmcoNCwgaW5kZXgpKTsKICAgICAgICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhpbmRleCArIDMpOwogICAgICAgICAgY2hhcnMgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIC8vIERPQ1RZUEUKICAgICAgfSBlbHNlIGlmIChET0NUWVBFX1JFR0VYUC50ZXN0KGh0bWwpKSB7CiAgICAgICAgbWF0Y2ggPSBodG1sLm1hdGNoKERPQ1RZUEVfUkVHRVhQKTsKCiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKG1hdGNoWzBdLCAnJyk7CiAgICAgICAgICBjaGFycyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgLy8gZW5kIHRhZwogICAgICB9IGVsc2UgaWYgKEJFR0lOR19FTkRfVEFHRV9SRUdFWFAudGVzdChodG1sKSkgewogICAgICAgIG1hdGNoID0gaHRtbC5tYXRjaChFTkRfVEFHX1JFR0VYUCk7CgogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBtYXRjaFswXS5yZXBsYWNlKEVORF9UQUdfUkVHRVhQLCBwYXJzZUVuZFRhZyk7CiAgICAgICAgICBjaGFycyA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgIC8vIHN0YXJ0IHRhZwogICAgICB9IGVsc2UgaWYgKEJFR0lOX1RBR19SRUdFWFAudGVzdChodG1sKSkgewogICAgICAgIG1hdGNoID0gaHRtbC5tYXRjaChTVEFSVF9UQUdfUkVHRVhQKTsKCiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAvLyBXZSBvbmx5IGhhdmUgYSB2YWxpZCBzdGFydC10YWcgaWYgdGhlcmUgaXMgYSAnPicuCiAgICAgICAgICBpZiAobWF0Y2hbNF0pIHsKICAgICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIG1hdGNoWzBdLnJlcGxhY2UoU1RBUlRfVEFHX1JFR0VYUCwgcGFyc2VTdGFydFRhZyk7CiAgICAgICAgICB9CiAgICAgICAgICBjaGFycyA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBubyBlbmRpbmcgdGFnIGZvdW5kIC0tLSB0aGlzIHBpZWNlIHNob3VsZCBiZSBlbmNvZGVkIGFzIGFuIGVudGl0eS4KICAgICAgICAgIHRleHQgKz0gJzwnOwogICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGNoYXJzKSB7CiAgICAgICAgaW5kZXggPSBodG1sLmluZGV4T2YoIjwiKTsKCiAgICAgICAgdGV4dCArPSBpbmRleCA8IDAgPyBodG1sIDogaHRtbC5zdWJzdHJpbmcoMCwgaW5kZXgpOwogICAgICAgIGh0bWwgPSBpbmRleCA8IDAgPyAiIiA6IGh0bWwuc3Vic3RyaW5nKGluZGV4KTsKCiAgICAgICAgaWYgKGhhbmRsZXIuY2hhcnMpIGhhbmRsZXIuY2hhcnMoZGVjb2RlRW50aXRpZXModGV4dCkpOwogICAgICB9CgogICAgfSBlbHNlIHsKICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShuZXcgUmVnRXhwKCIoLiopPFxccypcXC9cXHMqIiArIHN0YWNrLmxhc3QoKSArICJbXj5dKj4iLCAnaScpLAogICAgICAgIGZ1bmN0aW9uKGFsbCwgdGV4dCkgewogICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShDT01NRU5UX1JFR0VYUCwgIiQxIikucmVwbGFjZShDREFUQV9SRUdFWFAsICIkMSIpOwoKICAgICAgICAgIGlmIChoYW5kbGVyLmNoYXJzKSBoYW5kbGVyLmNoYXJzKGRlY29kZUVudGl0aWVzKHRleHQpKTsKCiAgICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0pOwoKICAgICAgcGFyc2VFbmRUYWcoIiIsIHN0YWNrLmxhc3QoKSk7CiAgICB9CgogICAgaWYgKGh0bWwgPT0gbGFzdCkgewogICAgICB0aHJvdyAkc2FuaXRpemVNaW5FcnIoJ2JhZHBhcnNlJywgIlRoZSBzYW5pdGl6ZXIgd2FzIHVuYWJsZSB0byBwYXJzZSB0aGUgZm9sbG93aW5nIGJsb2NrICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIGh0bWw6IHswfSIsIGh0bWwpOwogICAgfQogICAgbGFzdCA9IGh0bWw7CiAgfQoKICAvLyBDbGVhbiB1cCBhbnkgcmVtYWluaW5nIHRhZ3MKICBwYXJzZUVuZFRhZygpOwoKICBmdW5jdGlvbiBwYXJzZVN0YXJ0VGFnKHRhZywgdGFnTmFtZSwgcmVzdCwgdW5hcnkpIHsKICAgIHRhZ05hbWUgPSBhbmd1bGFyLmxvd2VyY2FzZSh0YWdOYW1lKTsKICAgIGlmIChibG9ja0VsZW1lbnRzWyB0YWdOYW1lIF0pIHsKICAgICAgd2hpbGUgKHN0YWNrLmxhc3QoKSAmJiBpbmxpbmVFbGVtZW50c1sgc3RhY2subGFzdCgpIF0pIHsKICAgICAgICBwYXJzZUVuZFRhZygiIiwgc3RhY2subGFzdCgpKTsKICAgICAgfQogICAgfQoKICAgIGlmIChvcHRpb25hbEVuZFRhZ0VsZW1lbnRzWyB0YWdOYW1lIF0gJiYgc3RhY2subGFzdCgpID09IHRhZ05hbWUpIHsKICAgICAgcGFyc2VFbmRUYWcoIiIsIHRhZ05hbWUpOwogICAgfQoKICAgIHVuYXJ5ID0gdm9pZEVsZW1lbnRzWyB0YWdOYW1lIF0gfHwgISF1bmFyeTsKCiAgICBpZiAoIXVuYXJ5KQogICAgICBzdGFjay5wdXNoKHRhZ05hbWUpOwoKICAgIHZhciBhdHRycyA9IHt9OwoKICAgIHJlc3QucmVwbGFjZShBVFRSX1JFR0VYUCwKICAgICAgZnVuY3Rpb24obWF0Y2gsIG5hbWUsIGRvdWJsZVF1b3RlZFZhbHVlLCBzaW5nbGVRdW90ZWRWYWx1ZSwgdW5xdW90ZWRWYWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IGRvdWJsZVF1b3RlZFZhbHVlCiAgICAgICAgICB8fCBzaW5nbGVRdW90ZWRWYWx1ZQogICAgICAgICAgfHwgdW5xdW90ZWRWYWx1ZQogICAgICAgICAgfHwgJyc7CgogICAgICAgIGF0dHJzW25hbWVdID0gZGVjb2RlRW50aXRpZXModmFsdWUpOwogICAgfSk7CiAgICBpZiAoaGFuZGxlci5zdGFydCkgaGFuZGxlci5zdGFydCh0YWdOYW1lLCBhdHRycywgdW5hcnkpOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VFbmRUYWcodGFnLCB0YWdOYW1lKSB7CiAgICB2YXIgcG9zID0gMCwgaTsKICAgIHRhZ05hbWUgPSBhbmd1bGFyLmxvd2VyY2FzZSh0YWdOYW1lKTsKICAgIGlmICh0YWdOYW1lKQogICAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgICBmb3IgKHBvcyA9IHN0YWNrLmxlbmd0aCAtIDE7IHBvcyA+PSAwOyBwb3MtLSkKICAgICAgICBpZiAoc3RhY2tbIHBvcyBdID09IHRhZ05hbWUpCiAgICAgICAgICBicmVhazsKCiAgICBpZiAocG9zID49IDApIHsKICAgICAgLy8gQ2xvc2UgYWxsIHRoZSBvcGVuIGVsZW1lbnRzLCB1cCB0aGUgc3RhY2sKICAgICAgZm9yIChpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSBwb3M7IGktLSkKICAgICAgICBpZiAoaGFuZGxlci5lbmQpIGhhbmRsZXIuZW5kKHN0YWNrWyBpIF0pOwoKICAgICAgLy8gUmVtb3ZlIHRoZSBvcGVuIGVsZW1lbnRzIGZyb20gdGhlIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCA9IHBvczsKICAgIH0KICB9Cn0KCnZhciBoaWRkZW5QcmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicHJlIik7CnZhciBzcGFjZVJlID0gL14oXHMqKShbXHNcU10qPykoXHMqKSQvOwovKioKICogZGVjb2RlcyBhbGwgZW50aXRpZXMgaW50byByZWd1bGFyIHN0cmluZwogKiBAcGFyYW0gdmFsdWUKICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmcgd2l0aCBkZWNvZGVkIGVudGl0aWVzLgogKi8KZnVuY3Rpb24gZGVjb2RlRW50aXRpZXModmFsdWUpIHsKICBpZiAoIXZhbHVlKSB7IHJldHVybiAnJzsgfQoKICAvLyBOb3RlOiBJRTggZG9lcyBub3QgcHJlc2VydmUgc3BhY2VzIGF0IHRoZSBzdGFydC9lbmQgb2YgaW5uZXJIVE1MCiAgLy8gc28gd2UgbXVzdCBjYXB0dXJlIHRoZW0gYW5kIHJlYXR0YWNoIHRoZW0gYWZ0ZXJ3YXJkCiAgdmFyIHBhcnRzID0gc3BhY2VSZS5leGVjKHZhbHVlKTsKICB2YXIgc3BhY2VCZWZvcmUgPSBwYXJ0c1sxXTsKICB2YXIgc3BhY2VBZnRlciA9IHBhcnRzWzNdOwogIHZhciBjb250ZW50ID0gcGFydHNbMl07CiAgaWYgKGNvbnRlbnQpIHsKICAgIGhpZGRlblByZS5pbm5lckhUTUw9Y29udGVudC5yZXBsYWNlKC88L2csIiZsdDsiKTsKICAgIC8vIGlubmVyVGV4dCBkZXBlbmRzIG9uIHN0eWxpbmcgYXMgaXQgZG9lc24ndCBkaXNwbGF5IGhpZGRlbiBlbGVtZW50cy4KICAgIC8vIFRoZXJlZm9yZSwgaXQncyBiZXR0ZXIgdG8gdXNlIHRleHRDb250ZW50IG5vdCB0byBjYXVzZSB1bm5lY2Vzc2FyeQogICAgLy8gcmVmbG93cy4gSG93ZXZlciwgSUU8OSBkb24ndCBzdXBwb3J0IHRleHRDb250ZW50IHNvIHRoZSBpbm5lclRleHQKICAgIC8vIGZhbGxiYWNrIGlzIG5lY2Vzc2FyeS4KICAgIGNvbnRlbnQgPSAndGV4dENvbnRlbnQnIGluIGhpZGRlblByZSA/CiAgICAgIGhpZGRlblByZS50ZXh0Q29udGVudCA6IGhpZGRlblByZS5pbm5lclRleHQ7CiAgfQogIHJldHVybiBzcGFjZUJlZm9yZSArIGNvbnRlbnQgKyBzcGFjZUFmdGVyOwp9CgovKioKICogRXNjYXBlcyBhbGwgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMsIHNvIHRoYXQgdGhlCiAqIHJlc3VsdGluZyBzdHJpbmcgY2FuIGJlIHNhZmVseSBpbnNlcnRlZCBpbnRvIGF0dHJpYnV0ZSBvcgogKiBlbGVtZW50IHRleHQuCiAqIEBwYXJhbSB2YWx1ZQogKiBAcmV0dXJucyB7c3RyaW5nfSBlc2NhcGVkIHRleHQKICovCmZ1bmN0aW9uIGVuY29kZUVudGl0aWVzKHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlLgogICAgcmVwbGFjZSgvJi9nLCAnJmFtcDsnKS4KICAgIHJlcGxhY2UoU1VSUk9HQVRFX1BBSVJfUkVHRVhQLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICB2YXIgaGkgPSB2YWx1ZS5jaGFyQ29kZUF0KDApOwogICAgICB2YXIgbG93ID0gdmFsdWUuY2hhckNvZGVBdCgxKTsKICAgICAgcmV0dXJuICcmIycgKyAoKChoaSAtIDB4RDgwMCkgKiAweDQwMCkgKyAobG93IC0gMHhEQzAwKSArIDB4MTAwMDApICsgJzsnOwogICAgfSkuCiAgICByZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUNfUkVHRVhQLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gJyYjJyArIHZhbHVlLmNoYXJDb2RlQXQoMCkgKyAnOyc7CiAgICB9KS4KICAgIHJlcGxhY2UoLzwvZywgJyZsdDsnKS4KICAgIHJlcGxhY2UoLz4vZywgJyZndDsnKTsKfQoKLyoqCiAqIGNyZWF0ZSBhbiBIVE1ML1hNTCB3cml0ZXIgd2hpY2ggd3JpdGVzIHRvIGJ1ZmZlcgogKiBAcGFyYW0ge0FycmF5fSBidWYgdXNlIGJ1Zi5qYWluKCcnKSB0byBnZXQgb3V0IHNhbml0aXplZCBodG1sIHN0cmluZwogKiBAcmV0dXJucyB7b2JqZWN0fSBpbiB0aGUgZm9ybSBvZiB7CiAqICAgICBzdGFydDogZnVuY3Rpb24odGFnLCBhdHRycywgdW5hcnkpIHt9LAogKiAgICAgZW5kOiBmdW5jdGlvbih0YWcpIHt9LAogKiAgICAgY2hhcnM6IGZ1bmN0aW9uKHRleHQpIHt9LAogKiAgICAgY29tbWVudDogZnVuY3Rpb24odGV4dCkge30KICogfQogKi8KZnVuY3Rpb24gaHRtbFNhbml0aXplV3JpdGVyKGJ1ZiwgdXJpVmFsaWRhdG9yKSB7CiAgdmFyIGlnbm9yZSA9IGZhbHNlOwogIHZhciBvdXQgPSBhbmd1bGFyLmJpbmQoYnVmLCBidWYucHVzaCk7CiAgcmV0dXJuIHsKICAgIHN0YXJ0OiBmdW5jdGlvbih0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICB0YWcgPSBhbmd1bGFyLmxvd2VyY2FzZSh0YWcpOwogICAgICBpZiAoIWlnbm9yZSAmJiBzcGVjaWFsRWxlbWVudHNbdGFnXSkgewogICAgICAgIGlnbm9yZSA9IHRhZzsKICAgICAgfQogICAgICBpZiAoIWlnbm9yZSAmJiB2YWxpZEVsZW1lbnRzW3RhZ10gPT09IHRydWUpIHsKICAgICAgICBvdXQoJzwnKTsKICAgICAgICBvdXQodGFnKTsKICAgICAgICBhbmd1bGFyLmZvckVhY2goYXR0cnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICAgIHZhciBsa2V5PWFuZ3VsYXIubG93ZXJjYXNlKGtleSk7CiAgICAgICAgICB2YXIgaXNJbWFnZSA9ICh0YWcgPT09ICdpbWcnICYmIGxrZXkgPT09ICdzcmMnKSB8fCAobGtleSA9PT0gJ2JhY2tncm91bmQnKTsKICAgICAgICAgIGlmICh2YWxpZEF0dHJzW2xrZXldID09PSB0cnVlICYmCiAgICAgICAgICAgICh1cmlBdHRyc1tsa2V5XSAhPT0gdHJ1ZSB8fCB1cmlWYWxpZGF0b3IodmFsdWUsIGlzSW1hZ2UpKSkgewogICAgICAgICAgICBvdXQoJyAnKTsKICAgICAgICAgICAgb3V0KGtleSk7CiAgICAgICAgICAgIG91dCgnPSInKTsKICAgICAgICAgICAgb3V0KGVuY29kZUVudGl0aWVzKHZhbHVlKSk7CiAgICAgICAgICAgIG91dCgnIicpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIG91dCh1bmFyeSA/ICcvPicgOiAnPicpOwogICAgICB9CiAgICB9LAogICAgZW5kOiBmdW5jdGlvbih0YWcpIHsKICAgICAgICB0YWcgPSBhbmd1bGFyLmxvd2VyY2FzZSh0YWcpOwogICAgICAgIGlmICghaWdub3JlICYmIHZhbGlkRWxlbWVudHNbdGFnXSA9PT0gdHJ1ZSkgewogICAgICAgICAgb3V0KCc8LycpOwogICAgICAgICAgb3V0KHRhZyk7CiAgICAgICAgICBvdXQoJz4nKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRhZyA9PSBpZ25vcmUpIHsKICAgICAgICAgIGlnbm9yZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSwKICAgIGNoYXJzOiBmdW5jdGlvbihjaGFycykgewogICAgICAgIGlmICghaWdub3JlKSB7CiAgICAgICAgICBvdXQoZW5jb2RlRW50aXRpZXMoY2hhcnMpKTsKICAgICAgICB9CiAgICAgIH0KICB9Owp9CgoKLy8gZGVmaW5lIG5nU2FuaXRpemUgbW9kdWxlIGFuZCByZWdpc3RlciAkc2FuaXRpemUgc2VydmljZQphbmd1bGFyLm1vZHVsZSgnbmdTYW5pdGl6ZScsIFtdKS5wcm92aWRlcignJHNhbml0aXplJywgJFNhbml0aXplUHJvdmlkZXIpOwoKLyogZ2xvYmFsIHNhbml0aXplVGV4dDogZmFsc2UgKi8KCi8qKgogKiBAbmdkb2MgZmlsdGVyCiAqIEBuYW1lIGxpbmt5CiAqIEBraW5kIGZ1bmN0aW9uCiAqCiAqIEBkZXNjcmlwdGlvbgogKiBGaW5kcyBsaW5rcyBpbiB0ZXh0IGlucHV0IGFuZCB0dXJucyB0aGVtIGludG8gaHRtbCBsaW5rcy4gU3VwcG9ydHMgaHR0cC9odHRwcy9mdHAvbWFpbHRvIGFuZAogKiBwbGFpbiBlbWFpbCBhZGRyZXNzIGxpbmtzLgogKgogKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nU2FuaXRpemUgYG5nU2FuaXRpemVgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLgogKgogKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBJbnB1dCB0ZXh0LgogKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IFdpbmRvdyAoX2JsYW5rfF9zZWxmfF9wYXJlbnR8X3RvcCkgb3IgbmFtZWQgZnJhbWUgdG8gb3BlbiBsaW5rcyBpbi4KICogQHJldHVybnMge3N0cmluZ30gSHRtbC1saW5raWZpZWQgdGV4dC4KICoKICogQHVzYWdlCiAgIDxzcGFuIG5nLWJpbmQtaHRtbD0ibGlua3lfZXhwcmVzc2lvbiB8IGxpbmt5Ij48L3NwYW4+CiAqCiAqIEBleGFtcGxlCiAgIDxleGFtcGxlIG1vZHVsZT0ibGlua3lFeGFtcGxlIiBkZXBzPSJhbmd1bGFyLXNhbml0aXplLmpzIj4KICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KICAgICAgIDxzY3JpcHQ+CiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdsaW5reUV4YW1wbGUnLCBbJ25nU2FuaXRpemUnXSkKICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgewogICAgICAgICAgICAgJHNjb3BlLnNuaXBwZXQgPQogICAgICAgICAgICAgICAnUHJldHR5IHRleHQgd2l0aCBzb21lIGxpbmtzOlxuJysKICAgICAgICAgICAgICAgJ2h0dHA6Ly9hbmd1bGFyanMub3JnLyxcbicrCiAgICAgICAgICAgICAgICdtYWlsdG86dXNAc29tZXdoZXJlLm9yZyxcbicrCiAgICAgICAgICAgICAgICdhbm90aGVyQHNvbWV3aGVyZS5vcmcsXG4nKwogICAgICAgICAgICAgICAnYW5kIG9uZSBtb3JlOiBmdHA6Ly8xMjcuMC4wLjEvLic7CiAgICAgICAgICAgICAkc2NvcGUuc25pcHBldFdpdGhUYXJnZXQgPSAnaHR0cDovL2FuZ3VsYXJqcy5vcmcvJzsKICAgICAgICAgICB9XSk7CiAgICAgICA8L3NjcmlwdD4KICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgogICAgICAgU25pcHBldDogPHRleHRhcmVhIG5nLW1vZGVsPSJzbmlwcGV0IiBjb2xzPSI2MCIgcm93cz0iMyI+PC90ZXh0YXJlYT4KICAgICAgIDx0YWJsZT4KICAgICAgICAgPHRyPgogICAgICAgICAgIDx0ZD5GaWx0ZXI8L3RkPgogICAgICAgICAgIDx0ZD5Tb3VyY2U8L3RkPgogICAgICAgICAgIDx0ZD5SZW5kZXJlZDwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgICAgIDx0ciBpZD0ibGlua3ktZmlsdGVyIj4KICAgICAgICAgICA8dGQ+bGlua3kgZmlsdGVyPC90ZD4KICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICA8cHJlPiZsdDtkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0IHwgbGlua3kiJmd0Ozxicj4mbHQ7L2RpdiZndDs8L3ByZT4KICAgICAgICAgICA8L3RkPgogICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgIDxkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0IHwgbGlua3kiPjwvZGl2PgogICAgICAgICAgIDwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgICAgIDx0ciBpZD0ibGlua3ktdGFyZ2V0Ij4KICAgICAgICAgIDx0ZD5saW5reSB0YXJnZXQ8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8cHJlPiZsdDtkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0V2l0aFRhcmdldCB8IGxpbmt5OidfYmxhbmsnIiZndDs8YnI+Jmx0Oy9kaXYmZ3Q7PC9wcmU+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldFdpdGhUYXJnZXQgfCBsaW5reTonX2JsYW5rJyI+PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgICA8L3RyPgogICAgICAgICA8dHIgaWQ9ImVzY2FwZWQtaHRtbCI+CiAgICAgICAgICAgPHRkPm5vIGZpbHRlcjwvdGQ+CiAgICAgICAgICAgPHRkPjxwcmU+Jmx0O2RpdiBuZy1iaW5kPSJzbmlwcGV0IiZndDs8YnI+Jmx0Oy9kaXYmZ3Q7PC9wcmU+PC90ZD4KICAgICAgICAgICA8dGQ+PGRpdiBuZy1iaW5kPSJzbmlwcGV0Ij48L2Rpdj48L3RkPgogICAgICAgICA8L3RyPgogICAgICAgPC90YWJsZT4KICAgICA8L2ZpbGU+CiAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CiAgICAgICBpdCgnc2hvdWxkIGxpbmtpZnkgdGhlIHNuaXBwZXQgd2l0aCB1cmxzJywgZnVuY3Rpb24oKSB7CiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5reS1maWx0ZXInKSkuZWxlbWVudChieS5iaW5kaW5nKCdzbmlwcGV0IHwgbGlua3knKSkuZ2V0VGV4dCgpKS4KICAgICAgICAgICAgIHRvQmUoJ1ByZXR0eSB0ZXh0IHdpdGggc29tZSBsaW5rczogaHR0cDovL2FuZ3VsYXJqcy5vcmcvLCB1c0Bzb21ld2hlcmUub3JnLCAnICsKICAgICAgICAgICAgICAgICAgJ2Fub3RoZXJAc29tZXdoZXJlLm9yZywgYW5kIG9uZSBtb3JlOiBmdHA6Ly8xMjcuMC4wLjEvLicpOwogICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcjbGlua3ktZmlsdGVyIGEnKSkuY291bnQoKSkudG9FcXVhbCg0KTsKICAgICAgIH0pOwoKICAgICAgIGl0KCdzaG91bGQgbm90IGxpbmtpZnkgc25pcHBldCB3aXRob3V0IHRoZSBsaW5reSBmaWx0ZXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2VzY2FwZWQtaHRtbCcpKS5lbGVtZW50KGJ5LmJpbmRpbmcoJ3NuaXBwZXQnKSkuZ2V0VGV4dCgpKS4KICAgICAgICAgICAgIHRvQmUoJ1ByZXR0eSB0ZXh0IHdpdGggc29tZSBsaW5rczogaHR0cDovL2FuZ3VsYXJqcy5vcmcvLCBtYWlsdG86dXNAc29tZXdoZXJlLm9yZywgJyArCiAgICAgICAgICAgICAgICAgICdhbm90aGVyQHNvbWV3aGVyZS5vcmcsIGFuZCBvbmUgbW9yZTogZnRwOi8vMTI3LjAuMC4xLy4nKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnI2VzY2FwZWQtaHRtbCBhJykpLmNvdW50KCkpLnRvRXF1YWwoMCk7CiAgICAgICB9KTsKCiAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzbmlwcGV0JykpLmNsZWFyKCk7CiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3NuaXBwZXQnKSkuc2VuZEtleXMoJ25ldyBodHRwOi8vbGluay4nKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmt5LWZpbHRlcicpKS5lbGVtZW50KGJ5LmJpbmRpbmcoJ3NuaXBwZXQgfCBsaW5reScpKS5nZXRUZXh0KCkpLgogICAgICAgICAgICAgdG9CZSgnbmV3IGh0dHA6Ly9saW5rLicpOwogICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcjbGlua3ktZmlsdGVyIGEnKSkuY291bnQoKSkudG9FcXVhbCgxKTsKICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2VzY2FwZWQtaHRtbCcpKS5lbGVtZW50KGJ5LmJpbmRpbmcoJ3NuaXBwZXQnKSkuZ2V0VGV4dCgpKQogICAgICAgICAgICAgLnRvQmUoJ25ldyBodHRwOi8vbGluay4nKTsKICAgICAgIH0pOwoKICAgICAgIGl0KCdzaG91bGQgd29yayB3aXRoIHRoZSB0YXJnZXQgcHJvcGVydHknLCBmdW5jdGlvbigpIHsKICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGlua3ktdGFyZ2V0JykpLgogICAgICAgICAgICBlbGVtZW50KGJ5LmJpbmRpbmcoInNuaXBwZXRXaXRoVGFyZ2V0IHwgbGlua3k6J19ibGFuayciKSkuZ2V0VGV4dCgpKS4KICAgICAgICAgICAgdG9CZSgnaHR0cDovL2FuZ3VsYXJqcy5vcmcvJyk7CiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjbGlua3ktdGFyZ2V0IGEnKSkuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKSkudG9FcXVhbCgnX2JsYW5rJyk7CiAgICAgICB9KTsKICAgICA8L2ZpbGU+CiAgIDwvZXhhbXBsZT4KICovCmFuZ3VsYXIubW9kdWxlKCduZ1Nhbml0aXplJykuZmlsdGVyKCdsaW5reScsIFsnJHNhbml0aXplJywgZnVuY3Rpb24oJHNhbml0aXplKSB7CiAgdmFyIExJTktZX1VSTF9SRUdFWFAgPQogICAgICAgIC8oKGZ0cHxodHRwcz8pOlwvXC98KHd3d1wuKXwobWFpbHRvOik/W0EtWmEtejAtOS5fJSstXStAKVxTKlteXHMuOywoKXt9PD4i4oCd4j+ZXS8sCiAgICAgIE1BSUxUT19SRUdFWFAgPSAvXm1haWx0bzovOwoKICByZXR1cm4gZnVuY3Rpb24odGV4dCwgdGFyZ2V0KSB7CiAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0OwogICAgdmFyIG1hdGNoOwogICAgdmFyIHJhdyA9IHRleHQ7CiAgICB2YXIgaHRtbCA9IFtdOwogICAgdmFyIHVybDsKICAgIHZhciBpOwogICAgd2hpbGUgKChtYXRjaCA9IHJhdy5tYXRjaChMSU5LWV9VUkxfUkVHRVhQKSkpIHsKICAgICAgLy8gV2UgY2FuIG5vdCBlbmQgaW4gdGhlc2UgYXMgdGhleSBhcmUgc29tZXRpbWVzIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIHNlbnRlbmNlCiAgICAgIHVybCA9IG1hdGNoWzBdOwogICAgICAvLyBpZiB3ZSBkaWQgbm90IG1hdGNoIGZ0cC9odHRwL3d3dy9tYWlsdG8gdGhlbiBhc3N1bWUgbWFpbHRvCiAgICAgIGlmICghbWF0Y2hbMl0gJiYgIW1hdGNoWzRdKSB7CiAgICAgICAgdXJsID0gKG1hdGNoWzNdID8gJ2h0dHA6Ly8nIDogJ21haWx0bzonKSArIHVybDsKICAgICAgfQogICAgICBpID0gbWF0Y2guaW5kZXg7CiAgICAgIGFkZFRleHQocmF3LnN1YnN0cigwLCBpKSk7CiAgICAgIGFkZExpbmsodXJsLCBtYXRjaFswXS5yZXBsYWNlKE1BSUxUT19SRUdFWFAsICcnKSk7CiAgICAgIHJhdyA9IHJhdy5zdWJzdHJpbmcoaSArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICB9CiAgICBhZGRUZXh0KHJhdyk7CiAgICByZXR1cm4gJHNhbml0aXplKGh0bWwuam9pbignJykpOwoKICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dCkgewogICAgICBpZiAoIXRleHQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaHRtbC5wdXNoKHNhbml0aXplVGV4dCh0ZXh0KSk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkTGluayh1cmwsIHRleHQpIHsKICAgICAgaHRtbC5wdXNoKCc8YSAnKTsKICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKHRhcmdldCkpIHsKICAgICAgICBodG1sLnB1c2goJ3RhcmdldD0iJywKICAgICAgICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICAgICAgICAnIiAnKTsKICAgICAgfQogICAgICBodG1sLnB1c2goJ2hyZWY9IicsCiAgICAgICAgICAgICAgICB1cmwucmVwbGFjZSgvIi9nLCAnJnF1b3Q7JyksCiAgICAgICAgICAgICAgICAnIj4nKTsKICAgICAgYWRkVGV4dCh0ZXh0KTsKICAgICAgaHRtbC5wdXNoKCc8L2E+Jyk7CiAgICB9CiAgfTsKfV0pOwoKCn0pKHdpbmRvdywgd2luZG93LmFuZ3VsYXIpOwo=