[{"name":"1x1.gif","aliases":["1x1-transparent.gif"],"kind":{"mime":"image/gif"},"content":"R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="},{"name":"2x2.png","aliases":["2x2-transparent.png"],"kind":{"mime":"image/png"},"content":"iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAC0lEQVQI12NgQAcAABIAAe+JVKQAAAAASUVORK5CYII="},{"name":"3x2.png","aliases":["3x2-transparent.png"],"kind":{"mime":"image/png"},"content":"iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAC0lEQVQI12NgwAUAABoAASRETuUAAAAASUVORK5CYII="},{"name":"32x32.png","aliases":["32x32-transparent.png"],"kind":{"mime":"image/png"},"content":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGklEQVRYw+3BAQEAAACCIP+vbkhAAQAAAO8GECAAAZf3V9cAAAAASUVORK5CYII="},{"name":"amazon_ads.js","aliases":["amazon-adsystem.com/aax2/amzn_ads.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAoIGFtem5hZHMgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHcgPSB3aW5kb3c7CiAgICB2YXIgbm9vcGZuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgOwogICAgfS5iaW5kKCk7CiAgICB2YXIgYW16bmFkcyA9IHsKICAgICAgICBhcHBlbmRTY3JpcHRUYWc6IG5vb3BmbiwKICAgICAgICBhcHBlbmRUYXJnZXRpbmdUb0FkU2VydmVyVXJsOiBub29wZm4sCiAgICAgICAgYXBwZW5kVGFyZ2V0aW5nVG9RdWVyeVN0cmluZzogbm9vcGZuLAogICAgICAgIGNsZWFyVGFyZ2V0aW5nRnJvbUdQVEFzeW5jOiBub29wZm4sCiAgICAgICAgZG9BbGxUYXNrczogbm9vcGZuLAogICAgICAgIGRvR2V0QWRzQXN5bmM6IG5vb3BmbiwKICAgICAgICBkb1Rhc2s6IG5vb3BmbiwKICAgICAgICBkZXRlY3RJZnJhbWVBbmRHZXRVUkw6IG5vb3BmbiwKICAgICAgICBnZXRBZHM6IG5vb3BmbiwKICAgICAgICBnZXRBZHNBc3luYzogbm9vcGZuLAogICAgICAgIGdldEFkRm9yU2xvdDogbm9vcGZuLAogICAgICAgIGdldEFkc0NhbGxiYWNrOiBub29wZm4sCiAgICAgICAgZ2V0RGlzcGxheUFkczogbm9vcGZuLAogICAgICAgIGdldERpc3BsYXlBZHNBc3luYzogbm9vcGZuLAogICAgICAgIGdldERpc3BsYXlBZHNDYWxsYmFjazogbm9vcGZuLAogICAgICAgIGdldEtleXM6IG5vb3BmbiwKICAgICAgICBnZXRSZWZlcnJlclVSTDogbm9vcGZuLAogICAgICAgIGdldFNjcmlwdFNvdXJjZTogbm9vcGZuLAogICAgICAgIGdldFRhcmdldGluZzogbm9vcGZuLAogICAgICAgIGdldFRva2Vuczogbm9vcGZuLAogICAgICAgIGdldFZhbGlkTWlsbGlzZWNvbmRzOiBub29wZm4sCiAgICAgICAgZ2V0VmlkZW9BZHM6IG5vb3BmbiwKICAgICAgICBnZXRWaWRlb0Fkc0FzeW5jOiBub29wZm4sCiAgICAgICAgZ2V0VmlkZW9BZHNDYWxsYmFjazogbm9vcGZuLAogICAgICAgIGhhbmRsZUNhbGxCYWNrOiBub29wZm4sCiAgICAgICAgaGFzQWRzOiBub29wZm4sCiAgICAgICAgcmVuZGVyQWQ6IG5vb3BmbiwKICAgICAgICBzYXZlQWRzOiBub29wZm4sCiAgICAgICAgc2V0VGFyZ2V0aW5nOiBub29wZm4sCiAgICAgICAgc2V0VGFyZ2V0aW5nRm9yR1BUQXN5bmM6IG5vb3BmbiwKICAgICAgICBzZXRUYXJnZXRpbmdGb3JHUFRTeW5jOiBub29wZm4sCiAgICAgICAgdHJ5R2V0QWRzQXN5bmM6IG5vb3BmbiwKICAgICAgICB1cGRhdGVBZHM6IG5vb3BmbgogICAgfTsKICAgIHcuYW16bmFkcyA9IGFtem5hZHM7CiAgICB3LmFtem5fYWRzID0gdy5hbXpuX2FkcyB8fCBub29wZm47CiAgICB3LmFheF93cml0ZSA9IHcuYWF4X3dyaXRlIHx8IG5vb3BmbjsKICAgIHcuYWF4X3JlbmRlcl9hZCA9IHcuYWF4X3JlbmRlcl9hZCB8fCBub29wZm47Cn0pKCk7Cg=="},{"name":"amazon_apstag.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgovLyBodHRwczovL3d3dy5yZWRkaXQuY29tL3IvdUJsb2NrT3JpZ2luL2NvbW1lbnRzL2doanFwaC8KLy8gaHR0cHM6Ly9naXRodWIuY29tL05hbm9NZW93L1F1aWNrUmVwb3J0cy9pc3N1ZXMvMzcxNwovLyBodHRwczovL3d3dy5yZWRkaXQuY29tL3IvdUJsb2NrT3JpZ2luL2NvbW1lbnRzL3F5eDdlbi8KCi8vIGh0dHBzOi8vc2VhcmNoZm94Lm9yZy9tb3ppbGxhLWNlbnRyYWwvc291cmNlL2Jyb3dzZXIvZXh0ZW5zaW9ucy93ZWJjb21wYXQvc2hpbXMvYXBzdGFnLmpzCi8vICAgSW1wb3J0IHF1ZXVlLXJlbGF0ZWQgaW5pdGlhbGl6YXRpb24gY29kZS4KCihmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGNvbnN0IHcgPSB3aW5kb3c7CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgICAgICA7IC8vIGpzaGludCBpZ25vcmU6bGluZQogICAgfS5iaW5kKCk7CiAgICBjb25zdCBfUSA9IHcuYXBzdGFnICYmIHcuYXBzdGFnLl9RIHx8IFtdOwogICAgY29uc3QgYXBzdGFnID0gewogICAgICAgIF9RLAogICAgICAgIGZldGNoQmlkczogZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICBpZiAoIHR5cGVvZiBiID09PSAnZnVuY3Rpb24nICkgewogICAgICAgICAgICAgICAgYihbXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGluaXQ6IG5vb3BmbiwKICAgICAgICBzZXREaXNwbGF5Qmlkczogbm9vcGZuLAogICAgICAgIHRhcmdldGluZ0tleXM6IG5vb3BmbiwKICAgIH07CiAgICB3LmFwc3RhZyA9IGFwc3RhZzsKICAgIF9RLnB1c2ggPSBmdW5jdGlvbihwcmVmaXgsIGFyZ3MpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBzd2l0Y2ggKHByZWZpeCkgewogICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgICAgIGFwc3RhZy5mZXRjaEJpZHMoLi4uYXJncyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS50cmFjZShlKTsKICAgICAgICB9CiAgICB9OwogICAgZm9yICggY29uc3QgY21kIG9mIF9RICkgewogICAgICAgIF9RLnB1c2goY21kKTsKICAgIH0KfSkoKTsK"},{"name":"ampproject_v0.js","aliases":["ampproject.org/v0.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuaGVhZDsKICAgIGlmICggIWhlYWQgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgc3R5bGUudGV4dENvbnRlbnQgPSBbCiAgICAgICAgJ2JvZHkgeycsCiAgICAgICAgJyAgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnQ7JywKICAgICAgICAnICBvdmVyZmxvdzogdW5zZXQgIWltcG9ydGFudDsnLAogICAgICAgICd9JwogICAgXS5qb2luKCdcbicpOwogICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7Cn0pKCk7Cg=="},{"name":"chartbeat.js","aliases":["static.chartbeat.com/chartbeat.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICB3aW5kb3cucFNVUEVSRkxZID0gewogICAgICAgIGFjdGl2aXR5OiBub29wZm4sCiAgICAgICAgdmlydHVhbFBhZ2U6IG5vb3BmbgogICAgfTsKICAgIGZvciAoIGNvbnN0IGhpZGVyIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlW2lkXj1jaGFydGJlYXQtZmxpY2tlci1jb250cm9sXScpICkgewogICAgICAgIGhpZGVyLnJlbW92ZSgpOwogICAgfQp9KSgpOwo="},{"name":"doubleclick_instream_ad_status.js","aliases":["doubleclick.net/instream/ad_status.js"],"kind":{"mime":"application/javascript"},"content":"d2luZG93Lmdvb2dsZV9hZF9zdGF0dXMgPSAxOwo="},{"name":"empty","aliases":[],"kind":{"mime":"application/octet-stream"},"content":""},{"name":"fingerprint2.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxNC1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgovLyBSZWZlcmVuY2U6Ci8vIGh0dHBzOi8vZ2l0aHViLmNvbS9maW5nZXJwcmludGpzL2ZpbmdlcnByaW50anMvdHJlZS92MgoKKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgY29uc3QgaGV4MzIgPSBsZW4gPT4gewogICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikKICAgICAgICAgICAgLnRvU3RyaW5nKDE2KQogICAgICAgICAgICAuc2xpY2UoLWxlbikKICAgICAgICAgICAgLnBhZFN0YXJ0KGxlbiwgJzAnKTsKICAgIH07CiAgICBjb25zdCBicm93c2VySWQgPSBgJHtoZXgzMig4KX0ke2hleDMyKDgpfSR7aGV4MzIoOCl9JHtoZXgzMig4KX1gOwogICAgY29uc3QgZnAyID0gZnVuY3Rpb24oKXt9OwogICAgZnAyLmdldCA9IGZ1bmN0aW9uKG9wdHMsIGNiKSB7CiAgICAgICAgaWYgKCAhY2IgICkgeyBjYiA9IG9wdHM7IH0KICAgICAgICBzZXRUaW1lb3V0KCggKSA9PiB7IGNiKFtdKTsgfSwgMSk7CiAgICB9OwogICAgZnAyLmdldFByb21pc2UgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTsKICAgIH07CiAgICBmcDIuZ2V0VjE4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGJyb3dzZXJJZDsKICAgIH07CiAgICBmcDIueDY0aGFzaDEyOCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBicm93c2VySWQ7CiAgICB9OwogICAgZnAyLnByb3RvdHlwZSA9IHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9wdHMsIGNiKSB7CiAgICAgICAgICAgIGlmICggIWNiICApIHsgY2IgPSBvcHRzOyB9CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCApID0+IHsgY2IoYnJvd3NlcklkLCBbXSk7IH0sIDEpOwogICAgICAgIH0sCiAgICB9OwogICAgc2VsZi5GaW5nZXJwcmludDIgPSBzZWxmLkZpbmdlcnByaW50ID0gZnAyOwp9KSgpOwo="},{"name":"fingerprint3.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAyMi1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCB2aXNpdG9ySWQgPSAoKCApID0+IHsKICAgICAgICBsZXQgaWQgPSAnJzsKICAgICAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCA4OyBpKysgKSB7CiAgICAgICAgICAgIGlkICs9IChNYXRoLnJhbmRvbSgpICogMHgxMDAwMCArIDB4MTAwMCB8IDApLnRvU3RyaW5nKDE2KS5zbGljZSgtNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZDsKICAgIH0pKCk7CiAgICBjb25zdCBGaW5nZXJwcmludEpTID0gY2xhc3MgewogICAgICAgIHN0YXRpYyBoYXNoQ29tcG9uZW50cygpIHsKICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3JJZDsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGxvYWQoKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEZpbmdlcnByaW50SlMoKSk7CiAgICAgICAgfQogICAgICAgIGdldCgpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7CiAgICAgICAgICAgICAgICB2aXNpdG9ySWQsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH07CiAgICB3aW5kb3cuRmluZ2VycHJpbnRKUyA9IEZpbmdlcnByaW50SlM7Cn0pKCk7Cg=="},{"name":"google-analytics_analytics.js","aliases":["google-analytics.com/analytics.js","googletagmanager_gtm.js","googletagmanager.com/gtm.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9hbmFseXRpY3MvZGV2Z3VpZGVzL2NvbGxlY3Rpb24vYW5hbHl0aWNzanMvCiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICAvLwogICAgY29uc3QgVHJhY2tlciA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgIGNvbnN0IHAgPSBUcmFja2VyLnByb3RvdHlwZTsKICAgIHAuZ2V0ID0gbm9vcGZuOwogICAgcC5zZXQgPSBub29wZm47CiAgICBwLnNlbmQgPSBub29wZm47CiAgICAvLwogICAgY29uc3QgdyA9IHdpbmRvdzsKICAgIGNvbnN0IGdhTmFtZSA9IHcuR29vZ2xlQW5hbHl0aWNzT2JqZWN0IHx8ICdnYSc7CiAgICBjb25zdCBnYVF1ZXVlID0gd1tnYU5hbWVdOwogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3VCbG9ja09yaWdpbi91QXNzZXRzL3B1bGwvNDExNQogICAgY29uc3QgZ2EgPSBmdW5jdGlvbigpIHsKICAgICAgICBjb25zdCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICAgIGlmICggbGVuID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBhcmdzID0gQXJyYXkuZnJvbShhcmd1bWVudHMpOwogICAgICAgIGxldCBmbjsKICAgICAgICBsZXQgYSA9IGFyZ3NbbGVuLTFdOwogICAgICAgIGlmICggYSBpbnN0YW5jZW9mIE9iamVjdCAmJiBhLmhpdENhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIGZuID0gYS5oaXRDYWxsYmFjazsKICAgICAgICB9IGVsc2UgaWYgKCBhIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIGZuID0gKCApID0+IHsgYShnYS5jcmVhdGUoKSk7IH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgcG9zID0gYXJncy5pbmRleE9mKCdoaXRDYWxsYmFjaycpOwogICAgICAgICAgICBpZiAoIHBvcyAhPT0gLTEgJiYgYXJnc1twb3MrMV0gaW5zdGFuY2VvZiBGdW5jdGlvbiApIHsKICAgICAgICAgICAgICAgIGZuID0gYXJnc1twb3MrMV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCBmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm4oKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgIH0KICAgIH07CiAgICBnYS5jcmVhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbmV3IFRyYWNrZXIoKTsKICAgIH07CiAgICBnYS5nZXRCeU5hbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbmV3IFRyYWNrZXIoKTsKICAgIH07CiAgICBnYS5nZXRBbGwgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gW25ldyBUcmFja2VyKCldOwogICAgfTsKICAgIGdhLnJlbW92ZSA9IG5vb3BmbjsKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91QmxvY2tPcmlnaW4vdUFzc2V0cy9pc3N1ZXMvMjEwNwogICAgZ2EubG9hZGVkID0gdHJ1ZTsKICAgIHdbZ2FOYW1lXSA9IGdhOwogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrL2lzc3Vlcy8zMDc1CiAgICBjb25zdCBkbCA9IHcuZGF0YUxheWVyOwogICAgaWYgKCBkbCBpbnN0YW5jZW9mIE9iamVjdCApIHsKICAgICAgICBpZiAoIGRsLmhpZGUgaW5zdGFuY2VvZiBPYmplY3QgJiYgdHlwZW9mIGRsLmhpZGUuZW5kID09PSAnZnVuY3Rpb24nICkgewogICAgICAgICAgICBkbC5oaWRlLmVuZCgpOwogICAgICAgICAgICBkbC5oaWRlLmVuZCA9ICgpPT57fTsKICAgICAgICB9CiAgICAgICAgaWYgKCB0eXBlb2YgZGwucHVzaCA9PT0gJ2Z1bmN0aW9uJyApIHsKICAgICAgICAgICAgY29uc3QgZG9DYWxsYmFjayA9IGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmICggaXRlbSBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgaXRlbS5ldmVudENhbGxiYWNrICE9PSAnZnVuY3Rpb24nICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaXRlbS5ldmVudENhbGxiYWNrLCAxKTsKICAgICAgICAgICAgICAgIGl0ZW0uZXZlbnRDYWxsYmFjayA9ICgpPT57fTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGwucHVzaCA9IG5ldyBQcm94eShkbC5wdXNoLCB7CiAgICAgICAgICAgICAgICBhcHBseTogZnVuY3Rpb24odGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFjayhhcmdzWzBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KGRsKSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHEgPSBkbC5zbGljZSgpOwogICAgICAgICAgICAgICAgZm9yICggY29uc3QgaXRlbSBvZiBxICkgewogICAgICAgICAgICAgICAgICAgIGRvQ2FsbGJhY2soaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyBlbXB0eSBnYSBxdWV1ZQogICAgaWYgKCBnYVF1ZXVlIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgQXJyYXkuaXNBcnJheShnYVF1ZXVlLnEpICkgewogICAgICAgIGNvbnN0IHEgPSBnYVF1ZXVlLnEuc2xpY2UoKTsKICAgICAgICBnYVF1ZXVlLnEubGVuZ3RoID0gMDsKICAgICAgICBmb3IgKCBjb25zdCBlbnRyeSBvZiBxICkgewogICAgICAgICAgICBnYSguLi5lbnRyeSk7CiAgICAgICAgfQogICAgfQp9KSgpOwo="},{"name":"google-analytics_cx_api.js","aliases":["google-analytics.com/cx/api.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICB3aW5kb3cuY3hBcGkgPSB7CiAgICAgICAgY2hvb3NlVmFyaWF0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSwKICAgICAgICBnZXRDaG9zZW5WYXJpYXRpb246IG5vb3BmbiwKICAgICAgICBzZXRBbGxvd0hhc2g6IG5vb3BmbiwKICAgICAgICBzZXRDaG9zZW5WYXJpYXRpb246IG5vb3BmbiwKICAgICAgICBzZXRDb29raWVQYXRoOiBub29wZm4sCiAgICAgICAgc2V0RG9tYWluTmFtZTogbm9vcGZuCiAgICAgICAgfTsKfSkoKTsK"},{"name":"google-analytics_ga.js","aliases":["google-analytics.com/ga.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICAvLwogICAgY29uc3QgR2FxID0gZnVuY3Rpb24oKSB7CiAgICB9OwogICAgR2FxLnByb3RvdHlwZS5OYSA9IG5vb3BmbjsKICAgIEdhcS5wcm90b3R5cGUuTyA9IG5vb3BmbjsKICAgIEdhcS5wcm90b3R5cGUuU2EgPSBub29wZm47CiAgICBHYXEucHJvdG90eXBlLlRhID0gbm9vcGZuOwogICAgR2FxLnByb3RvdHlwZS5WYSA9IG5vb3BmbjsKICAgIEdhcS5wcm90b3R5cGUuX2NyZWF0ZUFzeW5jVHJhY2tlciA9IG5vb3BmbjsKICAgIEdhcS5wcm90b3R5cGUuX2dldEFzeW5jVHJhY2tlciA9IG5vb3BmbjsKICAgIEdhcS5wcm90b3R5cGUuX2dldFBsdWdpbiA9IG5vb3BmbjsKICAgIEdhcS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGEpIHsKICAgICAgICBpZiAoIHR5cGVvZiBhID09PSAnZnVuY3Rpb24nICkgewogICAgICAgICAgICBhKCk7IHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KGEpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vYW5hbHl0aWNzL2Rldmd1aWRlcy9jb2xsZWN0aW9uL2dhanMvbWV0aG9kcy9nYUpTQXBpRG9tYWluRGlyZWN0b3J5I19nYXQuR0FfVHJhY2tlcl8uX2xpbmsKICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdUJsb2NrT3JpZ2luL3VCbG9jay1pc3N1ZXMvaXNzdWVzLzE4MDcKICAgICAgICBpZiAoCiAgICAgICAgICAgIHR5cGVvZiBhWzBdID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAvKF58XC4pX2xpbmskLy50ZXN0KGFbMF0pICYmCiAgICAgICAgICAgIHR5cGVvZiBhWzFdID09PSAnc3RyaW5nJwogICAgICAgICkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihhWzFdKTsKICAgICAgICAgICAgfSBjYXRjaChleCkgewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb3JoaWxsL3VCbG9jay9pc3N1ZXMvMjE2MgogICAgICAgIGlmICggYVswXSA9PT0gJ19zZXQnICYmIGFbMV0gPT09ICdoaXRDYWxsYmFjaycgJiYgdHlwZW9mIGFbMl0gPT09ICdmdW5jdGlvbicgKSB7CiAgICAgICAgICAgIGFbMl0oKTsKICAgICAgICB9CiAgICB9OwogICAgLy8KICAgIGNvbnN0IHRyYWNrZXIgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc3Qgb3V0ID0ge307CiAgICAgICAgY29uc3QgYXBpID0gWwogICAgICAgICAgICAnX2FkZElnbm9yZWRPcmdhbmljIF9hZGRJZ25vcmVkUmVmIF9hZGRJdGVtIF9hZGRPcmdhbmljJywKICAgICAgICAgICAgJ19hZGRUcmFucyBfY2xlYXJJZ25vcmVkT3JnYW5pYyBfY2xlYXJJZ25vcmVkUmVmIF9jbGVhck9yZ2FuaWMnLAogICAgICAgICAgICAnX2Nvb2tpZVBhdGhDb3B5IF9kZWxldGVDdXN0b21WYXIgX2dldE5hbWUgX3NldEFjY291bnQnLAogICAgICAgICAgICAnX2dldEFjY291bnQgX2dldENsaWVudEluZm8gX2dldERldGVjdEZsYXNoIF9nZXREZXRlY3RUaXRsZScsCiAgICAgICAgICAgICdfZ2V0TGlua2VyVXJsIF9nZXRMb2NhbEdpZlBhdGggX2dldFNlcnZpY2VNb2RlIF9nZXRWZXJzaW9uJywKICAgICAgICAgICAgJ19nZXRWaXNpdG9yQ3VzdG9tVmFyIF9pbml0RGF0YSBfbGlua0J5UG9zdCcsCiAgICAgICAgICAgICdfc2V0QWxsb3dBbmNob3IgX3NldEFsbG93SGFzaCBfc2V0QWxsb3dMaW5rZXIgX3NldENhbXBDb250ZW50S2V5JywKICAgICAgICAgICAgJ19zZXRDYW1wTWVkaXVtS2V5IF9zZXRDYW1wTmFtZUtleSBfc2V0Q2FtcE5PS2V5IF9zZXRDYW1wU291cmNlS2V5JywKICAgICAgICAgICAgJ19zZXRDYW1wVGVybUtleSBfc2V0Q2FtcGFpZ25Db29raWVUaW1lb3V0IF9zZXRDYW1wYWlnblRyYWNrIF9zZXRDbGllbnRJbmZvJywKICAgICAgICAgICAgJ19zZXRDb29raWVQYXRoIF9zZXRDb29raWVQZXJzaXN0ZW5jZSBfc2V0Q29va2llVGltZW91dCBfc2V0Q3VzdG9tVmFyJywKICAgICAgICAgICAgJ19zZXREZXRlY3RGbGFzaCBfc2V0RGV0ZWN0VGl0bGUgX3NldERvbWFpbk5hbWUgX3NldExvY2FsR2lmUGF0aCcsCiAgICAgICAgICAgICdfc2V0TG9jYWxSZW1vdGVTZXJ2ZXJNb2RlIF9zZXRMb2NhbFNlcnZlck1vZGUgX3NldFJlZmVycmVyT3ZlcnJpZGUgX3NldFJlbW90ZVNlcnZlck1vZGUnLAogICAgICAgICAgICAnX3NldFNhbXBsZVJhdGUgX3NldFNlc3Npb25UaW1lb3V0IF9zZXRTaXRlU3BlZWRTYW1wbGVSYXRlIF9zZXRTZXNzaW9uQ29va2llVGltZW91dCcsCiAgICAgICAgICAgICdfc2V0VmFyIF9zZXRWaXNpdG9yQ29va2llVGltZW91dCBfdHJhY2tFdmVudCBfdHJhY2tQYWdlTG9hZFRpbWUnLAogICAgICAgICAgICAnX3RyYWNrUGFnZXZpZXcgX3RyYWNrU29jaWFsIF90cmFja1RpbWluZyBfdHJhY2tUcmFucycsCiAgICAgICAgICAgICdfdmlzaXRDb2RlJwogICAgICAgIF0uam9pbignICcpLnNwbGl0KC9ccysvKTsKICAgICAgICBmb3IgKCBjb25zdCBtZXRob2Qgb2YgYXBpICkgewogICAgICAgICAgICBvdXRbbWV0aG9kXSA9IG5vb3BmbjsKICAgICAgICB9CiAgICAgICAgb3V0Ll9nZXRMaW5rZXJVcmwgPSBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH07CiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0FkZ3VhcmRUZWFtL1NjcmlwdGxldHMvaXNzdWVzLzE1NAogICAgICAgIG91dC5fbGluayA9IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgYSAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihhKTsKICAgICAgICAgICAgfSBjYXRjaChleCkgewogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gb3V0OwogICAgfSkoKTsKICAgIC8vCiAgICBjb25zdCBHYXQgPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICBHYXQucHJvdG90eXBlLl9hbm9ueW1pemVJUCA9IG5vb3BmbjsKICAgIEdhdC5wcm90b3R5cGUuX2NyZWF0ZVRyYWNrZXIgPSBub29wZm47CiAgICBHYXQucHJvdG90eXBlLl9mb3JjZVNTTCA9IG5vb3BmbjsKICAgIEdhdC5wcm90b3R5cGUuX2dldFBsdWdpbiA9IG5vb3BmbjsKICAgIEdhdC5wcm90b3R5cGUuX2dldFRyYWNrZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdHJhY2tlcjsKICAgIH07CiAgICBHYXQucHJvdG90eXBlLl9nZXRUcmFja2VyQnlOYW1lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRyYWNrZXI7CiAgICB9OwogICAgR2F0LnByb3RvdHlwZS5fZ2V0VHJhY2tlcnMgPSBub29wZm47CiAgICBHYXQucHJvdG90eXBlLmFhID0gbm9vcGZuOwogICAgR2F0LnByb3RvdHlwZS5hYiA9IG5vb3BmbjsKICAgIEdhdC5wcm90b3R5cGUuaGIgPSBub29wZm47CiAgICBHYXQucHJvdG90eXBlLmxhID0gbm9vcGZuOwogICAgR2F0LnByb3RvdHlwZS5vYSA9IG5vb3BmbjsKICAgIEdhdC5wcm90b3R5cGUucGEgPSBub29wZm47CiAgICBHYXQucHJvdG90eXBlLnUgPSBub29wZm47CiAgICBjb25zdCBnYXQgPSBuZXcgR2F0KCk7CiAgICB3aW5kb3cuX2dhdCA9IGdhdDsKICAgIC8vCiAgICBjb25zdCBnYXEgPSBuZXcgR2FxKCk7CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc3QgYWEgPSB3aW5kb3cuX2dhcSB8fCBbXTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkoYWEpICkgewogICAgICAgICAgICB3aGlsZSAoIGFhWzBdICkgewogICAgICAgICAgICAgICAgZ2FxLnB1c2goYWEuc2hpZnQoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KSgpOwogICAgd2luZG93Ll9nYXEgPSBnYXEucWYgPSBnYXE7Cn0pKCk7Cg=="},{"name":"google-analytics_inpage_linkid.js","aliases":["google-analytics.com/inpage_linkid.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICB3aW5kb3cuX2dhcSA9IHdpbmRvdy5fZ2FxIHx8IHsKICAgICAgICBwdXNoOiBmdW5jdGlvbigpIHsKICAgICAgICB9CiAgICB9Owp9KSgpOwo="},{"name":"google-ima.js","aliases":["google-ima3"],"kind":{"mime":"application/javascript"},"content":"LyoqCiAqIAogKiBTb3VyY2UgYmVsb3cgaXMgYmFzZWQgb24gTW96aWxsYSBzb3VyY2UgY29kZToKICogaHR0cHM6Ly9zZWFyY2hmb3gub3JnL21vemlsbGEtY2VudHJhbC9yZXYvZDMxN2U5M2Q5YTU5YzllNGMwNmFkYTg1ZmJmZjlmNmExY2VhYWFkMS9icm93c2VyL2V4dGVuc2lvbnMvd2ViY29tcGF0L3NoaW1zL2dvb2dsZS1pbWEuanMKICogCiAqIE1vZGlmaWNhdGlvbnMgdG8gdGhlIG9yaWdpbmFsIGNvZGUgYmVsb3cgdGhpcyBjb21tZW50OgogKiAtIEF2b2lkIEpTIHN5bnRheCBub3Qgc3VwcG9ydGVkIGJ5IG9sZGVyIGJyb3dzZXIgdmVyc2lvbnMKICogLSBBZGQgbWlzc2luZyBzaGltIGV2ZW50CiAqIC0gTW9kaWZpZWQgdG8gYXZvaWQganNoaW50IHdhcm5pbmdzIGFzIHBlciB1Qk8ncyBjb25maWcKICogLSBBZGRlZCBgT21pZFZlcmlmaWNhdGlvblZlbmRvcmAgdG8gYGltYWAKICogLSBIYXZlIGBBZEVycm9yLmdldElubmVyRXJyb3IoKWAgcmV0dXJuIGBudWxsYAogKiAtIEhhdmUgYEFkRGlzcGxheUNvbnRhaW5lcmAgY29uc3RydWN0b3IgYWRkIERJViBlbGVtZW50IHRvIGNvbnRhaW5lcgogKiAtIEFkZGVkIG1pc3NpbmcgZXZlbnQgZGlzcGF0Y2hlciBmdW5jdGlvbmFsaXR5CiAqIC0gQ29ycmVjdGVkIHJldHVybiB0eXBlIG9mIGBBZC5nZXRVbml2ZXJzYWxBZElkcygpYAogKiAtIENvcnJlY3RlZCB0eXBvIGluIGBVbml2ZXJzYWxBZElkSW5mby5nZXRBZElkVmFsdWUoKWAgbWV0aG9kIG5hbWUKICogLSBDb3JyZWN0ZWQgZGlzcGF0Y2ggb2YgTE9BRCBldmVudCB3aGVuIHByZWxvYWRpbmcgaXMgZW5hYmxlZAogKiAtIENvcnJlY3RlZCBkaXNwYXRjaCBvZiBDT05URU5UX1BBVVNFL1JFU1VNRV9SRVFVRVNURUQgZXZlbnRzCiAqIC0gUmVtb3ZlIHRlc3QgZm9yIGF1dG8tcGxheSBpbiByZXF1ZXN0QWRzKCk6IGFsd2F5cyBiZWhhdmUgYXMgaWYgYXV0by1wbGF5CiAqICAgaXMgZGlzYWJsZWQKICogCiAqIFJlbGF0ZWQgaXNzdWU6CiAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3VCbG9ja09yaWdpbi91QmxvY2staXNzdWVzL2lzc3Vlcy8yMTU4CiAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3VCbG9ja09yaWdpbi91QXNzZXRzL2lzc3Vlcy8zMDEzNAogKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS91QmxvY2tPcmlnaW4vdUFzc2V0cy9pc3N1ZXMvMzEwMTgKICogCioqLwogCid1c2Ugc3RyaWN0JzsKCi8qIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWMKICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLiAqLwoKLyoqCiAqIEJ1ZyAxNzEzNjkwIC0gU2hpbSBHb29nbGUgSW50ZXJhY3RpdmUgTWVkaWEgQWRzIGltYTMuanMKICoKICogTWFueSBzaXRlcyB1c2UgaW1hMy5qcyBmb3IgYWQgYmlkZGluZyBhbmQgcGxhY2VtZW50LCBvZnRlbiBpbiBjb25qdW5jdGlvbgogKiB3aXRoIEdvb2dsZSBQdWJsaXNoZXIgVGFncywgUHJlYmlkLmpzIGFuZC9vciBvdGhlciBzY3JpcHRzLiBUaGlzIHNoaW0KICogcHJvdmlkZXMgYSBzdHViYmVkLW91dCB2ZXJzaW9uIG9mIHRoZSBBUEkgd2hpY2ggaGVscHMgd29yayBhcm91bmQgcmVsYXRlZAogKiBzaXRlIGJyZWFrYWdlLCBzdWNoIGFzIGJsYWNrIGJ4b2VzIHdoZXJlIHZpZGVvcyBvdWdodCB0byBiZSBwbGFjZWQuCiAqLwoKaWYgKCF3aW5kb3cuZ29vZ2xlIHx8ICF3aW5kb3cuZ29vZ2xlLmltYSB8fCAhd2luZG93Lmdvb2dsZS5pbWEuVkVSU0lPTikgewogIGNvbnN0IFZFUlNJT04gPSAiMy41MTcuMiI7CiAgY29uc3QgaW1hID0ge307CgogIGNsYXNzIEFkRGlzcGxheUNvbnRhaW5lciB7CiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXJFbGVtZW50KSB7CiAgICAgIGNvbnN0IGRpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgZGl2RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgiZGlzcGxheSIsICJub25lIiwgImltcG9ydGFudCIpOwogICAgICBkaXZFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCJ2aXNpYmlsaXR5IiwgImNvbGxhcHNlIiwgImltcG9ydGFudCIpOwogICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGRpdkVsZW1lbnQpOwogICAgfQogICAgZGVzdHJveSgpIHt9CiAgICBpbml0aWFsaXplKCkge30KICB9CgogIGNsYXNzIEltYVNka1NldHRpbmdzIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLmMgPSB0cnVlOwogICAgICB0aGlzLmYgPSB7fTsKICAgICAgdGhpcy5pID0gZmFsc2U7CiAgICAgIHRoaXMubCA9ICIiOwogICAgICB0aGlzLnAgPSAiIjsKICAgICAgdGhpcy5yID0gMDsKICAgICAgdGhpcy50ID0gIiI7CiAgICAgIHRoaXMudiA9ICIiOwogICAgfQogICAgZ2V0Q29tcGFuaW9uQmFja2ZpbGwoKSB7fQogICAgZ2V0RGlzYWJsZUN1c3RvbVBsYXliYWNrRm9ySU9TMTBQbHVzKCkgewogICAgICByZXR1cm4gdGhpcy5pOwogICAgfQogICAgZ2V0RmVhdHVyZUZsYWdzKCkgewogICAgICByZXR1cm4gdGhpcy5mOwogICAgfQogICAgZ2V0TG9jYWxlKCkgewogICAgICByZXR1cm4gdGhpcy5sOwogICAgfQogICAgZ2V0TnVtUmVkaXJlY3RzKCkgewogICAgICByZXR1cm4gdGhpcy5yOwogICAgfQogICAgZ2V0UGxheWVyVHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudDsKICAgIH0KICAgIGdldFBsYXllclZlcnNpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLnY7CiAgICB9CiAgICBnZXRQcGlkKCkgewogICAgICByZXR1cm4gdGhpcy5wOwogICAgfQogICAgaXNDb29raWVzRW5hYmxlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuYzsKICAgIH0KICAgIHNldEF1dG9QbGF5QWRCcmVha3MoKSB7fQogICAgc2V0Q29tcGFuaW9uQmFja2ZpbGwoKSB7fQogICAgc2V0Q29va2llc0VuYWJsZWQoYykgewogICAgICB0aGlzLmMgPSAhIWM7CiAgICB9CiAgICBzZXREaXNhYmxlQ3VzdG9tUGxheWJhY2tGb3JJT1MxMFBsdXMoaSkgewogICAgICB0aGlzLmkgPSAhIWk7CiAgICB9CiAgICBzZXRGZWF0dXJlRmxhZ3MoZikgewogICAgICB0aGlzLmYgPSBmOwogICAgfQogICAgc2V0TG9jYWxlKGwpIHsKICAgICAgdGhpcy5sID0gbDsKICAgIH0KICAgIHNldE51bVJlZGlyZWN0cyhyKSB7CiAgICAgIHRoaXMuciA9IHI7CiAgICB9CiAgICBzZXRQbGF5ZXJUeXBlKHQpIHsKICAgICAgdGhpcy50ID0gdDsKICAgIH0KICAgIHNldFBsYXllclZlcnNpb24odikgewogICAgICB0aGlzLnYgPSB2OwogICAgfQogICAgc2V0UHBpZChwKSB7CiAgICAgIHRoaXMucCA9IHA7CiAgICB9CiAgICBzZXRTZXNzaW9uSWQoLypzKi8pIHt9CiAgICBzZXRWcGFpZEFsbG93ZWQoLyphKi8pIHt9CiAgICBzZXRWcGFpZE1vZGUoLyptKi8pIHt9CgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3VCbG9ja09yaWdpbi91QmxvY2staXNzdWVzL2lzc3Vlcy8yMjY1I2lzc3VlY29tbWVudC0xNjM3MDk0MTQ5CiAgICBnZXREaXNhYmxlRmxhc2hBZHMoKSB7CiAgICB9CiAgICBzZXREaXNhYmxlRmxhc2hBZHMoKSB7CiAgICB9CiAgfQogIEltYVNka1NldHRpbmdzLkNvbXBhbmlvbkJhY2tmaWxsTW9kZSA9IHsKICAgIEFMV0FZUzogImFsd2F5cyIsCiAgICBPTl9NQVNURVJfQUQ6ICJvbl9tYXN0ZXJfYWQiLAogIH07CiAgSW1hU2RrU2V0dGluZ3MuVnBhaWRNb2RlID0gewogICAgRElTQUJMRUQ6IDAsCiAgICBFTkFCTEVEOiAxLAogICAgSU5TRUNVUkU6IDIsCiAgfTsKCiAgY2xhc3MgRXZlbnRIYW5kbGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBNYXAoKTsKICAgIH0KCiAgICBfZGlzcGF0Y2goZSkgewogICAgICBsZXQgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGUudHlwZSk7CiAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycyA/IEFycmF5LmZyb20obGlzdGVuZXJzLnZhbHVlcygpKSA6IFtdOwogICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykgewogICAgICAgIHRyeSB7CiAgICAgICAgICBsaXN0ZW5lcihlKTsKICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKHIpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZXMsIGMsIG9wdGlvbnMsIGNvbnRleHQpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGVzKSkgewogICAgICAgIHR5cGVzID0gW3R5cGVzXTsKICAgICAgfQoKICAgICAgZm9yIChjb25zdCB0IG9mIHR5cGVzKSB7CiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXModCkpIHsKICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNldCh0LCBuZXcgTWFwKCkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQodCkuc2V0KGMsIGMuYmluZChjb250ZXh0IHx8IHRoaXMpKTsKICAgICAgfQogICAgfQoKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZXMsIGMpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGVzKSkgewogICAgICAgIHR5cGVzID0gW3R5cGVzXTsKICAgICAgfQoKICAgICAgZm9yIChjb25zdCB0IG9mIHR5cGVzKSB7CiAgICAgICAgY29uc3QgdHlwZVNldCA9IHRoaXMubGlzdGVuZXJzLmdldCh0KTsKICAgICAgICBpZiAodHlwZVNldCkgewogICAgICAgICAgdHlwZVNldC5kZWxldGUoYyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBjbGFzcyBBZHNMb2FkZXIgZXh0ZW5kcyBFdmVudEhhbmRsZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgSW1hU2RrU2V0dGluZ3MoKTsKICAgIH0KICAgIGNvbnRlbnRDb21wbGV0ZSgpIHt9CiAgICBkZXN0cm95KCkge30KICAgIGdldFNldHRpbmdzKCkgewogICAgICByZXR1cm4gdGhpcy5zZXR0aW5nczsKICAgIH0KICAgIGdldFZlcnNpb24oKSB7CiAgICAgIHJldHVybiBWRVJTSU9OOwogICAgfQogICAgcmVxdWVzdEFkcyhfciwgX2MpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBjb25zdCB7IEFEU19NQU5BR0VSX0xPQURFRCB9ID0gQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGU7CiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudChBRFNfTUFOQUdFUl9MT0FERUQsIF9yLCBfYyk7CiAgICAgICAgdGhpcy5fZGlzcGF0Y2goZXZlbnQpOwogICAgICB9KTsKICAgICAgY29uc3QgZXJyb3IgPSBuZXcgaW1hLkFkRXJyb3IoCiAgICAgICAgImFkUGxheUVycm9yIiwKICAgICAgICAxMjA1LCAxMjA1LAogICAgICAgICJUaGUgYnJvd3NlciBwcmV2ZW50ZWQgcGxheWJhY2sgaW5pdGlhdGVkIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi4iLAogICAgICAgIF9yLCBfYwogICAgICApOwogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHsKICAgICAgICB0aGlzLl9kaXNwYXRjaChuZXcgaW1hLkFkRXJyb3JFdmVudChlcnJvcikpOwogICAgICB9KTsKICAgIH0KICB9CgogIGNsYXNzIEFkc01hbmFnZXIgZXh0ZW5kcyBFdmVudEhhbmRsZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMudm9sdW1lID0gMTsKICAgICAgdGhpcy5fZW5hYmxlUHJlbG9hZGluZyA9IGZhbHNlOwogICAgfQogICAgY29sbGFwc2UoKSB7fQogICAgY29uZmlndXJlQWRzTWFuYWdlcigpIHt9CiAgICBkZXN0cm95KCkge30KICAgIGRpc2NhcmRBZEJyZWFrKCkge30KICAgIGV4cGFuZCgpIHt9CiAgICBmb2N1cygpIHt9CiAgICBnZXRBZFNraXBwYWJsZVN0YXRlKCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBnZXRDdWVQb2ludHMoKSB7CiAgICAgIHJldHVybiBbMF07CiAgICB9CiAgICBnZXRDdXJyZW50QWQoKSB7CiAgICAgIHJldHVybiBjdXJyZW50QWQ7CiAgICB9CiAgICBnZXRDdXJyZW50QWRDdWVQb2ludHMoKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGdldFJlbWFpbmluZ1RpbWUoKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgZ2V0Vm9sdW1lKCkgewogICAgICByZXR1cm4gdGhpcy52b2x1bWU7CiAgICB9CiAgICBpbml0KC8qdywgaCwgbSwgZSovKSB7CiAgICAgIGlmICh0aGlzLl9lbmFibGVQcmVsb2FkaW5nKSB7CiAgICAgICAgdGhpcy5fZGlzcGF0Y2gobmV3IGltYS5BZEV2ZW50KEFkRXZlbnQuVHlwZS5MT0FERUQpKTsKICAgICAgfQogICAgfQogICAgaXNDdXN0b21DbGlja1RyYWNraW5nVXNlZCgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaXNDdXN0b21QbGF5YmFja1VzZWQoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHBhdXNlKCkge30KICAgIHJlcXVlc3ROZXh0QWRCcmVhaygpIHt9CiAgICByZXNpemUoLyp3LCBoLCBtKi8pIHt9CiAgICByZXN1bWUoKSB7fQogICAgc2V0Vm9sdW1lKHYpIHsKICAgICAgdGhpcy52b2x1bWUgPSB2OwogICAgfQogICAgc2tpcCgpIHt9CiAgICBzdGFydCgpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgWwogICAgICAgICAgQWRFdmVudC5UeXBlLkxPQURFRCwKICAgICAgICAgIEFkRXZlbnQuVHlwZS5TVEFSVEVELAogICAgICAgICAgQWRFdmVudC5UeXBlLkNPTlRFTlRfUEFVU0VfUkVRVUVTVEVELAogICAgICAgICAgQWRFdmVudC5UeXBlLkFEX0JVRkZFUklORywKICAgICAgICAgIEFkRXZlbnQuVHlwZS5GSVJTVF9RVUFSVElMRSwKICAgICAgICAgIEFkRXZlbnQuVHlwZS5NSURQT0lOVCwKICAgICAgICAgIEFkRXZlbnQuVHlwZS5USElSRF9RVUFSVElMRSwKICAgICAgICAgIEFkRXZlbnQuVHlwZS5DT01QTEVURSwKICAgICAgICAgIEFkRXZlbnQuVHlwZS5BTExfQURTX0NPTVBMRVRFRCwKICAgICAgICAgIEFkRXZlbnQuVHlwZS5DT05URU5UX1JFU1VNRV9SRVFVRVNURUQsCiAgICAgICAgXSkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2gobmV3IGltYS5BZEV2ZW50KHR5cGUpKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgc3RvcCgpIHt9CiAgICB1cGRhdGVBZHNSZW5kZXJpbmdTZXR0aW5ncygvKnMqLykge30KICB9CgogIGNsYXNzIEFkc1JlbmRlcmluZ1NldHRpbmdzIHt9CgogIGNsYXNzIEFkc1JlcXVlc3QgewogICAgc2V0QWRXaWxsQXV0b1BsYXkoKSB7fQogICAgc2V0QWRXaWxsUGxheU11dGVkKCkge30KICAgIHNldENvbnRpbnVvdXNQbGF5YmFjaygpIHt9CiAgfQoKICBjbGFzcyBBZFBvZEluZm8gewogICAgZ2V0QWRQb3NpdGlvbigpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBnZXRJc0J1bXBlcigpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZ2V0TWF4RHVyYXRpb24oKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGdldFBvZEluZGV4KCkgewogICAgICByZXR1cm4gMTsKICAgIH0KICAgIGdldFRpbWVPZmZzZXQoKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgZ2V0VG90YWxBZHMoKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogIH0KCiAgY2xhc3MgQWQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHRoaXMuX3BpID0gbmV3IEFkUG9kSW5mbygpOwogICAgfQogICAgZ2V0QWRJZCgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgZ2V0QWRQb2RJbmZvKCkgewogICAgICByZXR1cm4gdGhpcy5fcGk7CiAgICB9CiAgICBnZXRBZFN5c3RlbSgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgZ2V0QWR2ZXJ0aXNlck5hbWUoKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGdldEFwaUZyYW1ld29yaygpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBnZXRDb21wYW5pb25BZHMoKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGdldENvbnRlbnRUeXBlKCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBnZXRDcmVhdGl2ZUFkSWQoKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGdldENyZWF0aXZlSWQoKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGdldERlYWxJZCgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgZ2V0RGVzY3JpcHRpb24oKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGdldER1cmF0aW9uKCkgewogICAgICByZXR1cm4gOC41OwogICAgfQogICAgZ2V0SGVpZ2h0KCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGdldE1lZGlhVXJsKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGdldE1pblN1Z2dlc3RlZER1cmF0aW9uKCkgewogICAgICByZXR1cm4gLTI7CiAgICB9CiAgICBnZXRTa2lwVGltZU9mZnNldCgpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZ2V0U3VydmV5VXJsKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGdldFRpdGxlKCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBnZXRUcmFmZmlja2luZ1BhcmFtZXRlcnMoKSB7CiAgICAgIHJldHVybiB7fTsKICAgIH0KICAgIGdldFRyYWZmaWNraW5nUGFyYW1ldGVyc1N0cmluZygpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgZ2V0VWlFbGVtZW50cygpIHsKICAgICAgcmV0dXJuIFsiIl07CiAgICB9CiAgICBnZXRVbml2ZXJzYWxBZElkUmVnaXN0cnkoKSB7CiAgICAgIHJldHVybiAidW5rbm93biI7CiAgICB9CiAgICBnZXRVbml2ZXJzYWxBZElkcygpIHsKICAgICAgcmV0dXJuIFtuZXcgVW5pdmVyc2FsQWRJZEluZm8oKV07CiAgICB9CiAgICBnZXRVbml2ZXJzYWxBZElkVmFsdWUoKSB7CiAgICAgIHJldHVybiAidW5rbm93biI7CiAgICB9CiAgICBnZXRWYXN0TWVkaWFCaXRyYXRlKCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGdldFZhc3RNZWRpYUhlaWdodCgpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBnZXRWYXN0TWVkaWFXaWR0aCgpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBnZXRXaWR0aCgpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBnZXRXcmFwcGVyQWRJZHMoKSB7CiAgICAgIHJldHVybiBbIiJdOwogICAgfQogICAgZ2V0V3JhcHBlckFkU3lzdGVtcygpIHsKICAgICAgcmV0dXJuIFsiIl07CiAgICB9CiAgICBnZXRXcmFwcGVyQ3JlYXRpdmVJZHMoKSB7CiAgICAgIHJldHVybiBbIiJdOwogICAgfQogICAgaXNMaW5lYXIoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaXNTa2lwcGFibGUoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgY2xhc3MgQ29tcGFuaW9uQWQgewogICAgZ2V0QWRTbG90SWQoKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGdldENvbnRlbnQoKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGdldENvbnRlbnRUeXBlKCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBnZXRIZWlnaHQoKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgZ2V0V2lkdGgoKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogIH0KCiAgY2xhc3MgQWRFcnJvciB7CiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBjb2RlLCB2YXN0LCBtZXNzYWdlLCByZXF1ZXN0LCBjb250ZXh0KSB7CiAgICAgIHRoaXMuZXJyb3JDb2RlID0gY29kZTsKICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgdGhpcy5hZHNSZXF1ZXN0ID0gcmVxdWVzdDsKICAgICAgdGhpcy51c2VyUmVxdWVzdENvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLnZhc3RFcnJvckNvZGUgPSB2YXN0OwogICAgfQogICAgZ2V0RXJyb3JDb2RlKCkgewogICAgICByZXR1cm4gdGhpcy5lcnJvckNvZGU7CiAgICB9CiAgICBnZXRJbm5lckVycm9yKCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZ2V0TWVzc2FnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTsKICAgIH0KICAgIGdldFR5cGUoKSB7CiAgICAgIHJldHVybiB0aGlzLnR5cGU7CiAgICB9CiAgICBnZXRWYXN0RXJyb3JDb2RlKCkgewogICAgICByZXR1cm4gdGhpcy52YXN0RXJyb3JDb2RlOwogICAgfQogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiBgQWRFcnJvciAke3RoaXMuZXJyb3JDb2RlfTogJHt0aGlzLm1lc3NhZ2V9YDsKICAgIH0KICB9CiAgQWRFcnJvci5FcnJvckNvZGUgPSB7fTsKICBBZEVycm9yLlR5cGUgPSB7fTsKCiAgY29uc3QgaXNFbmdhZGdldCA9ICgpID0+IHsKICAgIHRyeSB7CiAgICAgIGZvciAoY29uc3QgY3R4IG9mIE9iamVjdC52YWx1ZXMod2luZG93LnZpZGlibGUuX2dldENvbnRleHRzKCkpKSB7CiAgICAgICAgY29uc3QgcGxheWVyID0gY3R4LmdldFBsYXllcigpOwogICAgICAgIGlmICghcGxheWVyKSB7IGNvbnRpbnVlO30KICAgICAgICBjb25zdCBkaXYgPSBwbGF5ZXIuZGl2OwogICAgICAgIGlmICghZGl2KSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKGRpdi5pbm5lckhUTUwuaW5jbHVkZXMoInd3dy5lbmdhZGdldC5jb20iKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChfKSB7fQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIGNvbnN0IGN1cnJlbnRBZCA9IGlzRW5nYWRnZXQoKSA/IHVuZGVmaW5lZCA6IG5ldyBBZCgpOwoKICBjbGFzcyBBZEV2ZW50IHsKICAgIGNvbnN0cnVjdG9yKHR5cGUpIHsKICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgIH0KICAgIGdldEFkKCkgewogICAgICByZXR1cm4gY3VycmVudEFkOwogICAgfQogICAgZ2V0QWREYXRhKCkgewogICAgICByZXR1cm4ge307CiAgICB9CiAgfQogIEFkRXZlbnQuVHlwZSA9IHsKICAgIEFEX0JSRUFLX1JFQURZOiAiYWRCcmVha1JlYWR5IiwKICAgIEFEX0JVRkZFUklORzogImFkQnVmZmVyaW5nIiwKICAgIEFEX0NBTl9QTEFZOiAiYWRDYW5QbGF5IiwKICAgIEFEX01FVEFEQVRBOiAiYWRNZXRhZGF0YSIsCiAgICBBRF9QUk9HUkVTUzogImFkUHJvZ3Jlc3MiLAogICAgQUxMX0FEU19DT01QTEVURUQ6ICJhbGxBZHNDb21wbGV0ZWQiLAogICAgQ0xJQ0s6ICJjbGljayIsCiAgICBDT01QTEVURTogImNvbXBsZXRlIiwKICAgIENPTlRFTlRfUEFVU0VfUkVRVUVTVEVEOiAiY29udGVudFBhdXNlUmVxdWVzdGVkIiwKICAgIENPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRDogImNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQiLAogICAgRFVSQVRJT05fQ0hBTkdFOiAiZHVyYXRpb25DaGFuZ2UiLAogICAgRVhQQU5ERURfQ0hBTkdFRDogImV4cGFuZGVkQ2hhbmdlZCIsCiAgICBGSVJTVF9RVUFSVElMRTogImZpcnN0UXVhcnRpbGUiLAogICAgSU1QUkVTU0lPTjogImltcHJlc3Npb24iLAogICAgSU5URVJBQ1RJT046ICJpbnRlcmFjdGlvbiIsCiAgICBMSU5FQVJfQ0hBTkdFOiAibGluZWFyQ2hhbmdlIiwKICAgIExJTkVBUl9DSEFOR0VEOiAibGluZWFyQ2hhbmdlZCIsCiAgICBMT0FERUQ6ICJsb2FkZWQiLAogICAgTE9HOiAibG9nIiwKICAgIE1JRFBPSU5UOiAibWlkcG9pbnQiLAogICAgUEFVU0VEOiAicGF1c2UiLAogICAgUkVTVU1FRDogInJlc3VtZSIsCiAgICBTS0lQUEFCTEVfU1RBVEVfQ0hBTkdFRDogInNraXBwYWJsZVN0YXRlQ2hhbmdlZCIsCiAgICBTS0lQUEVEOiAic2tpcCIsCiAgICBTVEFSVEVEOiAic3RhcnQiLAogICAgVEhJUkRfUVVBUlRJTEU6ICJ0aGlyZFF1YXJ0aWxlIiwKICAgIFVTRVJfQ0xPU0U6ICJ1c2VyQ2xvc2UiLAogICAgVklERU9fQ0xJQ0tFRDogInZpZGVvQ2xpY2tlZCIsCiAgICBWSURFT19JQ09OX0NMSUNLRUQ6ICJ2aWRlb0ljb25DbGlja2VkIiwKICAgIFZJRVdBQkxFX0lNUFJFU1NJT046ICJ2aWV3YWJsZV9pbXByZXNzaW9uIiwKICAgIFZPTFVNRV9DSEFOR0VEOiAidm9sdW1lQ2hhbmdlIiwKICAgIFZPTFVNRV9NVVRFRDogIm11dGUiLAogIH07CgogIGNsYXNzIEFkRXJyb3JFdmVudCB7CiAgICBjb25zdHJ1Y3RvcihlcnJvcikgewogICAgICB0aGlzLnR5cGUgPSAiYWRFcnJvciI7CiAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKICAgIH0KICAgIGdldEVycm9yKCkgewogICAgICByZXR1cm4gdGhpcy5lcnJvcjsKICAgIH0KICAgIGdldFVzZXJSZXF1ZXN0Q29udGV4dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXJyb3I/LnVzZXJSZXF1ZXN0Q29udGV4dCB8fCB7fTsKICAgIH0KICB9CiAgQWRFcnJvckV2ZW50LlR5cGUgPSB7CiAgICBBRF9FUlJPUjogImFkRXJyb3IiLAogIH07CgogIGNvbnN0IG1hbmFnZXIgPSBuZXcgQWRzTWFuYWdlcigpOwoKICBjbGFzcyBBZHNNYW5hZ2VyTG9hZGVkRXZlbnQgewogICAgY29uc3RydWN0b3IodHlwZSwgcmVxdWVzdCwgY29udGV4dCkgewogICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICB0aGlzLmFkc1JlcXVlc3QgPSByZXF1ZXN0OwogICAgICB0aGlzLnVzZXJSZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQ7CiAgICB9CiAgICBnZXRBZHNNYW5hZ2VyKGMsIHNldHRpbmdzKSB7CiAgICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5ncy5lbmFibGVQcmVsb2FkaW5nKSB7CiAgICAgICAgbWFuYWdlci5fZW5hYmxlUHJlbG9hZGluZyA9IHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIG1hbmFnZXI7CiAgICB9CiAgICBnZXRVc2VyUmVxdWVzdENvbnRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLnVzZXJSZXF1ZXN0Q29udGV4dCB8fCB7fTsKICAgIH0KICB9CiAgQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUgPSB7CiAgICBBRFNfTUFOQUdFUl9MT0FERUQ6ICJhZHNNYW5hZ2VyTG9hZGVkIiwKICB9OwoKICBjbGFzcyBDdXN0b21Db250ZW50TG9hZGVkRXZlbnQge30KICBDdXN0b21Db250ZW50TG9hZGVkRXZlbnQuVHlwZSA9IHsKICAgIENVU1RPTV9DT05URU5UX0xPQURFRDogImRlcHJlY2F0ZWQtZXZlbnQiLAogIH07CgogIGNsYXNzIENvbXBhbmlvbkFkU2VsZWN0aW9uU2V0dGluZ3Mge30KICBDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLkNyZWF0aXZlVHlwZSA9IHsKICAgIEFMTDogIkFsbCIsCiAgICBGTEFTSDogIkZsYXNoIiwKICAgIElNQUdFOiAiSW1hZ2UiLAogIH07CiAgQ29tcGFuaW9uQWRTZWxlY3Rpb25TZXR0aW5ncy5SZXNvdXJjZVR5cGUgPSB7CiAgICBBTEw6ICJBbGwiLAogICAgSFRNTDogIkh0bWwiLAogICAgSUZSQU1FOiAiSUZyYW1lIiwKICAgIFNUQVRJQzogIlN0YXRpYyIsCiAgfTsKICBDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLlNpemVDcml0ZXJpYSA9IHsKICAgIElHTk9SRTogIklnbm9yZVNpemUiLAogICAgU0VMRUNUX0VYQUNUX01BVENIOiAiU2VsZWN0RXhhY3RNYXRjaCIsCiAgICBTRUxFQ1RfTkVBUl9NQVRDSDogIlNlbGVjdE5lYXJNYXRjaCIsCiAgfTsKCiAgY2xhc3MgQWRDdWVQb2ludHMgewogICAgZ2V0Q3VlUG9pbnRzKCkgewogICAgICByZXR1cm4gW107CiAgICB9CiAgfQoKICBjbGFzcyBBZFByb2dyZXNzRGF0YSB7fQoKICBjbGFzcyBVbml2ZXJzYWxBZElkSW5mbyB7CiAgICBnZXRBZElkUmVnaXN0cnkoKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGdldEFkSWRWYWx1ZSgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIH0KCiAgT2JqZWN0LmFzc2lnbihpbWEsIHsKICAgIEFkQ3VlUG9pbnRzLAogICAgQWREaXNwbGF5Q29udGFpbmVyLAogICAgQWRFcnJvciwKICAgIEFkRXJyb3JFdmVudCwKICAgIEFkRXZlbnQsCiAgICBBZFBvZEluZm8sCiAgICBBZFByb2dyZXNzRGF0YSwKICAgIEFkc0xvYWRlciwKICAgIEFkc01hbmFnZXI6IG1hbmFnZXIsCiAgICBBZHNNYW5hZ2VyTG9hZGVkRXZlbnQsCiAgICBBZHNSZW5kZXJpbmdTZXR0aW5ncywKICAgIEFkc1JlcXVlc3QsCiAgICBDb21wYW5pb25BZCwKICAgIENvbXBhbmlvbkFkU2VsZWN0aW9uU2V0dGluZ3MsCiAgICBDdXN0b21Db250ZW50TG9hZGVkRXZlbnQsCiAgICBncHRQcm94eUluc3RhbmNlOiB7fSwKICAgIEltYVNka1NldHRpbmdzLAogICAgT21pZEFjY2Vzc01vZGU6IHsKICAgICAgRE9NQUlOOiAiZG9tYWluIiwKICAgICAgRlVMTDogImZ1bGwiLAogICAgICBMSU1JVEVEOiAibGltaXRlZCIsCiAgICB9LAogICAgT21pZFZlcmlmaWNhdGlvblZlbmRvcjogewogICAgICAxOiAiT1RIRVIiLAogICAgICAyOiAiR09PR0xFIiwKICAgICAgR09PR0xFOiAyLAogICAgICBPVEhFUjogMQogICAgfSwKICAgIHNldHRpbmdzOiBuZXcgSW1hU2RrU2V0dGluZ3MoKSwKICAgIFVpRWxlbWVudHM6IHsKICAgICAgQURfQVRUUklCVVRJT046ICJhZEF0dHJpYnV0aW9uIiwKICAgICAgQ09VTlRET1dOOiAiY291bnRkb3duIiwKICAgIH0sCiAgICBVbml2ZXJzYWxBZElkSW5mbywKICAgIFZFUlNJT04sCiAgICBWaWV3TW9kZTogewogICAgICBGVUxMU0NSRUVOOiAiZnVsbHNjcmVlbiIsCiAgICAgIE5PUk1BTDogIm5vcm1hbCIsCiAgICB9LAogIH0pOwoKICBpZiAoIXdpbmRvdy5nb29nbGUpIHsKICAgIHdpbmRvdy5nb29nbGUgPSB7fTsKICB9CgogIHdpbmRvdy5nb29nbGUuaW1hID0gaW1hOwp9CgovKgphZC5kb3VibGVjbGljay5uZXQgYmlkLmcuZG91YmxlY2xpY2submV0IGdncGh0LmNvbSBnb29nbGUuY28udWsgZ29vZ2xlLmNvbQpnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQgZ29vZ2xlYWRzNC5nLmRvdWJsZWNsaWNrLm5ldCBnb29nbGVhZHNlcnZpY2VzLmNvbQpnb29nbGVzeW5kaWNhdGlvbi5jb20gZ29vZ2xldXNlcmNvbnRlbnQuY29tIGdzdGF0aWMuY29tIGd2dDEuY29tIHByb2QuZ29vZ2xlLmNvbQpwdWJhZHMuZy5kb3VibGVjbGljay5uZXQgczAuMm1kbi5uZXQgc3RhdGljLmRvdWJsZWNsaWNrLm5ldApzdXJ2ZXlzLmcuZG91YmxlY2xpY2submV0IHlvdXR1YmUuY29tIHl0aW1nLmNvbQoqLwo="},{"name":"googlesyndication_adsbygoogle.js","aliases":["googlesyndication.com/adsbygoogle.js","googlesyndication-adsbygoogle"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBpbml0ID0gKCApID0+IHsKICAgICAgICB3aW5kb3cuYWRzYnlnb29nbGUgPSB7CiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSwKICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGNvbnN0IHBocyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZHNieWdvb2dsZScpOwogICAgICAgIGNvbnN0IGNzcyA9ICdoZWlnaHQ6MXB4IWltcG9ydGFudDttYXgtaGVpZ2h0OjFweCFpbXBvcnRhbnQ7bWF4LXdpZHRoOjFweCFpbXBvcnRhbnQ7d2lkdGg6MXB4IWltcG9ydGFudDsnOwogICAgICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHBocy5sZW5ndGg7IGkrKyApIHsKICAgICAgICAgICAgY29uc3QgaWQgPSBgYXN3aWZ0XyR7aX1gOwogICAgICAgICAgICBpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGlmcmFtZSMke2lkfWApICE9PSBudWxsICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBjb25zdCBmciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwogICAgICAgICAgICBmci5pZCA9IGlkOwogICAgICAgICAgICBmci5zdHlsZSA9IGNzczsKICAgICAgICAgICAgY29uc3QgY2ZyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgICAgICAgICAgIGNmci5pZCA9IGBnb29nbGVfYWRzX2ZyYW1lJHtpfWA7CiAgICAgICAgICAgIGZyLmFwcGVuZENoaWxkKGNmcik7CiAgICAgICAgICAgIGNvbnN0IHBoID0gcGhzW2ldOwogICAgICAgICAgICBwaC5hcHBlbmRDaGlsZChmcik7CiAgICAgICAgICAgIHBoLnNldEF0dHJpYnV0ZSgnZGF0YS1hZHNieWdvb2dsZS1zdGF0dXMnLCAnZG9uZScpOwogICAgICAgIH0KICAgIH07CiAgICBpZiAoCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkc2J5Z29vZ2xlJykubGVuZ3RoID09PSAwICYmCiAgICAgICAgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnCiAgICApIHsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXQsIHsgb25jZTogdHJ1ZSB9KTsKICAgIH0gZWxzZSB7CiAgICAgICAgaW5pdCgpOwogICAgfQp9KSgpOwoKLyoKcGFnZWFkMi5nb29nbGVzeW5kaWNhdGlvbi5jb20vcGFnZWFkL2pzL2Fkc2J5Z29vZ2xlLmpzLGFkc2J5Z29vZ2xlLXBsYWNlaG9sZGVyLGFkc2J5Z29vZ2xlU3RhdHVzLGdvb2dsZV9hZF9jaGFubmVsLGdvb2dsZV9hZF9jbGllbnQsZ29vZ2xlX2FkX2Zvcm1hdCxnb29nbGVfYWRfZnJlcXVlbmN5X2hpbnQsZ29vZ2xlX2FkX2hlaWdodCxnb29nbGVfYWRfaG9zdCxnb29nbGVfYWRfaG9zdF9jaGFubmVsLGdvb2dsZV9hZF9tb2RpZmljYXRpb25zLGdvb2dsZV9hZF9yZWdpb24sZ29vZ2xlX2FkX3Jlc2l6YWJsZSxnb29nbGVfYWRfcmVzaXplLGdvb2dsZV9hZF9zZWN0aW9uLGdvb2dsZV9hZF9zZW1hbnRpY19hcmVhLGdvb2dsZV9hZF93aWR0aCxnb29nbGVfYWRicmVha190ZXN0LGdvb2dsZV9hZHNfZnJhbWUsZ29vZ2xlX2Fkc19pZnJhbWUsZ29vZ2xlX2FkdGVzdCxnb29nbGVfYWRtb2JfaW50ZXJzdGl0aWFsX3Nsb3QsZ29vZ2xlX2FkbW9iX3Jld2FyZGVkX3Nsb3QsZ29vZ2xlX2FkbW9iX2Fkc19vbmx5LGdvb2dsZS1hZHNlbnNlLXBsYXRmb3JtLWFjY291bnQsZ29vZ2xlX2Fkc2Vuc2Vfc2V0dGluZ3MsZ29vZ2xlX2FtYV9jb25maWcsZ29vZ2xlLWFtYS1vcmRlci1hc3N1cmFuY2UsZ29vZ2xlX2FtYV9zZXR0aW5ncyxnb29nbGVfYW1hX3N0YXRlLGdvb2dsZV9hcGx0bGFkLGdvb2dsZV9hdWRpb19zZW5zZSxnb29nbGUtYXV0by1wbGFjZWQtcmVhZC1hbG91ZC1wbGF5ZXItcmVzZXJ2ZWQsZ29vZ2xlX2RlYnVnX3BhcmFtcyxnb29nbGVfZnVsbF93aWR0aF9yZXNwb25zaXZlLGdvb2dsZV9mdWxsX3dpZHRoX3Jlc3BvbnNpdmVfYWxsb3dlZCxnb29nbGVfaW1hZ2VfcmVxdWVzdHMsZ29vZ2xlX2pzX2Vycm9ycyxnb29nbGVfanNfcmVwb3J0aW5nX3F1ZXVlLGdvb2dsZV9sb2FkZXJfZmVhdHVyZXNfdXNlZCxnb29nbGVfbGxwLGdvb2dsZV9sb2dnaW5nX3F1ZXVlLGdvb2dsZV9tYXhfYWRfY29udGVudF9yYXRpbmcsZ29vZ2xlX21lYXN1cmVfanNfdGltaW5nLGdvb2dsZV9tbF9yYW5rLGdvb2dsZV9vdmVybGF5cyxnb29nbGVfb3ZlcnJpZGVfZm9ybWF0LGdvb2dsZV9wYWNrYWdlLGdvb2dsZV9wYWdlX3VybCxnb29nbGVfcGVyc2lzdGVudF9zdGF0ZV9hc3luYyxnb29nbGVfcGdiX3JlYWN0aXZlLGdvb2dsZV9wbGFjZW1lbnRfaWQsZ29vZ2xlX3ByZXZfYWRfZm9ybWF0c19ieV9yZWdpb24sZ29vZ2xlX3ByZXZfYWRfc2xvdG5hbWVzX2J5X3JlZ2lvbixnb29nbGVfcmVhY3RpdmVfYWRfZm9ybWF0LGdvb2dsZV9yZWFjdGl2ZV9hZHNfZ2xvYmFsX3N0YXRlLGdvb2dsZV9yZXNpemluZ19oZWlnaHQsZ29vZ2xlX3Jlc2l6aW5nX3dpZHRoLGdvb2dsZV9yZXNwb25zaXZlX2F1dG9fZm9ybWF0LGdvb2dsZV9yZXNwb25zaXZlX2R1bW15X2FkLGdvb2dsZV9yZXNwb25zaXZlX2Zvcm1hdHMsZ29vZ2xlX3Jlc3RyaWN0X2RhdGFfcHJvY2Vzc2luZyxnb29nbGVfcnVtX3Rhc2tfaWRfY291bnRlcixnb29nbGVfc2FmZV9mb3JfcmVzcG9uc2l2ZV9vdmVycmlkZSxnb29nbGVfc2hhZG93X21vZGUsZ29vZ2xlX3NydCxnb29nbGVfdGFnX2Zvcl91bmRlcl9hZ2Vfb2ZfY29uc2VudCxnb29nbGVfdGFnX29yaWdpbixnb29nbGVfdGFnX3BhcnRuZXIsZ29vZ2xlX3RyYWZmaWNfc291cmNlLGdvb2dsZV91bmlxdWVfaWQsZ29vZ2xldGFnCiovCg=="},{"name":"googletagservices_gpt.js","aliases":["googletagservices.com/gpt.js","googletagservices-gpt"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9kb3VibGVjbGljay1ncHQvcmVmZXJlbmNlCiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH0uYmluZCgpOwogICAgY29uc3Qgbm9vcHRoaXNmbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIGNvbnN0IG5vb3BudWxsZm4gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgICBjb25zdCBub29wYXJyYXlmbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBbXTsKICAgIH07CiAgICBjb25zdCBub29wc3RyZm4gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9OwogICAgLy8KICAgIGNvbnN0IGNvbXBhbmlvbkFkc1NlcnZpY2UgPSB7CiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcjogbm9vcHRoaXNmbiwKICAgICAgICBlbmFibGVTeW5jTG9hZGluZzogbm9vcGZuLAogICAgICAgIHNldFJlZnJlc2hVbmZpbGxlZFNsb3RzOiBub29wZm4KICAgIH07CiAgICBjb25zdCBjb250ZW50U2VydmljZSA9IHsKICAgICAgICBhZGRFdmVudExpc3RlbmVyOiBub29wdGhpc2ZuLAogICAgICAgIHNldENvbnRlbnQ6IG5vb3BmbgogICAgfTsKICAgIGNvbnN0IFBhc3NiYWNrU2xvdCA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgIGxldCBwID0gUGFzc2JhY2tTbG90LnByb3RvdHlwZTsKICAgIHAuZGlzcGxheSA9IG5vb3BmbjsKICAgIHAuZ2V0ID0gbm9vcG51bGxmbjsKICAgIHAuc2V0ID0gbm9vcHRoaXNmbjsKICAgIHAuc2V0Q2xpY2tVcmwgPSBub29wdGhpc2ZuOwogICAgcC5zZXRUYWdGb3JDaGlsZERpcmVjdGVkVHJlYXRtZW50ID0gbm9vcHRoaXNmbjsKICAgIHAuc2V0VGFyZ2V0aW5nID0gbm9vcHRoaXNmbjsKICAgIHAudXBkYXRlVGFyZ2V0aW5nRnJvbU1hcCA9IG5vb3B0aGlzZm47CiAgICBjb25zdCBwdWJBZHNTZXJ2aWNlID0gewogICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IG5vb3B0aGlzZm4sCiAgICAgICAgY2xlYXI6IG5vb3BmbiwKICAgICAgICBjbGVhckNhdGVnb3J5RXhjbHVzaW9uczogbm9vcHRoaXNmbiwKICAgICAgICBjbGVhclRhZ0ZvckNoaWxkRGlyZWN0ZWRUcmVhdG1lbnQ6IG5vb3B0aGlzZm4sCiAgICAgICAgY2xlYXJUYXJnZXRpbmc6IG5vb3B0aGlzZm4sCiAgICAgICAgY29sbGFwc2VFbXB0eURpdnM6IG5vb3BmbiwKICAgICAgICBkZWZpbmVPdXRPZlBhZ2VQYXNzYmFjazogZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgUGFzc2JhY2tTbG90KCk7IH0sCiAgICAgICAgZGVmaW5lUGFzc2JhY2s6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBhc3NiYWNrU2xvdCgpOyB9LAogICAgICAgIGRpc2FibGVJbml0aWFsTG9hZDogbm9vcGZuLAogICAgICAgIGRpc3BsYXk6IG5vb3BmbiwKICAgICAgICBlbmFibGVBc3luY1JlbmRlcmluZzogbm9vcGZuLAogICAgICAgIGVuYWJsZUxhenlMb2FkOiBub29wZm4sCiAgICAgICAgZW5hYmxlU2luZ2xlUmVxdWVzdDogbm9vcGZuLAogICAgICAgIGVuYWJsZVN5bmNSZW5kZXJpbmc6IG5vb3BmbiwKICAgICAgICBlbmFibGVWaWRlb0Fkczogbm9vcGZuLAogICAgICAgIGdldDogbm9vcG51bGxmbiwKICAgICAgICBnZXRBdHRyaWJ1dGVLZXlzOiBub29wYXJyYXlmbiwKICAgICAgICBnZXRUYXJnZXRpbmc6IG5vb3BhcnJheWZuLAogICAgICAgIGdldFRhcmdldGluZ0tleXM6IG5vb3BhcnJheWZuLAogICAgICAgIGdldFNsb3RzOiBub29wYXJyYXlmbiwKICAgICAgICByZWZyZXNoOiBub29wZm4sCiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogbm9vcGZuLAogICAgICAgIHNldDogbm9vcHRoaXNmbiwKICAgICAgICBzZXRDYXRlZ29yeUV4Y2x1c2lvbjogbm9vcHRoaXNmbiwKICAgICAgICBzZXRDZW50ZXJpbmc6IG5vb3BmbiwKICAgICAgICBzZXRDb29raWVPcHRpb25zOiBub29wdGhpc2ZuLAogICAgICAgIHNldEZvcmNlU2FmZUZyYW1lOiBub29wdGhpc2ZuLAogICAgICAgIHNldExvY2F0aW9uOiBub29wdGhpc2ZuLAogICAgICAgIHNldFB1Ymxpc2hlclByb3ZpZGVkSWQ6IG5vb3B0aGlzZm4sCiAgICAgICAgc2V0UHJpdmFjeVNldHRpbmdzOiBub29wdGhpc2ZuLAogICAgICAgIHNldFJlcXVlc3ROb25QZXJzb25hbGl6ZWRBZHM6IG5vb3B0aGlzZm4sCiAgICAgICAgc2V0U2FmZUZyYW1lQ29uZmlnOiBub29wdGhpc2ZuLAogICAgICAgIHNldFRhZ0ZvckNoaWxkRGlyZWN0ZWRUcmVhdG1lbnQ6IG5vb3B0aGlzZm4sCiAgICAgICAgc2V0VGFyZ2V0aW5nOiBub29wdGhpc2ZuLAogICAgICAgIHNldFZpZGVvQ29udGVudDogbm9vcHRoaXNmbiwKICAgICAgICB1cGRhdGVDb3JyZWxhdG9yOiBub29wZm4KICAgIH07CiAgICBjb25zdCBTaXplTWFwcGluZ0J1aWxkZXIgPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICBwID0gU2l6ZU1hcHBpbmdCdWlsZGVyLnByb3RvdHlwZTsKICAgIHAuYWRkU2l6ZSA9IG5vb3B0aGlzZm47CiAgICBwLmJ1aWxkID0gbm9vcG51bGxmbjsKICAgIGNvbnN0IFNsb3QgPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICBwID0gU2xvdC5wcm90b3R5cGU7CiAgICBwLmFkZFNlcnZpY2UgPSBub29wdGhpc2ZuOwogICAgcC5jbGVhckNhdGVnb3J5RXhjbHVzaW9ucyA9IG5vb3B0aGlzZm47CiAgICBwLmNsZWFyVGFyZ2V0aW5nID0gbm9vcHRoaXNmbjsKICAgIHAuZGVmaW5lU2l6ZU1hcHBpbmcgPSBub29wdGhpc2ZuOwogICAgcC5nZXQgPSBub29wbnVsbGZuOwogICAgcC5nZXRBZFVuaXRQYXRoID0gbm9vcGFycmF5Zm47CiAgICBwLmdldEF0dHJpYnV0ZUtleXMgPSBub29wYXJyYXlmbjsKICAgIHAuZ2V0Q2F0ZWdvcnlFeGNsdXNpb25zID0gbm9vcGFycmF5Zm47CiAgICBwLmdldERvbUlkID0gbm9vcHN0cmZuOwogICAgcC5nZXRSZXNwb25zZUluZm9ybWF0aW9uID0gbm9vcG51bGxmbjsKICAgIHAuZ2V0U2xvdEVsZW1lbnRJZCA9IG5vb3BzdHJmbjsKICAgIHAuZ2V0U2xvdElkID0gbm9vcHRoaXNmbjsKICAgIHAuZ2V0VGFyZ2V0aW5nID0gbm9vcGFycmF5Zm47CiAgICBwLmdldFRhcmdldGluZ0tleXMgPSBub29wYXJyYXlmbjsKICAgIHAuc2V0ID0gbm9vcHRoaXNmbjsKICAgIHAuc2V0Q2F0ZWdvcnlFeGNsdXNpb24gPSBub29wdGhpc2ZuOwogICAgcC5zZXRDbGlja1VybCA9IG5vb3B0aGlzZm47CiAgICBwLnNldENvbGxhcHNlRW1wdHlEaXYgPSBub29wdGhpc2ZuOwogICAgcC5zZXRUYXJnZXRpbmcgPSBub29wdGhpc2ZuOwogICAgcC51cGRhdGVUYXJnZXRpbmdGcm9tTWFwID0gbm9vcHRoaXNmbjsKICAgIC8vCiAgICBjb25zdCBncHQgPSB3aW5kb3cuZ29vZ2xldGFnIHx8IHt9OwogICAgY29uc3QgY21kID0gZ3B0LmNtZCB8fCBbXTsKICAgIGdwdC5hcGlSZWFkeSA9IHRydWU7CiAgICBncHQuY21kID0gW107CiAgICBncHQuY21kLnB1c2ggPSBmdW5jdGlvbihhKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYSgpOwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiAxOwogICAgfTsKICAgIGdwdC5jb21wYW5pb25BZHMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGNvbXBhbmlvbkFkc1NlcnZpY2U7IH07CiAgICBncHQuY29udGVudCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29udGVudFNlcnZpY2U7IH07CiAgICBncHQuZGVmaW5lT3V0T2ZQYWdlU2xvdCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFNsb3QoKTsgfTsKICAgIGdwdC5kZWZpbmVTbG90ID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU2xvdCgpOyB9OwogICAgZ3B0LmRlc3Ryb3lTbG90cyA9IG5vb3BmbjsKICAgIGdwdC5kaXNhYmxlUHVibGlzaGVyQ29uc29sZSA9IG5vb3BmbjsKICAgIGdwdC5kaXNwbGF5ID0gbm9vcGZuOwogICAgZ3B0LmVuYWJsZVNlcnZpY2VzID0gbm9vcGZuOwogICAgZ3B0LmdldFZlcnNpb24gPSBub29wc3RyZm47CiAgICBncHQucHViYWRzID0gZnVuY3Rpb24oKSB7IHJldHVybiBwdWJBZHNTZXJ2aWNlOyB9OwogICAgZ3B0LnB1YmFkc1JlYWR5ID0gdHJ1ZTsKICAgIGdwdC5zZXRBZElmcmFtZVRpdGxlID0gbm9vcGZuOwogICAgZ3B0LnNpemVNYXBwaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgU2l6ZU1hcHBpbmdCdWlsZGVyKCk7IH07CiAgICB3aW5kb3cuZ29vZ2xldGFnID0gZ3B0OwogICAgd2hpbGUgKCBjbWQubGVuZ3RoICE9PSAwICkgewogICAgICAgIGdwdC5jbWQucHVzaChjbWQuc2hpZnQoKSk7CiAgICB9Cn0pKCk7Cg=="},{"name":"hd-main.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBsID0ge307CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICBjb25zdCBwcm9wcyA9IFsKICAgICAgICAiJGoiLCJBZCIsIkJkIiwiQ2QiLCJEZCIsIkVkIiwiRmQiLCJHZCIsIkhkIiwiSWQiLCJKZCIsIk5qIiwiT2MiLCJQYyIsIlBlIiwKICAgICAgICAiUWMiLCJRZSIsIlJjIiwiUmUiLCJSaSIsIlNjIiwiVGMiLCJVYyIsIlZjIiwiV2MiLCJXZyIsIlhjIiwiWGciLCJZYyIsIllkIiwKICAgICAgICAiYWQiLCJhZSIsImJkIiwiYmYiLCJjZCIsImRkIiwiZWQiLCJlZiIsImVrIiwiZmQiLCJmZyIsImZoIiwiZmsiLCJnZCIsImhkIiwKICAgICAgICAiaWciLCJpaiIsImpkIiwia2QiLCJrZSIsImxkIiwibWQiLCJtaSIsIm5kIiwib2QiLCJvaCIsInBkIiwicGYiLCJxZCIsInJkIiwKICAgICAgICAic2QiLCJ0ZCIsInVkIiwidmQiLCJ3ZCIsIndnIiwieGQiLCJ4aCIsInlkIiwiemQiLAogICAgICAgICIkZCIsIiRlIiwiJGsiLCJBZSIsIkFmIiwiQWoiLCJCZSIsIkNlIiwiRGUiLCJFZSIsIkVrIiwiRW8iLCJFcCIsIkZlIiwiRm8iLAogICAgICAgICJHZSIsIkdoIiwiSGsiLCJJZSIsIklwIiwiSmUiLCJLZSIsIktrIiwiS3EiLCJMZSIsIkxoIiwiTGsiLCJNZSIsIk1tIiwiTmUiLAogICAgICAgICJPZSIsIlBlIiwiUWUiLCJSZSIsIlJwIiwiU2UiLCJUZSIsIlVlIiwiVmUiLCJWcCIsIldlIiwiWGQiLCJYZSIsIllkIiwiWWUiLAogICAgICAgICJaZCIsIlplIiwiWmYiLCJaayIsImFlIiwiYWYiLCJhbCIsImJlIiwiYmYiLCJiZyIsImNlIiwiY3AiLCJkZiIsImRpIiwiZWUiLAogICAgICAgICJlZiIsImZlIiwiZmYiLCJnZiIsImdtIiwiaGUiLCJoZiIsImllIiwiamUiLCJqZiIsImtlIiwia2YiLCJrbCIsImxlIiwibGYiLAogICAgICAgICJsayIsIm1mIiwibWciLCJtbiIsIm5mIiwib2UiLCJvZiIsInBlIiwicGYiLCJwZyIsInFlIiwicWYiLCJyZSIsInJmIiwic2UiLAogICAgICAgICJzZiIsInRlIiwidGYiLCJ0aSIsInVlIiwidWYiLCJ2ZSIsInZmIiwid2UiLCJ3ZiIsIndnIiwid2kiLCJ4ZSIsInllIiwieWYiLAogICAgICAgICJ5ayIsInlsIiwiemUiLCJ6ZiIsInprIgogICAgXTsKICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrICkgewogICAgICAgIGxbcHJvcHNbaV1dID0gbm9vcGZuOwogICAgfQogICAgd2luZG93LkwgPSB3aW5kb3cuSiA9IGw7Cn0pKCk7Cg=="},{"name":"nitropay_ads.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICBpZiAoIHdpbmRvdy5uaXRyb0FkcyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgICAgICA7CiAgICB9LmJpbmQoKTsKICAgIGNvbnN0IG5pdHJvQWRzID0gewogICAgICAgIGNyZWF0ZUFkOiBub29wZm4sCiAgICAgICAgcXVldWU6IFtdLAogICAgfTsKICAgIHdpbmRvdy5uaXRyb0FkcyA9IG5pdHJvQWRzOwp9KSgpOwo="},{"name":"nobab.js","aliases":["bab-defuser.js","prevent-bab.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBzaWduYXR1cmVzID0gWwogICAgICAgIFsgJ2Jsb2NrYWRibG9jaycgXSwKICAgICAgICBbICdiYWJhc2JtJyBdLAogICAgICAgIFsgL2dldEl0ZW1cKCdiYWJuJ1wpLyBdLAogICAgICAgIFsKICAgICAgICAgICAgJ2dldEVsZW1lbnRCeUlkJywKICAgICAgICAgICAgJ1N0cmluZy5mcm9tQ2hhckNvZGUnLAogICAgICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknLAogICAgICAgICAgICAnY2hhckF0JywKICAgICAgICAgICAgJ0RPTUNvbnRlbnRMb2FkZWQnLAogICAgICAgICAgICAnQWRCbG9jaycsCiAgICAgICAgICAgICdhZGRFdmVudExpc3RlbmVyJywKICAgICAgICAgICAgJ2RvU2Nyb2xsJywKICAgICAgICAgICAgJ2Zyb21DaGFyQ29kZScsCiAgICAgICAgICAgICc8PDJ8cj4+NCcsCiAgICAgICAgICAgICdzZXNzaW9uU3RvcmFnZScsCiAgICAgICAgICAgICdjbGllbnRXaWR0aCcsCiAgICAgICAgICAgICdsb2NhbFN0b3JhZ2UnLAogICAgICAgICAgICAnTWF0aCcsCiAgICAgICAgICAgICdyYW5kb20nCiAgICAgICAgXSwKICAgIF07CiAgICBjb25zdCBjaGVjayA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCBzaWduYXR1cmVzLmxlbmd0aDsgaSsrICkgewogICAgICAgICAgICBjb25zdCB0b2tlbnMgPSBzaWduYXR1cmVzW2ldOwogICAgICAgICAgICBsZXQgbWF0Y2ggPSAwOwogICAgICAgICAgICBmb3IgKCBsZXQgaiA9IDA7IGogPCB0b2tlbnMubGVuZ3RoOyBqKysgKSB7CiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tqXTsKICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9IHRva2VuIGluc3RhbmNlb2YgUmVnRXhwCiAgICAgICAgICAgICAgICAgICAgPyBzLnNlYXJjaCh0b2tlbikKICAgICAgICAgICAgICAgICAgICA6IHMuaW5kZXhPZih0b2tlbik7CiAgICAgICAgICAgICAgICBpZiAoIHBvcyAhPT0gLTEgKSB7IG1hdGNoICs9IDE7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIChtYXRjaCAvIHRva2Vucy5sZW5ndGgpID49IDAuOCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIHdpbmRvdy5ldmFsID0gbmV3IFByb3h5KHdpbmRvdy5ldmFsLCB7ICAgICAgICAgICAgICAvLyBqc2hpbnQgaWdub3JlOiBsaW5lCiAgICAgICAgYXBwbHk6IGZ1bmN0aW9uKHRhcmdldCwgdGhpc0FyZywgYXJncykgewogICAgICAgICAgICBjb25zdCBhID0gYXJnc1swXTsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgYSAhPT0gJ3N0cmluZycgfHwgIWNoZWNrKGEpICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGRvY3VtZW50LmJvZHkgKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd2aXNpYmlsaXR5Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhYmFzYm1zZ3gnKTsKICAgICAgICAgICAgaWYgKCBlbCApIHsKICAgICAgICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSk7CiAgICB3aW5kb3cuc2V0VGltZW91dCA9IG5ldyBQcm94eSh3aW5kb3cuc2V0VGltZW91dCwgewogICAgICAgIGFwcGx5OiBmdW5jdGlvbih0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgYSA9IGFyZ3NbMF07CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHR5cGVvZiBhICE9PSAnc3RyaW5nJyB8fAogICAgICAgICAgICAgICAgL1wuYmFiX2VsZW1lbnRpZC4kLy50ZXN0KGEpID09PSBmYWxzZQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKfSkoKTsK"},{"name":"nobab2.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAyMS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0OwogICAgaWYgKCBzY3JpcHQgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc3JjID0gc2NyaXB0LnNyYzsKICAgIGlmICggdHlwZW9mIHNyYyAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgLy8gVGhlIHNjcmlwbGV0IGlzIG1lYW50IHRvIGFjdCBPTkxZIHdoZW4gaXQncyBiZWluZyB1c2VkIGFzIGEgcmVkaXJlY3Rpb24KICAgIC8vIGZvciBzcGVjaWZpYyBkb21haW5zLgogICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKAogICAgICAgICdeaHR0cHM/Oi8vW1xcdy1dK1xcLignICsKICAgICAgICBbCiAgICAgICAgICAgICdhZGNsaXh4XFwubmV0JywKICAgICAgICAgICAgJ2FkbmV0YXNpYVxcLmNvbScsCiAgICAgICAgICAgICdhZHRyYWNrZXJzXFwubmV0JywKICAgICAgICAgICAgJ2Jhbm5lcnRyYWNrXFwubmV0JywKICAgICAgICBdLmpvaW4oJ3wnKSArCiAgICAgICAgJykvLicKICAgICk7CiAgICBpZiAoIHJlLnRlc3Qoc3JjKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgd2luZG93Lm5IN2VYek9zRyA9IDg1ODsKfSkoKTsK"},{"name":"noeval.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBsb2cgPSBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpOwogICAgd2luZG93LmV2YWwgPSBuZXcgUHJveHkod2luZG93LmV2YWwsIHsgICAgICAgICAgLy8ganNoaW50IGlnbm9yZTogbGluZQogICAgICAgIGFwcGx5OiBmdW5jdGlvbih0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgbG9nKGBEb2N1bWVudCB0cmllZCB0byBldmFsLi4uICR7YXJnc1swXX1cbmApOwogICAgICAgIH0KICAgIH0pOwp9KSgpOwo="},{"name":"noeval-silent.js","aliases":["silent-noeval.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICB3aW5kb3cuZXZhbCA9IG5ldyBQcm94eSh3aW5kb3cuZXZhbCwgeyAgICAgICAgICAvLyBqc2hpbnQgaWdub3JlOiBsaW5lCiAgICAgICAgYXBwbHk6IGZ1bmN0aW9uKCkgewogICAgICAgIH0KICAgIH0pOwp9KSgpOwo="},{"name":"nofab.js","aliases":["fuckadblock.js-3.2.0"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICBjb25zdCBGYWIgPSBmdW5jdGlvbigpIHt9OwogICAgRmFiLnByb3RvdHlwZS5jaGVjayA9IG5vb3BmbjsKICAgIEZhYi5wcm90b3R5cGUuY2xlYXJFdmVudCA9IG5vb3BmbjsKICAgIEZhYi5wcm90b3R5cGUuZW1pdEV2ZW50ID0gbm9vcGZuOwogICAgRmFiLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICBpZiAoICFhICkgeyBiKCk7IH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBGYWIucHJvdG90eXBlLm9uRGV0ZWN0ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBGYWIucHJvdG90eXBlLm9uTm90RGV0ZWN0ZWQgPSBmdW5jdGlvbihhKSB7CiAgICAgICAgYSgpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIEZhYi5wcm90b3R5cGUuc2V0T3B0aW9uID0gbm9vcGZuOwogICAgRmFiLnByb3RvdHlwZS5vcHRpb25zID0gewogICAgICAgIHNldDogbm9vcGZuLAogICAgICAgIGdldDogbm9vcGZuLAogICAgfTsKICAgIGNvbnN0IGZhYiA9IG5ldyBGYWIoKTsKICAgIGNvbnN0IGdldFNldEZhYiA9IHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gRmFiOyB9LAogICAgICAgIHNldDogZnVuY3Rpb24oKSB7fQogICAgfTsKICAgIGNvbnN0IGdldHNldGZhYiA9IHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFiOyB9LAogICAgICAgIHNldDogZnVuY3Rpb24oKSB7fQogICAgfTsKICAgIGlmICggd2luZG93Lmhhc093blByb3BlcnR5KCdGdWNrQWRCbG9jaycpICkgeyB3aW5kb3cuRnVja0FkQmxvY2sgPSBGYWI7IH0KICAgIGVsc2UgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnRnVja0FkQmxvY2snLCBnZXRTZXRGYWIpOyB9CiAgICBpZiAoIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnQmxvY2tBZEJsb2NrJykgKSB7IHdpbmRvdy5CbG9ja0FkQmxvY2sgPSBGYWI7IH0KICAgIGVsc2UgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnQmxvY2tBZEJsb2NrJywgZ2V0U2V0RmFiKTsgfQogICAgaWYgKCB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ1NuaWZmQWRCbG9jaycpICkgeyB3aW5kb3cuU25pZmZBZEJsb2NrID0gRmFiOyB9CiAgICBlbHNlIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1NuaWZmQWRCbG9jaycsIGdldFNldEZhYik7IH0KICAgIGlmICggd2luZG93Lmhhc093blByb3BlcnR5KCdmdWNrQWRCbG9jaycpICkgeyB3aW5kb3cuZnVja0FkQmxvY2sgPSBmYWI7IH0KICAgIGVsc2UgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZnVja0FkQmxvY2snLCBnZXRzZXRmYWIpOyB9CiAgICBpZiAoIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnYmxvY2tBZEJsb2NrJykgKSB7IHdpbmRvdy5ibG9ja0FkQmxvY2sgPSBmYWI7IH0KICAgIGVsc2UgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnYmxvY2tBZEJsb2NrJywgZ2V0c2V0ZmFiKTsgfQogICAgaWYgKCB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ3NuaWZmQWRCbG9jaycpICkgeyB3aW5kb3cuc25pZmZBZEJsb2NrID0gZmFiOyB9CiAgICBlbHNlIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ3NuaWZmQWRCbG9jaycsIGdldHNldGZhYik7IH0KfSkoKTsK"},{"name":"noop-0.1s.mp3","aliases":["noopmp3-0.1s","abp-resource:blank-mp3"],"kind":{"mime":"audio/mp3"},"content":"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//tUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAGAAADAABgYGBgYGBgYGBgYGBgYGBggICAgICAgICAgICAgICAgICgoKCgoKCgoKCgoKCgoKCgwMDAwMDAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4ODg4ODg4P////////////////////8AAAAATGF2YzU2LjYwAAAAAAAAAAAAAAAAJAAAAAAAAAAAAwDNZKlY//sUZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZB4P8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZDwP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZFoP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZHgP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZJYP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"},{"name":"noop-0.5s.mp3","aliases":[],"kind":{"mime":"audio/mp3"},"content":"SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//tUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAWAAAJAAAgICAgKioqKio1NTU1QEBAQEBKSkpKVVVVVVVgYGBgampqamp1dXV1gICAgICKioqKlZWVlZWgoKCgoKqqqqq1tbW1tcDAwMDKysrKytXV1dXg4ODg4Orq6ur19fX19f////8AAAAATGF2YzU4LjU0AAAAAAAAAAAAAAAAJAMAAAAAAAAACQDI0dkC//sUZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZB4P8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZDwP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZFoP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZHgP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZJYP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZLQP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZNIP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"},{"name":"noop-1s.mp4","aliases":["noopmp4-1s","abp-resource:blank-mp4"],"kind":{"mime":"video/mp4"},"content":"AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4AABCAJMgBDIARwAAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2YzhkOCAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYWxfaHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8mKAAKvMnJycnJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4GSAIQBJkAIZACOAAAAAB0GaVAX4GSAhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGagC/AySEASZACGQAjgAAAAAZBmqAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZrAL8DJIQBJkAIZACOAAAAABkGa4C/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmwAvwMkhAEmQAhkAI4AAAAAGQZsgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGbQC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm2AvwMkhAEmQAhkAI4AAAAAGQZuAL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGboC/AySEASZACGQAjgAAAAAZBm8AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZvgL8DJIQBJkAIZACOAAAAABkGaAC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmiAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpAL8DJIQBJkAIZACOAAAAABkGaYC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmoAvwMkhAEmQAhkAI4AAAAAGQZqgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGawC/AySEASZACGQAjgAAAAAZBmuAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZsAL8DJIQBJkAIZACOAAAAABkGbIC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm0AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZtgL8DJIQBJkAIZACOAAAAABkGbgCvAySEASZACGQAjgCEASZACGQAjgAAAAAZBm6AnwMkhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AAAAhubW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAABDcAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzB0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAA+kAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAALAAAACQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAPpAAAAAAABAAAAAAKobWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAB1MAAAdU5VxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACU21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAhNzdGJsAAAAr3N0c2QAAAAAAAAAAQAAAJ9hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAALAAkABIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAALWF2Y0MBQsAN/+EAFWdCwA3ZAsTsBEAAAPpAADqYA8UKkgEABWjLg8sgAAAAHHV1aWRraEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAAAeAAAD6QAAABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAABAAAAAQAAAIxzdHN6AAAAAAAAAAAAAAAeAAADDwAAAAsAAAALAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAiHN0Y28AAAAAAAAAHgAAAEYAAANnAAADewAAA5gAAAO0AAADxwAAA+MAAAP2AAAEEgAABCUAAARBAAAEXQAABHAAAASMAAAEnwAABLsAAATOAAAE6gAABQYAAAUZAAAFNQAABUgAAAVkAAAFdwAABZMAAAWmAAAFwgAABd4AAAXxAAAGDQAABGh0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAACAAAAAAAABDcAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAQkAAADcAABAAAAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBVxAAAAAAALWhkbHIAAAAAAAAAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABnc3RzZAAAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAAAAA4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAAAAAgAAADIAAAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAAIAAAABAAAAAwAAAAEAAAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAAAACAAAAAEAAAABAAAACQAAAAIAAAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAAEAAAABAAAADgAAAAIAAAABAAAADwAAAAEAAAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAAAAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIAAAABAAAAFgAAAAEAAAABAAAAFwAAAAIAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEAAAABAAAAGwAAAAIAAAABAAAAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oAAAAAAAAAAAAAADMAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAAAAAAAfAAAALAAAA1UAAANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAAAEZwAABHoAAASWAAAEqQAABMUAAATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTUuMzMuMTAw"},{"name":"noop.css","aliases":[],"kind":{"mime":"text/css"},"content":"LyogKi8K"},{"name":"noop.html","aliases":["noopframe"],"kind":{"mime":"text/html"},"content":"PCFET0NUWVBFIGh0bWw+CjxodG1sPgogICAgPGhlYWQ+PHRpdGxlPjwvdGl0bGU+PC9oZWFkPgogICAgPGJvZHk+PC9ib2R5Pgo8L2h0bWw+Cg=="},{"name":"noop.js","aliases":["noopjs","abp-resource:blank-js"],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwp9KSgpOwo="},{"name":"noop.json","aliases":["noopjson"],"kind":{"mime":"application/json"},"content":"e30="},{"name":"noop.txt","aliases":["nooptext"],"kind":{"mime":"text/plain"},"content":"Cg=="},{"name":"noop-vast2.xml","aliases":["noopvast-2.0"],"kind":{"mime":"text/xml"},"content":"PFZBU1QgdmVyc2lvbj0iMi4wIj48L1ZBU1Q+Cg=="},{"name":"noop-vast3.xml","aliases":["noopvast-3.0"],"kind":{"mime":"text/xml"},"content":"PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Cg=="},{"name":"noop-vast4.xml","aliases":["noopvast-4.0"],"kind":{"mime":"text/xml"},"content":"PFZBU1QgdmVyc2lvbj0iNC4wIj48L1ZBU1Q+Cg=="},{"name":"noop-vmap1.xml","aliases":["noop-vmap1.0.xml","noopvmap-1.0"],"kind":{"mime":"text/xml"},"content":"PHZtYXA6Vk1BUCB4bWxuczp2bWFwPSJodHRwOi8vd3d3LmlhYi5uZXQvdmlkZW9zdWl0ZS92bWFwIiB2ZXJzaW9uPSIxLjAiPjwvdm1hcDpWTUFQPgo="},{"name":"outbrain-widget.js","aliases":["widgets.outbrain.com/outbrain.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICBjb25zdCBvYnIgPSB7fTsKICAgIGNvbnN0IG1ldGhvZHMgPSBbCiAgICAgICAgJ2NhbGxDbGljaycsCiAgICAgICAgJ2NhbGxMb2FkTW9yZScsCiAgICAgICAgJ2NhbGxSZWNzJywKICAgICAgICAnY2FsbFVzZXJaYXBwaW5nJywKICAgICAgICAnY2FsbFdoYXRJcycsCiAgICAgICAgJ2NhbmNlbFJlY29tbWVuZGF0aW9uJywKICAgICAgICAnY2FuY2VsUmVjcycsCiAgICAgICAgJ2Nsb3NlQ2FyZCcsCiAgICAgICAgJ2Nsb3NlTW9kYWwnLAogICAgICAgICdjbG9zZVRieCcsCiAgICAgICAgJ2Vycm9ySW5qZWN0aW9uSGFuZGxlcicsCiAgICAgICAgJ2dldENvdW50T2ZSZWNzJywKICAgICAgICAnZ2V0U3RhdCcsCiAgICAgICAgJ2ltYWdlRXJyb3InLAogICAgICAgICdtYW51YWxWaWRlb0NsaWNrZWQnLAogICAgICAgICdvbk9kYlJldHVybicsCiAgICAgICAgJ29uVmlkZW9DbGljaycsCiAgICAgICAgJ3BhZ2VyTG9hZCcsCiAgICAgICAgJ3JlY0NsaWNrZWQnLAogICAgICAgICdyZWZyZXNoU3BlY2lmaWNXaWRnZXQnLAogICAgICAgICdyZW5kZXJTcGFXaWRnZXRzJywKICAgICAgICAncmVmcmVzaFdpZGdldCcsCiAgICAgICAgJ3JlbG9hZFdpZGdldCcsCiAgICAgICAgJ3Jlc2VhcmNoV2lkZ2V0JywKICAgICAgICAncmV0dXJuZWRFcnJvcicsCiAgICAgICAgJ3JldHVybmVkSHRtbERhdGEnLAogICAgICAgICdyZXR1cm5lZElyZERhdGEnLAogICAgICAgICdyZXR1cm5lZEpzb25EYXRhJywKICAgICAgICAnc2Nyb2xsTG9hZCcsCiAgICAgICAgJ3Nob3dEZXNjcmlwdGlvbicsCiAgICAgICAgJ3Nob3dSZWNJbklmcmFtZScsCiAgICAgICAgJ3VzZXJaYXBwaW5nTWVzc2FnZScsCiAgICAgICAgJ3phcHBpbmdGb3JtQWN0aW9uJwogICAgXTsKICAgIG9ici5leHRlcm4gPSB7CiAgICAgICAgdmlkZW86IHsKICAgICAgICAgICAgZ2V0VmlkZW9SZWNzOiBub29wZm4sCiAgICAgICAgICAgIHZpZGVvQ2xpY2tlZDogbm9vcGZuCiAgICAgICAgfQogICAgfTsKICAgIG1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihhKSB7CiAgICAgICAgb2JyLmV4dGVyblthXSA9IG5vb3BmbjsKICAgIH0pOwogICAgd2luZG93Lk9CUiA9IHdpbmRvdy5PQlIgfHwgb2JyOwp9KSgpOwo="},{"name":"popads.js","aliases":["popads.net.js","prevent-popads-net.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBtYWdpYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoRGF0ZS5ub3coKSAlIDI2ICsgOTcpICsKICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTgyNDUxNjUzICsgOTgyNDUxNjUzKS50b1N0cmluZygzNik7CiAgICBjb25zdCBvZSA9IHdpbmRvdy5vbmVycm9yOwogICAgd2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbihtc2csIHNyYywgbGluZSwgY29sLCBlcnJvcikgewogICAgICAgIGlmICggdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgJiYgbXNnLmluZGV4T2YobWFnaWMpICE9PSAtMSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoIG9lIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIHJldHVybiBvZShtc2csIHNyYywgbGluZSwgY29sLCBlcnJvcik7CiAgICAgICAgfQogICAgfS5iaW5kKCk7CiAgICBjb25zdCB0aHJvd01hZ2ljID0gZnVuY3Rpb24oKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihtYWdpYyk7IH07CiAgICBkZWxldGUgd2luZG93LlBvcEFkczsKICAgIGRlbGV0ZSB3aW5kb3cucG9wbnM7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3csIHsKICAgICAgICBQb3BBZHM6IHsgc2V0OiB0aHJvd01hZ2ljIH0sCiAgICAgICAgcG9wbnM6IHsgc2V0OiB0aHJvd01hZ2ljIH0KICAgIH0pOwp9KSgpOwo="},{"name":"popads-dummy.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBkZWxldGUgd2luZG93LlBvcEFkczsKICAgIGRlbGV0ZSB3aW5kb3cucG9wbnM7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3csIHsKICAgICAgICBQb3BBZHM6IHsgdmFsdWU6IHt9IH0sCiAgICAgICAgcG9wbnM6IHsgdmFsdWU6IHt9IH0KICAgIH0pOwp9KSgpOwo="},{"name":"prebid-ads.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAyMi1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICB3aW5kb3cuY2FuUnVuQWRzID0gdHJ1ZTsKICAgIHdpbmRvdy5pc0FkQmxvY2tBY3RpdmUgPSBmYWxzZTsKfSkoKTsK"},{"name":"scorecardresearch_beacon.js","aliases":["scorecardresearch.com/beacon.js"],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAxOS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICB3aW5kb3cuQ09NU0NPUkUgPSB7CiAgICAgICAgcHVyZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB3aW5kb3cuX2NvbXNjb3JlID0gW107CiAgICAgICAgfSwKICAgICAgICBiZWFjb246IGZ1bmN0aW9uKCkgewogICAgICAgIH0KICAgIH07Cn0pKCk7Cg=="},{"name":"sensors-analytics.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICB1QmxvY2sgT3JpZ2luIC0gYSBicm93c2VyIGV4dGVuc2lvbiB0byBibG9jayByZXF1ZXN0cy4KICAgIENvcHlyaWdodCAoQykgMjAyNS1wcmVzZW50IFJheW1vbmQgSGlsbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSB7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL30uCgogICAgSG9tZTogaHR0cHM6Ly9naXRodWIuY29tL2dvcmhpbGwvdUJsb2NrCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBub29wZm4gPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICB3aW5kb3cuc2Vuc29yc0RhdGFBbmFseXRpYzIwMTUwNSA9IHsKICAgICAgICBpbml0OiBub29wZm4sCiAgICAgICAgcXVpY2s6IG5vb3BmbiwKICAgICAgICByZWdpc3Rlcjogbm9vcGZuLAogICAgICAgIHRyYWNrOiBub29wZm4sCiAgICB9Owp9KSgpOwo="},{"name":"async-sugarcoat-04394153a7ce417b88e3fe1790a4e6a269bfebe5.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KGU9PnsidXNlIHN0cmljdCI7Y29uc3QgdD1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0IiksaT1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxyPVN5bWJvbCgib25hYm9ydCIpLGE9U3ltYm9sKCJvbmVycm9yIiksbz1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxnPVN5bWJvbCgib25sb2FkZW5kIiksbD1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGQ9U3ltYm9sKCJyZWFkeVN0YXRlIiksdT1TeW1ib2woInRpbWVvdXQiKSxjPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIikscD1TeW1ib2woInVwbG9hZCIpLGg9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSx2PShlLG4pPT57dmFyIHQ9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLGUuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpc1tuXTt0JiZ0LmNhbGwodGhpcyxlKX0pfSxrPShlLHQpPT57ZVtkXT10LGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBNPSEwO2NsYXNzIG0gZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgZnx8dGhpcyBpbnN0YW5jZW9mIHkpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt2KHRoaXMsbiksdih0aGlzLGkpLHYodGhpcyxyKSx2KHRoaXMsYSksdih0aGlzLG8pLHYodGhpcyxzKSx2KHRoaXMsZyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KGUpe3RoaXNbbl09ZX1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW2ldfXNldCBvbnByb2dyZXNzKGUpe3RoaXNbaV09ZX1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW3JdfXNldCBvbmFib3J0KGUpe3RoaXNbcl09ZX1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW2FdfXNldCBvbmVycm9yKGUpe3RoaXNbYV09ZX1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dChlKXt0aGlzW3NdPWV9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2ddfXNldCBvbmxvYWRlbmQoZSl7dGhpc1tnXT1lfX1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm0sd3JpdGFibGU6ITB9O2NsYXNzIHkgZXh0ZW5kcyBte2NvbnN0cnVjdG9yKCl7aWYoTSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19ZS5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6eSx3cml0YWJsZTohMH07Y2xhc3MgZiBleHRlbmRzIG17Y29uc3RydWN0b3IoKXtzdXBlcigpLE09ITE7dmFyIGU9bmV3IHk7TT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksdih0aGlzLGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGQse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx1LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxwLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTplLHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbbF19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZShlKXt0aGlzW2xdPWV9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tkXX1vcGVuKGUsdCl7c3dpdGNoKHRoaXNbZF0pe2Nhc2UgMDpjYXNlIDQ6ayh0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKGUsdCl7fXNldFRydXN0VG9rZW4oZSl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbdV19c2V0IHRpbWVvdXQoZSl7dGhpc1t1XT1lfWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1tjXX1zZXQgd2l0aENyZWRlbnRpYWxzKGUpe3N3aXRjaCh0aGlzW2RdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2NdPSEhZX1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbcF19c2VuZCgpe2lmKDEhPT10aGlzW2RdfHxudWxsIT09dGhpc1t0XSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbdF09c2V0VGltZW91dCgoKT0+e3RoaXNbdF09bnVsbCxrKHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbZF0mJm51bGwhPT10aGlzW3RdJiYoY2xlYXJUaW1lb3V0KHRoaXNbdF0pLHRoaXNbdF09bnVsbCxrKHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKGUpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUoZSl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1toXX1zZXQgcmVzcG9uc2VUeXBlKGUpe2lmKDQ9PT10aGlzW2RdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2goZSl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbaF09ZX19Z2V0IHJlc3BvbnNlKCl7dmFyIGU9dGhpc1toXTtyZXR1cm4iIj09PWV8fCJ0ZXh0Ij09PWU/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIGU9dGhpc1toXTtpZigiIj09PWV8fCJ0ZXh0Ij09PWUpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSxlLlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmLHdyaXRhYmxlOiEwfX0pKGEpO2NvbnN0IGI9e307KGU9PnsidXNlIHN0cmljdCI7bGV0IHQ9ITE7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpfWdldCBsZW5ndGgoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RofWtleShlKXt2YXIgdD1PYmplY3Qua2V5cyh0aGlzKTtyZXR1cm4gZTwwfHxlPj10Lmxlbmd0aD9udWxsOnRbZV19Z2V0SXRlbShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsZSk/dGhpc1tlXTpudWxsfXNldEl0ZW0oZSx0KXt0aGlzW2VdPVN0cmluZyh0KX1yZW1vdmVJdGVtKGUpe2RlbGV0ZSB0aGlzW2VdfWNsZWFyKCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcykpZGVsZXRlIHRoaXNbZV19fWUuU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH07Y29uc3QgaT1uZXcgbjtlLmxvY2FsU3RvcmFnZT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0KCl7cmV0dXJuIGl9fTtjb25zdCByPW5ldyBuO2Uuc2Vzc2lvblN0b3JhZ2U9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiByfX0sdD0hMH0pKGIpLE1hcmtldGluZy5iaW5kRGVwZW5kZW5jeUltbWVkaWF0ZShmdW5jdGlvbigpe3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7dHJ5e01hcmtldGluZy5VRE8ucGVyZlRpbWluZ1N0YXJ0KCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpLCJ0cnVlIj09ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoIm1kZWJ1ZyIsbG9jYXRpb24uc2VhcmNoKSYmKGRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxNYXJrZXRpbmcuZ0V2ZW50KCJEQy05NjMyNjQ1L3NhbGVzMC9jc2JfdGVzdCt0cmFuc2FjdGlvbnMiLCJwdXJjaGFzZSIpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcmMuaW5jbHVkZXMoInR5cGU9c2FsZXMiKSYmZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KE1hcmtldGluZyksIioiKX0pKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDAzMTEsWzM2MTc2ODJdLDYzNjE0MixbNjE5NDA0XSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIG4sZSxpLHQscjt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO3RyeXtNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdTdGFydCgicnVsZUlkLSIrdGhpcy5pZCsiLWRlcGxveW1lbnRJZC0iK3RoaXMuZGVwbG95bWVudElkKSxuPXdpbmRvdyxlPWRvY3VtZW50LG5baT0idWV0cSJdPW5baV18fFtdLHQ9ZnVuY3Rpb24oKXt2YXIgZT17fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCJYTUxIdHRwUmVxdWVzdCIpLHQ9e30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywibG9jYWxTdG9yYWdlIik7dHJ5e3JldHVybiBlJiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSx0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImxvY2FsU3RvcmFnZSIsYi5sb2NhbFN0b3JhZ2UpLGZ1bmN0aW9uKCl7dmFyIGU9e3RpOiI1MTAyMjYxIn07ZS5xPW5baV0sbltpXT1uZXcgVUVUKGUpLG5baV0ucHVzaCgicGFnZUxvYWQiKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7ZSYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsZSksdCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJsb2NhbFN0b3JhZ2UiLHQpfX0sKHI9ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjPSIvL2JhdC5iaW5nLmNvbS9iYXQuanMiLHIuYXN5bmM9MSxyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVhZHlTdGF0ZTtlJiYibG9hZGVkIiE9PWUmJiJjb21wbGV0ZSIhPT1lfHwodCgpLHIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSwoZT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixlKSxNYXJrZXRpbmcuVURPLnBlcmZUaW1pbmdFbmQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCl9Y2F0Y2goZSl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5kZWJ1ZyhlKX19LDM2MDUyNDIsWzM2MDYzMjldLDY5NTg3NCxbNjEwMzIzXSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5RE9NUGFyc2VkKGZ1bmN0aW9uKCl7dmFyIGU7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJigidXMiPT09KGU9TWFya2V0aW5nLnNjRGF0YU9iai5jb3VudHJ5KSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL1R4VVFOSFNLdkdXSWlNajFPaDN0ZnclM0QlM0QvdnQtMjg4LmpzIiksImNhIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9UeFVRTkhTS3ZHV0lpTWoxT2gzdGZ3JTNEJTNEL3Z0LTI4OS5qcyIpLCJiciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvd1FRdFRpaXpsNFNpeHJoSVR5VHFiZyUzRCUzRC92dC0yODYuanMiKSwidWsiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2FtaTdlV0Q3TWE5cWt1OUhERzIzMnclM0QlM0QvdnQtMjEzLmpzIiksImpwIj09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi82JTJCeFQlMkJPM3oxemgxNHl1bEpCRE42ZyUzRCUzRC92dC0yODcuanMiKSwiYXUiPT09ZSYmTWFya2V0aW5nLmluc2VydFNjcmlwdCgiLy92dC5teXZpc3VhbGlxLm5ldC8yL2lwZWV5SGh0NG5wUUVpemlDV2FZenclM0QlM0QvdnQtMjk5LmpzIiksIm56Ij09PWUmJk1hcmtldGluZy5pbnNlcnRTY3JpcHQoIi8vdnQubXl2aXN1YWxpcS5uZXQvMi9pcGVleUhodDRucFFFaXppQ1dhWXp3JTNEJTNEL3Z0LTMwMS5qcyIpLCJpbiI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdUJGJTJCbmRKVDduMHI5V3lzTkkxVnd3JTNEJTNEL3Z0LTI5OC5qcyIpLCJmciI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvR1hPZE4lMkJXdWdZM04zbjRhNUxBa05RJTNEJTNEL3Z0LTMwMC5qcyIpLCJkZSI9PT1lJiZNYXJrZXRpbmcuaW5zZXJ0U2NyaXB0KCIvL3Z0Lm15dmlzdWFsaXEubmV0LzIvdjlCSk9HY2dsNHdmam43cFhCaHVuQSUzRCUzRC92dC0zMDIuanMiKSksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMzY1LFszNTA2OTI0LDM2MDYzMjldLDYyMTkxOSxbNjEwMzEwLDYxMDMyM10pLE1hcmtldGluZy5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uKCl7d2luZG93Lk1hcmtldGluZyxNYXJrZXRpbmcuZW5zaWdodGVuT3B0aW9uczt0cnl7TWFya2V0aW5nLlVETy5wZXJmVGltaW5nU3RhcnQoInJ1bGVJZC0iK3RoaXMuaWQrIi1kZXBsb3ltZW50SWQtIit0aGlzLmRlcGxveW1lbnRJZCksTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJk1hcmtldGluZy5pbWFnZVJlcXVlc3QoImh0dHBzOi8vcHguYWRzLmxpbmtlZGluLmNvbS9jb2xsZWN0Lz9waWQ9NzUxMyZmbXQ9Z2lmIiksTWFya2V0aW5nLlVETy5wZXJmVGltaW5nRW5kKCJydWxlSWQtIit0aGlzLmlkKyItZGVwbG95bWVudElkLSIrdGhpcy5kZXBsb3ltZW50SWQpfWNhdGNoKGUpe2RlbGxfbWFya2V0aW5nX3V0aWwuZGVidWcoZSl9fSwzNTkzMjg3LDYxOTA4OSksTWFya2V0aW5nLmJpbmREZXBlbmRlbmN5SW1tZWRpYXRlKGZ1bmN0aW9uKCl7dmFyIGkscixlO3dpbmRvdy5NYXJrZXRpbmcsTWFya2V0aW5nLmVuc2lnaHRlbk9wdGlvbnM7TWFya2V0aW5nLlVETy5mbF9sb2FkZWQ9ITEsTWFya2V0aW5nLlVETy5wcmlvcmNvbnNlbnQmJihNYXJrZXRpbmcubG9hZFNjcmlwdENhbGxiYWNrKCJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPURDLTk2MzI2NDUiLGZ1bmN0aW9uKCl7ZGVsbF9tYXJrZXRpbmdfdXRpbC5jdXN0b21fbWFya2V0aW5nX2V2ZW50KCJmbF9sb2FkZWQiKSxNYXJrZXRpbmcuVURPLmZsX2xvYWRlZD0hMH0pLHdpbmRvdy5kYXRhTGF5ZXI9d2luZG93LmRhdGFMYXllcnx8W10sd2luZG93Lmd0YWc9ZnVuY3Rpb24oKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpfSxndGFnKCJqcyIsbmV3IERhdGUpLGd0YWcoImNvbmZpZyIsIkRDLTk2MzI2NDUiKSxndGFnKCJjb25maWciLCJEQy05NjMyOTIxIiksZ3RhZygiY29uZmlnIiwiREMtOTYzMjY0OCIpLGk9ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dfY3VzdG9tX3NjcmlwdHM6ITAsdTE6TWFya2V0aW5nLlVETy5sYW5ndWFnZSx1MTA6TWFya2V0aW5nLlVETy5jc2VnLHUxMTpNYXJrZXRpbmcuVURPLmRlYWxzLHUxMjpNYXJrZXRpbmcuVURPLmRldmljZSx1MTM6TWFya2V0aW5nLlVETy5kaXNjb3VudCx1MTQ6TWFya2V0aW5nLlVETy5mYW1pbHksdTE1Ok1hcmtldGluZy5VRE8ub2dpZCx1MTY6TWFya2V0aW5nLlVETy5vcmRlcmNvZGUsdTE3Ok1hcmtldGluZy5VRE8ucGxhdGZvcm0sdTE4Ok1hcmtldGluZy5VRE8ucHJvZGNhdCx1MTk6TWFya2V0aW5nLlVETy5wcm9kdWN0LHUyOk1hcmtldGluZy5VRE8uc2VnbWVudCx1MjA6TWFya2V0aW5nLlVETy5wcm9tb2lkLHUyMTpNYXJrZXRpbmcuVURPLnR5cGUsdTIyOmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJkZ2MiLGxvY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSksdTIzOk1hcmtldGluZy5VRE8uZ2FjZCx1MjQ6ZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRQYXJhbWV0ZXJCeU5hbWUoImxpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1MjU6TWFya2V0aW5nLlVETy52ZW4xLHUyNjpNYXJrZXRpbmcuVURPLnZlbjIsdTI4OmRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0UGFyYW1ldGVyQnlOYW1lKCJ0ZmNpZCIsbG9jYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSx1Mjk6TWFya2V0aW5nLlVETy5yZXZlbnVlLHUzOk1hcmtldGluZy5VRE8uY3VycmVuY3ksdTMwOk1hcmtldGluZy5VRE8udXNkcmV2LHUzNTpNYXJrZXRpbmcuVURPLmRwaWQsdTM2Ok1hcmtldGluZy5VRE8ubGFuZCx1Mzc6TWFya2V0aW5nLlVETy5zZXJpYWxwcm9kbGlzdCx1Mzg6TWFya2V0aW5nLlVETy5jamV2ZW50LHU0Ok1hcmtldGluZy5VRE8uY291bnRyeSx1NTpNYXJrZXRpbmcuVURPLmFjY291bnRpZCx1NjpNYXJrZXRpbmcuVURPLmNhdGVnb3J5LHU3Ok1hcmtldGluZy5VRE8uY2F0ZWdvcnlwYXRoLHU4Ok1hcmtldGluZy5VRE8uY2lkLHU5Ok1hcmtldGluZy5VRE8uY291cG9ufX0sTWFya2V0aW5nLlVETy5yZWFkRGF0YSgpLChyPWkoKSkudTMxPSIiLChlPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0Q29va2llKCJBTUNWXzRERDgwODYxNTE1Q0FCOTkwQTQ5MEQ0NSU0MEFkb2JlT3JnIikpJiYoci51MzE9ZS5zcGxpdCgiTUNNSUR8IilbMV0uc3BsaXQoInwiKVswXSksTWFya2V0aW5nLmdFdmVudD1NYXJrZXRpbmcuZ0V2ZW50fHxmdW5jdGlvbih0LG4pe3ZhciBlO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmbF9sb2FkZWQiLGZ1bmN0aW9uKCl7dmFyIGU9cjsicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKX0pLE1hcmtldGluZy5VRE8uZmxfbG9hZGVkJiYoZT1yPWkoKSwicHVyY2hhc2UiPT09biYmKGUudmFsdWU9TWFya2V0aW5nLlVETy51c2RyZXZ8fE1hcmtldGluZy5VRE8ucmV2ZW51ZSxlLnRyYW5zYWN0aW9uX2lkPWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0RHBpZCgpKSxlLnNlbmRfdG89dCxndGFnKCJldmVudCIsbixlKSl9KX0sMzYxNzY4MixbMzYwNjMyOV0sNjE5NDA0LFs2MTAzMjNdKSxNYXJrZXRpbmcuYmluZERlcGVuZGVuY3lJbW1lZGlhdGUoZnVuY3Rpb24oKXt3aW5kb3cuTWFya2V0aW5nLE1hcmtldGluZy5lbnNpZ2h0ZW5PcHRpb25zO01hcmtldGluZy5VRE8uZ19kb3dubG9hZD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpe01hcmtldGluZy5VRE8uaHZlb3ZlcmxheT0hMSwiZG93bmxvYWQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSksTWFya2V0aW5nLlVETy5odmVvdmVybGF5JiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9LE1hcmtldGluZy5VRE8uZ19zaGFyZT1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJzaGFyZSI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX21wdj1mdW5jdGlvbihlLHQpezM9PXNlc3Npb25TdG9yYWdlLmVuc3BhZ2Vjb3VudEZMVCYmTWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfYmNfc3RhcnQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtlLnZpZGVvX3N0YXJ0fHwoZS52aWRlb181MF9wZXJjZW50PSExLGUudmlkZW9fODBfcGVyY2VudD0hMSxNYXJrZXRpbmcuZ0V2ZW50KG4saSkpfSl9KTtlbHNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uIGUodCl7ImJyaWdodGNvdmUiPT09dC5kZXRhaWwudHlwZSYmKE1hcmtldGluZy5VRE8uZ19iY19zdGFydChuLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJodmUiLGUpKX0pfSxNYXJrZXRpbmcuVURPLmdfYmNfNTA9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYnJpZ2h0Y292ZTUwIixmdW5jdGlvbihlKXtNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX2JjXzgwPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJyaWdodGNvdmU4MCIsZnVuY3Rpb24oZSl7TWFya2V0aW5nLmdFdmVudCh0LG4pfSl9LE1hcmtldGluZy5VRE8uZ19iY19lbmQ9ZnVuY3Rpb24obixpKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHZpZGVvanMmJnZpZGVvanMucGxheWVycylmb3IodmFyIGUgaW4gdmlkZW9qcy5wbGF5ZXJzKXZpZGVvanMucGxheWVyc1tlXS5yZWFkeShmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5lbF8uaGFzQXR0cmlidXRlKCJtdXRlZCIpfHxlLm9uKCJlbmRlZCIsZnVuY3Rpb24oKXtNYXJrZXRpbmcuZ0V2ZW50KG4saSksZS52aWRlb19zdGFydD0hMX0pfSk7ZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbiBlKHQpeyJicmlnaHRjb3ZlIj09PXQuZGV0YWlsLnR5cGUmJihNYXJrZXRpbmcuVURPLmdfYmNfZW5kKG4saSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImh2ZSIsZSkpfSl9LE1hcmtldGluZy5VRE8uZ19jb250YWN0dXM9ZnVuY3Rpb24odCxuKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaHZlIixmdW5jdGlvbihlKXsiY29udGFjdHVzIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfY2hhdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJjaGF0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfYWRkdG9jYXJ0PWZ1bmN0aW9uKGUsdCl7ImNvbnRlbnRzIiE9PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiYiY2FydCIhPT1kZWxsX21hcmtldGluZ191dGlsLmdldHNjTWFwKCJ3b3JrZmxvd3N0ZXAiKXx8TWFya2V0aW5nLmdFdmVudChlLHQpfSxNYXJrZXRpbmcuVURPLmdfY2hlY2tvdXQ9ZnVuY3Rpb24oZSx0KXsiY29uZmlybWF0aW9uIj09PWRlbGxfbWFya2V0aW5nX3V0aWwuZ2V0c2NNYXAoIndhY29udHJvbGxlciIpJiZNYXJrZXRpbmcuZ0V2ZW50KGUsdCl9LE1hcmtldGluZy5VRE8uZ19wb2RjYXN0X2xpc3Rlbj1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJwb2RjYXN0X2xpc3RlbiI9PT1lLmRldGFpbC50eXBlJiZNYXJrZXRpbmcuZ0V2ZW50KHQsbil9KX0sTWFya2V0aW5nLlVETy5nX3BvZGNhc3Rfc3Vic2NyaWJlPWZ1bmN0aW9uKHQsbil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImh2ZSIsZnVuY3Rpb24oZSl7InBvZGNhc3Rfc3Vic2NyaWJlIj09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfcmZxX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJyZnFfc3VibWl0Ij09PWUuZGV0YWlsLnR5cGUmJk1hcmtldGluZy5nRXZlbnQodCxuKX0pfSxNYXJrZXRpbmcuVURPLmdfaW9uX3N1Ym1pdD1mdW5jdGlvbihlLHQpey9saXZlYmFsbC4qY29tcGxldGVkL2dpLnRlc3QoZGVsbF9tYXJrZXRpbmdfdXRpbC5nZXRzY01hcCgicGFnZW5hbWUiKSkmJk1hcmtldGluZy5nRXZlbnQoZSx0KX0sTWFya2V0aW5nLlVETy5nX2dhdGVkX3N1Ym1pdD1mdW5jdGlvbih0LG4pe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJodmUiLGZ1bmN0aW9uKGUpeyJnYXRlZF9zdWJtaXQiPT09ZS5kZXRhaWwudHlwZSYmTWFya2V0aW5nLmdFdmVudCh0LG4pfSl9fSwzNDc1MTkzLFszNjE3NjgyXSw2MjA4MTgsWzYxOTQwNF0pfQo="},{"name":"async-sugarcoat-8a459c41783885dc83d30f5b7da2359091f4e607.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"e2NvbnN0IGE9e307KHQ9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1TeW1ib2woImRlZmVycmVkSGFuZGxlIiksbj1TeW1ib2woIm9ubG9hZHN0YXJ0Iikscj1TeW1ib2woIm9ucHJvZ3Jlc3MiKSxhPVN5bWJvbCgib25hYm9ydCIpLG89U3ltYm9sKCJvbmVycm9yIiksaT1TeW1ib2woIm9ubG9hZCIpLHM9U3ltYm9sKCJvbnRpbWVvdXQiKSxjPVN5bWJvbCgib25sb2FkZW5kIiksdT1TeW1ib2woIm9ucmVhZHlzdGF0ZWNoYW5nZSIpLGw9U3ltYm9sKCJyZWFkeVN0YXRlIiksZz1TeW1ib2woInRpbWVvdXQiKSxoPVN5bWJvbCgid2l0aENyZWRlbnRpYWxzIiksZj1TeW1ib2woInVwbG9hZCIpLGQ9U3ltYm9sKCJyZXNwb25zZVR5cGUiKSxwPSh0LG4pPT57dmFyIGU9bi5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpc1tuXTtlJiZlLmNhbGwodGhpcyx0KX0pfSx2PSh0LGUpPT57dFtsXT1lLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlYWR5c3RhdGVjaGFuZ2UiKSl9O2xldCBtPSEwO2NsYXNzIGIgZXh0ZW5kcyBFdmVudFRhcmdldHtjb25zdHJ1Y3Rvcigpe2lmKHN1cGVyKCksISh0aGlzIGluc3RhbmNlb2YgeXx8dGhpcyBpbnN0YW5jZW9mIHcpKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTtwKHRoaXMsbikscCh0aGlzLHIpLHAodGhpcyxhKSxwKHRoaXMsbykscCh0aGlzLGkpLHAodGhpcyxzKSxwKHRoaXMsYyl9Z2V0IG9ubG9hZHN0YXJ0KCl7cmV0dXJuIHRoaXNbbl19c2V0IG9ubG9hZHN0YXJ0KHQpe3RoaXNbbl09dH1nZXQgb25wcm9ncmVzcygpe3JldHVybiB0aGlzW3JdfXNldCBvbnByb2dyZXNzKHQpe3RoaXNbcl09dH1nZXQgb25hYm9ydCgpe3JldHVybiB0aGlzW2FdfXNldCBvbmFib3J0KHQpe3RoaXNbYV09dH1nZXQgb25lcnJvcigpe3JldHVybiB0aGlzW29dfXNldCBvbmVycm9yKHQpe3RoaXNbb109dH1nZXQgb250aW1lb3V0KCl7cmV0dXJuIHRoaXNbc119c2V0IG9udGltZW91dCh0KXt0aGlzW3NdPXR9Z2V0IG9ubG9hZGVuZCgpe3JldHVybiB0aGlzW2NdfXNldCBvbmxvYWRlbmQodCl7dGhpc1tjXT10fX10LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmIsd3JpdGFibGU6ITB9O2NsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKCl7aWYobSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbGxlZ2FsIGNvbnN0cnVjdG9yIik7c3VwZXIoKX19dC5YTUxIdHRwUmVxdWVzdFVwbG9hZD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dyx3cml0YWJsZTohMH07Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLG09ITE7dmFyIHQ9bmV3IHc7bT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSkscCh0aGlzLHUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxnLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTowLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6ITEsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxmLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMSx2YWx1ZTp0LHdyaXRhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6IiIsd3JpdGFibGU6ITB9KX1nZXQgb25yZWFkeXN0YXRlY2hhbmdlKCl7cmV0dXJuIHRoaXNbdV19c2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh0KXt0aGlzW3VdPXR9Z2V0IHJlYWR5U3RhdGUoKXtyZXR1cm4gdGhpc1tsXX1vcGVuKHQsZSl7c3dpdGNoKHRoaXNbbF0pe2Nhc2UgMDpjYXNlIDQ6dih0aGlzLDEpfX1zZXRSZXF1ZXN0SGVhZGVyKHQsZSl7fXNldFRydXN0VG9rZW4odCl7fWdldCB0aW1lb3V0KCl7cmV0dXJuIHRoaXNbZ119c2V0IHRpbWVvdXQodCl7dGhpc1tnXT10fWdldCB3aXRoQ3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpc1toXX1zZXQgd2l0aENyZWRlbnRpYWxzKHQpe3N3aXRjaCh0aGlzW2xdKXtjYXNlIDA6Y2FzZSAxOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHNldCB0aGUgJ3dpdGhDcmVkZW50aWFscycgcHJvcGVydHkgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIG1heSBvbmx5IGJlIHNldCBpZiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4iKX10aGlzW2hdPSEhdH1nZXQgdXBsb2FkKCl7cmV0dXJuIHRoaXNbZl19c2VuZCgpe2lmKDEhPT10aGlzW2xdfHxudWxsIT09dGhpc1tlXSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2VuZCcgb24gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIG9iamVjdCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELiIpO3RoaXNbZV09c2V0VGltZW91dCgoKT0+e3RoaXNbZV09bnVsbCx2KHRoaXMsNCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJlcnJvciIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSl9LDApfWFib3J0KCl7MT09PXRoaXNbbF0mJm51bGwhPT10aGlzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXNbZV0pLHRoaXNbZV09bnVsbCx2KHRoaXMsMCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCJhYm9ydCIpKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoImxvYWRlbmQiKSkpfWdldCByZXNwb25zZVVSTCgpe3JldHVybiIifWdldCBzdGF0dXMoKXtyZXR1cm4gMH1nZXQgc3RhdHVzVGV4dCgpe3JldHVybiIifWdldFJlc3BvbnNlSGVhZGVyKHQpe3JldHVybiBudWxsfW92ZXJyaWRlTWltZVR5cGUodCl7fWdldCByZXNwb25zZVR5cGUoKXtyZXR1cm4gdGhpc1tkXX1zZXQgcmVzcG9uc2VUeXBlKHQpe2lmKDQ9PT10aGlzW2xdKXRocm93IG5ldyBET01FeGNlcHRpb24oIkZhaWxlZCB0byBzZXQgdGhlICdyZXNwb25zZVR5cGUnIHByb3BlcnR5IG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSByZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgaWYgdGhlIG9iamVjdCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4iKTtzd2l0Y2godCl7Y2FzZSIiOmNhc2UiYXJyYXlidWZmZXIiOmNhc2UiYmxvYiI6Y2FzZSJkb2N1bWVudCI6Y2FzZSJqc29uIjpjYXNlInRleHQiOnRoaXNbZF09dH19Z2V0IHJlc3BvbnNlKCl7dmFyIHQ9dGhpc1tkXTtyZXR1cm4iIj09PXR8fCJ0ZXh0Ij09PXQ/IiI6bnVsbH1nZXQgcmVzcG9uc2VUZXh0KCl7dmFyIHQ9dGhpc1tkXTtpZigiIj09PXR8fCJ0ZXh0Ij09PXQpcmV0dXJuIiI7dGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgdGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGZyb20gJ1hNTEh0dHBSZXF1ZXN0JzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0J3MgJ3Jlc3BvbnNlVHlwZScgaXMgJycgb3IgJ3RleHQnICh3YXMgJ2FycmF5YnVmZmVyJykuIil9Z2V0IHJlc3BvbnNlWE1MKCl7cmV0dXJuIG51bGx9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJVTlNFTlQiLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTowfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksIk9QRU5FRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiSEVBREVSU19SRUNFSVZFRCIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiTE9BRElORyIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjN9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiRE9ORSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOjR9KSx0LlhNTEh0dHBSZXF1ZXN0PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp5LHdyaXRhYmxlOiEwfX0pKGEpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3Q9dC5zcGxpdCgiLiIpO3ZhciBuLHI9YTt0WzBdaW4gcnx8dm9pZCAwPT09ci5leGVjU2NyaXB0fHxyLmV4ZWNTY3JpcHQoInZhciAiK3RbMF0pO2Zvcig7dC5sZW5ndGgmJihuPXQuc2hpZnQoKSk7KXQubGVuZ3RofHx2b2lkIDA9PT1lP3I9cltuXSYmcltuXSE9PU9iamVjdC5wcm90b3R5cGVbbl0/cltuXTpyW25dPXt9OnJbbl09ZX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIDF9ZnVuY3Rpb24gbyh0LGUpe3AuYWRkRXZlbnRMaXN0ZW5lcj9wLmFkZEV2ZW50TGlzdGVuZXIodCxlLCExKTpwLmF0dGFjaEV2ZW50JiZwLmF0dGFjaEV2ZW50KCJvbiIrdCxlKX1mdW5jdGlvbiBpKHQsZSxuKXt0PXQuc3BsaXQoIiYiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXS5zcGxpdCgiPSIpO2lmKGRlY29kZVVSSUNvbXBvbmVudChhWzBdKS5yZXBsYWNlKC9cKy9nLCIgIik9PT1lKXJldHVybiBlPWEuc2xpY2UoMSkuam9pbigiPSIpLG4/ZTpkZWNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvXCsvZywiICIpfX12YXIgdSxsLGMsYT10aGlzfHxzZWxmLGc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0saD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwKTp8W146Lz8jXSooPzpbLz8jXXwkKSkvaSxmPXdpbmRvdyxkPXdpbmRvdy5oaXN0b3J5LHA9ZG9jdW1lbnQsdj1uYXZpZ2F0b3IsZT17fSxtPWZ1bmN0aW9uKCl7ZS5UQUdHSU5HPWUuVEFHR0lOR3x8W10sZS5UQUdHSU5HWzFdPSEwfSxiPS86WzAtOV0rJC8sdz1mdW5jdGlvbih0LGUpe3JldHVybiJwcm90b2NvbCIhPT0oZT1lJiZTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSkmJiJwb3J0IiE9PWV8fCh0LnByb3RvY29sPV8odC5wcm90b2NvbCl8fF8oZi5sb2NhdGlvbi5wcm90b2NvbCkpLCJwb3J0Ij09PWU/dC5wb3J0PVN0cmluZyhOdW1iZXIoKHQuaG9zdG5hbWU/dDpmLmxvY2F0aW9uKS5wb3J0KXx8KCJodHRwIj09dC5wcm90b2NvbD84MDoiaHR0cHMiPT10LnByb3RvY29sPzQ0MzoiIikpOiJob3N0Ij09PWUmJih0Lmhvc3RuYW1lPSh0Lmhvc3RuYW1lfHxmLmxvY2F0aW9uLmhvc3RuYW1lKS5yZXBsYWNlKGIsIiIpLnRvTG93ZXJDYXNlKCkpLHkodCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwKX0seT1mdW5jdGlvbih0LGUsbixyLGEpe3ZhciBvPV8odC5wcm90b2NvbCk7c3dpdGNoKGU9ZSYmU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UidXJsX25vX2ZyYWdtZW50IjpyPSIiLHQ9cj10JiZ0LmhyZWY/KHI9dC5ocmVmLmluZGV4T2YoIiMiKSk8MD90LmhyZWY6dC5ocmVmLnN1YnN0cigwLHIpOnI7YnJlYWs7Y2FzZSJwcm90b2NvbCI6dD1vO2JyZWFrO2Nhc2UiaG9zdCI6dD10Lmhvc3RuYW1lLnJlcGxhY2UoYiwiIikudG9Mb3dlckNhc2UoKSxuJiYocj0vXnd3d1xkKlwuLy5leGVjKHQpKSYmclswXSYmKHQ9dC5zdWJzdHIoclswXS5sZW5ndGgpKTticmVhaztjYXNlInBvcnQiOnQ9U3RyaW5nKE51bWJlcih0LnBvcnQpfHwoImh0dHAiPT1vPzgwOiJodHRwcyI9PW8/NDQzOiIiKSk7YnJlYWs7Y2FzZSJwYXRoIjp0LnBhdGhuYW1lfHx0Lmhvc3RuYW1lfHxtKCksdD0odD0iLyI9PXQucGF0aG5hbWUuc3Vic3RyKDAsMSk/dC5wYXRobmFtZToiLyIrdC5wYXRobmFtZSkuc3BsaXQoIi8iKSwwPD0ocnx8W10pLmluZGV4T2YodFt0Lmxlbmd0aC0xXSkmJih0W3QubGVuZ3RoLTFdPSIiKSx0PXQuam9pbigiLyIpO2JyZWFrO2Nhc2UicXVlcnkiOnQ9dC5zZWFyY2gucmVwbGFjZSgiPyIsIiIpLGEmJih0PWkodCxhLHZvaWQgMCkpO2JyZWFrO2Nhc2UiZXh0ZW5zaW9uIjp0PSh0PTE8KHQ9dC5wYXRobmFtZS5zcGxpdCgiLiIpKS5sZW5ndGg/dFt0Lmxlbmd0aC0xXToiIikuc3BsaXQoIi8iKVswXTticmVhaztjYXNlImZyYWdtZW50Ijp0PXQuaGFzaC5yZXBsYWNlKCIjIiwiIik7YnJlYWs7ZGVmYXVsdDp0PXQmJnQuaHJlZn1yZXR1cm4gdH0sXz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoIjoiLCIiKS50b0xvd2VyQ2FzZSgpOiIifSxPPWZ1bmN0aW9uKHQpe3ZhciBlPXAuY3JlYXRlRWxlbWVudCgiYSIpO3QmJihlLmhyZWY9dCk7dmFyIG49ZS5wYXRobmFtZTtyZXR1cm4iLyIhPT1uWzBdJiYodHx8bSgpLG49Ii8iK24pLHQ9ZS5ob3N0bmFtZS5yZXBsYWNlKGIsIiIpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sLGhvc3Q6ZS5ob3N0LGhvc3RuYW1lOnQscGF0aG5hbWU6bixzZWFyY2g6ZS5zZWFyY2gsaGFzaDplLmhhc2gscG9ydDplLnBvcnR9fTtmdW5jdGlvbiBFKCl7Zm9yKHZhciB0PXUsZT17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZVt0W25dXT1uO3JldHVybiBlfWZ1bmN0aW9uIFQoKXt2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiO3JldHVybih0Kz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLnRvTG93ZXJDYXNlKCkrIjAxMjM0NTY3ODktXyIpKyIuIn1mdW5jdGlvbiB4KHQpe3U9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0zKXt2YXIgcj1uKzE8dC5sZW5ndGgsYT1uKzI8dC5sZW5ndGgsbz10LmNoYXJDb2RlQXQobiksaT1yP3QuY2hhckNvZGVBdChuKzEpOjAscz1hP3QuY2hhckNvZGVBdChuKzIpOjAsYz1vPj4yLG89KDMmbyk8PDR8aT4+NCxpPSgxNSZpKTw8MnxzPj42O3MmPTYzLGF8fChzPTY0LHJ8fChpPTY0KSksZS5wdXNoKHVbY10sdVtvXSx1W2ldLHVbc10pfXJldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIGsoKXtmdW5jdGlvbiB0KHQpe24odC50YXJnZXR8fHQuc3JjRWxlbWVudHx8e30pfXZhciBlLG49RixyPVgsYT1OKCk7YS5pbml0fHwobygibW91c2Vkb3duIix0KSxvKCJrZXl1cCIsdCksbygic3VibWl0IixmdW5jdGlvbih0KXtyKHQudGFyZ2V0fHx0LnNyY0VsZW1lbnR8fHt9KX0pLGU9SFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQsSFRNTEZvcm1FbGVtZW50LnByb3RvdHlwZS5zdWJtaXQ9ZnVuY3Rpb24oKXtyKHRoaXMpLGUuY2FsbCh0aGlzKX0sYS5pbml0PSEwKX1mdW5jdGlvbiBTKHQsZSxuLHIsYSl7dD17Y2FsbGJhY2s6dCxkb21haW5zOmUsZnJhZ21lbnQ6Mj09PW4scGxhY2VtZW50Om4sZm9ybXM6cixzYW1lSG9zdDphfSxOKCkuZGVjb3JhdG9ycy5wdXNoKHQpfWZ1bmN0aW9uIEModCxlLG4pe2Zvcih2YXIgcj1OKCkuZGVjb3JhdG9ycyxhPXt9LG89MDtvPHIubGVuZ3RoOysrbyl7dmFyIGk9cltvXTtpZihzPSFufHxpLmZvcm1zKXQ6e3ZhciBzPWkuZG9tYWlucyxjPXQsdT0hIWkuc2FtZUhvc3Q7aWYocyYmKHV8fGMhPT1wLmxvY2F0aW9uLmhvc3RuYW1lKSlmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKylpZihzW2xdaW5zdGFuY2VvZiBSZWdFeHApe2lmKHNbbF0udGVzdChjKSl7cz0hMDticmVhayB0fX1lbHNlIGlmKDA8PWMuaW5kZXhPZihzW2xdKXx8dSYmMDw9c1tsXS5pbmRleE9mKGMpKXtzPSEwO2JyZWFrIHR9cz0hMX1zJiYoKHM9bnVsbD09KHM9aS5wbGFjZW1lbnQpP2kuZnJhZ21lbnQ/MjoxOnMpPT09ZSYmZyhhLGkuY2FsbGJhY2soKSkpfXJldHVybiBhfXZhciBqPXZvaWQgMDtmdW5jdGlvbiBOKCl7dmFyIHQ9e30sZT1mLmdvb2dsZV90YWdfZGF0YTtyZXR1cm4gZi5nb29nbGVfdGFnX2RhdGE9dm9pZCAwPT09ZT90OmUsKGU9KHQ9Zi5nb29nbGVfdGFnX2RhdGEpLmdsKSYmZS5kZWNvcmF0b3JzfHwodC5nbD1lPXtkZWNvcmF0b3JzOltdfSksZX12YXIgUj0vKC4qPylcKiguKj8pXCooLiopLyxBPS8oW14/I10rKShcP1teI10qKT8oIy4qKT8vO2Z1bmN0aW9uIEwodCl7cmV0dXJuIG5ldyBSZWdFeHAoIiguKj8pKF58JikiK3QrIj0oW14mXSopJj8oLiopIil9ZnVuY3Rpb24gSSh0LGUpe3ZhciBuLHIsYT1bXTtmb3IobiBpbiB0KSF0Lmhhc093blByb3BlcnR5KG4pfHx2b2lkIDAhPT0ocj10W25dKSYmcj09ciYmbnVsbCE9PXImJiJbb2JqZWN0IE9iamVjdF0iIT09ci50b1N0cmluZygpJiYoYS5wdXNoKG4pLGEucHVzaCh4KFN0cmluZyhyKSkpKTtyZXR1cm4gdD1hLmpvaW4oIioiKSx2b2lkIDAhPT1lJiYoYT0ieHBfIitlLGU9TVtlXSh0KSx0PXQrIioiK1thLHgoU3RyaW5nKGUpKV0uam9pbigiKiIpKSxbIjEiLFAodCksdF0uam9pbigiKiIpfWZ1bmN0aW9uIFAodCxlKXtpZih0PVtmLm5hdmlnYXRvci51c2VyQWdlbnQsKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpLHYudXNlckxhbmd1YWdlfHx2Lmxhbmd1YWdlLE1hdGguZmxvb3IobmV3IERhdGUoRGF0ZS5ub3coKSkuZ2V0VGltZSgpLzYwLzFlMyktKHZvaWQgMD09PWU/MDplKSx0XS5qb2luKCIqIiksIShlPWMpKXtlPUFycmF5KDI1Nik7Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtmb3IodmFyIHI9bixhPTA7YTw4O2ErKylyPTEmcj9yPj4+MV4zOTg4MjkyMzg0OnI+Pj4xO2Vbbl09cn19Zm9yKGM9ZSxlPTQyOTQ5NjcyOTUsbj0wO248dC5sZW5ndGg7bisrKWU9ZT4+PjheY1syNTUmKGVedC5jaGFyQ29kZUF0KG4pKV07cmV0dXJuKCgtMV5lKT4+PjApLnRvU3RyaW5nKDM2KX12YXIgbj17fSxNPShuWzFdPWZ1bmN0aW9uKCl7cmV0dXJuIkNIRUNLU1VNX0VYUF9ESVNBQkxFRCJ9LG5bMl09ZnVuY3Rpb24oKXtyZXR1cm4iQ0hFQ0tTVU1fRVhQX0RJU0FCTEVEIn0sblszXT1mdW5jdGlvbigpe3JldHVybiJDSEVDS1NVTV9FWFBfRElTQUJMRUQifSxuKTtmdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PKGYubG9jYXRpb24uaHJlZiksbj1lLnNlYXJjaC5yZXBsYWNlKCI/IiwiIikscj1pKG4sIl9nbCIsITApO3QucXVlcnk9cShyfHwiIil8fHt9O3ZhciBhPShyPXcoZSwiZnJhZ21lbnQiKSkubWF0Y2goTCgiX2dsIikpO3QuZnJhZ21lbnQ9cShhJiZhWzNdfHwiIil8fHt9LG8mJmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQ9KHQ9RCgiX2dsIix0KSkubGVuZ3RoP2UrdDp0fXt2YXIgYTtkJiZkLnJlcGxhY2VTdGF0ZSYmKCgoYT1MKCJfZ2wiKSkudGVzdChlKXx8YS50ZXN0KG4pKSYmKHQ9dyh0LCJwYXRoIiksZT1yKGUsIj8iKSxuPXIobiwiIyIpLGQucmVwbGFjZVN0YXRlKHt9LHZvaWQgMCwiIit0K2UrbikpKX19KGUsbixyKX19ZnVuY3Rpb24gRCh0LGUpe3ZhciBuLHI7cmV0dXJuKHQ9TCh0KS5leGVjKGUpKSYmKG49dFsyXSxyPXRbNF0sZT10WzFdLHImJihlPWUrbityKSksZX1mdW5jdGlvbiBxKHQpe3ZhciBlPXZvaWQgMD09PWU/MzplO3RyeXtpZih0KXt0Ontmb3IodmFyIG49MDtuPDM7KytuKXt2YXIgcj1SLmV4ZWModCk7aWYocil7dmFyIGE9cjticmVhayB0fXQ9ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWE9dm9pZCAwfWlmKGEmJiIxIj09PWFbMV0pe3ZhciBvPWFbMl0saT1hWzNdO3Q6e2ZvcihhPTA7YTxlOysrYSlpZihvPT09UChpLGEpKXt2YXIgcz0hMDticmVhayB0fXM9ITF9aWYocyl7Zm9yKHZhciBlPXt9LGM9aT9pLnNwbGl0KCIqIik6W10saT0wO2k8Yy5sZW5ndGg7aSs9MillW2NbaV1dPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodCl7Zm9yKDthPHIubGVuZ3RoOyl7dmFyIGU9ci5jaGFyQXQoYSsrKSxuPWxbZV07aWYobnVsbCE9bilyZXR1cm4gbjtpZighL15bXHNceGEwXSokLy50ZXN0KGUpKXRocm93IEVycm9yKCJVbmtub3duIGJhc2U2NCBlbmNvZGluZyBhdCBjaGFyOiAiK2UpfXJldHVybiB0fXU9dXx8VCgpLGw9bHx8RSgpO2Zvcih2YXIgZT0iIixhPTA7Oyl7dmFyIG49dCgtMSksbz10KDApLGk9dCg2NCkscz10KDY0KTtpZig2ND09PXMmJi0xPT09bilyZXR1cm4gZTtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG48PDJ8bz4+NCksNjQhPWkmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG88PDQmMjQwfGk+PjIpLDY0IT1zJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpPDw2JjE5MnxzKSkpfX0oY1tpKzFdKTtyZXR1cm4gZX19fX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFUobix0LGUscil7ZnVuY3Rpb24gYSh0KXt2YXIgZT0odD1EKG4sdCkpLmNoYXJBdCh0Lmxlbmd0aC0xKTtyZXR1cm4gdCYmIiYiIT09ZSYmKHQrPSImIiksdCtzfWlmKHI9dm9pZCAwIT09ciYmciwhKGk9QS5leGVjKGUpKSlyZXR1cm4iIjtlPWlbMV07dmFyIG89aVsyXXx8IiIsaT1pWzNdfHwiIixzPW4rIj0iK3Q7cmV0dXJuIHI/aT0iIyIrYShpLnN1YnN0cmluZygxKSk6bz0iPyIrYShvLnN1YnN0cmluZygxKSksIiIrZStvK2l9ZnVuY3Rpb24gSCh0LGUpe3ZhciBuPSJGT1JNIj09PSh0LnRhZ05hbWV8fCIiKS50b1VwcGVyQ2FzZSgpLHI9QyhlLDEsbiksYT1DKGUsMixuKTtlPUMoZSwzLG4pO3ZhciBvLGk9ajtmb3IobyBpbiBzKHIpJiYocj1JKHIsaSksbj9WKCJfZ2wiLHIsdCk6RygiX2dsIixyLHQsITEpKSwhbiYmcyhhKSYmRygiX2dsIixuPUkoYSksdCwhMCksZSllLmhhc093blByb3BlcnR5KG8pJiYkKG8sZVtvXSx0KX1mdW5jdGlvbiAkKHQsZSxuLHIpe2lmKG4udGFnTmFtZSl7aWYoImEiPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIEcodCxlLG4scik7aWYoImZvcm0iPT09bi50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIFYodCxlLG4pfWlmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gVSh0LGUsbixyKX1mdW5jdGlvbiBHKHQsZSxuLHIpe24uaHJlZiYmKHQ9VSh0LGUsbi5ocmVmLHZvaWQgMCE9PXImJnIpLGgudGVzdCh0KSYmKG4uaHJlZj10KSl9ZnVuY3Rpb24gVih0LGUsbil7aWYobiYmbi5hY3Rpb24paWYoImdldCI9PT0ocj0obi5tZXRob2R8fCIiKS50b0xvd2VyQ2FzZSgpKSl7Zm9yKHZhciByPW4uY2hpbGROb2Rlc3x8W10sYT0hMSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoaS5uYW1lPT09dCl7aS5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxhPSEwO2JyZWFrfX1hfHwoKHI9cC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxyLnNldEF0dHJpYnV0ZSgibmFtZSIsdCksci5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKSxuLmFwcGVuZENoaWxkKHIpKX1lbHNlInBvc3QiPT09ciYmKHQ9VSh0LGUsbi5hY3Rpb24pLGgudGVzdCh0KSYmKG4uYWN0aW9uPXQpKX1mdW5jdGlvbiBGKHQpe3RyeXt0Ontmb3IodmFyIGU9MTAwO3QmJjA8ZTspe2lmKHQuaHJlZiYmdC5ub2RlTmFtZS5tYXRjaCgvXmEoPzpyZWEpPyQvaSkpe3ZhciBuPXQ7YnJlYWsgdH10PXQucGFyZW50Tm9kZSxlLS19bj1udWxsfXZhciByO24mJigiaHR0cDoiIT09KHI9bi5wcm90b2NvbCkmJiJodHRwczoiIT09cnx8SChuLG4uaG9zdG5hbWUpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFgodCl7dHJ5e3QuYWN0aW9uJiZIKHQsdyhPKHQuYWN0aW9uKSwiaG9zdCIpKX1jYXRjaCh0KXt9fXQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5hdXRvIixmdW5jdGlvbih0LGUsbixyLGEpe2soKSx2b2lkIDAhPT1hJiYoaj1hKSwzIT09YXx8di51c2VyQWdlbnREYXRhJiZ2LnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWyJhcmNoaXRlY3R1cmUiLCJtb2RlbCIsImJpdG5lc3MiLCJwbGF0Zm9ybVZlcnNpb24iLCJ1YUZ1bGxWZXJzaW9uIl0pLnRoZW4oZnVuY3Rpb24oKXt9KSxTKHQsZSwiZnJhZ21lbnQiPT09bj8yOjEsISFyLCExKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5wYXNzdGhyb3VnaCIsZnVuY3Rpb24odCxlLG4scil7aygpLHZvaWQgMCE9PXImJihqPXIpLFModCxbeShmLmxvY2F0aW9uLCJob3N0IiwhMCldLGUsISFuLCEwKX0pLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5kZWNvcmF0ZSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiAkKCJfZ2wiLHQ9SSh0KSxlLCEhbil9KSx0KCJnb29nbGVfdGFnX2RhdGEuZ2xCcmlkZ2UuZ2VuZXJhdGUiLEkpLHQoImdvb2dsZV90YWdfZGF0YS5nbEJyaWRnZS5nZXQiLGZ1bmN0aW9uKHQsZSl7dmFyIG49cighIWUpO3JldHVybihlPU4oKSkuZGF0YXx8KGUuZGF0YT17cXVlcnk6e30sZnJhZ21lbnQ6e319LG4oZS5kYXRhKSksbj17fSwoZT1lLmRhdGEpJiYoZyhuLGUucXVlcnkpLHQmJmcobixlLmZyYWdtZW50KSksbn0pfSh3aW5kb3cpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuPTE7aWYodClmb3Iobj0wLGU9dC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIHI9dC5jaGFyQ29kZUF0KGUpO249MCE9KHI9MjY2MzM4MzA0JihuPShuPDw2JjI2ODQzNTQ1NSkrcisocjw8MTQpKSk/bl5yPj4yMTpufXJldHVybiBufWZ1bmN0aW9uIGkodCl7dGhpcy5DPXR8fFtdfWkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXt0aGlzLkNbdF09ITB9LGkucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLkMubGVuZ3RoO2UrKyl0aGlzLkNbZV0mJih0W01hdGguZmxvb3IoZS82KV1ePTE8PGUlNik7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIi5jaGFyQXQodFtlXXx8MCk7cmV0dXJuIHQuam9pbigiIikrIn4ifTt2YXIgdD13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0LHM9KEFlPShBZT1OZT0oTmU9bnVsbCE9dCk/LTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpOk5lKT8oUmU9d2luZG93Lkdvb2dsZUFuYWx5dGljc09iamVjdCk/UmUucmVwbGFjZSgvXltcc1x4YTBdK3xbXHNceGEwXSskL2csIiIpOiIiOkFlKXx8ImdhIixjPS9eKD86dXRtYVwuKT9cZCtcLlxkKyQvLHU9L15hbXAtW1x3Li1dezIyLDY0fSQvLGw9ITEscj1uZXcgaTtmdW5jdGlvbiBnKHQpe3Iuc2V0KHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQ9dC5nZXQoRmUpLHQ9IXkodCk/W106dH1mdW5jdGlvbiBmKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQ9SS5uYXZpZ2F0b3IudXNlckFnZW50KyhQLmNvb2tpZXx8IiIpKyhQLnJlZmVycmVyfHwiIiksZT10Lmxlbmd0aCxuPUkuaGlzdG9yeS5sZW5ndGg7MDxuOyl0Kz1uLS1eZSsrO3JldHVybltBdCgpXjIxNDc0ODM2NDcmbyh0KSxNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMyldLmpvaW4oIi4iKX1mdW5jdGlvbiBwKHQsZSxuLHIpe3RyeXt0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKGUsbiwhIXIpOnQuYXR0YWNoRXZlbnQmJnQuYXR0YWNoRXZlbnQoIm9uIitlLG4pfWNhdGNoKHQpe2coMjcpfX1mdW5jdGlvbiB2KHQsZSl7dmFyIG49dC5pbmRleE9mKGUpO3JldHVybiEoNSE9biYmNiE9bnx8Ii8iIT0odD10LmNoYXJBdChuK2UubGVuZ3RoKSkmJiI/IiE9dCYmIiIhPXQmJiI6IiE9dCl9ZnVuY3Rpb24gbSh0LGUpe2lmKDE9PWUubGVuZ3RoJiZudWxsIT1lWzBdJiYib2JqZWN0Ij09dHlwZW9mIGVbMF0pcmV0dXJuIGVbMF07Zm9yKHZhciBuPXt9LHI9TWF0aC5taW4odC5sZW5ndGgrMSxlLmxlbmd0aCksYT0wO2E8cjthKyspe2lmKCJvYmplY3QiPT10eXBlb2YgZVthXSl7Zm9yKHZhciBvIGluIGVbYV0pZVthXS5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109ZVthXVtvXSk7YnJlYWt9YTx0Lmxlbmd0aCYmKG5bdFthXV09ZVthXSl9cmV0dXJuIG59ZnVuY3Rpb24gYigpe3RoaXMub2E9W10sdGhpcy5lYT17fSx0aGlzLm09e319dmFyIHc9ZnVuY3Rpb24odCl7dD1oKHQpLHQ9bmV3IGkodCk7Zm9yKHZhciBlPXIuQy5zbGljZSgpLG49MDtuPHQuQy5sZW5ndGg7bisrKWVbbl09ZVtuXXx8dC5DW25dO3JldHVybiBuZXcgaShlKS5lbmNvZGUoKX0seT1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0KHQpKX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmLTE8KHQuY29uc3RydWN0b3IrIiIpLmluZGV4T2YoIlN0cmluZyIpfSxPPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PXQuaW5kZXhPZihlKX0sRT1mdW5jdGlvbih0KXt2YXIgZT1QLmNyZWF0ZUVsZW1lbnQoImltZyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlLnNyYz10LGV9LFQ9ZnVuY3Rpb24oKXt9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2VuY29kZVVSSUNvbXBvbmVudCh0KTooZygyOCksdCl9LGs9L15bXHdcLTovLj89JiUhXFtcXV0rJC8sUz0vXltcdysvXy1dK1s9XXswLDJ9JC8sQz1udWxsLGo9ZnVuY3Rpb24odCxlLG4scixhKXtpZighQyl7Qz17Y3JlYXRlU2NyaXB0VVJMOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjcmVhdGVIVE1MOmZ1bmN0aW9uKHQpe3JldHVybiB0fX07dHJ5e0M9d2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImdvb2dsZS1hbmFseXRpY3MiLEMpfWNhdGNoKHQpe319dmFyIG87dCYmKG89KG89UC5xdWVyeVNlbGVjdG9yJiZQLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKXx8bnVsbCkmJihvLm5vbmNlfHxvLmdldEF0dHJpYnV0ZSYmby5nZXRBdHRyaWJ1dGUoIm5vbmNlIikpfHwiIixuPyhhPXI9IiIsZSYmay50ZXN0KGUpJiYocj0nIGlkPSInK2UrJyInKSxvJiZTLnRlc3QobykmJihhPScgbm9uY2U9IicrbysnIicpLGsudGVzdCh0KSYmUC53cml0ZShDLmNyZWF0ZUhUTUwoIjxzY3JpcHQiK3IrYSsnIHNyYz0iJyt0KyciPjxcL3NjcmlwdD4nKSkpOigobj1QLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG4uYXN5bmM9ITAsbi5zcmM9Qy5jcmVhdGVTY3JpcHRVUkwodCksciYmKG4ub25sb2FkPXIpLGEmJihuLm9uZXJyb3I9YSksZSYmKG4uaWQ9ZSksbyYmbi5zZXRBdHRyaWJ1dGUoIm5vbmNlIixvKSwodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobix0KSkpfSxOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFIoUC5sb2NhdGlvbltlPyJocmVmIjoic2VhcmNoIl0sdCl9LFI9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD10Lm1hdGNoKCIoPzomfCN8XFw/KSIreChlKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8XFtcXVwvXFxdKS9nLCJcXCQxIikrIj0oW14mI10qKSIpKSYmMj09dC5sZW5ndGg/dFsxXToiIn0sQT1mdW5jdGlvbigpe3ZhciB0PSIiK1AubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIDA9PXQuaW5kZXhPZigid3d3LiIpP3Quc3Vic3RyaW5nKDQpOnR9LEw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihlPT10W25dKXJldHVybiEwO3JldHVybiExfTtiLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMub2EucHVzaCh0KSxuP3RoaXMubVsiOiIrdF09ZTp0aGlzLmVhWyI6Iit0XT1lfSxiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMubS5oYXNPd25Qcm9wZXJ0eSgiOiIrdCk/dGhpcy5tOnRoaXMuZWEpWyI6Iit0XX0sYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5vYS5sZW5ndGg7ZSsrKXt2YXIgbj10aGlzLm9hW2VdLHI9dGhpcy5nZXQobik7ciYmdChuLHIpfX07dmFyIEk9d2luZG93LFA9ZG9jdW1lbnQsbj1kb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOiIiLE09ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2V0VGltZW91dCh0LGUpfSxEPXdpbmRvdyxxPWRvY3VtZW50LFU9ZnVuY3Rpb24odCl7dmFyIGU9RC5fZ2FVc2VyUHJlZnM7aWYoZSYmZS5pb28mJmUuaW9vKCl8fHQmJiEwPT09RFsiZ2EtZGlzYWJsZS0iK3RdKXJldHVybiEwO3RyeXt2YXIgbj1ELmV4dGVybmFsO2lmKG4mJm4uX2dhVXNlclByZWZzJiYib28iPT1uLl9nYVVzZXJQcmVmcylyZXR1cm4hMH1jYXRjaCh0KXt9Zm9yKHQ9W10sZT1TdHJpbmcocS5jb29raWUpLnNwbGl0KCI7Iiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLnNwbGl0KCI9IiksYT1yWzBdLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKTthJiYiQU1QX1RPS0VOIj09YSYmKChyPXIuc2xpY2UoMSkuam9pbigiPSIpLnJlcGxhY2UoL15ccyp8XHMqJC9nLCIiKSkmJihyPWRlY29kZVVSSUNvbXBvbmVudChyKSksdC5wdXNoKHIpKX1mb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCIkT1BUX09VVCI9PXRbZV0pcmV0dXJuITA7cmV0dXJuISFxLmdldEVsZW1lbnRCeUlkKCJfX2dhT3B0T3V0RXh0ZW5zaW9uIil9LEg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiK3QrIj1cXHMqKC4qPylcXHMqJCIpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLm1hdGNoKHQpO2EmJmUucHVzaChhWzFdKX1yZXR1cm4gZX0sJD1mdW5jdGlvbih0LGUsbixyLGEsbyxpKXtpZighKGE9IVUoYSkmJiEoRi50ZXN0KFAubG9jYXRpb24uaG9zdG5hbWUpfHwiLyI9PW4mJlYudGVzdChyKSkpKXJldHVybiExO2lmKG49dCsiPSIrKGU9ZSYmMTIwMDxlLmxlbmd0aD9lLnN1YnN0cmluZygwLDEyMDApOmUpKyI7IHBhdGg9IituKyI7ICIsbyYmKG4rPSJleHBpcmVzPSIrbmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrbykudG9HTVRTdHJpbmcoKSsiOyAiKSxyJiYibm9uZSIhPT1yJiYobis9ImRvbWFpbj0iK3IrIjsiKSxpJiYobis9aSsiOyIpLHI9UC5jb29raWUsUC5jb29raWU9biwhKHI9ciE9UC5jb29raWUpKXQ6e2Zvcih0PUgodCkscj0wO3I8dC5sZW5ndGg7cisrKWlmKGU9PXRbcl0pe3I9ITA7YnJlYWsgdH1yPSExfXJldHVybiByfSxHPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQ/ZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpOnR9LFY9L14od3d3XC4pP2dvb2dsZShcLmNvbT8pPyhcLlthLXpdezJ9KT8kLyxGPS8oXnxcLilkb3VibGVjbGlja1wubmV0JC9pLFg9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj1QLmNvb2tpZS5zcGxpdCgiOyIpO3Q9bmV3IFJlZ0V4cCgiXlxccyoiKyh0fHwiX2dhYyIpKyJfKFVBLVxcZCstXFxkKyk9XFxzKiguKz8pXFxzKiQiKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGE9bltyXS5tYXRjaCh0KTthJiZlLnB1c2goe2phOmFbMV0sdmFsdWU6YVsyXSx0aW1lc3RhbXA6TnVtYmVyKGFbMl0uc3BsaXQoIi4iKVsxXSl8fDB9KX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudGltZXN0YW1wLXQudGltZXN0YW1wfSksZX07ZnVuY3Rpb24gQih0LGUsbil7dmFyIHI9e307aWYoIShlPVgoZSkpfHwhZS5sZW5ndGgpcmV0dXJuIHI7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBvLGk9ZVthXS52YWx1ZS5zcGxpdCgiLiIpOyIxIiE9PWlbMF18fG4mJmkubGVuZ3RoPDN8fCFuJiYzIT09aS5sZW5ndGg/dCYmKHQubmE9ITApOk51bWJlcihpWzFdKSYmKHJbZVthXS5qYV0/dCYmKHQucGE9ITApOnJbZVthXS5qYV09W10sbz17dmVyc2lvbjppWzBdLHRpbWVzdGFtcDoxZTMqTnVtYmVyKGlbMV0pLHFhOmlbMl19LG4mJjM8aS5sZW5ndGgmJihvLmxhYmVscz1pLnNsaWNlKDMpKSxyW2VbYV0uamFdLnB1c2gobykpfXJldHVybiByfWZ1bmN0aW9uIHooKXt4YS5EKFtUXSl9ZnVuY3Rpb24gSyh0LGUsbil7Zm9yKGV0JiZjbGVhclRpbWVvdXQoZXQpLGUmJmx0KGUsbikscnQ9dCxlPWl0LGl0PVtdLG49MDtuPGUubGVuZ3RoO24rKyllW25dKHQpfWZ1bmN0aW9uIFcodCl7dDp7aWYoYXQudGVzdChQLnJlZmVycmVyKSl7dmFyIGU9UC5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKG90LCIiKTtlOnt2YXIgbj1QLnJlZmVycmVyLHI9KG49bi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCIiKSkucmVwbGFjZSgvXlteL10rLywiIikuc3BsaXQoIi8iKSxhPXJbMl07aWYoIShyPShyPSJzIj09YT9yWzNdOmEpP2RlY29kZVVSSUNvbXBvbmVudChyKTpyKSl7aWYoMD09bi5pbmRleE9mKCJ4bi0tIikpe249IiI7YnJlYWsgZX0obj1uLm1hdGNoKC8oLiopXC5jZG5cLmFtcHByb2plY3RcLm9yZ1wvPyQvKSkmJjI9PW4ubGVuZ3RoJiYocj1uWzFdLnJlcGxhY2UoLy0vZywiLiIpLnJlcGxhY2UoL1wuXC4vZywiLSIpKX1uPXI/ci5yZXBsYWNlKG90LCIiKToiIn1pZihyPSEocj1lPT09bik/ZS5zdWJzdHJpbmcoZS5sZW5ndGgtKG49Ii4iK24pLmxlbmd0aCxlLmxlbmd0aCk9PT1uOnIpe2U9ITA7YnJlYWsgdH1nKDc4KX1lPSExfXJldHVybiBlJiYhMSE9PXR9ZnVuY3Rpb24gWih0KXtzd2l0Y2godCl7ZGVmYXVsdDpjYXNlIDE6cmV0dXJuImh0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2d0bS9qcz9pZD0iO2Nhc2UgMjpyZXR1cm4iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0ifX1mdW5jdGlvbiBZKHQpe3RoaXMubmFtZT0ibGVuIix0aGlzLm1lc3NhZ2U9dCsiLTgxOTIifWZ1bmN0aW9uIEoodCxlLG4pe2lmKDA9PT1lLmxlbmd0aCluKCk7ZWxzZXt2YXIgcj1lLmNoYXJBdCgwKTtzd2l0Y2gocil7Y2FzZSJkIjpmdCgiaHR0cHM6Ly9zdGF0cy5nLmRvdWJsZWNsaWNrLm5ldC9qL2NvbGxlY3QiLHQuVSx0LG4pO2JyZWFrO2Nhc2UiZyI6ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWRzL2dhLWF1ZGllbmNlcyIsdC5nb29nbGUsbiksKGU9ZS5zdWJzdHJpbmcoMSkpJiYoL15bYS16Ll17MSw2fSQvLnRlc3QoZSk/ZHQoImh0dHBzOi8vd3d3Lmdvb2dsZS4lL2Fkcy9nYS1hdWRpZW5jZXMiLnJlcGxhY2UoIiUiLGUpLHQuZ29vZ2xlLFQpOmJ0KCJ0bGQiLCJiY2MiLGUpKTticmVhaztjYXNlIkciOmlmKHQuVil7dC5WKCJHLSIrZS5zdWJzdHJpbmcoMSkpLG4oKTticmVha31jYXNlIngiOmlmKHQuVil7dC5WKCksbigpO2JyZWFrfWRlZmF1bHQ6YnQoInhociIsImJyYyIsciksbigpfX19ZnVuY3Rpb24gUSgpe3RoaXMuTT1bXX12YXIgdHQsZXQsbnQscnQsYXQ9L15odHRwcz86XC9cL1teL10qY2RuXC5hbXBwcm9qZWN0XC5vcmdcLy8sb3Q9L14oPzp3d3dcLnxtXC58YW1wXC4pKy8saXQ9W10sc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IKCJBTVBfVE9LRU4iKTtyZXR1cm4gMTxuLmxlbmd0aD8oZyg1NSksITEpOiIkT1BUX09VVCI9PShuPWRlY29kZVVSSUNvbXBvbmVudChuWzBdfHwiIikpfHwiJEVSUk9SIj09bnx8VShlKT8oZyg2MiksITEpOmF0LnRlc3QoUC5yZWZlcnJlcil8fCIkTk9UX0ZPVU5EIiE9bj92b2lkIDAhPT1ydD8oZyg1NiksTShmdW5jdGlvbigpe3QocnQpfSwwKSwhMCk6dHQ/KGl0LnB1c2godCksITApOiIkUkVUUklFVklORyI9PW4/KGcoNTcpLE0oZnVuY3Rpb24oKXtzdCh0LGUpfSwxZTQpLCEwKToodHQ9ITAsbiYmIiQiIT1uWzBdfHwobHQoIiRSRVRSSUVWSU5HIiwzZTQpLHNldFRpbWVvdXQodXQsM2U0KSxuPSIiKSwhIWN0KG4sZSkmJihpdC5wdXNoKHQpLCEwKSk6KGcoNjgpLCExKX0sY3Q9ZnVuY3Rpb24oZSxuLHIpe2lmKCF3aW5kb3cuSlNPTilyZXR1cm4gZyg1OCksITE7dmFyIHQ9SS5YTUxIdHRwUmVxdWVzdDtpZighdClyZXR1cm4gZyg1OSksITE7dmFyIGE9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBhPyhhLm9wZW4oIlBPU1QiLChyfHwiaHR0cHM6Ly9hbXBjaWQuZ29vZ2xlLmNvbS92MS9wdWJsaXNoZXI6Z2V0Q2xpZW50SWQiKSsiP2tleT1BSXphU3lBNjVsRUhVRWl6SXNOdGxiTm8tbDJLMThkVDY4MG5zYU0iLCEwKSxhLndpdGhDcmVkZW50aWFscz0hMCxhLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsInRleHQvcGxhaW4iKSxhLm9ubG9hZD1mdW5jdGlvbigpe2lmKHR0PSExLDQ9PWEucmVhZHlTdGF0ZSl7dHJ5ezIwMCE9YS5zdGF0dXMmJihnKDYxKSxLKCIiLCIkRVJST1IiLDNlNCkpO3ZhciB0PUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3Qub3B0T3V0PyhnKDYzKSxLKCIiLCIkT1BUX09VVCIsMzE1MzZlNikpOnQuY2xpZW50SWQ/Syh0LmNsaWVudElkLHQuc2VjdXJpdHlUb2tlbiwzMTUzNmU2KTohciYmdC5hbHRlcm5hdGVVcmw/KGV0JiZjbGVhclRpbWVvdXQoZXQpLHR0PSEwLGN0KGUsbix0LmFsdGVybmF0ZVVybCkpOihnKDY0KSxLKCIiLCIkTk9UX0ZPVU5EIiwzNmU1KSl9Y2F0Y2godCl7Zyg2NSksSygiIiwiJEVSUk9SIiwzZTQpfWE9bnVsbH19LHQ9e29yaWdpblNjb3BlOiJBTVBfRUNJRF9HT09HTEUifSxlJiYodC5zZWN1cml0eVRva2VuPWUpLGEuc2VuZChKU09OLnN0cmluZ2lmeSh0KSksZXQ9TShmdW5jdGlvbigpe2coNjYpLEsoIiIsIiRFUlJPUiIsM2U0KX0sMWU0KSwhMCk6KGcoNjApLCExKX0sdXQ9ZnVuY3Rpb24oKXt0dD0hMX0sbHQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1udCl7bnQ9IiI7Zm9yKHZhciBuPXNyKCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO2lmKCQoIkFNUF9UT0tFTiIsZW5jb2RlVVJJQ29tcG9uZW50KHQpLCIvIixhLCIiLGUpKXJldHVybiB2b2lkKG50PWEpfX0kKCJBTVBfVE9LRU4iLGVuY29kZVVSSUNvbXBvbmVudCh0KSwiLyIsbnQsIiIsZSl9LGd0PWZ1bmN0aW9uKHQpe3JldHVybih0fHxsfHwiaHR0cHM6Ij09UC5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cHM6IjoiaHR0cDoiKSsiLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20ifSxodD1mdW5jdGlvbih0LGUsbil7aWYobj1ufHxULGUubGVuZ3RoPD0yMDM2KWR0KHQsZSxuKTtlbHNle2lmKCEoZS5sZW5ndGg8PTgxOTIpKXRocm93IGJ0KCJsZW4iLGUubGVuZ3RoKSxuZXcgWShlLmxlbmd0aCk7bXQodCxlLG4pfHxwdCh0LGUsbil8fGR0KHQsZSxuKX19LGZ0PWZ1bmN0aW9uKHQsZSxuLHIpe3B0KHQrIj8iK2UsIiIscj1yfHxULG4pfSxkdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9RSh0KyI/IitlKTtyLm9ubG9hZD1yLm9uZXJyb3I9ZnVuY3Rpb24oKXtyLm9ubG9hZD1udWxsLHIub25lcnJvcj1udWxsLG4oKX19LHB0PWZ1bmN0aW9uKG4scixvLGkpe3ZhciB0PXt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csIlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e3JldHVybiB0JiZ7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIlhNTEh0dHBSZXF1ZXN0IixhLlhNTEh0dHBSZXF1ZXN0KSxmdW5jdGlvbigpe3ZhciB0PUkuWE1MSHR0cFJlcXVlc3Q7aWYoIXQpcmV0dXJuITE7dmFyIGU9bmV3IHQ7cmV0dXJuIndpdGhDcmVkZW50aWFscyJpbiBlJiYobj1uLnJlcGxhY2UoL15odHRwOi8sImh0dHBzOiIpLGUub3BlbigiUE9TVCIsbiwhMCksZS53aXRoQ3JlZGVudGlhbHM9ITAsZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJ0ZXh0L3BsYWluIiksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT1lLnJlYWR5U3RhdGUpe2lmKGkmJiJ0ZXh0L3BsYWluIj09PWUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKXRyeXt2dChpLGUucmVzcG9uc2VUZXh0LG8pfWNhdGNoKHQpe2J0KCJ4aHIiLCJyc3AiKSxvKCl9ZWxzZSBvKCk7ZT1udWxsfX0sZS5zZW5kKHIpLCEwKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dCYme30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCJYTUxIdHRwUmVxdWVzdCIsdCl9fSx2dD1mdW5jdGlvbih0LGUsbil7aWYoZS5sZW5ndGg8MSlidCgieGhyIiwidmVyIiwiMCIpLG4oKTtlbHNlIGlmKDM8dC5jb3VudCsrKWJ0KCJ4aHIiLCJ0bXIiLCIiK3QuY291bnQpLG4oKTtlbHNle3ZhciByPWUuY2hhckF0KDApO2lmKCIxIj09PXIpSih0LGUuc3Vic3RyaW5nKDEpLG4pO2Vsc2UgaWYodC5WJiYiMiI9PT1yKXt2YXIgYT1lLnN1YnN0cmluZygxKS5zcGxpdCgiLCIpLG89MDtmb3IoZT1mdW5jdGlvbigpeysrbz09PWEubGVuZ3RoJiZuKCl9LHI9MDtyPGEubGVuZ3RoO3IrKylKKHQsYVtyXSxlKX1lbHNlIGJ0KCJ4aHIiLCJ2ZXIiLFN0cmluZyhlLmxlbmd0aCkpLG4oKX19LG10PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIUkubmF2aWdhdG9yLnNlbmRCZWFjb24mJighIUkubmF2aWdhdG9yLnNlbmRCZWFjb24odCxlKSYmKG4oKSwhMCkpfSxidD1mdW5jdGlvbih0LGUsbil7MTw9MTAwKk1hdGgucmFuZG9tKCl8fFUoIj8iKXx8KHQ9WyJ0PWVycm9yIiwiX2U9Iit0LCJfdj1qOTYiLCJzcj0xIl0sZSYmdC5wdXNoKCJfZj0iK2UpLG4mJnQucHVzaCgiX209Iit4KG4uc3Vic3RyaW5nKDAsMTAwKSkpLHQucHVzaCgiYWlwPTEiKSx0LnB1c2goIno9IitBdCgpKSxkdChndCghMCkrIi91L2QiLHQuam9pbigiJiIpLFQpKX0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nYURhdGE9SS5nYURhdGF8fHt9fSx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCgpO3JldHVybiBlW3RdPWVbdF18fHt9fTtmdW5jdGlvbiBfdCh0KXtpZigxMDAhPXQuZ2V0KENuKSYmbyhQdCh0LGhuKSklMWU0Pj0xMDAqTXQodCxDbikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE90KHQpe2lmKFUoUHQodCx2bikpKXRocm93ImFib3J0In1mdW5jdGlvbiBFdCgpe3ZhciB0PVAubG9jYXRpb24ucHJvdG9jb2w7aWYoImh0dHA6IiE9dCYmImh0dHBzOiIhPXQpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIFR0KG4pe3RyeXtJLm5hdmlnYXRvci5zZW5kQmVhY29uP2coNDIpOkkuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IEkuWE1MSHR0cFJlcXVlc3QmJmcoNDApfWNhdGNoKHQpe31uLnNldChWZSx3KG4pLCEwKSxuLnNldCh0ZSxNdChuLHRlKSsxKTt2YXIgcj1bXTtHdC5tYXAoZnVuY3Rpb24odCxlKXtlLkYmJihudWxsIT0odD1uLmdldCh0KSkmJnQhPWUuZGVmYXVsdFZhbHVlJiYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHQqPTEpLHIucHVzaChlLkYrIj0iK3goIiIrdCkpKSl9KSwhMT09PW4uZ2V0KHRyKSYmci5wdXNoKCJucGE9MSIpLHIucHVzaCgiej0iK2UoKSksbi5zZXQoWXQsci5qb2luKCImIiksITApfWZ1bmN0aW9uIHh0KHQpe3ZhciBlPVB0KHQsUXQpOyFlJiZ0LmdldChKdCkmJihlPSJiZWFjb24iKTt2YXIgbj1QdCh0LEtuKSxyPVB0KHQsVW4pLGE9bnx8KHJ8fGd0KCExKSsiIikrIi9jb2xsZWN0IjsiZCI9PT1QdCh0LEpuKT8oYT1ufHwocnx8Z3QoITEpKyIiKSsiL2ovY29sbGVjdCIsZT10LmdldChZbil8fHZvaWQgMCxmdChhLFB0KHQsWXQpLGUsdC5aKFp0KSkpOmU/KG49UHQodCxZdCkscj0ocj10LlooWnQpKXx8VCwiaW1hZ2UiPT1lP2R0KGEsbixyKToieGhyIj09ZSYmcHQoYSxuLHIpfHwiYmVhY29uIj09ZSYmbXQoYSxuLHIpfHxodChhLG4scikpOmh0KGEsUHQodCxZdCksdC5aKFp0KSksYT1QdCh0LHZuKSxlPShhPXl0KGEpKS5oaXRjb3VudCxhLmhpdGNvdW50PWU/ZSsxOjEsYS5maXJzdF9oaXR8fChhLmZpcnN0X2hpdD0obmV3IERhdGUpLmdldFRpbWUoKSksYT1QdCh0LHZuKSxkZWxldGUgeXQoYSkucGVuZGluZ19leHBlcmltZW50cyx0LnNldChadCxULCEwKX1mdW5jdGlvbiBrdCh0KXt3dCgpLmV4cElkJiZ0LnNldChMZSx3dCgpLmV4cElkKSx3dCgpLmV4cFZhciYmdC5zZXQoSWUsd3QoKS5leHBWYXIpO3ZhciBlPVB0KHQsdm4pO2lmKGU9eXQoZSkucGVuZGluZ19leHBlcmltZW50cyl7dmFyIG49W107Zm9yKHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiZlW3JdJiZuLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHIpKyIuIitlbmNvZGVVUklDb21wb25lbnQoZVtyXSkpO3ZhciByPW4uam9pbigiISIpfWVsc2Ugcj12b2lkIDA7ciYmKChlPXQuZ2V0KFBlKSkmJihyPWUrIiEiK3IpLHQuc2V0KFBlLHIsITApKX1mdW5jdGlvbiBTdCgpe2lmKEkubmF2aWdhdG9yJiYicHJldmlldyI9PUkubmF2aWdhdG9yLmxvYWRQdXJwb3NlKXRocm93ImFib3J0In1mdW5jdGlvbiBDdCh0KXt2YXIgZT1JLmdhRGV2SWRzfHxbXTtpZih5KGUpKXt2YXIgbj10LmdldCgiJmRpZCIpO18obikmJjA8bi5sZW5ndGgmJihlPWUuY29uY2F0KG4uc3BsaXQoIiwiKSkpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspTChuLGVbcl0pfHxuLnB1c2goZVtyXSk7MCE9bi5sZW5ndGgmJnQuc2V0KCImZGlkIixuLmpvaW4oIiwiKSwhMCl9fWZ1bmN0aW9uIGp0KHQpe2lmKCF0LmdldCh2bikpdGhyb3ciYWJvcnQifWZ1bmN0aW9uIE50KHQpe3RyeXt2YXIgZSxuO3QuZ2V0KEZuKXx8KHQuc2V0KEZuLCEwKSx0LmdldCgiJmd0bSIpKXx8KGU9dm9pZCAwLChlPSEoZT0hKGU9UnQoTigiZ3RtX2RlYnVnIikpPzI6ZSkmJk8oUC5yZWZlcnJlciwiaHR0cHM6Ly90YWdhc3Npc3RhbnQuZ29vZ2xlLmNvbS8iKT8zOmUpJiZMKFAuY29va2llLnNwbGl0KCI7ICIpLCJfX1RBR19BU1NJU1RBTlQ9eCIpPzQ6ZSl8fFJ0KFAuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS10YWctYXNzaXN0YW50LXByZXNlbnQiKSkmJihlPTUpLGUmJihJWyJnb29nbGUudGFnbWFuYWdlci5kZWJ1Z3VpMi5xdWV1ZSJdfHwoSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXT1bXSxqKCJodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9kZWJ1Zy9ib290c3RyYXA/aWQ9Iit0LmdldCh2bikrIiZzcmM9TEVHQUNZJmNvbmQ9IitlKSksbj1QLmN1cnJlbnRTY3JpcHQsSVsiZ29vZ2xlLnRhZ21hbmFnZXIuZGVidWd1aTIucXVldWUiXS5wdXNoKHttZXNzYWdlVHlwZToiTEVHQUNZX0NPTlRBSU5FUl9TVEFSVElORyIsZGF0YTp7aWQ6dC5nZXQodm4pLHNjcmlwdFNvdXJjZTpuJiZuLnNyY3x8IiJ9fSkpKX1jYXRjaCh0KXt9fWZ1bmN0aW9uIFJ0KHQpe2lmKG51bGwhPXQmJjAhPT10Lmxlbmd0aCl7dD1OdW1iZXIodCk7dmFyIGU9RGF0ZS5ub3coKTtyZXR1cm4gdDxlKzNlNSYmZS05ZTU8dH19US5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuTS5wdXNoKHQpfSxRLnByb3RvdHlwZS5EPWZ1bmN0aW9uKHQpe3RyeXtmb3IodmFyIGU9MDtlPHRoaXMuTS5sZW5ndGg7ZSsrKXt2YXIgbj10LmdldCh0aGlzLk1bZV0pO24mJmYobikmJm4uY2FsbChJLHQpfX1jYXRjaCh0KXt9KGU9dC5nZXQoWnQpKSE9VCYmZihlKSYmKHQuc2V0KFp0LFQsITApLHNldFRpbWVvdXQoZSwxMCkpfTt2YXIgQXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgyMTQ3NDgzNjQ3Kk1hdGgucmFuZG9tKCkpfSxlPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50MzJBcnJheSgxKTtyZXR1cm4gSS5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLDIxNDc0ODM2NDcmdFswXX1jYXRjaCh0KXtyZXR1cm4gQXQoKX19O2Z1bmN0aW9uIEx0KHQpe3ZhciBlPU10KHQsVWUpO2lmKDUwMDw9ZSYmZygxNSksInRyYW5zYWN0aW9uIiE9KG49UHQodCxXdCkpJiYiaXRlbSIhPW4pe3ZhciBuPU10KHQsJGUpLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCksYT1NdCh0LEhlKTtpZigwPT1hJiZ0LnNldChIZSxyKSwwPChhPU1hdGgucm91bmQoMiooci1hKS8xZTMpKSYmKG49TWF0aC5taW4obithLDIwKSx0LnNldChIZSxyKSksbjw9MCl0aHJvdyJhYm9ydCI7dC5zZXQoJGUsLS1uKX10LnNldChVZSwrK2UpfWZ1bmN0aW9uIEl0KCl7dGhpcy5kYXRhPW5ldyBifUl0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9WHQodCksbj10aGlzLmRhdGEuZ2V0KHQpO3JldHVybiBlJiZudWxsPT1uJiYobj1mKGUuZGVmYXVsdFZhbHVlKT9lLmRlZmF1bHRWYWx1ZSgpOmUuZGVmYXVsdFZhbHVlKSxlJiZlLlo/ZS5aKHRoaXMsdCxuKTpufTt2YXIgUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09KHQ9dC5nZXQoZSkpPyIiOiIiK3R9LE10PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PSh0PXQuZ2V0KGUpKXx8IiI9PT10PzA6TnVtYmVyKHQpfTtJdC5wcm90b3R5cGUuWj1mdW5jdGlvbih0KXtyZXR1cm4odD10aGlzLmdldCh0KSkmJmYodCk/dDpUfSxJdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYkdCh0aGlzLHIsdFtyXSxuKTtlbHNlICR0KHRoaXMsdCxlLG4pfTtmdW5jdGlvbiBEdCh0LGUsbixyLGEpe3JldHVybiB0PW5ldyBGdCh0LGUsbixyLGEpLEd0LnNldCh0Lm5hbWUsdCksdC5uYW1lfWZ1bmN0aW9uIHF0KHQsZSl7VnQucHVzaChbbmV3IFJlZ0V4cCgiXiIrdCsiJCIpLGVdKX1mdW5jdGlvbiBVdCh0LGUsbil7cmV0dXJuIER0KHQsZSxuLHZvaWQgMCxIdCl9ZnVuY3Rpb24gSHQoKXt9dmFyICR0PWZ1bmN0aW9uKHQsZSxuLHIpe251bGwhPW4mJmU9PT12biYmYWEudGVzdChuKTt2YXIgYT1YdChlKTthJiZhLm8/YS5vKHQsZSxuLHIpOnQuZGF0YS5zZXQoZSxuLHIpfSxHdD1uZXcgYixWdD1bXSxGdD1mdW5jdGlvbih0LGUsbixyLGEpe3RoaXMubmFtZT10LHRoaXMuRj1lLHRoaXMuWj1yLHRoaXMubz1hLHRoaXMuZGVmYXVsdFZhbHVlPW59LFh0PWZ1bmN0aW9uKHQpe3ZhciBlPUd0LmdldCh0KTtpZighZSlmb3IodmFyIG49MDtuPFZ0Lmxlbmd0aDtuKyspe3ZhciByPVZ0W25dLGE9clswXS5leGVjKHQpO2lmKGEpe2U9clsxXShhKSxHdC5zZXQoZS5uYW1lLGUpO2JyZWFrfX1yZXR1cm4gZX0sQnQ9VXQoImFwaVZlcnNpb24iLCJ2IiksenQ9VXQoImNsaWVudFZlcnNpb24iLCJfdiIpO0R0KCJhbm9ueW1pemVJcCIsImFpcCIpO3ZhciBLdD1EdCgiYWRTZW5zZUlkIiwiYSIpLFd0PUR0KCJoaXRUeXBlIiwidCIpLFp0PUR0KCJoaXRDYWxsYmFjayIpLFl0PUR0KCJoaXRQYXlsb2FkIik7RHQoIm5vbkludGVyYWN0aW9uIiwibmkiKSxEdCgiY3VycmVuY3lDb2RlIiwiY3UiKSxEdCgiZGF0YVNvdXJjZSIsImRzIik7dmFyIEp0PUR0KCJ1c2VCZWFjb24iLHZvaWQgMCwhMSksUXQ9RHQoInRyYW5zcG9ydCIpO0R0KCJzZXNzaW9uQ29udHJvbCIsInNjIiwiIiksRHQoInNlc3Npb25Hcm91cCIsInNnIiksRHQoInF1ZXVlVGltZSIsInF0Iik7dmFyIHRlPUR0KCJfcyIsIl9zIik7RHQoInNjcmVlbk5hbWUiLCJjZCIpO3ZhciBlZT1EdCgibG9jYXRpb24iLCJkbCIsIiIpLG5lPUR0KCJyZWZlcnJlciIsImRyIikscmU9RHQoInBhZ2UiLCJkcCIsIiIpO0R0KCJob3N0bmFtZSIsImRoIik7dmFyIGFlPUR0KCJsYW5ndWFnZSIsInVsIiksb2U9RHQoImVuY29kaW5nIiwiZGUiKTtEdCgidGl0bGUiLCJkdCIsZnVuY3Rpb24oKXtyZXR1cm4gUC50aXRsZXx8dm9pZCAwfSkscXQoImNvbnRlbnRHcm91cChbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNnIit0WzFdKX0pO3ZhciBpZT1EdCgic2NyZWVuQ29sb3JzIiwic2QiKSxzZT1EdCgic2NyZWVuUmVzb2x1dGlvbiIsInNyIiksY2U9RHQoInZpZXdwb3J0U2l6ZSIsInZwIiksdWU9RHQoImphdmFFbmFibGVkIiwiamUiKSxsZT1EdCgiZmxhc2hWZXJzaW9uIiwiZmwiKTtEdCgiY2FtcGFpZ25JZCIsImNpIiksRHQoImNhbXBhaWduTmFtZSIsImNuIiksRHQoImNhbXBhaWduU291cmNlIiwiY3MiKSxEdCgiY2FtcGFpZ25NZWRpdW0iLCJjbSIpLER0KCJjYW1wYWlnbktleXdvcmQiLCJjayIpLER0KCJjYW1wYWlnbkNvbnRlbnQiLCJjYyIpO3ZhciBnZT1EdCgiZXZlbnRDYXRlZ29yeSIsImVjIiksaGU9RHQoImV2ZW50QWN0aW9uIiwiZWEiKSxmZT1EdCgiZXZlbnRMYWJlbCIsImVsIiksZGU9RHQoImV2ZW50VmFsdWUiLCJldiIpLHBlPUR0KCJzb2NpYWxOZXR3b3JrIiwic24iKSx2ZT1EdCgic29jaWFsQWN0aW9uIiwic2EiKSxtZT1EdCgic29jaWFsVGFyZ2V0Iiwic3QiKSxiZT1EdCgibDEiLCJwbHQiKSx3ZT1EdCgibDIiLCJwZHQiKSx5ZT1EdCgibDMiLCJkbnMiKSxfZT1EdCgibDQiLCJycnQiKSxPZT1EdCgibDUiLCJzcnQiKSxFZT1EdCgibDYiLCJ0Y3AiKSxUZT1EdCgibDciLCJkaXQiKSx4ZT1EdCgibDgiLCJjbHQiKSxrZT1EdCgibDkiLCJfZ3N0IiksU2U9RHQoImwxMCIsIl9nYnQiKSxDZT1EdCgibDExIiwiX2NzdCIpLGplPUR0KCJsMTIiLCJfY2J0IiksdD1EdCgidGltaW5nQ2F0ZWdvcnkiLCJ1dGMiKSxOZT1EdCgidGltaW5nVmFyIiwidXR2IiksUmU9RHQoInRpbWluZ0xhYmVsIiwidXRsIiksQWU9RHQoInRpbWluZ1ZhbHVlIiwidXR0Iik7RHQoImFwcE5hbWUiLCJhbiIpLER0KCJhcHBWZXJzaW9uIiwiYXYiLCIiKSxEdCgiYXBwSWQiLCJhaWQiLCIiKSxEdCgiYXBwSW5zdGFsbGVySWQiLCJhaWlkIiwiIiksRHQoImV4RGVzY3JpcHRpb24iLCJleGQiKSxEdCgiZXhGYXRhbCIsImV4ZiIpO3ZhciBMZT1EdCgiZXhwSWQiLCJ4aWQiKSxJZT1EdCgiZXhwVmFyIiwieHZhciIpLFBlPUR0KCJleHAiLCJleHAiKSxNZT1EdCgiX3V0bWEiLCJfdXRtYSIpLERlPUR0KCJfdXRteiIsIl91dG16IikscWU9RHQoIl91dG1odCIsIl91dG1odCIpLFVlPUR0KCJfaGMiLHZvaWQgMCwwKSxIZT1EdCgiX3RpIix2b2lkIDAsMCksJGU9RHQoIl90byIsdm9pZCAwLDIwKTtxdCgiZGltZW5zaW9uKFswLTldKykiLGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnQodFswXSwiY2QiK3RbMV0pfSkscXQoIm1ldHJpYyhbMC05XSspIixmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRbMF0sImNtIit0WzFdKX0pLER0KCJsaW5rZXJQYXJhbSIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbih0KXtpZih0LmdldChHZSkpcmV0dXJuIGcoMzUpLGtyLmdlbmVyYXRlKE1yKHQpKTt2YXIgZT1QdCh0LGhuKSxuPVB0KHQsUm4pfHwiIjtyZXR1cm4gZT0iX2dhPTIuIit4KE5yKG4rZSwwKSsiLiIrbisiLSIrZSksdD0odD1Ecih0KSk/KGcoNDQpLCImX2dhYz0xLiIreChbTnIodC5xYSwwKSx0LnRpbWVzdGFtcCx0LnFhXS5qb2luKCIuIikpKToiIixlK3R9LEh0KTt2YXIgR2U9VXQoIl9jZDJsIix2b2lkIDAsITEpLFZlPUR0KCJ1c2FnZSIsIl91IiksRmU9RHQoIl91bSIpO0R0KCJmb3JjZVNTTCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBsfSxmdW5jdGlvbih0LGUsbil7ZygzNCksbD0hIW59KTt2YXIgWGU9RHQoIl9qMSIsImppZCIpLEJlPUR0KCJfajIiLCJnamlkIik7cXQoIlxcJiguKikiLGZ1bmN0aW9uKHQpe3ZhciBuLHIsZT1uZXcgRnQodFswXSx0WzFdKSxhPShuPXRbMF0uc3Vic3RyaW5nKDEpLEd0Lm1hcChmdW5jdGlvbih0LGUpe2UuRj09biYmKHI9ZSl9KSxyJiZyLm5hbWUpO3JldHVybiBhJiYoZS5aPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldChhKX0sZS5vPWZ1bmN0aW9uKHQsZSxuLHIpe3Quc2V0KGEsbixyKX0sZS5GPXZvaWQgMCksZX0pO3ZhciB6ZT1VdCgiX29vdCIpLEtlPUR0KCJwcmV2aWV3VGFzayIpLFdlPUR0KCJjaGVja1Byb3RvY29sVGFzayIpLFplPUR0KCJ2YWxpZGF0aW9uVGFzayIpLFllPUR0KCJjaGVja1N0b3JhZ2VUYXNrIiksSmU9RHQoImhpc3RvcnlJbXBvcnRUYXNrIiksUWU9RHQoInNhbXBsZXJUYXNrIiksdG49RHQoIl9ybHQiKSxlbj1EdCgiYnVpbGRIaXRUYXNrIiksbm49RHQoInNlbmRIaXRUYXNrIikscm49RHQoImNlVGFzayIpLGFuPUR0KCJkZXZJZFRhc2siKSxvbj1EdCgidGltaW5nVGFzayIpLHNuPUR0KCJkaXNwbGF5RmVhdHVyZXNUYXNrIiksY249RHQoImN1c3RvbVRhc2siKSx1bj1EdCgiZnBzQ3Jvc3NEb21haW5UYXNrIiksbG49VXQoIl9jdGEiKSxnbj1VdCgibmFtZSIpLGhuPVV0KCJjbGllbnRJZCIsImNpZCIpLGZuPVV0KCJjbGllbnRJZFRpbWUiKSxkbj1VdCgic3RvcmVkQ2xpZW50SWQiKSxwbj1EdCgidXNlcklkIiwidWlkIiksdm49VXQoInRyYWNraW5nSWQiLCJ0aWQiKSxtbj1VdCgiY29va2llTmFtZSIsdm9pZCAwLCJfZ2EiKSxibj1VdCgiY29va2llRG9tYWluIiksd249VXQoImNvb2tpZVBhdGgiLHZvaWQgMCwiLyIpLHluPVV0KCJjb29raWVFeHBpcmVzIix2b2lkIDAsNjMwNzJlMyksX249VXQoImNvb2tpZVVwZGF0ZSIsdm9pZCAwLCEwKSxPbj1VdCgiY29va2llRmxhZ3MiLHZvaWQgMCwiIiksRW49VXQoImxlZ2FjeUNvb2tpZURvbWFpbiIpLFRuPVV0KCJsZWdhY3lIaXN0b3J5SW1wb3J0Iix2b2lkIDAsITApLHhuPVV0KCJzdG9yYWdlIix2b2lkIDAsImNvb2tpZSIpLGtuPVV0KCJhbGxvd0xpbmtlciIsdm9pZCAwLCExKSxTbj1VdCgiYWxsb3dBbmNob3IiLHZvaWQgMCwhMCksQ249VXQoInNhbXBsZVJhdGUiLCJzZiIsMTAwKSxqbj1VdCgic2l0ZVNwZWVkU2FtcGxlUmF0ZSIsdm9pZCAwLDEpLE5uPVV0KCJhbHdheXNTZW5kUmVmZXJyZXIiLHZvaWQgMCwhMSksUm49VXQoIl9naWQiLCJfZ2lkIiksQW49VXQoIl9nY24iKSxMbj1VdCgidXNlQW1wQ2xpZW50SWQiKSxJbj1VdCgiX2djbGlkIiksUG49VXQoIl9ndCIpLE1uPVV0KCJfZ2UiLHZvaWQgMCw3Nzc2ZTYpLERuPVV0KCJfZ2Nsc3JjIikscW49VXQoInN0b3JlR2FjIix2b2lkIDAsITApLFVuPUR0KCJfeF8xOSIpLEhuPUR0KCJfZnBsYyIsIl9mcGxjIiksJG49VXQoIl9jcyIpLEduPVV0KCJfdXNlVXAiLHZvaWQgMCwhMSksVm49RHQoInVwIiwidXAiKSxGbj1EdCgiX3RhYyIsdm9pZCAwLCExKSxYbj1VdCgiX2dicmFpZCIpLEJuPVV0KCJfZ2J0Iiksem49VXQoIl9nYmUiLHZvaWQgMCw3Nzc2ZTYpLEtuPUR0KCJ0cmFuc3BvcnRVcmwiKSxXbj1EdCgiX3IiLCJfciIpLFpuPUR0KCJfc2xjIiwiX3NsYyIpLFluPUR0KCJfZHAiKSxKbj1EdCgiX2p0Iix2b2lkIDAsIm4iKSxRbj1EdCgiYWxsb3dBZEZlYXR1cmVzIix2b2lkIDAsITApLHRyPUR0KCJhbGxvd0FkUGVyc29uYWxpemF0aW9uU2lnbmFscyIsdm9pZCAwLCEwKTtmdW5jdGlvbiBlcihlLHQsbixyKXt0W2VdPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByJiZnKHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IGJ0KCJleGMiLGUsdCYmdC5uYW1lKSx0fX19ZnVuY3Rpb24gbnIodCl7dmFyIGU7KGU9KGU9UHQodCxVbikmJnQuZ2V0KEdlKSk/ISgoZT1rci5nZXQodC5nZXQoU24pKSkmJmUuX2ZwbGMpOmUpJiYhY3IodCkmJnQuc2V0KEhuLCIwIil9ZnVuY3Rpb24gcnIodCxlKXt2YXIgbj10W2VdOyhpc05hTihuKXx8MS8wPT1ufHxuPDApJiYodFtlXT12b2lkIDApfWZ1bmN0aW9uIGFyKHQpe2lmKCJjb29raWUiPT1QdCh0LHhuKSYmIWdyJiYoaHIodCksIWdyKSl0aHJvdyJhYm9ydCJ9ZnVuY3Rpb24gb3IodCl7dmFyIGUsbixyO3QuZ2V0KFRuKSYmKGU9UHQodCxibiksKHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLGUpKSYmKGcoMTkpLHQuc2V0KHFlLChuZXcgRGF0ZSkuZ2V0VGltZSgpLCEwKSx0LnNldChNZSxyLlIpLChlPUVyKCJfX3V0bXoiLG4sZSkpJiZyLmhhc2g9PWUuaGFzaCYmdC5zZXQoRGUsZS5SKSkpfWZ1bmN0aW9uIGlyKHQsZSl7ZT1HKFB0KHQsZSkpO3ZhciBuPWJyKFB0KHQsYm4pKS5zcGxpdCgiLiIpLmxlbmd0aDtyZXR1cm4gMTwodD15cihQdCh0LHduKSkpJiYobis9Ii0iK3QpLGU/WyJHQTEiLG4sZV0uam9pbigiLiIpOiIifWZ1bmN0aW9uIHNyKCl7dmFyIHQ9W10sZT1BKCkuc3BsaXQoIi4iKTtpZig0PT1lLmxlbmd0aCl7dmFyIG49ZVtlLmxlbmd0aC0xXTtpZihwYXJzZUludChuLDEwKT09bilyZXR1cm5bIm5vbmUiXX1mb3Iobj1lLmxlbmd0aC0yOzA8PW47bi0tKXQucHVzaChlLnNsaWNlKG4pLmpvaW4oIi4iKSk7cmV0dXJuIGU9UC5sb2NhdGlvbi5ob3N0bmFtZSxGLnRlc3QoZSl8fFYudGVzdChlKXx8dC5wdXNoKCJub25lIiksdH12YXIgY3I9ZnVuY3Rpb24odCl7aWYoImNvb2tpZSI9PXQuZ2V0KHhuKSlyZXR1cm4gMDwodD1IKCJGUExDIikpLmxlbmd0aD90WzBdOnZvaWQgMH0sdXI9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5taW4oTXQodCxqbiksMTAwKTtyZXR1cm4hKG8oUHQodCxobikpJTEwMD49ZSl9LGxyPWZ1bmN0aW9uKHQpe3ZhciBlLG49e307KGZ1bmN0aW9uKHQpe3ZhciBlPUkucGVyZm9ybWFuY2V8fEkud2Via2l0UGVyZm9ybWFuY2UsZTtpZighKGU9ZSYmZS50aW1pbmcpKXJldHVybiExO3ZhciBuPWUubmF2aWdhdGlvblN0YXJ0O3JldHVybiAwPT1uPyExOih0W2JlXT1lLmxvYWRFdmVudFN0YXJ0LW4sdFt5ZV09ZS5kb21haW5Mb29rdXBFbmQtZS5kb21haW5Mb29rdXBTdGFydCx0W0VlXT1lLmNvbm5lY3RFbmQtZS5jb25uZWN0U3RhcnQsdFtPZV09ZS5yZXNwb25zZVN0YXJ0LWUucmVxdWVzdFN0YXJ0LHRbd2VdPWUucmVzcG9uc2VFbmQtZS5yZXNwb25zZVN0YXJ0LHRbX2VdPWUuZmV0Y2hTdGFydC1uLHRbVGVdPWUuZG9tSW50ZXJhY3RpdmUtbix0W3hlXT1lLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LW4sdFtrZV09a2EuTC1uLHRbU2VdPWthLnlhLW4sSS5nb29nbGVfdGFnX21hbmFnZXImJkkuZ29vZ2xlX3RhZ19tYW5hZ2VyLl9saSYmKGU9SS5nb29nbGVfdGFnX21hbmFnZXIuX2xpLHRbQ2VdPWUuY3N0LHRbamVdPWUuY2J0KSwhMCl9KG4pfHxmdW5jdGlvbih0KXtpZihJLnRvcCE9SSlyZXR1cm4hMTt2YXIgZT1JLmV4dGVybmFsLG49ZSYmZS5vbmxvYWRUO3JldHVybigwPChuPTIxNDc0ODM2NDg8KG49ZSYmIWUuaXNWYWxpZExvYWRUaW1lP3ZvaWQgMDpuKT92b2lkIDA6bikmJmUuc2V0UGFnZVJlYWR5VGltZSgpLG51bGw9PW4pPyExOih0W2JlXT1uLCEwKX0obikpJiYobnVsbD09KGU9bltiZV0pfHwxLzA9PWV8fGlzTmFOKGUpfHwoMDxlPyhycihuLHllKSxycihuLEVlKSxycihuLE9lKSxycihuLHdlKSxycihuLF9lKSxycihuLFRlKSxycihuLHhlKSxycihuLGtlKSxycihuLFNlKSxycihuLENlKSxycihuLGplKSxNKGZ1bmN0aW9uKCl7dChuKX0sMTApKTpwKEksImxvYWQiLGZ1bmN0aW9uKCl7bHIodCl9LCExKSkpfSxncj0hMSxocj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsYSxvLGkscyxjLHU7ImNvb2tpZSI9PVB0KHQseG4pJiYoIXQuZ2V0KF9uKSYmUHQodCxkbik9PVB0KHQsaG4pfHwoZT0xZTMqTXQodCx5biksZnIodCxobixtbixlKSx0LmRhdGEuc2V0KGRuLFB0KHQsaG4pKSksIXQuZ2V0KF9uKSYmZHIodCk9PVB0KHQsUm4pfHxmcih0LFJuLEFuLDg2NGU1KSx0LmdldChxbik/KGU9UHQodCxJbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCxNbiksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LFBuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KE1uLG4pLHI9e30sYT1QdCh0LFBuKSxvPVB0KHQsRG4pLGk9d3IoUHQodCx3bikpLHM9YnIoUHQodCxibikpLGM9UHQodCx2biksdT1QdCh0LE9uKSxvJiYiYXcuZHMiIT1vP3ImJihyLnVhPSEwKTooZT1bIjEiLGEsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY18iK0coYyksZSxpLHMsYyxuLHUpKSksX3IocikpOmcoNzUpLHQuZ2V0KHFuKSYmKGU9UHQodCxYbikpJiYobj0wPT09KG49TWF0aC5taW4oTXQodCx6biksMWUzKk10KHQseW4pKSk/MDpNYXRoLm1pbihuLDFlMypNdCh0LEJuKStuLShuZXcgRGF0ZSkuZ2V0VGltZSgpKSx0LmRhdGEuc2V0KHpuLG4pLHI9e30sdT1QdCh0LEJuKSxpPXdyKFB0KHQsd24pKSxzPWJyKFB0KHQsYm4pKSxjPVB0KHQsdm4pLHQ9UHQodCxPbiksZT1bIjEiLHUsRyhlKV0uam9pbigiLiIpLDA8PW4mJihyJiYoci50YT0hMCksJCgiX2dhY19nYl8iK0coYyksZSxpLHMsYyxuLHQpKSxPcihyKSkpfSxmcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgYT1pcih0LGUpO2lmKGEpe249UHQodCxuKTt2YXIgbz13cihQdCh0LHduKSksaT1icihQdCh0LGJuKSkscz1QdCh0LE9uKSxjPVB0KHQsdm4pO2lmKCJhdXRvIiE9aSkkKG4sYSxvLGksYyxyLHMpJiYoZ3I9ITApO2Vsc2V7ZygzMik7Zm9yKHZhciB1PXNyKCksbD0wO2w8dS5sZW5ndGg7bCsrKWlmKGk9dVtsXSx0LmRhdGEuc2V0KGJuLGkpLGE9aXIodCxlKSwkKG4sYSxvLGksYyxyLHMpKXJldHVybiB2b2lkKGdyPSEwKTt0LmRhdGEuc2V0KGJuLCJhdXRvIil9fX0sZHI9ZnVuY3Rpb24odCl7dmFyIGU9SChQdCh0LEFuKSk7cmV0dXJuIHByKHQsZSl9LHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZyKGUsUHQodCxibiksUHQodCx3bikpfSx2cj1mdW5jdGlvbih0LGUsbil7aWYodCYmISh0Lmxlbmd0aDwxKSl7Zm9yKHZhciByPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxpPW8uc3BsaXQoIi4iKSxzPWkuc2hpZnQoKTsoaT0oIkdBMSI9PXN8fCIxIj09cykmJjE8aS5sZW5ndGg/KDE9PShvPWkuc2hpZnQoKS5zcGxpdCgiLSIpKS5sZW5ndGgmJihvWzFdPSIxIiksb1swXSo9MSxvWzFdKj0xLHtIOm8sczppLmpvaW4oIi4iKX0pOnUudGVzdChvKT97SDpbMCwwXSxzOm99OnZvaWQgMCkmJnIucHVzaChpKX1yZXR1cm4gMT09ci5sZW5ndGg/KGcoMTMpLHJbMF0ucyk6MCE9ci5sZW5ndGg/KGcoMTQpLDE9PShyPW1yKHIsYnIoZSkuc3BsaXQoIi4iKS5sZW5ndGgsMCkpLmxlbmd0aD9yWzBdLnM6KDE8KHI9bXIocix5cihuKSwxKSkubGVuZ3RoJiZnKDQxKSxyWzBdJiZyWzBdLnMpKTp2b2lkIGcoMTIpfWcoMTIpfSxtcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGE9W10sbz1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBzPXRbaV07cy5IW25dPT1lP2EucHVzaChzKTpudWxsPT1yfHxzLkhbbl08cj8obz1bc10scj1zLkhbbl0pOnMuSFtuXT09ciYmby5wdXNoKHMpfXJldHVybiAwPGEubGVuZ3RoP2E6b30sYnI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PXQuaW5kZXhPZigiLiIpP3Quc3Vic3RyKDEpOnR9LHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0PzAhPSh0PTE8dC5sZW5ndGgmJnQubGFzdEluZGV4T2YoIi8iKT09dC5sZW5ndGgtMT90LnN1YnN0cigwLHQubGVuZ3RoLTEpOnQpLmluZGV4T2YoIi8iKT8iLyIrdDp0OiIvIn0seXI9ZnVuY3Rpb24odCl7cmV0dXJuIi8iPT0odD13cih0KSk/MTp0LnNwbGl0KCIvIikubGVuZ3RofSxfcj1mdW5jdGlvbih0KXt0LnRhJiZnKDc3KSx0Lm5hJiZnKDc0KSx0LnBhJiZnKDczKSx0LnVhJiZnKDY5KX0sT3I9ZnVuY3Rpb24odCl7dC50YSYmZyg4NSksdC5uYSYmZyg4NiksdC5wYSYmZyg4Nyl9O2Z1bmN0aW9uIEVyKHQsZSxuKXsibm9uZSI9PWUmJihlPSIiKTt2YXIgcj1bXSxhPUgodCk7dD0iX191dG1hIj09dD82OjI7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspe3ZhciBpPSgiIithW29dKS5zcGxpdCgiLiIpO2kubGVuZ3RoPj10JiZyLnB1c2goe2hhc2g6aVswXSxSOmFbb10sTzppfSl9aWYoMCE9ci5sZW5ndGgpcmV0dXJuIDEhPXIubGVuZ3RoJiYoVHIoZSxyKXx8VHIobixyKXx8VHIobnVsbCxyKSl8fHJbMF19ZnVuY3Rpb24gVHIodCxlKXt2YXIgbjtudWxsPT10P249dD0xOihuPW8odCksdD1vKE8odCwiLiIpP3Quc3Vic3RyaW5nKDEpOiIuIit0KSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5oYXNoPT1ufHxlW3JdLmhhc2g9PXQpcmV0dXJuIGVbcl19dmFyIHhyPW5ldyBSZWdFeHAoL15odHRwcz86XC9cLyhbXlwvOl0rKS8pLGtyPUkuZ29vZ2xlX3RhZ19kYXRhLmdsQnJpZGdlLFNyPVJlZ0V4cCgiKC4qKShbPyYjXSkoPzpfZ2E9W14mI10qKSg/OiY/KSguKikiKSxDcj1SZWdFeHAoIiguKikoWz8mI10pKD86X2dhYz1bXiYjXSopKD86Jj8pKC4qKSIpO2Z1bmN0aW9uIGpyKHQsZSl7dmFyIG49bmV3IERhdGUscj1JLm5hdmlnYXRvcixhPXIucGx1Z2luc3x8W107Zm9yKHQ9W3Qsci51c2VyQWdlbnQsbi5nZXRUaW1lem9uZU9mZnNldCgpLG4uZ2V0WWVhcigpLG4uZ2V0RGF0ZSgpLG4uZ2V0SG91cnMoKSxuLmdldE1pbnV0ZXMoKStlXSxlPTA7ZTxhLmxlbmd0aDsrK2UpdC5wdXNoKGFbZV0uZGVzY3JpcHRpb24pO3JldHVybiBvKHQuam9pbigiLiIpKX1mdW5jdGlvbiBOcih0LGUpe3ZhciBuPW5ldyBEYXRlLHI9SS5uYXZpZ2F0b3IsYT1uLmdldEhvdXJzKCkrTWF0aC5mbG9vcigobi5nZXRNaW51dGVzKCkrZSkvNjApO3JldHVybiBvKFt0LHIudXNlckFnZW50LHIubGFuZ3VhZ2V8fCIiLG4uZ2V0VGltZXpvbmVPZmZzZXQoKSxuLmdldFllYXIoKSxuLmdldERhdGUoKStNYXRoLmZsb29yKGEvMjQpLCgyNCthKSUyNCwoNjArbi5nZXRNaW51dGVzKCkrZSklNjBdLmpvaW4oIi4iKSl9ZnVuY3Rpb24gUnIodCl7Zyg0OCksdGhpcy50YXJnZXQ9dCx0aGlzLlQ9ITF9UnIucHJvdG90eXBlLmNhPWZ1bmN0aW9uKHQsZSl7aWYodCl7aWYodGhpcy50YXJnZXQuZ2V0KEdlKSlyZXR1cm4ga3IuZGVjb3JhdGUoTXIodGhpcy50YXJnZXQpLHQsZSk7aWYodC50YWdOYW1lKXtpZigiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB2b2lkKHQuaHJlZiYmKHQuaHJlZj1Bcih0aGlzLHQuaHJlZixlKSkpO2lmKCJmb3JtIj09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIExyKHRoaXMsdCl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0FyKHRoaXMsdCxlKTp2b2lkIDB9fTt2YXIgQXI9ZnVuY3Rpb24odCxlLG4peyhyPVNyLmV4ZWMoZSkpJiYzPD1yLmxlbmd0aCYmKGU9clsxXSsoclszXT9yWzJdK3JbM106IiIpKSwocj1Dci5leGVjKGUpKSYmMzw9ci5sZW5ndGgmJihlPXJbMV0rKHJbM10/clsyXStyWzNdOiIiKSksdD10LnRhcmdldC5nZXQoImxpbmtlclBhcmFtIik7dmFyIHI9ZS5pbmRleE9mKCI/IiksYT1lLmluZGV4T2YoIiMiKTtyZXR1cm4oZT0oZT1uP2UrKC0xPT1hPyIjIjoiJiIpK3Q6LTE9PWE/ZSsoLTE9PT1yPyI/IjoiJiIpK3Q6ZS5zdWJzdHJpbmcoMCxhKSsoLTE9PT1yfHxhPHI/Ij8iOiImIikrdCtlLnN1YnN0cmluZyhhKSkucmVwbGFjZSgvJitfZ2E9LywiJl9nYT0iKSkucmVwbGFjZShSZWdFeHAoIiYrX2dhYz0iKSwiJl9nYWM9Iil9LExyPWZ1bmN0aW9uKHQsZSl7aWYoZSYmZS5hY3Rpb24paWYoImdldCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkpe3Q9dC50YXJnZXQuZ2V0KCJsaW5rZXJQYXJhbSIpLnNwbGl0KCImIik7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0oYT10W25dLnNwbGl0KCI9IikpWzFdLGE9YVswXSxvPWUuY2hpbGROb2Rlc3x8W10saT0hMSxzPTA7czxvLmxlbmd0aDtzKyspaWYob1tzXS5uYW1lPT1hKXtvW3NdLnNldEF0dHJpYnV0ZSgidmFsdWUiLHIpLGk9ITA7YnJlYWt9aXx8KChvPVAuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLGEpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsciksZS5hcHBlbmRDaGlsZChvKSl9fWVsc2UicG9zdCI9PWUubWV0aG9kLnRvTG93ZXJDYXNlKCkmJihlLmFjdGlvbj1Bcih0LGUuYWN0aW9uKSl9O2Z1bmN0aW9uIElyKHQsZSl7aWYoZSE9UC5sb2NhdGlvbi5ob3N0bmFtZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25daW5zdGFuY2VvZiBSZWdFeHApe2lmKHRbbl0udGVzdChlKSlyZXR1cm4gMX1lbHNlIGlmKDA8PWUuaW5kZXhPZih0W25dKSlyZXR1cm4gMX1mdW5jdGlvbiBQcih0LGUpe3JldHVybiBlIT1qcih0LDApJiZlIT1qcih0LC0xKSYmZSE9anIodCwtMikmJmUhPU5yKHQsMCkmJmUhPU5yKHQsLTEpJiZlIT1Ocih0LC0yKX1mdW5jdGlvbiBNcih0KXt2YXIgZT1Ecih0KSxuPXt9O3JldHVybiBuLl9nYT10LmdldChobiksbi5fZ2lkPXQuZ2V0KFJuKXx8dm9pZCAwLG4uX2dhYz1lP1tlLnFhLGUudGltZXN0YW1wXS5qb2luKCIuIik6dm9pZCAwLGU9dC5nZXQoSG4pLHQ9Y3IodCksbi5fZnBsYz1lJiYiMCIhPT1lP2U6dCxufWZ1bmN0aW9uIERyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG51bGw9PXR8fCIiPT09dD8wOk51bWJlcih0KX12YXIgbj10LmdldChJbik7aWYobiYmdC5nZXQocW4pKXt2YXIgcj1lKHQuZ2V0KFBuKSk7aWYoISgxZTMqcitlKHQuZ2V0KE1uKSk8PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSlyZXR1cm57dGltZXN0YW1wOnIscWE6bn07Zyg3Nil9fVJyLnByb3RvdHlwZS5TPWZ1bmN0aW9uKHIsYSx0KXtmdW5jdGlvbiBlKHQpe3RyeXt0PXR8fEkuZXZlbnQ7dDp7dmFyIGU9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtmb3IodD0xMDA7ZSYmMDx0Oyl7aWYoZS5ocmVmJiZlLm5vZGVOYW1lLm1hdGNoKC9eYSg/OnJlYSk/JC9pKSl7dmFyIG49ZTticmVhayB0fWU9ZS5wYXJlbnROb2RlLHQtLX1uPXt9fSgiaHR0cDoiPT1uLnByb3RvY29sfHwiaHR0cHM6Ij09bi5wcm90b2NvbCkmJklyKHIsbi5ob3N0bmFtZXx8IiIpJiZuLmhyZWYmJihuLmhyZWY9QXIobyxuLmhyZWYsYSkpfWNhdGNoKHQpe2coMjYpfX12YXIgbz10aGlzO3RoaXMudGFyZ2V0LmdldChHZSk/a3IuYXV0byhmdW5jdGlvbigpe3JldHVybiBNcihvLnRhcmdldCl9LHIsYT8iZnJhZ21lbnQiOiIiLHQpOih0aGlzLlR8fCh0aGlzLlQ9ITAscChQLCJtb3VzZWRvd24iLGUsITEpLHAoUCwia2V5dXAiLGUsITEpKSx0JiZwKFAsInN1Ym1pdCIsZnVuY3Rpb24odCl7dmFyIGU7KHQ9KHQ9dHx8SS5ldmVudCkudGFyZ2V0fHx0LnNyY0VsZW1lbnQpJiZ0LmFjdGlvbiYmKChlPXQuYWN0aW9uLm1hdGNoKHhyKSkmJklyKHIsZVsxXSkmJkxyKG8sdCkpfSkpfSxSci5wcm90b3R5cGUuJD1mdW5jdGlvbih0KXt2YXIgZSxuOyF0fHx2b2lkIDAhPT0obj0oZT10aGlzKS50YXJnZXQuZ2V0KCRuKSkmJmtyLnBhc3N0aHJvdWdoKGZ1bmN0aW9uKCl7aWYobigiYW5hbHl0aWNzX3N0b3JhZ2UiKSlyZXR1cm57fTt2YXIgdD17fTtyZXR1cm4gdC5fZ2E9ZS50YXJnZXQuZ2V0KGhuKSx0Ll91cD0iMSIsdH0sMSwhMCl9O2Z1bmN0aW9uIHFyKHQsZSxuLHIpe249bnx8e307dmFyIGE9MSxvPXtpZDplLHR5cGU6YT1Wci50ZXN0KGUpPzI6YSxCOm4uZGF0YUxheWVyfHwiZGF0YUxheWVyIixHOiExfSxpPXZvaWQgMDtyZXR1cm4gdC5nZXQoIiZndG0iKT09ZSYmKG8uRz0hMCksMT09PWE/KG8uaWE9ISF0LmdldCgiYW5vbnltaXplSXAiKSxvLnN5bmM9ciwidDAiIT0oZT1TdHJpbmcodC5nZXQoIm5hbWUiKSkpJiYoby50YXJnZXQ9ZSksVShTdHJpbmcodC5nZXQoInRyYWNraW5nSWQiKSkpfHwoby5jbGllbnRJZD1TdHJpbmcodC5nZXQoaG4pKSxvLmthPU51bWJlcih0LmdldChmbikpLG49bi5wYWxpbmRyb21lP1hyOkZyLG49KG49UC5jb29raWUucmVwbGFjZSgvXnwoOyArKS9nLCI7IikubWF0Y2gobikpP24uc29ydCgpLmpvaW4oIiIpLnN1YnN0cmluZygxKTp2b2lkIDAsby5sYT1uLG8ucWE9UihQdCh0LGVlKSwiZ2NsaWQiKSkpOjI9PT1hJiYoby5jb250ZXh0PSJjIixpPXthbGxvd19nb29nbGVfc2lnbmFsczp0LmdldChRbiksYWxsb3dfYWRfcGVyc29uYWxpemF0aW9uX3NpZ25hbHM6dC5nZXQodHIpfSksS3IobyxpKSx6cihvKX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuLHI7KHQ9dC5tb2RlbCkuZ2V0KCJkY0xvYWRlZCIpfHwoKG49bmV3IGkoaCh0KSkpLnNldCgyOSksdC5zZXQoRmUsbi5DKSwoZT1lfHx7fSlbbW5dJiYocj1HKGVbbW5dKSksZnVuY3Rpb24obix0KXt2YXIgcj10LmdldChlbik7dC5zZXQoZW4sZnVuY3Rpb24odCl7WXIobix0LFhlKSxZcihuLHQsQmUpO3ZhciBlPXIodCk7cmV0dXJuIEpyKG4sdCksZX0pO3ZhciBhPXQuZ2V0KG5uKTt0LnNldChubixmdW5jdGlvbih0KXt2YXIgZSxuPWEodCk7cmV0dXJuIFFyKHQpJiYoZyg4MCksZT17VTplYSh0LDEpLGdvb2dsZTplYSh0LDIpLGNvdW50OjB9LGZ0KCJodHRwczovL3N0YXRzLmcuZG91YmxlY2xpY2submV0L2ovY29sbGVjdCIsZS5VLGUpLHQuc2V0KFhlLCIiLCEwKSksbn0pfShlPW5ldyBacih0LHIpLHQpLHQuc2V0KCJkY0xvYWRlZCIsITApKX1mdW5jdGlvbiBIcih0KXt2YXIgZSxuO3QuZ2V0KCJkY0xvYWRlZCIpfHwiY29va2llIiE9dC5nZXQoeG4pfHwoZT1uZXcgWnIodCksWXIoZSx0LFhlKSxZcihlLHQsQmUpLEpyKGUsdCksZT1Rcih0KSxuPXRhKHQpLGUmJnQuc2V0KFduLDEsITApLG4mJnQuc2V0KFpuLDEsITApLChlfHxuKSYmKHQuc2V0KEpuLCJkIiwhMCksZyg3OSksdC5zZXQoWW4se1U6ZWEodCwxKSxnb29nbGU6ZWEodCwyKSxWOm5hKHQpLGNvdW50OjB9LCEwKSkpfWZ1bmN0aW9uICRyKHQpe2Z1bmN0aW9uIG4odCxlKXtvLm1vZGVsLmRhdGEuc2V0KHQsZSl9ZnVuY3Rpb24gZSh0LGUpe24odCxlKSxvLmZpbHRlcnMuYWRkKHQpfXZhciByLGEsbz10aGlzO3RoaXMubW9kZWw9bmV3IEl0LHRoaXMuZmlsdGVycz1uZXcgUSxuKGduLHRbZ25dKSxuKHZuLChyPXRbdm5dKT9yLnJlcGxhY2UoL15bXHNceGEwXSt8W1xzXHhhMF0rJC9nLCIiKToiIiksbihtbix0W21uXSksbihibix0W2JuXXx8QSgpKSxuKHduLHRbd25dKSxuKHluLHRbeW5dKSxuKF9uLHRbX25dKSxuKE9uLHRbT25dKSxuKEVuLHRbRW5dKSxuKFRuLHRbVG5dKSxuKGtuLHRba25dKSxuKFNuLHRbU25dKSxuKENuLHRbQ25dKSxuKGpuLHRbam5dKSxuKE5uLHRbTm5dKSxuKHhuLHRbeG5dKSxuKHBuLHRbcG5dKSxuKGZuLHRbZm5dKSxuKExuLHRbTG5dKSxuKHFuLHRbcW5dKSxuKEdlLHRbR2VdKSxuKFVuLHRbVW5dKSxuKEduLHRbR25dKSxuKCRuLHRbJG5dKSxuKEJ0LDEpLG4oenQsImo5NiIpLGUobG4sTnQpLGUoemUsT3QpLGUoY24sVCksZShLZSxTdCksZShXZSxFdCksZShaZSxqdCksZShZZSxhciksZShKZSxvciksZShRZSxfdCksZSh0bixMdCksZShybixrdCksZShhbixDdCksZShzbixIciksZSh1bixuciksZShlbixUdCksZShubix4dCksZShvbiwoYT10aGlzLGZ1bmN0aW9uKHQpe3ZhciBlLG4scjsicGFnZXZpZXciIT10LmdldChXdCl8fGEuSXx8KGEuST0hMCxlPXVyKHQpLG49MDxSKFB0KHQsZWUpLCJnY2xpZCIpLmxlbmd0aCxyPTA8UihQdCh0LGVlKSwid2JyYWlkIikubGVuZ3RoLChlfHxufHxyKSYmbHIoZnVuY3Rpb24odCl7ZSYmYS5zZW5kKCJ0aW1pbmciLHQpLChufHxyKSYmYS5zZW5kKCJhZHRpbWluZyIsdCl9KSl9KSksY2EodGhpcy5tb2RlbCksc2EodGhpcy5tb2RlbCx0W2huXSksdGhpcy5tb2RlbC5zZXQoS3QsKHQ9SS5nYUdsb2JhbD1JLmdhR2xvYmFsfHx7fSkuaGlkPXQuaGlkfHxBdCgpKX12YXIgR3I9L14oR1RNfE9QVCktW0EtWjAtOV0rJC8sVnI9L15HLVtBLVowLTldKyQvLEZyPS87X2dhZXhwPVteO10qL2csWHI9LzsoKF9fdXRtYT0pfChbXjs9XSs9R0FYP1xkK1wuKSlbXjtdKi9nLEJyPS9eaHR0cHM/OlwvXC9bXHdcLS5dK1wuZ29vZ2xlLmNvbSg6XGQrKT9cL29wdGltaXplXC9vcHQtbGF1bmNoXC5odG1sXD8uKiQvLHpyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtlJiYobis9IiYiK3QrIj0iK3goZSkpfXZhciBuPVoodC50eXBlKSt4KHQuaWQpO3JldHVybiJkYXRhTGF5ZXIiIT10LkImJmUoImwiLHQuQiksZSgiY3giLHQuY29udGV4dCksZSgidCIsdC50YXJnZXQpLGUoImNpZCIsdC5jbGllbnRJZCksZSgiY2lkdCIsdC5rYSksZSgiZ2FjIix0LmxhKSxlKCJhaXAiLHQuaWEpLHQuc3luYyYmZSgibSIsInN5bmMiKSxlKCJjeWNsZSIsdC5HKSx0LnFhJiZlKCJnY2xpZCIsdC5xYSksQnIudGVzdChQLnJlZmVycmVyKSYmZSgiY2IiLFN0cmluZyhBdCgpKSksbn0sS3I9ZnVuY3Rpb24ocix0KXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtJW3IuQl09SVtyLkJdfHxbXSxlPXsiZ3RtLnN0YXJ0IjplfSxyLnN5bmN8fChlLmV2ZW50PSJndG0uanMiKSxJW3IuQl0ucHVzaChlKSwyPT09ci50eXBlJiZmdW5jdGlvbih0LGUsbil7SVtyLkJdLnB1c2goYXJndW1lbnRzKX0oImNvbmZpZyIsci5pZCx0KX0sV3I9e30sWnI9ZnVuY3Rpb24odCxlKXtlPWV8fCgoZT1QdCh0LGduKSkmJiJ0MCIhPWU/cmEudGVzdChlKT8iX2dhdF8iK0coUHQodCx2bikpOiJfZ2F0XyIrRyhlKToiX2dhdCIpLHRoaXMuWT1lfSxZcj1mdW5jdGlvbih0LGUsbil7ITE9PT1lLmdldChRbil8fGUuZ2V0KG4pfHwoIjEiPT1IKHQuWSlbMF0/ZS5zZXQobiwiIiwhMCk6ZS5zZXQobiwiIitBdCgpLCEwKSl9LEpyPWZ1bmN0aW9uKHQsZSl7UXIoZSkmJiQodC5ZLCIxIixQdChlLHduKSxQdChlLGJuKSxQdChlLHZuKSw2ZTQsUHQoZSxPbikpfSxRcj1mdW5jdGlvbih0KXtyZXR1cm4hIXQuZ2V0KFhlKSYmITEhPT10LmdldChRbil9LHRhPWZ1bmN0aW9uKHQpe3JldHVybiFXcltQdCh0LHZuKV0mJnZvaWQgMD09PXQuZ2V0KCImZ3RtIikmJnZvaWQgMD09PXQuZ2V0KFF0KSYmdm9pZCAwPT09dC5nZXQoS24pJiZ2b2lkIDA9PT10LmdldChVbil9LGVhPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbih0KXtYdCh0KS5GJiZyLnNldChYdCh0KS5GLGUuZ2V0KHQpKX12YXIgcj1uZXcgYjtuKEJ0KSxuKHp0KSxuKHZuKSxuKGhuKSxuKFhlKSwxPT10JiYobihwbiksbihCZSksbihSbikpLCExPT09ZS5nZXQodHIpJiZyLnNldCgibnBhIiwiMSIpLHIuc2V0KFh0KFZlKS5GLHcoZSkpO3ZhciBhPSIiO3JldHVybiByLm1hcChmdW5jdGlvbih0LGUpe2ErPXgodCkrIj0iLGErPXgoIiIrZSkrIiYifSksYSs9Ino9IitBdCgpLDE9PXQ/YT0idD1kYyZhaXA9MSZfcj0zJiIrYToyPT10JiYoYT0idD1zciZhaXA9MSZfcj00JnNsZl9yZD0xJiIrYSksYX0sbmE9ZnVuY3Rpb24obil7aWYodGEobikpcmV0dXJuIFdyW1B0KG4sdm4pXT0hMCxmdW5jdGlvbih0KXt2YXIgZTt0JiYhV3JbdF0mJihlPXFyKG4sdCksaihlKSxXclt0XT0hMCl9fSxyYT0vXmd0bVxkKyQvLGFhPS9eKFVBfFlUfE1PfEdQKS0oXGQrKS0oXGQrKSQvOyRyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubW9kZWwuZ2V0KHQpfSwkci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbC5zZXQodCxlKX0sJHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7dmFyIGUsbjthcmd1bWVudHMubGVuZ3RoPDF8fChuPSJzdHJpbmciPT10eXBlb2YgdD8oZT10LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTooZT10JiZ0W1d0XSxhcmd1bWVudHMpLGUmJigobj1tKHVhW2VdfHxbXSxuKSlbV3RdPWUsdGhpcy5tb2RlbC5zZXQobix2b2lkIDAsITApLHRoaXMuZmlsdGVycy5EKHRoaXMubW9kZWwpLHRoaXMubW9kZWwuZGF0YS5tPXt9KSl9LCRyLnByb3RvdHlwZS5tYT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7bWEodCxuLGUpfHwod2EodCxmdW5jdGlvbigpe21hKHQsbixlKX0pLGJhKFN0cmluZyhuLmdldChnbikpLHQsdm9pZCAwLGUsITApKX07ZnVuY3Rpb24gb2EodCl7cmV0dXJuInByZXJlbmRlciIhPVAudmlzaWJpbGl0eVN0YXRlJiYodCgpLCEwKX1mdW5jdGlvbiBpYSh0KXtpZihmKHRbMF0pKXRoaXMudT10WzBdO2Vsc2V7dmFyIGU9bGEuZXhlYyh0WzBdKTtpZihudWxsIT1lJiY0PT1lLmxlbmd0aCYmKHRoaXMuZGE9ZVsxXXx8InQwIix0aGlzLks9ZVsyXXx8IiIsdGhpcy5tZXRob2ROYW1lPWVbM10sdGhpcy5hYT1bXS5zbGljZS5jYWxsKHQsMSksdGhpcy5LfHwodGhpcy5BPSJjcmVhdGUiPT10aGlzLm1ldGhvZE5hbWUsdGhpcy5pPSJyZXF1aXJlIj09dGhpcy5tZXRob2ROYW1lLHRoaXMuZz0icHJvdmlkZSI9PXRoaXMubWV0aG9kTmFtZSx0aGlzLmJhPSJyZW1vdmUiPT10aGlzLm1ldGhvZE5hbWUpLHRoaXMuaSYmKDM8PXRoaXMuYWEubGVuZ3RoPyh0aGlzLlg9dGhpcy5hYVsxXSx0aGlzLlc9dGhpcy5hYVsyXSk6dGhpcy5hYVsxXSYmKF8odGhpcy5hYVsxXSk/dGhpcy5YPXRoaXMuYWFbMV06dGhpcy5XPXRoaXMuYWFbMV0pKSksZT10WzFdLHQ9dFsyXSwhdGhpcy5tZXRob2ROYW1lKXRocm93ImFib3J0IjtpZih0aGlzLmkmJighXyhlKXx8IiI9PWUpKXRocm93ImFib3J0IjtpZih0aGlzLmcmJighXyhlKXx8IiI9PWV8fCFmKHQpKSl0aHJvdyJhYm9ydCI7aWYoZ2EodGhpcy5kYSl8fGdhKHRoaXMuSykpdGhyb3ciYWJvcnQiO2lmKHRoaXMuZyYmInQwIiE9dGhpcy5kYSl0aHJvdyJhYm9ydCJ9fXZhciBzYT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9UHQodCxtbik7aWYodC5kYXRhLnNldChBbiwiX2dhIj09cj8iX2dpZCI6cisiX2dpZCIpLCJjb29raWUiPT1QdCh0LHhuKSYmKGdyPSExLHI9SChQdCh0LG1uKSksKHI9cHIodCxyKSl8fChyPVB0KHQsYm4pLHI9bnVsbCE9KHI9RXIoIl9fdXRtYSIsbj1QdCh0LEVuKXx8QSgpLHIpKT8oZygxMCksci5PWzFdKyIuIityLk9bMl0pOnZvaWQgMCksciYmKGdyPSEwKSwocj0obj0obj1yJiYhdC5nZXQoX24pKT8yPT0obj1yLnNwbGl0KCIuIikpLmxlbmd0aCYmKCEhKG49TnVtYmVyKG5bMV0pKSYmbisobz1NdCh0LHluKSk8KG5ldyBEYXRlKS5nZXRUaW1lKCkvMWUzKTpuKT92b2lkIDA6cikmJih0LmRhdGEuc2V0KGRuLHIpLHQuZGF0YS5zZXQoaG4sciksKHI9ZHIodCkpJiZ0LmRhdGEuc2V0KFJuLHIpKSx0LmdldChxbikmJihyPXQuZ2V0KEluKSxuPXQuZ2V0KERuKSwhcnx8biYmImF3LmRzIiE9bikmJihyPXt9LG49KFA/QihyKTp7fSlbUHQodCx2bildLF9yKHIpLG4mJjAhPW4ubGVuZ3RoJiYocj1uWzBdLHQuZGF0YS5zZXQoUG4sci50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KEluLHIucWEpKSksdC5nZXQocW4pJiYocj10LmdldChYbiksbj17fSxvPShQP0IobiwiX2dhY19nYiIsITApOnt9KVtQdCh0LHZuKV0sT3IobiksbyYmMCE9by5sZW5ndGgmJihvPShuPW9bMF0pLnFhLHImJnIhPT1vfHwobi5sYWJlbHMmJm4ubGFiZWxzLmxlbmd0aCYmKG8rPSIuIituLmxhYmVscy5qb2luKCIuIikpLHQuZGF0YS5zZXQoQm4sbi50aW1lc3RhbXAvMWUzKSx0LmRhdGEuc2V0KFhuLG8pKSkpKSx0LmdldChfbikpe3I9TigiX2dhIiwhIXQuZ2V0KFNuKSk7dmFyIGE9TigiX2dsIiwhIXQuZ2V0KFNuKSksbz0obj1rci5nZXQodC5nZXQoU24pKSkuX2dhO2EmJjA8YS5pbmRleE9mKCJfZ2EqIikmJiFvJiZnKDMwKSxhPSEoZXx8IXQuZ2V0KEduKSkmJih2b2lkIDAhPT0oYT10LmdldCgkbikpJiYhYSgiYW5hbHl0aWNzX3N0b3JhZ2UiKSYmKGcoODQpLHQuZGF0YS5zZXQoVm4sMSksISEoYT0oYT1uLl91cCk/ISEoYT14ci5leGVjKFAucmVmZXJyZXIpKSYmKGE9YVsxXSwoaT1QLmxvY2F0aW9uLmhvc3RuYW1lKT09PWF8fDA8PWkuaW5kZXhPZigiLiIrYSl8fDA8PWEuaW5kZXhPZigiLiIraSkpOmEpKSk7dmFyIGk9bi5nY2xpZCxzPW4uX2dhYztpZihyfHxvfHxpfHxzKWlmKHImJm8mJmcoMzYpLHQuZ2V0KGtuKXx8Vyh0LmdldChMbikpfHxhKXtpZihvJiYoZygzOCksdC5kYXRhLnNldChobixvKSxuLl9naWQmJihnKDUxKSx0LmRhdGEuc2V0KFJuLG4uX2dpZCkpKSxpPyhnKDgyKSx0LmRhdGEuc2V0KEluLGkpLG4uZ2Nsc3JjJiZ0LmRhdGEuc2V0KERuLG4uZ2Nsc3JjKSk6cyYmKG89cy5zcGxpdCgiLiIpKSYmMj09PW8ubGVuZ3RoJiYoZygzNyksdC5kYXRhLnNldChJbixvWzBdKSx0LmRhdGEuc2V0KFBuLG9bMV0pKSwobj1uLl9mcGxjKSYmUHQodCxVbikmJihnKDgzKSx0LmRhdGEuc2V0KEhuLG4pKSxyKXQ6aWYobj1yLmluZGV4T2YoIi4iKSwtMT09bilnKDIyKTtlbHNle2lmKG89ci5zdWJzdHJpbmcoMCxuKSxuPShhPXIuc3Vic3RyaW5nKG4rMSkpLmluZGV4T2YoIi4iKSxyPWEuc3Vic3RyaW5nKDAsbiksYT1hLnN1YnN0cmluZyhuKzEpLCIxIj09byl7aWYoUHIobj1hLHIpKXtnKDIzKTticmVhayB0fX1lbHNle2lmKCIyIiE9byl7ZygyMik7YnJlYWsgdH1pZihvPSIiLG49MDwobj1hLmluZGV4T2YoIi0iKSk/KG89YS5zdWJzdHJpbmcoMCxuKSxhLnN1YnN0cmluZyhuKzEpKTphLnN1YnN0cmluZygxKSxQcihvK24scikpe2coNTMpO2JyZWFrIHR9byYmKGcoMiksdC5kYXRhLnNldChSbixvKSl9ZygxMSksdC5kYXRhLnNldChobixuKSwocj1OKCJfZ2FjIiwhIXQuZ2V0KFNuKSkpJiYoIjEiIT0ocj1yLnNwbGl0KCIuIikpWzBdfHw0IT1yLmxlbmd0aD9nKDcyKTpQcihyWzNdLHJbMV0pP2coNzEpOih0LmRhdGEuc2V0KEluLHJbM10pLHQuZGF0YS5zZXQoUG4sclsyXSksZyg3MCkpKX19ZWxzZSBnKDIxKX1lJiYoZyg5KSx0LmRhdGEuc2V0KGhuLHgoZSkpKSx0LmdldChobil8fCgoZT0oIShlPUkuZ2FHbG9iYWwpfHwhZS5mcm9tX2Nvb2tpZXx8ImNvb2tpZSI9PT1QdCh0LHhuKSkmJihlPWUmJmUudmlkKSYmLTEhPT1lLnNlYXJjaChjKT9lOnZvaWQgMCk/KGcoMTcpLHQuZGF0YS5zZXQoaG4sZSkpOihnKDgpLHQuZGF0YS5zZXQoaG4sZCgpKSkpLHQuZ2V0KFJuKXx8KGcoMyksdC5kYXRhLnNldChSbixkKCkpKSxocih0KSxlPUkuZ2FHbG9iYWw9SS5nYUdsb2JhbHx8e30sdD0ocj1QdCh0LGhuKSk9PT1QdCh0LGRuKSwobnVsbD09ZS52aWR8fHQmJiFlLmZyb21fY29va2llKSYmKGUudmlkPXIsZS5mcm9tX2Nvb2tpZT10KX0sY2E9ZnVuY3Rpb24odCl7dmFyIGU9SS5uYXZpZ2F0b3Isbj1JLnNjcmVlbixyPVAubG9jYXRpb24sYT10LnNldDt0Ont2YXIgbz0hIXQuZ2V0KE5uKSxpPSEhdC5nZXQoTG4pLHM9UC5yZWZlcnJlcjtpZigvXihodHRwcz98YW5kcm9pZC1hcHApOlwvXC8vaS50ZXN0KHMpKXtpZihvKWJyZWFrIHQ7aWYobz0iLy8iK1AubG9jYXRpb24uaG9zdG5hbWUsIXYocyxvKSl7aWYoaSYmKGk9by5yZXBsYWNlKC9cLi9nLCItIikrIi5jZG4uYW1wcHJvamVjdC5vcmciLHYocyxpKSkpe3M9dm9pZCAwO2JyZWFrIHR9YnJlYWsgdH19cz12b2lkIDB9aWYoYS5jYWxsKHQsbmUscyksciYmKCIvIiE9KGE9ci5wYXRobmFtZXx8IiIpLmNoYXJBdCgwKSYmKGcoMzEpLGE9Ii8iK2EpLHQuc2V0KGVlLHIucHJvdG9jb2wrIi8vIityLmhvc3RuYW1lK2Erci5zZWFyY2gpKSxuJiZ0LnNldChzZSxuLndpZHRoKyJ4IituLmhlaWdodCksbiYmdC5zZXQoaWUsbi5jb2xvckRlcHRoKyItYml0Iiksbj1QLmRvY3VtZW50RWxlbWVudCxzPShhPVAuYm9keSkmJmEuY2xpZW50V2lkdGgmJmEuY2xpZW50SGVpZ2h0LGk9W10sbiYmbi5jbGllbnRXaWR0aCYmbi5jbGllbnRIZWlnaHQmJigiQ1NTMUNvbXBhdCI9PT1QLmNvbXBhdE1vZGV8fCFzKT9pPVtuLmNsaWVudFdpZHRoLG4uY2xpZW50SGVpZ2h0XTpzJiYoaT1bYS5jbGllbnRXaWR0aCxhLmNsaWVudEhlaWdodF0pLG49aVswXTw9MHx8aVsxXTw9MD8iIjppLmpvaW4oIngiKSx0LnNldChjZSxuKSxuPXQuc2V0LChhPShhPUkubmF2aWdhdG9yKT9hLnBsdWdpbnM6bnVsbCkmJmEubGVuZ3RoKWZvcihzPTA7czxhLmxlbmd0aCYmIXU7cysrKS0xPChpPWFbc10pLm5hbWUuaW5kZXhPZigiU2hvY2t3YXZlIEZsYXNoIikmJih1PWkuZGVzY3JpcHRpb24pO2lmKCF1KXRyeXt2YXIgYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpLHU9Yy5HZXRWYXJpYWJsZSgiJHZlcnNpb24iKX1jYXRjaCh0KXt9aWYoIXUpdHJ5e2M9bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSx1PSJXSU4gNiwwLDIxLDAiLGMuQWxsb3dTY3JpcHRBY2Nlc3M9ImFsd2F5cyIsdT1jLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpfWNhdGNoKHQpe31pZighdSl0cnl7dT0oYz1uZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSkuR2V0VmFyaWFibGUoIiR2ZXJzaW9uIil9Y2F0Y2godCl7fWlmKHUmJihjPXUubWF0Y2goL1tcZF0rL2cpKSYmMzw9Yy5sZW5ndGgmJih1PWNbMF0rIi4iK2NbMV0rIiByIitjWzJdKSxuLmNhbGwodCxsZSx1fHx2b2lkIDApLHQuc2V0KG9lLFAuY2hhcmFjdGVyU2V0fHxQLmNoYXJzZXQpLHQuc2V0KHVlLGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmphdmFFbmFibGVkJiZlLmphdmFFbmFibGVkKCl8fCExKSx0LnNldChhZSwoZSYmKGUubGFuZ3VhZ2V8fGUuYnJvd3Nlckxhbmd1YWdlKXx8IiIpLnRvTG93ZXJDYXNlKCkpLHQuZGF0YS5zZXQoSW4sTigiZ2NsaWQiLCEwKSksdC5kYXRhLnNldChEbixOKCJnY2xzcmMiLCEwKSksdC5kYXRhLnNldChQbixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFlMykpLHQuZ2V0KEluKXx8KHQuZGF0YS5zZXQoWG4sTigid2JyYWlkIiwhMCkpLHQuZGF0YS5zZXQoQm4sTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpKSksciYmdC5nZXQoU24pJiYoZT1QLmxvY2F0aW9uLmhhc2gpKXtmb3IoZT1lLnNwbGl0KC9bPyYjXSsvKSxyPVtdLHU9MDt1PGUubGVuZ3RoOysrdSkoTyhlW3VdLCJ1dG1faWQiKXx8TyhlW3VdLCJ1dG1fY2FtcGFpZ24iKXx8TyhlW3VdLCJ1dG1fc291cmNlIil8fE8oZVt1XSwidXRtX21lZGl1bSIpfHxPKGVbdV0sInV0bV90ZXJtIil8fE8oZVt1XSwidXRtX2NvbnRlbnQiKXx8TyhlW3VdLCJnY2xpZCIpfHxPKGVbdV0sImRjbGlkIil8fE8oZVt1XSwiZ2Nsc3JjIil8fE8oZVt1XSwid2JyYWlkIikpJiZyLnB1c2goZVt1XSk7MDxyLmxlbmd0aCYmKGU9IiMiK3Iuam9pbigiJiIpLHQuc2V0KGVlLHQuZ2V0KGVlKStlKSl9fSx1YT17cGFnZXZpZXc6W3JlXSxldmVudDpbZ2UsaGUsZmUsZGVdLHNvY2lhbDpbcGUsdmUsbWVdLHRpbWluZzpbdCxOZSxBZSxSZV19LE5lPWZ1bmN0aW9uKG4pe3ZhciByLGE7b2Eobil8fChnKDE2KSxyPSExLHAoUCwidmlzaWJpbGl0eWNoYW5nZSIsYT1mdW5jdGlvbigpe3ZhciB0LGU7IXImJm9hKG4pJiYocj0hMCx0PWEsKGU9UCkucmVtb3ZlRXZlbnRMaXN0ZW5lcj9lLnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHQsITEpOmUuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9udmlzaWJpbGl0eWNoYW5nZSIsdCkpfSkpfSxsYT0vXig/OihcdyspXC4pPyg/OihcdyspOik/KFx3KykkLztmdW5jdGlvbiBnYSh0KXtyZXR1cm4gMDw9dC5pbmRleE9mKCIuIil8fDA8PXQuaW5kZXhPZigiOiIpfWZ1bmN0aW9uIGhhKHQsZSl7ZmEuc2V0KHQsZSksZT1wYS5nZXQodCl8fFtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0oKTtwYS5zZXQodCxbXSl9dmFyIGZhPW5ldyBiLGRhPW5ldyBiLHBhPW5ldyBiLHZhPXtlYzo0NSxlY29tbWVyY2U6NDYsbGlua2lkOjQ3fSxtYT1mdW5jdGlvbih0LGUsbil7ZT09a2F8fGUuZ2V0KGduKTt2YXIgcj1mYS5nZXQodCk7cmV0dXJuISFmKHIpJiYoZS5wbHVnaW5zXz1lLnBsdWdpbnNffHxuZXcgYixlLnBsdWdpbnNfLmdldCh0KXx8ZS5wbHVnaW5zXy5zZXQodCxuZXcgcihlLG58fHt9KSksITApfSxiYT1mdW5jdGlvbih0LGUsbixyLGEpe2lmKCFmKGZhLmdldChlKSkmJiFkYS5nZXQoZSkpe3ZhLmhhc093blByb3BlcnR5KGUpJiZnKHZhW2VdKTt2YXIgbyxpPXZvaWQgMDtpZihHci50ZXN0KGUpKXtpZihnKDUyKSwhKHQ9a2Euaih0KSkpcmV0dXJuITA7bj1xcih0Lm1vZGVsLGUscixhKSxpPWZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLGUsZnVuY3Rpb24oKXt9XSk7dmFyIHQ9SVtyJiZyLmRhdGFMYXllcnx8ImRhdGFMYXllciJdO3QmJnQuaGlkZSYmZih0LmhpZGUuZW5kKSYmdC5oaWRlW2VdJiYodC5oaWRlLmVuZCgpLHQuaGlkZS5lbmQ9dm9pZCAwKX19IW4mJnZhLmhhc093blByb3BlcnR5KGUpPyhnKDM5KSxuPWUrIi5qcyIpOmcoNDMpLG4mJihyJiYobz1yW1VuXSksXyhvKXx8KG89dm9pZCAwKSx0PUVhKFRhKG4sbykpLCFvfHxfYSh0LnByb3RvY29sKSYmeWEodCl8fCh0PUVhKFRhKG4pKSksX2EodC5wcm90b2NvbCkmJnlhKHQpJiYoaih0LnVybCx2b2lkIDAsYSx2b2lkIDAsaSksZGEuc2V0KGUsITApKSl9fSx3YT1mdW5jdGlvbih0LGUpe3ZhciBuPXBhLmdldCh0KXx8W107bi5wdXNoKGUpLHBhLnNldCh0LG4pfSx5YT1mdW5jdGlvbih0KXt2YXIgZT1FYShQLmxvY2F0aW9uLmhyZWYpO3JldHVybiEoIU8odC51cmwsWigxKSkmJiFPKHQudXJsLFooMikpKXx8ISh0LnF1ZXJ5fHwwPD10LnVybC5pbmRleE9mKCI/Iil8fDA8PXQucGF0aC5pbmRleE9mKCI6Ly8iKSkmJighISh0Lmhvc3Q9PWUuaG9zdCYmdC5wb3J0PT1lLnBvcnR8fG4mJigoZT1QLmNyZWF0ZUVsZW1lbnQoImEiKSkuaHJlZj1uLGU9T2EoZSksdC5ob3N0PT09ZVswXSYmdC5wb3J0PT09ZVsxXSkpfHwoZT0iaHR0cDoiPT10LnByb3RvY29sPzgwOjQ0MywhKCJ3d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20iIT10Lmhvc3R8fCh0LnBvcnR8fGUpIT1lfHwhTyh0LnBhdGgsIi9wbHVnaW5zLyIpKSkpfSxfYT1mdW5jdGlvbih0KXt2YXIgZT1QLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiJodHRwczoiPT10fHx0PT1lfHwiaHR0cDoiPT10JiYiaHR0cDoiPT1lfSxPYT1mdW5jdGlvbih0KXt2YXIgZT0wPD0obj10Lmhvc3RuYW1lfHwiIikuaW5kZXhPZigiXSIpLG49bi5zcGxpdChlPyJdIjoiOiIpWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUmJihuKz0iXSIpLGU9KHQucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLGU9K3QucG9ydHx8KCJodHRwOiI9PWU/ODA6Imh0dHBzOiI9PWU/NDQzOiIiKSx0PXQucGF0aG5hbWV8fCIiLFtuLCIiK2UsdD0hTyh0LCIvIik/Ii8iK3Q6dF19LEVhPWZ1bmN0aW9uKHQpe3ZhciBlPVAuY3JlYXRlRWxlbWVudCgiYSIpO2UuaHJlZj1QLmxvY2F0aW9uLmhyZWY7dmFyIG49KGUucHJvdG9jb2x8fCIiKS50b0xvd2VyQ2FzZSgpLHI9T2EoZSksYT1lLnNlYXJjaHx8IiIsbz1uKyIvLyIrclswXSsoclsxXT8iOiIrclsxXToiIik7cmV0dXJuIE8odCwiLy8iKT90PW4rdDpPKHQsIi8iKT90PW8rdDohdHx8Tyh0LCI/Iik/dD1vK3JbMl0rKHR8fGEpOnQuc3BsaXQoIi8iKVswXS5pbmRleE9mKCI6Iik8MCYmKHQ9bytyWzJdLnN1YnN0cmluZygwLHJbMl0ubGFzdEluZGV4T2YoIi8iKSkrIi8iK3QpLGUuaHJlZj10LG49T2EoZSkse3Byb3RvY29sOihlLnByb3RvY29sfHwiIikudG9Mb3dlckNhc2UoKSxob3N0Om5bMF0scG9ydDpuWzFdLHBhdGg6blsyXSxxdWVyeTplLnNlYXJjaHx8IiIsdXJsOnR8fCIifX0sVGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmMDw9dC5pbmRleE9mKCIvIik/dDooZXx8Z3QoITEpKSsiL3BsdWdpbnMvdWEvIit0fSx4YT17Z2E6ZnVuY3Rpb24oKXt4YS5mYT1bXX19O3hhLmdhKCkseGEuRD1mdW5jdGlvbih0KXt2YXIgZT14YS5KLmFwcGx5KHhhLGFyZ3VtZW50cyksZT14YS5mYS5jb25jYXQoZSk7Zm9yKHhhLmZhPVtdOzA8ZS5sZW5ndGgmJiF4YS52KGVbMF0pJiYoZS5zaGlmdCgpLCEoMDx4YS5mYS5sZW5ndGgpKTspO3hhLmZhPXhhLmZhLmNvbmNhdChlKX0seGEucmE9ZnVuY3Rpb24odCl7a2EucSYmKDMwMD09PWthLnEubGVuZ3RoJiYoa2EucS5zaGlmdCgpLGthLnFkKyspLGthLnEucHVzaCh0KSl9LHhhLko9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRyeXt2YXIgcj1uZXcgaWEoYXJndW1lbnRzW25dKTtyLmc/aGEoci5hYVswXSxyLmFhWzFdKTooci5pJiYoci5oYT1iYShyLmRhLHIuYWFbMF0sci5YLHIuVykpLGUucHVzaChyKSkseGEucmEoYXJndW1lbnRzW25dKX1jYXRjaCh0KXt9cmV0dXJuIGV9LHhhLnY9ZnVuY3Rpb24odCl7dHJ5e2lmKHQudSl0LnUuY2FsbChJLGthLmooInQwIikpO2Vsc2V7dmFyIGUsbixyLGE9dC5kYT09cz9rYTprYS5qKHQuZGEpO2lmKHQuQSl7aWYoInQwIj09dC5kYSYmbnVsbD09PShhPWthLmNyZWF0ZS5hcHBseShrYSx0LmFhKSkpcmV0dXJuITB9ZWxzZSBpZih0LmJhKWthLnJlbW92ZSh0LmRhKTtlbHNlIGlmKGEpaWYodC5pKXtpZih0LmhhJiYodC5oYT1iYSh0LmRhLHQuYWFbMF0sdC5YLHQuVykpLCFtYSh0LmFhWzBdLGEsdC5XKSlyZXR1cm4hMH1lbHNlIHQuSz8oZT10Lm1ldGhvZE5hbWUsbj10LmFhLChyPWEucGx1Z2luc18uZ2V0KHQuSykpW2VdLmFwcGx5KHIsbikpOmFbdC5tZXRob2ROYW1lXS5hcHBseShhLHQuYWEpfX1jYXRjaCh0KXt9fTt2YXIga2E9ZnVuY3Rpb24odCl7ZygxKSx4YS5ELmFwcGx5KHhhLFthcmd1bWVudHNdKX07a2EuaD17fSxrYS5QPVtdLGthLkw9MCxrYS55YT0wLGthLmFuc3dlcj00Mjt2YXIgU2E9W3ZuLGJuLGduXTtrYS5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bShTYSxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO2VbZ25dfHwoZVtnbl09InQwIik7dmFyIG49IiIrZVtnbl07aWYoa2EuaFtuXSlyZXR1cm4ga2EuaFtuXTtpZihmdW5jdGlvbih0KXtpZihXKHRbTG5dKSYmKHZvaWQgMD09PXJ0JiYoZT0oZT1rci5nZXQoKSkmJmUuX2dhfHx2b2lkIDApJiYocnQ9ZSxnKDgxKSksdm9pZCAwIT09cnQpKXJldHVybiB0W2huXXx8KHRbaG5dPXJ0KSwhMTtpZih0W0xuXSl7aWYoZyg2NyksdFt4bl0mJiJjb29raWUiIT10W3huXSlyZXR1cm4hMTtpZih2b2lkIDAhPT1ydCl0W2huXXx8KHRbaG5dPXJ0KTtlbHNle3ZhciBlPVN0cmluZyh0W2JuXXx8QSgpKSxuPVN0cmluZyh0W3duXXx8Ii8iKSxyPUgoU3RyaW5nKHRbbW5dfHwiX2dhIikpO2lmKChlPSEoKGU9dnIocixlLG4pKSYmIWMudGVzdChlKSl8fCgwPT0oZT1IKCJBTVBfVE9LRU4iKSkubGVuZ3RofHwxPT1lLmxlbmd0aCYmKCIkUkVUUklFVklORyI9PShlPWRlY29kZVVSSUNvbXBvbmVudChlWzBdKSl8fCIkT1BUX09VVCI9PWV8fCIkRVJST1IiPT1lfHwiJE5PVF9GT1VORCI9PWUpKSkmJnN0KHosU3RyaW5nKHRbdm5dKSkpcmV0dXJuITB9fXJldHVybiExfShlKSlyZXR1cm4gbnVsbDtpZihlPW5ldyAkcihlKSxrYS5oW25dPWUsa2EuUC5wdXNoKGUpLG49d3QoKS50cmFja2VyX2NyZWF0ZWQsZihuKSl0cnl7bihlKX1jYXRjaCh0KXt9cmV0dXJuIGV9LGthLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGthLlAubGVuZ3RoO2UrKylpZihrYS5QW2VdLmdldChnbik9PXQpe2thLlAuc3BsaWNlKGUsMSksa2EuaFt0XT1udWxsO2JyZWFrfX0sa2Euaj1mdW5jdGlvbih0KXtyZXR1cm4ga2EuaFt0XX0sa2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuIGthLlAuc2xpY2UoMCl9LGthLk49ZnVuY3Rpb24oKXtpZigiZ2EiIT1zJiZnKDQ5KSwhKG49SVtzXSl8fDQyIT1uLmFuc3dlcil7a2EuTD1uJiZuLmwsa2EueWE9K25ldyBEYXRlLGthLmxvYWRlZD0hMDt2YXIgdD1uJiZuLnEsZT15KHQpLG49W107aWYoZT9uPXQuc2xpY2UoMCk6Zyg1MCksa2EucT1lP3Q6W10sa2EucS5zcGxpY2UoMCksa2EucWQ9MCxlcigiY3JlYXRlIix0PUlbc109a2EsdC5jcmVhdGUpLGVyKCJyZW1vdmUiLHQsdC5yZW1vdmUpLGVyKCJnZXRCeU5hbWUiLHQsdC5qLDUpLGVyKCJnZXRBbGwiLHQsdC5nZXRBbGwsNiksZXIoImdldCIsdD0kci5wcm90b3R5cGUsdC5nZXQsNyksZXIoInNldCIsdCx0LnNldCw0KSxlcigic2VuZCIsdCx0LnNlbmQpLGVyKCJyZXF1aXJlU3luYyIsdCx0Lm1hKSxlcigiZ2V0Iix0PUl0LnByb3RvdHlwZSx0LmdldCksZXIoInNldCIsdCx0LnNldCksImh0dHBzOiIhPVAubG9jYXRpb24ucHJvdG9jb2wmJiFsKXt0Ontmb3IodD1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxlPTA7ZTx0Lmxlbmd0aCYmZTwxMDA7ZSsrKXt2YXIgcj10W2VdLnNyYztpZihyJiYwPT1yLmluZGV4T2YoZ3QoITApKyIvYW5hbHl0aWNzIikpe3Q9ITA7YnJlYWsgdH19dD0hMX10JiYobD0hMCl9dD0oKEkuZ2FwbHVnaW5zPUkuZ2FwbHVnaW5zfHx7fSkuTGlua2VyPVJyKS5wcm90b3R5cGUsaGEoImxpbmtlciIsUnIpLGVyKCJkZWNvcmF0ZSIsdCx0LmNhLDIwKSxlcigiYXV0b0xpbmsiLHQsdC5TLDI1KSxlcigicGFzc3Rocm91Z2giLHQsdC4kLDI1KSxoYSgiZGlzcGxheWZlYXR1cmVzIixVciksaGEoImFkZmVhdHVyZXMiLFVyKSx4YS5ELmFwcGx5KGthLG4pfX07QWU9a2EuTixSZT1JW3NdO1JlJiZSZS5yP0FlKCk6TmUoQWUpLE5lKGZ1bmN0aW9uKCl7eGEuRChbInByb3ZpZGUiLCJyZW5kZXIiLFRdKX0pfSh3aW5kb3cpfQo="},{"name":"brave-auto-pip.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogIGZ1bmN0aW9uIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKSB7CiAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInZpZGVvW3NyY10sIHZpZGVvIHNvdXJjZSIpPy5jbG9zZXN0KCJ2aWRlbyIpCiAgICAgIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIik7CiAgICBpZiAodmlkZW8pIHsKICAgICAgLy8gQ2hlY2sgaWYgUGlQIGlzIGRpc2FibGVkIG9uIHRoaXMgdmlkZW8KICAgICAgaWYgKHZpZGVvLmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1BpUCBpcyBkaXNhYmxlZCBmb3IgdGhpcyB2aWRlbywgZW5hYmxpbmcgaXQuLi4nKTsKICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgIHZpZGVvLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIC8vIFJlcXVlc3QgdmlkZW8gdG8gYXV0b21hdGljYWxseSBlbnRlciBwaWN0dXJlLWluLXBpY3R1cmUgd2hlbiBlbGlnaWJsZS4KICAgICAgICBuYXZpZ2F0b3IubWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoImVudGVycGljdHVyZWlucGljdHVyZSIsIGFzeW5jICgpID0+IHsKICAgICAgICAgIGF3YWl0IHZpZGVvLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgfSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5sb2coIlRoZSBlbnRlcnBpY3R1cmVpbnBpY3R1cmUgYWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOwogICAgICB9CgogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJlbnRlcnBpY3R1cmVpbnBpY3R1cmUiLCAoKSA9PiB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHZpZGVvLnBsYXkoKTsgfSwgMTAwMCk7CiAgICAgIH0pOwoKICAgICAgLy8gV2F0Y2ggZm9yIHNpdGVzIChlLmcuIE5ldGZsaXgpIHJlLWFkZGluZyBkaXNhYmxlcGljdHVyZWlucGljdHVyZQogICAgICAvLyBodHRwczovL29sZC5yZWRkaXQuY29tL3IvYnJhdmVfYnJvd3Nlci9jb21tZW50cy8xcjhlZGc0L3dvcmthcm91bmRfdG9fZml4X25ldGZsaXhfaW50ZW50aW9uYWxfZGlzYWJsZWRfcGlwLwogICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgICAgaWYgKHZpZGVvLmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlKSB7CiAgICAgICAgICB2aWRlby5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IGZhbHNlOwogICAgICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlcGljdHVyZWlucGljdHVyZScpOwogICAgICAgIH0KICAgICAgfSkub2JzZXJ2ZSh2aWRlbywgeyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnXSB9KTsKCiAgICB9IGVsc2UgewogICAgICAvLyBJZiBubyB2aWRlbyBpcyBhdmFpbGFibGUsIHdhdGNoIGZvciBvbmUgdG8gYXBwZWFyCiAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKChfLCBvYnNlcnZlcikgPT4gewogICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpKSB7CiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICBzZXR1cEF1dG9QaWN0dXJlSW5QaWN0dXJlKCk7CiAgICAgICAgfQogICAgICB9KS5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwogICAgfQogIH0KCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogICAgLy8gTG9hZGluZyBoYXNuJ3QgZmluaXNoZWQgeWV0LgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCiAgICBzZXR1cEF1dG9QaWN0dXJlSW5QaWN0dXJlLCB7IG9uY2U6IHRydWUgfSk7CiAgfSBlbHNlIHsKICAgIC8vIGBET01Db250ZW50TG9hZGVkYCBoYXMgYWxyZWFkeSBmaXJlZC4KICAgIHNldHVwQXV0b1BpY3R1cmVJblBpY3R1cmUoKTsKICB9Cn0pKCk7"},{"name":"brave-disable-pageview-api.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWRpc2FibGUtcGFnZXZpZXctYXBpLmpzCi8vIEJhc2VkIG9uOiBodHRwczovL2FkZG9ucy5tb3ppbGxhLm9yZy9maXJlZm94L2FkZG9uL2Rpc2FibGUtcGFnZS12aXNpYmlsaXR5LwovLyBMaWNlbnNlOiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAKLy8gRnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZ3dhcnNlci8zYjQ3YjYxODYzYmZmY2ZlYmU0NDk4Yzc3YjIzMDFjZAooZnVuY3Rpb24oKXsKLy8gdmlzaWJpbGl0eWNoYW5nZSBldmVudHMgYXJlIGNhcHR1cmVkIGFuZCBzdG9wcGVkIApkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24oZSkgewogICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfSwgdHJ1ZSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyBmYWxzZQpPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAiaGlkZGVuIiwgewogICAgZ2V0OiBmdW5jdGlvbiBoaWRkZW4oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKfSk7Ci8vIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSBhbHdheXMgcmV0dXJucyAidmlzaWJsZSIKT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgInZpc2liaWxpdHlTdGF0ZSIsIHsKICAgIGdldDogZnVuY3Rpb24gdmlzaWJpbGl0eVN0YXRlKCkgewogICAgICAgIHJldHVybiAidmlzaWJsZSI7CiAgICB9LAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKfSkoKQo="},{"name":"brave-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLWZpeC5qcwovLy8gYWxpYXMgYmYuanMKZGVsZXRlIE5hdmlnYXRvci5wcm90b3R5cGUuYnJhdmUKZGVsZXRlIHdpbmRvdy5uYXZpZ2F0b3IuYnJhdmUKCmNvbnN0IHNwb29mQnJhbmRzID0gKGl0ZW1zKSA9PiB7CiAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0/LmJyYW5kPy50b0xvd2VyQ2FzZSgpID09PSAnYnJhdmUnKSB7CiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGJyYW5kOiAnR29vZ2xlIENocm9tZScgfTsKICAgIH0KICAgIHJldHVybiBpdGVtOwogIH0pOwp9OwoKY29uc3Qgb3JpZ2luYWxCcmFuZHMgPSBuYXZpZ2F0b3I/LnVzZXJBZ2VudERhdGE/LmJyYW5kczsKaWYgKG9yaWdpbmFsQnJhbmRzKSB7CiAgY29uc3Qgc3Bvb2ZlZEJyYW5kcyA9IHNwb29mQnJhbmRzKG9yaWdpbmFsQnJhbmRzKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF2aWdhdG9yVUFEYXRhLnByb3RvdHlwZSwgJ2JyYW5kcycsIHsKICAgIHZhbHVlOiBzcG9vZmVkQnJhbmRzCiAgfSk7Cn0KCmNvbnN0IG9yaWdpbmFsR2V0SGlnaEVudHJvcHlWYWx1ZXMgPQogIE5hdmlnYXRvclVBRGF0YT8ucHJvdG90eXBlPy5nZXRIaWdoRW50cm9weVZhbHVlczsKCmlmIChvcmlnaW5hbEdldEhpZ2hFbnRyb3B5VmFsdWVzKSB7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdmlnYXRvclVBRGF0YS5wcm90b3R5cGUsICdnZXRIaWdoRW50cm9weVZhbHVlcycsIHsKICAgIHZhbHVlOiBhc3luYyBmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcyhoaW50cykgewogICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgb3JpZ2luYWxHZXRIaWdoRW50cm9weVZhbHVlcy5jYWxsKAogICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnREYXRhLAogICAgICAgIGhpbnRzCiAgICAgICk7CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdHMpKSB7CiAgICAgICAgaWYgKGtleSA9PT0gJ2JyYW5kcycgfHwga2V5ID09PSAnZnVsbFZlcnNpb25MaXN0JykgewogICAgICAgICAgcmVzdWx0c1trZXldID0gc3Bvb2ZCcmFuZHMocmVzdWx0c1trZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfSk7Cn0KCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICBOYXZpZ2F0b3JVQURhdGEucHJvdG90eXBlLmdldEhpZ2hFbnRyb3B5VmFsdWVzLCAndG9TdHJpbmcnLCB7CiAgdmFsdWU6ICgpID0+ICdmdW5jdGlvbiBnZXRIaWdoRW50cm9weVZhbHVlcygpIHsgW25hdGl2ZSBjb2RlXSB9Jwp9KTsK"},{"name":"brave-google-maps-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vYnJhdmUvYnJhdmUtYnJvd3Nlci9pc3N1ZXMvMzcwNzUKKCgpID0+IHsKICBpZiAobG9jYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgiL21hcHMvIikgfHwgbG9jYXRpb24ucGF0aG5hbWUgPT09ICIvbWFwcyIpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5wcm90b3R5cGUsICdwcmVjaXNpb24nLCB7CiAgICAgIHZhbHVlOiAwLAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogIH0KfSkoKTsK"},{"name":"brave-video-bg-play-update.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXktdXBkYXRlLmpzCi8vIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpIHsKICBjb25zdCBob3N0ID0gbG9jYXRpb24uaG9zdG5hbWU7CiAgY29uc3QgSVNfWU9VVFVCRSA9IC8oPzpefC4rXC4peW91dHViZSg/Oi1ub2Nvb2tpZSk/XC5jb20kLy50ZXN0KGhvc3QpOwogIGNvbnN0IElTX1ZJTUVPID0gLyg/Ol58LitcLil2aW1lb1wuY29tJC8udGVzdChob3N0KTsKCiAgLy8gUGFnZSBWaXNpYmlsaXR5IEFQSQogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnaGlkZGVuJywgewogICAgICBnZXQoKSB7IHJldHVybiBmYWxzZTsgfSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3RvdHlwZSwgJ3Zpc2liaWxpdHlTdGF0ZScsIHsKICAgICAgZ2V0KCkgeyByZXR1cm4gJ3Zpc2libGUnOyB9LAogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAnb252aXNpYmlsaXR5Y2hhbmdlJywgewogICAgICBnZXQoKSB7IHJldHVybiBudWxsOyB9LAogICAgICBzZXQoKSB7fSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSBjYXRjaCAoZSkge30KCiAgLy8gQmxvY2sgZXZlbnQgZGVsaXZlcnkgKGNhcHR1cmU9dHJ1ZSB0byBpbnRlcmNlcHQgZWFybHkpCiAgY29uc3Qgc3RvcCA9IChlKSA9PiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogIGNvbnN0IElTX0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8CiAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKTsKICB0cnkgewogICAgLy8gU2tpcCB2aXNpYmlsaXR5Y2hhbmdlIGJsb2NraW5nIG9uIGlPUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1lZGlhIGJhY2tncm91bmRpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBzdG9wLCB0cnVlKTsKICAgIH0KICB9IGNhdGNoIChlKSB7fQoKICAvLyBGdWxsc2NyZWVuIEFQSSAoVmltZW8pCiAgaWYgKElTX1ZJTUVPKSB7CiAgICB0cnkgewogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHN0b3AsIHRydWUpOwogICAgfSBjYXRjaCAoZSkge30KICB9CgogIC8vIFlvdVR1YmUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzCiAgaWYgKElTX1lPVVRVQkUpIHsKICAgIC8vIFVzZXIgYWN0aXZpdHkgdHJhY2tpbmcKICAgIGNvbnN0IExBQ1RfUkVGUkVTSCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWluCiAgICB3YWl0Rm9yTGFjdCgoKSA9PiByZWZyZXNoTGFjdCgpLCBMQUNUX1JFRlJFU0gpOwoKICAgIGZ1bmN0aW9uIGdldFZpZGVvKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigneXRkLXBsYXllciB2aWRlbywgI21vdmllX3BsYXllciB2aWRlbywgdmlkZW8nKTsKICAgIH0KCiAgICBsZXQgbGFzdFVzZXJJbnB1dCA9IDA7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAgKCkgPT4geyBsYXN0VXNlcklucHV0ID0gRGF0ZS5ub3coKTsgfSwgdHJ1ZSk7CgogICAgZnVuY3Rpb24gb25WaWRlb05hdmlnYXRpb24oKSB7CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICAgIGlmIChJU19JT1MpIHJldHVybjsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBnZXRWaWRlbygpOwogICAgICAgIGlmICghdmlkZW8pIHJldHVybjsKICAgICAgICBpZiAodmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlcikgewogICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB2aWRlby5fYmdQbGF5UGF1c2VIYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHsKICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tlZCBvciBwcmVzc2VkIGEga2V5IHdpdGhpbiAxcyBiZWZvcmUgdGhlIHBhdXNlLCBpdCdzIGludGVudGlvbmFsCiAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RVc2VySW5wdXQgPCAxMDAwKSByZXR1cm47CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgdiA9IGdldFZpZGVvKCk7CiAgICAgICAgICAgIGlmICh2ICYmIHYucGF1c2VkICYmICF2LmVuZGVkICYmIHYucmVhZHlTdGF0ZSA+PSAyKSB2LnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgICAgICB9LCA4MDApOwogICAgICAgIH07CiAgICAgICAgdmlkZW8uX2JnUGxheVBhdXNlSGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVyKTsKICAgICAgfSwgMTUwMCk7CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3l0LW5hdmlnYXRlLWZpbmlzaCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd5dC1wYWdlLWRhdGEtdXBkYXRlZCcsIG9uVmlkZW9OYXZpZ2F0aW9uKTsKCiAgICAvLyBTaW11bGF0ZSB1c2VyIGludGVyYWN0aW9uIHRvIHByZXZlbnQgIkFyZSB5b3Ugc3RpbGwgd2F0Y2hpbmc/IgogICAgY29uc3QgSU5URVJBQ1RJT05fSU5URVJWQUwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWluCiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGNvbnN0IHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtb3ZpZV9wbGF5ZXInKTsKICAgICAgaWYgKHBsYXllcikgewogICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW1vdmUnLCB7IGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICB9CiAgICAgIHJlZnJlc2hMYWN0KCk7CiAgICB9LCBJTlRFUkFDVElPTl9JTlRFUlZBTCk7CgogICAgLy8gS2VlcCBwbGF5ZXIgc3RhdGUgdXBkYXRlZAogICAgY29uc3QgUExBWUVSX1NUQVRFX0lOVEVSVkFMID0gNjAgKiAxMDAwOyAvLyAxIG1pbgogICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjb25zdCB2aWRlbyA9IGdldFZpZGVvKCk7CiAgICAgIGlmICh2aWRlbyAmJiAhdmlkZW8ucGF1c2VkKSB7CiAgICAgICAgdmlkZW8uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3RpbWV1cGRhdGUnKSk7CiAgICAgIH0KICAgIH0sIFBMQVlFUl9TVEFURV9JTlRFUlZBTCk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIGRlbGF5ID0gMTAwMCkgewogICAgY29uc3QgbWF4RGVsYXkgPSA2MCAqIDEwMDA7IC8vIGNhcCBhdCA2MHMKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCAnX2xhY3QnKSkgewogICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dCgKICAgICAgICAoKSA9PiB3YWl0Rm9yTGFjdChjYWxsYmFjaywgaW50ZXJ2YWwsIE1hdGgubWluKGRlbGF5ICogMiwgbWF4RGVsYXkpKSwKICAgICAgICBkZWxheQogICAgICApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVmcmVzaExhY3QoKSB7CiAgICB0cnkgewogICAgICBpZiAod2luZG93Ll9sYWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7fQogIH0KfSkoKTsK"},{"name":"brave-video-bg-play.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIGJyYXZlLXZpZGVvLWJnLXBsYXkuanMKLy8gQmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkKLy8gTGljZW5zZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3ZpZGVvLWJnLXBsYXkvYmxvYi9tYXN0ZXIvTElDRU5TRSAoTUlUKQovLyBGcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9nd2Fyc2VyLzNiNDdiNjE4NjNiZmZjZmViZTQ0OThjNzdiMjMwMWNkCihmdW5jdGlvbigpewpjb25zdCBJU19ZT1VUVUJFID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUuY29tLykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNlYXJjaCgvKD86XnwuK1wuKXlvdXR1YmUtbm9jb29raWUuY29tLykgPiAtMTsKY29uc3QgSVNfTU9CSUxFX1lPVVRVQkUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gJ20ueW91dHViZS5jb20nOwpjb25zdCBJU19ERVNLVE9QX1lPVVRVQkUgPSBJU19ZT1VUVUJFICYmICFJU19NT0JJTEVfWU9VVFVCRTsKY29uc3QgSVNfVklNRU8gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2VhcmNoKC8oPzpefC4rXC4pdmltZW8uY29tLykgPiAtMTsKY29uc3QgSVNfQU5EUk9JRCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xOwovLyBQYWdlIFZpc2liaWxpdHkgQVBJCmlmIChJU19BTkRST0lEIHx8ICFJU19ERVNLVE9QX1lPVVRVQkUpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkb2N1bWVudCwKICAgIHsgJ2hpZGRlbic6IHt2YWx1ZTogZmFsc2V9LCAndmlzaWJpbGl0eVN0YXRlJzoge3ZhbHVlOiAndmlzaWJsZSd9IH0pOwp9CndpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICd2aXNpYmlsaXR5Y2hhbmdlJywgZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwgdHJ1ZSk7Ci8vIEZ1bGxzY3JlZW4gQVBJCmlmIChJU19WSU1FTykgewogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBldnQgPT4gZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCB0cnVlKTsKfQovLyBVc2VyIGFjdGl2aXR5IHRyYWNraW5nCmlmIChJU19ZT1VUVUJFKSB7CiAgY29uc3QgcmVmcmVzaEludGVydmFsID0gNSAqIDYwICogMTAwMDsgLy8gZXZlcnkgNSBtaW51dGVzCiAgd2FpdEZvcllvdXR1YmVMYWN0SW5pdCgoKSA9PiByZWZyZXNoTGFjdCgpLCByZWZyZXNoSW50ZXJ2YWwpOwp9CmZ1bmN0aW9uIHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCwgYURlbGF5ID0gMTAwMCkgewogIGxldCBwYWdlV2luID0gd2luZG93OwogIGlmIChwYWdlV2luLmhhc093blByb3BlcnR5KCdfbGFjdCcpKSB7CiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoYUNhbGxiYWNrLCBhQ2FsbGJhY2tJbnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHdhaXRGb3JZb3V0dWJlTGFjdEluaXQoYUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2FsbGJhY2tJbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYURlbGF5ICogMiksCiAgICAgICAgICAgICAgICAgICAgICBhRGVsYXkpOwogIH0KfQpmdW5jdGlvbiByZWZyZXNoTGFjdCgpIHsKICB3aW5kb3cuX2xhY3QgPSBEYXRlLm5vdygpOwp9Cn0pKCkK"},{"name":"brave-youtube-navigation-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KF8gPT4gewogIGNvbnN0IG9yaWdQZXJmTm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdzsKICBsZXQgcHJldmlvdXMgPSAwOwoKICB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgewogICAgbGV0IGN1cnJlbnQgPSBvcmlnUGVyZk5vdy5hcHBseSh0aGlzKTsKICAgIGlmIChjdXJyZW50IDw9IHByZXZpb3VzKSB7CiAgICAgIGN1cnJlbnQgPSBwcmV2aW91cyArIE51bWJlci5FUFNJTE9OICogMTAwMDAwOwogICAgfQoKICAgIHJldHVybiBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgfQp9KSgpOwo="},{"name":"brave-youtube-theater-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGFzeW5jIF8gPT4gewogIGlmIChzZWxmLmNvb2tpZVN0b3JlID09PSB1bmRlZmluZWQpIHsKICAgIC8vIERvIG5vdGhpbmcgb24gaU9TLiBUaGUgcHJvYmxlbSBkb2Vzbid0IGV4aXN0IHRoZXJlLCBhbmQgdGhlCiAgICAvLyBzb2x1dGlvbiB3b3VsZG4ndCB3b3JrIGFueXdheQogICAgcmV0dXJuCiAgfQogIGNvbnN0IHN0b3JlS2V5ID0gJ2JyYXZlOjp3aWRlJwogIGNvbnN0IGNvb2tpZUtleSA9ICd3aWRlJwoKICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICBjb25zdCB3aWRlQ29va2llQmFja3VwID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmVLZXkpCgogIC8vIFNldCB0aGUgY29va2llIGZyb20gbG9jYWxTdG9yYWdlIGlmZjogCiAgLy8gMSkgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgogIC8vIDIpIHdlIGhhdmUgYSBiYWNrdXAgaW4gbG9jYWxTdG9yYWdlLgogIGlmICghd2lkZUNvb2tpZSAmJiB3aWRlQ29va2llQmFja3VwKSB7CiAgICAvLyBUaGUgY29va2llIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBzdHJpbmcuIFBhcnNlIGl0LgogICAgY29uc3QgY29va2llT2JqID0gSlNPTi5wYXJzZSh3aWRlQ29va2llQmFja3VwKQogICAgYXdhaXQgY29va2llU3RvcmUuc2V0KGNvb2tpZU9iaikKICAgIC8vIFJlZnJlc2ggdGhlIHBhZ2UgdG8gbWFrZSBZVCB1c2UgdGhlIG5ldyBjb29raWUuCiAgICBsb2NhdGlvbi5yZWxvYWQoKQogIH0KCiAgLy8gUGVyc2lzdCB0aGUgY29va2llIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBldmVyeSBzZWNvbmQuCiAgc2V0SW50ZXJ2YWwoYXN5bmMgXyA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCB3aWRlQ29va2llID0gYXdhaXQgY29va2llU3RvcmUuZ2V0KGNvb2tpZUtleSkKICAgICAgLy8gV2UgaGF2ZSB0byBzdHJpbmdpZnkgdGhlIGNvb2tpZSBvYmplY3QgdG8gc3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlLgogICAgICBpZiAod2lkZUNvb2tpZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JlS2V5LCBKU09OLnN0cmluZ2lmeSh3aWRlQ29va2llKSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSkKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBzd2FsbG93IGVycm9yIGZyb20gbm8gY29va2llIGV4aXN0aW5nCiAgICB9CiAgfSwgMTAwMCkKfSkoKTsK"},{"name":"de-amp.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uICgpIHsKICBpZiAodHlwZW9mIGRlQW1wRW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVBbXBFbmFibGVkKSB7CiAgICBjb25zdCBhdHRyID0gJ2pzYWN0aW9uJwogICAgY29uc3Qgc2VsZWN0b3IgPSBgYVtkYXRhLWFtcC10aXRsZV1bJHthdHRyfV1gCiAgICBsZXQgdGltZXIKICAgIGNvbnN0IGlkbGVDYWxsYmFjayA9IChfID0+IHsKICAgICAgaWYgKHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgewogICAgICAgIHJldHVybiAoY2FsbGJhY2ssIHRpbWVvdXQpID0+IHsKICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dCB9KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRmFsbGJhY2sgdG8gc2V0VGltZW91dCB3aGVuIHJlcXVlc3RJZGxlQ2FsbGJhY2sgZG9lc24ndCBleGlzdC4KICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gewogICAgICAgIHJldHVybiBzZWxmLnNldFRpbWVvdXQoY2FsbGJhY2ssIDApCiAgICAgIH0KICAgIH0pKCkKICAgIGNvbnN0IHJtYXR0ciA9ICgpID0+IHsKICAgICAgdGltZXIgPSB1bmRlZmluZWQKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpCiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsgfQogICAgfQogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gKG11dGF0aW9ucykgPT4gewogICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGxldCBza2lwID0gdHJ1ZQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrKSB7CiAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXQogICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlcycpIHsKICAgICAgICAgIHNraXAgPSBmYWxzZQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKykgewogICAgICAgICAgaWYgKGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKyspIHsKICAgICAgICAgIGlmIChyZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgICAgc2tpcCA9IGZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIHRpbWVyID0gaWRsZUNhbGxiYWNrKHJtYXR0ciwgMTcpCiAgICB9CgogICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7CiAgICAgIHJtYXR0cigpCiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKQogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFthdHRyXSwKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICB9KQogICAgfQoKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHN0YXJ0LCB7IG9uY2U6IHRydWUgfSkKICB9Cn0pKCk7Cg=="},{"name":"touch-fix.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8gUmVtb3ZlIHRvdWNoIGNoZWNrcyBvbiBzZWxlY3RlZCBtb2JpbGUgc2l0ZXMKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUb3VjaApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hzdGFydApkZWxldGUgRG9jdW1lbnQucHJvdG90eXBlLm9udG91Y2hlbmQKZGVsZXRlIERvY3VtZW50LnByb3RvdHlwZS5vbnRvdWNoY2FuY2VsCmRlbGV0ZSBEb2N1bWVudC5wcm90b3R5cGUuVG91Y2hFdmVudAo="},{"name":"trusted_types.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"Ly8vIHNldC10cnVzdGVkLXR5cGVzLmpzCmZ1bmN0aW9uIHNldFRydXN0ZWRUeXBlcygpIHsKICBpZiAod2luZG93LnRydXN0ZWRUeXBlcyAmJiB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSkgewogICAgd2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImRlZmF1bHQiLCB7CiAgICAgIGNyZWF0ZVNjcmlwdDogc3RyaW5nID0+IHN0cmluZwogICAgfSk7CiAgIH0KICAgcnVuQXQoKCkgPT4ge30sICdpbnRlcmFjdGl2ZScpOwp9Cg=="},{"name":"vaft-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAndXNlIHN0cmljdCc7CiAgICBjb25zdCBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSAyNDsvLyBVc2VkIHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3V0ZGF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNjcmlwdHMKICAgIGlmICh0eXBlb2Ygd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiA+PSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24pIHsKICAgICAgICBjb25zb2xlLmxvZygic2tpcHBpbmcgdmFmdCBhcyB0aGVyZSdzIGFub3RoZXIgc2NyaXB0IGFjdGl2ZS4gb3VyVmVyc2lvbjoiICsgb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uICsgIiBhY3RpdmVWZXJzaW9uOiIgKyB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uKTsKICAgICAgICB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy50d2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb247CiAgICBmdW5jdGlvbiBkZWNsYXJlT3B0aW9ucyhzY29wZSkgewogICAgICAgIHNjb3BlLkFkU2lnbmlmaWVyID0gJ3N0aXRjaGVkJzsKICAgICAgICBzY29wZS5DbGllbnRJRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIHNjb3BlLkJhY2t1cFBsYXllclR5cGVzID0gWwogICAgICAgICAgICAnZW1iZWQnLC8vU291cmNlCiAgICAgICAgICAgICdwb3BvdXQnLC8vU291cmNlCiAgICAgICAgICAgICdhdXRvcGxheScsLy8zNjBwCiAgICAgICAgICAgIC8vJ3BpY3R1cmUtYnktcGljdHVyZS1DQUNIRUQnLy8zNjBwICgtQ0FDSEVEIGlzIGFuIGludGVybmFsIHN1ZmZpeCBhbmQgaXMgcmVtb3ZlZCkKICAgICAgICBdOwogICAgICAgIHNjb3BlLkZhbGxiYWNrUGxheWVyVHlwZSA9ICdlbWJlZCc7CiAgICAgICAgc2NvcGUuRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUgPSAncG9wb3V0JzsKICAgICAgICBzY29wZS5Ta2lwUGxheWVyUmVsb2FkT25IZXZjID0gZmFsc2U7Ly8gSWYgdHJ1ZSB0aGlzIHdpbGwgc2tpcCBwbGF5ZXIgcmVsb2FkIG9uIHN0cmVhbXMgd2hpY2ggaGF2ZSAyay80ayBxdWFsaXR5IChpZiB5b3UgZW5hYmxlIHRoaXMgYW5kIHlvdSB1c2UgdGhlIDJrLzRrIHF1YWxpdHkgc2V0dGluZyB5b3UnbGwgZ2V0IGVycm9yICM0MDAwIC8gIzMwMDAgLyBzcGlubmluZyB3aGVlbCBvbiBjaHJvbWUgYmFzZWQgYnJvd3NlcnMpCiAgICAgICAgc2NvcGUuQWx3YXlzUmVsb2FkUGxheWVyT25BZCA9IGZhbHNlOy8vIEFsd2F5cyBwYXVzZS9wbGF5IHdoZW4gZW50ZXJpbmcvbGVhdmluZyBhZHMKICAgICAgICBzY29wZS5SZWxvYWRQbGF5ZXJBZnRlckFkID0gdHJ1ZTsvLyBBZnRlciB0aGUgYWQgZmluaXNoZXMgZG8gYSBwbGF5ZXIgcmVsb2FkIGluc3RlYWQgb2YgcGF1c2UvcGxheQogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1RpbWUgPSAxNTAwOwogICAgICAgIHNjb3BlLlBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4ID0gMjsvL2F1dG9wbGF5CiAgICAgICAgc2NvcGUuSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkID0gZmFsc2U7CiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3MgPSBbXTsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvc0J5VXJsID0gW107CiAgICAgICAgc2NvcGUuR1FMRGV2aWNlSUQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudFZlcnNpb24gPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudFNlc3Npb24gPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nRml4ID0gdHJ1ZTsvLyBJZiB0cnVlIHRoaXMgd2lsbCBwYXVzZS9wbGF5IHRoZSBwbGF5ZXIgd2hlbiBpdCBnZXRzIHN0dWNrIGJ1ZmZlcmluZwogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ0RlbGF5ID0gNjAwOy8vIEhvdyBvZnRlbiBzaG91bGQgd2UgY2hlY2sgdGhlIHBsYXllciBzdGF0ZSAoaW4gbWlsbGlzZWNvbmRzKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1NhbWVTdGF0ZUNvdW50ID0gMzsvLyBIb3cgbWFueSB0aW1lcyBvZiBzZWVpbmcgdGhlIHNhbWUgcGxheWVyIHN0YXRlIHVudGlsIHdlIHRyaWdnZXIgcGF1c2UvcGxheSAoaXQgd2lsbCBvbmx5IHRyaWdnZXIgaXQgb25lIHRpbWUgdW50aWwgdGhlIHBsYXllciBzdGF0ZSBjaGFuZ2VzIGFnYWluKQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ0RhbmdlclpvbmUgPSAxOy8vIFRoZSBidWZmZXJpbmcgdGltZSBsZWZ0IChpbiBzZWNvbmRzKSB3aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIHBsYXllcnMgcGxheWJhY2sgcG9zaXRpb24gaW4gdGhlIHBsYXllciBzdGF0ZSBjaGVjawogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ0RvUGxheWVyUmVsb2FkID0gZmFsc2U7Ly8gSWYgdHJ1ZSB0aGlzIHdpbGwgZG8gYSBwbGF5ZXIgcmVsb2FkIGluc3RlYWQgb2YgcGF1c2UvcGxheSAocGxheWVyIHJlbG9hZGluZyBpcyBiZXR0ZXIgYXQgZml4aW5nIHRoZSBwbGF5YmFjayBpc3N1ZXMgYnV0IGl0IHRha2VzIHNsaWdodGx5IGxvbmdlcikKICAgICAgICBzY29wZS5QbGF5ZXJCdWZmZXJpbmdNaW5SZXBlYXREZWxheSA9IDgwMDA7Ly8gTWluaW11bSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZXR3ZWVuIGVhY2ggcGF1c2UvcGxheSAodGhpcyBpcyB0byBhdm9pZCBvdmVyIHByZXNzaW5nIHBhdXNlL3BsYXkgd2hlbiB0aGVyZSBhcmUgZ2VudWluZSBidWZmZXJpbmcgcHJvYmxlbXMpCiAgICAgICAgc2NvcGUuUGxheWVyQnVmZmVyaW5nUHJlcm9sbENoZWNrRW5hYmxlZCA9IGZhbHNlOy8vIEVuYWJsZSB0aGlzIGlmIHlvdSdyZSBnZXR0aW5nIGFuIGltbWVkaWF0ZSBwYXVzZS9wbGF5L3JlbG9hZCBhcyB5b3Ugb3BlbiBhIHN0cmVhbSAod2hpY2ggaXMgY2F1c2luZyB0aGUgc3RyZWFtIHRvIHRha2UgbG9uZ2VyIHRvIGxvYWQpLiBPbmUgcHJvYmxlbSB3aXRoIHRoaXMgYmVpbmcgdHJ1ZSBpcyB0aGF0IGl0IGNhbiBjYXVzZSB0aGUgcGxheWVyIHRvIGdldCBzdHVjayBpbiBzb21lIGluc3RhbmNlcyByZXF1aXJpbmcgdGhlIHVzZXIgdG8gcHJlc3MgcGF1c2UvcGxheQogICAgICAgIHNjb3BlLlBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja09mZnNldCA9IDU7Ly8gSG93IGZhciB0aGUgc3RyZWFtIG5lZWQgdG8gbW92ZSBiZWZvcmUgZG9pbmcgdGhlIGJ1ZmZlcmluZyBtaXRpZ2F0aW9uIChkZXBlbmRzIG9uIFBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgYmVpbmcgdHJ1ZSkKICAgICAgICBzY29wZS5WMkFQSSA9IGZhbHNlOwogICAgICAgIHNjb3BlLklzQWRTdHJpcHBpbmdFbmFibGVkID0gdHJ1ZTsKICAgICAgICBzY29wZS5BZFNlZ21lbnRDYWNoZSA9IG5ldyBNYXAoKTsKICAgICAgICBzY29wZS5BbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSBmYWxzZTsKICAgIH0KICAgIGxldCBpc0FjdGl2ZWx5U3RyaXBwaW5nQWRzID0gZmFsc2U7CiAgICBsZXQgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IGZhbHNlOwogICAgY29uc3QgdHdpdGNoV29ya2VycyA9IFtdOwogICAgY29uc3Qgd29ya2VyU3RyaW5nQ29uZmxpY3RzID0gWwogICAgICAgICd0d2l0Y2gnLAogICAgICAgICdpc1ZhcmlhbnRBJy8vIFR3aXRjaE5vU3ViCiAgICBdOwogICAgY29uc3Qgd29ya2VyU3RyaW5nQWxsb3cgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ1JlaW5zZXJ0ID0gWwogICAgICAgICdpc1ZhcmlhbnRBJywvLyBUd2l0Y2hOb1N1YiAocHJpb3IgdG8gKDAuOSkpCiAgICAgICAgJ2Jlc3VwZXIvJywvLyBUd2l0Y2hOb1N1YiAoMC45KQogICAgICAgICcke3BhdGNoX3VybH0nLy8gVHdpdGNoTm9TdWIgKDAuOS4xKQogICAgXTsKICAgIGZ1bmN0aW9uIGdldENsZWFuV29ya2VyKHdvcmtlcikgewogICAgICAgIGxldCByb290ID0gbnVsbDsKICAgICAgICBsZXQgcGFyZW50ID0gbnVsbDsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSAmJiAhd29ya2VyU3RyaW5nQWxsb3cuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKSkgewogICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwYXJlbnQsIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHJvb3QgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByb290ID0gcHJvdG87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwcm90bzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByb290OwogICAgfQogICAgZnVuY3Rpb24gZ2V0V29ya2Vyc0ZvclJlaW5zZXJ0KHdvcmtlcikgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgICAgIGxldCBwcm90byA9IHdvcmtlcjsKICAgICAgICB3aGlsZSAocHJvdG8pIHsKICAgICAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gcHJvdG8udG9TdHJpbmcoKTsKICAgICAgICAgICAgaWYgKHdvcmtlclN0cmluZ1JlaW5zZXJ0LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHByb3RvKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiByZWluc2VydFdvcmtlcnMod29ya2VyLCByZWluc2VydCkgewogICAgICAgIGxldCBwYXJlbnQgPSB3b3JrZXI7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVpbnNlcnRbaV0sIHBhcmVudCk7CiAgICAgICAgICAgIHBhcmVudCA9IHJlaW5zZXJ0W2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyZW50OwogICAgfQogICAgZnVuY3Rpb24gaXNWYWxpZFdvcmtlcih3b3JrZXIpIHsKICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSB3b3JrZXIudG9TdHJpbmcoKTsKICAgICAgICByZXR1cm4gIXdvcmtlclN0cmluZ0NvbmZsaWN0cy5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpCiAgICAgICAgICAgIHx8IHdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkKICAgICAgICAgICAgfHwgd29ya2VyU3RyaW5nUmVpbnNlcnQuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhvb2tXaW5kb3dXb3JrZXIoKSB7CiAgICAgICAgY29uc3QgcmVpbnNlcnQgPSBnZXRXb3JrZXJzRm9yUmVpbnNlcnQod2luZG93Lldvcmtlcik7CiAgICAgICAgY29uc3QgbmV3V29ya2VyID0gY2xhc3MgV29ya2VyIGV4dGVuZHMgZ2V0Q2xlYW5Xb3JrZXIod2luZG93LldvcmtlcikgewogICAgICAgICAgICBjb25zdHJ1Y3Rvcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBsZXQgaXNUd2l0Y2hXb3JrZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaXNUd2l0Y2hXb3JrZXIgPSBuZXcgVVJMKHR3aXRjaEJsb2JVcmwpLm9yaWdpbi5lbmRzV2l0aCgnLnR3aXRjaC50dicpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICAgICAgaWYgKCFpc1R3aXRjaFdvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKHR3aXRjaEJsb2JVcmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2JTdHIgPSBgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ0ZldGNoUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgJHtzdHJpcEFkU2VnbWVudHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFN0cmVhbVVybEZvclJlc29sdXRpb24udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3Byb2Nlc3NNM1U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtob29rV29ya2VyRmV0Y2gudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2RlY2xhcmVPcHRpb25zLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRBY2Nlc3NUb2tlbi50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z3FsUmVxdWVzdC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cGFyc2VBdHRyaWJ1dGVzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRXYXNtV29ya2VySnMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dldFNlcnZlclRpbWVGcm9tTTN1OC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7cmVwbGFjZVNlcnZlclRpbWVJbk0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBnZXRXYXNtV29ya2VySnMoJyR7dHdpdGNoQmxvYlVybC5yZXBsYWNlQWxsKCInIiwgIiUyNyIpfScpOwogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVPcHRpb25zKHNlbGYpOwogICAgICAgICAgICAgICAgICAgIEdRTERldmljZUlEID0gJHtHUUxEZXZpY2VJRCA/ICInIiArIEdRTERldmljZUlEICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbkhlYWRlciA9ICR7QXV0aG9yaXphdGlvbkhlYWRlciA/ICInIiArIEF1dGhvcml6YXRpb25IZWFkZXIgKyAiJyIgOiB1bmRlZmluZWR9OwogICAgICAgICAgICAgICAgICAgIENsaWVudEludGVncml0eUhlYWRlciA9ICR7Q2xpZW50SW50ZWdyaXR5SGVhZGVyID8gIiciICsgQ2xpZW50SW50ZWdyaXR5SGVhZGVyICsgIiciIDogbnVsbH07CiAgICAgICAgICAgICAgICAgICAgQ2xpZW50VmVyc2lvbiA9ICR7Q2xpZW50VmVyc2lvbiA/ICInIiArIENsaWVudFZlcnNpb24gKyAiJyIgOiBudWxsfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gJHtDbGllbnRTZXNzaW9uID8gIiciICsgQ2xpZW50U2Vzc2lvbiArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFZlcnNpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudFNlc3Npb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRTZXNzaW9uID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1VwZGF0ZUNsaWVudElkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SUQgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlRGV2aWNlSWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5nZXQocmVzcG9uc2VEYXRhLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5kZWxldGUocmVzcG9uc2VEYXRhLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VEYXRhLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IocmVzcG9uc2VEYXRhLmVycm9yKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgUmVzcG9uc2Ugb2JqZWN0IGZyb20gdGhlIHJlc3BvbnNlIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdUcmlnZ2VyZWRQbGF5ZXJSZWxvYWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNUcmlnZ2VyZWRQbGF5ZXJSZWxvYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1NpbXVsYXRlQWRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltdWxhdGVkQWRzRGVwdGggPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU2ltdWxhdGVkQWRzRGVwdGg6ICcgKyBTaW11bGF0ZWRBZHNEZXB0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gIUFsbFNlZ21lbnRzQXJlQWRTZWdtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM6ICcgKyBBbGxTZWdtZW50c0FyZUFkU2VnbWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaG9va1dvcmtlckZldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgZXZhbCh3b3JrZXJTdHJpbmcpOwogICAgICAgICAgICAgICAgYDsKICAgICAgICAgICAgICAgIHN1cGVyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW25ld0Jsb2JTdHJdKSksIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgdHdpdGNoV29ya2Vycy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQWRCbG9ja0Jhbm5lcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWRibG9ja0Jhbm5lcihlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnUGF1c2VSZXN1bWVQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdSZWxvYWRQbGF5ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvVHdpdGNoUGxheWVyVGFzayhmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBhc3luYyBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEua2V5ID09ICdGZXRjaFJlcXVlc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IGV2ZW50LmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ0ZldGNoUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbGV0IHdvcmtlckluc3RhbmNlID0gcmVpbnNlcnRXb3JrZXJzKG5ld1dvcmtlciwgcmVpbnNlcnQpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdXb3JrZXInLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VySW5zdGFuY2U7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkV29ya2VyKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHdvcmtlckluc3RhbmNlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBdHRlbXB0IHRvIHNldCB0d2l0Y2ggd29ya2VyIGRlbmllZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXYXNtV29ya2VySnModHdpdGNoQmxvYlVybCkgewogICAgICAgIGNvbnN0IHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKCdHRVQnLCB0d2l0Y2hCbG9iVXJsLCBmYWxzZSk7CiAgICAgICAgcmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQvamF2YXNjcmlwdCIpOwogICAgICAgIHJlcS5zZW5kKCk7CiAgICAgICAgcmV0dXJuIHJlcS5yZXNwb25zZVRleHQ7CiAgICB9CiAgICBmdW5jdGlvbiBob29rV29ya2VyRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2hvb2tXb3JrZXJGZXRjaCAodmFmdCknKTsKICAgICAgICBjb25zdCByZWFsRmV0Y2ggPSBmZXRjaDsKICAgICAgICBmZXRjaCA9IGFzeW5jIGZ1bmN0aW9uKHVybCwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIGlmIChBZFNlZ21lbnRDYWNoZS5oYXModXJsKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VuZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaCgnZGF0YTp2aWRlby9tcDQ7YmFzZTY0LEFBQUFLR1owZVhCdGNEUXlBQUFBQVdsemIyMXRjRFF5WkdGemFHRjJZekZwYzI4MmFHeHpaZ0FBQkVsdGIyOTJBQUFBYkcxMmFHUUFBQUFBQUFBQUFBQUFBQUFBQVlhZ0FBQUFBQUFCQUFBQkFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURBQUFCcUhSeVlXc0FBQUJjZEd0b1pBQUFBQU1BQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQVVSdFpHbGhBQUFBSUcxa2FHUUFBQUFBQUFBQUFBQUFBQUFBQUx1QUFBQUFBRlhFQUFBQUFBQXRhR1JzY2dBQUFBQUFBQUFBYzI5MWJnQUFBQUFBQUFBQUFBQUFBRk52ZFc1a1NHRnVaR3hsY2dBQUFBRHZiV2x1WmdBQUFCQnpiV2hrQUFBQUFBQUFBQUFBQUFBa1pHbHVaZ0FBQUJ4a2NtVm1BQUFBQUFBQUFBRUFBQUFNZFhKc0lBQUFBQUVBQUFDemMzUmliQUFBQUdkemRITmtBQUFBQUFBQUFBRUFBQUJYYlhBMFlRQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFnQVFBQUFBQUx1QUFBQUFBQUF6WlhOa2N3QUFBQUFEZ0lDQUlnQUJBQVNBZ0lBVVFCVUFBQUFBQUFBQUFBQUFBQVdBZ0lBQ0VaQUdnSUNBQVFJQUFBQVFjM1IwY3dBQUFBQUFBQUFBQUFBQUVITjBjMk1BQUFBQUFBQUFBQUFBQUJSemRITjZBQUFBQUFBQUFBQUFBQUFBQUFBQUVITjBZMjhBQUFBQUFBQUFBQUFBQWVWMGNtRnJBQUFBWEhScmFHUUFBQUFEQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQW9BQUFBRm9BQUFBQUFHQmJXUnBZUUFBQUNCdFpHaGtBQUFBQUFBQUFBQUFBQUFBQUE5Q1FBQUFBQUJWeEFBQUFBQUFMV2hrYkhJQUFBQUFBQUFBQUhacFpHVUFBQUFBQUFBQUFBQUFBQUJXYVdSbGIwaGhibVJzWlhJQUFBQUJMRzFwYm1ZQUFBQVVkbTFvWkFBQUFBRUFBQUFBQUFBQUFBQUFBQ1JrYVc1bUFBQUFIR1J5WldZQUFBQUFBQUFBQVFBQUFBeDFjbXdnQUFBQUFRQUFBT3h6ZEdKc0FBQUFvSE4wYzJRQUFBQUFBQUFBQVFBQUFKQmhkbU14QUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBb0FCYUFCSUFBQUFTQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdQLy9BQUFBT21GMlkwTUJUVUFlLytFQUkyZE5RQjZXVW9GQVgvTGdMVUJBUUZBQUFENkFBQTZtRGdBQUhvUUFBOUNXN3k0S0FRQUVhT3VQSUFBQUFCQnpkSFJ6QUFBQUFBQUFBQUFBQUFBUWMzUnpZd0FBQUFBQUFBQUFBQUFBRkhOMGMzb0FBQUFBQUFBQUFBQUFBQUFBQUFBUWMzUmpid0FBQUFBQUFBQUFBQUFBU0cxMlpYZ0FBQUFnZEhKbGVBQUFBQUFBQUFBQkFBQUFBUUFBQUM0QUFBQUFBb0FBQUFBQUFDQjBjbVY0QUFBQUFBQUFBQUlBQUFBQkFBQ0NOUUFBQUFBQ1FBQUEnLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwudHJpbUVuZCgpOwogICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgnbTN1OCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSBhc3luYyBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYXdhaXQgcHJvY2Vzc00zVTgodXJsLCBhd2FpdCByZXNwb25zZS50ZXh0KCksIHJlYWxGZXRjaCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsLmluY2x1ZGVzKCcvY2hhbm5lbC9obHMvJykgJiYgIXVybC5pbmNsdWRlcygncGljdHVyZS1ieS1waWN0dXJlJykpIHsKICAgICAgICAgICAgICAgICAgICBWMkFQSSA9IHVybC5pbmNsdWRlcygnL2FwaS92Mi8nKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IChuZXcgVVJMKHVybCkpLnBhdGhuYW1lLm1hdGNoKC8oW15cL10rKSg/PVwuXHcrJCkvKVswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50X2RvbWFpbnMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHBsYXllciBpcyBlbWJlZGVkIGFuZCBzdHJpcHBpbmcgaXQgZ2V0cyByaWQgb2YgZmFrZSBhZHMKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFVybCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdwYXJlbnRfZG9tYWlucycpOwogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB0ZW1wVXJsLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jb2RpbmdzTTN1OCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJUaW1lID0gZ2V0U2VydmVyVGltZUZyb21NM3U4KGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NbY2hhbm5lbE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvICE9IG51bGwgJiYgc3RyZWFtSW5mby5FbmNvZGluZ3NNM1U4ICE9IG51bGwgJiYgKGF3YWl0IHJlYWxGZXRjaChzdHJlYW1JbmZvLkVuY29kaW5nc00zVTgubWF0Y2goL15odHRwczouKlwubTN1OCQvbSlbMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGVuY29kaW5ncyBhcmUgZGVhZCAodGhlIHN0cmVhbSBwcm9iYWJseSByZXN0YXJ0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXSA9IHN0cmVhbUluZm8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTmFtZTogY2hhbm5lbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1Nob3dpbmdBZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0UGxheWVyUmVsb2FkOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdzTTNVODogZW5jb2RpbmdzTTN1OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkTTNVODogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzVXNpbmdNb2RpZmllZE0zVTg6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNoZXJQYXJhbXM6IChuZXcgVVJMKHVybCkpLnNlYXJjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZEFkczogbmV3IFNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJsczogW10sLy8geHh4Lm0zdTggLT4geyBSZXNvbHV0aW9uOiAiMjg0eDE2MCIsIEZyYW1lUmF0ZTogMzAuMCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHV0aW9uTGlzdDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGU6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlQmFja3VwUGxheWVyVHlwZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTWlkcm9sbDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1N0cmlwcGluZ0FkU2VnbWVudHM6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU3RyaXBwZWRBZFNlZ21lbnRzOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gZW5jb2RpbmdzTTN1OC5yZXBsYWNlQWxsKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtU1RSRUFNLUlORicpICYmIGxpbmVzW2kgKyAxXS5pbmNsdWRlcygnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMobGluZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBhdHRyaWJ1dGVzWydSRVNPTFVUSU9OJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbkluZm8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHV0aW9uOiByZXNvbHV0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVSYXRlOiBhdHRyaWJ1dGVzWydGUkFNRS1SQVRFJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlY3M6IGF0dHJpYnV0ZXNbJ0NPREVDUyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJsOiBsaW5lc1tpICsgMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5VcmxzW2xpbmVzW2kgKyAxXV0gPSByZXNvbHV0aW9uSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5SZXNvbHV0aW9uTGlzdC5wdXNoKHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NCeVVybFtsaW5lc1tpICsgMV1dID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub25IZXZjUmVzb2x1dGlvbkxpc3QgPSBzdHJlYW1JbmZvLlJlc29sdXRpb25MaXN0LmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC5Db2RlY3Muc3RhcnRzV2l0aCgnYXZjJykgfHwgZWxlbWVudC5Db2RlY3Muc3RhcnRzV2l0aCgnYXYwJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWx3YXlzUmVsb2FkUGxheWVyT25BZCB8fCAobm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aCA+IDAgJiYgc3RyZWFtSW5mby5SZXNvbHV0aW9uTGlzdC5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdoZXYnKSB8fCBlbGVtZW50LkNvZGVjcy5zdGFydHNXaXRoKCdodmMnKSkgJiYgIVNraXBQbGF5ZXJSZWxvYWRPbkhldmMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9uSGV2Y1Jlc29sdXRpb25MaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobGluZXNbaV0uc3Vic3RyaW5nKGxpbmVzW2ldLmluZGV4T2YoJzonKSArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVjc0tleSA9ICdDT0RFQ1MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc1NldHRpbmdzW2NvZGVjc0tleV0uc3RhcnRzV2l0aCgnaGV2JykgfHwgcmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdodmMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFJlc29sdXRpb24gPSByZXNTZXR0aW5nc1snUkVTT0xVVElPTiddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFt0YXJnZXRXaWR0aCwgdGFyZ2V0SGVpZ2h0XSA9IG9sZFJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdSZXNvbHV0aW9uSW5mbyA9IG5vbkhldmNSZXNvbHV0aW9uTGlzdC5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFRha2UgaW50byBhY2NvdW50ICdGcmFtZS1SYXRlJyB3aGVuIHNvcnRpbmcgKGkuZS4gMTA4MHA2MCB2cyAxMDgwcDMwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbc3RyZWFtV2lkdGhBLCBzdHJlYW1IZWlnaHRBXSA9IGEuUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbc3RyZWFtV2lkdGhCLCBzdHJlYW1IZWlnaHRCXSA9IGIuUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoKHN0cmVhbVdpZHRoQSAqIHN0cmVhbUhlaWdodEEpIC0gKHRhcmdldFdpZHRoICogdGFyZ2V0SGVpZ2h0KSkgLSBNYXRoLmFicygoc3RyZWFtV2lkdGhCICogc3RyZWFtSGVpZ2h0QikgLSAodGFyZ2V0V2lkdGggKiB0YXJnZXRIZWlnaHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kaWZpZWRNM1U4IHN3YXAgJyArIHJlc1NldHRpbmdzW2NvZGVjc0tleV0gKyAnIHRvICcgKyBuZXdSZXNvbHV0aW9uSW5mby5Db2RlY3MgKyAnIG9sZFJlczonICsgb2xkUmVzb2x1dGlvbiArICcgbmV3UmVzOicgKyBuZXdSZXNvbHV0aW9uSW5mby5SZXNvbHV0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmVzW2ldLnJlcGxhY2UoL0NPREVDUz0iW14iXSsiLywgYENPREVDUz0iJHtuZXdSZXNvbHV0aW9uSW5mby5Db2RlY3N9ImApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2kgKyAxXSA9IG5ld1Jlc29sdXRpb25JbmZvLlVybCArICcgJy5yZXBlYXQoaSArIDEpOy8vIFRoZSBzdHJlYW0gZG9lc24ndCBsb2FkIHVubGVzcyBlYWNoIHVybCBsaW5lIGlzIHVuaXF1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vbkhldmNSZXNvbHV0aW9uTGlzdC5sZW5ndGggPiAwIHx8IEFsd2F5c1JlbG9hZFBsYXllck9uQWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLk1vZGlmaWVkTTNVOCA9IGxpbmVzLmpvaW4oJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShyZXBsYWNlU2VydmVyVGltZUluTTN1OChzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPyBzdHJlYW1JbmZvLk1vZGlmaWVkTTNVOCA6IHN0cmVhbUluZm8uRW5jb2RpbmdzTTNVOCwgc2VydmVyVGltZSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVhbEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgnU0VSVkVSLVRJTUU9IihbMC05Ll0rKSInKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiByZXBsYWNlU2VydmVyVGltZUluTTN1OChlbmNvZGluZ3NNM3U4LCBuZXdTZXJ2ZXJUaW1lKSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IilbXiJdKygiKS8sIGAkMSR7bmV3U2VydmVyVGltZX0kMmApIDogZW5jb2RpbmdzTTN1ODsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UobmV3IFJlZ0V4cCgnKFNFUlZFUi1USU1FPSIpWzAtOS5dKyInKSwgYFNFUlZFUi1USU1FPSIke25ld1NlcnZlclRpbWV9ImApIDogZW5jb2RpbmdzTTN1ODsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBzdHJpcEFsbFNlZ21lbnRzLCBzdHJlYW1JbmZvKSB7CiAgICAgICAgbGV0IGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dFN0ci5yZXBsYWNlQWxsKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICBjb25zdCBuZXdBZFVybCA9ICdodHRwczovL3R3aXRjaC50dic7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldOwogICAgICAgICAgICAvLyBSZW1vdmUgdHJhY2tpbmcgdXJscyB3aGljaCBhcHBlYXIgaW4gdGhlIG92ZXJsYXkgVUkKICAgICAgICAgICAgbGluZSA9IGxpbmUKICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC8oWC1UVi1UV0lUQ0gtQUQtVVJMPSIpKD86W14iXSopKCIpL2csIGAkMSR7bmV3QWRVcmx9JDJgKQogICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoLyhYLVRWLVRXSVRDSC1BRC1DTElDSy1UUkFDS0lORy1VUkw9IikoPzpbXiJdKikoIikvZywgYCQxJHtuZXdBZFVybH0kMmApOwogICAgICAgICAgICBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgbGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgKCFsaW5lLmluY2x1ZGVzKCcsbGl2ZScpIHx8IHN0cmlwQWxsU2VnbWVudHMgfHwgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKSkgewogICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudFVybCA9IGxpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGlmICghQWRTZWdtZW50Q2FjaGUuaGFzKHNlZ21lbnRVcmwpKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEFkU2VnbWVudENhY2hlLnNldChzZWdtZW50VXJsLCBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoQWRTaWduaWZpZXIpKSB7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChoYXNTdHJpcHBlZEFkU2VnbWVudHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLy8gTm8gbG93IGxhdGVuY3kgZHVyaW5nIGFkcyAob3RoZXJ3aXNlIGl0J3MgcG9zc2libGUgZm9yIHRoZSBwbGF5ZXIgdG8gcHJlZmV0Y2ggYW5kIGRpc3BsYXkgYWQgc2VnbWVudHMpCiAgICAgICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVRXSVRDSC1QUkVGRVRDSDonKSkgewogICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzID0gaGFzU3RyaXBwZWRBZFNlZ21lbnRzOwogICAgICAgIEFkU2VnbWVudENhY2hlLmZvckVhY2goKHZhbHVlLCBrZXksIG1hcCkgPT4gewogICAgICAgICAgICBpZiAodmFsdWUgPCBEYXRlLm5vdygpIC0gMTIwMDAwKSB7CiAgICAgICAgICAgICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbGluZXMuam9pbignXG4nKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTgucmVwbGFjZUFsbCgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICBpZiAoZW5jb2RpbmdzTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBlbmNvZGluZ3NMaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHJlc29sdXRpb24uc3BsaXQoJ3gnKS5tYXAoTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoKHdpZHRoICogaGVpZ2h0KSAtICh0YXJnZXRXaWR0aCAqIHRhcmdldEhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlIDwgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RSZXNvbHV0aW9uVXJsID0gZW5jb2RpbmdzTGluZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2VzdFJlc29sdXRpb25Vcmw7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBwcm9jZXNzTTNVOCh1cmwsIHRleHRTdHIsIHJlYWxGZXRjaCkgewogICAgICAgIGNvbnN0IHN0cmVhbUluZm8gPSBTdHJlYW1JbmZvc0J5VXJsW3VybF07CiAgICAgICAgaWYgKCFzdHJlYW1JbmZvKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICBpZiAoSGFzVHJpZ2dlcmVkUGxheWVyUmVsb2FkKSB7CiAgICAgICAgICAgIEhhc1RyaWdnZXJlZFBsYXllclJlbG9hZCA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLkxhc3RQbGF5ZXJSZWxvYWQgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICBjb25zdCBoYXZlQWRUYWdzID0gdGV4dFN0ci5pbmNsdWRlcyhBZFNpZ25pZmllcikgfHwgU2ltdWxhdGVkQWRzRGVwdGggPiAwOwogICAgICAgIGlmIChoYXZlQWRUYWdzKSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNaWRyb2xsID0gdGV4dFN0ci5pbmNsdWRlcygnIk1JRFJPTEwiJykgfHwgdGV4dFN0ci5pbmNsdWRlcygnIm1pZHJvbGwiJyk7CiAgICAgICAgICAgIGlmICghc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCA9IHRydWU7CiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgaXNNaWRyb2xsOiBzdHJlYW1JbmZvLklzTWlkcm9sbCwKICAgICAgICAgICAgICAgICAgICBoYXNBZHM6IHN0cmVhbUluZm8uSXNTaG93aW5nQWQsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLklzTWlkcm9sbCkgewogICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0U3RyLnJlcGxhY2VBbGwoJ1xyJywgJycpLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKCcsbGl2ZScpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXF1ZXN0IG9uZSAudHMgZmlsZSBwZXIgLm0zdTggcmVxdWVzdCB0byBhdm9pZCBtYWtpbmcgdG9vIG1hbnkgcmVxdWVzdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0ZldGNoIGFkIC50cyBmaWxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKGxpbmVzW2kgKyAxXSkudGhlbigocmVzcG9uc2UpPT57cmVzcG9uc2UuYmxvYigpfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBjdXJyZW50UmVzb2x1dGlvbiA9IHN0cmVhbUluZm8uVXJsc1t1cmxdOwogICAgICAgICAgICBpZiAoIWN1cnJlbnRSZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWRzIHdpbGwgbGVhayBkdWUgdG8gbWlzc2luZyByZXNvbHV0aW9uIGluZm8gZm9yICcgKyB1cmwpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaXNIZXZjID0gY3VycmVudFJlc29sdXRpb24uQ29kZWNzLnN0YXJ0c1dpdGgoJ2hldicpIHx8IGN1cnJlbnRSZXNvbHV0aW9uLkNvZGVjcy5zdGFydHNXaXRoKCdodmMnKTsKICAgICAgICAgICAgaWYgKCgoaXNIZXZjICYmICFTa2lwUGxheWVyUmVsb2FkT25IZXZjKSB8fCBBbHdheXNSZWxvYWRQbGF5ZXJPbkFkKSAmJiBzdHJlYW1JbmZvLk1vZGlmaWVkTTNVOCAmJiAhc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4KSB7CiAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLklzVXNpbmdNb2RpZmllZE0zVTggPSB0cnVlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdSZWxvYWRQbGF5ZXInCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgYmFja3VwUGxheWVyVHlwZSA9IG51bGw7CiAgICAgICAgICAgIGxldCBiYWNrdXBNM3U4ID0gbnVsbDsKICAgICAgICAgICAgbGV0IGZhbGxiYWNrTTN1OCA9IG51bGw7CiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDsKICAgICAgICAgICAgbGV0IGlzRG9pbmdNaW5pbWFsUmVxdWVzdHMgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8uTGFzdFBsYXllclJlbG9hZCA+IERhdGUubm93KCkgLSBQbGF5ZXJSZWxvYWRNaW5pbWFsUmVxdWVzdHNUaW1lKSB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIGRvaW5nIHBsYXllciByZWxvYWQgdGhlcmUgYXJlIGEgbG90IG9mIHJlcXVlc3RzIHdoaWNoIGNhdXNlcyB0aGUgYmFja3VwIHN0cmVhbSB0byBsb2FkIGluIHNsb3cuIEJyaWVmbHkgcHJlZmVyIHVzaW5nIGEgc2luZ2xlIHZlcnNpb24gdG8gcHJldmVudCBsb25nIGRlbGF5cwogICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IFBsYXllclJlbG9hZE1pbmltYWxSZXF1ZXN0c1BsYXllckluZGV4OwogICAgICAgICAgICAgICAgaXNEb2luZ01pbmltYWxSZXF1ZXN0cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgcGxheWVyVHlwZUluZGV4ID0gc3RhcnRJbmRleDsgIWJhY2t1cE0zdTggJiYgcGxheWVyVHlwZUluZGV4IDwgQmFja3VwUGxheWVyVHlwZXMubGVuZ3RoOyBwbGF5ZXJUeXBlSW5kZXgrKykgewogICAgICAgICAgICAgICAgY29uc3QgcGxheWVyVHlwZSA9IEJhY2t1cFBsYXllclR5cGVzW3BsYXllclR5cGVJbmRleF07CiAgICAgICAgICAgICAgICBjb25zdCByZWFsUGxheWVyVHlwZSA9IHBsYXllclR5cGUucmVwbGFjZSgnLUNBQ0hFRCcsICcnKTsKICAgICAgICAgICAgICAgIGNvbnN0IGlzRnVsbHlDYWNoZWRQbGF5ZXJUeXBlID0gcGxheWVyVHlwZSAhPSByZWFsUGxheWVyVHlwZTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWNoZXMgdGhlIG0zdTggaWYgaXQgZG9lc24ndCBoYXZlIGFkcy4gSWYgdGhlIGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaGFzIGFkcyBpdCBmZXRjaGVzIGEgbmV3IHZlcnNpb24gKHNlY29uZCBsb29wKQogICAgICAgICAgICAgICAgICAgIGxldCBpc0ZyZXNoTTN1OCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGxldCBlbmNvZGluZ3NNM3U4ID0gc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NNM1U4Q2FjaGVbcGxheWVyVHlwZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzRnJlc2hNM3U4ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuUmVzcG9uc2UgPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihzdHJlYW1JbmZvLkNoYW5uZWxOYW1lLCByZWFsUGxheWVyVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYWNjZXNzVG9rZW5SZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsSW5mbyA9IG5ldyBVUkwoJ2h0dHBzOi8vdXNoZXIudHR2bncubmV0L2FwaS8nICsgKFYyQVBJID8gJ3YyLycgOiAnJykgKyAnY2hhbm5lbC9obHMvJyArIHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUgKyAnLm0zdTgnICsgc3RyZWFtSW5mby5Vc2hlclBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCdzaWcnLCBhY2Nlc3NUb2tlbi5kYXRhLnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4uc2lnbmF0dXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxJbmZvLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgYWNjZXNzVG9rZW4uZGF0YS5zdHJlYW1QbGF5YmFja0FjY2Vzc1Rva2VuLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGluZ3NNM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2godXJsSW5mby5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtM3U4VGV4dCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0zdThUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJUeXBlID09IEZhbGxiYWNrUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghbTN1OFRleHQuaW5jbHVkZXMoQWRTaWduaWZpZXIpICYmIChTaW11bGF0ZWRBZHNEZXB0aCA9PSAwIHx8IHBsYXllclR5cGVJbmRleCA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCAoIWZhbGxiYWNrTTN1OCAmJiBwbGF5ZXJUeXBlSW5kZXggPj0gQmFja3VwUGxheWVyVHlwZXMubGVuZ3RoIC0gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IG0zdThUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVsbHlDYWNoZWRQbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEb2luZ01pbmltYWxSZXF1ZXN0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwUGxheWVyVHlwZSA9IHBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBNM3U4ID0gbTN1OFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc00zVThDYWNoZVtwbGF5ZXJUeXBlXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnJlc2hNM3U4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJhY2t1cE0zdTggJiYgZmFsbGJhY2tNM3U4KSB7CiAgICAgICAgICAgICAgICBiYWNrdXBQbGF5ZXJUeXBlID0gRmFsbGJhY2tQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgYmFja3VwTTN1OCA9IGZhbGxiYWNrTTN1ODsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFja3VwTTN1OCkgewogICAgICAgICAgICAgICAgdGV4dFN0ciA9IGJhY2t1cE0zdTg7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5BY3RpdmVCYWNrdXBQbGF5ZXJUeXBlICE9IGJhY2t1cFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBiYWNrdXBQbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBCbG9ja2luZyR7KHN0cmVhbUluZm8uSXNNaWRyb2xsID8gJyBtaWRyb2xsICcgOiAnICcpfWFkcyAoJHtiYWNrdXBQbGF5ZXJUeXBlfSlgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBJbXByb3ZlIGhldmMgc3RyaXBwaW5nLiBJdCBzaG91bGQgYWx3YXlzIHN0cmlwIHdoZW4gdGhlcmUgaXMgYSBjb2RlYyBtaXNtYXRjaCAoYm90aCB3YXlzKQogICAgICAgICAgICBjb25zdCBzdHJpcEhldmMgPSBpc0hldmMgJiYgc3RyZWFtSW5mby5Nb2RpZmllZE0zVTg7CiAgICAgICAgICAgIGlmIChJc0FkU3RyaXBwaW5nRW5hYmxlZCB8fCBzdHJpcEhldmMpIHsKICAgICAgICAgICAgICAgIHRleHRTdHIgPSBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBIZXZjLCBzdHJlYW1JbmZvKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnRmluaXNoZWQgYmxvY2tpbmcgYWRzJyk7CiAgICAgICAgICAgIHN0cmVhbUluZm8uSXNTaG93aW5nQWQgPSBmYWxzZTsKICAgICAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBmYWxzZTsKICAgICAgICAgICAgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPSAwOwogICAgICAgICAgICBzdHJlYW1JbmZvLkFjdGl2ZUJhY2t1cFBsYXllclR5cGUgPSBudWxsOwogICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5Jc1VzaW5nTW9kaWZpZWRNM1U4IHx8IFJlbG9hZFBsYXllckFmdGVyQWQpIHsKICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNVc2luZ01vZGlmaWVkTTNVOCA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RyZWFtSW5mby5MYXN0UGxheWVyUmVsb2FkID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdSZWxvYWRQbGF5ZXInCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICBrZXk6ICdQYXVzZVJlc3VtZVBsYXllcicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAga2V5OiAnVXBkYXRlQWRCbG9ja0Jhbm5lcicsCiAgICAgICAgICAgIGlzTWlkcm9sbDogc3RyZWFtSW5mby5Jc01pZHJvbGwsCiAgICAgICAgICAgIGhhc0Fkczogc3RyZWFtSW5mby5Jc1Nob3dpbmdBZCwKICAgICAgICAgICAgaXNTdHJpcHBpbmdBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cywKICAgICAgICAgICAgbnVtU3RyaXBwZWRBZFNlZ21lbnRzOiBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGVzKHN0cikgewogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoCiAgICAgICAgICAgIHN0ci5zcGxpdCgvKD86XnwsKSgoPzpbXj1dKik9KD86IlteIl0qInxbXixdKikpLykKICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAgICAgICAubWFwKHggPT4gewogICAgICAgICAgICAgICAgY29uc3QgaWR4ID0geC5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB4LnN1YnN0cmluZygwLCBpZHgpOwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB4LnN1YnN0cmluZyhpZHggKyAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgTnVtYmVyLmlzTmFOKG51bSkgPyB2YWx1ZS5zdGFydHNXaXRoKCciJykgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlIDogbnVtXTsKICAgICAgICAgICAgfSkpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oY2hhbm5lbE5hbWUsIHBsYXllclR5cGUpIHsKICAgICAgICBjb25zdCBib2R5ID0gewogICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUGxheWJhY2tBY2Nlc3NUb2tlbicsCiAgICAgICAgICAgIHZhcmlhYmxlczogewogICAgICAgICAgICAgICAgaXNMaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgbG9naW46IGNoYW5uZWxOYW1lLAogICAgICAgICAgICAgICAgaXNWb2Q6IGZhbHNlLAogICAgICAgICAgICAgICAgdm9kSUQ6ICIiLAogICAgICAgICAgICAgICAgcGxheWVyVHlwZTogcGxheWVyVHlwZSwKICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBwbGF5ZXJUeXBlID09ICdhdXRvcGxheScgPyAnYW5kcm9pZCcgOiAnd2ViJwogICAgICAgICAgICB9LAogICAgICAgICAgICBleHRlbnNpb25zOiB7CiAgICAgICAgICAgICAgICBwZXJzaXN0ZWRRdWVyeTogewogICAgICAgICAgICAgICAgICAgIHZlcnNpb246MSwKICAgICAgICAgICAgICAgICAgICBzaGEyNTZIYXNoOiJlZDIzMGFhMWUzM2UwN2VlYmI4OTI4NTA0NTgzZGE3OGE1MTczOTg5ZmFkZmIxYWM5NGJlMDZhMDRmM2NkYmU5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZ3FsUmVxdWVzdChib2R5LCBwbGF5ZXJUeXBlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSkgewogICAgICAgIGlmICghR1FMRGV2aWNlSUQpIHsKICAgICAgICAgICAgR1FMRGV2aWNlSUQgPSAnJzsKICAgICAgICAgICAgY29uc3QgZGNoYXJhY3RlcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JzsKICAgICAgICAgICAgY29uc3QgZGNoYXJhY3RlcnNMZW5ndGggPSBkY2hhcmFjdGVycy5sZW5ndGg7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzI7IGkrKykgewogICAgICAgICAgICAgICAgR1FMRGV2aWNlSUQgKz0gZGNoYXJhY3RlcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGRjaGFyYWN0ZXJzTGVuZ3RoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IGhlYWRlcnMgPSB7CiAgICAgICAgICAgICdDbGllbnQtSUQnOiBDbGllbnRJRCwKICAgICAgICAgICAgJ1gtRGV2aWNlLUlkJzogR1FMRGV2aWNlSUQsCiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogQXV0aG9yaXphdGlvbkhlYWRlciwKICAgICAgICAgICAgLi4uKENsaWVudEludGVncml0eUhlYWRlciAmJiB7J0NsaWVudC1JbnRlZ3JpdHknOiBDbGllbnRJbnRlZ3JpdHlIZWFkZXJ9KSwKICAgICAgICAgICAgLi4uKENsaWVudFZlcnNpb24gJiYgeydDbGllbnQtVmVyc2lvbic6IENsaWVudFZlcnNpb259KSwKICAgICAgICAgICAgLi4uKENsaWVudFNlc3Npb24gJiYgeydDbGllbnQtU2Vzc2lvbi1JZCc6IENsaWVudFNlc3Npb259KQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgY29uc3QgcmVxdWVzdElkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KTsKICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gewogICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RJZCwKICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vZ3FsLnR3aXRjaC50di9ncWwnLAogICAgICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuc2V0KHJlcXVlc3RJZCwgewogICAgICAgICAgICAgICAgcmVzb2x2ZSwKICAgICAgICAgICAgICAgIHJlamVjdAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXF1ZXN0JywKICAgICAgICAgICAgICAgIHZhbHVlOiBmZXRjaFJlcXVlc3QKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBsZXQgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICBjb25zdCBwbGF5ZXJCdWZmZXJTdGF0ZSA9IHsKICAgICAgICBjaGFubmVsTmFtZTogbnVsbCwKICAgICAgICBoYXNTdHJlYW1TdGFydGVkOiBmYWxzZSwKICAgICAgICBwb3NpdGlvbjogMCwKICAgICAgICBidWZmZXJlZFBvc2l0aW9uOiAwLAogICAgICAgIGJ1ZmZlckR1cmF0aW9uOiAwLAogICAgICAgIG51bVNhbWU6IDAsCiAgICAgICAgbGFzdEZpeFRpbWU6IDAsCiAgICAgICAgaXNMaXZlOiB0cnVlCiAgICB9OwogICAgZnVuY3Rpb24gbW9uaXRvclBsYXllckJ1ZmZlcmluZygpIHsKICAgICAgICBpZiAocGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgcGxheWVyID0gcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZy5wbGF5ZXI7CiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcuc3RhdGU7CiAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5jb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZyA9IG51bGw7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnByb3BzPy5jb250ZW50Py50eXBlID09PSAnbGl2ZScgJiYgIXBsYXllci5pc1BhdXNlZCgpICYmICFwbGF5ZXIuZ2V0SFRNTFZpZGVvRWxlbWVudCgpPy5lbmRlZCAmJiBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA8PSBEYXRlLm5vdygpIC0gUGxheWVyQnVmZmVyaW5nTWluUmVwZWF0RGVsYXkgJiYgIWlzQWN0aXZlbHlTdHJpcHBpbmdBZHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtM3U4VXJsID0gcGxheWVyLmNvcmU/LnN0YXRlPy5wYXRoOwogICAgICAgICAgICAgICAgICAgIGlmIChtM3U4VXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IG5ldyBVUkwobTN1OFVybCkucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZT8uZW5kc1dpdGgoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IGZpbGVOYW1lLnNsaWNlKDAsIC01KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyQnVmZmVyU3RhdGUuY2hhbm5lbE5hbWUgIT0gY2hhbm5lbE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuY2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuaGFzU3RyZWFtU3RhcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnQ2hhbm5lbCBjaGFuZ2VkIHRvICcgKyBjaGFubmVsTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLmdldFN0YXRlKCkgPT09ICdQbGF5aW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LnBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkUG9zaXRpb24gPSBwbGF5ZXIuY29yZT8uc3RhdGU/LmJ1ZmZlcmVkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyRHVyYXRpb24gPSBwbGF5ZXIuZ2V0QnVmZmVyRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBidWZmZXJlZFBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncG9zaXRpb246JyArIHBvc2l0aW9uICsgJyBidWZmZXJEdXJhdGlvbjonICsgYnVmZmVyRHVyYXRpb24gKyAnIGJ1ZmZlclBvc2l0aW9uOicgKyBidWZmZXJlZFBvc2l0aW9uICsgJyBzdGF0ZTogJyArIHBsYXllci5jb3JlPy5zdGF0ZT8uc3RhdGUgKyAnIHN0YXJ0ZWQ6ICcgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBjb3VsZCBiZSBpbXByb3ZlZC4gSXQgY3VycmVudGx5IGxldHMgdGhlIHBsYXllciBmdWxseSBlYXQgdGhlIGZ1bGwgYnVmZmVyIGJlZm9yZSBpdCB0cmlnZ2VycyBwYXVzZS9wbGF5CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVBsYXllckJ1ZmZlcmluZ1ByZXJvbGxDaGVja0VuYWJsZWQgfHwgcG9zaXRpb24gPiBQbGF5ZXJCdWZmZXJpbmdQcmVyb2xsQ2hlY2tPZmZzZXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gPT0gcG9zaXRpb24gfHwgYnVmZmVyRHVyYXRpb24gPCBQbGF5ZXJCdWZmZXJpbmdEYW5nZXJab25lKSAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlcmVkUG9zaXRpb24gPT0gYnVmZmVyZWRQb3NpdGlvbiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gPj0gYnVmZmVyRHVyYXRpb24gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3NpdGlvbiAhPSAwIHx8IGJ1ZmZlcmVkUG9zaXRpb24gIT0gMCB8fCBidWZmZXJEdXJhdGlvbiAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLm51bVNhbWUrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID09IFBsYXllckJ1ZmZlcmluZ1NhbWVTdGF0ZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0F0dGVtcHQgdG8gZml4IGJ1ZmZlcmluZyBwb3NpdGlvbjonICsgcGxheWVyQnVmZmVyU3RhdGUucG9zaXRpb24gKyAnIGJ1ZmZlcmVkUG9zaXRpb246JyArIHBsYXllckJ1ZmZlclN0YXRlLmJ1ZmZlcmVkUG9zaXRpb24gKyAnIGJ1ZmZlckR1cmF0aW9uOicgKyBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJEdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNQYXVzZVBsYXkgPSAhUGxheWVyQnVmZmVyaW5nRG9QbGF5ZXJSZWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZWxvYWQgPSBQbGF5ZXJCdWZmZXJpbmdEb1BsYXllclJlbG9hZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1R3aXRjaFBsYXllclRhc2soaXNQYXVzZVBsYXksIGlzUmVsb2FkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5sYXN0Rml4VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUubnVtU2FtZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5idWZmZXJlZFBvc2l0aW9uID0gYnVmZmVyZWRQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVmZmVyU3RhdGUuYnVmZmVyRHVyYXRpb24gPSBidWZmZXJEdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3Igd2hlbiBtb25pdG9yaW5nIHBsYXllciBmb3IgYnVmZmVyaW5nOiAnICsgZXJyKTsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghcGxheWVyRm9yTW9uaXRvcmluZ0J1ZmZlcmluZykgewogICAgICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgICAgIGlmIChwbGF5ZXJBbmRTdGF0ZSAmJiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIgJiYgcGxheWVyQW5kU3RhdGUuc3RhdGUpIHsKICAgICAgICAgICAgICAgIHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXJBbmRTdGF0ZS5wbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBsYXllckFuZFN0YXRlLnN0YXRlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzTGl2ZSA9IHBsYXllckZvck1vbml0b3JpbmdCdWZmZXJpbmc/LnN0YXRlPy5wcm9wcz8uY29udGVudD8udHlwZSA9PT0gJ2xpdmUnOwogICAgICAgIGlmIChwbGF5ZXJCdWZmZXJTdGF0ZS5pc0xpdmUgJiYgIWlzTGl2ZSkgewogICAgICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyKHsKICAgICAgICAgICAgICAgIGhhc0FkczogZmFsc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA9IGlzTGl2ZTsKICAgICAgICBzZXRUaW1lb3V0KG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcsIFBsYXllckJ1ZmZlcmluZ0RlbGF5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFkYmxvY2tCYW5uZXIoZGF0YSkgewogICAgICAgIGNvbnN0IHBsYXllclJvb3REaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tcGxheWVyJyk7CiAgICAgICAgaWYgKHBsYXllclJvb3REaXYgIT0gbnVsbCkgewogICAgICAgICAgICBsZXQgYWRCbG9ja0RpdiA9IG51bGw7CiAgICAgICAgICAgIGFkQmxvY2tEaXYgPSBwbGF5ZXJSb290RGl2LnF1ZXJ5U2VsZWN0b3IoJy5hZGJsb2NrLW92ZXJsYXknKTsKICAgICAgICAgICAgaWYgKGFkQmxvY2tEaXYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYWRCbG9ja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5jbGFzc05hbWUgPSAnYWRibG9jay1vdmVybGF5JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InBsYXllci1hZGJsb2NrLW5vdGljZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDVweDsiPjxwPjwvcD48L2Rpdj4nOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYWRCbG9ja0Rpdi5QID0gYWRCbG9ja0Rpdi5xdWVyeVNlbGVjdG9yKCdwJyk7CiAgICAgICAgICAgICAgICBwbGF5ZXJSb290RGl2LmFwcGVuZENoaWxkKGFkQmxvY2tEaXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlbHlTdHJpcHBpbmdBZHMgPSBkYXRhLmlzU3RyaXBwaW5nQWRTZWdtZW50czsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJyk7Ly8gKyAoZGF0YS5udW1TdHJpcHBlZEFkU2VnbWVudHMgPiAwID8gYCAoJHtkYXRhLm51bVN0cmlwcGVkQWRTZWdtZW50c30pYCA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIHBsYXllckJ1ZmZlclN0YXRlLmlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRQbGF5ZXJBbmRTdGF0ZSgpIHsKICAgICAgICBmdW5jdGlvbiBmaW5kUmVhY3ROb2RlKHJvb3QsIGNvbnN0cmFpbnQpIHsKICAgICAgICAgICAgaWYgKHJvb3Quc3RhdGVOb2RlICYmIGNvbnN0cmFpbnQocm9vdC5zdGF0ZU5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5zdGF0ZU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkOwogICAgICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZFJlYWN0Tm9kZShub2RlLCBjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIGxldCByZWFjdFJvb3ROb2RlID0gbnVsbDsKICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm9vdCcpOwogICAgICAgICAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lciAmJiByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIHJlYWN0Um9vdE5vZGUgPSByb290Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVhY3RSb290Tm9kZSA9PSBudWxsICYmIHJvb3ROb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBPYmplY3Qua2V5cyhyb290Tm9kZSkuZmluZCh4ID0+IHguc3RhcnRzV2l0aCgnX19yZWFjdENvbnRhaW5lcicpKTsKICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGVbY29udGFpbmVyTmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWN0Um9vdE5vZGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlYWN0Um9vdE5vZGUgPSBmaW5kUmVhY3RSb290Tm9kZSgpOwogICAgICAgIGlmICghcmVhY3RSb290Tm9kZSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgbGV0IHBsYXllciA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFBsYXllckFjdGl2ZSAmJiBub2RlLnByb3BzICYmIG5vZGUucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSk7CiAgICAgICAgcGxheWVyID0gcGxheWVyICYmIHBsYXllci5wcm9wcyAmJiBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA/IHBsYXllci5wcm9wcy5tZWRpYVBsYXllckluc3RhbmNlIDogbnVsbDsKICAgICAgICBpZiAocGxheWVyPy5wbGF5ZXJJbnN0YW5jZSkgewogICAgICAgICAgICBwbGF5ZXIgPSBwbGF5ZXIucGxheWVySW5zdGFuY2U7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllclN0YXRlID0gZmluZFJlYWN0Tm9kZShyZWFjdFJvb3ROb2RlLCBub2RlID0+IG5vZGUuc2V0U3JjICYmIG5vZGUuc2V0SW5pdGlhbFBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgIHJldHVybiAgewogICAgICAgICAgICBwbGF5ZXI6IHBsYXllciwKICAgICAgICAgICAgc3RhdGU6IHBsYXllclN0YXRlCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGRvVHdpdGNoUGxheWVyVGFzayhpc1BhdXNlUGxheSwgaXNSZWxvYWQpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocGxheWVyLmlzUGF1c2VkKCkgfHwgcGxheWVyLmNvcmU/LnBhdXNlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBsYXllckJ1ZmZlclN0YXRlLmxhc3RGaXhUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5udW1TYW1lID0gMDsKICAgICAgICBpZiAoaXNQYXVzZVBsYXkpIHsKICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgIHBsYXllci5wbGF5KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGlzUmVsb2FkKSB7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5UXVhbGl0eSA9ICd2aWRlby1xdWFsaXR5JzsKICAgICAgICAgICAgY29uc3QgbHNLZXlNdXRlZCA9ICd2aWRlby1tdXRlZCc7CiAgICAgICAgICAgIGNvbnN0IGxzS2V5Vm9sdW1lID0gJ3ZvbHVtZSc7CiAgICAgICAgICAgIGxldCBjdXJyZW50UXVhbGl0eUxTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRNdXRlZExTID0gbnVsbDsKICAgICAgICAgICAgbGV0IGN1cnJlbnRWb2x1bWVMUyA9IG51bGw7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjdXJyZW50UXVhbGl0eUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlRdWFsaXR5KTsKICAgICAgICAgICAgICAgIGN1cnJlbnRNdXRlZExTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlNdXRlZCk7CiAgICAgICAgICAgICAgICBjdXJyZW50Vm9sdW1lTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleVZvbHVtZSk7CiAgICAgICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlSG9va0ZhaWxlZCAmJiBwbGF5ZXI/LmNvcmU/LnN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlNdXRlZCwgSlNPTi5zdHJpbmdpZnkoe2RlZmF1bHQ6cGxheWVyLmNvcmUuc3RhdGUubXV0ZWR9KSk7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIHBsYXllci5jb3JlLnN0YXRlLnZvbHVtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlSG9va0ZhaWxlZCAmJiBwbGF5ZXI/LmNvcmU/LnN0YXRlPy5xdWFsaXR5Py5ncm91cCkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgSlNPTi5zdHJpbmdpZnkoe2RlZmF1bHQ6cGxheWVyLmNvcmUuc3RhdGUucXVhbGl0eS5ncm91cH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICBjb25zb2xlLmxvZygnUmVsb2FkaW5nIFR3aXRjaCBwbGF5ZXInKTsKICAgICAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdUcmlnZ2VyZWRQbGF5ZXJSZWxvYWQnKTsKICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgJiYgKGN1cnJlbnRRdWFsaXR5TFMgfHwgY3VycmVudE11dGVkTFMgfHwgY3VycmVudFZvbHVtZUxTKSkgewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWFsaXR5TFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5UXVhbGl0eSwgY3VycmVudFF1YWxpdHlMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNdXRlZExTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBjdXJyZW50TXV0ZWRMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWVMUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlWb2x1bWUsIGN1cnJlbnRWb2x1bWVMUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgd2luZG93LnJlbG9hZFR3aXRjaFBsYXllciA9ICgpID0+IHsKICAgICAgICBkb1R3aXRjaFBsYXllclRhc2soZmFsc2UsIHRydWUpOwogICAgfTsKICAgIGZ1bmN0aW9uIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKGtleSwgdmFsdWUpIHsKICAgICAgICB0d2l0Y2hXb3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gewogICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpbmRvdy5yZWFsRmV0Y2goZmV0Y2hSZXF1ZXN0LnVybCwgZmV0Y2hSZXF1ZXN0Lm9wdGlvbnMpOwogICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0gewogICAgICAgICAgICAgICAgaWQ6IGZldGNoUmVxdWVzdC5pZCwKICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSksCiAgICAgICAgICAgICAgICBib2R5OiByZXNwb25zZUJvZHkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogZmV0Y2hSZXF1ZXN0LmlkLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBob29rRmV0Y2goKSB7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gd2luZG93LmZldGNoOwogICAgICAgIHdpbmRvdy5yZWFsRmV0Y2ggPSByZWFsRmV0Y2g7CiAgICAgICAgd2luZG93LmZldGNoID0gZnVuY3Rpb24odXJsLCBpbml0LCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ3FsJykpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ1gtRGV2aWNlLUlkJ107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpbml0LmhlYWRlcnNbJ0RldmljZS1JRCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBHUUxEZXZpY2VJRCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBHUUxEZXZpY2VJRCA9IGRldmljZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlRGV2aWNlSWQnLCBHUUxEZXZpY2VJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1WZXJzaW9uJ10gIT09IENsaWVudFZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1VwZGF0ZUNsaWVudFZlcnNpb24nLCBDbGllbnRWZXJzaW9uID0gaW5pdC5oZWFkZXJzWydDbGllbnQtVmVyc2lvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQ2xpZW50LVNlc3Npb24tSWQnXSAhPT0gQ2xpZW50U2Vzc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnVXBkYXRlQ2xpZW50U2Vzc2lvbicsIENsaWVudFNlc3Npb24gPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1TZXNzaW9uLUlkJ10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHJpZCBvZiBtaW5pIHBsYXllciBhYm92ZSBjaGF0IC0gVE9ETzogUmVqZWN0IHRoaXMgbG9jYWxseSBpbnN0ZWFkIG9mIGhhdmluZyBzZXJ2ZXIgcmVqZWN0IGl0CiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlICYmIHR5cGVvZiBpbml0LmJvZHkgPT09ICdzdHJpbmcnICYmIGluaXQuYm9keS5pbmNsdWRlcygnUGxheWJhY2tBY2Nlc3NUb2tlbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBsYWNlZFBsYXllclR5cGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Qm9keSA9IEpTT04ucGFyc2UoaW5pdC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Qm9keSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Qm9keS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgJiYgbmV3Qm9keVtpXT8udmFyaWFibGVzPy5wbGF5ZXJUeXBlICE9PSBGb3JjZUFjY2Vzc1Rva2VuUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5W2ldLnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5Py52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IEZvcmNlQWNjZXNzVG9rZW5QbGF5ZXJUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRQbGF5ZXJUeXBlID0gbmV3Qm9keS52YXJpYWJsZXMucGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlID0gRm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkUGxheWVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlcGxhY2VkICcke3JlcGxhY2VkUGxheWVyVHlwZX0nIHBsYXllciB0eXBlIHdpdGggJyR7Rm9yY2VBY2Nlc3NUb2tlblBsYXllclR5cGV9JyBwbGF5ZXIgdHlwZWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkobmV3Qm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRlbnRMb2FkZWQoKSB7CiAgICAgICAgLy8gVGhpcyBzdG9wcyBUd2l0Y2ggZnJvbSBwYXVzaW5nIHRoZSBwbGF5ZXIgd2hlbiBpbiBhbm90aGVyIHRhYiBhbmQgYW4gYWQgc2hvd3MuCiAgICAgICAgLy8gVGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2F1Y2V0dHYvVmlkZW9BZEJsb2NrRm9yVHdpdGNoL2Jsb2IvY2VmY2U5ZDJiNTY1NzY5Yzc3ZTM2NjZhYzgyMzRjM2FjZmUyMGQ4My9jaHJvbWUvY29udGVudC5qcyNMMzAKICAgICAgICB0cnkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICd2aXNpYmlsaXR5U3RhdGUnLCB7CiAgICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd2aXNpYmxlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfWNhdGNoe30KICAgICAgICBsZXQgaGlkZGVuID0gZG9jdW1lbnQuX19sb29rdXBHZXR0ZXJfXygnaGlkZGVuJyk7CiAgICAgICAgbGV0IHdlYmtpdEhpZGRlbiA9IGRvY3VtZW50Ll9fbG9va3VwR2V0dGVyX18oJ3dlYmtpdEhpZGRlbicpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwgJ2hpZGRlbicsIHsKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgY29uc3QgYmxvY2sgPSBlID0+IHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIH07CiAgICAgICAgbGV0IHdhc1ZpZGVvUGxheWluZyA9IHRydWU7CiAgICAgICAgY29uc3QgdmlzaWJpbGl0eUNoYW5nZSA9IGUgPT4gewogICAgICAgICAgICBjb25zdCBpc0Nocm9tZSA9IHR5cGVvZiBjaHJvbWUgIT09ICd1bmRlZmluZWQnOwogICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoaGlkZGVuLmFwcGx5KGRvY3VtZW50KSA9PT0gdHJ1ZSB8fCAod2Via2l0SGlkZGVuICYmIHdlYmtpdEhpZGRlbi5hcHBseShkb2N1bWVudCkgPT09IHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgd2FzVmlkZW9QbGF5aW5nID0gIXZpZGVvc1swXS5wYXVzZWQgJiYgIXZpZGVvc1swXS5lbmRlZDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ1RhYiBmb2N1c2VkLiBTdHJlYW0gc2hvdWxkIGJlIGFjdGl2ZScpOwogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJCdWZmZXJTdGF0ZS5oYXNTdHJlYW1TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2hyb21lICYmIHdhc1ZpZGVvUGxheWluZyAmJiAhdmlkZW9zWzBdLmVuZGVkICYmIHZpZGVvc1swXS5wYXVzZWQgJiYgdmlkZW9zWzBdLm11dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsb2NrKGUpOwogICAgICAgIH07CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHZpc2liaWxpdHlDaGFuZ2UsIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHZpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3p2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaGFzRm9jdXMnLCBibG9jaywgdHJ1ZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKC9GaXJlZm94Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdtb3pIaWRkZW4nLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICd3ZWJraXRIaWRkZW4nLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9Y2F0Y2h7fQogICAgICAgIC8vIEhvb2tzIGZvciBwcmVzZXJ2aW5nIHZvbHVtZSAvIHJlc29sdXRpb24KICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBrZXlzVG9DYWNoZSA9IFsKICAgICAgICAgICAgICAgICd2aWRlby1xdWFsaXR5JywKICAgICAgICAgICAgICAgICd2aWRlby1tdXRlZCcsCiAgICAgICAgICAgICAgICAndm9sdW1lJywKICAgICAgICAgICAgICAgICdsb3dMYXRlbmN5TW9kZUVuYWJsZWQnLC8vIExvdyBMYXRlbmN5CiAgICAgICAgICAgICAgICAncGVyc2lzdGVuY2VFbmFibGVkJywvLyBNaW5pIFBsYXllcgogICAgICAgICAgICBdOwogICAgICAgICAgICBjb25zdCBjYWNoZWRWYWx1ZXMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c1RvQ2FjaGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5zZXQoa2V5c1RvQ2FjaGVbaV0sIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleXNUb0NhY2hlW2ldKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVhbFNldEl0ZW0gPSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0gPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVmFsdWVzLnNldChrZXksIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWxTZXRJdGVtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHJlYWxHZXRJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtID0gZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtLnRvU3RyaW5nKCkuaW5jbHVkZXMoT2JqZWN0LmtleXMoe2NhY2hlZFZhbHVlc30pWzBdKSkgewogICAgICAgICAgICAgICAgLy8gVGhlc2UgaG9va3MgYXJlIHVzZWZ1bCB0byBwcmVzZXJ2ZSBwbGF5ZXIgc3RhdGUgb24gcGxheWVyIHJlbG9hZAogICAgICAgICAgICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IGFsbG93IGhvb2tpbmcgb2YgbG9jYWxTdG9yYWdlIGZ1bmN0aW9ucyBidXQgY2hyb21lIGRvZXMKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2NhbFN0b3JhZ2VIb29rcyBmYWlsZWQgJyArIGVycikKICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgZGVjbGFyZU9wdGlvbnMod2luZG93KTsKICAgIGhvb2tXaW5kb3dXb3JrZXIoKTsKICAgIGhvb2tGZXRjaCgpOwogICAgaWYgKFBsYXllckJ1ZmZlcmluZ0ZpeCkgewogICAgICAgIG1vbml0b3JQbGF5ZXJCdWZmZXJpbmcoKTsKICAgIH0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkZWQiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJpbnRlcmFjdGl2ZSIpIHsKICAgICAgICBvbkNvbnRlbnRMb2FkZWQoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICB3aW5kb3cuc2ltdWxhdGVBZHMgPSAoZGVwdGgpID0+IHsKICAgICAgICBpZiAoZGVwdGggPT09IHVuZGVmaW5lZCB8fCBkZXB0aCA8IDApIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkIGRlcHRoIHBhcmFtdGVyIHJlcXVpcmVkICgwID0gbm8gc2ltdWxhdGVkIGFkLCAxKyA9IHVzZSBiYWNrdXAgcGxheWVyIGZvciBnaXZlbiBkZXB0aCknKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnU2ltdWxhdGVBZHMnLCBkZXB0aCk7CiAgICB9OwogICAgd2luZG93LmFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICgpID0+IHsKICAgICAgICBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZSgnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzJyk7CiAgICB9Owp9KSgpOwo="},{"name":"video-swap-new-ublock-origin.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"KGZ1bmN0aW9uKCkgewogICAgaWYgKCAvKF58XC4pdHdpdGNoXC50diQvLnRlc3QoZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24gPSAyMzsvLyBVc2VkIHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3V0ZGF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNjcmlwdHMKICAgIGlmICh0eXBlb2Ygd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiA+PSBvdXJUd2l0Y2hBZFNvbHV0aW9uc1ZlcnNpb24pIHsKICAgICAgICBjb25zb2xlLmxvZygic2tpcHBpbmcgdmlkZW8tc3dhcC1uZXcgYXMgdGhlcmUncyBhbm90aGVyIHNjcmlwdCBhY3RpdmUuIG91clZlcnNpb246IiArIG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiArICIgYWN0aXZlVmVyc2lvbjoiICsgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbik7CiAgICAgICAgd2luZG93LnR3aXRjaEFkU29sdXRpb25zVmVyc2lvbiA9IG91clR3aXRjaEFkU29sdXRpb25zVmVyc2lvbjsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB3aW5kb3cudHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uID0gb3VyVHdpdGNoQWRTb2x1dGlvbnNWZXJzaW9uOwogICAgZnVuY3Rpb24gZGVjbGFyZU9wdGlvbnMoc2NvcGUpIHsKICAgICAgICAvLyBPcHRpb25zIC8gZ2xvYmFscwogICAgICAgIHNjb3BlLk9QVF9CQUNLVVBfUExBWUVSX1RZUEVTID0gWyAnYXV0b3BsYXknLCAncGljdHVyZS1ieS1waWN0dXJlJywgLyonYXV0b3BsYXktQUxUJywqLyAnZW1iZWQnIF07CiAgICAgICAgc2NvcGUuT1BUX0ZPUkNFX0FDQ0VTU19UT0tFTl9QTEFZRVJfVFlQRSA9ICdwb3BvdXQnOwogICAgICAgIHNjb3BlLkFEX1NJR05JRklFUiA9ICdzdGl0Y2hlZC1hZCc7CiAgICAgICAgc2NvcGUuTElWRV9TSUdOSUZJRVIgPSAnLGxpdmUnOwogICAgICAgIHNjb3BlLkNMSUVOVF9JRCA9ICdraW1uZTc4a3gzbmN4NmJyZ280bXY2d2tpNWgxa28nOwogICAgICAgIC8vIFRoZXNlIGFyZSBvbmx5IHJlYWxseSBmb3IgV29ya2VyIHNjb3BlLi4uCiAgICAgICAgc2NvcGUuU3RyZWFtSW5mb3MgPSBbXTsKICAgICAgICBzY29wZS5TdHJlYW1JbmZvc0J5VXJsID0gW107CiAgICAgICAgLy8gTmVlZCB0aGlzIGluIGJvdGggc2NvcGVzLiBXaW5kb3cgc2NvcGUgbmVlZHMgdG8gdXBkYXRlIHRoaXMgdG8gd29ya2VyIHNjb3BlLgogICAgICAgIHNjb3BlLmdxbF9kZXZpY2VfaWQgPSBudWxsOwogICAgICAgIHNjb3BlLkNsaWVudEludGVncml0eUhlYWRlciA9IG51bGw7CiAgICAgICAgc2NvcGUuQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZDsKICAgICAgICBzY29wZS5TaW11bGF0ZWRBZHNEZXB0aCA9IDA7CiAgICAgICAgc2NvcGUuVjJBUEkgPSBmYWxzZTsKICAgICAgICBzY29wZS5Jc0FkU3RyaXBwaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgc2NvcGUuQWRTZWdtZW50Q2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgc2NvcGUuQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzID0gZmFsc2U7CiAgICB9CiAgICBsZXQgdHdpdGNoUGxheWVyQW5kU3RhdGUgPSBudWxsOwogICAgbGV0IGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgPSBmYWxzZTsKICAgIGNvbnN0IHR3aXRjaFdvcmtlcnMgPSBbXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0NvbmZsaWN0cyA9IFsKICAgICAgICAndHdpdGNoJywKICAgICAgICAnaXNWYXJpYW50QScvLyBUd2l0Y2hOb1N1YgogICAgXTsKICAgIGNvbnN0IHdvcmtlclN0cmluZ0FsbG93ID0gW107CiAgICBjb25zdCB3b3JrZXJTdHJpbmdSZWluc2VydCA9IFsKICAgICAgICAnaXNWYXJpYW50QScsLy8gVHdpdGNoTm9TdWIgKHByaW9yIHRvICgwLjkpKQogICAgICAgICdiZXN1cGVyLycsLy8gVHdpdGNoTm9TdWIgKDAuOSkKICAgICAgICAnJHtwYXRjaF91cmx9Jy8vIFR3aXRjaE5vU3ViICgwLjkuMSkKICAgIF07CiAgICBmdW5jdGlvbiBnZXRDbGVhbldvcmtlcih3b3JrZXIpIHsKICAgICAgICBsZXQgcm9vdCA9IG51bGw7CiAgICAgICAgbGV0IHBhcmVudCA9IG51bGw7CiAgICAgICAgbGV0IHByb3RvID0gd29ya2VyOwogICAgICAgIHdoaWxlIChwcm90bykgewogICAgICAgICAgICBjb25zdCB3b3JrZXJTdHJpbmcgPSBwcm90by50b1N0cmluZygpOwogICAgICAgICAgICBpZiAod29ya2VyU3RyaW5nQ29uZmxpY3RzLnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkgJiYgIXdvcmtlclN0cmluZ0FsbG93LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSkpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocGFyZW50LCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHByb3RvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFyZW50ID0gcHJvdG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdvcmtlcnNGb3JSZWluc2VydCh3b3JrZXIpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBsZXQgcHJvdG8gPSB3b3JrZXI7CiAgICAgICAgd2hpbGUgKHByb3RvKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmtlclN0cmluZyA9IHByb3RvLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh3b3JrZXJTdHJpbmdSZWluc2VydC5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcm90byk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gcmVpbnNlcnRXb3JrZXJzKHdvcmtlciwgcmVpbnNlcnQpIHsKICAgICAgICBsZXQgcGFyZW50ID0gd29ya2VyOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVpbnNlcnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlaW5zZXJ0W2ldLCBwYXJlbnQpOwogICAgICAgICAgICBwYXJlbnQgPSByZWluc2VydFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVmFsaWRXb3JrZXIod29ya2VyKSB7CiAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gd29ya2VyLnRvU3RyaW5nKCk7CiAgICAgICAgcmV0dXJuICF3b3JrZXJTdHJpbmdDb25mbGljdHMuc29tZSgoeCkgPT4gd29ya2VyU3RyaW5nLmluY2x1ZGVzKHgpKQogICAgICAgICAgICB8fCB3b3JrZXJTdHJpbmdBbGxvdy5zb21lKCh4KSA9PiB3b3JrZXJTdHJpbmcuaW5jbHVkZXMoeCkpCiAgICAgICAgICAgIHx8IHdvcmtlclN0cmluZ1JlaW5zZXJ0LnNvbWUoKHgpID0+IHdvcmtlclN0cmluZy5pbmNsdWRlcyh4KSk7CiAgICB9CiAgICBmdW5jdGlvbiBob29rV2luZG93V29ya2VyKCkgewogICAgICAgIGNvbnN0IHJlaW5zZXJ0ID0gZ2V0V29ya2Vyc0ZvclJlaW5zZXJ0KHdpbmRvdy5Xb3JrZXIpOwogICAgICAgIGNvbnN0IG5ld1dvcmtlciA9IGNsYXNzIFdvcmtlciBleHRlbmRzIGdldENsZWFuV29ya2VyKHdpbmRvdy5Xb3JrZXIpIHsKICAgICAgICAgICAgY29uc3RydWN0b3IodHdpdGNoQmxvYlVybCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGlzVHdpdGNoV29ya2VyID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzVHdpdGNoV29ya2VyID0gbmV3IFVSTCh0d2l0Y2hCbG9iVXJsKS5vcmlnaW4uZW5kc1dpdGgoJy50d2l0Y2gudHYnKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIGlmICghaXNUd2l0Y2hXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcih0d2l0Y2hCbG9iVXJsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBuZXdCbG9iU3RyID0gYAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdGZXRjaFJlcXVlc3RzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgICAgICR7c3RyaXBBZFNlZ21lbnRzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtwcm9jZXNzTTNVOC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7aG9va1dvcmtlckZldGNoLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtkZWNsYXJlT3B0aW9ucy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0QWNjZXNzVG9rZW4udG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke2dxbFJlcXVlc3QudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3BhcnNlQXR0cmlidXRlcy50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7c2V0U3RyZWFtSW5mb1VybHMudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke29uRm91bmRBZC50b1N0cmluZygpfQogICAgICAgICAgICAgICAgICAgICR7Z2V0V2FzbVdvcmtlckpzLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgudG9TdHJpbmcoKX0KICAgICAgICAgICAgICAgICAgICAke3JlcGxhY2VTZXJ2ZXJUaW1lSW5NM3U4LnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHtnZXRTdHJlYW1VcmxGb3JSZXNvbHV0aW9uLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgJHt1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtLnRvU3RyaW5nKCl9CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya2VyU3RyaW5nID0gZ2V0V2FzbVdvcmtlckpzKCcke3R3aXRjaEJsb2JVcmwucmVwbGFjZUFsbCgiJyIsICIlMjciKX0nKTsKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlT3B0aW9ucyhzZWxmKTsKICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gJHtncWxfZGV2aWNlX2lkID8gIiciICsgZ3FsX2RldmljZV9pZCArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSAke0F1dGhvcml6YXRpb25IZWFkZXIgPyAiJyIgKyBBdXRob3JpemF0aW9uSGVhZGVyICsgIiciIDogdW5kZWZpbmVkfTsKICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSAke0NsaWVudEludGVncml0eUhlYWRlciA/ICInIiArIENsaWVudEludGVncml0eUhlYWRlciArICInIiA6IG51bGx9OwogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1VwZGF0ZURldmljZUlkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnVXBkYXRlQXV0aG9yaXphdGlvbkhlYWRlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb25IZWFkZXIgPSBlLmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLmtleSA9PSAnRmV0Y2hSZXNwb25zZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGUuZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5oYXMocmVzcG9uc2VEYXRhLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5nZXQocmVzcG9uc2VEYXRhLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nRmV0Y2hSZXF1ZXN0cy5kZWxldGUocmVzcG9uc2VEYXRhLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VEYXRhLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IocmVzcG9uc2VEYXRhLmVycm9yKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgUmVzcG9uc2Ugb2JqZWN0IGZyb20gdGhlIHJlc3BvbnNlIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VEYXRhLmJvZHksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VEYXRhLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlRGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VEYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEua2V5ID09ICdTaW11bGF0ZUFkcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRlZEFkc0RlcHRoID0gZS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpbXVsYXRlZEFkc0RlcHRoOiAnICsgU2ltdWxhdGVkQWRzRGVwdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cyA9ICFBbGxTZWdtZW50c0FyZUFkU2VnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzOiAnICsgQWxsU2VnbWVudHNBcmVBZFNlZ21lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGhvb2tXb3JrZXJGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIGV2YWwod29ya2VyU3RyaW5nKTsKICAgICAgICAgICAgICAgIGAKICAgICAgICAgICAgICAgIHN1cGVyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW25ld0Jsb2JTdHJdKSksIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgdHdpdGNoV29ya2Vycy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmtleSA9PSAnVWJvVXBkYXRlQWRCYW5uZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXIoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1JlbG9hZFBsYXllcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2FkVHdpdGNoUGxheWVyKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5rZXkgPT0gJ1Vib1BhdXNlUmVzdW1lUGxheWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICByZWxvYWRUd2l0Y2hQbGF5ZXIodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBhc3luYyBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEua2V5ID09ICdGZXRjaFJlcXVlc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoUmVxdWVzdCA9IGV2ZW50LmRhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IGhhbmRsZVdvcmtlckZldGNoUmVxdWVzdChmZXRjaFJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ0ZldGNoUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgd29ya2VySW5zdGFuY2UgPSByZWluc2VydFdvcmtlcnMobmV3V29ya2VyLCByZWluc2VydCk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1dvcmtlcicsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXJJbnN0YW5jZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKGlzVmFsaWRXb3JrZXIodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgd29ya2VySW5zdGFuY2UgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0F0dGVtcHQgdG8gc2V0IHR3aXRjaCB3b3JrZXIgZGVuaWVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFdhc21Xb3JrZXJKcyh0d2l0Y2hCbG9iVXJsKSB7CiAgICAgICAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHR3aXRjaEJsb2JVcmwsIGZhbHNlKTsKICAgICAgICByZXEub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICAgcmVxLnNlbmQoKTsKICAgICAgICByZXR1cm4gcmVxLnJlc3BvbnNlVGV4dDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0cmVhbUluZm9VcmxzKHN0cmVhbUluZm8sIGVuY29kaW5nc00zdTgpIHsKICAgICAgICBjb25zdCBsaW5lcyA9IGVuY29kaW5nc00zdTgucmVwbGFjZUFsbCgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoIWxpbmVzW2ldLnN0YXJ0c1dpdGgoJyMnKSAmJiBsaW5lc1tpXS5pbmNsdWRlcygnLm0zdTgnKSkgewogICAgICAgICAgICAgICAgU3RyZWFtSW5mb3NCeVVybFtsaW5lc1tpXS50cmltRW5kKCldID0gc3RyZWFtSW5mbzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBsaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMobGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbkluZm8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdXRpb246IHJlc29sdXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmF0ZTogYXR0cmlidXRlc1snRlJBTUUtUkFURSddLAogICAgICAgICAgICAgICAgICAgICAgICBVcmw6IGxpbmVzW2kgKyAxXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5VcmxzLnNldChsaW5lc1tpICsgMV0udHJpbUVuZCgpLCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pIHsKICAgICAgICBjb25zdCBpc1Nob3dpbmdBZCA9ICEhc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3M7CiAgICAgICAgaWYgKCFpc1Nob3dpbmdBZCAmJiAoc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgfHwgc3RyZWFtSW5mby5OdW1TdHJpcHBlZEFkU2VnbWVudHMgPiAwKSkgewogICAgICAgICAgICBzdHJlYW1JbmZvLklzU3RyaXBwaW5nQWRTZWdtZW50cyA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW1JbmZvLk51bVN0cmlwcGVkQWRTZWdtZW50cyA9IDA7CiAgICAgICAgfQogICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAga2V5OiAnVWJvVXBkYXRlQWRCYW5uZXInLAogICAgICAgICAgICBpc01pZHJvbGw6IHN0cmVhbUluZm8uSXNNaWRyb2xsLAogICAgICAgICAgICBoYXNBZHM6IGlzU2hvd2luZ0FkLAogICAgICAgICAgICBpc1N0cmlwcGluZ0FkU2VnbWVudHM6IHN0cmVhbUluZm8uSXNTdHJpcHBpbmdBZFNlZ21lbnRzLAogICAgICAgICAgICBudW1TdHJpcHBlZEFkU2VnbWVudHM6IHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzCiAgICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBvbkZvdW5kQWQoc3RyZWFtSW5mbywgdGV4dFN0ciwgcmVsb2FkUGxheWVyLCByZWFsRmV0Y2gsIHVybCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBsZXQgcmVzdWx0ID0gdGV4dFN0cjsKICAgICAgICBzdHJlYW1JbmZvLklzTWlkcm9sbCA9IHRleHRTdHIuaW5jbHVkZXMoJyJNSURST0xMIicpIHx8IHRleHRTdHIuaW5jbHVkZXMoJyJtaWRyb2xsIicpOwogICAgICAgIGNvbnN0IHBsYXllclR5cGVzID0gT1BUX0JBQ0tVUF9QTEFZRVJfVFlQRVM7CiAgICAgICAgaWYgKHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNpemUgPj0gcGxheWVyVHlwZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0U3RyOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgJiYgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLmluY2x1ZGVzKHVybCkpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MsIHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHN0cmVhbU0zdThVcmwpOwogICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgYmFja3VwUGxheWVyVHlwZUluZm8gPSAnJzsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYXllclR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHBsYXllclR5cGUgPSBwbGF5ZXJUeXBlc1tpXTsKICAgICAgICAgICAgaWYgKCFzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5oYXMocGxheWVyVHlwZSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5SZXNwb25zZSA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKHN0cmVhbUluZm8uQ2hhbm5lbE5hbWUsIHBsYXllclR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlblJlc3BvbnNlICE9IG51bGwgJiYgYWNjZXNzVG9rZW5SZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGFjY2Vzc1Rva2VuUmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxJbmZvID0gbmV3IFVSTCgnaHR0cHM6Ly91c2hlci50dHZudy5uZXQvYXBpLycgKyAoVjJBUEkgPyAndjIvJyA6ICcnKSArICdjaGFubmVsL2hscy8nICsgc3RyZWFtSW5mby5DaGFubmVsTmFtZSArICcubTN1OCcgKyBzdHJlYW1JbmZvLlVzaGVyUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCdzaWcnLCBhY2Nlc3NUb2tlbi5kYXRhLnN0cmVhbVBsYXliYWNrQWNjZXNzVG9rZW4uc2lnbmF0dXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5mby5zZWFyY2hQYXJhbXMuc2V0KCd0b2tlbicsIGFjY2Vzc1Rva2VuLmRhdGEuc3RyZWFtUGxheWJhY2tBY2Nlc3NUb2tlbi52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmxJbmZvLmhyZWYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RpbmdzTTN1OCA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4VXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCByZXNvbHV0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja1RleHRTdHIgPSBhd2FpdCBzdHJlYW1NM3U4UmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWJhY2tUZXh0U3RyLmluY2x1ZGVzKEFEX1NJR05JRklFUikgJiYgKFNpbXVsYXRlZEFkc0RlcHRoID09IDAgfHwgaSA+PSBTaW11bGF0ZWRBZHNEZXB0aCAtIDEpKSB8fCBpID49IHBsYXllclR5cGVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmFja1RleHRTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cFBsYXllclR5cGVJbmZvID0gJyAoJyArIHBsYXllclR5cGUgKyAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLnNldChwbGF5ZXJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5FbmNvZGluZ3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG93IHJlc29sdXRpb24gc3RyZWFtcyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIGluIHRoZSBVSS4gVG8gZml4IHRoaXMgd2UgbWVyZ2UgdGhlIGxvdyByZXMgVVJMcyBpbnRvIHRoZSBtYWluIG0zdTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbEVuY29kaW5nc00zdTggPSBzdHJlYW1JbmZvLkVuY29kaW5nczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbExpbmVzID0gbm9ybWFsRW5jb2RpbmdzTTN1OC5yZXBsYWNlQWxsKCdccicsICcnKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9ybWFsTGluZXMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbExpbmVzW2pdLnN0YXJ0c1dpdGgoJyNFWFQtWC1TVFJFQU0tSU5GJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzU2V0dGluZ3MgPSBwYXJzZUF0dHJpYnV0ZXMobm9ybWFsTGluZXNbal0uc3Vic3RyaW5nKG5vcm1hbExpbmVzW2pdLmluZGV4T2YoJzonKSArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzVXJsID0gZ2V0U3RyZWFtVXJsRm9yUmVzb2x1dGlvbihlbmNvZGluZ3NNM3U4LCBzdHJlYW1JbmZvLlVybHMuZ2V0KG5vcm1hbExpbmVzW2ogKyAxXS50cmltRW5kKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG93UmVzSW5mID0gZW5jb2RpbmdzTTN1OC5tYXRjaChuZXcgUmVnRXhwKGBeLiooPz1cbi4qJHtsb3dSZXNVcmx9KWAsICdtJykpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dSZXNTZXR0aW5ncyA9IHBhcnNlQXR0cmlidXRlcyhsb3dSZXNJbmYuc3Vic3RyaW5nKGxvd1Jlc0luZi5pbmRleE9mKCc6JykgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21hcCAnICsgcmVzU2V0dGluZ3NbJ1JFU09MVVRJT04nXSArICcgdG8gJyArIGxvd1Jlc1NldHRpbmdzWydSRVNPTFVUSU9OJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlY3NLZXkgPSAnQ09ERUNTJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNTZXR0aW5nc1tjb2RlY3NLZXldID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgbG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1NldHRpbmdzW2NvZGVjc0tleV0ubGVuZ3RoID49IDMgJiYgbG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XS5sZW5ndGggPj0gMyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc1NldHRpbmdzW2NvZGVjc0tleV0uc3RhcnRzV2l0aCgnaGV2JykgfHwgcmVzU2V0dGluZ3NbY29kZWNzS2V5XS5zdGFydHNXaXRoKCdodmMnKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1NldHRpbmdzW2NvZGVjc0tleV0uc3Vic3RyaW5nKDAsIDMpICE9PSBsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldLnN1YnN0cmluZygwLCAzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzd2FwICcgKyByZXNTZXR0aW5nc1tjb2RlY3NLZXldICsgJyB0byAnICsgbG93UmVzU2V0dGluZ3NbY29kZWNzS2V5XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxMaW5lc1tqXSA9IG5vcm1hbExpbmVzW2pdLnJlcGxhY2UoL0NPREVDUz0iW14iXSsiLywgYENPREVDUz0iJHtsb3dSZXNTZXR0aW5nc1tjb2RlY3NLZXldfSJgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5vcm1hbExpbmVzW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxMaW5lc1tqICsgMV0gPSBsb3dSZXNVcmwgKyAnICcucmVwZWF0KGogKyAxKTsvLyBUaGUgc3RyZWFtIGRvZXNuJ3QgbG9hZCB1bmxlc3MgZWFjaCB1cmwgbGluZSBpcyB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3NNM3U4ID0gbm9ybWFsTGluZXMuam9pbignXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA9IGVuY29kaW5nc00zdTg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbUluZm9VcmxzKHN0cmVhbUluZm8sIGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLmVycm9yKGVycik7IH0KICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5nc1N0YXR1cy5nZXQocGxheWVyVHlwZSkgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NTdGF0dXMuc2V0KHBsYXllclR5cGUsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUubG9nKCdGb3VuZCBhZHMsIHN3aXRjaCB0byBiYWNrdXAnICsgYmFja3VwUGxheWVyVHlwZUluZm8pOwogICAgICAgIGlmIChyZWxvYWRQbGF5ZXIpIHsKICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2tleTonVWJvUmVsb2FkUGxheWVyJ30pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyRm9yU3RyZWFtKHN0cmVhbUluZm8pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdHJpcEFkU2VnbWVudHModGV4dFN0ciwgc3RyaXBBbGxTZWdtZW50cywgc3RyZWFtSW5mbykgewogICAgICAgIGxldCBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSBmYWxzZTsKICAgICAgICBjb25zdCBsaW5lcyA9IHRleHRTdHIucmVwbGFjZUFsbCgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgY29uc3QgbmV3QWRVcmwgPSAnaHR0cHM6Ly90d2l0Y2gudHYnOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWNraW5nIHVybHMgd2hpY2ggYXBwZWFyIGluIHRoZSBvdmVybGF5IFVJCiAgICAgICAgICAgIGxpbmUgPSBsaW5lCiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvKFgtVFYtVFdJVENILUFELVVSTD0iKSg/OlteIl0qKSgiKS9nLCBgJDEke25ld0FkVXJsfSQyYCkKICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC8oWC1UVi1UV0lUQ0gtQUQtQ0xJQ0stVFJBQ0tJTkctVVJMPSIpKD86W14iXSopKCIpL2csIGAkMSR7bmV3QWRVcmx9JDJgKTsKICAgICAgICAgICAgaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmUuc3RhcnRzV2l0aCgnI0VYVElORicpICYmICghbGluZS5pbmNsdWRlcygnLGxpdmUnKSB8fCBzdHJpcEFsbFNlZ21lbnRzIHx8IEFsbFNlZ21lbnRzQXJlQWRTZWdtZW50cykpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRVcmwgPSBsaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICBpZiAoIUFkU2VnbWVudENhY2hlLmhhcyhzZWdtZW50VXJsKSkgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBZFNlZ21lbnRDYWNoZS5zZXQoc2VnbWVudFVybCwgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBoYXNTdHJpcHBlZEFkU2VnbWVudHMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsaW5lLmluY2x1ZGVzKEFEX1NJR05JRklFUikpIHsKICAgICAgICAgICAgICAgIGhhc1N0cmlwcGVkQWRTZWdtZW50cyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc1N0cmlwcGVkQWRTZWdtZW50cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBObyBsb3cgbGF0ZW5jeSBkdXJpbmcgYWRzIChvdGhlcndpc2UgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHBsYXllciB0byBwcmVmZXRjaCBhbmQgZGlzcGxheSBhZCBzZWdtZW50cykKICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtVFdJVENILVBSRUZFVENIOicpKSB7CiAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbUluZm8uTnVtU3RyaXBwZWRBZFNlZ21lbnRzID0gMDsKICAgICAgICB9CiAgICAgICAgc3RyZWFtSW5mby5Jc1N0cmlwcGluZ0FkU2VnbWVudHMgPSBoYXNTdHJpcHBlZEFkU2VnbWVudHM7CiAgICAgICAgQWRTZWdtZW50Q2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSwgbWFwKSA9PiB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA8IERhdGUubm93KCkgLSAxMjAwMDApIHsKICAgICAgICAgICAgICAgIG1hcC5kZWxldGUoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcbicpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc00zVTgodXJsLCB0ZXh0U3RyLCByZWFsRmV0Y2gpIHsKICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gU3RyZWFtSW5mb3NCeVVybFt1cmxdOwogICAgICAgIGlmICghc3RyZWFtSW5mbykgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgY29uc3QgY3VycmVudFJlc29sdXRpb24gPSBzdHJlYW1JbmZvLlVybHMuZ2V0KHVybCk7CiAgICAgICAgaWYgKCFjdXJyZW50UmVzb2x1dGlvbikgewogICAgICAgICAgICByZXR1cm4gdGV4dFN0cjsKICAgICAgICB9CiAgICAgICAgY29uc3QgaGF2ZUFkVGFncyA9IHRleHRTdHIuaW5jbHVkZXMoQURfU0lHTklGSUVSKSB8fCAoU2ltdWxhdGVkQWRzRGVwdGggPiAwICYmICghc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MgfHwgIXN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzLmluY2x1ZGVzKHVybCkgfHwgU2ltdWxhdGVkQWRzRGVwdGggLSAxID4gc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXgpKTsKICAgICAgICBpZiAoc3RyZWFtSW5mby5CYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OFVybCA9IHN0cmVhbUluZm8uRW5jb2RpbmdzLm1hdGNoKC9eaHR0cHM6LipcLm0zdTgkL20pWzBdOwogICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4UmVzcG9uc2UgPSBhd2FpdCByZWFsRmV0Y2goc3RyZWFtTTN1OFVybCk7CiAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtTTN1OCA9IGF3YWl0IHN0cmVhbU0zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTTN1OCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJlYW1NM3U4LmluY2x1ZGVzKEFEX1NJR05JRklFUikgJiYgU2ltdWxhdGVkQWRzRGVwdGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gbW9yZSBhZHMgb24gbWFpbiBzdHJlYW0uIFRyaWdnZXJpbmcgcGxheWVyIHJlbG9hZCB0byBnbyBiYWNrIHRvIG1haW4gc3RyZWFtLi4uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzU3RhdHVzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzUGxheWVyVHlwZUluZGV4ID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtrZXk6J1Vib1JlbG9hZFBsYXllcid9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJlYW1NM3U4LmluY2x1ZGVzKCciTUlEUk9MTCInKSAmJiAhc3RyZWFtTTN1OC5pbmNsdWRlcygnIm1pZHJvbGwiJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBzdHJlYW1NM3U4LnJlcGxhY2VBbGwoJ1xyJywgJycpLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjRVhUSU5GJykgJiYgbGluZXMubGVuZ3RoID4gaSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMoTElWRV9TSUdOSUZJRVIpICYmICFzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5oYXMobGluZXNbaSArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcXVlc3Qgb25lIC50cyBmaWxlIHBlciAubTN1OCByZXF1ZXN0IHRvIGF2b2lkIG1ha2luZyB0b28gbWFueSByZXF1ZXN0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdGZXRjaCBhZCAudHMgZmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLlJlcXVlc3RlZEFkcy5hZGQobGluZXNbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gobGluZXNbaSArIDFdKS50aGVuKChyZXNwb25zZSk9PntyZXNwb25zZS5ibG9iKCl9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyAmJiBoYXZlQWRUYWdzKSB7CiAgICAgICAgICAgICAgICB0ZXh0U3RyID0gYXdhaXQgb25Gb3VuZEFkKHN0cmVhbUluZm8sIHRleHRTdHIsIHRydWUsIHJlYWxGZXRjaCwgdXJsLCBjdXJyZW50UmVzb2x1dGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGhhdmVBZFRhZ3MgJiYgIXN0cmVhbUluZm8uSXNNb3ZpbmdPZmZCYWNrdXBFbmNvZGluZ3MpIHsKICAgICAgICAgICAgdGV4dFN0ciA9IGF3YWl0IG9uRm91bmRBZChzdHJlYW1JbmZvLCB0ZXh0U3RyLCB0cnVlLCByZWFsRmV0Y2gsIHVybCwgY3VycmVudFJlc29sdXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAoSXNBZFN0cmlwcGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgdGV4dFN0ciA9IHN0cmlwQWRTZWdtZW50cyh0ZXh0U3RyLCBmYWxzZSwgc3RyZWFtSW5mbyk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZUFkYmxvY2tCYW5uZXJGb3JTdHJlYW0oc3RyZWFtSW5mbyk7CiAgICAgICAgcmV0dXJuIHRleHRTdHI7CiAgICB9CiAgICBmdW5jdGlvbiBob29rV29ya2VyRmV0Y2goKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2hvb2tXb3JrZXJGZXRjaCAodmlkZW8tc3dhcC1uZXcpJyk7CiAgICAgICAgY29uc3QgcmVhbEZldGNoID0gZmV0Y2g7CiAgICAgICAgZmV0Y2ggPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoQWRTZWdtZW50Q2FjaGUuaGFzKHVybCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2goJ2RhdGE6dmlkZW8vbXA0O2Jhc2U2NCxBQUFBS0daMGVYQnRjRFF5QUFBQUFXbHpiMjF0Y0RReVpHRnphR0YyWXpGcGMyODJhR3h6WmdBQUJFbHRiMjkyQUFBQWJHMTJhR1FBQUFBQUFBQUFBQUFBQUFBQUFZYWdBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBQnFIUnlZV3NBQUFCY2RHdG9aQUFBQUFNQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFVUnRaR2xoQUFBQUlHMWthR1FBQUFBQUFBQUFBQUFBQUFBQUFMdUFBQUFBQUZYRUFBQUFBQUF0YUdSc2NnQUFBQUFBQUFBQWMyOTFiZ0FBQUFBQUFBQUFBQUFBQUZOdmRXNWtTR0Z1Wkd4bGNnQUFBQUR2YldsdVpnQUFBQkJ6Yldoa0FBQUFBQUFBQUFBQUFBQWtaR2x1WmdBQUFCeGtjbVZtQUFBQUFBQUFBQUVBQUFBTWRYSnNJQUFBQUFFQUFBQ3pjM1JpYkFBQUFHZHpkSE5rQUFBQUFBQUFBQUVBQUFCWGJYQTBZUUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FRQUFBQUFMdUFBQUFBQUFBelpYTmtjd0FBQUFBRGdJQ0FJZ0FCQUFTQWdJQVVRQlVBQUFBQUFBQUFBQUFBQUFXQWdJQUNFWkFHZ0lDQUFRSUFBQUFRYzNSMGN3QUFBQUFBQUFBQUFBQUFFSE4wYzJNQUFBQUFBQUFBQUFBQUFCUnpkSE42QUFBQUFBQUFBQUFBQUFBQUFBQUFFSE4wWTI4QUFBQUFBQUFBQUFBQUFlVjBjbUZyQUFBQVhIUnJhR1FBQUFBREFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFvQUFBQUZvQUFBQUFBR0JiV1JwWVFBQUFDQnRaR2hrQUFBQUFBQUFBQUFBQUFBQUFBOUNRQUFBQUFCVnhBQUFBQUFBTFdoa2JISUFBQUFBQUFBQUFIWnBaR1VBQUFBQUFBQUFBQUFBQUFCV2FXUmxiMGhoYm1Sc1pYSUFBQUFCTEcxcGJtWUFBQUFVZG0xb1pBQUFBQUVBQUFBQUFBQUFBQUFBQUNSa2FXNW1BQUFBSEdSeVpXWUFBQUFBQUFBQUFRQUFBQXgxY213Z0FBQUFBUUFBQU94emRHSnNBQUFBb0hOMGMyUUFBQUFBQUFBQUFRQUFBSkJoZG1NeEFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW9BQmFBQklBQUFBU0FBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHUC8vQUFBQU9tRjJZME1CVFVBZS8rRUFJMmROUUI2V1VvRkFYL0xnTFVCQVFGQUFBRDZBQUE2bURnQUFIb1FBQTlDVzd5NEtBUUFFYU91UElBQUFBQkJ6ZEhSekFBQUFBQUFBQUFBQUFBQVFjM1J6WXdBQUFBQUFBQUFBQUFBQUZITjBjM29BQUFBQUFBQUFBQUFBQUFBQUFBQVFjM1JqYndBQUFBQUFBQUFBQUFBQVNHMTJaWGdBQUFBZ2RISmxlQUFBQUFBQUFBQUJBQUFBQVFBQUFDNEFBQUFBQW9BQUFBQUFBQ0IwY21WNEFBQUFBQUFBQUFJQUFBQUJBQUNDTlFBQUFBQUNRQUFBJywgb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbJ2NhdGNoJ10oZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXJsID0gdXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJ20zdTgnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0FmdGVyID0gYXN5bmMgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF3YWl0IHByb2Nlc3NNM1U4KHVybCwgYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZWFsRmV0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKHN0ciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsRmV0Y2godXJsLCBvcHRpb25zKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaCBob29rIGVyciAnICsgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwuaW5jbHVkZXMoJy9jaGFubmVsL2hscy8nKSAmJiAhdXJsLmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgIFYyQVBJID0gdXJsLmluY2x1ZGVzKCcvYXBpL3YyLycpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gKG5ldyBVUkwodXJsKSkucGF0aG5hbWUubWF0Y2goLyhbXlwvXSspKD89XC5cdyskKS8pWzBdOwogICAgICAgICAgICAgICAgICAgIGlmIChPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmVudF9kb21haW5zIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwbGF5ZXIgaXMgZW1iZWRlZCBhbmQgc3RyaXBwaW5nIGl0IGdldHMgcmlkIG9mIGZha2UgYWRzCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBVcmwgPSBuZXcgVVJMKHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBVcmwuc2VhcmNoUGFyYW1zLmRlbGV0ZSgncGFyZW50X2RvbWFpbnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdGVtcFVybC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gRmlyc3QgbTN1OCByZXF1ZXN0IGlzIHRoZSBtM3U4IHdpdGggdGhlIHZpZGVvIGVuY29kaW5ncyAoMzYwcCw0ODBwLDcyMHAsZXRjKS4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBTZWNvbmQgbTN1OCByZXF1ZXN0IGlzIHRoZSBtM3U4IGZvciB0aGUgZ2l2ZW4gZW5jb2Rpbmcgb2J0YWluZWQgaW4gdGhlIGZpcnN0IHJlcXVlc3QuIEF0IHRoaXMgcG9pbnQgd2Ugd2lsbCBrbm93IGlmIHRoZXJlJ3MgYWRzLgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyZWFtSW5mbyA9IFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8gIT0gbnVsbCAmJiBzdHJlYW1JbmZvLkVuY29kaW5ncyAhPSBudWxsICYmIChhd2FpdCByZWFsRmV0Y2goc3RyZWFtSW5mby5FbmNvZGluZ3MubWF0Y2goL15odHRwczouKlwubTN1OCQvbSlbMF0pKS5zdGF0dXMgIT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhY2hlZCBlbmNvZGluZ3MgYXJlIGRlYWQgKHRoZSBzdHJlYW0gcHJvYmFibHkgcmVzdGFydGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mbyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlcnZlclRpbWUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtSW5mbyA9PSBudWxsIHx8IHN0cmVhbUluZm8uRW5jb2RpbmdzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbUluZm9zW2NoYW5uZWxOYW1lXSA9IHN0cmVhbUluZm8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkQWRzOiBuZXcgU2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdzOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2t1cEVuY29kaW5nczogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NTdGF0dXM6IG5ldyBNYXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrdXBFbmNvZGluZ3NQbGF5ZXJUeXBlSW5kZXg6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTW92aW5nT2ZmQmFja3VwRW5jb2RpbmdzOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01pZHJvbGw6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzU3RyaXBwaW5nQWRTZWdtZW50czogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU3RyaXBwZWRBZFNlZ21lbnRzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUZhbGxiYWNrU3RyZWFtOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTmFtZTogY2hhbm5lbE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNoZXJQYXJhbXM6IChuZXcgVVJMKHVybCkpLnNlYXJjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmxzOiBuZXcgTWFwKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jb2RpbmdzTTN1OFJlc3BvbnNlID0gYXdhaXQgcmVhbEZldGNoKHVybCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzTTN1OFJlc3BvbnNlICE9IG51bGwgJiYgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jb2RpbmdzTTN1OCA9IGF3YWl0IGVuY29kaW5nc00zdThSZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5FbmNvZGluZ3MgPSBlbmNvZGluZ3NNM3U4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbUluZm9VcmxzKHN0cmVhbUluZm8sIGVuY29kaW5nc00zdTgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRpbWUgPSBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoZW5jb2RpbmdzTTN1OCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbkluZm8gPSBzdHJlYW1JbmZvLlVybHMudmFsdWVzKCkubmV4dCgpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbU0zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaChyZXNvbHV0aW9uSW5mby5VcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NM3U4UmVzcG9uc2Uuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1NM3U4ID0gYXdhaXQgc3RyZWFtTTN1OFJlc3BvbnNlLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU0zdTguaW5jbHVkZXMoQURfU0lHTklGSUVSKSB8fCBTaW11bGF0ZWRBZHNEZXB0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9uRm91bmRBZChzdHJlYW1JbmZvLCBzdHJlYW1NM3U4LCBmYWxzZSwgcmVhbEZldGNoLCByZXNvbHV0aW9uSW5mby5VcmwsIHJlc29sdXRpb25JbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RyZWFtTTN1OFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShlbmNvZGluZ3NNM3U4UmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlcnZlclRpbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nc00zdThSZXNwb25zZSA9IGF3YWl0IHJlYWxGZXRjaCh1cmwsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nc00zdThSZXNwb25zZSAhPSBudWxsICYmIGVuY29kaW5nc00zdThSZXNwb25zZS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRpbWUgPSBnZXRTZXJ2ZXJUaW1lRnJvbU0zdTgoYXdhaXQgZW5jb2RpbmdzTTN1OFJlc3BvbnNlLnRleHQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5Jc01vdmluZ09mZkJhY2t1cEVuY29kaW5ncyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShyZXBsYWNlU2VydmVyVGltZUluTTN1OChzdHJlYW1JbmZvLkJhY2t1cEVuY29kaW5ncyA/IHN0cmVhbUluZm8uQmFja3VwRW5jb2RpbmdzIDogc3RyZWFtSW5mby5FbmNvZGluZ3MsIHNlcnZlclRpbWUpKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcnZlclRpbWVGcm9tTTN1OChlbmNvZGluZ3NNM3U4KSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlbmNvZGluZ3NNM3U4Lm1hdGNoKC8jRVhULVgtU0VTU0lPTi1EQVRBOkRBVEEtSUQ9IlNFUlZFUi1USU1FIixWQUxVRT0iKFteIl0rKSIvKTsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMSA/IG1hdGNoZXNbMV0gOiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaGVzID0gZW5jb2RpbmdzTTN1OC5tYXRjaCgnU0VSVkVSLVRJTUU9IihbMC05Ll0rKSInKTsKICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAxID8gbWF0Y2hlc1sxXSA6IG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiByZXBsYWNlU2VydmVyVGltZUluTTN1OChlbmNvZGluZ3NNM3U4LCBuZXdTZXJ2ZXJUaW1lKSB7CiAgICAgICAgaWYgKFYyQVBJKSB7CiAgICAgICAgICAgIHJldHVybiBuZXdTZXJ2ZXJUaW1lID8gZW5jb2RpbmdzTTN1OC5yZXBsYWNlKC8oI0VYVC1YLVNFU1NJT04tREFUQTpEQVRBLUlEPSJTRVJWRVItVElNRSIsVkFMVUU9IilbXiJdKygiKS8sIGAkMSR7bmV3U2VydmVyVGltZX0kMmApIDogZW5jb2RpbmdzTTN1ODsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld1NlcnZlclRpbWUgPyBlbmNvZGluZ3NNM3U4LnJlcGxhY2UobmV3IFJlZ0V4cCgnKFNFUlZFUi1USU1FPSIpWzAtOS5dKyInKSwgYFNFUlZFUi1USU1FPSIke25ld1NlcnZlclRpbWV9ImApIDogZW5jb2RpbmdzTTN1ODsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0cmVhbVVybEZvclJlc29sdXRpb24oZW5jb2RpbmdzTTN1OCwgcmVzb2x1dGlvbkluZm8pIHsKICAgICAgICBjb25zdCBlbmNvZGluZ3NMaW5lcyA9IGVuY29kaW5nc00zdTgucmVwbGFjZUFsbCgnXHInLCAnJykuc3BsaXQoJ1xuJyk7CiAgICAgICAgY29uc3QgW3RhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdID0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbi5zcGxpdCgneCcpLm1hcChOdW1iZXIpOwogICAgICAgIGxldCBtYXRjaGVkUmVzb2x1dGlvblVybCA9IG51bGw7CiAgICAgICAgbGV0IG1hdGNoZWRGcmFtZVJhdGUgPSBmYWxzZTsKICAgICAgICBsZXQgY2xvc2VzdFJlc29sdXRpb25VcmwgPSBudWxsOwogICAgICAgIGxldCBjbG9zZXN0UmVzb2x1dGlvbkRpZmZlcmVuY2UgPSBJbmZpbml0eTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kaW5nc0xpbmVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICBpZiAoZW5jb2RpbmdzTGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNUUkVBTS1JTkYnKSAmJiBlbmNvZGluZ3NMaW5lc1tpICsgMV0uaW5jbHVkZXMoJy5tM3U4JykpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoZW5jb2RpbmdzTGluZXNbaV0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGF0dHJpYnV0ZXNbJ1JFU09MVVRJT04nXTsKICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IGF0dHJpYnV0ZXNbJ0ZSQU1FLVJBVEUnXTsKICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gcmVzb2x1dGlvbkluZm8uUmVzb2x1dGlvbiAmJiAoIW1hdGNoZWRSZXNvbHV0aW9uVXJsIHx8ICghbWF0Y2hlZEZyYW1lUmF0ZSAmJiBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJlc29sdXRpb25VcmwgPSBlbmNvZGluZ3NMaW5lc1tpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRGcmFtZVJhdGUgPSBmcmFtZVJhdGUgPT0gcmVzb2x1dGlvbkluZm8uRnJhbWVSYXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEZyYW1lUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvbHV0aW9uVXJsLnRyaW1FbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSByZXNvbHV0aW9uLnNwbGl0KCd4JykubWFwKE51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IE1hdGguYWJzKCh3aWR0aCAqIGhlaWdodCkgLSAodGFyZ2V0V2lkdGggKiB0YXJnZXRIZWlnaHQpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZmVyZW5jZSA8IGNsb3Nlc3RSZXNvbHV0aW9uRGlmZmVyZW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0UmVzb2x1dGlvblVybCA9IGVuY29kaW5nc0xpbmVzW2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdFJlc29sdXRpb25EaWZmZXJlbmNlID0gZGlmZmVyZW5jZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsb3Nlc3RSZXNvbHV0aW9uVXJsLnRyaW1FbmQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKGNoYW5uZWxOYW1lLCBwbGF5ZXJUeXBlKSB7CiAgICAgICAgY29uc3QgcmVhbFBsYXllclR5cGUgPSBwbGF5ZXJUeXBlLnJlcGxhY2UoJy1BTFQnLCAnJyk7CiAgICAgICAgY29uc3QgYm9keSA9IHsKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1BsYXliYWNrQWNjZXNzVG9rZW4nLAogICAgICAgICAgICB2YXJpYWJsZXM6IHsKICAgICAgICAgICAgICAgIGlzTGl2ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGxvZ2luOiBjaGFubmVsTmFtZSwKICAgICAgICAgICAgICAgIGlzVm9kOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZvZElEOiAiIiwKICAgICAgICAgICAgICAgIHBsYXllclR5cGU6IHJlYWxQbGF5ZXJUeXBlLAogICAgICAgICAgICAgICAgcGxhdGZvcm06IHJlYWxQbGF5ZXJUeXBlID09ICdhdXRvcGxheScgPyAnYW5kcm9pZCcgOiAnd2ViJwogICAgICAgICAgICB9LAogICAgICAgICAgICBleHRlbnNpb25zOiB7CiAgICAgICAgICAgICAgICBwZXJzaXN0ZWRRdWVyeTogewogICAgICAgICAgICAgICAgICAgIHZlcnNpb246MSwKICAgICAgICAgICAgICAgICAgICBzaGEyNTZIYXNoOiJlZDIzMGFhMWUzM2UwN2VlYmI4OTI4NTA0NTgzZGE3OGE1MTczOTg5ZmFkZmIxYWM5NGJlMDZhMDRmM2NkYmU5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZ3FsUmVxdWVzdChib2R5LCBwbGF5ZXJUeXBlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdxbFJlcXVlc3QoYm9keSwgcGxheWVyVHlwZSkgewogICAgICAgIGlmICghZ3FsX2RldmljZV9pZCkgewogICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gJyc7CiAgICAgICAgICAgIGNvbnN0IGNoYXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzI7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgZ3FsX2RldmljZV9pZCArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IGhlYWRlcnMgPSB7CiAgICAgICAgICAgICdDbGllbnQtSWQnOiBDTElFTlRfSUQsCiAgICAgICAgICAgICdYLURldmljZS1JZCc6IGdxbF9kZXZpY2VfaWQsCiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogQXV0aG9yaXphdGlvbkhlYWRlciwKICAgICAgICAgICAgLi4uKENsaWVudEludGVncml0eUhlYWRlciAmJiB7J0NsaWVudC1JbnRlZ3JpdHknOiBDbGllbnRJbnRlZ3JpdHlIZWFkZXJ9KQogICAgICAgIH07CiAgICAgICAgaWYgKHBsYXllclR5cGUuaW5jbHVkZXMoJy1BTFQnKSkgewogICAgICAgICAgICBoZWFkZXJzID0gewogICAgICAgICAgICAgICAgJ0NsaWVudC1JZCc6IENMSUVOVF9JRCwKICAgICAgICAgICAgICAgICdYLURldmljZS1JZCc6IGdxbF9kZXZpY2VfaWQKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgY29uc3QgcmVxdWVzdElkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KTsKICAgICAgICAgICAgY29uc3QgZmV0Y2hSZXF1ZXN0ID0gewogICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RJZCwKICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vZ3FsLnR3aXRjaC50di9ncWwnLAogICAgICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcGVuZGluZ0ZldGNoUmVxdWVzdHMuc2V0KHJlcXVlc3RJZCwgewogICAgICAgICAgICAgICAgcmVzb2x2ZSwKICAgICAgICAgICAgICAgIHJlamVjdAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAga2V5OiAnRmV0Y2hSZXF1ZXN0JywKICAgICAgICAgICAgICAgIHZhbHVlOiBmZXRjaFJlcXVlc3QKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMoc3RyKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcygKICAgICAgICAgICAgc3RyLnNwbGl0KC8oPzpefCwpKCg/OltePV0qKT0oPzoiW14iXSoifFteLF0qKSkvKQogICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAgICAgICAgICAgLm1hcCh4ID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB4LmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB4LnN1YnN0cmluZygwLCBpZHgpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0geC5zdWJzdHJpbmcoaWR4ICsxKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCBOdW1iZXIuaXNOYU4obnVtKSA/IHZhbHVlLnN0YXJ0c1dpdGgoJyInKSA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWUgOiBudW1dCiAgICAgICAgICAgICAgICB9KSk7CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0VHdpdGNoV29ya2VyTWVzc2FnZShrZXksIHZhbHVlKSB7CiAgICAgICAgdHdpdGNoV29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHsKICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtrZXk6IGtleSwgdmFsdWU6IHZhbHVlfSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVXb3JrZXJGZXRjaFJlcXVlc3QoZmV0Y2hSZXF1ZXN0KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aW5kb3cucmVhbEZldGNoKGZldGNoUmVxdWVzdC51cmwsIGZldGNoUmVxdWVzdC5vcHRpb25zKTsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IHsKICAgICAgICAgICAgICAgIGlkOiBmZXRjaFJlcXVlc3QuaWQsCiAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMocmVzcG9uc2UuaGVhZGVycy5lbnRyaWVzKCkpLAogICAgICAgICAgICAgICAgYm9keTogcmVzcG9uc2VCb2R5CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdDsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaWQ6IGZldGNoUmVxdWVzdC5pZCwKICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gaG9va0ZldGNoKCkgewogICAgICAgIGNvbnN0IHJlYWxGZXRjaCA9IHdpbmRvdy5mZXRjaDsKICAgICAgICB3aW5kb3cucmVhbEZldGNoID0gcmVhbEZldGNoOwogICAgICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uKHVybCwgaW5pdCwgLi4uYXJncykgewogICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2dxbCcpKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUlkID0gaW5pdC5oZWFkZXJzWydYLURldmljZS1JZCddOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGV2aWNlSWQgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW5pdC5oZWFkZXJzWydEZXZpY2UtSUQnXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXZpY2VJZCA9PT0gJ3N0cmluZycgJiYgZ3FsX2RldmljZV9pZCAhPSBkZXZpY2VJZCkgewogICAgICAgICAgICAgICAgICAgICAgICBncWxfZGV2aWNlX2lkID0gZGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVYm9VcGRhdGVEZXZpY2VJZCcsIGdxbF9kZXZpY2VfaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluaXQuaGVhZGVyc1snQ2xpZW50LUludGVncml0eSddID09PSAnc3RyaW5nJyAmJiBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSAhPT0gQ2xpZW50SW50ZWdyaXR5SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVDbGllbnRJbnRlZ3JpdHlIZWFkZXInLCBDbGllbnRJbnRlZ3JpdHlIZWFkZXIgPSBpbml0LmhlYWRlcnNbJ0NsaWVudC1JbnRlZ3JpdHknXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPT09ICdzdHJpbmcnICYmIGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddICE9PSBBdXRob3JpemF0aW9uSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RUd2l0Y2hXb3JrZXJNZXNzYWdlKCdVcGRhdGVBdXRob3JpemF0aW9uSGVhZGVyJywgQXV0aG9yaXphdGlvbkhlYWRlciA9IGluaXQuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHJpZCBvZiBtaW5pIHBsYXllciBhYm92ZSBjaGF0IC0gVE9ETzogUmVqZWN0IHRoaXMgbG9jYWxseSBpbnN0ZWFkIG9mIGhhdmluZyBzZXJ2ZXIgcmVqZWN0IGl0CiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdwaWN0dXJlLWJ5LXBpY3R1cmUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUgJiYgdHlwZW9mIGluaXQuYm9keSA9PT0gJ3N0cmluZycgJiYgaW5pdC5ib2R5LmluY2x1ZGVzKCdQbGF5YmFja0FjY2Vzc1Rva2VuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VkUGxheWVyVHlwZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gSlNPTi5wYXJzZShpbml0LmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdCb2R5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHlbaV0/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5W2ldPy52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRQbGF5ZXJUeXBlID0gbmV3Qm9keVtpXS52YXJpYWJsZXMucGxheWVyVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9keVtpXS52YXJpYWJsZXMucGxheWVyVHlwZSA9IE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0JvZHk/LnZhcmlhYmxlcz8ucGxheWVyVHlwZSAmJiBuZXdCb2R5Py52YXJpYWJsZXM/LnBsYXllclR5cGUgIT09IE9QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFBsYXllclR5cGUgPSBuZXdCb2R5LnZhcmlhYmxlcy5wbGF5ZXJUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0JvZHkudmFyaWFibGVzLnBsYXllclR5cGUgPSBPUFRfRk9SQ0VfQUNDRVNTX1RPS0VOX1BMQVlFUl9UWVBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlZFBsYXllclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSZXBsYWNlZCAnJHtyZXBsYWNlZFBsYXllclR5cGV9JyBwbGF5ZXIgdHlwZSB3aXRoICcke09QVF9GT1JDRV9BQ0NFU1NfVE9LRU5fUExBWUVSX1RZUEV9JyBwbGF5ZXIgdHlwZWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gSlNPTi5zdHJpbmdpZnkobmV3Qm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlYWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVBZGJsb2NrQmFubmVyKGRhdGEpIHsKICAgICAgICBjb25zdCBwbGF5ZXJSb290RGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLXBsYXllcicpOwogICAgICAgIGlmIChwbGF5ZXJSb290RGl2ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGFkQmxvY2tEaXYgPSBudWxsOwogICAgICAgICAgICBhZEJsb2NrRGl2ID0gcGxheWVyUm9vdERpdi5xdWVyeVNlbGVjdG9yKCcuYWRibG9jay1vdmVybGF5Jyk7CiAgICAgICAgICAgIGlmIChhZEJsb2NrRGl2ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuY2xhc3NOYW1lID0gJ2FkYmxvY2stb3ZlcmxheSc7CiAgICAgICAgICAgICAgICBhZEJsb2NrRGl2LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJwbGF5ZXItYWRibG9jay1ub3RpY2UiIHN0eWxlPSJjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyBwYWRkaW5nOiA1cHg7Ij48cD48L3A+PC9kaXY+JzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUCA9IGFkQmxvY2tEaXYucXVlcnlTZWxlY3RvcigncCcpOwogICAgICAgICAgICAgICAgcGxheWVyUm9vdERpdi5hcHBlbmRDaGlsZChhZEJsb2NrRGl2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYWRCbG9ja0RpdiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoIXR3aXRjaFBsYXllckFuZFN0YXRlPy5wbGF5ZXI/LmNvcmUgfHwgIXR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHR3aXRjaFBsYXllckFuZFN0YXRlID0gZ2V0UGxheWVyQW5kU3RhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGlzTGl2ZSA9IHR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuUC50ZXh0Q29udGVudCA9ICdCbG9ja2luZycgKyAoZGF0YS5pc01pZHJvbGwgPyAnIG1pZHJvbGwnIDogJycpICsgJyBhZHMnICsgKGRhdGEuaXNTdHJpcHBpbmdBZFNlZ21lbnRzID8gJyAoc3RyaXBwaW5nKScgOiAnJyk7Ly8gKyAoZGF0YS5udW1TdHJpcHBlZEFkU2VnbWVudHMgPiAwID8gYCAoJHtkYXRhLm51bVN0cmlwcGVkQWRTZWdtZW50c30pYCA6ICcnKTsKICAgICAgICAgICAgICAgIGFkQmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzQWRzICYmIGlzTGl2ZSA/ICdibG9jaycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtb25pdG9yTGl2ZVN0YXR1cygpIHsKICAgICAgICBpZiAoIXR3aXRjaFBsYXllckFuZFN0YXRlPy5wbGF5ZXI/LmNvcmUgfHwgIXR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZSkgewogICAgICAgICAgICB0d2l0Y2hQbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzTGl2ZSA9IHR3aXRjaFBsYXllckFuZFN0YXRlPy5zdGF0ZT8ucHJvcHM/LmNvbnRlbnQ/LnR5cGUgPT09ICdsaXZlJzsKICAgICAgICBpZiAoIWlzTGl2ZSkgewogICAgICAgICAgICB1cGRhdGVBZGJsb2NrQmFubmVyKHsKICAgICAgICAgICAgICAgIGhhc0FkczogZmFsc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQobW9uaXRvckxpdmVTdGF0dXMsIDEwMDApOwogICAgfQogICAgZnVuY3Rpb24gZ2V0UGxheWVyQW5kU3RhdGUoKSB7CiAgICAgICAgZnVuY3Rpb24gZmluZFJlYWN0Tm9kZShyb290LCBjb25zdHJhaW50KSB7CiAgICAgICAgICAgIGlmIChyb290LnN0YXRlTm9kZSAmJiBjb25zdHJhaW50KHJvb3Quc3RhdGVOb2RlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Quc3RhdGVOb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBub2RlID0gcm9vdC5jaGlsZDsKICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbmRSZWFjdE5vZGUobm9kZSwgY29uc3RyYWludCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGZpbmRSZWFjdFJvb3ROb2RlKCkgewogICAgICAgICAgICBsZXQgcmVhY3RSb290Tm9kZSA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jvb3QnKTsKICAgICAgICAgICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIgJiYgcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290ICYmIHJvb3ROb2RlLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50KSB7CiAgICAgICAgICAgICAgICByZWFjdFJvb3ROb2RlID0gcm9vdE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lci5faW50ZXJuYWxSb290LmN1cnJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlYWN0Um9vdE5vZGUgPT0gbnVsbCAmJiByb290Tm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gT2JqZWN0LmtleXMocm9vdE5vZGUpLmZpbmQoeCA9PiB4LnN0YXJ0c1dpdGgoJ19fcmVhY3RDb250YWluZXInKSk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RSb290Tm9kZSA9IHJvb3ROb2RlW2NvbnRhaW5lck5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWFjdFJvb3ROb2RlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWFjdFJvb3ROb2RlID0gZmluZFJlYWN0Um9vdE5vZGUoKTsKICAgICAgICBpZiAoIXJlYWN0Um9vdE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGxldCBwbGF5ZXIgPSBmaW5kUmVhY3ROb2RlKHJlYWN0Um9vdE5vZGUsIG5vZGUgPT4gbm9kZS5zZXRQbGF5ZXJBY3RpdmUgJiYgbm9kZS5wcm9wcyAmJiBub2RlLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UpOwogICAgICAgIHBsYXllciA9IHBsYXllciAmJiBwbGF5ZXIucHJvcHMgJiYgcGxheWVyLnByb3BzLm1lZGlhUGxheWVySW5zdGFuY2UgPyBwbGF5ZXIucHJvcHMubWVkaWFQbGF5ZXJJbnN0YW5jZSA6IG51bGw7CiAgICAgICAgaWYgKHBsYXllcj8ucGxheWVySW5zdGFuY2UpIHsKICAgICAgICAgICAgcGxheWVyID0gcGxheWVyLnBsYXllckluc3RhbmNlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IGZpbmRSZWFjdE5vZGUocmVhY3RSb290Tm9kZSwgbm9kZSA9PiBub2RlLnNldFNyYyAmJiBub2RlLnNldEluaXRpYWxQbGF5YmFja1NldHRpbmdzKTsKICAgICAgICByZXR1cm4gIHsKICAgICAgICAgICAgcGxheWVyOiBwbGF5ZXIsCiAgICAgICAgICAgIHN0YXRlOiBwbGF5ZXJTdGF0ZQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiByZWxvYWRUd2l0Y2hQbGF5ZXIoaXNQYXVzZVBsYXkpIHsKICAgICAgICBjb25zdCBwbGF5ZXJBbmRTdGF0ZSA9IGdldFBsYXllckFuZFN0YXRlKCk7CiAgICAgICAgaWYgKCFwbGF5ZXJBbmRTdGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgcmVhY3Qgcm9vdCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsYXllciA9IHBsYXllckFuZFN0YXRlLnBsYXllcjsKICAgICAgICBjb25zdCBwbGF5ZXJTdGF0ZSA9IHBsYXllckFuZFN0YXRlLnN0YXRlOwogICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXInKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXBsYXllclN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgZmluZCBwbGF5ZXIgc3RhdGUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocGxheWVyLmlzUGF1c2VkKCkgfHwgcGxheWVyLmNvcmU/LnBhdXNlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChpc1BhdXNlUGxheSkgewogICAgICAgICAgICBwbGF5ZXIucGF1c2UoKTsKICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBsc0tleVF1YWxpdHkgPSAndmlkZW8tcXVhbGl0eSc7CiAgICAgICAgY29uc3QgbHNLZXlNdXRlZCA9ICd2aWRlby1tdXRlZCc7CiAgICAgICAgY29uc3QgbHNLZXlWb2x1bWUgPSAndm9sdW1lJzsKICAgICAgICBsZXQgY3VycmVudFF1YWxpdHlMUyA9IG51bGw7CiAgICAgICAgbGV0IGN1cnJlbnRNdXRlZExTID0gbnVsbDsKICAgICAgICBsZXQgY3VycmVudFZvbHVtZUxTID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBjdXJyZW50UXVhbGl0eUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlRdWFsaXR5KTsKICAgICAgICAgICAgY3VycmVudE11dGVkTFMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsc0tleU11dGVkKTsKICAgICAgICAgICAgY3VycmVudFZvbHVtZUxTID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obHNLZXlWb2x1bWUpOwogICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlSG9va0ZhaWxlZCAmJiBwbGF5ZXI/LmNvcmU/LnN0YXRlKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleU11dGVkLCBKU09OLnN0cmluZ2lmeSh7ZGVmYXVsdDpwbGF5ZXIuY29yZS5zdGF0ZS5tdXRlZH0pKTsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBwbGF5ZXIuY29yZS5zdGF0ZS52b2x1bWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VIb29rRmFpbGVkICYmIHBsYXllcj8uY29yZT8uc3RhdGU/LnF1YWxpdHk/Lmdyb3VwKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIEpTT04uc3RyaW5naWZ5KHtkZWZhdWx0OnBsYXllci5jb3JlLnN0YXRlLnF1YWxpdHkuZ3JvdXB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgcGxheWVyU3RhdGUuc2V0U3JjKHsgaXNOZXdNZWRpYVBsYXllckluc3RhbmNlOiB0cnVlLCByZWZyZXNoQWNjZXNzVG9rZW46IHRydWUgfSk7CiAgICAgICAgcGxheWVyLnBsYXkoKTsKICAgICAgICBpZiAobG9jYWxTdG9yYWdlSG9va0ZhaWxlZCAmJiAoY3VycmVudFF1YWxpdHlMUyB8fCBjdXJyZW50TXV0ZWRMUyB8fCBjdXJyZW50Vm9sdW1lTFMpKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFF1YWxpdHlMUykgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsc0tleVF1YWxpdHksIGN1cnJlbnRRdWFsaXR5TFMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE11dGVkTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obHNLZXlNdXRlZCwgY3VycmVudE11dGVkTFMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZvbHVtZUxTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxzS2V5Vm9sdW1lLCBjdXJyZW50Vm9sdW1lTFMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgfSwgMzAwMCk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gb25Db250ZW50TG9hZGVkKCkgewogICAgICAgIC8vIFRoaXMgc3RvcHMgVHdpdGNoIGZyb20gcGF1c2luZyB0aGUgcGxheWVyIHdoZW4gaW4gYW5vdGhlciB0YWIgYW5kIGFuIGFkIHNob3dzLgogICAgICAgIC8vIFRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhdWNldHR2L1ZpZGVvQWRCbG9ja0ZvclR3aXRjaC9ibG9iL2NlZmNlOWQyYjU2NTc2OWM3N2UzNjY2YWM4MjM0YzNhY2ZlMjBkODMvY2hyb21lL2NvbnRlbnQuanMjTDMwCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAndmlzaWJpbGl0eVN0YXRlJywgewogICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAndmlzaWJsZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH1jYXRjaHt9CiAgICAgICAgbGV0IGhpZGRlbiA9IGRvY3VtZW50Ll9fbG9va3VwR2V0dGVyX18oJ2hpZGRlbicpOwogICAgICAgIGxldCB3ZWJraXRIaWRkZW4gPSBkb2N1bWVudC5fX2xvb2t1cEdldHRlcl9fKCd3ZWJraXRIaWRkZW4nKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdoaWRkZW4nLCB7CiAgICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9Y2F0Y2h7fQogICAgICAgIGNvbnN0IGJsb2NrID0gZSA9PiB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICB9OwogICAgICAgIGxldCB3YXNWaWRlb1BsYXlpbmcgPSB0cnVlOwogICAgICAgIGNvbnN0IHZpc2liaWxpdHlDaGFuZ2UgPSBlID0+IHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBjaHJvbWUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChoaWRkZW4uYXBwbHkoZG9jdW1lbnQpID09PSB0cnVlIHx8ICh3ZWJraXRIaWRkZW4gJiYgd2Via2l0SGlkZGVuLmFwcGx5KGRvY3VtZW50KSA9PT0gdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2FzVmlkZW9QbGF5aW5nID0gIXZpZGVvc1swXS5wYXVzZWQgJiYgIXZpZGVvc1swXS5lbmRlZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdhc1ZpZGVvUGxheWluZyAmJiAhdmlkZW9zWzBdLmVuZGVkICYmIHZpZGVvc1swXS5wYXVzZWQgJiYgdmlkZW9zWzBdLm11dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvc1swXS5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsb2NrKGUpOwogICAgICAgIH07CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHZpc2liaWxpdHlDaGFuZ2UsIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHZpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlLCB0cnVlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3p2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZSwgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaGFzRm9jdXMnLCBibG9jaywgdHJ1ZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKC9GaXJlZm94Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdtb3pIaWRkZW4nLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICd3ZWJraXRIaWRkZW4nLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9Y2F0Y2h7fQogICAgICAgIC8vIEhvb2tzIGZvciBwcmVzZXJ2aW5nIHZvbHVtZSAvIHJlc29sdXRpb24KICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBrZXlzVG9DYWNoZSA9IFsKICAgICAgICAgICAgICAgICd2aWRlby1xdWFsaXR5JywKICAgICAgICAgICAgICAgICd2aWRlby1tdXRlZCcsCiAgICAgICAgICAgICAgICAndm9sdW1lJywKICAgICAgICAgICAgICAgICdsb3dMYXRlbmN5TW9kZUVuYWJsZWQnLC8vIExvdyBMYXRlbmN5CiAgICAgICAgICAgICAgICAncGVyc2lzdGVuY2VFbmFibGVkJywvLyBNaW5pIFBsYXllcgogICAgICAgICAgICBdOwogICAgICAgICAgICBjb25zdCBjYWNoZWRWYWx1ZXMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c1RvQ2FjaGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5zZXQoa2V5c1RvQ2FjaGVbaV0sIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleXNUb0NhY2hlW2ldKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVhbFNldEl0ZW0gPSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbTsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0gPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVmFsdWVzLnNldChrZXksIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWxTZXRJdGVtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHJlYWxHZXRJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW07CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtID0gZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlcy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZWFsR2V0SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtLnRvU3RyaW5nKCkuaW5jbHVkZXMoT2JqZWN0LmtleXMoe2NhY2hlZFZhbHVlc30pWzBdKSkgewogICAgICAgICAgICAgICAgLy8gVGhlc2UgaG9va3MgYXJlIHVzZWZ1bCB0byBwcmVzZXJ2ZSBwbGF5ZXIgc3RhdGUgb24gcGxheWVyIHJlbG9hZAogICAgICAgICAgICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IGFsbG93IGhvb2tpbmcgb2YgbG9jYWxTdG9yYWdlIGZ1bmN0aW9ucyBidXQgY2hyb21lIGRvZXMKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZUhvb2tGYWlsZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2NhbFN0b3JhZ2VIb29rcyBmYWlsZWQgJyArIGVycikKICAgICAgICAgICAgbG9jYWxTdG9yYWdlSG9va0ZhaWxlZCA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgd2luZG93LnJlbG9hZFR3aXRjaFBsYXllciA9IHJlbG9hZFR3aXRjaFBsYXllcjsKICAgIGRlY2xhcmVPcHRpb25zKHdpbmRvdyk7CiAgICBob29rV2luZG93V29ya2VyKCk7CiAgICBob29rRmV0Y2goKTsKICAgIG1vbml0b3JMaXZlU3RhdHVzKCk7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAibG9hZGVkIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiKSB7CiAgICAgICAgb25Db250ZW50TG9hZGVkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG9uQ29udGVudExvYWRlZCgpOwogICAgICAgIH0pOwogICAgfQogICAgd2luZG93LnNpbXVsYXRlQWRzID0gKGRlcHRoKSA9PiB7CiAgICAgICAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggPCAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCBkZXB0aCBwYXJhbXRlciByZXF1aXJlZCAoMCA9IG5vIHNpbXVsYXRlZCBhZCwgMSsgPSB1c2UgYmFja3VwIHBsYXllciBmb3IgZ2l2ZW4gZGVwdGgpJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ1NpbXVsYXRlQWRzJywgZGVwdGgpOwogICAgfTsKICAgIHdpbmRvdy5hbGxTZWdtZW50c0FyZUFkU2VnbWVudHMgPSAoKSA9PiB7CiAgICAgICAgcG9zdFR3aXRjaFdvcmtlck1lc3NhZ2UoJ0FsbFNlZ21lbnRzQXJlQWRTZWdtZW50cycpOwogICAgfTsKfSkoKTsK"},{"name":"set-attr.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gcnVuQXQoZm4sIHdoZW4pIHsKICAgIGNvbnN0IGludEZyb21SZWFkeVN0YXRlID0gc3RhdGUgPT4gewogICAgICAgIGNvbnN0IHRhcmdldHMgPSB7CiAgICAgICAgICAgICdsb2FkaW5nJzogMSwgJ2FzYXAnOiAxLAogICAgICAgICAgICAnaW50ZXJhY3RpdmUnOiAyLCAnZW5kJzogMiwgJzInOiAyLAogICAgICAgICAgICAnY29tcGxldGUnOiAzLCAnaWRsZSc6IDMsICczJzogMywKICAgICAgICB9OwogICAgICAgIGNvbnN0IHRva2VucyA9IEFycmF5LmlzQXJyYXkoc3RhdGUpID8gc3RhdGUgOiBbIHN0YXRlIF07CiAgICAgICAgZm9yICggY29uc3QgdG9rZW4gb2YgdG9rZW5zICkgewogICAgICAgICAgICBjb25zdCBwcm9wID0gYCR7dG9rZW59YDsKICAgICAgICAgICAgaWYgKCBPYmplY3QuaGFzT3duKHRhcmdldHMsIHByb3ApID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgcmV0dXJuIHRhcmdldHNbcHJvcF07CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgfTsKICAgIGNvbnN0IHJ1bkF0ID0gaW50RnJvbVJlYWR5U3RhdGUod2hlbik7CiAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpID49IHJ1bkF0ICkgewogICAgICAgIGZuKCk7IHJldHVybjsKICAgIH0KICAgIGNvbnN0IG9uU3RhdGVDaGFuZ2UgPSAoICkgPT4gewogICAgICAgIGlmICggaW50RnJvbVJlYWR5U3RhdGUoZG9jdW1lbnQucmVhZHlTdGF0ZSkgPCBydW5BdCApIHsgcmV0dXJuOyB9CiAgICAgICAgZm4oKTsKICAgICAgICBzYWZlLnJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkoZG9jdW1lbnQsIGFyZ3MpOwogICAgfTsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgYXJncyA9IFsgJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvblN0YXRlQ2hhbmdlLCB7IGNhcHR1cmU6IHRydWUgfSBdOwogICAgc2FmZS5hZGRFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKfQpmdW5jdGlvbiBzZXRBdHRyRm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBsb2dQcmVmaXgsCiAgICBzZWxlY3RvciA9ICcnLAogICAgYXR0ciA9ICcnLAogICAgdmFsdWUgPSAnJywKICAgIG9wdGlvbnMgPSB7fQopIHsKICAgIGlmICggc2VsZWN0b3IgPT09ICcnICkgeyByZXR1cm47IH0KICAgIGlmICggYXR0ciA9PT0gJycgKSB7IHJldHVybjsgfQoKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgY29weUZyb20gPSB0cnVzdGVkID09PSBmYWxzZSAmJiAvXlxbLitcXSQvLnRlc3QodmFsdWUpCiAgICAgICAgPyB2YWx1ZS5zbGljZSgxLCAtMSkKICAgICAgICA6ICcnOwoKICAgIGNvbnN0IGV4dHJhY3RWYWx1ZSA9IGVsZW0gPT4gY29weUZyb20gIT09ICcnCiAgICAgICAgPyBlbGVtLmdldEF0dHJpYnV0ZShjb3B5RnJvbSkgfHwgJycKICAgICAgICA6IHZhbHVlOwoKICAgIGNvbnN0IGFwcGx5U2V0QXR0ciA9ICggKSA9PiB7CiAgICAgICAgbGV0IGVsZW1zOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZm9yICggY29uc3QgZWxlbSBvZiBlbGVtcyApIHsKICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gZXh0cmFjdFZhbHVlKGVsZW0pOwogICAgICAgICAgICBpZiAoIGFmdGVyID09PSBiZWZvcmUgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggYWZ0ZXIgIT09ICcnICYmIC9eb24vaS50ZXN0KGF0dHIpICkgewogICAgICAgICAgICAgICAgaWYgKCBhdHRyLnRvTG93ZXJDYXNlKCkgaW4gZWxlbSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZShhdHRyLCBhZnRlcik7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYCR7YXR0cn09IiR7YWZ0ZXJ9ImApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgbGV0IG9ic2VydmVyLCB0aW1lcjsKICAgIGNvbnN0IG9uRG9tQ2hhbmdlZCA9IG11dGF0aW9ucyA9PiB7CiAgICAgICAgaWYgKCB0aW1lciAhPT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBsZXQgc2hvdWxkV29yayA9IGZhbHNlOwogICAgICAgIGZvciAoIGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucyApIHsKICAgICAgICAgICAgaWYgKCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCA9PT0gMCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgZm9yICggY29uc3Qgbm9kZSBvZiBtdXRhdGlvbi5hZGRlZE5vZGVzICkgewogICAgICAgICAgICAgICAgaWYgKCBub2RlLm5vZGVUeXBlICE9PSAxICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgc2hvdWxkV29yayA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNob3VsZFdvcmsgKSB7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICAgIGlmICggc2hvdWxkV29yayA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIHRpbWVyID0gc2VsZi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCApID0+IHsKICAgICAgICAgICAgdGltZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGFwcGx5U2V0QXR0cigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBjb25zdCBzdGFydCA9ICggKSA9PiB7CiAgICAgICAgaWYgKCBhcHBseVNldEF0dHIoKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIob25Eb21DaGFuZ2VkKTsKICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsKICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSwKICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgIH0pOwogICAgfTsKICAgIHJ1bkF0KCggKSA9PiB7IHN0YXJ0KCk7IH0sIG9wdGlvbnMucnVuQXQgfHwgJ2lkbGUnKTsKfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KCiAgKGZ1bmN0aW9uIHNldEF0dHIoCiAgICBzZWxlY3RvciA9ICcnLAogICAgYXR0ciA9ICcnLAogICAgdmFsdWUgPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdzZXQtYXR0cicsIHNlbGVjdG9yLCBhdHRyLCB2YWx1ZSk7CiAgICBjb25zdCB2YWxpZFZhbHVlcyA9IFsgJycsICdmYWxzZScsICd0cnVlJyBdOwogICAgaWYgKCB2YWxpZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgaWYgKCAvXlxkKyQvLnRlc3QodmFsdWUpICkgewogICAgICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQodmFsdWUsIDEwKTsKICAgICAgICAgICAgaWYgKCBuID49IDMyNzY4ICkgeyByZXR1cm47IH0KICAgICAgICAgICAgdmFsdWUgPSBgJHtufWA7CiAgICAgICAgfSBlbHNlIGlmICggL15cWy4rXF0kLy50ZXN0KHZhbHVlKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBvcHRpb25zID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAzKTsKICAgIHNldEF0dHJGbihmYWxzZSwgbG9nUHJlZml4LCBzZWxlY3RvciwgYXR0ciwgdmFsdWUsIG9wdGlvbnMpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-set-attr.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gcnVuQXQoZm4sIHdoZW4pIHsKICAgIGNvbnN0IGludEZyb21SZWFkeVN0YXRlID0gc3RhdGUgPT4gewogICAgICAgIGNvbnN0IHRhcmdldHMgPSB7CiAgICAgICAgICAgICdsb2FkaW5nJzogMSwgJ2FzYXAnOiAxLAogICAgICAgICAgICAnaW50ZXJhY3RpdmUnOiAyLCAnZW5kJzogMiwgJzInOiAyLAogICAgICAgICAgICAnY29tcGxldGUnOiAzLCAnaWRsZSc6IDMsICczJzogMywKICAgICAgICB9OwogICAgICAgIGNvbnN0IHRva2VucyA9IEFycmF5LmlzQXJyYXkoc3RhdGUpID8gc3RhdGUgOiBbIHN0YXRlIF07CiAgICAgICAgZm9yICggY29uc3QgdG9rZW4gb2YgdG9rZW5zICkgewogICAgICAgICAgICBjb25zdCBwcm9wID0gYCR7dG9rZW59YDsKICAgICAgICAgICAgaWYgKCBPYmplY3QuaGFzT3duKHRhcmdldHMsIHByb3ApID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgcmV0dXJuIHRhcmdldHNbcHJvcF07CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgfTsKICAgIGNvbnN0IHJ1bkF0ID0gaW50RnJvbVJlYWR5U3RhdGUod2hlbik7CiAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpID49IHJ1bkF0ICkgewogICAgICAgIGZuKCk7IHJldHVybjsKICAgIH0KICAgIGNvbnN0IG9uU3RhdGVDaGFuZ2UgPSAoICkgPT4gewogICAgICAgIGlmICggaW50RnJvbVJlYWR5U3RhdGUoZG9jdW1lbnQucmVhZHlTdGF0ZSkgPCBydW5BdCApIHsgcmV0dXJuOyB9CiAgICAgICAgZm4oKTsKICAgICAgICBzYWZlLnJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkoZG9jdW1lbnQsIGFyZ3MpOwogICAgfTsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgYXJncyA9IFsgJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvblN0YXRlQ2hhbmdlLCB7IGNhcHR1cmU6IHRydWUgfSBdOwogICAgc2FmZS5hZGRFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKfQpmdW5jdGlvbiBzZXRBdHRyRm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBsb2dQcmVmaXgsCiAgICBzZWxlY3RvciA9ICcnLAogICAgYXR0ciA9ICcnLAogICAgdmFsdWUgPSAnJywKICAgIG9wdGlvbnMgPSB7fQopIHsKICAgIGlmICggc2VsZWN0b3IgPT09ICcnICkgeyByZXR1cm47IH0KICAgIGlmICggYXR0ciA9PT0gJycgKSB7IHJldHVybjsgfQoKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgY29weUZyb20gPSB0cnVzdGVkID09PSBmYWxzZSAmJiAvXlxbLitcXSQvLnRlc3QodmFsdWUpCiAgICAgICAgPyB2YWx1ZS5zbGljZSgxLCAtMSkKICAgICAgICA6ICcnOwoKICAgIGNvbnN0IGV4dHJhY3RWYWx1ZSA9IGVsZW0gPT4gY29weUZyb20gIT09ICcnCiAgICAgICAgPyBlbGVtLmdldEF0dHJpYnV0ZShjb3B5RnJvbSkgfHwgJycKICAgICAgICA6IHZhbHVlOwoKICAgIGNvbnN0IGFwcGx5U2V0QXR0ciA9ICggKSA9PiB7CiAgICAgICAgbGV0IGVsZW1zOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZm9yICggY29uc3QgZWxlbSBvZiBlbGVtcyApIHsKICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gZXh0cmFjdFZhbHVlKGVsZW0pOwogICAgICAgICAgICBpZiAoIGFmdGVyID09PSBiZWZvcmUgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggYWZ0ZXIgIT09ICcnICYmIC9eb24vaS50ZXN0KGF0dHIpICkgewogICAgICAgICAgICAgICAgaWYgKCBhdHRyLnRvTG93ZXJDYXNlKCkgaW4gZWxlbSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZShhdHRyLCBhZnRlcik7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYCR7YXR0cn09IiR7YWZ0ZXJ9ImApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgbGV0IG9ic2VydmVyLCB0aW1lcjsKICAgIGNvbnN0IG9uRG9tQ2hhbmdlZCA9IG11dGF0aW9ucyA9PiB7CiAgICAgICAgaWYgKCB0aW1lciAhPT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBsZXQgc2hvdWxkV29yayA9IGZhbHNlOwogICAgICAgIGZvciAoIGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucyApIHsKICAgICAgICAgICAgaWYgKCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCA9PT0gMCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgZm9yICggY29uc3Qgbm9kZSBvZiBtdXRhdGlvbi5hZGRlZE5vZGVzICkgewogICAgICAgICAgICAgICAgaWYgKCBub2RlLm5vZGVUeXBlICE9PSAxICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgc2hvdWxkV29yayA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNob3VsZFdvcmsgKSB7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICAgIGlmICggc2hvdWxkV29yayA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIHRpbWVyID0gc2VsZi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCApID0+IHsKICAgICAgICAgICAgdGltZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGFwcGx5U2V0QXR0cigpOwogICAgICAgIH0pOwogICAgfTsKCiAgICBjb25zdCBzdGFydCA9ICggKSA9PiB7CiAgICAgICAgaWYgKCBhcHBseVNldEF0dHIoKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIob25Eb21DaGFuZ2VkKTsKICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsKICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSwKICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgIH0pOwogICAgfTsKICAgIHJ1bkF0KCggKSA9PiB7IHN0YXJ0KCk7IH0sIG9wdGlvbnMucnVuQXQgfHwgJ2lkbGUnKTsKfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRTZXRBdHRyKAogICAgc2VsZWN0b3IgPSAnJywKICAgIGF0dHIgPSAnJywKICAgIHZhbHVlID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgndHJ1c3RlZC1zZXQtYXR0cicsIHNlbGVjdG9yLCBhdHRyLCB2YWx1ZSk7CiAgICBjb25zdCBvcHRpb25zID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAzKTsKICAgIHNldEF0dHJGbih0cnVlLCBsb2dQcmVmaXgsIHNlbGVjdG9yLCBhdHRyLCB2YWx1ZSwgb3B0aW9ucyk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"remove-attr.js","aliases":["ra.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHJ1bkF0KGZuLCB3aGVuKSB7CiAgICBjb25zdCBpbnRGcm9tUmVhZHlTdGF0ZSA9IHN0YXRlID0+IHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gewogICAgICAgICAgICAnbG9hZGluZyc6IDEsICdhc2FwJzogMSwKICAgICAgICAgICAgJ2ludGVyYWN0aXZlJzogMiwgJ2VuZCc6IDIsICcyJzogMiwKICAgICAgICAgICAgJ2NvbXBsZXRlJzogMywgJ2lkbGUnOiAzLCAnMyc6IDMsCiAgICAgICAgfTsKICAgICAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5pc0FycmF5KHN0YXRlKSA/IHN0YXRlIDogWyBzdGF0ZSBdOwogICAgICAgIGZvciAoIGNvbnN0IHRva2VuIG9mIHRva2VucyApIHsKICAgICAgICAgICAgY29uc3QgcHJvcCA9IGAke3Rva2VufWA7CiAgICAgICAgICAgIGlmICggT2JqZWN0Lmhhc093bih0YXJnZXRzLCBwcm9wKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIHJldHVybiB0YXJnZXRzW3Byb3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBjb25zdCBydW5BdCA9IGludEZyb21SZWFkeVN0YXRlKHdoZW4pOwogICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSBydW5BdCApIHsKICAgICAgICBmbigpOyByZXR1cm47CiAgICB9CiAgICBjb25zdCBvblN0YXRlQ2hhbmdlID0gKCApID0+IHsKICAgICAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpIDwgcnVuQXQgKSB7IHJldHVybjsgfQogICAgICAgIGZuKCk7CiAgICAgICAgc2FmZS5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKICAgIH07CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGFyZ3MgPSBbICdyZWFkeXN0YXRlY2hhbmdlJywgb25TdGF0ZUNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlIH0gXTsKICAgIHNhZmUuYWRkRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7Cn0KCiAgKGZ1bmN0aW9uIHJlbW92ZUF0dHIoCiAgICByYXdUb2tlbiA9ICcnLAogICAgcmF3U2VsZWN0b3IgPSAnJywKICAgIGJlaGF2aW9yID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiByYXdUb2tlbiAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgaWYgKCByYXdUb2tlbiA9PT0gJycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ3JlbW92ZS1hdHRyJywgcmF3VG9rZW4sIHJhd1NlbGVjdG9yLCBiZWhhdmlvcik7CiAgICBjb25zdCB0b2tlbnMgPSBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHJhd1Rva2VuLCAvXHMqXHxccyovKTsKICAgIGNvbnN0IHNlbGVjdG9yID0gdG9rZW5zCiAgICAgICAgLm1hcChhID0+IGAke3Jhd1NlbGVjdG9yfVske0NTUy5lc2NhcGUoYSl9XWApCiAgICAgICAgLmpvaW4oJywnKTsKICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgVGFyZ2V0IHNlbGVjdG9yOlxuXHQke3NlbGVjdG9yfWApOwogICAgfQogICAgY29uc3QgYXNhcCA9IC9cYmFzYXBcYi8udGVzdChiZWhhdmlvcik7CiAgICBsZXQgdGltZXJJZDsKICAgIGNvbnN0IHJtYXR0ckFzeW5jID0gKCApID0+IHsKICAgICAgICBpZiAoIHRpbWVySWQgIT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGltZXJJZCA9IHNhZmUub25JZGxlKCggKSA9PiB7CiAgICAgICAgICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHJtYXR0cigpOwogICAgICAgIH0sIHsgdGltZW91dDogMTcgfSk7CiAgICB9OwogICAgY29uc3Qgcm1hdHRyID0gKCApID0+IHsKICAgICAgICBpZiAoIHRpbWVySWQgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgc2FmZS5vZmZJZGxlKHRpbWVySWQpOwogICAgICAgICAgICB0aW1lcklkID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgICAgICAgICBmb3IgKCBjb25zdCBub2RlIG9mIG5vZGVzICkgewogICAgICAgICAgICAgICAgZm9yICggY29uc3QgYXR0ciBvZiB0b2tlbnMgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBub2RlLmhhc0F0dHJpYnV0ZShhdHRyKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgUmVtb3ZlZCBhdHRyaWJ1dGUgJyR7YXR0cn0nYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICB9OwogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gbXV0YXRpb25zID0+IHsKICAgICAgICBpZiAoIHRpbWVySWQgIT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgbGV0IHNraXAgPSB0cnVlOwogICAgICAgIGZvciAoIGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGggJiYgc2tpcDsgaSsrICkgewogICAgICAgICAgICBjb25zdCB7IHR5cGUsIGFkZGVkTm9kZXMsIHJlbW92ZWROb2RlcyB9ID0gbXV0YXRpb25zW2ldOwogICAgICAgICAgICBpZiAoIHR5cGUgPT09ICdhdHRyaWJ1dGVzJyApIHsgc2tpcCA9IGZhbHNlOyB9CiAgICAgICAgICAgIGZvciAoIGxldCBqID0gMDsgaiA8IGFkZGVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKyApIHsKICAgICAgICAgICAgICAgIGlmICggYWRkZWROb2Rlc1tqXS5ub2RlVHlwZSA9PT0gMSApIHsgc2tpcCA9IGZhbHNlOyBicmVhazsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoIGxldCBqID0gMDsgaiA8IHJlbW92ZWROb2Rlcy5sZW5ndGggJiYgc2tpcDsgaisrICkgewogICAgICAgICAgICAgICAgaWYgKCByZW1vdmVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEgKSB7IHNraXAgPSBmYWxzZTsgYnJlYWs7IH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIHNraXAgKSB7IHJldHVybjsgfQogICAgICAgIGFzYXAgPyBybWF0dHIoKSA6IHJtYXR0ckFzeW5jKCk7CiAgICB9OwogICAgY29uc3Qgc3RhcnQgPSAoICkgPT4gewogICAgICAgIHJtYXR0cigpOwogICAgICAgIGlmICggL1xic3RheVxiLy50ZXN0KGJlaGF2aW9yKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25IYW5kbGVyKTsKICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogdG9rZW5zLAogICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsCiAgICAgICAgfSk7CiAgICB9OwogICAgcnVuQXQoKCApID0+IHsgc3RhcnQoKTsgfSwgc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChiZWhhdmlvciwgL1xzKy8pKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-create-html.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHJ1bkF0KGZuLCB3aGVuKSB7CiAgICBjb25zdCBpbnRGcm9tUmVhZHlTdGF0ZSA9IHN0YXRlID0+IHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gewogICAgICAgICAgICAnbG9hZGluZyc6IDEsICdhc2FwJzogMSwKICAgICAgICAgICAgJ2ludGVyYWN0aXZlJzogMiwgJ2VuZCc6IDIsICcyJzogMiwKICAgICAgICAgICAgJ2NvbXBsZXRlJzogMywgJ2lkbGUnOiAzLCAnMyc6IDMsCiAgICAgICAgfTsKICAgICAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5pc0FycmF5KHN0YXRlKSA/IHN0YXRlIDogWyBzdGF0ZSBdOwogICAgICAgIGZvciAoIGNvbnN0IHRva2VuIG9mIHRva2VucyApIHsKICAgICAgICAgICAgY29uc3QgcHJvcCA9IGAke3Rva2VufWA7CiAgICAgICAgICAgIGlmICggT2JqZWN0Lmhhc093bih0YXJnZXRzLCBwcm9wKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIHJldHVybiB0YXJnZXRzW3Byb3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBjb25zdCBydW5BdCA9IGludEZyb21SZWFkeVN0YXRlKHdoZW4pOwogICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSBydW5BdCApIHsKICAgICAgICBmbigpOyByZXR1cm47CiAgICB9CiAgICBjb25zdCBvblN0YXRlQ2hhbmdlID0gKCApID0+IHsKICAgICAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpIDwgcnVuQXQgKSB7IHJldHVybjsgfQogICAgICAgIGZuKCk7CiAgICAgICAgc2FmZS5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKICAgIH07CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGFyZ3MgPSBbICdyZWFkeXN0YXRlY2hhbmdlJywgb25TdGF0ZUNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlIH0gXTsKICAgIHNhZmUuYWRkRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRDcmVhdGVIVE1MKAogICAgcGFyZW50U2VsZWN0b3IsCiAgICBodG1sU3RyID0gJycsCiAgICBkdXJhdGlvblN0ciA9ICcnCikgewogICAgaWYgKCBwYXJlbnRTZWxlY3RvciA9PT0gJycgKSB7IHJldHVybjsgfQogICAgaWYgKCBodG1sU3RyID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgndHJ1c3RlZC1jcmVhdGUtaHRtbCcsIHBhcmVudFNlbGVjdG9yLCBodG1sU3RyLCBkdXJhdGlvblN0cik7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDMpOwogICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gcmVjdXJzaXZlbHkgY3JlYXRlIGVsZW1lbnRzCiAgICBzZWxmLnRydXN0ZWRDcmVhdGVIVE1MID0gdHJ1ZTsKICAgIGxldCBhbmNlc3RvciA9IHNlbGYuZnJhbWVFbGVtZW50OwogICAgd2hpbGUgKCBhbmNlc3RvciAhPT0gbnVsbCApIHsKICAgICAgICBjb25zdCBkb2MgPSBhbmNlc3Rvci5vd25lckRvY3VtZW50OwogICAgICAgIGlmICggZG9jID09PSBudWxsICkgeyBicmVhazsgfQogICAgICAgIGNvbnN0IHdpbiA9IGRvYy5kZWZhdWx0VmlldzsKICAgICAgICBpZiAoIHdpbiA9PT0gbnVsbCApIHsgYnJlYWs7IH0KICAgICAgICBpZiAoIHdpbi50cnVzdGVkQ3JlYXRlSFRNTCApIHsgcmV0dXJuOyB9CiAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5mcmFtZUVsZW1lbnQ7CiAgICB9CiAgICBjb25zdCBkdXJhdGlvbiA9IHBhcnNlSW50KGR1cmF0aW9uU3RyLCAxMCk7CiAgICBjb25zdCBkb21QYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CiAgICBjb25zdCBleHRlcm5hbERvYyA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbFN0ciwgJ3RleHQvaHRtbCcpOwogICAgY29uc3QgZG9jRnJhZ21lbnQgPSBuZXcgRG9jdW1lbnRGcmFnbWVudCgpOwogICAgY29uc3QgdG9SZW1vdmUgPSBbXTsKICAgIHdoaWxlICggZXh0ZXJuYWxEb2MuYm9keS5maXJzdENoaWxkICE9PSBudWxsICkgewogICAgICAgIGNvbnN0IGltcG9ydGVkID0gZG9jdW1lbnQuYWRvcHROb2RlKGV4dGVybmFsRG9jLmJvZHkuZmlyc3RDaGlsZCk7CiAgICAgICAgZG9jRnJhZ21lbnQuYXBwZW5kQ2hpbGQoaW1wb3J0ZWQpOwogICAgICAgIGlmICggaXNOYU4oZHVyYXRpb24pICkgeyBjb250aW51ZTsgfQogICAgICAgIHRvUmVtb3ZlLnB1c2goaW1wb3J0ZWQpOwogICAgfQogICAgaWYgKCBkb2NGcmFnbWVudC5maXJzdENoaWxkID09PSBudWxsICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHJlbW92ZSA9ICggKSA9PiB7CiAgICAgICAgZm9yICggY29uc3Qgbm9kZSBvZiB0b1JlbW92ZSApIHsKICAgICAgICAgICAgaWYgKCBub2RlLnBhcmVudE5vZGUgPT09IG51bGwgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICB9CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnTm9kZShzKSByZW1vdmVkJyk7CiAgICB9OwogICAgY29uc3QgYXBwZW5kID0gKCApID0+IHsKICAgICAgICBjb25zdCBwYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcmVudFNlbGVjdG9yKTsKICAgICAgICBpZiAoIHBhcmVudCA9PT0gbnVsbCApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgcGFyZW50LmFwcGVuZChkb2NGcmFnbWVudCk7CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnTm9kZShzKSBhcHBlbmRlZCcpOwogICAgICAgIGlmICggdG9SZW1vdmUubGVuZ3RoID09PSAwICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgIHNldFRpbWVvdXQocmVtb3ZlLCBkdXJhdGlvbik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgY29uc3Qgc3RhcnQgPSAoICkgPT4gewogICAgICAgIGlmICggYXBwZW5kKCkgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCApID0+IHsKICAgICAgICAgICAgaWYgKCBhcHBlbmQoKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgfSk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0gewogICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsCiAgICAgICAgfTsKICAgICAgICBpZiAoIC9bIy5bXS8udGVzdChwYXJlbnRTZWxlY3RvcikgKSB7CiAgICAgICAgICAgIG9ic2VydmVyT3B0aW9ucy5hdHRyaWJ1dGVzID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCBwYXJlbnRTZWxlY3Rvci5pbmNsdWRlcygnWycpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIG9ic2VydmVyT3B0aW9ucy5hdHRyaWJ1dGVGaWx0ZXIgPSBbXTsKICAgICAgICAgICAgICAgIGlmICggcGFyZW50U2VsZWN0b3IuaW5jbHVkZXMoJyMnKSApIHsKICAgICAgICAgICAgICAgICAgICBvYnNlcnZlck9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLnB1c2goJ2lkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIHBhcmVudFNlbGVjdG9yLmluY2x1ZGVzKCcuJykgKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLmF0dHJpYnV0ZUZpbHRlci5wdXNoKCdjbGFzcycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIG9ic2VydmVyT3B0aW9ucyk7CiAgICB9OwogICAgcnVuQXQoc3RhcnQsIGV4dHJhQXJncy5ydW5BdCB8fCAnbG9hZGluZycpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"href-sanitizer.js","aliases":["urlskip.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gdXJsU2tpcCh1cmwsIGJsb2NrZWQsIHN0ZXBzKSB7CiAgICB0cnkgewogICAgICAgIGxldCByZWRpcmVjdEJsb2NrZWQgPSBmYWxzZTsKICAgICAgICBsZXQgdXJsb3V0ID0gdXJsOwogICAgICAgIGZvciAoIGNvbnN0IHN0ZXAgb2Ygc3RlcHMgKSB7CiAgICAgICAgICAgIGNvbnN0IHVybGluID0gdXJsb3V0OwogICAgICAgICAgICBjb25zdCBjMCA9IHN0ZXAuY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgLy8gRXh0cmFjdCBmcm9tIGhhc2gKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyMyAmJiBzdGVwID09PSAnIycgKSB7IC8vICMKICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9IHVybGluLmluZGV4T2YoJyMnKTsKICAgICAgICAgICAgICAgIHVybG91dCA9IHBvcyAhPT0gLTEgPyB1cmxpbi5zbGljZShwb3MrMSkgOiAnJzsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEV4dHJhY3QgZnJvbSBVUkwgcGFyYW1ldGVyIG5hbWUgYXQgcG9zaXRpb24gaQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI2ICkgeyAvLyAmCiAgICAgICAgICAgICAgICBjb25zdCBpID0gKHBhcnNlSW50KHN0ZXAuc2xpY2UoMSkpIHx8IDApIC0gMTsKICAgICAgICAgICAgICAgIGlmICggaSA8IDAgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxpbik7CiAgICAgICAgICAgICAgICBpZiAoIGkgPj0gdXJsLnNlYXJjaFBhcmFtcy5zaXplICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IEFycmF5LmZyb20odXJsLnNlYXJjaFBhcmFtcy5rZXlzKCkpOwogICAgICAgICAgICAgICAgdXJsb3V0ID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtc1tpXSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbmZvcmNlIGh0dHBzCiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkIgJiYgc3RlcCA9PT0gJytodHRwcycgKSB7IC8vICsKICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB1cmxpbi5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCAnJyk7CiAgICAgICAgICAgICAgICBpZiAoIC9eW1x3LV06XC9cLy8udGVzdChzKSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICB1cmxvdXQgPSBgaHR0cHM6Ly8ke3N9YDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERlY29kZQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJEICkgeyAvLyAtCiAgICAgICAgICAgICAgICAvLyBCYXNlNjQKICAgICAgICAgICAgICAgIGlmICggc3RlcCA9PT0gJy1iYXNlNjQnICkgewogICAgICAgICAgICAgICAgICAgIHVybG91dCA9IHNlbGYuYXRvYih1cmxpbik7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBTYWZlIEJhc2U2NAogICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSAnLXNhZmViYXNlNjQnICkgewogICAgICAgICAgICAgICAgICAgIGlmICggdXJsU2tpcC5zYWZlQmFzZTY0UmVwbGFjZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsU2tpcC5zYWZlQmFzZTY0TWFwID0geyAnLSc6ICcrJywgJ18nOiAnLycgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsU2tpcC5zYWZlQmFzZTY0UmVwbGFjZXIgPSBzID0+IHVybFNraXAuc2FmZUJhc2U2NE1hcFtzXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXJsb3V0ID0gdXJsaW4ucmVwbGFjZSgvWy1fXS9nLCB1cmxTa2lwLnNhZmVCYXNlNjRSZXBsYWNlcik7CiAgICAgICAgICAgICAgICAgICAgdXJsb3V0ID0gc2VsZi5hdG9iKHVybG91dCk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBVUkkgY29tcG9uZW50CiAgICAgICAgICAgICAgICBpZiAoIHN0ZXAgPT09ICctdXJpY29tcG9uZW50JyApIHsKICAgICAgICAgICAgICAgICAgICB1cmxvdXQgPSBkZWNvZGVVUklDb21wb25lbnQodXJsaW4pOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gRW5hYmxlIHNraXAgb2YgYmxvY2tlZCByZXF1ZXN0cwogICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSAnLWJsb2NrZWQnICkgewogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0QmxvY2tlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVnZXggZXh0cmFjdGlvbiBmcm9tIGZpcnN0IGNhcHR1cmUgZ3JvdXAKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyRiApIHsgLy8gLwogICAgICAgICAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKHN0ZXAuc2xpY2UoMSwgLTEpKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmUuZXhlYyh1cmxpbik7CiAgICAgICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGlmICggbWF0Y2gubGVuZ3RoIDw9IDEgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgdXJsb3V0ID0gbWF0Y2hbMV07CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFeHRyYWN0IGZyb20gVVJMIHBhcmFtZXRlcgogICAgICAgICAgICBpZiAoIGMwID09PSAweDNGICkgeyAvLyA/CiAgICAgICAgICAgICAgICB1cmxvdXQgPSAobmV3IFVSTCh1cmxpbikpLnNlYXJjaFBhcmFtcy5nZXQoc3RlcC5zbGljZSgxKSk7CiAgICAgICAgICAgICAgICBpZiAoIHVybG91dCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHVybG91dC5pbmNsdWRlcygnICcpICkgewogICAgICAgICAgICAgICAgICAgIHVybG91dCA9IHVybG91dC5yZXBsYWNlKC8gL2csICclMjAnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFVua25vd24gZGlyZWN0aXZlCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXJsZmluYWwgPSBuZXcgVVJMKHVybG91dCk7CiAgICAgICAgaWYgKCB1cmxmaW5hbC5wcm90b2NvbCAhPT0gJ2h0dHBzOicgKSB7CiAgICAgICAgICAgIGlmICggdXJsZmluYWwucHJvdG9jb2wgIT09ICdodHRwOicgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBpZiAoIGJsb2NrZWQgJiYgcmVkaXJlY3RCbG9ja2VkICE9PSB0cnVlICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gdXJsb3V0OwogICAgfSBjYXRjaCB7CiAgICB9Cn0KZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHJ1bkF0KGZuLCB3aGVuKSB7CiAgICBjb25zdCBpbnRGcm9tUmVhZHlTdGF0ZSA9IHN0YXRlID0+IHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gewogICAgICAgICAgICAnbG9hZGluZyc6IDEsICdhc2FwJzogMSwKICAgICAgICAgICAgJ2ludGVyYWN0aXZlJzogMiwgJ2VuZCc6IDIsICcyJzogMiwKICAgICAgICAgICAgJ2NvbXBsZXRlJzogMywgJ2lkbGUnOiAzLCAnMyc6IDMsCiAgICAgICAgfTsKICAgICAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5pc0FycmF5KHN0YXRlKSA/IHN0YXRlIDogWyBzdGF0ZSBdOwogICAgICAgIGZvciAoIGNvbnN0IHRva2VuIG9mIHRva2VucyApIHsKICAgICAgICAgICAgY29uc3QgcHJvcCA9IGAke3Rva2VufWA7CiAgICAgICAgICAgIGlmICggT2JqZWN0Lmhhc093bih0YXJnZXRzLCBwcm9wKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIHJldHVybiB0YXJnZXRzW3Byb3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBjb25zdCBydW5BdCA9IGludEZyb21SZWFkeVN0YXRlKHdoZW4pOwogICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSBydW5BdCApIHsKICAgICAgICBmbigpOyByZXR1cm47CiAgICB9CiAgICBjb25zdCBvblN0YXRlQ2hhbmdlID0gKCApID0+IHsKICAgICAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpIDwgcnVuQXQgKSB7IHJldHVybjsgfQogICAgICAgIGZuKCk7CiAgICAgICAgc2FmZS5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKICAgIH07CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGFyZ3MgPSBbICdyZWFkeXN0YXRlY2hhbmdlJywgb25TdGF0ZUNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlIH0gXTsKICAgIHNhZmUuYWRkRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7Cn0KCiAgKGZ1bmN0aW9uIGhyZWZTYW5pdGl6ZXIoCiAgICBzZWxlY3RvciA9ICcnLAogICAgc291cmNlID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgaWYgKCBzZWxlY3RvciA9PT0gJycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ2hyZWYtc2FuaXRpemVyJywgc2VsZWN0b3IsIHNvdXJjZSk7CiAgICBpZiAoIHNvdXJjZSA9PT0gJycgKSB7IHNvdXJjZSA9ICd0ZXh0JzsgfQogICAgY29uc3Qgc2FuaXRpemVDb3B5Y2F0cyA9IChocmVmLCB0ZXh0KSA9PiB7CiAgICAgICAgbGV0IGVsZW1zID0gW107CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBhW2hyZWY9IiR7aHJlZn0iYCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgZm9yICggY29uc3QgZWxlbSBvZiBlbGVtcyApIHsKICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB0ZXh0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVsZW1zLmxlbmd0aDsKICAgIH07CiAgICBjb25zdCB2YWxpZGF0ZVVSTCA9IHRleHQgPT4gewogICAgICAgIGlmICggdHlwZW9mIHRleHQgIT09ICdzdHJpbmcnICkgeyByZXR1cm4gJyc7IH0KICAgICAgICBpZiAoIHRleHQgPT09ICcnICkgeyByZXR1cm4gJyc7IH0KICAgICAgICBpZiAoIC9bXHgwMC1ceDIwXHg3Zl0vLnRlc3QodGV4dCkgKSB7IHJldHVybiAnJzsgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGV4dCwgZG9jdW1lbnQubG9jYXRpb24pOwogICAgICAgICAgICByZXR1cm4gdXJsLmhyZWY7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH07CiAgICBjb25zdCBleHRyYWN0VVJMID0gKGVsZW0sIHNvdXJjZSkgPT4gewogICAgICAgIGlmICggL15cWy4qXF0kLy50ZXN0KHNvdXJjZSkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShzb3VyY2Uuc2xpY2UoMSwtMSkudHJpbSgpKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKCBzb3VyY2UgPT09ICd0ZXh0JyApIHsKICAgICAgICAgICAgcmV0dXJuIGVsZW0udGV4dENvbnRlbnQKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eW15ceDIxLVx4N2VdKy8sICcnKSAgLy8gcmVtb3ZlIGxlYWRpbmcgaW52YWxpZCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW15ceDIxLVx4N2VdKyQvLCAnJyk7IC8vIHJlbW92ZSB0cmFpbGluZyBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RlcHMgPSBzb3VyY2UucmVwbGFjZSgvKFxTKVw/L2csICdcXDEgPycpLnNwbGl0KC9ccysvKTsKICAgICAgICBjb25zdCB1cmwgPSB1cmxTa2lwKGVsZW0uaHJlZiwgZmFsc2UsIHN0ZXBzKTsKICAgICAgICBpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gdXJsLnJlcGxhY2UoLyAvZywgJyUyMCcpOwogICAgfTsKICAgIGNvbnN0IHNhbml0aXplID0gKCApID0+IHsKICAgICAgICBsZXQgZWxlbXMgPSBbXTsKICAgICAgICB0cnkgewogICAgICAgICAgICBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZm9yICggY29uc3QgZWxlbSBvZiBlbGVtcyApIHsKICAgICAgICAgICAgaWYgKCBlbGVtLmxvY2FsTmFtZSAhPT0gJ2EnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIGVsZW0uaGFzQXR0cmlidXRlKCdocmVmJykgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBjb25zdCBocmVmID0gZWxlbS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IGV4dHJhY3RVUkwoZWxlbSwgc291cmNlKTsKICAgICAgICAgICAgY29uc3QgaHJlZkFmdGVyID0gdmFsaWRhdGVVUkwodGV4dCk7CiAgICAgICAgICAgIGlmICggaHJlZkFmdGVyID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgaWYgKCBocmVmQWZ0ZXIgPT09IGhyZWYgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZkFmdGVyKTsKICAgICAgICAgICAgY29uc3QgY291bnQgPSBzYW5pdGl6ZUNvcHljYXRzKGhyZWYsIGhyZWZBZnRlcik7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYFNhbml0aXplZCAke2NvdW50KzF9IGxpbmtzIHRvXG4ke2hyZWZBZnRlcn1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgbGV0IG9ic2VydmVyLCB0aW1lcjsKICAgIGNvbnN0IG9uRG9tQ2hhbmdlZCA9IG11dGF0aW9ucyA9PiB7CiAgICAgICAgaWYgKCB0aW1lciAhPT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBsZXQgc2hvdWxkU2FuaXRpemUgPSBmYWxzZTsKICAgICAgICBmb3IgKCBjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMgKSB7CiAgICAgICAgICAgIGlmICggbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGZvciAoIGNvbnN0IG5vZGUgb2YgbXV0YXRpb24uYWRkZWROb2RlcyApIHsKICAgICAgICAgICAgICAgIGlmICggbm9kZS5ub2RlVHlwZSAhPT0gMSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIHNob3VsZFNhbml0aXplID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2hvdWxkU2FuaXRpemUgKSB7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICAgIGlmICggc2hvdWxkU2FuaXRpemUgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICB0aW1lciA9IHNhZmUub25JZGxlKCggKSA9PiB7CiAgICAgICAgICAgIHRpbWVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICBzYW5pdGl6ZSgpOwogICAgICAgIH0pOwogICAgfTsKICAgIGNvbnN0IHN0YXJ0ID0gKCApID0+IHsKICAgICAgICBpZiAoIHNhbml0aXplKCkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG9uRG9tQ2hhbmdlZCk7CiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7CiAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsCiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICB9KTsKICAgIH07CiAgICBydW5BdCgoICkgPT4geyBzdGFydCgpOyB9LCAnaW50ZXJhY3RpdmUnKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"edit-outbound-object.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGVkaXRPdXRib3VuZE9iamVjdEZuKAogICAgdHJ1c3RlZCA9IGZhbHNlLAogICAgcHJvcENoYWluID0gJycsCiAgICBqc29ucSA9ICcnLAopIHsKICAgIGlmICggcHJvcENoYWluID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgKICAgICAgICBgJHt0cnVzdGVkID8gJ3RydXN0ZWQtJyA6ICcnfWVkaXQtb3V0Ym91bmQtb2JqZWN0YCwKICAgICAgICBwcm9wQ2hhaW4sCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCBqc29ucCA9IEpTT05QYXRoLmNyZWF0ZShqc29ucSk7CiAgICBpZiAoIGpzb25wLnZhbGlkID09PSBmYWxzZSB8fCBqc29ucC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRydXN0ZWQgIT09IHRydWUgKSB7CiAgICAgICAgcmV0dXJuIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0JhZCBKU09OUGF0aCBxdWVyeScpOwogICAgfQogICAgcHJveHlBcHBseUZuKHByb3BDaGFpbiwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IG9iaiA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIGNvbnN0IG9iakFmdGVyID0ganNvbnAuYXBwbHkob2JqKTsKICAgICAgICBpZiAoIG9iakFmdGVyID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBvYmo7IH0KICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdFZGl0ZWQnKTsKICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBBZnRlciBlZGl0OlxuJHtzYWZlLkpTT05fc3RyaW5naWZ5KG9iakFmdGVyLCBudWxsLCAyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iakFmdGVyOwogICAgfSk7Cn0KCiAgKGZ1bmN0aW9uIGVkaXRPdXRib3VuZE9iamVjdChwcm9wQ2hhaW4gPSAnJywganNvbnEgPSAnJykgewogICAgZWRpdE91dGJvdW5kT2JqZWN0Rm4oZmFsc2UsIHByb3BDaGFpbiwganNvbnEpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-edit-outbound-object.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGVkaXRPdXRib3VuZE9iamVjdEZuKAogICAgdHJ1c3RlZCA9IGZhbHNlLAogICAgcHJvcENoYWluID0gJycsCiAgICBqc29ucSA9ICcnLAopIHsKICAgIGlmICggcHJvcENoYWluID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgKICAgICAgICBgJHt0cnVzdGVkID8gJ3RydXN0ZWQtJyA6ICcnfWVkaXQtb3V0Ym91bmQtb2JqZWN0YCwKICAgICAgICBwcm9wQ2hhaW4sCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCBqc29ucCA9IEpTT05QYXRoLmNyZWF0ZShqc29ucSk7CiAgICBpZiAoIGpzb25wLnZhbGlkID09PSBmYWxzZSB8fCBqc29ucC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRydXN0ZWQgIT09IHRydWUgKSB7CiAgICAgICAgcmV0dXJuIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0JhZCBKU09OUGF0aCBxdWVyeScpOwogICAgfQogICAgcHJveHlBcHBseUZuKHByb3BDaGFpbiwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IG9iaiA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIGNvbnN0IG9iakFmdGVyID0ganNvbnAuYXBwbHkob2JqKTsKICAgICAgICBpZiAoIG9iakFmdGVyID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBvYmo7IH0KICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdFZGl0ZWQnKTsKICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBBZnRlciBlZGl0OlxuJHtzYWZlLkpTT05fc3RyaW5naWZ5KG9iakFmdGVyLCBudWxsLCAyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iakFmdGVyOwogICAgfSk7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRFZGl0T3V0Ym91bmRPYmplY3QocHJvcENoYWluID0gJycsIGpzb25xID0gJycpIHsKICAgIGVkaXRPdXRib3VuZE9iamVjdEZuKHRydWUsIHByb3BDaGFpbiwganNvbnEpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"json-edit.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGVkaXRPdXRib3VuZE9iamVjdEZuKAogICAgdHJ1c3RlZCA9IGZhbHNlLAogICAgcHJvcENoYWluID0gJycsCiAgICBqc29ucSA9ICcnLAopIHsKICAgIGlmICggcHJvcENoYWluID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgKICAgICAgICBgJHt0cnVzdGVkID8gJ3RydXN0ZWQtJyA6ICcnfWVkaXQtb3V0Ym91bmQtb2JqZWN0YCwKICAgICAgICBwcm9wQ2hhaW4sCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCBqc29ucCA9IEpTT05QYXRoLmNyZWF0ZShqc29ucSk7CiAgICBpZiAoIGpzb25wLnZhbGlkID09PSBmYWxzZSB8fCBqc29ucC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRydXN0ZWQgIT09IHRydWUgKSB7CiAgICAgICAgcmV0dXJuIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0JhZCBKU09OUGF0aCBxdWVyeScpOwogICAgfQogICAgcHJveHlBcHBseUZuKHByb3BDaGFpbiwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IG9iaiA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIGNvbnN0IG9iakFmdGVyID0ganNvbnAuYXBwbHkob2JqKTsKICAgICAgICBpZiAoIG9iakFmdGVyID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBvYmo7IH0KICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdFZGl0ZWQnKTsKICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBBZnRlciBlZGl0OlxuJHtzYWZlLkpTT05fc3RyaW5naWZ5KG9iakFmdGVyLCBudWxsLCAyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iakFmdGVyOwogICAgfSk7Cn0KCiAgKGZ1bmN0aW9uIGpzb25FZGl0KGpzb25xID0gJycpIHsKICAgIGVkaXRPdXRib3VuZE9iamVjdEZuKGZhbHNlLCAnSlNPTi5wYXJzZScsIGpzb25xKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-json-edit.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGVkaXRPdXRib3VuZE9iamVjdEZuKAogICAgdHJ1c3RlZCA9IGZhbHNlLAogICAgcHJvcENoYWluID0gJycsCiAgICBqc29ucSA9ICcnLAopIHsKICAgIGlmICggcHJvcENoYWluID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgKICAgICAgICBgJHt0cnVzdGVkID8gJ3RydXN0ZWQtJyA6ICcnfWVkaXQtb3V0Ym91bmQtb2JqZWN0YCwKICAgICAgICBwcm9wQ2hhaW4sCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCBqc29ucCA9IEpTT05QYXRoLmNyZWF0ZShqc29ucSk7CiAgICBpZiAoIGpzb25wLnZhbGlkID09PSBmYWxzZSB8fCBqc29ucC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRydXN0ZWQgIT09IHRydWUgKSB7CiAgICAgICAgcmV0dXJuIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0JhZCBKU09OUGF0aCBxdWVyeScpOwogICAgfQogICAgcHJveHlBcHBseUZuKHByb3BDaGFpbiwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IG9iaiA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIGNvbnN0IG9iakFmdGVyID0ganNvbnAuYXBwbHkob2JqKTsKICAgICAgICBpZiAoIG9iakFmdGVyID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBvYmo7IH0KICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdFZGl0ZWQnKTsKICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBBZnRlciBlZGl0OlxuJHtzYWZlLkpTT05fc3RyaW5naWZ5KG9iakFmdGVyLCBudWxsLCAyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iakFmdGVyOwogICAgfSk7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRKc29uRWRpdChqc29ucSA9ICcnKSB7CiAgICBlZGl0T3V0Ym91bmRPYmplY3RGbih0cnVlLCAnSlNPTi5wYXJzZScsIGpzb25xKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"edit-inbound-object.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGVkaXRJbmJvdW5kT2JqZWN0Rm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBwcm9wQ2hhaW4gPSAnJywKICAgIGFyZ1Bvc1JhdyA9ICcnLAogICAganNvbnEgPSAnJywKKSB7CiAgICBpZiAoIHByb3BDaGFpbiA9PT0gJycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoCiAgICAgICAgYCR7dHJ1c3RlZCA/ICd0cnVzdGVkLScgOiAnJ31lZGl0LWluYm91bmQtb2JqZWN0YCwKICAgICAgICBwcm9wQ2hhaW4sCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCBqc29ucCA9IEpTT05QYXRoLmNyZWF0ZShqc29ucSk7CiAgICBpZiAoIGpzb25wLnZhbGlkID09PSBmYWxzZSB8fCBqc29ucC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRydXN0ZWQgIT09IHRydWUgKSB7CiAgICAgICAgcmV0dXJuIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0JhZCBKU09OUGF0aCBxdWVyeScpOwogICAgfQogICAgY29uc3QgYXJnUG9zID0gcGFyc2VJbnQoYXJnUG9zUmF3LCAxMCk7CiAgICBpZiAoIGlzTmFOKGFyZ1BvcykgKSB7IHJldHVybjsgfQogICAgY29uc3QgZ2V0QXJnUG9zID0gYXJncyA9PiB7CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KGFyZ3MpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBhcmdQb3MgPj0gMCApIHsKICAgICAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA8PSBhcmdQb3MgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gYXJnUG9zOwogICAgICAgIH0KICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoIDwgLWFyZ1BvcyApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoICsgYXJnUG9zOwogICAgfTsKICAgIGNvbnN0IGVkaXRPYmogPSBvYmogPT4gewogICAgICAgIGxldCBjbG9uZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjbG9uZSA9IHNhZmUuSlNPTl9wYXJzZShzYWZlLkpTT05fc3RyaW5naWZ5KG9iaikpOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICBpZiAoIHR5cGVvZiBjbG9uZSAhPT0gJ29iamVjdCcgfHwgY2xvbmUgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IG9iakFmdGVyID0ganNvbnAuYXBwbHkoY2xvbmUpOwogICAgICAgIGlmICggb2JqQWZ0ZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnRWRpdGVkJyk7CiAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSApIHsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgQWZ0ZXIgZWRpdDpcbiR7c2FmZS5KU09OX3N0cmluZ2lmeShvYmpBZnRlciwgbnVsbCwgMil9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmpBZnRlcjsKICAgIH07CiAgICBwcm94eUFwcGx5Rm4ocHJvcENoYWluLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgY29uc3QgaSA9IGdldEFyZ1Bvcyhjb250ZXh0LmNhbGxBcmdzKTsKICAgICAgICBpZiAoIGkgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgY29uc3Qgb2JqID0gZWRpdE9iaihjb250ZXh0LmNhbGxBcmdzW2ldKTsKICAgICAgICAgICAgaWYgKCBvYmogKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmNhbGxBcmdzW2ldID0gb2JqOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgIH0pOwp9CgogIChmdW5jdGlvbiBlZGl0SW5ib3VuZE9iamVjdChwcm9wQ2hhaW4gPSAnJywgYXJnUG9zID0gJycsIGpzb25xID0gJycpIHsKICAgIGVkaXRJbmJvdW5kT2JqZWN0Rm4oZmFsc2UsIHByb3BDaGFpbiwgYXJnUG9zLCBqc29ucSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"trusted-edit-inbound-object.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGVkaXRJbmJvdW5kT2JqZWN0Rm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBwcm9wQ2hhaW4gPSAnJywKICAgIGFyZ1Bvc1JhdyA9ICcnLAogICAganNvbnEgPSAnJywKKSB7CiAgICBpZiAoIHByb3BDaGFpbiA9PT0gJycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoCiAgICAgICAgYCR7dHJ1c3RlZCA/ICd0cnVzdGVkLScgOiAnJ31lZGl0LWluYm91bmQtb2JqZWN0YCwKICAgICAgICBwcm9wQ2hhaW4sCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCBqc29ucCA9IEpTT05QYXRoLmNyZWF0ZShqc29ucSk7CiAgICBpZiAoIGpzb25wLnZhbGlkID09PSBmYWxzZSB8fCBqc29ucC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRydXN0ZWQgIT09IHRydWUgKSB7CiAgICAgICAgcmV0dXJuIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0JhZCBKU09OUGF0aCBxdWVyeScpOwogICAgfQogICAgY29uc3QgYXJnUG9zID0gcGFyc2VJbnQoYXJnUG9zUmF3LCAxMCk7CiAgICBpZiAoIGlzTmFOKGFyZ1BvcykgKSB7IHJldHVybjsgfQogICAgY29uc3QgZ2V0QXJnUG9zID0gYXJncyA9PiB7CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KGFyZ3MpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBhcmdQb3MgPj0gMCApIHsKICAgICAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA8PSBhcmdQb3MgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gYXJnUG9zOwogICAgICAgIH0KICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoIDwgLWFyZ1BvcyApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoICsgYXJnUG9zOwogICAgfTsKICAgIGNvbnN0IGVkaXRPYmogPSBvYmogPT4gewogICAgICAgIGxldCBjbG9uZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjbG9uZSA9IHNhZmUuSlNPTl9wYXJzZShzYWZlLkpTT05fc3RyaW5naWZ5KG9iaikpOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICBpZiAoIHR5cGVvZiBjbG9uZSAhPT0gJ29iamVjdCcgfHwgY2xvbmUgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IG9iakFmdGVyID0ganNvbnAuYXBwbHkoY2xvbmUpOwogICAgICAgIGlmICggb2JqQWZ0ZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnRWRpdGVkJyk7CiAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSApIHsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgQWZ0ZXIgZWRpdDpcbiR7c2FmZS5KU09OX3N0cmluZ2lmeShvYmpBZnRlciwgbnVsbCwgMil9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmpBZnRlcjsKICAgIH07CiAgICBwcm94eUFwcGx5Rm4ocHJvcENoYWluLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgY29uc3QgaSA9IGdldEFyZ1Bvcyhjb250ZXh0LmNhbGxBcmdzKTsKICAgICAgICBpZiAoIGkgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgY29uc3Qgb2JqID0gZWRpdE9iaihjb250ZXh0LmNhbGxBcmdzW2ldKTsKICAgICAgICAgICAgaWYgKCBvYmogKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmNhbGxBcmdzW2ldID0gb2JqOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgIH0pOwp9CgogIChmdW5jdGlvbiB0cnVzdGVkRWRpdEluYm91bmRPYmplY3QocHJvcENoYWluID0gJycsIGFyZ1BvcyA9ICcnLCBqc29ucSA9ICcnKSB7CiAgICBlZGl0SW5ib3VuZE9iamVjdEZuKHRydWUsIHByb3BDaGFpbiwgYXJnUG9zLCBqc29ucSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"json-edit-xhr-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmNsYXNzIEpTT05QYXRoIHsKICAgIHN0YXRpYyBjcmVhdGUocXVlcnkpIHsKICAgICAgICBjb25zdCBqc29ucCA9IG5ldyBKU09OUGF0aCgpOwogICAgICAgIGpzb25wLmNvbXBpbGUocXVlcnkpOwogICAgICAgIHJldHVybiBqc29ucDsKICAgIH0KICAgIHN0YXRpYyB0b0pTT04ob2JqLCBzdHJpbmdpZmllciwgLi4uYXJncykgewogICAgICAgIHJldHVybiAoc3RyaW5naWZpZXIgfHwgSlNPTi5zdHJpbmdpZnkpKG9iaiwgLi4uYXJncykKICAgICAgICAgICAgLnJlcGxhY2UoL1wvL2csICdcXC8nKTsKICAgIH0KICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgJiYgdGhpcy4jY29tcGlsZWQucnZhbDsKICAgIH0KICAgIHNldCB2YWx1ZSh2KSB7CiAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICB0aGlzLiNjb21waWxlZC5ydmFsID0gdjsKICAgIH0KICAgIGdldCB2YWxpZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbXBpbGUocXVlcnkpIHsKICAgICAgICB0aGlzLiNjb21waWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgMCk7CiAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggci5pICE9PSBxdWVyeS5sZW5ndGggKSB7CiAgICAgICAgICAgIGxldCB2YWw7CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPScsIHIuaSkgKSB7CiAgICAgICAgICAgICAgICBpZiAoIC9ePXJlcGxcKC4rXCkkLy50ZXN0KHF1ZXJ5LnNsaWNlKHIuaSkpICkgewogICAgICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJ3JlcGwnOwogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSs2LCAtMSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSsxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnKz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgci5tb2RpZnkgPSAnKyc7CiAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsgci5ydmFsID0gSlNPTi5wYXJzZSh2YWwpOyB9CiAgICAgICAgICAgIGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIHRoaXMuI2NvbXBpbGVkID0gcjsKICAgIH0KICAgIGV2YWx1YXRlKHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm4gW107IH0KICAgICAgICB0aGlzLiNyb290ID0gcm9vdDsKICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuI2V2YWx1YXRlKHRoaXMuI2NvbXBpbGVkLnN0ZXBzLCBbXSk7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgfQogICAgYXBwbHkocm9vdCkgewogICAgICAgIGlmICggdGhpcy52YWxpZCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHsgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgdGhpcy4jcm9vdCA9IHsgJyQnOiByb290IH07CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIGxldCBpID0gcGF0aHMubGVuZ3RoCiAgICAgICAgaWYgKCBpID09PSAwICkgeyB0aGlzLiNyb290ID0gbnVsbDsgcmV0dXJuOyB9CiAgICAgICAgd2hpbGUgKCBpLS0gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgb2JqLCBrZXkgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhzW2ldKTsKICAgICAgICAgICAgaWYgKCBydmFsICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNtb2RpZnlWYWwob2JqLCBrZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KG9iaikgJiYgdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgICAgICBvYmouc3BsaWNlKGtleSwgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb2JqW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jcm9vdFsnJCddID8/IG51bGw7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGR1bXAoKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuI2NvbXBpbGVkKTsKICAgIH0KICAgIHRvSlNPTihvYmosIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gSlNPTlBhdGgudG9KU09OKG9iaiwgbnVsbCwgLi4uYXJncykKICAgIH0KICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHsKICAgICAgICByZXR1cm4gJ0pTT05QYXRoJzsKICAgIH0KICAgICNVTkRFRklORUQgPSAwOwogICAgI1JPT1QgPSAxOwogICAgI0NVUlJFTlQgPSAyOwogICAgI0NISUxEUkVOID0gMzsKICAgICNERVNDRU5EQU5UUyA9IDQ7CiAgICAjcmVVbnF1b3RlZElkZW50aWZpZXIgPSAvXltBLVphLXpfXVtcd10qfF5cKi87CiAgICAjcmVFeHByID0gL14oWyE9XiQqXT18Wzw+XT0/KSguKz8pXF0vOwogICAgI3JlSW5kaWNlID0gL14tP1xkKy87CiAgICAjcm9vdDsKICAgICNjb21waWxlZDsKICAgICNjb21waWxlKHF1ZXJ5LCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHN0ZXBzID0gW107CiAgICAgICAgbGV0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmICggYyA9PT0gMHgyNCAvKiAkICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI1JPT1QgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgaWYgKCBjID09PSAweDQwIC8qIEAgKi8gKSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogaSA9PT0gMCA/IHRoaXMuI1JPT1QgOiB0aGlzLiNDVVJSRU5UIH0pOwogICAgICAgIH0KICAgICAgICBsZXQgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGkgPT09IHF1ZXJ5Lmxlbmd0aCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIGlmICggYyA9PT0gMHgyMCAvKiB3aGl0ZXNwYWNlICovICkgewogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRG90IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIGMgPT09IDB4MkUgLyogLiAqLyApIHsKICAgICAgICAgICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJy4uJywgaSkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjICE9PSAweDVCIC8qIFsgKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ID09PSB0aGlzLiNVTkRFRklORUQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHN0ZXBzLmF0KC0xKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZXAgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgICAgIGlmICAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHMgfSk7CiAgICAgICAgICAgICAgICBpICs9IHMubGVuZ3RoOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCcmFja2V0IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ1s/JywgaSkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3QgPSBxdWVyeS5jaGFyQ29kZUF0KGkrMikgPT09IDB4MjEgLyogISAqLzsKICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpICsgMiArIChub3QgPyAxIDogMCk7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgaik7CiAgICAgICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ10nLCByLmkpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIG5vdCApIHsgci5zdGVwcy5hdCgtMSkubm90ID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiBtdiB8fCB0aGlzLiNDSElMRFJFTiwgc3RlcHM6IHIuc3RlcHMgfSk7CiAgICAgICAgICAgICAgICBpID0gci5pICsgMTsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbKl0nLCBpKSApIHsKICAgICAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogJyonIH0pOwogICAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29uc3VtZUlkZW50aWZpZXIocXVlcnksIGkrMSk7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbXYgfHw9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHIucyB9KTsKICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXBzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBtdiAhPT0gdGhpcy4jVU5ERUZJTkVEICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4geyBzdGVwcywgaSB9OwogICAgfQogICAgI2V2YWx1YXRlKHN0ZXBzLCBwYXRoaW4pIHsKICAgICAgICBsZXQgcmVzdWx0c2V0ID0gW107CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHN0ZXBzKSA9PT0gZmFsc2UgKSB7IHJldHVybiByZXN1bHRzZXQ7IH0KICAgICAgICBmb3IgKCBjb25zdCBzdGVwIG9mIHN0ZXBzICkgewogICAgICAgICAgICBzd2l0Y2ggKCBzdGVwLm12ICkgewogICAgICAgICAgICBjYXNlIHRoaXMuI1JPT1Q6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIFsgJyQnIF0gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NVUlJFTlQ6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIHBhdGhpbiBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jQ0hJTERSRU46CiAgICAgICAgICAgIGNhc2UgdGhpcy4jREVTQ0VOREFOVFM6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSB0aGlzLiNnZXRNYXRjaGVzKHJlc3VsdHNldCwgc3RlcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzZXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlcyhsaXN0aW4sIHN0ZXApIHsKICAgICAgICBjb25zdCBsaXN0b3V0ID0gW107CiAgICAgICAgZm9yICggY29uc3QgcGF0aGluIG9mIGxpc3RpbiApIHsKICAgICAgICAgICAgY29uc3QgeyB2YWx1ZTogb3duZXIgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhpbik7CiAgICAgICAgICAgIGlmICggc3RlcC5rID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUFsbChwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggc3RlcC5rICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuc3RlcHMgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUV4cHIocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpc3RvdXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3QgcmVjdXJzaXZlID0gc3RlcC5tdiA9PT0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgZm9yICggY29uc3QgeyBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoIF0pOwogICAgICAgIH0KICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3Qga2sgPSBBcnJheS5pc0FycmF5KHN0ZXAuaykgPyBzdGVwLmsgOiBbIHN0ZXAuayBdOwogICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLiNldmFsdWF0ZUV4cHIoc3RlcCwgb3duZXIsIGspOwogICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgfQogICAgICAgIGlmICggc3RlcC5tdiAhPT0gdGhpcy4jREVTQ0VOREFOVFMgKSB7IHJldHVybjsgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgdHJ1ZSkgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG9ialtrZXldLCBrKTsKICAgICAgICAgICAgICAgIGlmICggbm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIC4uLnBhdGgsIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcGF0aGluKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCAhPT0gMCApIHsgb3V0LnB1c2gocGF0aGluKTsgfQogICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSAhPT0gdHJ1ZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgcmVjdXJzaXZlKSApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG9ialtrZXldKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgY29uc3QgcSA9IFsgLi4ucGF0aGluLCAuLi5wYXRoIF07CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNldmFsdWF0ZShzdGVwLnN0ZXBzLCBxKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCA9PT0gMCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2gocSk7CiAgICAgICAgfQogICAgfQogICAgI25vcm1hbGl6ZUtleShvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPj0gMCA/IGtleSA6IG93bmVyLmxlbmd0aCArIGtleTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAgI2dldERlc2NlbmRhbnRzKHYsIHJlY3Vyc2l2ZSkgewogICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuc3RhY2subGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKCBuID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLnN0YWNrW24tMV07CiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGRldGFpbHMua2V5cy5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoIGVudHJ5LmRvbmUgKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGgucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wYXRoW24tMV0gPSBlbnRyeS52YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgb2JqOiBkZXRhaWxzLm9iaiwKICAgICAgICAgICAgICAgICAgICBrZXk6IGVudHJ5LnZhbHVlLAogICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aC5zbGljZSgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlLm9ialt0aGlzLnZhbHVlLmtleV07CiAgICAgICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogdi5rZXlzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhdGg6IFtdLAogICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgICAgICBkb25lOiBmYWxzZSwKICAgICAgICAgICAgc3RhY2s6IFtdLAogICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH0sCiAgICAgICAgfTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiBPYmplY3Qua2V5cyh2KS52YWx1ZXMoKSB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgfQogICAgI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3Qga2V5cyA9IFtdOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgY29uc3QgYzAgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMwID09PSAweDVEIC8qIF0gKi8gKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkMgLyogLCAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MjcgLyogJyAqLyApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiN1bnRpbENoYXIocXVlcnksIDB4MjcgLyogJyAqLywgaSsxKQogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAga2V5cy5wdXNoKHIucyk7CiAgICAgICAgICAgICAgICBpID0gci5pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyRCAvKiAtICovIHx8IGMwID49IDB4MzAgJiYgYzAgPD0gMHgzOSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVJbmRpY2UuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGNvbnN0IGluZGljZSA9IHBhcnNlSW50KHF1ZXJ5LnNsaWNlKGkpLCAxMCk7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2goaW5kaWNlKTsKICAgICAgICAgICAgICAgIGkgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpOwogICAgICAgICAgICBpZiAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGtleXMucHVzaChzKTsKICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczoga2V5cy5sZW5ndGggPT09IDEgPyBrZXlzWzBdIDoga2V5cywgaSB9OwogICAgfQogICAgI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpIHsKICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlVW5xdW90ZWRJZGVudGlmaWVyLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIHJldHVybiBtYXRjaFswXTsKICAgIH0KICAgICN1bnRpbENoYXIocXVlcnksIHRhcmdldENoYXJDb2RlLCBpKSB7CiAgICAgICAgY29uc3QgbGVuID0gcXVlcnkubGVuZ3RoOwogICAgICAgIGNvbnN0IHBhcnRzID0gW107CiAgICAgICAgbGV0IGJlZyA9IGksIGVuZCA9IGk7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGVuZCA9PT0gbGVuICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3QgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoZW5kKTsKICAgICAgICAgICAgaWYgKCBjID09PSB0YXJnZXRDaGFyQ29kZSApIHsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjID09PSAweDVDIC8qIFwgKi8gJiYgKGVuZCsxKSA8IGxlbiApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCsxKTsKICAgICAgICAgICAgICAgIGlmICggZCA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChxdWVyeS5zbGljZShiZWcsIGVuZCkpOwogICAgICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgICAgIGJlZyA9IGVuZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczogcGFydHMuam9pbignJyksIGk6IGVuZCB9OwogICAgfQogICAgI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCc9LycsIGkpICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDJGIC8qIC8gKi8sIGkrMik7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gaTsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eW2ldLy5leGVjKHF1ZXJ5LnNsaWNlKHIuaSkpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3RlcC5ydmFsID0gbmV3IFJlZ0V4cChyLnMsIG1hdGNoICYmIG1hdGNoWzBdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RlcC5vcCA9ICdyZSc7CiAgICAgICAgICAgIGlmICggbWF0Y2ggKSB7IHIuaSArPSBtYXRjaFswXS5sZW5ndGg7IH0KICAgICAgICAgICAgcmV0dXJuIHIuaTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZUV4cHIuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuIGk7IH0KICAgICAgICB0cnkgewogICAgICAgICAgICBzdGVwLnJ2YWwgPSBKU09OLnBhcnNlKG1hdGNoWzJdKTsKICAgICAgICAgICAgc3RlcC5vcCA9IG1hdGNoWzFdOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICByZXR1cm4gaSArIG1hdGNoWzFdLmxlbmd0aCArIG1hdGNoWzJdLmxlbmd0aDsKICAgIH0KICAgICNyZXNvbHZlUGF0aChwYXRoKSB7CiAgICAgICAgaWYgKCBwYXRoLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuIHsgdmFsdWU6IHRoaXMuI3Jvb3QgfTsgfQogICAgICAgIGNvbnN0IGtleSA9IHBhdGguYXQoLTEpOwogICAgICAgIGxldCBvYmogPSB0aGlzLiNyb290CiAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gcGF0aC5sZW5ndGgtMTsgaSA8IG47IGkrKyApIHsKICAgICAgICAgICAgb2JqID0gb2JqW3BhdGhbaV1dOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBvYmosIGtleSwgdmFsdWU6IG9ialtrZXldIH07CiAgICB9CiAgICAjZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrZXkpIHsKICAgICAgICBpZiAoIG93bmVyID09PSB1bmRlZmluZWQgfHwgb3duZXIgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IHRoaXMuI25vcm1hbGl6ZUtleShvd25lciwga2V5KTsKICAgICAgICBjb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duKG93bmVyLCBrKTsKICAgICAgICBpZiAoIHN0ZXAub3AgIT09IHVuZGVmaW5lZCAmJiBoYXNPd24gPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0YXJnZXQgPSBzdGVwLm5vdCAhPT0gdHJ1ZTsKICAgICAgICBjb25zdCB2ID0gb3duZXJba107CiAgICAgICAgbGV0IG91dGNvbWUgPSBmYWxzZTsKICAgICAgICBzd2l0Y2ggKCBzdGVwLm9wICkgewogICAgICAgIGNhc2UgJz09Jzogb3V0Y29tZSA9ICh2ID09PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyE9Jzogb3V0Y29tZSA9ICh2ICE9PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc8Jzogb3V0Y29tZSA9ICh2IDwgc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc8PSc6IG91dGNvbWUgPSAodiA8PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc+Jzogb3V0Y29tZSA9ICh2ID4gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc+PSc6IG91dGNvbWUgPSAodiA+PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ149Jzogb3V0Y29tZSA9IGAke3Z9YC5zdGFydHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnJD0nOiBvdXRjb21lID0gYCR7dn1gLmVuZHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnKj0nOiBvdXRjb21lID0gYCR7dn1gLmluY2x1ZGVzKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAncmUnOiBvdXRjb21lID0gc3RlcC5ydmFsLnRlc3QoYCR7dn1gKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogb3V0Y29tZSA9IGhhc093biA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCBvdXRjb21lICkgeyByZXR1cm4gazsgfQogICAgfQogICAgI21vZGlmeVZhbChvYmosIGtleSkgewogICAgICAgIGNvbnN0IHsgbW9kaWZ5LCBydmFsIH0gPSB0aGlzLiNjb21waWxlZDsKICAgICAgICBzd2l0Y2ggKCBtb2RpZnkgKSB7CiAgICAgICAgY2FzZSB1bmRlZmluZWQ6CiAgICAgICAgICAgIG9ialtrZXldID0gcnZhbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnKyc6IHsKICAgICAgICAgICAgaWYgKCBydmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCBsdmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShsdmFsKSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGZvciAoIGNvbnN0IFsgaywgdiBdIG9mIE9iamVjdC5lbnRyaWVzKHJ2YWwpICkgewogICAgICAgICAgICAgICAgbHZhbFtrXSA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgJ3JlcGwnOiB7CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgbHZhbCAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuI2NvbXBpbGVkLnJlID0gcnZhbC5yZWdleCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFJlZ0V4cChydmFsLnJlZ2V4LCBydmFsLmZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAocnZhbC5wYXR0ZXJuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQucmUgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICBvYmpba2V5XSA9IGx2YWwucmVwbGFjZSh0aGlzLiNjb21waWxlZC5yZSwgcnZhbC5yZXBsYWNlbWVudCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24ganNvbkVkaXRYaHJSZXNwb25zZUZuKHRydXN0ZWQsIGpzb25xID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KAogICAgICAgIGAke3RydXN0ZWQgPyAndHJ1c3RlZC0nIDogJyd9anNvbi1lZGl0LXhoci1yZXNwb25zZWAsCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCB4aHJJbnN0YW5jZXMgPSBuZXcgV2Vha01hcCgpOwogICAgY29uc3QganNvbnAgPSBKU09OUGF0aC5jcmVhdGUoanNvbnEpOwogICAgaWYgKCBqc29ucC52YWxpZCA9PT0gZmFsc2UgfHwganNvbnAudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0cnVzdGVkICE9PSB0cnVlICkgewogICAgICAgIHJldHVybiBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdCYWQgSlNPTlBhdGggcXVlcnknKTsKICAgIH0KICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMik7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihleHRyYUFyZ3MucHJvcHNUb01hdGNoLCAndXJsJyk7CiAgICBzZWxmLlhNTEh0dHBSZXF1ZXN0ID0gY2xhc3MgZXh0ZW5kcyBzZWxmLlhNTEh0dHBSZXF1ZXN0IHsKICAgICAgICBvcGVuKG1ldGhvZCwgdXJsLCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGNvbnN0IHhockRldGFpbHMgPSB7IG1ldGhvZCwgdXJsIH07CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBwcm9wTmVlZGxlcy5zaXplID09PSAwIHx8CiAgICAgICAgICAgICAgICBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgeGhyRGV0YWlscyk7CiAgICAgICAgICAgIGlmICggbWF0Y2hlZCApIHsKICAgICAgICAgICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgJiYgQXJyYXkuaXNBcnJheShtYXRjaGVkKSApIHsKICAgICAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBNYXRjaGVkICJwcm9wc1RvTWF0Y2giOlxuXHQke21hdGNoZWQuam9pbignXG5cdCcpfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgeGhySW5zdGFuY2VzLnNldCh0aGlzLCB4aHJEZXRhaWxzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3VwZXIub3BlbihtZXRob2QsIHVybCwgLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIGdldCByZXNwb25zZSgpIHsKICAgICAgICAgICAgY29uc3QgaW5uZXJSZXNwb25zZSA9IHN1cGVyLnJlc3BvbnNlOwogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geGhySW5zdGFuY2VzLmdldCh0aGlzKTsKICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBpbm5lclJlc3BvbnNlOyB9CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlTGVuZ3RoID0gdHlwZW9mIGlubmVyUmVzcG9uc2UgPT09ICdzdHJpbmcnCiAgICAgICAgICAgICAgICA/IGlubmVyUmVzcG9uc2UubGVuZ3RoCiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzLmxhc3RSZXNwb25zZUxlbmd0aCAhPT0gcmVzcG9uc2VMZW5ndGggKSB7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLnJlc3BvbnNlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5sYXN0UmVzcG9uc2VMZW5ndGggPSByZXNwb25zZUxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHhockRldGFpbHMucmVzcG9uc2UgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB4aHJEZXRhaWxzLnJlc3BvbnNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBvYmo7CiAgICAgICAgICAgIGlmICggdHlwZW9mIGlubmVyUmVzcG9uc2UgPT09ICdvYmplY3QnICkgewogICAgICAgICAgICAgICAgb2JqID0gaW5uZXJSZXNwb25zZTsKICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIGlubmVyUmVzcG9uc2UgPT09ICdzdHJpbmcnICkgewogICAgICAgICAgICAgICAgdHJ5IHsgb2JqID0gc2FmZS5KU09OX3BhcnNlKGlubmVyUmVzcG9uc2UpOyB9IGNhdGNoIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsICkgewogICAgICAgICAgICAgICAgcmV0dXJuICh4aHJEZXRhaWxzLnJlc3BvbnNlID0gaW5uZXJSZXNwb25zZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBqc29ucC5hcHBseShvYmopOwogICAgICAgICAgICBpZiAoIG9iakFmdGVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBpbm5lclJlc3BvbnNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdFZGl0ZWQnKTsKICAgICAgICAgICAgY29uc3Qgb3V0ZXJSZXNwb25zZSA9IHR5cGVvZiBpbm5lclJlc3BvbnNlID09PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgPyBKU09OUGF0aC50b0pTT04ob2JqQWZ0ZXIsIHNhZmUuSlNPTl9zdHJpbmdpZnkpCiAgICAgICAgICAgICAgICA6IG9iakFmdGVyOwogICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBvdXRlclJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlOwogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3BvbnNlICE9PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgPyBzdXBlci5yZXNwb25zZVRleHQKICAgICAgICAgICAgICAgIDogcmVzcG9uc2U7CiAgICAgICAgfQogICAgfTsKfQoKICAoZnVuY3Rpb24ganNvbkVkaXRYaHJSZXNwb25zZShqc29ucSA9ICcnLCAuLi5hcmdzKSB7CiAgICBqc29uRWRpdFhoclJlc3BvbnNlRm4oZmFsc2UsIGpzb25xLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-json-edit-xhr-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmNsYXNzIEpTT05QYXRoIHsKICAgIHN0YXRpYyBjcmVhdGUocXVlcnkpIHsKICAgICAgICBjb25zdCBqc29ucCA9IG5ldyBKU09OUGF0aCgpOwogICAgICAgIGpzb25wLmNvbXBpbGUocXVlcnkpOwogICAgICAgIHJldHVybiBqc29ucDsKICAgIH0KICAgIHN0YXRpYyB0b0pTT04ob2JqLCBzdHJpbmdpZmllciwgLi4uYXJncykgewogICAgICAgIHJldHVybiAoc3RyaW5naWZpZXIgfHwgSlNPTi5zdHJpbmdpZnkpKG9iaiwgLi4uYXJncykKICAgICAgICAgICAgLnJlcGxhY2UoL1wvL2csICdcXC8nKTsKICAgIH0KICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgJiYgdGhpcy4jY29tcGlsZWQucnZhbDsKICAgIH0KICAgIHNldCB2YWx1ZSh2KSB7CiAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICB0aGlzLiNjb21waWxlZC5ydmFsID0gdjsKICAgIH0KICAgIGdldCB2YWxpZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbXBpbGUocXVlcnkpIHsKICAgICAgICB0aGlzLiNjb21waWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgMCk7CiAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggci5pICE9PSBxdWVyeS5sZW5ndGggKSB7CiAgICAgICAgICAgIGxldCB2YWw7CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPScsIHIuaSkgKSB7CiAgICAgICAgICAgICAgICBpZiAoIC9ePXJlcGxcKC4rXCkkLy50ZXN0KHF1ZXJ5LnNsaWNlKHIuaSkpICkgewogICAgICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJ3JlcGwnOwogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSs2LCAtMSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSsxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnKz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgci5tb2RpZnkgPSAnKyc7CiAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsgci5ydmFsID0gSlNPTi5wYXJzZSh2YWwpOyB9CiAgICAgICAgICAgIGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIHRoaXMuI2NvbXBpbGVkID0gcjsKICAgIH0KICAgIGV2YWx1YXRlKHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm4gW107IH0KICAgICAgICB0aGlzLiNyb290ID0gcm9vdDsKICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuI2V2YWx1YXRlKHRoaXMuI2NvbXBpbGVkLnN0ZXBzLCBbXSk7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgfQogICAgYXBwbHkocm9vdCkgewogICAgICAgIGlmICggdGhpcy52YWxpZCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHsgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgdGhpcy4jcm9vdCA9IHsgJyQnOiByb290IH07CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIGxldCBpID0gcGF0aHMubGVuZ3RoCiAgICAgICAgaWYgKCBpID09PSAwICkgeyB0aGlzLiNyb290ID0gbnVsbDsgcmV0dXJuOyB9CiAgICAgICAgd2hpbGUgKCBpLS0gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgb2JqLCBrZXkgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhzW2ldKTsKICAgICAgICAgICAgaWYgKCBydmFsICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNtb2RpZnlWYWwob2JqLCBrZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KG9iaikgJiYgdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgICAgICBvYmouc3BsaWNlKGtleSwgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb2JqW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jcm9vdFsnJCddID8/IG51bGw7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGR1bXAoKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuI2NvbXBpbGVkKTsKICAgIH0KICAgIHRvSlNPTihvYmosIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gSlNPTlBhdGgudG9KU09OKG9iaiwgbnVsbCwgLi4uYXJncykKICAgIH0KICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHsKICAgICAgICByZXR1cm4gJ0pTT05QYXRoJzsKICAgIH0KICAgICNVTkRFRklORUQgPSAwOwogICAgI1JPT1QgPSAxOwogICAgI0NVUlJFTlQgPSAyOwogICAgI0NISUxEUkVOID0gMzsKICAgICNERVNDRU5EQU5UUyA9IDQ7CiAgICAjcmVVbnF1b3RlZElkZW50aWZpZXIgPSAvXltBLVphLXpfXVtcd10qfF5cKi87CiAgICAjcmVFeHByID0gL14oWyE9XiQqXT18Wzw+XT0/KSguKz8pXF0vOwogICAgI3JlSW5kaWNlID0gL14tP1xkKy87CiAgICAjcm9vdDsKICAgICNjb21waWxlZDsKICAgICNjb21waWxlKHF1ZXJ5LCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHN0ZXBzID0gW107CiAgICAgICAgbGV0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmICggYyA9PT0gMHgyNCAvKiAkICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI1JPT1QgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgaWYgKCBjID09PSAweDQwIC8qIEAgKi8gKSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogaSA9PT0gMCA/IHRoaXMuI1JPT1QgOiB0aGlzLiNDVVJSRU5UIH0pOwogICAgICAgIH0KICAgICAgICBsZXQgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGkgPT09IHF1ZXJ5Lmxlbmd0aCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIGlmICggYyA9PT0gMHgyMCAvKiB3aGl0ZXNwYWNlICovICkgewogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRG90IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIGMgPT09IDB4MkUgLyogLiAqLyApIHsKICAgICAgICAgICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJy4uJywgaSkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjICE9PSAweDVCIC8qIFsgKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ID09PSB0aGlzLiNVTkRFRklORUQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHN0ZXBzLmF0KC0xKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZXAgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgICAgIGlmICAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHMgfSk7CiAgICAgICAgICAgICAgICBpICs9IHMubGVuZ3RoOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCcmFja2V0IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ1s/JywgaSkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3QgPSBxdWVyeS5jaGFyQ29kZUF0KGkrMikgPT09IDB4MjEgLyogISAqLzsKICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpICsgMiArIChub3QgPyAxIDogMCk7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgaik7CiAgICAgICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ10nLCByLmkpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIG5vdCApIHsgci5zdGVwcy5hdCgtMSkubm90ID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiBtdiB8fCB0aGlzLiNDSElMRFJFTiwgc3RlcHM6IHIuc3RlcHMgfSk7CiAgICAgICAgICAgICAgICBpID0gci5pICsgMTsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbKl0nLCBpKSApIHsKICAgICAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogJyonIH0pOwogICAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29uc3VtZUlkZW50aWZpZXIocXVlcnksIGkrMSk7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbXYgfHw9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHIucyB9KTsKICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXBzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBtdiAhPT0gdGhpcy4jVU5ERUZJTkVEICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4geyBzdGVwcywgaSB9OwogICAgfQogICAgI2V2YWx1YXRlKHN0ZXBzLCBwYXRoaW4pIHsKICAgICAgICBsZXQgcmVzdWx0c2V0ID0gW107CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHN0ZXBzKSA9PT0gZmFsc2UgKSB7IHJldHVybiByZXN1bHRzZXQ7IH0KICAgICAgICBmb3IgKCBjb25zdCBzdGVwIG9mIHN0ZXBzICkgewogICAgICAgICAgICBzd2l0Y2ggKCBzdGVwLm12ICkgewogICAgICAgICAgICBjYXNlIHRoaXMuI1JPT1Q6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIFsgJyQnIF0gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NVUlJFTlQ6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIHBhdGhpbiBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jQ0hJTERSRU46CiAgICAgICAgICAgIGNhc2UgdGhpcy4jREVTQ0VOREFOVFM6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSB0aGlzLiNnZXRNYXRjaGVzKHJlc3VsdHNldCwgc3RlcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzZXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlcyhsaXN0aW4sIHN0ZXApIHsKICAgICAgICBjb25zdCBsaXN0b3V0ID0gW107CiAgICAgICAgZm9yICggY29uc3QgcGF0aGluIG9mIGxpc3RpbiApIHsKICAgICAgICAgICAgY29uc3QgeyB2YWx1ZTogb3duZXIgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhpbik7CiAgICAgICAgICAgIGlmICggc3RlcC5rID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUFsbChwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggc3RlcC5rICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuc3RlcHMgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUV4cHIocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpc3RvdXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3QgcmVjdXJzaXZlID0gc3RlcC5tdiA9PT0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgZm9yICggY29uc3QgeyBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoIF0pOwogICAgICAgIH0KICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3Qga2sgPSBBcnJheS5pc0FycmF5KHN0ZXAuaykgPyBzdGVwLmsgOiBbIHN0ZXAuayBdOwogICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLiNldmFsdWF0ZUV4cHIoc3RlcCwgb3duZXIsIGspOwogICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgfQogICAgICAgIGlmICggc3RlcC5tdiAhPT0gdGhpcy4jREVTQ0VOREFOVFMgKSB7IHJldHVybjsgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgdHJ1ZSkgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG9ialtrZXldLCBrKTsKICAgICAgICAgICAgICAgIGlmICggbm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIC4uLnBhdGgsIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcGF0aGluKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCAhPT0gMCApIHsgb3V0LnB1c2gocGF0aGluKTsgfQogICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSAhPT0gdHJ1ZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgcmVjdXJzaXZlKSApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG9ialtrZXldKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgY29uc3QgcSA9IFsgLi4ucGF0aGluLCAuLi5wYXRoIF07CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNldmFsdWF0ZShzdGVwLnN0ZXBzLCBxKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCA9PT0gMCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2gocSk7CiAgICAgICAgfQogICAgfQogICAgI25vcm1hbGl6ZUtleShvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPj0gMCA/IGtleSA6IG93bmVyLmxlbmd0aCArIGtleTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAgI2dldERlc2NlbmRhbnRzKHYsIHJlY3Vyc2l2ZSkgewogICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuc3RhY2subGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKCBuID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLnN0YWNrW24tMV07CiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGRldGFpbHMua2V5cy5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoIGVudHJ5LmRvbmUgKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGgucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wYXRoW24tMV0gPSBlbnRyeS52YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgb2JqOiBkZXRhaWxzLm9iaiwKICAgICAgICAgICAgICAgICAgICBrZXk6IGVudHJ5LnZhbHVlLAogICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aC5zbGljZSgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlLm9ialt0aGlzLnZhbHVlLmtleV07CiAgICAgICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogdi5rZXlzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhdGg6IFtdLAogICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgICAgICBkb25lOiBmYWxzZSwKICAgICAgICAgICAgc3RhY2s6IFtdLAogICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH0sCiAgICAgICAgfTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiBPYmplY3Qua2V5cyh2KS52YWx1ZXMoKSB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgfQogICAgI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3Qga2V5cyA9IFtdOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgY29uc3QgYzAgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMwID09PSAweDVEIC8qIF0gKi8gKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkMgLyogLCAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MjcgLyogJyAqLyApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiN1bnRpbENoYXIocXVlcnksIDB4MjcgLyogJyAqLywgaSsxKQogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAga2V5cy5wdXNoKHIucyk7CiAgICAgICAgICAgICAgICBpID0gci5pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyRCAvKiAtICovIHx8IGMwID49IDB4MzAgJiYgYzAgPD0gMHgzOSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVJbmRpY2UuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGNvbnN0IGluZGljZSA9IHBhcnNlSW50KHF1ZXJ5LnNsaWNlKGkpLCAxMCk7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2goaW5kaWNlKTsKICAgICAgICAgICAgICAgIGkgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpOwogICAgICAgICAgICBpZiAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGtleXMucHVzaChzKTsKICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczoga2V5cy5sZW5ndGggPT09IDEgPyBrZXlzWzBdIDoga2V5cywgaSB9OwogICAgfQogICAgI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpIHsKICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlVW5xdW90ZWRJZGVudGlmaWVyLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIHJldHVybiBtYXRjaFswXTsKICAgIH0KICAgICN1bnRpbENoYXIocXVlcnksIHRhcmdldENoYXJDb2RlLCBpKSB7CiAgICAgICAgY29uc3QgbGVuID0gcXVlcnkubGVuZ3RoOwogICAgICAgIGNvbnN0IHBhcnRzID0gW107CiAgICAgICAgbGV0IGJlZyA9IGksIGVuZCA9IGk7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGVuZCA9PT0gbGVuICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3QgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoZW5kKTsKICAgICAgICAgICAgaWYgKCBjID09PSB0YXJnZXRDaGFyQ29kZSApIHsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjID09PSAweDVDIC8qIFwgKi8gJiYgKGVuZCsxKSA8IGxlbiApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCsxKTsKICAgICAgICAgICAgICAgIGlmICggZCA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChxdWVyeS5zbGljZShiZWcsIGVuZCkpOwogICAgICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgICAgIGJlZyA9IGVuZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczogcGFydHMuam9pbignJyksIGk6IGVuZCB9OwogICAgfQogICAgI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCc9LycsIGkpICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDJGIC8qIC8gKi8sIGkrMik7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gaTsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eW2ldLy5leGVjKHF1ZXJ5LnNsaWNlKHIuaSkpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3RlcC5ydmFsID0gbmV3IFJlZ0V4cChyLnMsIG1hdGNoICYmIG1hdGNoWzBdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RlcC5vcCA9ICdyZSc7CiAgICAgICAgICAgIGlmICggbWF0Y2ggKSB7IHIuaSArPSBtYXRjaFswXS5sZW5ndGg7IH0KICAgICAgICAgICAgcmV0dXJuIHIuaTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZUV4cHIuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuIGk7IH0KICAgICAgICB0cnkgewogICAgICAgICAgICBzdGVwLnJ2YWwgPSBKU09OLnBhcnNlKG1hdGNoWzJdKTsKICAgICAgICAgICAgc3RlcC5vcCA9IG1hdGNoWzFdOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICByZXR1cm4gaSArIG1hdGNoWzFdLmxlbmd0aCArIG1hdGNoWzJdLmxlbmd0aDsKICAgIH0KICAgICNyZXNvbHZlUGF0aChwYXRoKSB7CiAgICAgICAgaWYgKCBwYXRoLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuIHsgdmFsdWU6IHRoaXMuI3Jvb3QgfTsgfQogICAgICAgIGNvbnN0IGtleSA9IHBhdGguYXQoLTEpOwogICAgICAgIGxldCBvYmogPSB0aGlzLiNyb290CiAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gcGF0aC5sZW5ndGgtMTsgaSA8IG47IGkrKyApIHsKICAgICAgICAgICAgb2JqID0gb2JqW3BhdGhbaV1dOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBvYmosIGtleSwgdmFsdWU6IG9ialtrZXldIH07CiAgICB9CiAgICAjZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrZXkpIHsKICAgICAgICBpZiAoIG93bmVyID09PSB1bmRlZmluZWQgfHwgb3duZXIgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IHRoaXMuI25vcm1hbGl6ZUtleShvd25lciwga2V5KTsKICAgICAgICBjb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duKG93bmVyLCBrKTsKICAgICAgICBpZiAoIHN0ZXAub3AgIT09IHVuZGVmaW5lZCAmJiBoYXNPd24gPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0YXJnZXQgPSBzdGVwLm5vdCAhPT0gdHJ1ZTsKICAgICAgICBjb25zdCB2ID0gb3duZXJba107CiAgICAgICAgbGV0IG91dGNvbWUgPSBmYWxzZTsKICAgICAgICBzd2l0Y2ggKCBzdGVwLm9wICkgewogICAgICAgIGNhc2UgJz09Jzogb3V0Y29tZSA9ICh2ID09PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyE9Jzogb3V0Y29tZSA9ICh2ICE9PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc8Jzogb3V0Y29tZSA9ICh2IDwgc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc8PSc6IG91dGNvbWUgPSAodiA8PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc+Jzogb3V0Y29tZSA9ICh2ID4gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc+PSc6IG91dGNvbWUgPSAodiA+PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ149Jzogb3V0Y29tZSA9IGAke3Z9YC5zdGFydHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnJD0nOiBvdXRjb21lID0gYCR7dn1gLmVuZHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnKj0nOiBvdXRjb21lID0gYCR7dn1gLmluY2x1ZGVzKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAncmUnOiBvdXRjb21lID0gc3RlcC5ydmFsLnRlc3QoYCR7dn1gKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogb3V0Y29tZSA9IGhhc093biA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCBvdXRjb21lICkgeyByZXR1cm4gazsgfQogICAgfQogICAgI21vZGlmeVZhbChvYmosIGtleSkgewogICAgICAgIGNvbnN0IHsgbW9kaWZ5LCBydmFsIH0gPSB0aGlzLiNjb21waWxlZDsKICAgICAgICBzd2l0Y2ggKCBtb2RpZnkgKSB7CiAgICAgICAgY2FzZSB1bmRlZmluZWQ6CiAgICAgICAgICAgIG9ialtrZXldID0gcnZhbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnKyc6IHsKICAgICAgICAgICAgaWYgKCBydmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCBsdmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShsdmFsKSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGZvciAoIGNvbnN0IFsgaywgdiBdIG9mIE9iamVjdC5lbnRyaWVzKHJ2YWwpICkgewogICAgICAgICAgICAgICAgbHZhbFtrXSA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgJ3JlcGwnOiB7CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgbHZhbCAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuI2NvbXBpbGVkLnJlID0gcnZhbC5yZWdleCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFJlZ0V4cChydmFsLnJlZ2V4LCBydmFsLmZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAocnZhbC5wYXR0ZXJuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQucmUgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICBvYmpba2V5XSA9IGx2YWwucmVwbGFjZSh0aGlzLiNjb21waWxlZC5yZSwgcnZhbC5yZXBsYWNlbWVudCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24ganNvbkVkaXRYaHJSZXNwb25zZUZuKHRydXN0ZWQsIGpzb25xID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KAogICAgICAgIGAke3RydXN0ZWQgPyAndHJ1c3RlZC0nIDogJyd9anNvbi1lZGl0LXhoci1yZXNwb25zZWAsCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCB4aHJJbnN0YW5jZXMgPSBuZXcgV2Vha01hcCgpOwogICAgY29uc3QganNvbnAgPSBKU09OUGF0aC5jcmVhdGUoanNvbnEpOwogICAgaWYgKCBqc29ucC52YWxpZCA9PT0gZmFsc2UgfHwganNvbnAudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0cnVzdGVkICE9PSB0cnVlICkgewogICAgICAgIHJldHVybiBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdCYWQgSlNPTlBhdGggcXVlcnknKTsKICAgIH0KICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMik7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihleHRyYUFyZ3MucHJvcHNUb01hdGNoLCAndXJsJyk7CiAgICBzZWxmLlhNTEh0dHBSZXF1ZXN0ID0gY2xhc3MgZXh0ZW5kcyBzZWxmLlhNTEh0dHBSZXF1ZXN0IHsKICAgICAgICBvcGVuKG1ldGhvZCwgdXJsLCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGNvbnN0IHhockRldGFpbHMgPSB7IG1ldGhvZCwgdXJsIH07CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBwcm9wTmVlZGxlcy5zaXplID09PSAwIHx8CiAgICAgICAgICAgICAgICBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgeGhyRGV0YWlscyk7CiAgICAgICAgICAgIGlmICggbWF0Y2hlZCApIHsKICAgICAgICAgICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgJiYgQXJyYXkuaXNBcnJheShtYXRjaGVkKSApIHsKICAgICAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBNYXRjaGVkICJwcm9wc1RvTWF0Y2giOlxuXHQke21hdGNoZWQuam9pbignXG5cdCcpfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgeGhySW5zdGFuY2VzLnNldCh0aGlzLCB4aHJEZXRhaWxzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3VwZXIub3BlbihtZXRob2QsIHVybCwgLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIGdldCByZXNwb25zZSgpIHsKICAgICAgICAgICAgY29uc3QgaW5uZXJSZXNwb25zZSA9IHN1cGVyLnJlc3BvbnNlOwogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geGhySW5zdGFuY2VzLmdldCh0aGlzKTsKICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBpbm5lclJlc3BvbnNlOyB9CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlTGVuZ3RoID0gdHlwZW9mIGlubmVyUmVzcG9uc2UgPT09ICdzdHJpbmcnCiAgICAgICAgICAgICAgICA/IGlubmVyUmVzcG9uc2UubGVuZ3RoCiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzLmxhc3RSZXNwb25zZUxlbmd0aCAhPT0gcmVzcG9uc2VMZW5ndGggKSB7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLnJlc3BvbnNlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5sYXN0UmVzcG9uc2VMZW5ndGggPSByZXNwb25zZUxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHhockRldGFpbHMucmVzcG9uc2UgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB4aHJEZXRhaWxzLnJlc3BvbnNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBvYmo7CiAgICAgICAgICAgIGlmICggdHlwZW9mIGlubmVyUmVzcG9uc2UgPT09ICdvYmplY3QnICkgewogICAgICAgICAgICAgICAgb2JqID0gaW5uZXJSZXNwb25zZTsKICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIGlubmVyUmVzcG9uc2UgPT09ICdzdHJpbmcnICkgewogICAgICAgICAgICAgICAgdHJ5IHsgb2JqID0gc2FmZS5KU09OX3BhcnNlKGlubmVyUmVzcG9uc2UpOyB9IGNhdGNoIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsICkgewogICAgICAgICAgICAgICAgcmV0dXJuICh4aHJEZXRhaWxzLnJlc3BvbnNlID0gaW5uZXJSZXNwb25zZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBqc29ucC5hcHBseShvYmopOwogICAgICAgICAgICBpZiAoIG9iakFmdGVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBpbm5lclJlc3BvbnNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdFZGl0ZWQnKTsKICAgICAgICAgICAgY29uc3Qgb3V0ZXJSZXNwb25zZSA9IHR5cGVvZiBpbm5lclJlc3BvbnNlID09PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgPyBKU09OUGF0aC50b0pTT04ob2JqQWZ0ZXIsIHNhZmUuSlNPTl9zdHJpbmdpZnkpCiAgICAgICAgICAgICAgICA6IG9iakFmdGVyOwogICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBvdXRlclJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlOwogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3BvbnNlICE9PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgPyBzdXBlci5yZXNwb25zZVRleHQKICAgICAgICAgICAgICAgIDogcmVzcG9uc2U7CiAgICAgICAgfQogICAgfTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZEpzb25FZGl0WGhyUmVzcG9uc2UoanNvbnEgPSAnJywgLi4uYXJncykgewogICAganNvbkVkaXRYaHJSZXNwb25zZUZuKHRydWUsIGpzb25xLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"json-edit-xhr-request.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmNsYXNzIEpTT05QYXRoIHsKICAgIHN0YXRpYyBjcmVhdGUocXVlcnkpIHsKICAgICAgICBjb25zdCBqc29ucCA9IG5ldyBKU09OUGF0aCgpOwogICAgICAgIGpzb25wLmNvbXBpbGUocXVlcnkpOwogICAgICAgIHJldHVybiBqc29ucDsKICAgIH0KICAgIHN0YXRpYyB0b0pTT04ob2JqLCBzdHJpbmdpZmllciwgLi4uYXJncykgewogICAgICAgIHJldHVybiAoc3RyaW5naWZpZXIgfHwgSlNPTi5zdHJpbmdpZnkpKG9iaiwgLi4uYXJncykKICAgICAgICAgICAgLnJlcGxhY2UoL1wvL2csICdcXC8nKTsKICAgIH0KICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgJiYgdGhpcy4jY29tcGlsZWQucnZhbDsKICAgIH0KICAgIHNldCB2YWx1ZSh2KSB7CiAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICB0aGlzLiNjb21waWxlZC5ydmFsID0gdjsKICAgIH0KICAgIGdldCB2YWxpZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbXBpbGUocXVlcnkpIHsKICAgICAgICB0aGlzLiNjb21waWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgMCk7CiAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggci5pICE9PSBxdWVyeS5sZW5ndGggKSB7CiAgICAgICAgICAgIGxldCB2YWw7CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPScsIHIuaSkgKSB7CiAgICAgICAgICAgICAgICBpZiAoIC9ePXJlcGxcKC4rXCkkLy50ZXN0KHF1ZXJ5LnNsaWNlKHIuaSkpICkgewogICAgICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJ3JlcGwnOwogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSs2LCAtMSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSsxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnKz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgci5tb2RpZnkgPSAnKyc7CiAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsgci5ydmFsID0gSlNPTi5wYXJzZSh2YWwpOyB9CiAgICAgICAgICAgIGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIHRoaXMuI2NvbXBpbGVkID0gcjsKICAgIH0KICAgIGV2YWx1YXRlKHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm4gW107IH0KICAgICAgICB0aGlzLiNyb290ID0gcm9vdDsKICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuI2V2YWx1YXRlKHRoaXMuI2NvbXBpbGVkLnN0ZXBzLCBbXSk7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgfQogICAgYXBwbHkocm9vdCkgewogICAgICAgIGlmICggdGhpcy52YWxpZCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHsgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgdGhpcy4jcm9vdCA9IHsgJyQnOiByb290IH07CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIGxldCBpID0gcGF0aHMubGVuZ3RoCiAgICAgICAgaWYgKCBpID09PSAwICkgeyB0aGlzLiNyb290ID0gbnVsbDsgcmV0dXJuOyB9CiAgICAgICAgd2hpbGUgKCBpLS0gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgb2JqLCBrZXkgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhzW2ldKTsKICAgICAgICAgICAgaWYgKCBydmFsICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNtb2RpZnlWYWwob2JqLCBrZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KG9iaikgJiYgdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgICAgICBvYmouc3BsaWNlKGtleSwgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb2JqW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jcm9vdFsnJCddID8/IG51bGw7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGR1bXAoKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuI2NvbXBpbGVkKTsKICAgIH0KICAgIHRvSlNPTihvYmosIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gSlNPTlBhdGgudG9KU09OKG9iaiwgbnVsbCwgLi4uYXJncykKICAgIH0KICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHsKICAgICAgICByZXR1cm4gJ0pTT05QYXRoJzsKICAgIH0KICAgICNVTkRFRklORUQgPSAwOwogICAgI1JPT1QgPSAxOwogICAgI0NVUlJFTlQgPSAyOwogICAgI0NISUxEUkVOID0gMzsKICAgICNERVNDRU5EQU5UUyA9IDQ7CiAgICAjcmVVbnF1b3RlZElkZW50aWZpZXIgPSAvXltBLVphLXpfXVtcd10qfF5cKi87CiAgICAjcmVFeHByID0gL14oWyE9XiQqXT18Wzw+XT0/KSguKz8pXF0vOwogICAgI3JlSW5kaWNlID0gL14tP1xkKy87CiAgICAjcm9vdDsKICAgICNjb21waWxlZDsKICAgICNjb21waWxlKHF1ZXJ5LCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHN0ZXBzID0gW107CiAgICAgICAgbGV0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmICggYyA9PT0gMHgyNCAvKiAkICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI1JPT1QgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgaWYgKCBjID09PSAweDQwIC8qIEAgKi8gKSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogaSA9PT0gMCA/IHRoaXMuI1JPT1QgOiB0aGlzLiNDVVJSRU5UIH0pOwogICAgICAgIH0KICAgICAgICBsZXQgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGkgPT09IHF1ZXJ5Lmxlbmd0aCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIGlmICggYyA9PT0gMHgyMCAvKiB3aGl0ZXNwYWNlICovICkgewogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRG90IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIGMgPT09IDB4MkUgLyogLiAqLyApIHsKICAgICAgICAgICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJy4uJywgaSkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjICE9PSAweDVCIC8qIFsgKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ID09PSB0aGlzLiNVTkRFRklORUQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHN0ZXBzLmF0KC0xKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZXAgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgICAgIGlmICAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHMgfSk7CiAgICAgICAgICAgICAgICBpICs9IHMubGVuZ3RoOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCcmFja2V0IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ1s/JywgaSkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3QgPSBxdWVyeS5jaGFyQ29kZUF0KGkrMikgPT09IDB4MjEgLyogISAqLzsKICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpICsgMiArIChub3QgPyAxIDogMCk7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgaik7CiAgICAgICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ10nLCByLmkpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIG5vdCApIHsgci5zdGVwcy5hdCgtMSkubm90ID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiBtdiB8fCB0aGlzLiNDSElMRFJFTiwgc3RlcHM6IHIuc3RlcHMgfSk7CiAgICAgICAgICAgICAgICBpID0gci5pICsgMTsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbKl0nLCBpKSApIHsKICAgICAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogJyonIH0pOwogICAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29uc3VtZUlkZW50aWZpZXIocXVlcnksIGkrMSk7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbXYgfHw9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHIucyB9KTsKICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXBzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBtdiAhPT0gdGhpcy4jVU5ERUZJTkVEICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4geyBzdGVwcywgaSB9OwogICAgfQogICAgI2V2YWx1YXRlKHN0ZXBzLCBwYXRoaW4pIHsKICAgICAgICBsZXQgcmVzdWx0c2V0ID0gW107CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHN0ZXBzKSA9PT0gZmFsc2UgKSB7IHJldHVybiByZXN1bHRzZXQ7IH0KICAgICAgICBmb3IgKCBjb25zdCBzdGVwIG9mIHN0ZXBzICkgewogICAgICAgICAgICBzd2l0Y2ggKCBzdGVwLm12ICkgewogICAgICAgICAgICBjYXNlIHRoaXMuI1JPT1Q6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIFsgJyQnIF0gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NVUlJFTlQ6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIHBhdGhpbiBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jQ0hJTERSRU46CiAgICAgICAgICAgIGNhc2UgdGhpcy4jREVTQ0VOREFOVFM6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSB0aGlzLiNnZXRNYXRjaGVzKHJlc3VsdHNldCwgc3RlcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzZXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlcyhsaXN0aW4sIHN0ZXApIHsKICAgICAgICBjb25zdCBsaXN0b3V0ID0gW107CiAgICAgICAgZm9yICggY29uc3QgcGF0aGluIG9mIGxpc3RpbiApIHsKICAgICAgICAgICAgY29uc3QgeyB2YWx1ZTogb3duZXIgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhpbik7CiAgICAgICAgICAgIGlmICggc3RlcC5rID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUFsbChwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggc3RlcC5rICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuc3RlcHMgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUV4cHIocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpc3RvdXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3QgcmVjdXJzaXZlID0gc3RlcC5tdiA9PT0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgZm9yICggY29uc3QgeyBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoIF0pOwogICAgICAgIH0KICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3Qga2sgPSBBcnJheS5pc0FycmF5KHN0ZXAuaykgPyBzdGVwLmsgOiBbIHN0ZXAuayBdOwogICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLiNldmFsdWF0ZUV4cHIoc3RlcCwgb3duZXIsIGspOwogICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgfQogICAgICAgIGlmICggc3RlcC5tdiAhPT0gdGhpcy4jREVTQ0VOREFOVFMgKSB7IHJldHVybjsgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgdHJ1ZSkgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG9ialtrZXldLCBrKTsKICAgICAgICAgICAgICAgIGlmICggbm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIC4uLnBhdGgsIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcGF0aGluKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCAhPT0gMCApIHsgb3V0LnB1c2gocGF0aGluKTsgfQogICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSAhPT0gdHJ1ZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgcmVjdXJzaXZlKSApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG9ialtrZXldKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgY29uc3QgcSA9IFsgLi4ucGF0aGluLCAuLi5wYXRoIF07CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNldmFsdWF0ZShzdGVwLnN0ZXBzLCBxKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCA9PT0gMCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2gocSk7CiAgICAgICAgfQogICAgfQogICAgI25vcm1hbGl6ZUtleShvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPj0gMCA/IGtleSA6IG93bmVyLmxlbmd0aCArIGtleTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAgI2dldERlc2NlbmRhbnRzKHYsIHJlY3Vyc2l2ZSkgewogICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuc3RhY2subGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKCBuID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLnN0YWNrW24tMV07CiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGRldGFpbHMua2V5cy5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoIGVudHJ5LmRvbmUgKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGgucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wYXRoW24tMV0gPSBlbnRyeS52YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgb2JqOiBkZXRhaWxzLm9iaiwKICAgICAgICAgICAgICAgICAgICBrZXk6IGVudHJ5LnZhbHVlLAogICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aC5zbGljZSgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlLm9ialt0aGlzLnZhbHVlLmtleV07CiAgICAgICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogdi5rZXlzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhdGg6IFtdLAogICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgICAgICBkb25lOiBmYWxzZSwKICAgICAgICAgICAgc3RhY2s6IFtdLAogICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH0sCiAgICAgICAgfTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiBPYmplY3Qua2V5cyh2KS52YWx1ZXMoKSB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgfQogICAgI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3Qga2V5cyA9IFtdOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgY29uc3QgYzAgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMwID09PSAweDVEIC8qIF0gKi8gKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkMgLyogLCAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MjcgLyogJyAqLyApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiN1bnRpbENoYXIocXVlcnksIDB4MjcgLyogJyAqLywgaSsxKQogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAga2V5cy5wdXNoKHIucyk7CiAgICAgICAgICAgICAgICBpID0gci5pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyRCAvKiAtICovIHx8IGMwID49IDB4MzAgJiYgYzAgPD0gMHgzOSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVJbmRpY2UuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGNvbnN0IGluZGljZSA9IHBhcnNlSW50KHF1ZXJ5LnNsaWNlKGkpLCAxMCk7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2goaW5kaWNlKTsKICAgICAgICAgICAgICAgIGkgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpOwogICAgICAgICAgICBpZiAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGtleXMucHVzaChzKTsKICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczoga2V5cy5sZW5ndGggPT09IDEgPyBrZXlzWzBdIDoga2V5cywgaSB9OwogICAgfQogICAgI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpIHsKICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlVW5xdW90ZWRJZGVudGlmaWVyLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIHJldHVybiBtYXRjaFswXTsKICAgIH0KICAgICN1bnRpbENoYXIocXVlcnksIHRhcmdldENoYXJDb2RlLCBpKSB7CiAgICAgICAgY29uc3QgbGVuID0gcXVlcnkubGVuZ3RoOwogICAgICAgIGNvbnN0IHBhcnRzID0gW107CiAgICAgICAgbGV0IGJlZyA9IGksIGVuZCA9IGk7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGVuZCA9PT0gbGVuICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3QgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoZW5kKTsKICAgICAgICAgICAgaWYgKCBjID09PSB0YXJnZXRDaGFyQ29kZSApIHsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjID09PSAweDVDIC8qIFwgKi8gJiYgKGVuZCsxKSA8IGxlbiApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCsxKTsKICAgICAgICAgICAgICAgIGlmICggZCA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChxdWVyeS5zbGljZShiZWcsIGVuZCkpOwogICAgICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgICAgIGJlZyA9IGVuZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczogcGFydHMuam9pbignJyksIGk6IGVuZCB9OwogICAgfQogICAgI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCc9LycsIGkpICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDJGIC8qIC8gKi8sIGkrMik7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gaTsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eW2ldLy5leGVjKHF1ZXJ5LnNsaWNlKHIuaSkpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3RlcC5ydmFsID0gbmV3IFJlZ0V4cChyLnMsIG1hdGNoICYmIG1hdGNoWzBdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RlcC5vcCA9ICdyZSc7CiAgICAgICAgICAgIGlmICggbWF0Y2ggKSB7IHIuaSArPSBtYXRjaFswXS5sZW5ndGg7IH0KICAgICAgICAgICAgcmV0dXJuIHIuaTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZUV4cHIuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuIGk7IH0KICAgICAgICB0cnkgewogICAgICAgICAgICBzdGVwLnJ2YWwgPSBKU09OLnBhcnNlKG1hdGNoWzJdKTsKICAgICAgICAgICAgc3RlcC5vcCA9IG1hdGNoWzFdOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICByZXR1cm4gaSArIG1hdGNoWzFdLmxlbmd0aCArIG1hdGNoWzJdLmxlbmd0aDsKICAgIH0KICAgICNyZXNvbHZlUGF0aChwYXRoKSB7CiAgICAgICAgaWYgKCBwYXRoLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuIHsgdmFsdWU6IHRoaXMuI3Jvb3QgfTsgfQogICAgICAgIGNvbnN0IGtleSA9IHBhdGguYXQoLTEpOwogICAgICAgIGxldCBvYmogPSB0aGlzLiNyb290CiAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gcGF0aC5sZW5ndGgtMTsgaSA8IG47IGkrKyApIHsKICAgICAgICAgICAgb2JqID0gb2JqW3BhdGhbaV1dOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBvYmosIGtleSwgdmFsdWU6IG9ialtrZXldIH07CiAgICB9CiAgICAjZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrZXkpIHsKICAgICAgICBpZiAoIG93bmVyID09PSB1bmRlZmluZWQgfHwgb3duZXIgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IHRoaXMuI25vcm1hbGl6ZUtleShvd25lciwga2V5KTsKICAgICAgICBjb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duKG93bmVyLCBrKTsKICAgICAgICBpZiAoIHN0ZXAub3AgIT09IHVuZGVmaW5lZCAmJiBoYXNPd24gPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0YXJnZXQgPSBzdGVwLm5vdCAhPT0gdHJ1ZTsKICAgICAgICBjb25zdCB2ID0gb3duZXJba107CiAgICAgICAgbGV0IG91dGNvbWUgPSBmYWxzZTsKICAgICAgICBzd2l0Y2ggKCBzdGVwLm9wICkgewogICAgICAgIGNhc2UgJz09Jzogb3V0Y29tZSA9ICh2ID09PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyE9Jzogb3V0Y29tZSA9ICh2ICE9PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc8Jzogb3V0Y29tZSA9ICh2IDwgc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc8PSc6IG91dGNvbWUgPSAodiA8PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc+Jzogb3V0Y29tZSA9ICh2ID4gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc+PSc6IG91dGNvbWUgPSAodiA+PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ149Jzogb3V0Y29tZSA9IGAke3Z9YC5zdGFydHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnJD0nOiBvdXRjb21lID0gYCR7dn1gLmVuZHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnKj0nOiBvdXRjb21lID0gYCR7dn1gLmluY2x1ZGVzKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAncmUnOiBvdXRjb21lID0gc3RlcC5ydmFsLnRlc3QoYCR7dn1gKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogb3V0Y29tZSA9IGhhc093biA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCBvdXRjb21lICkgeyByZXR1cm4gazsgfQogICAgfQogICAgI21vZGlmeVZhbChvYmosIGtleSkgewogICAgICAgIGNvbnN0IHsgbW9kaWZ5LCBydmFsIH0gPSB0aGlzLiNjb21waWxlZDsKICAgICAgICBzd2l0Y2ggKCBtb2RpZnkgKSB7CiAgICAgICAgY2FzZSB1bmRlZmluZWQ6CiAgICAgICAgICAgIG9ialtrZXldID0gcnZhbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnKyc6IHsKICAgICAgICAgICAgaWYgKCBydmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCBsdmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShsdmFsKSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGZvciAoIGNvbnN0IFsgaywgdiBdIG9mIE9iamVjdC5lbnRyaWVzKHJ2YWwpICkgewogICAgICAgICAgICAgICAgbHZhbFtrXSA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgJ3JlcGwnOiB7CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgbHZhbCAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuI2NvbXBpbGVkLnJlID0gcnZhbC5yZWdleCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFJlZ0V4cChydmFsLnJlZ2V4LCBydmFsLmZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAocnZhbC5wYXR0ZXJuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQucmUgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICBvYmpba2V5XSA9IGx2YWwucmVwbGFjZSh0aGlzLiNjb21waWxlZC5yZSwgcnZhbC5yZXBsYWNlbWVudCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24ganNvbkVkaXRYaHJSZXF1ZXN0Rm4odHJ1c3RlZCwganNvbnEgPSAnJykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoCiAgICAgICAgYCR7dHJ1c3RlZCA/ICd0cnVzdGVkLScgOiAnJ31qc29uLWVkaXQteGhyLXJlcXVlc3RgLAogICAgICAgIGpzb25xCiAgICApOwogICAgY29uc3QgeGhySW5zdGFuY2VzID0gbmV3IFdlYWtNYXAoKTsKICAgIGNvbnN0IGpzb25wID0gSlNPTlBhdGguY3JlYXRlKGpzb25xKTsKICAgIGlmICgganNvbnAudmFsaWQgPT09IGZhbHNlIHx8IGpzb25wLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHJ1c3RlZCAhPT0gdHJ1ZSApIHsKICAgICAgICByZXR1cm4gc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnQmFkIEpTT05QYXRoIHF1ZXJ5Jyk7CiAgICB9CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDIpOwogICAgY29uc3QgcHJvcE5lZWRsZXMgPSBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4oZXh0cmFBcmdzLnByb3BzVG9NYXRjaCwgJ3VybCcpOwogICAgc2VsZi5YTUxIdHRwUmVxdWVzdCA9IGNsYXNzIGV4dGVuZHMgc2VsZi5YTUxIdHRwUmVxdWVzdCB7CiAgICAgICAgb3BlbihtZXRob2QsIHVybCwgLi4uYXJncykgewogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geyBtZXRob2QsIHVybCB9OwogICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gcHJvcE5lZWRsZXMuc2l6ZSA9PT0gMCB8fAogICAgICAgICAgICAgICAgbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHhockRldGFpbHMpOwogICAgICAgICAgICBpZiAoIG1hdGNoZWQgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICYmIEFycmF5LmlzQXJyYXkobWF0Y2hlZCkgKSB7CiAgICAgICAgICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgTWF0Y2hlZCAicHJvcHNUb01hdGNoIjpcblx0JHttYXRjaGVkLmpvaW4oJ1xuXHQnKX1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhockluc3RhbmNlcy5zZXQodGhpcywgeGhyRGV0YWlscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBzZW5kKGJvZHkpIHsKICAgICAgICAgICAgY29uc3QgeGhyRGV0YWlscyA9IHhockluc3RhbmNlcy5nZXQodGhpcyk7CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscyApIHsKICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLiNmaWx0ZXJCb2R5KGJvZHkpIHx8IGJvZHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VwZXIuc2VuZChib2R5KTsKICAgICAgICB9CiAgICAgICAgI2ZpbHRlckJvZHkoYm9keSkgewogICAgICAgICAgICBpZiAoIHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGxldCBkYXRhOwogICAgICAgICAgICB0cnkgeyBkYXRhID0gc2FmZS5KU09OX3BhcnNlKGJvZHkpOyB9CiAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICBpZiAoIGRhdGEgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBqc29ucC5hcHBseShkYXRhKTsKICAgICAgICAgICAgaWYgKCBvYmpBZnRlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgYm9keSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkob2JqQWZ0ZXIpOwogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdFZGl0ZWQnKTsKICAgICAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYEFmdGVyIGVkaXQ6XG4ke2JvZHl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGJvZHk7CiAgICAgICAgfQogICAgfTsKfQoKICAoZnVuY3Rpb24ganNvbkVkaXRYaHJSZXF1ZXN0KGpzb25xID0gJycsIC4uLmFyZ3MpIHsKICAgIGpzb25FZGl0WGhyUmVxdWVzdEZuKGZhbHNlLCBqc29ucSwgLi4uYXJncyk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"trusted-json-edit-xhr-request.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmNsYXNzIEpTT05QYXRoIHsKICAgIHN0YXRpYyBjcmVhdGUocXVlcnkpIHsKICAgICAgICBjb25zdCBqc29ucCA9IG5ldyBKU09OUGF0aCgpOwogICAgICAgIGpzb25wLmNvbXBpbGUocXVlcnkpOwogICAgICAgIHJldHVybiBqc29ucDsKICAgIH0KICAgIHN0YXRpYyB0b0pTT04ob2JqLCBzdHJpbmdpZmllciwgLi4uYXJncykgewogICAgICAgIHJldHVybiAoc3RyaW5naWZpZXIgfHwgSlNPTi5zdHJpbmdpZnkpKG9iaiwgLi4uYXJncykKICAgICAgICAgICAgLnJlcGxhY2UoL1wvL2csICdcXC8nKTsKICAgIH0KICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgJiYgdGhpcy4jY29tcGlsZWQucnZhbDsKICAgIH0KICAgIHNldCB2YWx1ZSh2KSB7CiAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICB0aGlzLiNjb21waWxlZC5ydmFsID0gdjsKICAgIH0KICAgIGdldCB2YWxpZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbXBpbGUocXVlcnkpIHsKICAgICAgICB0aGlzLiNjb21waWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgMCk7CiAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggci5pICE9PSBxdWVyeS5sZW5ndGggKSB7CiAgICAgICAgICAgIGxldCB2YWw7CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPScsIHIuaSkgKSB7CiAgICAgICAgICAgICAgICBpZiAoIC9ePXJlcGxcKC4rXCkkLy50ZXN0KHF1ZXJ5LnNsaWNlKHIuaSkpICkgewogICAgICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJ3JlcGwnOwogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSs2LCAtMSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSsxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnKz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgci5tb2RpZnkgPSAnKyc7CiAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsgci5ydmFsID0gSlNPTi5wYXJzZSh2YWwpOyB9CiAgICAgICAgICAgIGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIHRoaXMuI2NvbXBpbGVkID0gcjsKICAgIH0KICAgIGV2YWx1YXRlKHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm4gW107IH0KICAgICAgICB0aGlzLiNyb290ID0gcm9vdDsKICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuI2V2YWx1YXRlKHRoaXMuI2NvbXBpbGVkLnN0ZXBzLCBbXSk7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgfQogICAgYXBwbHkocm9vdCkgewogICAgICAgIGlmICggdGhpcy52YWxpZCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHsgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgdGhpcy4jcm9vdCA9IHsgJyQnOiByb290IH07CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIGxldCBpID0gcGF0aHMubGVuZ3RoCiAgICAgICAgaWYgKCBpID09PSAwICkgeyB0aGlzLiNyb290ID0gbnVsbDsgcmV0dXJuOyB9CiAgICAgICAgd2hpbGUgKCBpLS0gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgb2JqLCBrZXkgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhzW2ldKTsKICAgICAgICAgICAgaWYgKCBydmFsICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNtb2RpZnlWYWwob2JqLCBrZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KG9iaikgJiYgdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgICAgICBvYmouc3BsaWNlKGtleSwgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb2JqW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jcm9vdFsnJCddID8/IG51bGw7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGR1bXAoKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuI2NvbXBpbGVkKTsKICAgIH0KICAgIHRvSlNPTihvYmosIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gSlNPTlBhdGgudG9KU09OKG9iaiwgbnVsbCwgLi4uYXJncykKICAgIH0KICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHsKICAgICAgICByZXR1cm4gJ0pTT05QYXRoJzsKICAgIH0KICAgICNVTkRFRklORUQgPSAwOwogICAgI1JPT1QgPSAxOwogICAgI0NVUlJFTlQgPSAyOwogICAgI0NISUxEUkVOID0gMzsKICAgICNERVNDRU5EQU5UUyA9IDQ7CiAgICAjcmVVbnF1b3RlZElkZW50aWZpZXIgPSAvXltBLVphLXpfXVtcd10qfF5cKi87CiAgICAjcmVFeHByID0gL14oWyE9XiQqXT18Wzw+XT0/KSguKz8pXF0vOwogICAgI3JlSW5kaWNlID0gL14tP1xkKy87CiAgICAjcm9vdDsKICAgICNjb21waWxlZDsKICAgICNjb21waWxlKHF1ZXJ5LCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHN0ZXBzID0gW107CiAgICAgICAgbGV0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmICggYyA9PT0gMHgyNCAvKiAkICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI1JPT1QgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgaWYgKCBjID09PSAweDQwIC8qIEAgKi8gKSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogaSA9PT0gMCA/IHRoaXMuI1JPT1QgOiB0aGlzLiNDVVJSRU5UIH0pOwogICAgICAgIH0KICAgICAgICBsZXQgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGkgPT09IHF1ZXJ5Lmxlbmd0aCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIGlmICggYyA9PT0gMHgyMCAvKiB3aGl0ZXNwYWNlICovICkgewogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRG90IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIGMgPT09IDB4MkUgLyogLiAqLyApIHsKICAgICAgICAgICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJy4uJywgaSkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjICE9PSAweDVCIC8qIFsgKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ID09PSB0aGlzLiNVTkRFRklORUQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHN0ZXBzLmF0KC0xKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZXAgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgICAgIGlmICAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHMgfSk7CiAgICAgICAgICAgICAgICBpICs9IHMubGVuZ3RoOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCcmFja2V0IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ1s/JywgaSkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3QgPSBxdWVyeS5jaGFyQ29kZUF0KGkrMikgPT09IDB4MjEgLyogISAqLzsKICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpICsgMiArIChub3QgPyAxIDogMCk7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgaik7CiAgICAgICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ10nLCByLmkpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIG5vdCApIHsgci5zdGVwcy5hdCgtMSkubm90ID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiBtdiB8fCB0aGlzLiNDSElMRFJFTiwgc3RlcHM6IHIuc3RlcHMgfSk7CiAgICAgICAgICAgICAgICBpID0gci5pICsgMTsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbKl0nLCBpKSApIHsKICAgICAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogJyonIH0pOwogICAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29uc3VtZUlkZW50aWZpZXIocXVlcnksIGkrMSk7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbXYgfHw9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHIucyB9KTsKICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXBzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBtdiAhPT0gdGhpcy4jVU5ERUZJTkVEICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4geyBzdGVwcywgaSB9OwogICAgfQogICAgI2V2YWx1YXRlKHN0ZXBzLCBwYXRoaW4pIHsKICAgICAgICBsZXQgcmVzdWx0c2V0ID0gW107CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHN0ZXBzKSA9PT0gZmFsc2UgKSB7IHJldHVybiByZXN1bHRzZXQ7IH0KICAgICAgICBmb3IgKCBjb25zdCBzdGVwIG9mIHN0ZXBzICkgewogICAgICAgICAgICBzd2l0Y2ggKCBzdGVwLm12ICkgewogICAgICAgICAgICBjYXNlIHRoaXMuI1JPT1Q6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIFsgJyQnIF0gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NVUlJFTlQ6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIHBhdGhpbiBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jQ0hJTERSRU46CiAgICAgICAgICAgIGNhc2UgdGhpcy4jREVTQ0VOREFOVFM6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSB0aGlzLiNnZXRNYXRjaGVzKHJlc3VsdHNldCwgc3RlcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzZXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlcyhsaXN0aW4sIHN0ZXApIHsKICAgICAgICBjb25zdCBsaXN0b3V0ID0gW107CiAgICAgICAgZm9yICggY29uc3QgcGF0aGluIG9mIGxpc3RpbiApIHsKICAgICAgICAgICAgY29uc3QgeyB2YWx1ZTogb3duZXIgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhpbik7CiAgICAgICAgICAgIGlmICggc3RlcC5rID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUFsbChwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggc3RlcC5rICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuc3RlcHMgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUV4cHIocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpc3RvdXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3QgcmVjdXJzaXZlID0gc3RlcC5tdiA9PT0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgZm9yICggY29uc3QgeyBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoIF0pOwogICAgICAgIH0KICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3Qga2sgPSBBcnJheS5pc0FycmF5KHN0ZXAuaykgPyBzdGVwLmsgOiBbIHN0ZXAuayBdOwogICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLiNldmFsdWF0ZUV4cHIoc3RlcCwgb3duZXIsIGspOwogICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgfQogICAgICAgIGlmICggc3RlcC5tdiAhPT0gdGhpcy4jREVTQ0VOREFOVFMgKSB7IHJldHVybjsgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgdHJ1ZSkgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG9ialtrZXldLCBrKTsKICAgICAgICAgICAgICAgIGlmICggbm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIC4uLnBhdGgsIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcGF0aGluKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCAhPT0gMCApIHsgb3V0LnB1c2gocGF0aGluKTsgfQogICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSAhPT0gdHJ1ZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgcmVjdXJzaXZlKSApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG9ialtrZXldKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgY29uc3QgcSA9IFsgLi4ucGF0aGluLCAuLi5wYXRoIF07CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNldmFsdWF0ZShzdGVwLnN0ZXBzLCBxKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCA9PT0gMCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2gocSk7CiAgICAgICAgfQogICAgfQogICAgI25vcm1hbGl6ZUtleShvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPj0gMCA/IGtleSA6IG93bmVyLmxlbmd0aCArIGtleTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAgI2dldERlc2NlbmRhbnRzKHYsIHJlY3Vyc2l2ZSkgewogICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuc3RhY2subGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKCBuID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLnN0YWNrW24tMV07CiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGRldGFpbHMua2V5cy5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoIGVudHJ5LmRvbmUgKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGgucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wYXRoW24tMV0gPSBlbnRyeS52YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgb2JqOiBkZXRhaWxzLm9iaiwKICAgICAgICAgICAgICAgICAgICBrZXk6IGVudHJ5LnZhbHVlLAogICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aC5zbGljZSgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlLm9ialt0aGlzLnZhbHVlLmtleV07CiAgICAgICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogdi5rZXlzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhdGg6IFtdLAogICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgICAgICBkb25lOiBmYWxzZSwKICAgICAgICAgICAgc3RhY2s6IFtdLAogICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH0sCiAgICAgICAgfTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiBPYmplY3Qua2V5cyh2KS52YWx1ZXMoKSB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgfQogICAgI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3Qga2V5cyA9IFtdOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgY29uc3QgYzAgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMwID09PSAweDVEIC8qIF0gKi8gKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkMgLyogLCAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MjcgLyogJyAqLyApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiN1bnRpbENoYXIocXVlcnksIDB4MjcgLyogJyAqLywgaSsxKQogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAga2V5cy5wdXNoKHIucyk7CiAgICAgICAgICAgICAgICBpID0gci5pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyRCAvKiAtICovIHx8IGMwID49IDB4MzAgJiYgYzAgPD0gMHgzOSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVJbmRpY2UuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGNvbnN0IGluZGljZSA9IHBhcnNlSW50KHF1ZXJ5LnNsaWNlKGkpLCAxMCk7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2goaW5kaWNlKTsKICAgICAgICAgICAgICAgIGkgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpOwogICAgICAgICAgICBpZiAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGtleXMucHVzaChzKTsKICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczoga2V5cy5sZW5ndGggPT09IDEgPyBrZXlzWzBdIDoga2V5cywgaSB9OwogICAgfQogICAgI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpIHsKICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlVW5xdW90ZWRJZGVudGlmaWVyLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIHJldHVybiBtYXRjaFswXTsKICAgIH0KICAgICN1bnRpbENoYXIocXVlcnksIHRhcmdldENoYXJDb2RlLCBpKSB7CiAgICAgICAgY29uc3QgbGVuID0gcXVlcnkubGVuZ3RoOwogICAgICAgIGNvbnN0IHBhcnRzID0gW107CiAgICAgICAgbGV0IGJlZyA9IGksIGVuZCA9IGk7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGVuZCA9PT0gbGVuICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3QgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoZW5kKTsKICAgICAgICAgICAgaWYgKCBjID09PSB0YXJnZXRDaGFyQ29kZSApIHsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjID09PSAweDVDIC8qIFwgKi8gJiYgKGVuZCsxKSA8IGxlbiApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCsxKTsKICAgICAgICAgICAgICAgIGlmICggZCA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChxdWVyeS5zbGljZShiZWcsIGVuZCkpOwogICAgICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgICAgIGJlZyA9IGVuZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczogcGFydHMuam9pbignJyksIGk6IGVuZCB9OwogICAgfQogICAgI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCc9LycsIGkpICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDJGIC8qIC8gKi8sIGkrMik7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gaTsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eW2ldLy5leGVjKHF1ZXJ5LnNsaWNlKHIuaSkpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3RlcC5ydmFsID0gbmV3IFJlZ0V4cChyLnMsIG1hdGNoICYmIG1hdGNoWzBdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RlcC5vcCA9ICdyZSc7CiAgICAgICAgICAgIGlmICggbWF0Y2ggKSB7IHIuaSArPSBtYXRjaFswXS5sZW5ndGg7IH0KICAgICAgICAgICAgcmV0dXJuIHIuaTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZUV4cHIuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuIGk7IH0KICAgICAgICB0cnkgewogICAgICAgICAgICBzdGVwLnJ2YWwgPSBKU09OLnBhcnNlKG1hdGNoWzJdKTsKICAgICAgICAgICAgc3RlcC5vcCA9IG1hdGNoWzFdOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICByZXR1cm4gaSArIG1hdGNoWzFdLmxlbmd0aCArIG1hdGNoWzJdLmxlbmd0aDsKICAgIH0KICAgICNyZXNvbHZlUGF0aChwYXRoKSB7CiAgICAgICAgaWYgKCBwYXRoLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuIHsgdmFsdWU6IHRoaXMuI3Jvb3QgfTsgfQogICAgICAgIGNvbnN0IGtleSA9IHBhdGguYXQoLTEpOwogICAgICAgIGxldCBvYmogPSB0aGlzLiNyb290CiAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gcGF0aC5sZW5ndGgtMTsgaSA8IG47IGkrKyApIHsKICAgICAgICAgICAgb2JqID0gb2JqW3BhdGhbaV1dOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBvYmosIGtleSwgdmFsdWU6IG9ialtrZXldIH07CiAgICB9CiAgICAjZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrZXkpIHsKICAgICAgICBpZiAoIG93bmVyID09PSB1bmRlZmluZWQgfHwgb3duZXIgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IHRoaXMuI25vcm1hbGl6ZUtleShvd25lciwga2V5KTsKICAgICAgICBjb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duKG93bmVyLCBrKTsKICAgICAgICBpZiAoIHN0ZXAub3AgIT09IHVuZGVmaW5lZCAmJiBoYXNPd24gPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0YXJnZXQgPSBzdGVwLm5vdCAhPT0gdHJ1ZTsKICAgICAgICBjb25zdCB2ID0gb3duZXJba107CiAgICAgICAgbGV0IG91dGNvbWUgPSBmYWxzZTsKICAgICAgICBzd2l0Y2ggKCBzdGVwLm9wICkgewogICAgICAgIGNhc2UgJz09Jzogb3V0Y29tZSA9ICh2ID09PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyE9Jzogb3V0Y29tZSA9ICh2ICE9PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc8Jzogb3V0Y29tZSA9ICh2IDwgc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc8PSc6IG91dGNvbWUgPSAodiA8PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc+Jzogb3V0Y29tZSA9ICh2ID4gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc+PSc6IG91dGNvbWUgPSAodiA+PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ149Jzogb3V0Y29tZSA9IGAke3Z9YC5zdGFydHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnJD0nOiBvdXRjb21lID0gYCR7dn1gLmVuZHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnKj0nOiBvdXRjb21lID0gYCR7dn1gLmluY2x1ZGVzKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAncmUnOiBvdXRjb21lID0gc3RlcC5ydmFsLnRlc3QoYCR7dn1gKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogb3V0Y29tZSA9IGhhc093biA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCBvdXRjb21lICkgeyByZXR1cm4gazsgfQogICAgfQogICAgI21vZGlmeVZhbChvYmosIGtleSkgewogICAgICAgIGNvbnN0IHsgbW9kaWZ5LCBydmFsIH0gPSB0aGlzLiNjb21waWxlZDsKICAgICAgICBzd2l0Y2ggKCBtb2RpZnkgKSB7CiAgICAgICAgY2FzZSB1bmRlZmluZWQ6CiAgICAgICAgICAgIG9ialtrZXldID0gcnZhbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnKyc6IHsKICAgICAgICAgICAgaWYgKCBydmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCBsdmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShsdmFsKSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGZvciAoIGNvbnN0IFsgaywgdiBdIG9mIE9iamVjdC5lbnRyaWVzKHJ2YWwpICkgewogICAgICAgICAgICAgICAgbHZhbFtrXSA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgJ3JlcGwnOiB7CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgbHZhbCAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuI2NvbXBpbGVkLnJlID0gcnZhbC5yZWdleCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFJlZ0V4cChydmFsLnJlZ2V4LCBydmFsLmZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAocnZhbC5wYXR0ZXJuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQucmUgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICBvYmpba2V5XSA9IGx2YWwucmVwbGFjZSh0aGlzLiNjb21waWxlZC5yZSwgcnZhbC5yZXBsYWNlbWVudCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24ganNvbkVkaXRYaHJSZXF1ZXN0Rm4odHJ1c3RlZCwganNvbnEgPSAnJykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoCiAgICAgICAgYCR7dHJ1c3RlZCA/ICd0cnVzdGVkLScgOiAnJ31qc29uLWVkaXQteGhyLXJlcXVlc3RgLAogICAgICAgIGpzb25xCiAgICApOwogICAgY29uc3QgeGhySW5zdGFuY2VzID0gbmV3IFdlYWtNYXAoKTsKICAgIGNvbnN0IGpzb25wID0gSlNPTlBhdGguY3JlYXRlKGpzb25xKTsKICAgIGlmICgganNvbnAudmFsaWQgPT09IGZhbHNlIHx8IGpzb25wLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHJ1c3RlZCAhPT0gdHJ1ZSApIHsKICAgICAgICByZXR1cm4gc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnQmFkIEpTT05QYXRoIHF1ZXJ5Jyk7CiAgICB9CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDIpOwogICAgY29uc3QgcHJvcE5lZWRsZXMgPSBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4oZXh0cmFBcmdzLnByb3BzVG9NYXRjaCwgJ3VybCcpOwogICAgc2VsZi5YTUxIdHRwUmVxdWVzdCA9IGNsYXNzIGV4dGVuZHMgc2VsZi5YTUxIdHRwUmVxdWVzdCB7CiAgICAgICAgb3BlbihtZXRob2QsIHVybCwgLi4uYXJncykgewogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geyBtZXRob2QsIHVybCB9OwogICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gcHJvcE5lZWRsZXMuc2l6ZSA9PT0gMCB8fAogICAgICAgICAgICAgICAgbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHhockRldGFpbHMpOwogICAgICAgICAgICBpZiAoIG1hdGNoZWQgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICYmIEFycmF5LmlzQXJyYXkobWF0Y2hlZCkgKSB7CiAgICAgICAgICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgTWF0Y2hlZCAicHJvcHNUb01hdGNoIjpcblx0JHttYXRjaGVkLmpvaW4oJ1xuXHQnKX1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhockluc3RhbmNlcy5zZXQodGhpcywgeGhyRGV0YWlscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBzZW5kKGJvZHkpIHsKICAgICAgICAgICAgY29uc3QgeGhyRGV0YWlscyA9IHhockluc3RhbmNlcy5nZXQodGhpcyk7CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscyApIHsKICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLiNmaWx0ZXJCb2R5KGJvZHkpIHx8IGJvZHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VwZXIuc2VuZChib2R5KTsKICAgICAgICB9CiAgICAgICAgI2ZpbHRlckJvZHkoYm9keSkgewogICAgICAgICAgICBpZiAoIHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGxldCBkYXRhOwogICAgICAgICAgICB0cnkgeyBkYXRhID0gc2FmZS5KU09OX3BhcnNlKGJvZHkpOyB9CiAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICBpZiAoIGRhdGEgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBqc29ucC5hcHBseShkYXRhKTsKICAgICAgICAgICAgaWYgKCBvYmpBZnRlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgYm9keSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkob2JqQWZ0ZXIpOwogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdFZGl0ZWQnKTsKICAgICAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYEFmdGVyIGVkaXQ6XG4ke2JvZHl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGJvZHk7CiAgICAgICAgfQogICAgfTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZEpzb25FZGl0WGhyUmVxdWVzdChqc29ucSA9ICcnLCAuLi5hcmdzKSB7CiAgICBqc29uRWRpdFhoclJlcXVlc3RGbih0cnVlLCBqc29ucSwgLi4uYXJncyk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"json-edit-fetch-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCBpbXBsaWNpdCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG5lZWRsZXMgPSBuZXcgTWFwKCk7CiAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gdW5kZWZpbmVkIHx8IHByb3BzVG9NYXRjaCA9PT0gJycgKSB7IHJldHVybiBuZWVkbGVzOyB9CiAgICBjb25zdCBvcHRpb25zID0geyBjYW5OZWdhdGU6IHRydWUgfTsKICAgIGZvciAoIGNvbnN0IG5lZWRsZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHByb3BzVG9NYXRjaCwgL1xzKy8pICkgewogICAgICAgIGxldCBbIHByb3AsIHBhdHRlcm4gXSA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwobmVlZGxlLCAnOicpOwogICAgICAgIGlmICggcHJvcCA9PT0gJycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgJiYgL1teJFx3IC1dLy50ZXN0KHByb3ApICkgewogICAgICAgICAgICBwcm9wID0gYCR7cHJvcH06JHtwYXR0ZXJufWA7CiAgICAgICAgICAgIHBhdHRlcm4gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmICggcGF0dGVybiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBuZWVkbGVzLnNldChwcm9wLCBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgICB9IGVsc2UgaWYgKCBpbXBsaWNpdCAhPT0gJycgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KGltcGxpY2l0LCBzYWZlLmluaXRQYXR0ZXJuKHByb3AsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZGxlczsKfQpmdW5jdGlvbiBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgLi4ub2JqcykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBtYXRjaGVkID0gW107CiAgICBmb3IgKCBjb25zdCBvYmogb2Ygb2JqcyApIHsKICAgICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgZm9yICggY29uc3QgWyBwcm9wLCBkZXRhaWxzIF0gb2YgcHJvcE5lZWRsZXMgKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkodmFsdWUpOyB9CiAgICAgICAgICAgICAgICBjYXRjaCB7IH0KICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4oZGV0YWlscywgdmFsdWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG1hdGNoZWQucHVzaChgJHtwcm9wfTogJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0Y2hlZDsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuKHJlc291cmNlLCBvcHRpb25zKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHByb3BzID0gWwogICAgICAgICdib2R5JywgJ2NhY2hlJywgJ2NyZWRlbnRpYWxzJywgJ2R1cGxleCcsICdoZWFkZXJzJywKICAgICAgICAnaW50ZWdyaXR5JywgJ2tlZXBhbGl2ZScsICdtZXRob2QnLCAnbW9kZScsICdwcmlvcml0eScsCiAgICAgICAgJ3JlZGlyZWN0JywgJ3JlZmVycmVyJywgJ3JlZmVycmVyUG9saWN5JywgJ3VybCcKICAgIF07CiAgICBjb25zdCBvdXQgPSB7fTsKICAgIGlmICggY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9IChzcmMsIG91dCkgPT4gewogICAgICAgICAgICBmb3IgKCBjb25zdCBwcm9wIG9mIHByb3BzICkgewogICAgICAgICAgICAgICAgaWYgKCBzcmNbcHJvcF0gPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dFtwcm9wXSA9IHNyY1twcm9wXTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBpZiAoCiAgICAgICAgdHlwZW9mIHJlc291cmNlICE9PSAnb2JqZWN0JyB8fAogICAgICAgIHNhZmUuT2JqZWN0X3RvU3RyaW5nLmNhbGwocmVzb3VyY2UpICE9PSAnW29iamVjdCBSZXF1ZXN0XScKICAgICkgewogICAgICAgIG91dC51cmwgPSBgJHtyZXNvdXJjZX1gOwogICAgfSBlbHNlIHsKICAgICAgICBsZXQgY2xvbmU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2xvbmUgPSBzYWZlLlJlcXVlc3RfY2xvbmUuY2FsbChyZXNvdXJjZSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKGNsb25lIHx8IHJlc291cmNlLCBvdXQpOwogICAgfQogICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyhvcHRpb25zLCBvdXQpOwogICAgfQogICAgcmV0dXJuIG91dDsKfQpmdW5jdGlvbiBqc29uRWRpdEZldGNoUmVzcG9uc2VGbih0cnVzdGVkLCBqc29ucSA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgKICAgICAgICBgJHt0cnVzdGVkID8gJ3RydXN0ZWQtJyA6ICcnfWpzb24tZWRpdC1mZXRjaC1yZXNwb25zZWAsCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCBqc29ucCA9IEpTT05QYXRoLmNyZWF0ZShqc29ucSk7CiAgICBpZiAoIGpzb25wLnZhbGlkID09PSBmYWxzZSB8fCBqc29ucC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRydXN0ZWQgIT09IHRydWUgKSB7CiAgICAgICAgcmV0dXJuIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0JhZCBKU09OUGF0aCBxdWVyeScpOwogICAgfQogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAyKTsKICAgIGNvbnN0IHByb3BOZWVkbGVzID0gcGFyc2VQcm9wZXJ0aWVzVG9NYXRjaEZuKGV4dHJhQXJncy5wcm9wc1RvTWF0Y2gsICd1cmwnKTsKICAgIHByb3h5QXBwbHlGbignZmV0Y2gnLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgY29uc3QgYXJncyA9IGNvbnRleHQuY2FsbEFyZ3M7CiAgICAgICAgY29uc3QgZmV0Y2hQcm9taXNlID0gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgaWYgKCBwcm9wTmVlZGxlcy5zaXplICE9PSAwICkgewogICAgICAgICAgICBjb25zdCBwcm9wcyA9IGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuKC4uLmFyZ3MpOwogICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHByb3BzKTsKICAgICAgICAgICAgaWYgKCBtYXRjaGVkID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBmZXRjaFByb21pc2U7IH0KICAgICAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYE1hdGNoZWQgInByb3BzVG9NYXRjaCI6XG5cdCR7bWF0Y2hlZC5qb2luKCdcblx0Jyl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZldGNoUHJvbWlzZS50aGVuKHJlc3BvbnNlQmVmb3JlID0+IHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXNwb25zZUJlZm9yZS5jbG9uZSgpOwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpLnRoZW4ob2JqID0+IHsKICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgKSB7IHJldHVybiByZXNwb25zZUJlZm9yZTsgfQogICAgICAgICAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBqc29ucC5hcHBseShvYmopOwogICAgICAgICAgICAgICAgaWYgKCBvYmpBZnRlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gcmVzcG9uc2VCZWZvcmU7IH0KICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0VkaXRlZCcpOwogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VBZnRlciA9IFJlc3BvbnNlLmpzb24ob2JqQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlQmVmb3JlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZUJlZm9yZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlQmVmb3JlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJlc3BvbnNlQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBvazogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUub2sgfSwKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkOiB7IHZhbHVlOiByZXNwb25zZUJlZm9yZS5yZWRpcmVjdGVkIH0sCiAgICAgICAgICAgICAgICAgICAgdHlwZTogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudHlwZSB9LAogICAgICAgICAgICAgICAgICAgIHVybDogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudXJsIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUFmdGVyOwogICAgICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJlZm9yZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgcmV0dXJuIGZldGNoUHJvbWlzZTsKICAgICAgICB9KTsKICAgIH0pOwp9CgogIChmdW5jdGlvbiBqc29uRWRpdEZldGNoUmVzcG9uc2UoanNvbnEgPSAnJywgLi4uYXJncykgewogICAganNvbkVkaXRGZXRjaFJlc3BvbnNlRm4oZmFsc2UsIGpzb25xLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-json-edit-fetch-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCBpbXBsaWNpdCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG5lZWRsZXMgPSBuZXcgTWFwKCk7CiAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gdW5kZWZpbmVkIHx8IHByb3BzVG9NYXRjaCA9PT0gJycgKSB7IHJldHVybiBuZWVkbGVzOyB9CiAgICBjb25zdCBvcHRpb25zID0geyBjYW5OZWdhdGU6IHRydWUgfTsKICAgIGZvciAoIGNvbnN0IG5lZWRsZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHByb3BzVG9NYXRjaCwgL1xzKy8pICkgewogICAgICAgIGxldCBbIHByb3AsIHBhdHRlcm4gXSA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwobmVlZGxlLCAnOicpOwogICAgICAgIGlmICggcHJvcCA9PT0gJycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgJiYgL1teJFx3IC1dLy50ZXN0KHByb3ApICkgewogICAgICAgICAgICBwcm9wID0gYCR7cHJvcH06JHtwYXR0ZXJufWA7CiAgICAgICAgICAgIHBhdHRlcm4gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmICggcGF0dGVybiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBuZWVkbGVzLnNldChwcm9wLCBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgICB9IGVsc2UgaWYgKCBpbXBsaWNpdCAhPT0gJycgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KGltcGxpY2l0LCBzYWZlLmluaXRQYXR0ZXJuKHByb3AsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZGxlczsKfQpmdW5jdGlvbiBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgLi4ub2JqcykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBtYXRjaGVkID0gW107CiAgICBmb3IgKCBjb25zdCBvYmogb2Ygb2JqcyApIHsKICAgICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgZm9yICggY29uc3QgWyBwcm9wLCBkZXRhaWxzIF0gb2YgcHJvcE5lZWRsZXMgKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkodmFsdWUpOyB9CiAgICAgICAgICAgICAgICBjYXRjaCB7IH0KICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4oZGV0YWlscywgdmFsdWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG1hdGNoZWQucHVzaChgJHtwcm9wfTogJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0Y2hlZDsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuKHJlc291cmNlLCBvcHRpb25zKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHByb3BzID0gWwogICAgICAgICdib2R5JywgJ2NhY2hlJywgJ2NyZWRlbnRpYWxzJywgJ2R1cGxleCcsICdoZWFkZXJzJywKICAgICAgICAnaW50ZWdyaXR5JywgJ2tlZXBhbGl2ZScsICdtZXRob2QnLCAnbW9kZScsICdwcmlvcml0eScsCiAgICAgICAgJ3JlZGlyZWN0JywgJ3JlZmVycmVyJywgJ3JlZmVycmVyUG9saWN5JywgJ3VybCcKICAgIF07CiAgICBjb25zdCBvdXQgPSB7fTsKICAgIGlmICggY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9IChzcmMsIG91dCkgPT4gewogICAgICAgICAgICBmb3IgKCBjb25zdCBwcm9wIG9mIHByb3BzICkgewogICAgICAgICAgICAgICAgaWYgKCBzcmNbcHJvcF0gPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dFtwcm9wXSA9IHNyY1twcm9wXTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBpZiAoCiAgICAgICAgdHlwZW9mIHJlc291cmNlICE9PSAnb2JqZWN0JyB8fAogICAgICAgIHNhZmUuT2JqZWN0X3RvU3RyaW5nLmNhbGwocmVzb3VyY2UpICE9PSAnW29iamVjdCBSZXF1ZXN0XScKICAgICkgewogICAgICAgIG91dC51cmwgPSBgJHtyZXNvdXJjZX1gOwogICAgfSBlbHNlIHsKICAgICAgICBsZXQgY2xvbmU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2xvbmUgPSBzYWZlLlJlcXVlc3RfY2xvbmUuY2FsbChyZXNvdXJjZSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKGNsb25lIHx8IHJlc291cmNlLCBvdXQpOwogICAgfQogICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyhvcHRpb25zLCBvdXQpOwogICAgfQogICAgcmV0dXJuIG91dDsKfQpmdW5jdGlvbiBqc29uRWRpdEZldGNoUmVzcG9uc2VGbih0cnVzdGVkLCBqc29ucSA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgKICAgICAgICBgJHt0cnVzdGVkID8gJ3RydXN0ZWQtJyA6ICcnfWpzb24tZWRpdC1mZXRjaC1yZXNwb25zZWAsCiAgICAgICAganNvbnEKICAgICk7CiAgICBjb25zdCBqc29ucCA9IEpTT05QYXRoLmNyZWF0ZShqc29ucSk7CiAgICBpZiAoIGpzb25wLnZhbGlkID09PSBmYWxzZSB8fCBqc29ucC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRydXN0ZWQgIT09IHRydWUgKSB7CiAgICAgICAgcmV0dXJuIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0JhZCBKU09OUGF0aCBxdWVyeScpOwogICAgfQogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAyKTsKICAgIGNvbnN0IHByb3BOZWVkbGVzID0gcGFyc2VQcm9wZXJ0aWVzVG9NYXRjaEZuKGV4dHJhQXJncy5wcm9wc1RvTWF0Y2gsICd1cmwnKTsKICAgIHByb3h5QXBwbHlGbignZmV0Y2gnLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgY29uc3QgYXJncyA9IGNvbnRleHQuY2FsbEFyZ3M7CiAgICAgICAgY29uc3QgZmV0Y2hQcm9taXNlID0gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgaWYgKCBwcm9wTmVlZGxlcy5zaXplICE9PSAwICkgewogICAgICAgICAgICBjb25zdCBwcm9wcyA9IGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuKC4uLmFyZ3MpOwogICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHByb3BzKTsKICAgICAgICAgICAgaWYgKCBtYXRjaGVkID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBmZXRjaFByb21pc2U7IH0KICAgICAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYE1hdGNoZWQgInByb3BzVG9NYXRjaCI6XG5cdCR7bWF0Y2hlZC5qb2luKCdcblx0Jyl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZldGNoUHJvbWlzZS50aGVuKHJlc3BvbnNlQmVmb3JlID0+IHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXNwb25zZUJlZm9yZS5jbG9uZSgpOwogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpLnRoZW4ob2JqID0+IHsKICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgKSB7IHJldHVybiByZXNwb25zZUJlZm9yZTsgfQogICAgICAgICAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBqc29ucC5hcHBseShvYmopOwogICAgICAgICAgICAgICAgaWYgKCBvYmpBZnRlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gcmVzcG9uc2VCZWZvcmU7IH0KICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0VkaXRlZCcpOwogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VBZnRlciA9IFJlc3BvbnNlLmpzb24ob2JqQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlQmVmb3JlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZUJlZm9yZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlQmVmb3JlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJlc3BvbnNlQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBvazogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUub2sgfSwKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkOiB7IHZhbHVlOiByZXNwb25zZUJlZm9yZS5yZWRpcmVjdGVkIH0sCiAgICAgICAgICAgICAgICAgICAgdHlwZTogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudHlwZSB9LAogICAgICAgICAgICAgICAgICAgIHVybDogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudXJsIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUFmdGVyOwogICAgICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJlZm9yZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgcmV0dXJuIGZldGNoUHJvbWlzZTsKICAgICAgICB9KTsKICAgIH0pOwp9CgogIChmdW5jdGlvbiB0cnVzdGVkSnNvbkVkaXRGZXRjaFJlc3BvbnNlKGpzb25xID0gJycsIC4uLmFyZ3MpIHsKICAgIGpzb25FZGl0RmV0Y2hSZXNwb25zZUZuKHRydWUsIGpzb25xLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"json-edit-fetch-request.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCBpbXBsaWNpdCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG5lZWRsZXMgPSBuZXcgTWFwKCk7CiAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gdW5kZWZpbmVkIHx8IHByb3BzVG9NYXRjaCA9PT0gJycgKSB7IHJldHVybiBuZWVkbGVzOyB9CiAgICBjb25zdCBvcHRpb25zID0geyBjYW5OZWdhdGU6IHRydWUgfTsKICAgIGZvciAoIGNvbnN0IG5lZWRsZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHByb3BzVG9NYXRjaCwgL1xzKy8pICkgewogICAgICAgIGxldCBbIHByb3AsIHBhdHRlcm4gXSA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwobmVlZGxlLCAnOicpOwogICAgICAgIGlmICggcHJvcCA9PT0gJycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgJiYgL1teJFx3IC1dLy50ZXN0KHByb3ApICkgewogICAgICAgICAgICBwcm9wID0gYCR7cHJvcH06JHtwYXR0ZXJufWA7CiAgICAgICAgICAgIHBhdHRlcm4gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmICggcGF0dGVybiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBuZWVkbGVzLnNldChwcm9wLCBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgICB9IGVsc2UgaWYgKCBpbXBsaWNpdCAhPT0gJycgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KGltcGxpY2l0LCBzYWZlLmluaXRQYXR0ZXJuKHByb3AsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZGxlczsKfQpmdW5jdGlvbiBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgLi4ub2JqcykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBtYXRjaGVkID0gW107CiAgICBmb3IgKCBjb25zdCBvYmogb2Ygb2JqcyApIHsKICAgICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgZm9yICggY29uc3QgWyBwcm9wLCBkZXRhaWxzIF0gb2YgcHJvcE5lZWRsZXMgKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkodmFsdWUpOyB9CiAgICAgICAgICAgICAgICBjYXRjaCB7IH0KICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4oZGV0YWlscywgdmFsdWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG1hdGNoZWQucHVzaChgJHtwcm9wfTogJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0Y2hlZDsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuKHJlc291cmNlLCBvcHRpb25zKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHByb3BzID0gWwogICAgICAgICdib2R5JywgJ2NhY2hlJywgJ2NyZWRlbnRpYWxzJywgJ2R1cGxleCcsICdoZWFkZXJzJywKICAgICAgICAnaW50ZWdyaXR5JywgJ2tlZXBhbGl2ZScsICdtZXRob2QnLCAnbW9kZScsICdwcmlvcml0eScsCiAgICAgICAgJ3JlZGlyZWN0JywgJ3JlZmVycmVyJywgJ3JlZmVycmVyUG9saWN5JywgJ3VybCcKICAgIF07CiAgICBjb25zdCBvdXQgPSB7fTsKICAgIGlmICggY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9IChzcmMsIG91dCkgPT4gewogICAgICAgICAgICBmb3IgKCBjb25zdCBwcm9wIG9mIHByb3BzICkgewogICAgICAgICAgICAgICAgaWYgKCBzcmNbcHJvcF0gPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dFtwcm9wXSA9IHNyY1twcm9wXTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBpZiAoCiAgICAgICAgdHlwZW9mIHJlc291cmNlICE9PSAnb2JqZWN0JyB8fAogICAgICAgIHNhZmUuT2JqZWN0X3RvU3RyaW5nLmNhbGwocmVzb3VyY2UpICE9PSAnW29iamVjdCBSZXF1ZXN0XScKICAgICkgewogICAgICAgIG91dC51cmwgPSBgJHtyZXNvdXJjZX1gOwogICAgfSBlbHNlIHsKICAgICAgICBsZXQgY2xvbmU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2xvbmUgPSBzYWZlLlJlcXVlc3RfY2xvbmUuY2FsbChyZXNvdXJjZSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKGNsb25lIHx8IHJlc291cmNlLCBvdXQpOwogICAgfQogICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyhvcHRpb25zLCBvdXQpOwogICAgfQogICAgcmV0dXJuIG91dDsKfQpmdW5jdGlvbiBqc29uRWRpdEZldGNoUmVxdWVzdEZuKHRydXN0ZWQsIGpzb25xID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KAogICAgICAgIGAke3RydXN0ZWQgPyAndHJ1c3RlZC0nIDogJyd9anNvbi1lZGl0LWZldGNoLXJlcXVlc3RgLAogICAgICAgIGpzb25xCiAgICApOwogICAgY29uc3QganNvbnAgPSBKU09OUGF0aC5jcmVhdGUoanNvbnEpOwogICAgaWYgKCBqc29ucC52YWxpZCA9PT0gZmFsc2UgfHwganNvbnAudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0cnVzdGVkICE9PSB0cnVlICkgewogICAgICAgIHJldHVybiBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdCYWQgSlNPTlBhdGggcXVlcnknKTsKICAgIH0KICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMik7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihleHRyYUFyZ3MucHJvcHNUb01hdGNoLCAndXJsJyk7CiAgICBjb25zdCBmaWx0ZXJCb2R5ID0gYm9keSA9PiB7CiAgICAgICAgaWYgKCB0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgIGxldCBkYXRhOwogICAgICAgIHRyeSB7IGRhdGEgPSBzYWZlLkpTT05fcGFyc2UoYm9keSk7IH0KICAgICAgICBjYXRjaCB7IH0KICAgICAgICBpZiAoIGRhdGEgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBvYmpBZnRlciA9IGpzb25wLmFwcGx5KGRhdGEpOwogICAgICAgIGlmICggb2JqQWZ0ZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHNhZmUuSlNPTl9zdHJpbmdpZnkob2JqQWZ0ZXIpOwogICAgfQogICAgY29uc3QgcHJveHlIYW5kbGVyID0gY29udGV4dCA9PiB7CiAgICAgICAgY29uc3QgYXJncyA9IGNvbnRleHQuY2FsbEFyZ3M7CiAgICAgICAgY29uc3QgWyByZXNvdXJjZSwgb3B0aW9ucyBdID0gYXJnczsKICAgICAgICBjb25zdCBib2R5QmVmb3JlID0gb3B0aW9ucz8uYm9keTsKICAgICAgICBpZiAoIEJvb2xlYW4oYm9keUJlZm9yZSkgPT09IGZhbHNlICkgeyByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7IH0KICAgICAgICBjb25zdCBib2R5QWZ0ZXIgPSBmaWx0ZXJCb2R5KGJvZHlCZWZvcmUpOwogICAgICAgIGlmICggYm9keUFmdGVyID09PSB1bmRlZmluZWQgfHwgYm9keUFmdGVyID09PSBib2R5QmVmb3JlICkgewogICAgICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgfQogICAgICAgIGlmICggcHJvcE5lZWRsZXMuc2l6ZSAhPT0gMCApIHsKICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbihyZXNvdXJjZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgcHJvcHMpOwogICAgICAgICAgICBpZiAoIG1hdGNoZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOyB9CiAgICAgICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBNYXRjaGVkICJwcm9wc1RvTWF0Y2giOlxuXHQke21hdGNoZWQuam9pbignXG5cdCcpfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0VkaXRlZCcpOwogICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYEFmdGVyIGVkaXQ6XG4ke2JvZHlBZnRlcn1gKTsKICAgICAgICB9CiAgICAgICAgb3B0aW9ucy5ib2R5ID0gYm9keUFmdGVyOwogICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgIH07CiAgICBwcm94eUFwcGx5Rm4oJ2ZldGNoJywgcHJveHlIYW5kbGVyKTsKICAgIHByb3h5QXBwbHlGbignUmVxdWVzdCcsIHByb3h5SGFuZGxlcik7Cn0KCiAgKGZ1bmN0aW9uIGpzb25FZGl0RmV0Y2hSZXF1ZXN0KGpzb25xID0gJycsIC4uLmFyZ3MpIHsKICAgIGpzb25FZGl0RmV0Y2hSZXF1ZXN0Rm4oZmFsc2UsIGpzb25xLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-json-edit-fetch-request.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCBpbXBsaWNpdCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG5lZWRsZXMgPSBuZXcgTWFwKCk7CiAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gdW5kZWZpbmVkIHx8IHByb3BzVG9NYXRjaCA9PT0gJycgKSB7IHJldHVybiBuZWVkbGVzOyB9CiAgICBjb25zdCBvcHRpb25zID0geyBjYW5OZWdhdGU6IHRydWUgfTsKICAgIGZvciAoIGNvbnN0IG5lZWRsZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHByb3BzVG9NYXRjaCwgL1xzKy8pICkgewogICAgICAgIGxldCBbIHByb3AsIHBhdHRlcm4gXSA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwobmVlZGxlLCAnOicpOwogICAgICAgIGlmICggcHJvcCA9PT0gJycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgJiYgL1teJFx3IC1dLy50ZXN0KHByb3ApICkgewogICAgICAgICAgICBwcm9wID0gYCR7cHJvcH06JHtwYXR0ZXJufWA7CiAgICAgICAgICAgIHBhdHRlcm4gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmICggcGF0dGVybiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBuZWVkbGVzLnNldChwcm9wLCBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgICB9IGVsc2UgaWYgKCBpbXBsaWNpdCAhPT0gJycgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KGltcGxpY2l0LCBzYWZlLmluaXRQYXR0ZXJuKHByb3AsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZGxlczsKfQpmdW5jdGlvbiBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgLi4ub2JqcykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBtYXRjaGVkID0gW107CiAgICBmb3IgKCBjb25zdCBvYmogb2Ygb2JqcyApIHsKICAgICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgZm9yICggY29uc3QgWyBwcm9wLCBkZXRhaWxzIF0gb2YgcHJvcE5lZWRsZXMgKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkodmFsdWUpOyB9CiAgICAgICAgICAgICAgICBjYXRjaCB7IH0KICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4oZGV0YWlscywgdmFsdWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG1hdGNoZWQucHVzaChgJHtwcm9wfTogJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0Y2hlZDsKfQpjbGFzcyBKU09OUGF0aCB7CiAgICBzdGF0aWMgY3JlYXRlKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QganNvbnAgPSBuZXcgSlNPTlBhdGgoKTsKICAgICAgICBqc29ucC5jb21waWxlKHF1ZXJ5KTsKICAgICAgICByZXR1cm4ganNvbnA7CiAgICB9CiAgICBzdGF0aWMgdG9KU09OKG9iaiwgc3RyaW5naWZpZXIsIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gKHN0cmluZ2lmaWVyIHx8IEpTT04uc3RyaW5naWZ5KShvYmosIC4uLmFyZ3MpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cLy9nLCAnXFwvJyk7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICYmIHRoaXMuI2NvbXBpbGVkLnJ2YWw7CiAgICB9CiAgICBzZXQgdmFsdWUodikgewogICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQucnZhbCA9IHY7CiAgICB9CiAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGVkICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBjb21waWxlKHF1ZXJ5KSB7CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIDApOwogICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHIuaSAhPT0gcXVlcnkubGVuZ3RoICkgewogICAgICAgICAgICBsZXQgdmFsOwogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgaWYgKCAvXj1yZXBsXCguK1wpJC8udGVzdChxdWVyeS5zbGljZShyLmkpKSApIHsKICAgICAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICdyZXBsJzsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrNiwgLTEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJys9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJysnOwogICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7IHIucnZhbCA9IEpTT04ucGFyc2UodmFsKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICB0aGlzLiNjb21waWxlZCA9IHI7CiAgICB9CiAgICBldmFsdWF0ZShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuIFtdOyB9CiAgICAgICAgdGhpcy4jcm9vdCA9IHJvb3Q7CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiBwYXRoczsKICAgIH0KICAgIGFwcGx5KHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB7IHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHRoaXMuI3Jvb3QgPSB7ICckJzogcm9vdCB9OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICBsZXQgaSA9IHBhdGhzLmxlbmd0aAogICAgICAgIGlmICggaSA9PT0gMCApIHsgdGhpcy4jcm9vdCA9IG51bGw7IHJldHVybjsgfQogICAgICAgIHdoaWxlICggaS0tICkgewogICAgICAgICAgICBjb25zdCB7IG9iaiwga2V5IH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoc1tpXSk7CiAgICAgICAgICAgIGlmICggcnZhbCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jbW9kaWZ5VmFsKG9iaiwga2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3Jvb3RbJyQnXSA/PyBudWxsOwogICAgICAgIHRoaXMuI3Jvb3QgPSBudWxsOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkdW1wKCkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLiNjb21waWxlZCk7CiAgICB9CiAgICB0b0pTT04ob2JqLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIEpTT05QYXRoLnRvSlNPTihvYmosIG51bGwsIC4uLmFyZ3MpCiAgICB9CiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7CiAgICAgICAgcmV0dXJuICdKU09OUGF0aCc7CiAgICB9CiAgICAjVU5ERUZJTkVEID0gMDsKICAgICNST09UID0gMTsKICAgICNDVVJSRU5UID0gMjsKICAgICNDSElMRFJFTiA9IDM7CiAgICAjREVTQ0VOREFOVFMgPSA0OwogICAgI3JlVW5xdW90ZWRJZGVudGlmaWVyID0gL15bQS1aYS16X11bXHddKnxeXCovOwogICAgI3JlRXhwciA9IC9eKFshPV4kKl09fFs8Pl09PykoLis/KVxdLzsKICAgICNyZUluZGljZSA9IC9eLT9cZCsvOwogICAgI3Jvb3Q7CiAgICAjY29tcGlsZWQ7CiAgICAjY29tcGlsZShxdWVyeSwgaSkgewogICAgICAgIGlmICggcXVlcnkubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBzdGVwcyA9IFtdOwogICAgICAgIGxldCBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoIGMgPT09IDB4MjQgLyogJCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNST09UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIGlmICggYyA9PT0gMHg0MCAvKiBAICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IGkgPT09IDAgPyB0aGlzLiNST09UIDogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICB9CiAgICAgICAgbGV0IG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBpID09PSBxdWVyeS5sZW5ndGggKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMgPT09IDB4MjAgLyogd2hpdGVzcGFjZSAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvdCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBjID09PSAweDJFIC8qIC4gKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcuLicsIGkpICkgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyAhPT0gMHg1QiAvKiBbICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiA9PT0gdGhpcy4jVU5ERUZJTkVEICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5hdCgtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGVwID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgICAgICBpZiAgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiBzIH0pOwogICAgICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnJhY2tldCBhY2Nlc3NvciBzeW50YXgKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbPycsIGkpICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm90ID0gcXVlcnkuY2hhckNvZGVBdChpKzIpID09PSAweDIxIC8qICEgKi87CiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSArIDIgKyAobm90ID8gMSA6IDApOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbXBpbGUocXVlcnksIGopOwogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCddJywgci5pKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgaWYgKCBub3QgKSB7IHIuc3RlcHMuYXQoLTEpLm5vdCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogbXYgfHwgdGhpcy4jQ0hJTERSRU4sIHN0ZXBzOiByLnN0ZXBzIH0pOwogICAgICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWypdJywgaSkgKSB7CiAgICAgICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6ICcqJyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKzEpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiByLnMgfSk7CiAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHsgc3RlcHMsIGkgfTsKICAgIH0KICAgICNldmFsdWF0ZShzdGVwcywgcGF0aGluKSB7CiAgICAgICAgbGV0IHJlc3VsdHNldCA9IFtdOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShzdGVwcykgPT09IGZhbHNlICkgeyByZXR1cm4gcmVzdWx0c2V0OyB9CiAgICAgICAgZm9yICggY29uc3Qgc3RlcCBvZiBzdGVwcyApIHsKICAgICAgICAgICAgc3dpdGNoICggc3RlcC5tdiApIHsKICAgICAgICAgICAgY2FzZSB0aGlzLiNST09UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBbICckJyBdIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDVVJSRU5UOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gWyBwYXRoaW4gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NISUxEUkVOOgogICAgICAgICAgICBjYXNlIHRoaXMuI0RFU0NFTkRBTlRTOgogICAgICAgICAgICAgICAgcmVzdWx0c2V0ID0gdGhpcy4jZ2V0TWF0Y2hlcyhyZXN1bHRzZXQsIHN0ZXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0c2V0OwogICAgfQogICAgI2dldE1hdGNoZXMobGlzdGluLCBzdGVwKSB7CiAgICAgICAgY29uc3QgbGlzdG91dCA9IFtdOwogICAgICAgIGZvciAoIGNvbnN0IHBhdGhpbiBvZiBsaXN0aW4gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IG93bmVyIH0gPSB0aGlzLiNyZXNvbHZlUGF0aChwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHN0ZXAuayA9PT0gJyonICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuayAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLnN0ZXBzICkgewogICAgICAgICAgICAgICAgdGhpcy4jZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0b3V0OwogICAgfQogICAgI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGZvciAoIGNvbnN0IHsgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCBdKTsKICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21LZXlzKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IGtrID0gQXJyYXkuaXNBcnJheShzdGVwLmspID8gc3RlcC5rIDogWyBzdGVwLmsgXTsKICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrKTsKICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCBub3JtYWxpemVkIF0pOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXAubXYgIT09IHRoaXMuI0RFU0NFTkRBTlRTICkgeyByZXR1cm47IH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHRydWUpICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrIG9mIGtrICkgewogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvYmpba2V5XSwgayk7CiAgICAgICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoLCBub3JtYWxpemVkIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHBhdGhpbik7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKHBhdGhpbik7IH0KICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgIT09IHRydWUgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBmb3IgKCBjb25zdCB7IG9iaiwga2V5LCBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvYmpba2V5XSkgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHEgPSBbIC4uLnBhdGhpbiwgLi4ucGF0aCBdOwogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcSk7CiAgICAgICAgICAgIGlmICggci5sZW5ndGggPT09IDAgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIG91dC5wdXNoKHEpOwogICAgICAgIH0KICAgIH0KICAgICNub3JtYWxpemVLZXkob3duZXIsIGtleSkgewogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5ID49IDAgPyBrZXkgOiBvd25lci5sZW5ndGggKyBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgICNnZXREZXNjZW5kYW50cyh2LCByZWN1cnNpdmUpIHsKICAgICAgICBjb25zdCBpdGVyYXRvciA9IHsKICAgICAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmICggbiA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gdGhpcy5zdGFja1tuLTFdOwogICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBkZXRhaWxzLmtleXMubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKCBlbnRyeS5kb25lICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucGF0aFtuLTFdID0gZW50cnkudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIG9iajogZGV0YWlscy5vYmosCiAgICAgICAgICAgICAgICAgICAga2V5OiBlbnRyeS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGguc2xpY2UoKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZS5vYmpbdGhpcy52YWx1ZS5rZXldOwogICAgICAgICAgICAgICAgaWYgKCByZWN1cnNpdmUgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXRoOiBbXSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9LAogICAgICAgIH07CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHYpICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgIH0KICAgICNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IGtleXMgPSBbXTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGNvbnN0IGMwID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHg1RCAvKiBdICovICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJDIC8qICwgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDI3IC8qICcgKi8gKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDI3IC8qICcgKi8sIGkrMSkKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGtleXMucHVzaChyLnMpOwogICAgICAgICAgICAgICAgaSA9IHIuaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkQgLyogLSAqLyB8fCBjMCA+PSAweDMwICYmIGMwIDw9IDB4MzkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlSW5kaWNlLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCBpbmRpY2UgPSBwYXJzZUludChxdWVyeS5zbGljZShpKSwgMTApOwogICAgICAgICAgICAgICAga2V5cy5wdXNoKGluZGljZSk7CiAgICAgICAgICAgICAgICBpICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgaWYgKCBzID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBrZXlzLnB1c2gocyk7CiAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IGtleXMubGVuZ3RoID09PSAxID8ga2V5c1swXSA6IGtleXMsIGkgfTsKICAgIH0KICAgICNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZVVucXVvdGVkSWRlbnRpZmllci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4gbWF0Y2hbMF07CiAgICB9CiAgICAjdW50aWxDaGFyKHF1ZXJ5LCB0YXJnZXRDaGFyQ29kZSwgaSkgewogICAgICAgIGNvbnN0IGxlbiA9IHF1ZXJ5Lmxlbmd0aDsKICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIGxldCBiZWcgPSBpLCBlbmQgPSBpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCBlbmQgPT09IGxlbiApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCk7CiAgICAgICAgICAgIGlmICggYyA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYyA9PT0gMHg1QyAvKiBcICovICYmIChlbmQrMSkgPCBsZW4gKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkID0gcXVlcnkuY2hhckNvZGVBdChlbmQrMSk7CiAgICAgICAgICAgICAgICBpZiAoIGQgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICAgICAgICAgICAgICBiZWcgPSBlbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHM6IHBhcnRzLmpvaW4oJycpLCBpOiBlbmQgfTsKICAgIH0KICAgICNjb21waWxlRXhwcihxdWVyeSwgc3RlcCwgaSkgewogICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPS8nLCBpKSApIHsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyRiAvKiAvICovLCBpKzIpOwogICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGk7IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXltpXS8uZXhlYyhxdWVyeS5zbGljZShyLmkpKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHN0ZXAucnZhbCA9IG5ldyBSZWdFeHAoci5zLCBtYXRjaCAmJiBtYXRjaFswXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAub3AgPSAncmUnOwogICAgICAgICAgICBpZiAoIG1hdGNoICkgeyByLmkgKz0gbWF0Y2hbMF0ubGVuZ3RoOyB9CiAgICAgICAgICAgIHJldHVybiByLmk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVFeHByLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiBpOyB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RlcC5ydmFsID0gSlNPTi5wYXJzZShtYXRjaFsyXSk7CiAgICAgICAgICAgIHN0ZXAub3AgPSBtYXRjaFsxXTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkgKyBtYXRjaFsxXS5sZW5ndGggKyBtYXRjaFsyXS5sZW5ndGg7CiAgICB9CiAgICAjcmVzb2x2ZVBhdGgocGF0aCkgewogICAgICAgIGlmICggcGF0aC5sZW5ndGggPT09IDAgKSB7IHJldHVybiB7IHZhbHVlOiB0aGlzLiNyb290IH07IH0KICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmF0KC0xKTsKICAgICAgICBsZXQgb2JqID0gdGhpcy4jcm9vdAogICAgICAgIGZvciAoIGxldCBpID0gMCwgbiA9IHBhdGgubGVuZ3RoLTE7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgb2JqLCBrZXksIHZhbHVlOiBvYmpba2V5XSB9OwogICAgfQogICAgI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCBvd25lciA9PT0gdW5kZWZpbmVkIHx8IG93bmVyID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSB0aGlzLiNub3JtYWxpemVLZXkob3duZXIsIGtleSk7CiAgICAgICAgY29uc3QgaGFzT3duID0gT2JqZWN0Lmhhc093bihvd25lciwgayk7CiAgICAgICAgaWYgKCBzdGVwLm9wICE9PSB1bmRlZmluZWQgJiYgaGFzT3duID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gc3RlcC5ub3QgIT09IHRydWU7CiAgICAgICAgY29uc3QgdiA9IG93bmVyW2tdOwogICAgICAgIGxldCBvdXRjb21lID0gZmFsc2U7CiAgICAgICAgc3dpdGNoICggc3RlcC5vcCApIHsKICAgICAgICBjYXNlICc9PSc6IG91dGNvbWUgPSAodiA9PT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICchPSc6IG91dGNvbWUgPSAodiAhPT0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPCc6IG91dGNvbWUgPSAodiA8IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPD0nOiBvdXRjb21lID0gKHYgPD0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICAnPic6IG91dGNvbWUgPSAodiA+IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnPj0nOiBvdXRjb21lID0gKHYgPj0gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdePSc6IG91dGNvbWUgPSBgJHt2fWAuc3RhcnRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyQ9Jzogb3V0Y29tZSA9IGAke3Z9YC5lbmRzV2l0aChzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyo9Jzogb3V0Y29tZSA9IGAke3Z9YC5pbmNsdWRlcyhzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ3JlJzogb3V0Y29tZSA9IHN0ZXAucnZhbC50ZXN0KGAke3Z9YCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IG91dGNvbWUgPSBoYXNPd24gPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0Y29tZSApIHsgcmV0dXJuIGs7IH0KICAgIH0KICAgICNtb2RpZnlWYWwob2JqLCBrZXkpIHsKICAgICAgICBjb25zdCB7IG1vZGlmeSwgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgc3dpdGNoICggbW9kaWZ5ICkgewogICAgICAgIGNhc2UgdW5kZWZpbmVkOgogICAgICAgICAgICBvYmpba2V5XSA9IHJ2YWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJysnOiB7CiAgICAgICAgICAgIGlmICggcnZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggbHZhbCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkobHZhbCkgKSB7IHJldHVybjsgfQogICAgICAgICAgICBmb3IgKCBjb25zdCBbIGssIHYgXSBvZiBPYmplY3QuZW50cmllcyhydmFsKSApIHsKICAgICAgICAgICAgICAgIGx2YWxba10gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICdyZXBsJzogewogICAgICAgICAgICBjb25zdCBsdmFsID0gb2JqW2tleV07CiAgICAgICAgICAgIGlmICggdHlwZW9mIGx2YWwgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBudWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IHJ2YWwucmVnZXggIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWdFeHAocnZhbC5yZWdleCwgcnZhbC5mbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKHJ2YWwucGF0dGVybi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgb2JqW2tleV0gPSBsdmFsLnJlcGxhY2UodGhpcy4jY29tcGlsZWQucmUsIHJ2YWwucmVwbGFjZW1lbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuKHJlc291cmNlLCBvcHRpb25zKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHByb3BzID0gWwogICAgICAgICdib2R5JywgJ2NhY2hlJywgJ2NyZWRlbnRpYWxzJywgJ2R1cGxleCcsICdoZWFkZXJzJywKICAgICAgICAnaW50ZWdyaXR5JywgJ2tlZXBhbGl2ZScsICdtZXRob2QnLCAnbW9kZScsICdwcmlvcml0eScsCiAgICAgICAgJ3JlZGlyZWN0JywgJ3JlZmVycmVyJywgJ3JlZmVycmVyUG9saWN5JywgJ3VybCcKICAgIF07CiAgICBjb25zdCBvdXQgPSB7fTsKICAgIGlmICggY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9IChzcmMsIG91dCkgPT4gewogICAgICAgICAgICBmb3IgKCBjb25zdCBwcm9wIG9mIHByb3BzICkgewogICAgICAgICAgICAgICAgaWYgKCBzcmNbcHJvcF0gPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dFtwcm9wXSA9IHNyY1twcm9wXTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBpZiAoCiAgICAgICAgdHlwZW9mIHJlc291cmNlICE9PSAnb2JqZWN0JyB8fAogICAgICAgIHNhZmUuT2JqZWN0X3RvU3RyaW5nLmNhbGwocmVzb3VyY2UpICE9PSAnW29iamVjdCBSZXF1ZXN0XScKICAgICkgewogICAgICAgIG91dC51cmwgPSBgJHtyZXNvdXJjZX1gOwogICAgfSBlbHNlIHsKICAgICAgICBsZXQgY2xvbmU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2xvbmUgPSBzYWZlLlJlcXVlc3RfY2xvbmUuY2FsbChyZXNvdXJjZSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKGNsb25lIHx8IHJlc291cmNlLCBvdXQpOwogICAgfQogICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyhvcHRpb25zLCBvdXQpOwogICAgfQogICAgcmV0dXJuIG91dDsKfQpmdW5jdGlvbiBqc29uRWRpdEZldGNoUmVxdWVzdEZuKHRydXN0ZWQsIGpzb25xID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KAogICAgICAgIGAke3RydXN0ZWQgPyAndHJ1c3RlZC0nIDogJyd9anNvbi1lZGl0LWZldGNoLXJlcXVlc3RgLAogICAgICAgIGpzb25xCiAgICApOwogICAgY29uc3QganNvbnAgPSBKU09OUGF0aC5jcmVhdGUoanNvbnEpOwogICAgaWYgKCBqc29ucC52YWxpZCA9PT0gZmFsc2UgfHwganNvbnAudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0cnVzdGVkICE9PSB0cnVlICkgewogICAgICAgIHJldHVybiBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdCYWQgSlNPTlBhdGggcXVlcnknKTsKICAgIH0KICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMik7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihleHRyYUFyZ3MucHJvcHNUb01hdGNoLCAndXJsJyk7CiAgICBjb25zdCBmaWx0ZXJCb2R5ID0gYm9keSA9PiB7CiAgICAgICAgaWYgKCB0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgIGxldCBkYXRhOwogICAgICAgIHRyeSB7IGRhdGEgPSBzYWZlLkpTT05fcGFyc2UoYm9keSk7IH0KICAgICAgICBjYXRjaCB7IH0KICAgICAgICBpZiAoIGRhdGEgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBvYmpBZnRlciA9IGpzb25wLmFwcGx5KGRhdGEpOwogICAgICAgIGlmICggb2JqQWZ0ZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIHNhZmUuSlNPTl9zdHJpbmdpZnkob2JqQWZ0ZXIpOwogICAgfQogICAgY29uc3QgcHJveHlIYW5kbGVyID0gY29udGV4dCA9PiB7CiAgICAgICAgY29uc3QgYXJncyA9IGNvbnRleHQuY2FsbEFyZ3M7CiAgICAgICAgY29uc3QgWyByZXNvdXJjZSwgb3B0aW9ucyBdID0gYXJnczsKICAgICAgICBjb25zdCBib2R5QmVmb3JlID0gb3B0aW9ucz8uYm9keTsKICAgICAgICBpZiAoIEJvb2xlYW4oYm9keUJlZm9yZSkgPT09IGZhbHNlICkgeyByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7IH0KICAgICAgICBjb25zdCBib2R5QWZ0ZXIgPSBmaWx0ZXJCb2R5KGJvZHlCZWZvcmUpOwogICAgICAgIGlmICggYm9keUFmdGVyID09PSB1bmRlZmluZWQgfHwgYm9keUFmdGVyID09PSBib2R5QmVmb3JlICkgewogICAgICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgfQogICAgICAgIGlmICggcHJvcE5lZWRsZXMuc2l6ZSAhPT0gMCApIHsKICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbihyZXNvdXJjZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgcHJvcHMpOwogICAgICAgICAgICBpZiAoIG1hdGNoZWQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOyB9CiAgICAgICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBNYXRjaGVkICJwcm9wc1RvTWF0Y2giOlxuXHQke21hdGNoZWQuam9pbignXG5cdCcpfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0VkaXRlZCcpOwogICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYEFmdGVyIGVkaXQ6XG4ke2JvZHlBZnRlcn1gKTsKICAgICAgICB9CiAgICAgICAgb3B0aW9ucy5ib2R5ID0gYm9keUFmdGVyOwogICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgIH07CiAgICBwcm94eUFwcGx5Rm4oJ2ZldGNoJywgcHJveHlIYW5kbGVyKTsKICAgIHByb3h5QXBwbHlGbignUmVxdWVzdCcsIHByb3h5SGFuZGxlcik7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRKc29uRWRpdEZldGNoUmVxdWVzdChqc29ucSA9ICcnLCAuLi5hcmdzKSB7CiAgICBqc29uRWRpdEZldGNoUmVxdWVzdEZuKHRydWUsIGpzb25xLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"jsonl-edit-xhr-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmZ1bmN0aW9uIGpzb25sRWRpdEZuKGpzb25wLCB0ZXh0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbGluZVNlcGFyYXRvciA9IC9ccj9cbi8uZXhlYyh0ZXh0KT8uWzBdIHx8ICdcbic7CiAgICBjb25zdCBsaW5lc0JlZm9yZSA9IHRleHQuc3BsaXQoJ1xuJyk7CiAgICBjb25zdCBsaW5lc0FmdGVyID0gW107CiAgICBmb3IgKCBjb25zdCBsaW5lQmVmb3JlIG9mIGxpbmVzQmVmb3JlICkgewogICAgICAgIGxldCBvYmo7CiAgICAgICAgdHJ5IHsgb2JqID0gc2FmZS5KU09OX3BhcnNlKGxpbmVCZWZvcmUpOyB9IGNhdGNoIHsgfQogICAgICAgIGlmICggdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsICkgewogICAgICAgICAgICBsaW5lc0FmdGVyLnB1c2gobGluZUJlZm9yZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBvYmpBZnRlciA9IGpzb25wLmFwcGx5KG9iaik7CiAgICAgICAgaWYgKCBvYmpBZnRlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBsaW5lc0FmdGVyLnB1c2gobGluZUJlZm9yZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBsaW5lQWZ0ZXIgPSBzYWZlLkpTT05fc3RyaW5naWZ5KG9iakFmdGVyKTsKICAgICAgICBsaW5lc0FmdGVyLnB1c2gobGluZUFmdGVyKTsKICAgIH0KICAgIHJldHVybiBsaW5lc0FmdGVyLmpvaW4obGluZVNlcGFyYXRvcik7Cn0KY2xhc3MgSlNPTlBhdGggewogICAgc3RhdGljIGNyZWF0ZShxdWVyeSkgewogICAgICAgIGNvbnN0IGpzb25wID0gbmV3IEpTT05QYXRoKCk7CiAgICAgICAganNvbnAuY29tcGlsZShxdWVyeSk7CiAgICAgICAgcmV0dXJuIGpzb25wOwogICAgfQogICAgc3RhdGljIHRvSlNPTihvYmosIHN0cmluZ2lmaWVyLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIChzdHJpbmdpZmllciB8fCBKU09OLnN0cmluZ2lmeSkob2JqLCAuLi5hcmdzKQogICAgICAgICAgICAucmVwbGFjZSgvXC8vZywgJ1xcLycpOwogICAgfQogICAgZ2V0IHZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlZCAmJiB0aGlzLiNjb21waWxlZC5ydmFsOwogICAgfQogICAgc2V0IHZhbHVlKHYpIHsKICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIHRoaXMuI2NvbXBpbGVkLnJ2YWwgPSB2OwogICAgfQogICAgZ2V0IHZhbGlkKCkgewogICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlZCAhPT0gdW5kZWZpbmVkOwogICAgfQogICAgY29tcGlsZShxdWVyeSkgewogICAgICAgIHRoaXMuI2NvbXBpbGVkID0gdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLiNjb21waWxlKHF1ZXJ5LCAwKTsKICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCByLmkgIT09IHF1ZXJ5Lmxlbmd0aCApIHsKICAgICAgICAgICAgbGV0IHZhbDsKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCc9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIGlmICggL149cmVwbFwoLitcKSQvLnRlc3QocXVlcnkuc2xpY2Uoci5pKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgci5tb2RpZnkgPSAncmVwbCc7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzYsIC0xKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcrPScsIHIuaSkgKSB7CiAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICcrJzsKICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSsyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgeyByLnJ2YWwgPSBKU09OLnBhcnNlKHZhbCk7IH0KICAgICAgICAgICAgY2F0Y2ggeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSByOwogICAgfQogICAgZXZhbHVhdGUocm9vdCkgewogICAgICAgIGlmICggdGhpcy52YWxpZCA9PT0gZmFsc2UgKSB7IHJldHVybiBbXTsgfQogICAgICAgIHRoaXMuI3Jvb3QgPSByb290OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICB0aGlzLiNyb290ID0gbnVsbDsKICAgICAgICByZXR1cm4gcGF0aHM7CiAgICB9CiAgICBhcHBseShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgeyBydmFsIH0gPSB0aGlzLiNjb21waWxlZDsKICAgICAgICB0aGlzLiNyb290ID0geyAnJCc6IHJvb3QgfTsKICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuI2V2YWx1YXRlKHRoaXMuI2NvbXBpbGVkLnN0ZXBzLCBbXSk7CiAgICAgICAgbGV0IGkgPSBwYXRocy5sZW5ndGgKICAgICAgICBpZiAoIGkgPT09IDAgKSB7IHRoaXMuI3Jvb3QgPSBudWxsOyByZXR1cm47IH0KICAgICAgICB3aGlsZSAoIGktLSApIHsKICAgICAgICAgICAgY29uc3QgeyBvYmosIGtleSB9ID0gdGhpcy4jcmVzb2x2ZVBhdGgocGF0aHNbaV0pOwogICAgICAgICAgICBpZiAoIHJ2YWwgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHRoaXMuI21vZGlmeVZhbChvYmosIGtleSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkob2JqKSAmJiB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgICAgIG9iai5zcGxpY2Uoa2V5LCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpba2V5XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNyb290WyckJ10gPz8gbnVsbDsKICAgICAgICB0aGlzLiNyb290ID0gbnVsbDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZHVtcCgpIHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy4jY29tcGlsZWQpOwogICAgfQogICAgdG9KU09OKG9iaiwgLi4uYXJncykgewogICAgICAgIHJldHVybiBKU09OUGF0aC50b0pTT04ob2JqLCBudWxsLCAuLi5hcmdzKQogICAgfQogICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkgewogICAgICAgIHJldHVybiAnSlNPTlBhdGgnOwogICAgfQogICAgI1VOREVGSU5FRCA9IDA7CiAgICAjUk9PVCA9IDE7CiAgICAjQ1VSUkVOVCA9IDI7CiAgICAjQ0hJTERSRU4gPSAzOwogICAgI0RFU0NFTkRBTlRTID0gNDsKICAgICNyZVVucXVvdGVkSWRlbnRpZmllciA9IC9eW0EtWmEtel9dW1x3XSp8XlwqLzsKICAgICNyZUV4cHIgPSAvXihbIT1eJCpdPXxbPD5dPT8pKC4rPylcXS87CiAgICAjcmVJbmRpY2UgPSAvXi0/XGQrLzsKICAgICNyb290OwogICAgI2NvbXBpbGVkOwogICAgI2NvbXBpbGUocXVlcnksIGkpIHsKICAgICAgICBpZiAoIHF1ZXJ5Lmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3Qgc3RlcHMgPSBbXTsKICAgICAgICBsZXQgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgaWYgKCBjID09PSAweDI0IC8qICQgKi8gKSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogdGhpcy4jUk9PVCB9KTsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0gZWxzZSBpZiAoIGMgPT09IDB4NDAgLyogQCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNDVVJSRU5UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiBpID09PSAwID8gdGhpcy4jUk9PVCA6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgfQogICAgICAgIGxldCBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICggaSA9PT0gcXVlcnkubGVuZ3RoICkgeyBicmVhazsgfQogICAgICAgICAgICBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjID09PSAweDIwIC8qIHdoaXRlc3BhY2UgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBEb3QgYWNjZXNzb3Igc3ludGF4CiAgICAgICAgICAgIGlmICggYyA9PT0gMHgyRSAvKiAuICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiAhPT0gdGhpcy4jVU5ERUZJTkVEICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnLi4nLCBpKSApIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMgIT09IDB4NUIgLyogWyAqLyApIHsKICAgICAgICAgICAgICAgIGlmICggbXYgPT09IHRoaXMuI1VOREVGSU5FRCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwID0gc3RlcHMuYXQoLTEpOwogICAgICAgICAgICAgICAgICAgIGlmICggc3RlcCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy4jY29tcGlsZUV4cHIocXVlcnksIHN0ZXAsIGkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpOwogICAgICAgICAgICAgICAgaWYgICggcyA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogcyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJyYWNrZXQgYWNjZXNzb3Igc3ludGF4CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWz8nLCBpKSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5vdCA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSsyKSA9PT0gMHgyMSAvKiAhICovOwogICAgICAgICAgICAgICAgY29uc3QgaiA9IGkgKyAyICsgKG5vdCA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNjb21waWxlKHF1ZXJ5LCBqKTsKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnXScsIHIuaSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGlmICggbm90ICkgeyByLnN0ZXBzLmF0KC0xKS5ub3QgPSB0cnVlOyB9CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IG12IHx8IHRoaXMuI0NISUxEUkVOLCBzdGVwczogci5zdGVwcyB9KTsKICAgICAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ1sqXScsIGkpICkgewogICAgICAgICAgICAgICAgbXYgfHw9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiAnKicgfSk7CiAgICAgICAgICAgICAgICBpICs9IDM7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSsxKTsKICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogci5zIH0pOwogICAgICAgICAgICBpID0gci5pICsgMTsKICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgfQogICAgICAgIGlmICggc3RlcHMubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgIHJldHVybiB7IHN0ZXBzLCBpIH07CiAgICB9CiAgICAjZXZhbHVhdGUoc3RlcHMsIHBhdGhpbikgewogICAgICAgIGxldCByZXN1bHRzZXQgPSBbXTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkoc3RlcHMpID09PSBmYWxzZSApIHsgcmV0dXJuIHJlc3VsdHNldDsgfQogICAgICAgIGZvciAoIGNvbnN0IHN0ZXAgb2Ygc3RlcHMgKSB7CiAgICAgICAgICAgIHN3aXRjaCAoIHN0ZXAubXYgKSB7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jUk9PVDoKICAgICAgICAgICAgICAgIHJlc3VsdHNldCA9IFsgWyAnJCcgXSBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jQ1VSUkVOVDoKICAgICAgICAgICAgICAgIHJlc3VsdHNldCA9IFsgcGF0aGluIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDSElMRFJFTjoKICAgICAgICAgICAgY2FzZSB0aGlzLiNERVNDRU5EQU5UUzoKICAgICAgICAgICAgICAgIHJlc3VsdHNldCA9IHRoaXMuI2dldE1hdGNoZXMocmVzdWx0c2V0LCBzdGVwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdHNldDsKICAgIH0KICAgICNnZXRNYXRjaGVzKGxpc3Rpbiwgc3RlcCkgewogICAgICAgIGNvbnN0IGxpc3RvdXQgPSBbXTsKICAgICAgICBmb3IgKCBjb25zdCBwYXRoaW4gb2YgbGlzdGluICkgewogICAgICAgICAgICBjb25zdCB7IHZhbHVlOiBvd25lciB9ID0gdGhpcy4jcmVzb2x2ZVBhdGgocGF0aGluKTsKICAgICAgICAgICAgaWYgKCBzdGVwLmsgPT09ICcqJyApIHsKICAgICAgICAgICAgICAgIHRoaXMuI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLmsgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHRoaXMuI2dldE1hdGNoZXNGcm9tS2V5cyhwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggc3RlcC5zdGVwcyApIHsKICAgICAgICAgICAgICAgIHRoaXMuI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlzdG91dDsKICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUFsbChwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBmb3IgKCBjb25zdCB7IHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgcmVjdXJzaXZlKSApIHsKICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIC4uLnBhdGggXSk7CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tS2V5cyhwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCBrayA9IEFycmF5LmlzQXJyYXkoc3RlcC5rKSA/IHN0ZXAuayA6IFsgc3RlcC5rIF07CiAgICAgICAgZm9yICggY29uc3QgayBvZiBrayApIHsKICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwgayk7CiAgICAgICAgICAgIGlmICggbm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgbm9ybWFsaXplZCBdKTsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwLm12ICE9PSB0aGlzLiNERVNDRU5EQU5UUyApIHsgcmV0dXJuOyB9CiAgICAgICAgZm9yICggY29uc3QgeyBvYmosIGtleSwgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCB0cnVlKSApIHsKICAgICAgICAgICAgZm9yICggY29uc3QgayBvZiBrayApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLiNldmFsdWF0ZUV4cHIoc3RlcCwgb2JqW2tleV0sIGspOwogICAgICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCwgbm9ybWFsaXplZCBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUV4cHIocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3QgcmVjdXJzaXZlID0gc3RlcC5tdiA9PT0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNldmFsdWF0ZShzdGVwLnN0ZXBzLCBwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHIubGVuZ3RoICE9PSAwICkgeyBvdXQucHVzaChwYXRoaW4pOyB9CiAgICAgICAgICAgIGlmICggcmVjdXJzaXZlICE9PSB0cnVlICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgZm9yICggY29uc3QgeyBvYmosIGtleSwgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob2JqW2tleV0pICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBjb25zdCBxID0gWyAuLi5wYXRoaW4sIC4uLnBhdGggXTsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHEpOwogICAgICAgICAgICBpZiAoIHIubGVuZ3RoID09PSAwICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBvdXQucHVzaChxKTsKICAgICAgICB9CiAgICB9CiAgICAjbm9ybWFsaXplS2V5KG93bmVyLCBrZXkpIHsKICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGtleSA+PSAwID8ga2V5IDogb3duZXIubGVuZ3RoICsga2V5OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBrZXk7CiAgICB9CiAgICAjZ2V0RGVzY2VuZGFudHModiwgcmVjdXJzaXZlKSB7CiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7CiAgICAgICAgICAgIG5leHQoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoIG4gPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHRoaXMuc3RhY2tbbi0xXTsKICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZGV0YWlscy5rZXlzLm5leHQoKTsKICAgICAgICAgICAgICAgIGlmICggZW50cnkuZG9uZSApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucGF0aC5wb3AoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnBhdGhbbi0xXSA9IGVudHJ5LnZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsKICAgICAgICAgICAgICAgICAgICBvYmo6IGRldGFpbHMub2JqLAogICAgICAgICAgICAgICAgICAgIGtleTogZW50cnkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoLnNsaWNlKCksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMudmFsdWUub2JqW3RoaXMudmFsdWUua2V5XTsKICAgICAgICAgICAgICAgIGlmICggcmVjdXJzaXZlICkgewogICAgICAgICAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheSh2KSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiBPYmplY3Qua2V5cyh2KS52YWx1ZXMoKSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcGF0aDogW10sCiAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIGRvbmU6IGZhbHNlLAogICAgICAgICAgICBzdGFjazogW10sCiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpczsgfSwKICAgICAgICB9OwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheSh2KSApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogdi5rZXlzKCkgfSk7CiAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaXRlcmF0b3I7CiAgICB9CiAgICAjY29uc3VtZUlkZW50aWZpZXIocXVlcnksIGkpIHsKICAgICAgICBjb25zdCBrZXlzID0gW107CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBjb25zdCBjMCA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4NUQgLyogXSAqLyApIHsgYnJlYWs7IH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyQyAvKiAsICovICkgewogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyNyAvKiAnICovICkgewogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyNyAvKiAnICovLCBpKzEpCiAgICAgICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBrZXlzLnB1c2goci5zKTsKICAgICAgICAgICAgICAgIGkgPSByLmk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJEIC8qIC0gKi8gfHwgYzAgPj0gMHgzMCAmJiBjMCA8PSAweDM5ICkgewogICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZUluZGljZS5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgY29uc3QgaW5kaWNlID0gcGFyc2VJbnQocXVlcnkuc2xpY2UoaSksIDEwKTsKICAgICAgICAgICAgICAgIGtleXMucHVzaChpbmRpY2UpOwogICAgICAgICAgICAgICAgaSArPSBtYXRjaFswXS5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgIGlmICggcyA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAga2V5cy5wdXNoKHMpOwogICAgICAgICAgICBpICs9IHMubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzOiBrZXlzLmxlbmd0aCA9PT0gMSA/IGtleXNbMF0gOiBrZXlzLCBpIH07CiAgICB9CiAgICAjY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVVbnF1b3RlZElkZW50aWZpZXIuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIG1hdGNoWzBdOwogICAgfQogICAgI3VudGlsQ2hhcihxdWVyeSwgdGFyZ2V0Q2hhckNvZGUsIGkpIHsKICAgICAgICBjb25zdCBsZW4gPSBxdWVyeS5sZW5ndGg7CiAgICAgICAgY29uc3QgcGFydHMgPSBbXTsKICAgICAgICBsZXQgYmVnID0gaSwgZW5kID0gaTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICggZW5kID09PSBsZW4gKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBjID0gcXVlcnkuY2hhckNvZGVBdChlbmQpOwogICAgICAgICAgICBpZiAoIGMgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgcGFydHMucHVzaChxdWVyeS5zbGljZShiZWcsIGVuZCkpOwogICAgICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMgPT09IDB4NUMgLyogXCAqLyAmJiAoZW5kKzEpIDwgbGVuICkgewogICAgICAgICAgICAgICAgY29uc3QgZCA9IHF1ZXJ5LmNoYXJDb2RlQXQoZW5kKzEpOwogICAgICAgICAgICAgICAgaWYgKCBkID09PSB0YXJnZXRDaGFyQ29kZSApIHsKICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgICAgICAgICAgICAgYmVnID0gZW5kOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzOiBwYXJ0cy5qb2luKCcnKSwgaTogZW5kIH07CiAgICB9CiAgICAjY29tcGlsZUV4cHIocXVlcnksIHN0ZXAsIGkpIHsKICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0vJywgaSkgKSB7CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiN1bnRpbENoYXIocXVlcnksIDB4MkYgLyogLyAqLywgaSsyKTsKICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBpOyB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15baV0vLmV4ZWMocXVlcnkuc2xpY2Uoci5pKSk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBzdGVwLnJ2YWwgPSBuZXcgUmVnRXhwKHIucywgbWF0Y2ggJiYgbWF0Y2hbMF0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGVwLm9wID0gJ3JlJzsKICAgICAgICAgICAgaWYgKCBtYXRjaCApIHsgci5pICs9IG1hdGNoWzBdLmxlbmd0aDsgfQogICAgICAgICAgICByZXR1cm4gci5pOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlRXhwci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm4gaTsgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0ZXAucnZhbCA9IEpTT04ucGFyc2UobWF0Y2hbMl0pOwogICAgICAgICAgICBzdGVwLm9wID0gbWF0Y2hbMV07CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpICsgbWF0Y2hbMV0ubGVuZ3RoICsgbWF0Y2hbMl0ubGVuZ3RoOwogICAgfQogICAgI3Jlc29sdmVQYXRoKHBhdGgpIHsKICAgICAgICBpZiAoIHBhdGgubGVuZ3RoID09PSAwICkgeyByZXR1cm4geyB2YWx1ZTogdGhpcy4jcm9vdCB9OyB9CiAgICAgICAgY29uc3Qga2V5ID0gcGF0aC5hdCgtMSk7CiAgICAgICAgbGV0IG9iaiA9IHRoaXMuI3Jvb3QKICAgICAgICBmb3IgKCBsZXQgaSA9IDAsIG4gPSBwYXRoLmxlbmd0aC0xOyBpIDwgbjsgaSsrICkgewogICAgICAgICAgICBvYmogPSBvYmpbcGF0aFtpXV07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IG9iaiwga2V5LCB2YWx1ZTogb2JqW2tleV0gfTsKICAgIH0KICAgICNldmFsdWF0ZUV4cHIoc3RlcCwgb3duZXIsIGtleSkgewogICAgICAgIGlmICggb3duZXIgPT09IHVuZGVmaW5lZCB8fCBvd25lciA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBjb25zdCBrID0gdGhpcy4jbm9ybWFsaXplS2V5KG93bmVyLCBrZXkpOwogICAgICAgIGNvbnN0IGhhc093biA9IE9iamVjdC5oYXNPd24ob3duZXIsIGspOwogICAgICAgIGlmICggc3RlcC5vcCAhPT0gdW5kZWZpbmVkICYmIGhhc093biA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRhcmdldCA9IHN0ZXAubm90ICE9PSB0cnVlOwogICAgICAgIGNvbnN0IHYgPSBvd25lcltrXTsKICAgICAgICBsZXQgb3V0Y29tZSA9IGZhbHNlOwogICAgICAgIHN3aXRjaCAoIHN0ZXAub3AgKSB7CiAgICAgICAgY2FzZSAnPT0nOiBvdXRjb21lID0gKHYgPT09IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnIT0nOiBvdXRjb21lID0gKHYgIT09IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAgJzwnOiBvdXRjb21lID0gKHYgPCBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJzw9Jzogb3V0Y29tZSA9ICh2IDw9IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAgJz4nOiBvdXRjb21lID0gKHYgPiBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJz49Jzogb3V0Y29tZSA9ICh2ID49IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnXj0nOiBvdXRjb21lID0gYCR7dn1gLnN0YXJ0c1dpdGgoc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICckPSc6IG91dGNvbWUgPSBgJHt2fWAuZW5kc1dpdGgoc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICcqPSc6IG91dGNvbWUgPSBgJHt2fWAuaW5jbHVkZXMoc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdyZSc6IG91dGNvbWUgPSBzdGVwLnJ2YWwudGVzdChgJHt2fWApOyBicmVhazsKICAgICAgICBkZWZhdWx0OiBvdXRjb21lID0gaGFzT3duID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoIG91dGNvbWUgKSB7IHJldHVybiBrOyB9CiAgICB9CiAgICAjbW9kaWZ5VmFsKG9iaiwga2V5KSB7CiAgICAgICAgY29uc3QgeyBtb2RpZnksIHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHN3aXRjaCAoIG1vZGlmeSApIHsKICAgICAgICBjYXNlIHVuZGVmaW5lZDoKICAgICAgICAgICAgb2JqW2tleV0gPSBydmFsOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICcrJzogewogICAgICAgICAgICBpZiAoIHJ2YWwgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3QgbHZhbCA9IG9ialtrZXldOwogICAgICAgICAgICBpZiAoIGx2YWwgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KGx2YWwpICkgeyByZXR1cm47IH0KICAgICAgICAgICAgZm9yICggY29uc3QgWyBrLCB2IF0gb2YgT2JqZWN0LmVudHJpZXMocnZhbCkgKSB7CiAgICAgICAgICAgICAgICBsdmFsW2tdID0gdjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAncmVwbCc6IHsKICAgICAgICAgICAgY29uc3QgbHZhbCA9IG9ialtrZXldOwogICAgICAgICAgICBpZiAoIHR5cGVvZiBsdmFsICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQucmUgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHRoaXMuI2NvbXBpbGVkLnJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBydmFsLnJlZ2V4ICE9PSB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVnRXhwKHJ2YWwucmVnZXgsIHJ2YWwuZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlZ0V4cChydmFsLnBhdHRlcm4ucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJykpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG9ialtrZXldID0gbHZhbC5yZXBsYWNlKHRoaXMuI2NvbXBpbGVkLnJlLCBydmFsLnJlcGxhY2VtZW50KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQpmdW5jdGlvbiBqc29ubEVkaXRYaHJSZXNwb25zZUZuKHRydXN0ZWQsIGpzb25xID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KAogICAgICAgIGAke3RydXN0ZWQgPyAndHJ1c3RlZC0nIDogJyd9anNvbmwtZWRpdC14aHItcmVzcG9uc2VgLAogICAgICAgIGpzb25xCiAgICApOwogICAgY29uc3QgeGhySW5zdGFuY2VzID0gbmV3IFdlYWtNYXAoKTsKICAgIGNvbnN0IGpzb25wID0gSlNPTlBhdGguY3JlYXRlKGpzb25xKTsKICAgIGlmICgganNvbnAudmFsaWQgPT09IGZhbHNlIHx8IGpzb25wLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHJ1c3RlZCAhPT0gdHJ1ZSApIHsKICAgICAgICByZXR1cm4gc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnQmFkIEpTT05QYXRoIHF1ZXJ5Jyk7CiAgICB9CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDIpOwogICAgY29uc3QgcHJvcE5lZWRsZXMgPSBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4oZXh0cmFBcmdzLnByb3BzVG9NYXRjaCwgJ3VybCcpOwogICAgc2VsZi5YTUxIdHRwUmVxdWVzdCA9IGNsYXNzIGV4dGVuZHMgc2VsZi5YTUxIdHRwUmVxdWVzdCB7CiAgICAgICAgb3BlbihtZXRob2QsIHVybCwgLi4uYXJncykgewogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geyBtZXRob2QsIHVybCB9OwogICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gcHJvcE5lZWRsZXMuc2l6ZSA9PT0gMCB8fAogICAgICAgICAgICAgICAgbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHhockRldGFpbHMpOwogICAgICAgICAgICBpZiAoIG1hdGNoZWQgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICYmIEFycmF5LmlzQXJyYXkobWF0Y2hlZCkgKSB7CiAgICAgICAgICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgTWF0Y2hlZCAicHJvcHNUb01hdGNoIjpcblx0JHttYXRjaGVkLmpvaW4oJ1xuXHQnKX1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhockluc3RhbmNlcy5zZXQodGhpcywgeGhyRGV0YWlscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVzcG9uc2UgPSBzdXBlci5yZXNwb25zZTsKICAgICAgICAgICAgY29uc3QgeGhyRGV0YWlscyA9IHhockluc3RhbmNlcy5nZXQodGhpcyk7CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyUmVzcG9uc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VMZW5ndGggPSB0eXBlb2YgaW5uZXJSZXNwb25zZSA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgID8gaW5uZXJSZXNwb25zZS5sZW5ndGgKICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAoIHhockRldGFpbHMubGFzdFJlc3BvbnNlTGVuZ3RoICE9PSByZXNwb25zZUxlbmd0aCApIHsKICAgICAgICAgICAgICAgIHhockRldGFpbHMucmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLmxhc3RSZXNwb25zZUxlbmd0aCA9IHJlc3BvbnNlTGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscy5yZXNwb25zZSAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHhockRldGFpbHMucmVzcG9uc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB0eXBlb2YgaW5uZXJSZXNwb25zZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBpbm5lclJlc3BvbnNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBvdXRlclJlc3BvbnNlID0ganNvbmxFZGl0Rm4oanNvbnAsIGlubmVyUmVzcG9uc2UpOwogICAgICAgICAgICBpZiAoIG91dGVyUmVzcG9uc2UgIT09IGlubmVyUmVzcG9uc2UgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdQcnVuZWQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBvdXRlclJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlOwogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3BvbnNlICE9PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgPyBzdXBlci5yZXNwb25zZVRleHQKICAgICAgICAgICAgICAgIDogcmVzcG9uc2U7CiAgICAgICAgfQogICAgfTsKfQoKICAoZnVuY3Rpb24ganNvbmxFZGl0WGhyUmVzcG9uc2UoanNvbnEgPSAnJywgLi4uYXJncykgewogICAganNvbmxFZGl0WGhyUmVzcG9uc2VGbihmYWxzZSwganNvbnEsIC4uLmFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-jsonl-edit-xhr-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmZ1bmN0aW9uIGpzb25sRWRpdEZuKGpzb25wLCB0ZXh0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbGluZVNlcGFyYXRvciA9IC9ccj9cbi8uZXhlYyh0ZXh0KT8uWzBdIHx8ICdcbic7CiAgICBjb25zdCBsaW5lc0JlZm9yZSA9IHRleHQuc3BsaXQoJ1xuJyk7CiAgICBjb25zdCBsaW5lc0FmdGVyID0gW107CiAgICBmb3IgKCBjb25zdCBsaW5lQmVmb3JlIG9mIGxpbmVzQmVmb3JlICkgewogICAgICAgIGxldCBvYmo7CiAgICAgICAgdHJ5IHsgb2JqID0gc2FmZS5KU09OX3BhcnNlKGxpbmVCZWZvcmUpOyB9IGNhdGNoIHsgfQogICAgICAgIGlmICggdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsICkgewogICAgICAgICAgICBsaW5lc0FmdGVyLnB1c2gobGluZUJlZm9yZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBvYmpBZnRlciA9IGpzb25wLmFwcGx5KG9iaik7CiAgICAgICAgaWYgKCBvYmpBZnRlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBsaW5lc0FmdGVyLnB1c2gobGluZUJlZm9yZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBsaW5lQWZ0ZXIgPSBzYWZlLkpTT05fc3RyaW5naWZ5KG9iakFmdGVyKTsKICAgICAgICBsaW5lc0FmdGVyLnB1c2gobGluZUFmdGVyKTsKICAgIH0KICAgIHJldHVybiBsaW5lc0FmdGVyLmpvaW4obGluZVNlcGFyYXRvcik7Cn0KY2xhc3MgSlNPTlBhdGggewogICAgc3RhdGljIGNyZWF0ZShxdWVyeSkgewogICAgICAgIGNvbnN0IGpzb25wID0gbmV3IEpTT05QYXRoKCk7CiAgICAgICAganNvbnAuY29tcGlsZShxdWVyeSk7CiAgICAgICAgcmV0dXJuIGpzb25wOwogICAgfQogICAgc3RhdGljIHRvSlNPTihvYmosIHN0cmluZ2lmaWVyLCAuLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIChzdHJpbmdpZmllciB8fCBKU09OLnN0cmluZ2lmeSkob2JqLCAuLi5hcmdzKQogICAgICAgICAgICAucmVwbGFjZSgvXC8vZywgJ1xcLycpOwogICAgfQogICAgZ2V0IHZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlZCAmJiB0aGlzLiNjb21waWxlZC5ydmFsOwogICAgfQogICAgc2V0IHZhbHVlKHYpIHsKICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIHRoaXMuI2NvbXBpbGVkLnJ2YWwgPSB2OwogICAgfQogICAgZ2V0IHZhbGlkKCkgewogICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlZCAhPT0gdW5kZWZpbmVkOwogICAgfQogICAgY29tcGlsZShxdWVyeSkgewogICAgICAgIHRoaXMuI2NvbXBpbGVkID0gdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IHIgPSB0aGlzLiNjb21waWxlKHF1ZXJ5LCAwKTsKICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCByLmkgIT09IHF1ZXJ5Lmxlbmd0aCApIHsKICAgICAgICAgICAgbGV0IHZhbDsKICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCc9Jywgci5pKSApIHsKICAgICAgICAgICAgICAgIGlmICggL149cmVwbFwoLitcKSQvLnRlc3QocXVlcnkuc2xpY2Uoci5pKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgci5tb2RpZnkgPSAncmVwbCc7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzYsIC0xKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gcXVlcnkuc2xpY2Uoci5pKzEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCcrPScsIHIuaSkgKSB7CiAgICAgICAgICAgICAgICByLm1vZGlmeSA9ICcrJzsKICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSsyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgeyByLnJ2YWwgPSBKU09OLnBhcnNlKHZhbCk7IH0KICAgICAgICAgICAgY2F0Y2ggeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgdGhpcy4jY29tcGlsZWQgPSByOwogICAgfQogICAgZXZhbHVhdGUocm9vdCkgewogICAgICAgIGlmICggdGhpcy52YWxpZCA9PT0gZmFsc2UgKSB7IHJldHVybiBbXTsgfQogICAgICAgIHRoaXMuI3Jvb3QgPSByb290OwogICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy4jZXZhbHVhdGUodGhpcy4jY29tcGlsZWQuc3RlcHMsIFtdKTsKICAgICAgICB0aGlzLiNyb290ID0gbnVsbDsKICAgICAgICByZXR1cm4gcGF0aHM7CiAgICB9CiAgICBhcHBseShyb290KSB7CiAgICAgICAgaWYgKCB0aGlzLnZhbGlkID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgeyBydmFsIH0gPSB0aGlzLiNjb21waWxlZDsKICAgICAgICB0aGlzLiNyb290ID0geyAnJCc6IHJvb3QgfTsKICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuI2V2YWx1YXRlKHRoaXMuI2NvbXBpbGVkLnN0ZXBzLCBbXSk7CiAgICAgICAgbGV0IGkgPSBwYXRocy5sZW5ndGgKICAgICAgICBpZiAoIGkgPT09IDAgKSB7IHRoaXMuI3Jvb3QgPSBudWxsOyByZXR1cm47IH0KICAgICAgICB3aGlsZSAoIGktLSApIHsKICAgICAgICAgICAgY29uc3QgeyBvYmosIGtleSB9ID0gdGhpcy4jcmVzb2x2ZVBhdGgocGF0aHNbaV0pOwogICAgICAgICAgICBpZiAoIHJ2YWwgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHRoaXMuI21vZGlmeVZhbChvYmosIGtleSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkob2JqKSAmJiB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgICAgIG9iai5zcGxpY2Uoa2V5LCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpba2V5XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNyb290WyckJ10gPz8gbnVsbDsKICAgICAgICB0aGlzLiNyb290ID0gbnVsbDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZHVtcCgpIHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy4jY29tcGlsZWQpOwogICAgfQogICAgdG9KU09OKG9iaiwgLi4uYXJncykgewogICAgICAgIHJldHVybiBKU09OUGF0aC50b0pTT04ob2JqLCBudWxsLCAuLi5hcmdzKQogICAgfQogICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkgewogICAgICAgIHJldHVybiAnSlNPTlBhdGgnOwogICAgfQogICAgI1VOREVGSU5FRCA9IDA7CiAgICAjUk9PVCA9IDE7CiAgICAjQ1VSUkVOVCA9IDI7CiAgICAjQ0hJTERSRU4gPSAzOwogICAgI0RFU0NFTkRBTlRTID0gNDsKICAgICNyZVVucXVvdGVkSWRlbnRpZmllciA9IC9eW0EtWmEtel9dW1x3XSp8XlwqLzsKICAgICNyZUV4cHIgPSAvXihbIT1eJCpdPXxbPD5dPT8pKC4rPylcXS87CiAgICAjcmVJbmRpY2UgPSAvXi0/XGQrLzsKICAgICNyb290OwogICAgI2NvbXBpbGVkOwogICAgI2NvbXBpbGUocXVlcnksIGkpIHsKICAgICAgICBpZiAoIHF1ZXJ5Lmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3Qgc3RlcHMgPSBbXTsKICAgICAgICBsZXQgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgaWYgKCBjID09PSAweDI0IC8qICQgKi8gKSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogdGhpcy4jUk9PVCB9KTsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0gZWxzZSBpZiAoIGMgPT09IDB4NDAgLyogQCAqLyApIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiB0aGlzLiNDVVJSRU5UIH0pOwogICAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiBpID09PSAwID8gdGhpcy4jUk9PVCA6IHRoaXMuI0NVUlJFTlQgfSk7CiAgICAgICAgfQogICAgICAgIGxldCBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICggaSA9PT0gcXVlcnkubGVuZ3RoICkgeyBicmVhazsgfQogICAgICAgICAgICBjID0gcXVlcnkuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgaWYgKCBjID09PSAweDIwIC8qIHdoaXRlc3BhY2UgKi8gKSB7CiAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBEb3QgYWNjZXNzb3Igc3ludGF4CiAgICAgICAgICAgIGlmICggYyA9PT0gMHgyRSAvKiAuICovICkgewogICAgICAgICAgICAgICAgaWYgKCBtdiAhPT0gdGhpcy4jVU5ERUZJTkVEICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnLi4nLCBpKSApIHsKICAgICAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgICAgICAgICBpICs9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMgIT09IDB4NUIgLyogWyAqLyApIHsKICAgICAgICAgICAgICAgIGlmICggbXYgPT09IHRoaXMuI1VOREVGSU5FRCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwID0gc3RlcHMuYXQoLTEpOwogICAgICAgICAgICAgICAgICAgIGlmICggc3RlcCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy4jY29tcGlsZUV4cHIocXVlcnksIHN0ZXAsIGkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpOwogICAgICAgICAgICAgICAgaWYgICggcyA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogcyB9KTsKICAgICAgICAgICAgICAgIGkgKz0gcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJyYWNrZXQgYWNjZXNzb3Igc3ludGF4CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnWz8nLCBpKSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5vdCA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSsyKSA9PT0gMHgyMSAvKiAhICovOwogICAgICAgICAgICAgICAgY29uc3QgaiA9IGkgKyAyICsgKG5vdCA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNjb21waWxlKHF1ZXJ5LCBqKTsKICAgICAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnXScsIHIuaSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGlmICggbm90ICkgeyByLnN0ZXBzLmF0KC0xKS5ub3QgPSB0cnVlOyB9CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IG12IHx8IHRoaXMuI0NISUxEUkVOLCBzdGVwczogci5zdGVwcyB9KTsKICAgICAgICAgICAgICAgIGkgPSByLmkgKyAxOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ1sqXScsIGkpICkgewogICAgICAgICAgICAgICAgbXYgfHw9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12LCBrOiAnKicgfSk7CiAgICAgICAgICAgICAgICBpICs9IDM7CiAgICAgICAgICAgICAgICBtdiA9IHRoaXMuI1VOREVGSU5FRDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNjb25zdW1lSWRlbnRpZmllcihxdWVyeSwgaSsxKTsKICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBtdiB8fD0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogci5zIH0pOwogICAgICAgICAgICBpID0gci5pICsgMTsKICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgfQogICAgICAgIGlmICggc3RlcHMubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIG12ICE9PSB0aGlzLiNVTkRFRklORUQgKSB7IHJldHVybjsgfQogICAgICAgIHJldHVybiB7IHN0ZXBzLCBpIH07CiAgICB9CiAgICAjZXZhbHVhdGUoc3RlcHMsIHBhdGhpbikgewogICAgICAgIGxldCByZXN1bHRzZXQgPSBbXTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkoc3RlcHMpID09PSBmYWxzZSApIHsgcmV0dXJuIHJlc3VsdHNldDsgfQogICAgICAgIGZvciAoIGNvbnN0IHN0ZXAgb2Ygc3RlcHMgKSB7CiAgICAgICAgICAgIHN3aXRjaCAoIHN0ZXAubXYgKSB7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jUk9PVDoKICAgICAgICAgICAgICAgIHJlc3VsdHNldCA9IFsgWyAnJCcgXSBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jQ1VSUkVOVDoKICAgICAgICAgICAgICAgIHJlc3VsdHNldCA9IFsgcGF0aGluIF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0aGlzLiNDSElMRFJFTjoKICAgICAgICAgICAgY2FzZSB0aGlzLiNERVNDRU5EQU5UUzoKICAgICAgICAgICAgICAgIHJlc3VsdHNldCA9IHRoaXMuI2dldE1hdGNoZXMocmVzdWx0c2V0LCBzdGVwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdHNldDsKICAgIH0KICAgICNnZXRNYXRjaGVzKGxpc3Rpbiwgc3RlcCkgewogICAgICAgIGNvbnN0IGxpc3RvdXQgPSBbXTsKICAgICAgICBmb3IgKCBjb25zdCBwYXRoaW4gb2YgbGlzdGluICkgewogICAgICAgICAgICBjb25zdCB7IHZhbHVlOiBvd25lciB9ID0gdGhpcy4jcmVzb2x2ZVBhdGgocGF0aGluKTsKICAgICAgICAgICAgaWYgKCBzdGVwLmsgPT09ICcqJyApIHsKICAgICAgICAgICAgICAgIHRoaXMuI2dldE1hdGNoZXNGcm9tQWxsKHBhdGhpbiwgc3RlcCwgb3duZXIsIGxpc3RvdXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBzdGVwLmsgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHRoaXMuI2dldE1hdGNoZXNGcm9tS2V5cyhwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggc3RlcC5zdGVwcyApIHsKICAgICAgICAgICAgICAgIHRoaXMuI2dldE1hdGNoZXNGcm9tRXhwcihwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlzdG91dDsKICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUFsbChwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCByZWN1cnNpdmUgPSBzdGVwLm12ID09PSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICBmb3IgKCBjb25zdCB7IHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgcmVjdXJzaXZlKSApIHsKICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIC4uLnBhdGggXSk7CiAgICAgICAgfQogICAgfQogICAgI2dldE1hdGNoZXNGcm9tS2V5cyhwYXRoaW4sIHN0ZXAsIG93bmVyLCBvdXQpIHsKICAgICAgICBjb25zdCBrayA9IEFycmF5LmlzQXJyYXkoc3RlcC5rKSA/IHN0ZXAuayA6IFsgc3RlcC5rIF07CiAgICAgICAgZm9yICggY29uc3QgayBvZiBrayApIHsKICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMuI2V2YWx1YXRlRXhwcihzdGVwLCBvd25lciwgayk7CiAgICAgICAgICAgIGlmICggbm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgbm9ybWFsaXplZCBdKTsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdGVwLm12ICE9PSB0aGlzLiNERVNDRU5EQU5UUyApIHsgcmV0dXJuOyB9CiAgICAgICAgZm9yICggY29uc3QgeyBvYmosIGtleSwgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCB0cnVlKSApIHsKICAgICAgICAgICAgZm9yICggY29uc3QgayBvZiBrayApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLiNldmFsdWF0ZUV4cHIoc3RlcCwgb2JqW2tleV0sIGspOwogICAgICAgICAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBvdXQucHVzaChbIC4uLnBhdGhpbiwgLi4ucGF0aCwgbm9ybWFsaXplZCBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUV4cHIocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3QgcmVjdXJzaXZlID0gc3RlcC5tdiA9PT0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNldmFsdWF0ZShzdGVwLnN0ZXBzLCBwYXRoaW4pOwogICAgICAgICAgICBpZiAoIHIubGVuZ3RoICE9PSAwICkgeyBvdXQucHVzaChwYXRoaW4pOyB9CiAgICAgICAgICAgIGlmICggcmVjdXJzaXZlICE9PSB0cnVlICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgZm9yICggY29uc3QgeyBvYmosIGtleSwgcGF0aCB9IG9mIHRoaXMuI2dldERlc2NlbmRhbnRzKG93bmVyLCByZWN1cnNpdmUpICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob2JqW2tleV0pICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBjb25zdCBxID0gWyAuLi5wYXRoaW4sIC4uLnBhdGggXTsKICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI2V2YWx1YXRlKHN0ZXAuc3RlcHMsIHEpOwogICAgICAgICAgICBpZiAoIHIubGVuZ3RoID09PSAwICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBvdXQucHVzaChxKTsKICAgICAgICB9CiAgICB9CiAgICAjbm9ybWFsaXplS2V5KG93bmVyLCBrZXkpIHsKICAgICAgICBpZiAoIHR5cGVvZiBrZXkgPT09ICdudW1iZXInICkgewogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkob3duZXIpICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGtleSA+PSAwID8ga2V5IDogb3duZXIubGVuZ3RoICsga2V5OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBrZXk7CiAgICB9CiAgICAjZ2V0RGVzY2VuZGFudHModiwgcmVjdXJzaXZlKSB7CiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7CiAgICAgICAgICAgIG5leHQoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAoIG4gPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHRoaXMuc3RhY2tbbi0xXTsKICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZGV0YWlscy5rZXlzLm5leHQoKTsKICAgICAgICAgICAgICAgIGlmICggZW50cnkuZG9uZSApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucGF0aC5wb3AoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnBhdGhbbi0xXSA9IGVudHJ5LnZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsKICAgICAgICAgICAgICAgICAgICBvYmo6IGRldGFpbHMub2JqLAogICAgICAgICAgICAgICAgICAgIGtleTogZW50cnkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoLnNsaWNlKCksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMudmFsdWUub2JqW3RoaXMudmFsdWUua2V5XTsKICAgICAgICAgICAgICAgIGlmICggcmVjdXJzaXZlICkgewogICAgICAgICAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheSh2KSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiB2LmtleXMoKSB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiBPYmplY3Qua2V5cyh2KS52YWx1ZXMoKSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcGF0aDogW10sCiAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgICAgIGRvbmU6IGZhbHNlLAogICAgICAgICAgICBzdGFjazogW10sCiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpczsgfSwKICAgICAgICB9OwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheSh2KSApIHsKICAgICAgICAgICAgaXRlcmF0b3Iuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogdi5rZXlzKCkgfSk7CiAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IE9iamVjdC5rZXlzKHYpLnZhbHVlcygpIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaXRlcmF0b3I7CiAgICB9CiAgICAjY29uc3VtZUlkZW50aWZpZXIocXVlcnksIGkpIHsKICAgICAgICBjb25zdCBrZXlzID0gW107CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBjb25zdCBjMCA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4NUQgLyogXSAqLyApIHsgYnJlYWs7IH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyQyAvKiAsICovICkgewogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyNyAvKiAnICovICkgewogICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuI3VudGlsQ2hhcihxdWVyeSwgMHgyNyAvKiAnICovLCBpKzEpCiAgICAgICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBrZXlzLnB1c2goci5zKTsKICAgICAgICAgICAgICAgIGkgPSByLmk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMwID09PSAweDJEIC8qIC0gKi8gfHwgYzAgPj0gMHgzMCAmJiBjMCA8PSAweDM5ICkgewogICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZUluZGljZS5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgY29uc3QgaW5kaWNlID0gcGFyc2VJbnQocXVlcnkuc2xpY2UoaSksIDEwKTsKICAgICAgICAgICAgICAgIGtleXMucHVzaChpbmRpY2UpOwogICAgICAgICAgICAgICAgaSArPSBtYXRjaFswXS5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSk7CiAgICAgICAgICAgIGlmICggcyA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAga2V5cy5wdXNoKHMpOwogICAgICAgICAgICBpICs9IHMubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzOiBrZXlzLmxlbmd0aCA9PT0gMSA/IGtleXNbMF0gOiBrZXlzLCBpIH07CiAgICB9CiAgICAjY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihxdWVyeSwgaSkgewogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVVbnF1b3RlZElkZW50aWZpZXIuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgcmV0dXJuIG1hdGNoWzBdOwogICAgfQogICAgI3VudGlsQ2hhcihxdWVyeSwgdGFyZ2V0Q2hhckNvZGUsIGkpIHsKICAgICAgICBjb25zdCBsZW4gPSBxdWVyeS5sZW5ndGg7CiAgICAgICAgY29uc3QgcGFydHMgPSBbXTsKICAgICAgICBsZXQgYmVnID0gaSwgZW5kID0gaTsKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICggZW5kID09PSBsZW4gKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBjID0gcXVlcnkuY2hhckNvZGVBdChlbmQpOwogICAgICAgICAgICBpZiAoIGMgPT09IHRhcmdldENoYXJDb2RlICkgewogICAgICAgICAgICAgICAgcGFydHMucHVzaChxdWVyeS5zbGljZShiZWcsIGVuZCkpOwogICAgICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGMgPT09IDB4NUMgLyogXCAqLyAmJiAoZW5kKzEpIDwgbGVuICkgewogICAgICAgICAgICAgICAgY29uc3QgZCA9IHF1ZXJ5LmNoYXJDb2RlQXQoZW5kKzEpOwogICAgICAgICAgICAgICAgaWYgKCBkID09PSB0YXJnZXRDaGFyQ29kZSApIHsKICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHF1ZXJ5LnNsaWNlKGJlZywgZW5kKSk7CiAgICAgICAgICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgICAgICAgICAgICAgYmVnID0gZW5kOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzOiBwYXJ0cy5qb2luKCcnKSwgaTogZW5kIH07CiAgICB9CiAgICAjY29tcGlsZUV4cHIocXVlcnksIHN0ZXAsIGkpIHsKICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJz0vJywgaSkgKSB7CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiN1bnRpbENoYXIocXVlcnksIDB4MkYgLyogLyAqLywgaSsyKTsKICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBpOyB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15baV0vLmV4ZWMocXVlcnkuc2xpY2Uoci5pKSk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBzdGVwLnJ2YWwgPSBuZXcgUmVnRXhwKHIucywgbWF0Y2ggJiYgbWF0Y2hbMF0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGVwLm9wID0gJ3JlJzsKICAgICAgICAgICAgaWYgKCBtYXRjaCApIHsgci5pICs9IG1hdGNoWzBdLmxlbmd0aDsgfQogICAgICAgICAgICByZXR1cm4gci5pOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlRXhwci5leGVjKHF1ZXJ5LnNsaWNlKGkpKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm4gaTsgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0ZXAucnZhbCA9IEpTT04ucGFyc2UobWF0Y2hbMl0pOwogICAgICAgICAgICBzdGVwLm9wID0gbWF0Y2hbMV07CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpICsgbWF0Y2hbMV0ubGVuZ3RoICsgbWF0Y2hbMl0ubGVuZ3RoOwogICAgfQogICAgI3Jlc29sdmVQYXRoKHBhdGgpIHsKICAgICAgICBpZiAoIHBhdGgubGVuZ3RoID09PSAwICkgeyByZXR1cm4geyB2YWx1ZTogdGhpcy4jcm9vdCB9OyB9CiAgICAgICAgY29uc3Qga2V5ID0gcGF0aC5hdCgtMSk7CiAgICAgICAgbGV0IG9iaiA9IHRoaXMuI3Jvb3QKICAgICAgICBmb3IgKCBsZXQgaSA9IDAsIG4gPSBwYXRoLmxlbmd0aC0xOyBpIDwgbjsgaSsrICkgewogICAgICAgICAgICBvYmogPSBvYmpbcGF0aFtpXV07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IG9iaiwga2V5LCB2YWx1ZTogb2JqW2tleV0gfTsKICAgIH0KICAgICNldmFsdWF0ZUV4cHIoc3RlcCwgb3duZXIsIGtleSkgewogICAgICAgIGlmICggb3duZXIgPT09IHVuZGVmaW5lZCB8fCBvd25lciA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBjb25zdCBrID0gdGhpcy4jbm9ybWFsaXplS2V5KG93bmVyLCBrZXkpOwogICAgICAgIGNvbnN0IGhhc093biA9IE9iamVjdC5oYXNPd24ob3duZXIsIGspOwogICAgICAgIGlmICggc3RlcC5vcCAhPT0gdW5kZWZpbmVkICYmIGhhc093biA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRhcmdldCA9IHN0ZXAubm90ICE9PSB0cnVlOwogICAgICAgIGNvbnN0IHYgPSBvd25lcltrXTsKICAgICAgICBsZXQgb3V0Y29tZSA9IGZhbHNlOwogICAgICAgIHN3aXRjaCAoIHN0ZXAub3AgKSB7CiAgICAgICAgY2FzZSAnPT0nOiBvdXRjb21lID0gKHYgPT09IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnIT0nOiBvdXRjb21lID0gKHYgIT09IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAgJzwnOiBvdXRjb21lID0gKHYgPCBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJzw9Jzogb3V0Y29tZSA9ICh2IDw9IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAgJz4nOiBvdXRjb21lID0gKHYgPiBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJz49Jzogb3V0Y29tZSA9ICh2ID49IHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnXj0nOiBvdXRjb21lID0gYCR7dn1gLnN0YXJ0c1dpdGgoc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICckPSc6IG91dGNvbWUgPSBgJHt2fWAuZW5kc1dpdGgoc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICcqPSc6IG91dGNvbWUgPSBgJHt2fWAuaW5jbHVkZXMoc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICdyZSc6IG91dGNvbWUgPSBzdGVwLnJ2YWwudGVzdChgJHt2fWApOyBicmVhazsKICAgICAgICBkZWZhdWx0OiBvdXRjb21lID0gaGFzT3duID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoIG91dGNvbWUgKSB7IHJldHVybiBrOyB9CiAgICB9CiAgICAjbW9kaWZ5VmFsKG9iaiwga2V5KSB7CiAgICAgICAgY29uc3QgeyBtb2RpZnksIHJ2YWwgfSA9IHRoaXMuI2NvbXBpbGVkOwogICAgICAgIHN3aXRjaCAoIG1vZGlmeSApIHsKICAgICAgICBjYXNlIHVuZGVmaW5lZDoKICAgICAgICAgICAgb2JqW2tleV0gPSBydmFsOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICcrJzogewogICAgICAgICAgICBpZiAoIHJ2YWwgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3QgbHZhbCA9IG9ialtrZXldOwogICAgICAgICAgICBpZiAoIGx2YWwgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KGx2YWwpICkgeyByZXR1cm47IH0KICAgICAgICAgICAgZm9yICggY29uc3QgWyBrLCB2IF0gb2YgT2JqZWN0LmVudHJpZXMocnZhbCkgKSB7CiAgICAgICAgICAgICAgICBsdmFsW2tdID0gdjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAncmVwbCc6IHsKICAgICAgICAgICAgY29uc3QgbHZhbCA9IG9ialtrZXldOwogICAgICAgICAgICBpZiAoIHR5cGVvZiBsdmFsICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQucmUgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHRoaXMuI2NvbXBpbGVkLnJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY29tcGlsZWQucmUgPSBydmFsLnJlZ2V4ICE9PSB1bmRlZmluZWQKICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVnRXhwKHJ2YWwucmVnZXgsIHJ2YWwuZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlZ0V4cChydmFsLnBhdHRlcm4ucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJykpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZC5yZSA9PT0gbnVsbCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG9ialtrZXldID0gbHZhbC5yZXBsYWNlKHRoaXMuI2NvbXBpbGVkLnJlLCBydmFsLnJlcGxhY2VtZW50KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQpmdW5jdGlvbiBqc29ubEVkaXRYaHJSZXNwb25zZUZuKHRydXN0ZWQsIGpzb25xID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KAogICAgICAgIGAke3RydXN0ZWQgPyAndHJ1c3RlZC0nIDogJyd9anNvbmwtZWRpdC14aHItcmVzcG9uc2VgLAogICAgICAgIGpzb25xCiAgICApOwogICAgY29uc3QgeGhySW5zdGFuY2VzID0gbmV3IFdlYWtNYXAoKTsKICAgIGNvbnN0IGpzb25wID0gSlNPTlBhdGguY3JlYXRlKGpzb25xKTsKICAgIGlmICgganNvbnAudmFsaWQgPT09IGZhbHNlIHx8IGpzb25wLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHJ1c3RlZCAhPT0gdHJ1ZSApIHsKICAgICAgICByZXR1cm4gc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnQmFkIEpTT05QYXRoIHF1ZXJ5Jyk7CiAgICB9CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDIpOwogICAgY29uc3QgcHJvcE5lZWRsZXMgPSBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4oZXh0cmFBcmdzLnByb3BzVG9NYXRjaCwgJ3VybCcpOwogICAgc2VsZi5YTUxIdHRwUmVxdWVzdCA9IGNsYXNzIGV4dGVuZHMgc2VsZi5YTUxIdHRwUmVxdWVzdCB7CiAgICAgICAgb3BlbihtZXRob2QsIHVybCwgLi4uYXJncykgewogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geyBtZXRob2QsIHVybCB9OwogICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gcHJvcE5lZWRsZXMuc2l6ZSA9PT0gMCB8fAogICAgICAgICAgICAgICAgbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHhockRldGFpbHMpOwogICAgICAgICAgICBpZiAoIG1hdGNoZWQgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICYmIEFycmF5LmlzQXJyYXkobWF0Y2hlZCkgKSB7CiAgICAgICAgICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgTWF0Y2hlZCAicHJvcHNUb01hdGNoIjpcblx0JHttYXRjaGVkLmpvaW4oJ1xuXHQnKX1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhockluc3RhbmNlcy5zZXQodGhpcywgeGhyRGV0YWlscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVzcG9uc2UgPSBzdXBlci5yZXNwb25zZTsKICAgICAgICAgICAgY29uc3QgeGhyRGV0YWlscyA9IHhockluc3RhbmNlcy5nZXQodGhpcyk7CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyUmVzcG9uc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VMZW5ndGggPSB0eXBlb2YgaW5uZXJSZXNwb25zZSA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgID8gaW5uZXJSZXNwb25zZS5sZW5ndGgKICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAoIHhockRldGFpbHMubGFzdFJlc3BvbnNlTGVuZ3RoICE9PSByZXNwb25zZUxlbmd0aCApIHsKICAgICAgICAgICAgICAgIHhockRldGFpbHMucmVzcG9uc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLmxhc3RSZXNwb25zZUxlbmd0aCA9IHJlc3BvbnNlTGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscy5yZXNwb25zZSAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHhockRldGFpbHMucmVzcG9uc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB0eXBlb2YgaW5uZXJSZXNwb25zZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBpbm5lclJlc3BvbnNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBvdXRlclJlc3BvbnNlID0ganNvbmxFZGl0Rm4oanNvbnAsIGlubmVyUmVzcG9uc2UpOwogICAgICAgICAgICBpZiAoIG91dGVyUmVzcG9uc2UgIT09IGlubmVyUmVzcG9uc2UgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdQcnVuZWQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBvdXRlclJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlOwogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3BvbnNlICE9PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgPyBzdXBlci5yZXNwb25zZVRleHQKICAgICAgICAgICAgICAgIDogcmVzcG9uc2U7CiAgICAgICAgfQogICAgfTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZEpzb25sRWRpdFhoclJlc3BvbnNlKGpzb25xID0gJycsIC4uLmFyZ3MpIHsKICAgIGpzb25sRWRpdFhoclJlc3BvbnNlRm4odHJ1ZSwganNvbnEsIC4uLmFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"jsonl-edit-fetch-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCBpbXBsaWNpdCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG5lZWRsZXMgPSBuZXcgTWFwKCk7CiAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gdW5kZWZpbmVkIHx8IHByb3BzVG9NYXRjaCA9PT0gJycgKSB7IHJldHVybiBuZWVkbGVzOyB9CiAgICBjb25zdCBvcHRpb25zID0geyBjYW5OZWdhdGU6IHRydWUgfTsKICAgIGZvciAoIGNvbnN0IG5lZWRsZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHByb3BzVG9NYXRjaCwgL1xzKy8pICkgewogICAgICAgIGxldCBbIHByb3AsIHBhdHRlcm4gXSA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwobmVlZGxlLCAnOicpOwogICAgICAgIGlmICggcHJvcCA9PT0gJycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgJiYgL1teJFx3IC1dLy50ZXN0KHByb3ApICkgewogICAgICAgICAgICBwcm9wID0gYCR7cHJvcH06JHtwYXR0ZXJufWA7CiAgICAgICAgICAgIHBhdHRlcm4gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmICggcGF0dGVybiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBuZWVkbGVzLnNldChwcm9wLCBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgICB9IGVsc2UgaWYgKCBpbXBsaWNpdCAhPT0gJycgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KGltcGxpY2l0LCBzYWZlLmluaXRQYXR0ZXJuKHByb3AsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZGxlczsKfQpmdW5jdGlvbiBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgLi4ub2JqcykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBtYXRjaGVkID0gW107CiAgICBmb3IgKCBjb25zdCBvYmogb2Ygb2JqcyApIHsKICAgICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgZm9yICggY29uc3QgWyBwcm9wLCBkZXRhaWxzIF0gb2YgcHJvcE5lZWRsZXMgKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkodmFsdWUpOyB9CiAgICAgICAgICAgICAgICBjYXRjaCB7IH0KICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4oZGV0YWlscywgdmFsdWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG1hdGNoZWQucHVzaChgJHtwcm9wfTogJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0Y2hlZDsKfQpmdW5jdGlvbiBqc29ubEVkaXRGbihqc29ucCwgdGV4dCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxpbmVTZXBhcmF0b3IgPSAvXHI/XG4vLmV4ZWModGV4dCk/LlswXSB8fCAnXG4nOwogICAgY29uc3QgbGluZXNCZWZvcmUgPSB0ZXh0LnNwbGl0KCdcbicpOwogICAgY29uc3QgbGluZXNBZnRlciA9IFtdOwogICAgZm9yICggY29uc3QgbGluZUJlZm9yZSBvZiBsaW5lc0JlZm9yZSApIHsKICAgICAgICBsZXQgb2JqOwogICAgICAgIHRyeSB7IG9iaiA9IHNhZmUuSlNPTl9wYXJzZShsaW5lQmVmb3JlKTsgfSBjYXRjaCB7IH0KICAgICAgICBpZiAoIHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCApIHsKICAgICAgICAgICAgbGluZXNBZnRlci5wdXNoKGxpbmVCZWZvcmUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBqc29ucC5hcHBseShvYmopOwogICAgICAgIGlmICggb2JqQWZ0ZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgbGluZXNBZnRlci5wdXNoKGxpbmVCZWZvcmUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGluZUFmdGVyID0gc2FmZS5KU09OX3N0cmluZ2lmeShvYmpBZnRlcik7CiAgICAgICAgbGluZXNBZnRlci5wdXNoKGxpbmVBZnRlcik7CiAgICB9CiAgICByZXR1cm4gbGluZXNBZnRlci5qb2luKGxpbmVTZXBhcmF0b3IpOwp9CmNsYXNzIEpTT05QYXRoIHsKICAgIHN0YXRpYyBjcmVhdGUocXVlcnkpIHsKICAgICAgICBjb25zdCBqc29ucCA9IG5ldyBKU09OUGF0aCgpOwogICAgICAgIGpzb25wLmNvbXBpbGUocXVlcnkpOwogICAgICAgIHJldHVybiBqc29ucDsKICAgIH0KICAgIHN0YXRpYyB0b0pTT04ob2JqLCBzdHJpbmdpZmllciwgLi4uYXJncykgewogICAgICAgIHJldHVybiAoc3RyaW5naWZpZXIgfHwgSlNPTi5zdHJpbmdpZnkpKG9iaiwgLi4uYXJncykKICAgICAgICAgICAgLnJlcGxhY2UoL1wvL2csICdcXC8nKTsKICAgIH0KICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgJiYgdGhpcy4jY29tcGlsZWQucnZhbDsKICAgIH0KICAgIHNldCB2YWx1ZSh2KSB7CiAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICB0aGlzLiNjb21waWxlZC5ydmFsID0gdjsKICAgIH0KICAgIGdldCB2YWxpZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbXBpbGUocXVlcnkpIHsKICAgICAgICB0aGlzLiNjb21waWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgMCk7CiAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggci5pICE9PSBxdWVyeS5sZW5ndGggKSB7CiAgICAgICAgICAgIGxldCB2YWw7CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPScsIHIuaSkgKSB7CiAgICAgICAgICAgICAgICBpZiAoIC9ePXJlcGxcKC4rXCkkLy50ZXN0KHF1ZXJ5LnNsaWNlKHIuaSkpICkgewogICAgICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJ3JlcGwnOwogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSs2LCAtMSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSsxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnKz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgci5tb2RpZnkgPSAnKyc7CiAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsgci5ydmFsID0gSlNPTi5wYXJzZSh2YWwpOyB9CiAgICAgICAgICAgIGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIHRoaXMuI2NvbXBpbGVkID0gcjsKICAgIH0KICAgIGV2YWx1YXRlKHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm4gW107IH0KICAgICAgICB0aGlzLiNyb290ID0gcm9vdDsKICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuI2V2YWx1YXRlKHRoaXMuI2NvbXBpbGVkLnN0ZXBzLCBbXSk7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgfQogICAgYXBwbHkocm9vdCkgewogICAgICAgIGlmICggdGhpcy52YWxpZCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHsgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgdGhpcy4jcm9vdCA9IHsgJyQnOiByb290IH07CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIGxldCBpID0gcGF0aHMubGVuZ3RoCiAgICAgICAgaWYgKCBpID09PSAwICkgeyB0aGlzLiNyb290ID0gbnVsbDsgcmV0dXJuOyB9CiAgICAgICAgd2hpbGUgKCBpLS0gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgb2JqLCBrZXkgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhzW2ldKTsKICAgICAgICAgICAgaWYgKCBydmFsICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNtb2RpZnlWYWwob2JqLCBrZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KG9iaikgJiYgdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgICAgICBvYmouc3BsaWNlKGtleSwgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb2JqW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jcm9vdFsnJCddID8/IG51bGw7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGR1bXAoKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuI2NvbXBpbGVkKTsKICAgIH0KICAgIHRvSlNPTihvYmosIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gSlNPTlBhdGgudG9KU09OKG9iaiwgbnVsbCwgLi4uYXJncykKICAgIH0KICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHsKICAgICAgICByZXR1cm4gJ0pTT05QYXRoJzsKICAgIH0KICAgICNVTkRFRklORUQgPSAwOwogICAgI1JPT1QgPSAxOwogICAgI0NVUlJFTlQgPSAyOwogICAgI0NISUxEUkVOID0gMzsKICAgICNERVNDRU5EQU5UUyA9IDQ7CiAgICAjcmVVbnF1b3RlZElkZW50aWZpZXIgPSAvXltBLVphLXpfXVtcd10qfF5cKi87CiAgICAjcmVFeHByID0gL14oWyE9XiQqXT18Wzw+XT0/KSguKz8pXF0vOwogICAgI3JlSW5kaWNlID0gL14tP1xkKy87CiAgICAjcm9vdDsKICAgICNjb21waWxlZDsKICAgICNjb21waWxlKHF1ZXJ5LCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHN0ZXBzID0gW107CiAgICAgICAgbGV0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmICggYyA9PT0gMHgyNCAvKiAkICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI1JPT1QgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgaWYgKCBjID09PSAweDQwIC8qIEAgKi8gKSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogaSA9PT0gMCA/IHRoaXMuI1JPT1QgOiB0aGlzLiNDVVJSRU5UIH0pOwogICAgICAgIH0KICAgICAgICBsZXQgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGkgPT09IHF1ZXJ5Lmxlbmd0aCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIGlmICggYyA9PT0gMHgyMCAvKiB3aGl0ZXNwYWNlICovICkgewogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRG90IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIGMgPT09IDB4MkUgLyogLiAqLyApIHsKICAgICAgICAgICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJy4uJywgaSkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjICE9PSAweDVCIC8qIFsgKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ID09PSB0aGlzLiNVTkRFRklORUQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHN0ZXBzLmF0KC0xKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZXAgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgICAgIGlmICAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHMgfSk7CiAgICAgICAgICAgICAgICBpICs9IHMubGVuZ3RoOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCcmFja2V0IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ1s/JywgaSkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3QgPSBxdWVyeS5jaGFyQ29kZUF0KGkrMikgPT09IDB4MjEgLyogISAqLzsKICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpICsgMiArIChub3QgPyAxIDogMCk7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgaik7CiAgICAgICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ10nLCByLmkpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIG5vdCApIHsgci5zdGVwcy5hdCgtMSkubm90ID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiBtdiB8fCB0aGlzLiNDSElMRFJFTiwgc3RlcHM6IHIuc3RlcHMgfSk7CiAgICAgICAgICAgICAgICBpID0gci5pICsgMTsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbKl0nLCBpKSApIHsKICAgICAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogJyonIH0pOwogICAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29uc3VtZUlkZW50aWZpZXIocXVlcnksIGkrMSk7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbXYgfHw9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHIucyB9KTsKICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXBzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBtdiAhPT0gdGhpcy4jVU5ERUZJTkVEICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4geyBzdGVwcywgaSB9OwogICAgfQogICAgI2V2YWx1YXRlKHN0ZXBzLCBwYXRoaW4pIHsKICAgICAgICBsZXQgcmVzdWx0c2V0ID0gW107CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHN0ZXBzKSA9PT0gZmFsc2UgKSB7IHJldHVybiByZXN1bHRzZXQ7IH0KICAgICAgICBmb3IgKCBjb25zdCBzdGVwIG9mIHN0ZXBzICkgewogICAgICAgICAgICBzd2l0Y2ggKCBzdGVwLm12ICkgewogICAgICAgICAgICBjYXNlIHRoaXMuI1JPT1Q6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIFsgJyQnIF0gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NVUlJFTlQ6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIHBhdGhpbiBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jQ0hJTERSRU46CiAgICAgICAgICAgIGNhc2UgdGhpcy4jREVTQ0VOREFOVFM6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSB0aGlzLiNnZXRNYXRjaGVzKHJlc3VsdHNldCwgc3RlcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzZXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlcyhsaXN0aW4sIHN0ZXApIHsKICAgICAgICBjb25zdCBsaXN0b3V0ID0gW107CiAgICAgICAgZm9yICggY29uc3QgcGF0aGluIG9mIGxpc3RpbiApIHsKICAgICAgICAgICAgY29uc3QgeyB2YWx1ZTogb3duZXIgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhpbik7CiAgICAgICAgICAgIGlmICggc3RlcC5rID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUFsbChwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggc3RlcC5rICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuc3RlcHMgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUV4cHIocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpc3RvdXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3QgcmVjdXJzaXZlID0gc3RlcC5tdiA9PT0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgZm9yICggY29uc3QgeyBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoIF0pOwogICAgICAgIH0KICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3Qga2sgPSBBcnJheS5pc0FycmF5KHN0ZXAuaykgPyBzdGVwLmsgOiBbIHN0ZXAuayBdOwogICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLiNldmFsdWF0ZUV4cHIoc3RlcCwgb3duZXIsIGspOwogICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgfQogICAgICAgIGlmICggc3RlcC5tdiAhPT0gdGhpcy4jREVTQ0VOREFOVFMgKSB7IHJldHVybjsgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgdHJ1ZSkgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG9ialtrZXldLCBrKTsKICAgICAgICAgICAgICAgIGlmICggbm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIC4uLnBhdGgsIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcGF0aGluKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCAhPT0gMCApIHsgb3V0LnB1c2gocGF0aGluKTsgfQogICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSAhPT0gdHJ1ZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgcmVjdXJzaXZlKSApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG9ialtrZXldKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgY29uc3QgcSA9IFsgLi4ucGF0aGluLCAuLi5wYXRoIF07CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNldmFsdWF0ZShzdGVwLnN0ZXBzLCBxKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCA9PT0gMCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2gocSk7CiAgICAgICAgfQogICAgfQogICAgI25vcm1hbGl6ZUtleShvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPj0gMCA/IGtleSA6IG93bmVyLmxlbmd0aCArIGtleTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAgI2dldERlc2NlbmRhbnRzKHYsIHJlY3Vyc2l2ZSkgewogICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuc3RhY2subGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKCBuID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLnN0YWNrW24tMV07CiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGRldGFpbHMua2V5cy5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoIGVudHJ5LmRvbmUgKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGgucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wYXRoW24tMV0gPSBlbnRyeS52YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgb2JqOiBkZXRhaWxzLm9iaiwKICAgICAgICAgICAgICAgICAgICBrZXk6IGVudHJ5LnZhbHVlLAogICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aC5zbGljZSgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlLm9ialt0aGlzLnZhbHVlLmtleV07CiAgICAgICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogdi5rZXlzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhdGg6IFtdLAogICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgICAgICBkb25lOiBmYWxzZSwKICAgICAgICAgICAgc3RhY2s6IFtdLAogICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH0sCiAgICAgICAgfTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiBPYmplY3Qua2V5cyh2KS52YWx1ZXMoKSB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgfQogICAgI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3Qga2V5cyA9IFtdOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgY29uc3QgYzAgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMwID09PSAweDVEIC8qIF0gKi8gKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkMgLyogLCAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MjcgLyogJyAqLyApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiN1bnRpbENoYXIocXVlcnksIDB4MjcgLyogJyAqLywgaSsxKQogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAga2V5cy5wdXNoKHIucyk7CiAgICAgICAgICAgICAgICBpID0gci5pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyRCAvKiAtICovIHx8IGMwID49IDB4MzAgJiYgYzAgPD0gMHgzOSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVJbmRpY2UuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGNvbnN0IGluZGljZSA9IHBhcnNlSW50KHF1ZXJ5LnNsaWNlKGkpLCAxMCk7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2goaW5kaWNlKTsKICAgICAgICAgICAgICAgIGkgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpOwogICAgICAgICAgICBpZiAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGtleXMucHVzaChzKTsKICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczoga2V5cy5sZW5ndGggPT09IDEgPyBrZXlzWzBdIDoga2V5cywgaSB9OwogICAgfQogICAgI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpIHsKICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlVW5xdW90ZWRJZGVudGlmaWVyLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIHJldHVybiBtYXRjaFswXTsKICAgIH0KICAgICN1bnRpbENoYXIocXVlcnksIHRhcmdldENoYXJDb2RlLCBpKSB7CiAgICAgICAgY29uc3QgbGVuID0gcXVlcnkubGVuZ3RoOwogICAgICAgIGNvbnN0IHBhcnRzID0gW107CiAgICAgICAgbGV0IGJlZyA9IGksIGVuZCA9IGk7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGVuZCA9PT0gbGVuICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3QgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoZW5kKTsKICAgICAgICAgICAgaWYgKCBjID09PSB0YXJnZXRDaGFyQ29kZSApIHsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjID09PSAweDVDIC8qIFwgKi8gJiYgKGVuZCsxKSA8IGxlbiApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCsxKTsKICAgICAgICAgICAgICAgIGlmICggZCA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChxdWVyeS5zbGljZShiZWcsIGVuZCkpOwogICAgICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgICAgIGJlZyA9IGVuZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczogcGFydHMuam9pbignJyksIGk6IGVuZCB9OwogICAgfQogICAgI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCc9LycsIGkpICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDJGIC8qIC8gKi8sIGkrMik7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gaTsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eW2ldLy5leGVjKHF1ZXJ5LnNsaWNlKHIuaSkpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3RlcC5ydmFsID0gbmV3IFJlZ0V4cChyLnMsIG1hdGNoICYmIG1hdGNoWzBdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RlcC5vcCA9ICdyZSc7CiAgICAgICAgICAgIGlmICggbWF0Y2ggKSB7IHIuaSArPSBtYXRjaFswXS5sZW5ndGg7IH0KICAgICAgICAgICAgcmV0dXJuIHIuaTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZUV4cHIuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuIGk7IH0KICAgICAgICB0cnkgewogICAgICAgICAgICBzdGVwLnJ2YWwgPSBKU09OLnBhcnNlKG1hdGNoWzJdKTsKICAgICAgICAgICAgc3RlcC5vcCA9IG1hdGNoWzFdOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICByZXR1cm4gaSArIG1hdGNoWzFdLmxlbmd0aCArIG1hdGNoWzJdLmxlbmd0aDsKICAgIH0KICAgICNyZXNvbHZlUGF0aChwYXRoKSB7CiAgICAgICAgaWYgKCBwYXRoLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuIHsgdmFsdWU6IHRoaXMuI3Jvb3QgfTsgfQogICAgICAgIGNvbnN0IGtleSA9IHBhdGguYXQoLTEpOwogICAgICAgIGxldCBvYmogPSB0aGlzLiNyb290CiAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gcGF0aC5sZW5ndGgtMTsgaSA8IG47IGkrKyApIHsKICAgICAgICAgICAgb2JqID0gb2JqW3BhdGhbaV1dOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBvYmosIGtleSwgdmFsdWU6IG9ialtrZXldIH07CiAgICB9CiAgICAjZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrZXkpIHsKICAgICAgICBpZiAoIG93bmVyID09PSB1bmRlZmluZWQgfHwgb3duZXIgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IHRoaXMuI25vcm1hbGl6ZUtleShvd25lciwga2V5KTsKICAgICAgICBjb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duKG93bmVyLCBrKTsKICAgICAgICBpZiAoIHN0ZXAub3AgIT09IHVuZGVmaW5lZCAmJiBoYXNPd24gPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0YXJnZXQgPSBzdGVwLm5vdCAhPT0gdHJ1ZTsKICAgICAgICBjb25zdCB2ID0gb3duZXJba107CiAgICAgICAgbGV0IG91dGNvbWUgPSBmYWxzZTsKICAgICAgICBzd2l0Y2ggKCBzdGVwLm9wICkgewogICAgICAgIGNhc2UgJz09Jzogb3V0Y29tZSA9ICh2ID09PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyE9Jzogb3V0Y29tZSA9ICh2ICE9PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc8Jzogb3V0Y29tZSA9ICh2IDwgc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc8PSc6IG91dGNvbWUgPSAodiA8PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc+Jzogb3V0Y29tZSA9ICh2ID4gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc+PSc6IG91dGNvbWUgPSAodiA+PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ149Jzogb3V0Y29tZSA9IGAke3Z9YC5zdGFydHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnJD0nOiBvdXRjb21lID0gYCR7dn1gLmVuZHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnKj0nOiBvdXRjb21lID0gYCR7dn1gLmluY2x1ZGVzKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAncmUnOiBvdXRjb21lID0gc3RlcC5ydmFsLnRlc3QoYCR7dn1gKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogb3V0Y29tZSA9IGhhc093biA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCBvdXRjb21lICkgeyByZXR1cm4gazsgfQogICAgfQogICAgI21vZGlmeVZhbChvYmosIGtleSkgewogICAgICAgIGNvbnN0IHsgbW9kaWZ5LCBydmFsIH0gPSB0aGlzLiNjb21waWxlZDsKICAgICAgICBzd2l0Y2ggKCBtb2RpZnkgKSB7CiAgICAgICAgY2FzZSB1bmRlZmluZWQ6CiAgICAgICAgICAgIG9ialtrZXldID0gcnZhbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnKyc6IHsKICAgICAgICAgICAgaWYgKCBydmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCBsdmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShsdmFsKSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGZvciAoIGNvbnN0IFsgaywgdiBdIG9mIE9iamVjdC5lbnRyaWVzKHJ2YWwpICkgewogICAgICAgICAgICAgICAgbHZhbFtrXSA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgJ3JlcGwnOiB7CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgbHZhbCAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuI2NvbXBpbGVkLnJlID0gcnZhbC5yZWdleCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFJlZ0V4cChydmFsLnJlZ2V4LCBydmFsLmZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAocnZhbC5wYXR0ZXJuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQucmUgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICBvYmpba2V5XSA9IGx2YWwucmVwbGFjZSh0aGlzLiNjb21waWxlZC5yZSwgcnZhbC5yZXBsYWNlbWVudCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24gY29sbGF0ZUZldGNoQXJndW1lbnRzRm4ocmVzb3VyY2UsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcHJvcHMgPSBbCiAgICAgICAgJ2JvZHknLCAnY2FjaGUnLCAnY3JlZGVudGlhbHMnLCAnZHVwbGV4JywgJ2hlYWRlcnMnLAogICAgICAgICdpbnRlZ3JpdHknLCAna2VlcGFsaXZlJywgJ21ldGhvZCcsICdtb2RlJywgJ3ByaW9yaXR5JywKICAgICAgICAncmVkaXJlY3QnLCAncmVmZXJyZXInLCAncmVmZXJyZXJQb2xpY3knLCAndXJsJwogICAgXTsKICAgIGNvbnN0IG91dCA9IHt9OwogICAgaWYgKCBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzID0gKHNyYywgb3V0KSA9PiB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IHByb3Agb2YgcHJvcHMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNyY1twcm9wXSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0W3Byb3BdID0gc3JjW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGlmICgKICAgICAgICB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnIHx8CiAgICAgICAgc2FmZS5PYmplY3RfdG9TdHJpbmcuY2FsbChyZXNvdXJjZSkgIT09ICdbb2JqZWN0IFJlcXVlc3RdJwogICAgKSB7CiAgICAgICAgb3V0LnVybCA9IGAke3Jlc291cmNlfWA7CiAgICB9IGVsc2UgewogICAgICAgIGxldCBjbG9uZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjbG9uZSA9IHNhZmUuUmVxdWVzdF9jbG9uZS5jYWxsKHJlc291cmNlKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMoY2xvbmUgfHwgcmVzb3VyY2UsIG91dCk7CiAgICB9CiAgICBpZiAoIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKG9wdGlvbnMsIG91dCk7CiAgICB9CiAgICByZXR1cm4gb3V0Owp9CmZ1bmN0aW9uIGpzb25sRWRpdEZldGNoUmVzcG9uc2VGbih0cnVzdGVkLCBqc29ucSA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgKICAgICAgICBgJHt0cnVzdGVkID8gJ3RydXN0ZWQtJyA6ICcnfWpzb25sLWVkaXQtZmV0Y2gtcmVzcG9uc2VgLAogICAgICAgIGpzb25xCiAgICApOwogICAgY29uc3QganNvbnAgPSBKU09OUGF0aC5jcmVhdGUoanNvbnEpOwogICAgaWYgKCBqc29ucC52YWxpZCA9PT0gZmFsc2UgfHwganNvbnAudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0cnVzdGVkICE9PSB0cnVlICkgewogICAgICAgIHJldHVybiBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdCYWQgSlNPTlBhdGggcXVlcnknKTsKICAgIH0KICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMik7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihleHRyYUFyZ3MucHJvcHNUb01hdGNoLCAndXJsJyk7CiAgICBjb25zdCBsb2dhbGwgPSBqc29ucSA9PT0gJyc7CiAgICBwcm94eUFwcGx5Rm4oJ2ZldGNoJywgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IGFyZ3MgPSBjb250ZXh0LmNhbGxBcmdzOwogICAgICAgIGNvbnN0IGZldGNoUHJvbWlzZSA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIGlmICggcHJvcE5lZWRsZXMuc2l6ZSAhPT0gMCApIHsKICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbiguLi5hcmdzKTsKICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCBwcm9wcyk7CiAgICAgICAgICAgIGlmICggbWF0Y2hlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gZmV0Y2hQcm9taXNlOyB9CiAgICAgICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBNYXRjaGVkICJwcm9wc1RvTWF0Y2giOlxuXHQke21hdGNoZWQuam9pbignXG5cdCcpfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmZXRjaFByb21pc2UudGhlbihyZXNwb25zZUJlZm9yZSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzcG9uc2VCZWZvcmUuY2xvbmUoKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKS50aGVuKHRleHRCZWZvcmUgPT4gewogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdGV4dEJlZm9yZSAhPT0gJ3N0cmluZycgKSB7IHJldHVybiB0ZXh0QmVmb3JlOyB9CiAgICAgICAgICAgICAgICBpZiAoIGxvZ2FsbCApIHsKICAgICAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIHRleHRCZWZvcmUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJlZm9yZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHRleHRBZnRlciA9IGpzb25sRWRpdEZuKGpzb25wLCB0ZXh0QmVmb3JlKTsKICAgICAgICAgICAgICAgIGlmICggdGV4dEFmdGVyID09PSB0ZXh0QmVmb3JlICkgeyByZXR1cm4gcmVzcG9uc2VCZWZvcmU7IH0KICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1BydW5lZCcpOwogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VBZnRlciA9IG5ldyBSZXNwb25zZSh0ZXh0QWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlQmVmb3JlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZUJlZm9yZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlQmVmb3JlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJlc3BvbnNlQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBvazogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUub2sgfSwKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkOiB7IHZhbHVlOiByZXNwb25zZUJlZm9yZS5yZWRpcmVjdGVkIH0sCiAgICAgICAgICAgICAgICAgICAgdHlwZTogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudHlwZSB9LAogICAgICAgICAgICAgICAgICAgIHVybDogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudXJsIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUFmdGVyOwogICAgICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJlZm9yZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgcmV0dXJuIGZldGNoUHJvbWlzZTsKICAgICAgICB9KTsKICAgIH0pOwp9CgogIChmdW5jdGlvbiBqc29ubEVkaXRGZXRjaFJlc3BvbnNlKGpzb25xID0gJycsIC4uLmFyZ3MpIHsKICAgIGpzb25sRWRpdEZldGNoUmVzcG9uc2VGbihmYWxzZSwganNvbnEsIC4uLmFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-jsonl-edit-fetch-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCBpbXBsaWNpdCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG5lZWRsZXMgPSBuZXcgTWFwKCk7CiAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gdW5kZWZpbmVkIHx8IHByb3BzVG9NYXRjaCA9PT0gJycgKSB7IHJldHVybiBuZWVkbGVzOyB9CiAgICBjb25zdCBvcHRpb25zID0geyBjYW5OZWdhdGU6IHRydWUgfTsKICAgIGZvciAoIGNvbnN0IG5lZWRsZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHByb3BzVG9NYXRjaCwgL1xzKy8pICkgewogICAgICAgIGxldCBbIHByb3AsIHBhdHRlcm4gXSA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwobmVlZGxlLCAnOicpOwogICAgICAgIGlmICggcHJvcCA9PT0gJycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgJiYgL1teJFx3IC1dLy50ZXN0KHByb3ApICkgewogICAgICAgICAgICBwcm9wID0gYCR7cHJvcH06JHtwYXR0ZXJufWA7CiAgICAgICAgICAgIHBhdHRlcm4gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmICggcGF0dGVybiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBuZWVkbGVzLnNldChwcm9wLCBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgICB9IGVsc2UgaWYgKCBpbXBsaWNpdCAhPT0gJycgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KGltcGxpY2l0LCBzYWZlLmluaXRQYXR0ZXJuKHByb3AsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZGxlczsKfQpmdW5jdGlvbiBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgLi4ub2JqcykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBtYXRjaGVkID0gW107CiAgICBmb3IgKCBjb25zdCBvYmogb2Ygb2JqcyApIHsKICAgICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgZm9yICggY29uc3QgWyBwcm9wLCBkZXRhaWxzIF0gb2YgcHJvcE5lZWRsZXMgKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkodmFsdWUpOyB9CiAgICAgICAgICAgICAgICBjYXRjaCB7IH0KICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4oZGV0YWlscywgdmFsdWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG1hdGNoZWQucHVzaChgJHtwcm9wfTogJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0Y2hlZDsKfQpmdW5jdGlvbiBqc29ubEVkaXRGbihqc29ucCwgdGV4dCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxpbmVTZXBhcmF0b3IgPSAvXHI/XG4vLmV4ZWModGV4dCk/LlswXSB8fCAnXG4nOwogICAgY29uc3QgbGluZXNCZWZvcmUgPSB0ZXh0LnNwbGl0KCdcbicpOwogICAgY29uc3QgbGluZXNBZnRlciA9IFtdOwogICAgZm9yICggY29uc3QgbGluZUJlZm9yZSBvZiBsaW5lc0JlZm9yZSApIHsKICAgICAgICBsZXQgb2JqOwogICAgICAgIHRyeSB7IG9iaiA9IHNhZmUuSlNPTl9wYXJzZShsaW5lQmVmb3JlKTsgfSBjYXRjaCB7IH0KICAgICAgICBpZiAoIHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCApIHsKICAgICAgICAgICAgbGluZXNBZnRlci5wdXNoKGxpbmVCZWZvcmUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBqc29ucC5hcHBseShvYmopOwogICAgICAgIGlmICggb2JqQWZ0ZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgbGluZXNBZnRlci5wdXNoKGxpbmVCZWZvcmUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGluZUFmdGVyID0gc2FmZS5KU09OX3N0cmluZ2lmeShvYmpBZnRlcik7CiAgICAgICAgbGluZXNBZnRlci5wdXNoKGxpbmVBZnRlcik7CiAgICB9CiAgICByZXR1cm4gbGluZXNBZnRlci5qb2luKGxpbmVTZXBhcmF0b3IpOwp9CmNsYXNzIEpTT05QYXRoIHsKICAgIHN0YXRpYyBjcmVhdGUocXVlcnkpIHsKICAgICAgICBjb25zdCBqc29ucCA9IG5ldyBKU09OUGF0aCgpOwogICAgICAgIGpzb25wLmNvbXBpbGUocXVlcnkpOwogICAgICAgIHJldHVybiBqc29ucDsKICAgIH0KICAgIHN0YXRpYyB0b0pTT04ob2JqLCBzdHJpbmdpZmllciwgLi4uYXJncykgewogICAgICAgIHJldHVybiAoc3RyaW5naWZpZXIgfHwgSlNPTi5zdHJpbmdpZnkpKG9iaiwgLi4uYXJncykKICAgICAgICAgICAgLnJlcGxhY2UoL1wvL2csICdcXC8nKTsKICAgIH0KICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgJiYgdGhpcy4jY29tcGlsZWQucnZhbDsKICAgIH0KICAgIHNldCB2YWx1ZSh2KSB7CiAgICAgICAgaWYgKCB0aGlzLiNjb21waWxlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICB0aGlzLiNjb21waWxlZC5ydmFsID0gdjsKICAgIH0KICAgIGdldCB2YWxpZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZWQgIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbXBpbGUocXVlcnkpIHsKICAgICAgICB0aGlzLiNjb21waWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgMCk7CiAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggci5pICE9PSBxdWVyeS5sZW5ndGggKSB7CiAgICAgICAgICAgIGxldCB2YWw7CiAgICAgICAgICAgIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnPScsIHIuaSkgKSB7CiAgICAgICAgICAgICAgICBpZiAoIC9ePXJlcGxcKC4rXCkkLy50ZXN0KHF1ZXJ5LnNsaWNlKHIuaSkpICkgewogICAgICAgICAgICAgICAgICAgIHIubW9kaWZ5ID0gJ3JlcGwnOwogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSs2LCAtMSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IHF1ZXJ5LnNsaWNlKHIuaSsxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggcXVlcnkuc3RhcnRzV2l0aCgnKz0nLCByLmkpICkgewogICAgICAgICAgICAgICAgci5tb2RpZnkgPSAnKyc7CiAgICAgICAgICAgICAgICB2YWwgPSBxdWVyeS5zbGljZShyLmkrMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsgci5ydmFsID0gSlNPTi5wYXJzZSh2YWwpOyB9CiAgICAgICAgICAgIGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIHRoaXMuI2NvbXBpbGVkID0gcjsKICAgIH0KICAgIGV2YWx1YXRlKHJvb3QpIHsKICAgICAgICBpZiAoIHRoaXMudmFsaWQgPT09IGZhbHNlICkgeyByZXR1cm4gW107IH0KICAgICAgICB0aGlzLiNyb290ID0gcm9vdDsKICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuI2V2YWx1YXRlKHRoaXMuI2NvbXBpbGVkLnN0ZXBzLCBbXSk7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgfQogICAgYXBwbHkocm9vdCkgewogICAgICAgIGlmICggdGhpcy52YWxpZCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHsgcnZhbCB9ID0gdGhpcy4jY29tcGlsZWQ7CiAgICAgICAgdGhpcy4jcm9vdCA9IHsgJyQnOiByb290IH07CiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLiNldmFsdWF0ZSh0aGlzLiNjb21waWxlZC5zdGVwcywgW10pOwogICAgICAgIGxldCBpID0gcGF0aHMubGVuZ3RoCiAgICAgICAgaWYgKCBpID09PSAwICkgeyB0aGlzLiNyb290ID0gbnVsbDsgcmV0dXJuOyB9CiAgICAgICAgd2hpbGUgKCBpLS0gKSB7CiAgICAgICAgICAgIGNvbnN0IHsgb2JqLCBrZXkgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhzW2ldKTsKICAgICAgICAgICAgaWYgKCBydmFsICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNtb2RpZnlWYWwob2JqLCBrZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KG9iaikgJiYgdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgICAgICBvYmouc3BsaWNlKGtleSwgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb2JqW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jcm9vdFsnJCddID8/IG51bGw7CiAgICAgICAgdGhpcy4jcm9vdCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGR1bXAoKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuI2NvbXBpbGVkKTsKICAgIH0KICAgIHRvSlNPTihvYmosIC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gSlNPTlBhdGgudG9KU09OKG9iaiwgbnVsbCwgLi4uYXJncykKICAgIH0KICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHsKICAgICAgICByZXR1cm4gJ0pTT05QYXRoJzsKICAgIH0KICAgICNVTkRFRklORUQgPSAwOwogICAgI1JPT1QgPSAxOwogICAgI0NVUlJFTlQgPSAyOwogICAgI0NISUxEUkVOID0gMzsKICAgICNERVNDRU5EQU5UUyA9IDQ7CiAgICAjcmVVbnF1b3RlZElkZW50aWZpZXIgPSAvXltBLVphLXpfXVtcd10qfF5cKi87CiAgICAjcmVFeHByID0gL14oWyE9XiQqXT18Wzw+XT0/KSguKz8pXF0vOwogICAgI3JlSW5kaWNlID0gL14tP1xkKy87CiAgICAjcm9vdDsKICAgICNjb21waWxlZDsKICAgICNjb21waWxlKHF1ZXJ5LCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHN0ZXBzID0gW107CiAgICAgICAgbGV0IGMgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmICggYyA9PT0gMHgyNCAvKiAkICovICkgewogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXY6IHRoaXMuI1JPT1QgfSk7CiAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICB9IGVsc2UgaWYgKCBjID09PSAweDQwIC8qIEAgKi8gKSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogdGhpcy4jQ1VSUkVOVCB9KTsKICAgICAgICAgICAgaSArPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdjogaSA9PT0gMCA/IHRoaXMuI1JPT1QgOiB0aGlzLiNDVVJSRU5UIH0pOwogICAgICAgIH0KICAgICAgICBsZXQgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGkgPT09IHF1ZXJ5Lmxlbmd0aCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIGlmICggYyA9PT0gMHgyMCAvKiB3aGl0ZXNwYWNlICovICkgewogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRG90IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIGMgPT09IDB4MkUgLyogLiAqLyApIHsKICAgICAgICAgICAgICAgIGlmICggbXYgIT09IHRoaXMuI1VOREVGSU5FRCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJy4uJywgaSkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNERVNDRU5EQU5UUzsKICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jQ0hJTERSRU47CiAgICAgICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjICE9PSAweDVCIC8qIFsgKi8gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG12ID09PSB0aGlzLiNVTkRFRklORUQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHN0ZXBzLmF0KC0xKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHN0ZXAgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNjb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKHF1ZXJ5LCBpKTsKICAgICAgICAgICAgICAgIGlmICAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHMgfSk7CiAgICAgICAgICAgICAgICBpICs9IHMubGVuZ3RoOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCcmFja2V0IGFjY2Vzc29yIHN5bnRheAogICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ1s/JywgaSkgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3QgPSBxdWVyeS5jaGFyQ29kZUF0KGkrMikgPT09IDB4MjEgLyogISAqLzsKICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpICsgMiArIChub3QgPyAxIDogMCk7CiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29tcGlsZShxdWVyeSwgaik7CiAgICAgICAgICAgICAgICBpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHF1ZXJ5LnN0YXJ0c1dpdGgoJ10nLCByLmkpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIG5vdCApIHsgci5zdGVwcy5hdCgtMSkubm90ID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgc3RlcHMucHVzaCh7IG12OiBtdiB8fCB0aGlzLiNDSElMRFJFTiwgc3RlcHM6IHIuc3RlcHMgfSk7CiAgICAgICAgICAgICAgICBpID0gci5pICsgMTsKICAgICAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCdbKl0nLCBpKSApIHsKICAgICAgICAgICAgICAgIG12IHx8PSB0aGlzLiNDSElMRFJFTjsKICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2goeyBtdiwgazogJyonIH0pOwogICAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgICAgbXYgPSB0aGlzLiNVTkRFRklORUQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jY29uc3VtZUlkZW50aWZpZXIocXVlcnksIGkrMSk7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbXYgfHw9IHRoaXMuI0NISUxEUkVOOwogICAgICAgICAgICBzdGVwcy5wdXNoKHsgbXYsIGs6IHIucyB9KTsKICAgICAgICAgICAgaSA9IHIuaSArIDE7CiAgICAgICAgICAgIG12ID0gdGhpcy4jVU5ERUZJTkVEOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0ZXBzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBtdiAhPT0gdGhpcy4jVU5ERUZJTkVEICkgeyByZXR1cm47IH0KICAgICAgICByZXR1cm4geyBzdGVwcywgaSB9OwogICAgfQogICAgI2V2YWx1YXRlKHN0ZXBzLCBwYXRoaW4pIHsKICAgICAgICBsZXQgcmVzdWx0c2V0ID0gW107CiAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KHN0ZXBzKSA9PT0gZmFsc2UgKSB7IHJldHVybiByZXN1bHRzZXQ7IH0KICAgICAgICBmb3IgKCBjb25zdCBzdGVwIG9mIHN0ZXBzICkgewogICAgICAgICAgICBzd2l0Y2ggKCBzdGVwLm12ICkgewogICAgICAgICAgICBjYXNlIHRoaXMuI1JPT1Q6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIFsgJyQnIF0gXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHRoaXMuI0NVUlJFTlQ6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSBbIHBhdGhpbiBdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdGhpcy4jQ0hJTERSRU46CiAgICAgICAgICAgIGNhc2UgdGhpcy4jREVTQ0VOREFOVFM6CiAgICAgICAgICAgICAgICByZXN1bHRzZXQgPSB0aGlzLiNnZXRNYXRjaGVzKHJlc3VsdHNldCwgc3RlcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzZXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlcyhsaXN0aW4sIHN0ZXApIHsKICAgICAgICBjb25zdCBsaXN0b3V0ID0gW107CiAgICAgICAgZm9yICggY29uc3QgcGF0aGluIG9mIGxpc3RpbiApIHsKICAgICAgICAgICAgY29uc3QgeyB2YWx1ZTogb3duZXIgfSA9IHRoaXMuI3Jlc29sdmVQYXRoKHBhdGhpbik7CiAgICAgICAgICAgIGlmICggc3RlcC5rID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUFsbChwYXRoaW4sIHN0ZXAsIG93bmVyLCBsaXN0b3V0KTsKICAgICAgICAgICAgfSBlbHNlIGlmICggc3RlcC5rICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHN0ZXAuc3RlcHMgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNnZXRNYXRjaGVzRnJvbUV4cHIocGF0aGluLCBzdGVwLCBvd25lciwgbGlzdG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpc3RvdXQ7CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21BbGwocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3QgcmVjdXJzaXZlID0gc3RlcC5tdiA9PT0gdGhpcy4jREVTQ0VOREFOVFM7CiAgICAgICAgZm9yICggY29uc3QgeyBwYXRoIH0gb2YgdGhpcy4jZ2V0RGVzY2VuZGFudHMob3duZXIsIHJlY3Vyc2l2ZSkgKSB7CiAgICAgICAgICAgIG91dC5wdXNoKFsgLi4ucGF0aGluLCAuLi5wYXRoIF0pOwogICAgICAgIH0KICAgIH0KICAgICNnZXRNYXRjaGVzRnJvbUtleXMocGF0aGluLCBzdGVwLCBvd25lciwgb3V0KSB7CiAgICAgICAgY29uc3Qga2sgPSBBcnJheS5pc0FycmF5KHN0ZXAuaykgPyBzdGVwLmsgOiBbIHN0ZXAuayBdOwogICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLiNldmFsdWF0ZUV4cHIoc3RlcCwgb3duZXIsIGspOwogICAgICAgICAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgfQogICAgICAgIGlmICggc3RlcC5tdiAhPT0gdGhpcy4jREVTQ0VOREFOVFMgKSB7IHJldHVybjsgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgdHJ1ZSkgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGsgb2Yga2sgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy4jZXZhbHVhdGVFeHByKHN0ZXAsIG9ialtrZXldLCBrKTsKICAgICAgICAgICAgICAgIGlmICggbm9ybWFsaXplZCA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0LnB1c2goWyAuLi5wYXRoaW4sIC4uLnBhdGgsIG5vcm1hbGl6ZWQgXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjZ2V0TWF0Y2hlc0Zyb21FeHByKHBhdGhpbiwgc3RlcCwgb3duZXIsIG91dCkgewogICAgICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IHN0ZXAubXYgPT09IHRoaXMuI0RFU0NFTkRBTlRTOwogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jZXZhbHVhdGUoc3RlcC5zdGVwcywgcGF0aGluKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCAhPT0gMCApIHsgb3V0LnB1c2gocGF0aGluKTsgfQogICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSAhPT0gdHJ1ZSApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGZvciAoIGNvbnN0IHsgb2JqLCBrZXksIHBhdGggfSBvZiB0aGlzLiNnZXREZXNjZW5kYW50cyhvd25lciwgcmVjdXJzaXZlKSApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG9ialtrZXldKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgY29uc3QgcSA9IFsgLi4ucGF0aGluLCAuLi5wYXRoIF07CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiNldmFsdWF0ZShzdGVwLnN0ZXBzLCBxKTsKICAgICAgICAgICAgaWYgKCByLmxlbmd0aCA9PT0gMCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgb3V0LnB1c2gocSk7CiAgICAgICAgfQogICAgfQogICAgI25vcm1hbGl6ZUtleShvd25lciwga2V5KSB7CiAgICAgICAgaWYgKCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyApIHsKICAgICAgICAgICAgaWYgKCBBcnJheS5pc0FycmF5KG93bmVyKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPj0gMCA/IGtleSA6IG93bmVyLmxlbmd0aCArIGtleTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAgI2dldERlc2NlbmRhbnRzKHYsIHJlY3Vyc2l2ZSkgewogICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICBuZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuc3RhY2subGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKCBuID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB0aGlzLnN0YWNrW24tMV07CiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGRldGFpbHMua2V5cy5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoIGVudHJ5LmRvbmUgKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGgucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wYXRoW24tMV0gPSBlbnRyeS52YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgb2JqOiBkZXRhaWxzLm9iaiwKICAgICAgICAgICAgICAgICAgICBrZXk6IGVudHJ5LnZhbHVlLAogICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aC5zbGljZSgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlLm9ialt0aGlzLnZhbHVlLmtleV07CiAgICAgICAgICAgICAgICBpZiAoIHJlY3Vyc2l2ZSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogdi5rZXlzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IG9iajogdiwga2V5czogT2JqZWN0LmtleXModikudmFsdWVzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhdGg6IFtdLAogICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgICAgICBkb25lOiBmYWxzZSwKICAgICAgICAgICAgc3RhY2s6IFtdLAogICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH0sCiAgICAgICAgfTsKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodikgKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLnN0YWNrLnB1c2goeyBvYmo6IHYsIGtleXM6IHYua2V5cygpIH0pOwogICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICBpdGVyYXRvci5zdGFjay5wdXNoKHsgb2JqOiB2LCBrZXlzOiBPYmplY3Qua2V5cyh2KS52YWx1ZXMoKSB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgfQogICAgI2NvbnN1bWVJZGVudGlmaWVyKHF1ZXJ5LCBpKSB7CiAgICAgICAgY29uc3Qga2V5cyA9IFtdOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgY29uc3QgYzAgPSBxdWVyeS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoIGMwID09PSAweDVEIC8qIF0gKi8gKSB7IGJyZWFrOyB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MkMgLyogLCAqLyApIHsKICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYzAgPT09IDB4MjcgLyogJyAqLyApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiN1bnRpbENoYXIocXVlcnksIDB4MjcgLyogJyAqLywgaSsxKQogICAgICAgICAgICAgICAgaWYgKCByID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAga2V5cy5wdXNoKHIucyk7CiAgICAgICAgICAgICAgICBpID0gci5pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjMCA9PT0gMHgyRCAvKiAtICovIHx8IGMwID49IDB4MzAgJiYgYzAgPD0gMHgzOSApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jcmVJbmRpY2UuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGNvbnN0IGluZGljZSA9IHBhcnNlSW50KHF1ZXJ5LnNsaWNlKGkpLCAxMCk7CiAgICAgICAgICAgICAgICBrZXlzLnB1c2goaW5kaWNlKTsKICAgICAgICAgICAgICAgIGkgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpOwogICAgICAgICAgICBpZiAoIHMgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGtleXMucHVzaChzKTsKICAgICAgICAgICAgaSArPSBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczoga2V5cy5sZW5ndGggPT09IDEgPyBrZXlzWzBdIDoga2V5cywgaSB9OwogICAgfQogICAgI2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIocXVlcnksIGkpIHsKICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuI3JlVW5xdW90ZWRJZGVudGlmaWVyLmV4ZWMocXVlcnkuc2xpY2UoaSkpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIHJldHVybiBtYXRjaFswXTsKICAgIH0KICAgICN1bnRpbENoYXIocXVlcnksIHRhcmdldENoYXJDb2RlLCBpKSB7CiAgICAgICAgY29uc3QgbGVuID0gcXVlcnkubGVuZ3RoOwogICAgICAgIGNvbnN0IHBhcnRzID0gW107CiAgICAgICAgbGV0IGJlZyA9IGksIGVuZCA9IGk7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGVuZCA9PT0gbGVuICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3QgYyA9IHF1ZXJ5LmNoYXJDb2RlQXQoZW5kKTsKICAgICAgICAgICAgaWYgKCBjID09PSB0YXJnZXRDaGFyQ29kZSApIHsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocXVlcnkuc2xpY2UoYmVnLCBlbmQpKTsKICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBjID09PSAweDVDIC8qIFwgKi8gJiYgKGVuZCsxKSA8IGxlbiApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBxdWVyeS5jaGFyQ29kZUF0KGVuZCsxKTsKICAgICAgICAgICAgICAgIGlmICggZCA9PT0gdGFyZ2V0Q2hhckNvZGUgKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChxdWVyeS5zbGljZShiZWcsIGVuZCkpOwogICAgICAgICAgICAgICAgICAgIGVuZCArPSAxOwogICAgICAgICAgICAgICAgICAgIGJlZyA9IGVuZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgczogcGFydHMuam9pbignJyksIGk6IGVuZCB9OwogICAgfQogICAgI2NvbXBpbGVFeHByKHF1ZXJ5LCBzdGVwLCBpKSB7CiAgICAgICAgaWYgKCBxdWVyeS5zdGFydHNXaXRoKCc9LycsIGkpICkgewogICAgICAgICAgICBjb25zdCByID0gdGhpcy4jdW50aWxDaGFyKHF1ZXJ5LCAweDJGIC8qIC8gKi8sIGkrMik7CiAgICAgICAgICAgIGlmICggciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gaTsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eW2ldLy5leGVjKHF1ZXJ5LnNsaWNlKHIuaSkpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3RlcC5ydmFsID0gbmV3IFJlZ0V4cChyLnMsIG1hdGNoICYmIG1hdGNoWzBdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RlcC5vcCA9ICdyZSc7CiAgICAgICAgICAgIGlmICggbWF0Y2ggKSB7IHIuaSArPSBtYXRjaFswXS5sZW5ndGg7IH0KICAgICAgICAgICAgcmV0dXJuIHIuaTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLiNyZUV4cHIuZXhlYyhxdWVyeS5zbGljZShpKSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuIGk7IH0KICAgICAgICB0cnkgewogICAgICAgICAgICBzdGVwLnJ2YWwgPSBKU09OLnBhcnNlKG1hdGNoWzJdKTsKICAgICAgICAgICAgc3RlcC5vcCA9IG1hdGNoWzFdOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICByZXR1cm4gaSArIG1hdGNoWzFdLmxlbmd0aCArIG1hdGNoWzJdLmxlbmd0aDsKICAgIH0KICAgICNyZXNvbHZlUGF0aChwYXRoKSB7CiAgICAgICAgaWYgKCBwYXRoLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuIHsgdmFsdWU6IHRoaXMuI3Jvb3QgfTsgfQogICAgICAgIGNvbnN0IGtleSA9IHBhdGguYXQoLTEpOwogICAgICAgIGxldCBvYmogPSB0aGlzLiNyb290CiAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gcGF0aC5sZW5ndGgtMTsgaSA8IG47IGkrKyApIHsKICAgICAgICAgICAgb2JqID0gb2JqW3BhdGhbaV1dOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBvYmosIGtleSwgdmFsdWU6IG9ialtrZXldIH07CiAgICB9CiAgICAjZXZhbHVhdGVFeHByKHN0ZXAsIG93bmVyLCBrZXkpIHsKICAgICAgICBpZiAoIG93bmVyID09PSB1bmRlZmluZWQgfHwgb3duZXIgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggdHlwZW9mIGtleSA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShvd25lcikgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IHRoaXMuI25vcm1hbGl6ZUtleShvd25lciwga2V5KTsKICAgICAgICBjb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duKG93bmVyLCBrKTsKICAgICAgICBpZiAoIHN0ZXAub3AgIT09IHVuZGVmaW5lZCAmJiBoYXNPd24gPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0YXJnZXQgPSBzdGVwLm5vdCAhPT0gdHJ1ZTsKICAgICAgICBjb25zdCB2ID0gb3duZXJba107CiAgICAgICAgbGV0IG91dGNvbWUgPSBmYWxzZTsKICAgICAgICBzd2l0Y2ggKCBzdGVwLm9wICkgewogICAgICAgIGNhc2UgJz09Jzogb3V0Y29tZSA9ICh2ID09PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJyE9Jzogb3V0Y29tZSA9ICh2ICE9PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc8Jzogb3V0Y29tZSA9ICh2IDwgc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc8PSc6IG91dGNvbWUgPSAodiA8PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgICc+Jzogb3V0Y29tZSA9ICh2ID4gc3RlcC5ydmFsKSA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICBjYXNlICc+PSc6IG91dGNvbWUgPSAodiA+PSBzdGVwLnJ2YWwpID09PSB0YXJnZXQ7IGJyZWFrOwogICAgICAgIGNhc2UgJ149Jzogb3V0Y29tZSA9IGAke3Z9YC5zdGFydHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnJD0nOiBvdXRjb21lID0gYCR7dn1gLmVuZHNXaXRoKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAnKj0nOiBvdXRjb21lID0gYCR7dn1gLmluY2x1ZGVzKHN0ZXAucnZhbCkgPT09IHRhcmdldDsgYnJlYWs7CiAgICAgICAgY2FzZSAncmUnOiBvdXRjb21lID0gc3RlcC5ydmFsLnRlc3QoYCR7dn1gKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogb3V0Y29tZSA9IGhhc093biA9PT0gdGFyZ2V0OyBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCBvdXRjb21lICkgeyByZXR1cm4gazsgfQogICAgfQogICAgI21vZGlmeVZhbChvYmosIGtleSkgewogICAgICAgIGNvbnN0IHsgbW9kaWZ5LCBydmFsIH0gPSB0aGlzLiNjb21waWxlZDsKICAgICAgICBzd2l0Y2ggKCBtb2RpZnkgKSB7CiAgICAgICAgY2FzZSB1bmRlZmluZWQ6CiAgICAgICAgICAgIG9ialtrZXldID0gcnZhbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnKyc6IHsKICAgICAgICAgICAgaWYgKCBydmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCBsdmFsIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggQXJyYXkuaXNBcnJheShsdmFsKSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGZvciAoIGNvbnN0IFsgaywgdiBdIG9mIE9iamVjdC5lbnRyaWVzKHJ2YWwpICkgewogICAgICAgICAgICAgICAgbHZhbFtrXSA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgJ3JlcGwnOiB7CiAgICAgICAgICAgIGNvbnN0IGx2YWwgPSBvYmpba2V5XTsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgbHZhbCAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIHRoaXMuI2NvbXBpbGVkLnJlID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNjb21waWxlZC5yZSA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuI2NvbXBpbGVkLnJlID0gcnZhbC5yZWdleCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFJlZ0V4cChydmFsLnJlZ2V4LCBydmFsLmZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAocnZhbC5wYXR0ZXJuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdGhpcy4jY29tcGlsZWQucmUgPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICBvYmpba2V5XSA9IGx2YWwucmVwbGFjZSh0aGlzLiNjb21waWxlZC5yZSwgcnZhbC5yZXBsYWNlbWVudCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KZnVuY3Rpb24gY29sbGF0ZUZldGNoQXJndW1lbnRzRm4ocmVzb3VyY2UsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcHJvcHMgPSBbCiAgICAgICAgJ2JvZHknLCAnY2FjaGUnLCAnY3JlZGVudGlhbHMnLCAnZHVwbGV4JywgJ2hlYWRlcnMnLAogICAgICAgICdpbnRlZ3JpdHknLCAna2VlcGFsaXZlJywgJ21ldGhvZCcsICdtb2RlJywgJ3ByaW9yaXR5JywKICAgICAgICAncmVkaXJlY3QnLCAncmVmZXJyZXInLCAncmVmZXJyZXJQb2xpY3knLCAndXJsJwogICAgXTsKICAgIGNvbnN0IG91dCA9IHt9OwogICAgaWYgKCBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzID0gKHNyYywgb3V0KSA9PiB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IHByb3Agb2YgcHJvcHMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNyY1twcm9wXSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0W3Byb3BdID0gc3JjW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGlmICgKICAgICAgICB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnIHx8CiAgICAgICAgc2FmZS5PYmplY3RfdG9TdHJpbmcuY2FsbChyZXNvdXJjZSkgIT09ICdbb2JqZWN0IFJlcXVlc3RdJwogICAgKSB7CiAgICAgICAgb3V0LnVybCA9IGAke3Jlc291cmNlfWA7CiAgICB9IGVsc2UgewogICAgICAgIGxldCBjbG9uZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjbG9uZSA9IHNhZmUuUmVxdWVzdF9jbG9uZS5jYWxsKHJlc291cmNlKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMoY2xvbmUgfHwgcmVzb3VyY2UsIG91dCk7CiAgICB9CiAgICBpZiAoIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKG9wdGlvbnMsIG91dCk7CiAgICB9CiAgICByZXR1cm4gb3V0Owp9CmZ1bmN0aW9uIGpzb25sRWRpdEZldGNoUmVzcG9uc2VGbih0cnVzdGVkLCBqc29ucSA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgKICAgICAgICBgJHt0cnVzdGVkID8gJ3RydXN0ZWQtJyA6ICcnfWpzb25sLWVkaXQtZmV0Y2gtcmVzcG9uc2VgLAogICAgICAgIGpzb25xCiAgICApOwogICAgY29uc3QganNvbnAgPSBKU09OUGF0aC5jcmVhdGUoanNvbnEpOwogICAgaWYgKCBqc29ucC52YWxpZCA9PT0gZmFsc2UgfHwganNvbnAudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0cnVzdGVkICE9PSB0cnVlICkgewogICAgICAgIHJldHVybiBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdCYWQgSlNPTlBhdGggcXVlcnknKTsKICAgIH0KICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMik7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihleHRyYUFyZ3MucHJvcHNUb01hdGNoLCAndXJsJyk7CiAgICBjb25zdCBsb2dhbGwgPSBqc29ucSA9PT0gJyc7CiAgICBwcm94eUFwcGx5Rm4oJ2ZldGNoJywgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IGFyZ3MgPSBjb250ZXh0LmNhbGxBcmdzOwogICAgICAgIGNvbnN0IGZldGNoUHJvbWlzZSA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIGlmICggcHJvcE5lZWRsZXMuc2l6ZSAhPT0gMCApIHsKICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbiguLi5hcmdzKTsKICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCBwcm9wcyk7CiAgICAgICAgICAgIGlmICggbWF0Y2hlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gZmV0Y2hQcm9taXNlOyB9CiAgICAgICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBNYXRjaGVkICJwcm9wc1RvTWF0Y2giOlxuXHQke21hdGNoZWQuam9pbignXG5cdCcpfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmZXRjaFByb21pc2UudGhlbihyZXNwb25zZUJlZm9yZSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzcG9uc2VCZWZvcmUuY2xvbmUoKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKS50aGVuKHRleHRCZWZvcmUgPT4gewogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdGV4dEJlZm9yZSAhPT0gJ3N0cmluZycgKSB7IHJldHVybiB0ZXh0QmVmb3JlOyB9CiAgICAgICAgICAgICAgICBpZiAoIGxvZ2FsbCApIHsKICAgICAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIHRleHRCZWZvcmUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJlZm9yZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHRleHRBZnRlciA9IGpzb25sRWRpdEZuKGpzb25wLCB0ZXh0QmVmb3JlKTsKICAgICAgICAgICAgICAgIGlmICggdGV4dEFmdGVyID09PSB0ZXh0QmVmb3JlICkgeyByZXR1cm4gcmVzcG9uc2VCZWZvcmU7IH0KICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1BydW5lZCcpOwogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VBZnRlciA9IG5ldyBSZXNwb25zZSh0ZXh0QWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlQmVmb3JlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZUJlZm9yZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlQmVmb3JlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJlc3BvbnNlQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBvazogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUub2sgfSwKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkOiB7IHZhbHVlOiByZXNwb25zZUJlZm9yZS5yZWRpcmVjdGVkIH0sCiAgICAgICAgICAgICAgICAgICAgdHlwZTogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudHlwZSB9LAogICAgICAgICAgICAgICAgICAgIHVybDogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudXJsIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUFmdGVyOwogICAgICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJlZm9yZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgcmV0dXJuIGZldGNoUHJvbWlzZTsKICAgICAgICB9KTsKICAgIH0pOwp9CgogIChmdW5jdGlvbiB0cnVzdGVkSnNvbmxFZGl0RmV0Y2hSZXNwb25zZShqc29ucSA9ICcnLCAuLi5hcmdzKSB7CiAgICBqc29ubEVkaXRGZXRjaFJlc3BvbnNlRm4odHJ1ZSwganNvbnEsIC4uLmFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"abort-on-stack-trace.js","aliases":["aost.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KZnVuY3Rpb24gbWF0Y2hlc1N0YWNrVHJhY2VGbigKICAgIG5lZWRsZURldGFpbHMsCiAgICBsb2dMZXZlbCA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBleGNlcHRpb25Ub2tlbiA9IGdldEV4Y2VwdGlvblRva2VuRm4oKTsKICAgIGNvbnN0IGVycm9yID0gbmV3IHNhZmUuRXJyb3IoZXhjZXB0aW9uVG9rZW4pOwogICAgY29uc3QgZG9jVVJMID0gbmV3IFVSTChzZWxmLmxvY2F0aW9uLmhyZWYpOwogICAgZG9jVVJMLmhhc2ggPSAnJzsKICAgIC8vIE5vcm1hbGl6ZSBzdGFjayB0cmFjZQogICAgY29uc3QgcmVMaW5lID0gLyguKj9AKT8oXFMrKSg6XGQrKTpcZCtcKT8kLzsKICAgIGNvbnN0IGxpbmVzID0gW107CiAgICBmb3IgKCBsZXQgbGluZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKGVycm9yLnN0YWNrLCAvW1xuXHJdKy8pICkgewogICAgICAgIGlmICggbGluZS5pbmNsdWRlcyhleGNlcHRpb25Ub2tlbikgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwogICAgICAgIGNvbnN0IG1hdGNoID0gc2FmZS5SZWdFeHBfZXhlYy5jYWxsKHJlTGluZSwgbGluZSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgY29udGludWU7IH0KICAgICAgICBsZXQgdXJsID0gbWF0Y2hbMl07CiAgICAgICAgaWYgKCB1cmwuc3RhcnRzV2l0aCgnKCcpICkgeyB1cmwgPSB1cmwuc2xpY2UoMSk7IH0KICAgICAgICBpZiAoIHVybCA9PT0gZG9jVVJMLmhyZWYgKSB7CiAgICAgICAgICAgIHVybCA9ICdpbmxpbmVTY3JpcHQnOwogICAgICAgIH0gZWxzZSBpZiAoIHVybC5zdGFydHNXaXRoKCc8YW5vbnltb3VzPicpICkgewogICAgICAgICAgICB1cmwgPSAnaW5qZWN0ZWRTY3JpcHQnOwogICAgICAgIH0KICAgICAgICBsZXQgZm4gPSBtYXRjaFsxXSAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgID8gbWF0Y2hbMV0uc2xpY2UoMCwgLTEpCiAgICAgICAgICAgIDogbGluZS5zbGljZSgwLCBtYXRjaC5pbmRleCkudHJpbSgpOwogICAgICAgIGlmICggZm4uc3RhcnRzV2l0aCgnYXQnKSApIHsgZm4gPSBmbi5zbGljZSgyKS50cmltKCk7IH0KICAgICAgICBsZXQgcm93Y29sID0gbWF0Y2hbM107CiAgICAgICAgbGluZXMucHVzaCgnICcgKyBgJHtmbn0gJHt1cmx9JHtyb3djb2x9OjFgLnRyaW0oKSk7CiAgICB9CiAgICBsaW5lc1swXSA9IGBzdGFja0RlcHRoOiR7bGluZXMubGVuZ3RoLTF9YDsKICAgIGNvbnN0IHN0YWNrID0gbGluZXMuam9pbignXHQnKTsKICAgIGNvbnN0IHIgPSBuZWVkbGVEZXRhaWxzLm1hdGNoQWxsICE9PSB0cnVlICYmCiAgICAgICAgc2FmZS50ZXN0UGF0dGVybihuZWVkbGVEZXRhaWxzLCBzdGFjayk7CiAgICBpZiAoCiAgICAgICAgbG9nTGV2ZWwgPT09ICdhbGwnIHx8CiAgICAgICAgbG9nTGV2ZWwgPT09ICdtYXRjaCcgJiYgciB8fAogICAgICAgIGxvZ0xldmVsID09PSAnbm9tYXRjaCcgJiYgIXIKICAgICkgewogICAgICAgIHNhZmUudWJvTG9nKHN0YWNrLnJlcGxhY2UoL1x0L2csICdcbicpKTsKICAgIH0KICAgIHJldHVybiByOwp9CmZ1bmN0aW9uIGdldEV4Y2VwdGlvblRva2VuRm4oKSB7CiAgICBjb25zdCB0b2tlbiA9IGdldFJhbmRvbVRva2VuRm4oKTsKICAgIGNvbnN0IG9lID0gc2VsZi5vbmVycm9yOwogICAgc2VsZi5vbmVycm9yID0gZnVuY3Rpb24obXNnLCAuLi5hcmdzKSB7CiAgICAgICAgaWYgKCB0eXBlb2YgbXNnID09PSAnc3RyaW5nJyAmJiBtc2cuaW5jbHVkZXModG9rZW4pICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgIGlmICggb2UgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHsKICAgICAgICAgICAgcmV0dXJuIG9lLmNhbGwodGhpcywgbXNnLCAuLi5hcmdzKTsKICAgICAgICB9CiAgICB9LmJpbmQoKTsKICAgIHJldHVybiB0b2tlbjsKfQoKICAoZnVuY3Rpb24gYWJvcnRPblN0YWNrVHJhY2UoCiAgICBjaGFpbiA9ICcnLAogICAgbmVlZGxlID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiBjaGFpbiAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBuZWVkbGVEZXRhaWxzID0gc2FmZS5pbml0UGF0dGVybihuZWVkbGUsIHsgY2FuTmVnYXRlOiB0cnVlIH0pOwogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAyKTsKICAgIGlmICggbmVlZGxlID09PSAnJyApIHsgZXh0cmFBcmdzLmxvZyA9ICdhbGwnOyB9CiAgICBjb25zdCBtYWtlUHJveHkgPSBmdW5jdGlvbihvd25lciwgY2hhaW4pIHsKICAgICAgICBjb25zdCBwb3MgPSBjaGFpbi5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgewogICAgICAgICAgICBsZXQgdiA9IG93bmVyW2NoYWluXTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG93bmVyLCBjaGFpbiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2cgPSBzYWZlLmxvZ0xldmVsID4gMSA/ICdhbGwnIDogJ21hdGNoJzsKICAgICAgICAgICAgICAgICAgICBpZiAoIG1hdGNoZXNTdGFja1RyYWNlRm4obmVlZGxlRGV0YWlscywgbG9nKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGdldEV4Y2VwdGlvblRva2VuRm4oKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvZyA9IHNhZmUubG9nTGV2ZWwgPiAxID8gJ2FsbCcgOiAnbWF0Y2gnOwogICAgICAgICAgICAgICAgICAgIGlmICggbWF0Y2hlc1N0YWNrVHJhY2VGbihuZWVkbGVEZXRhaWxzLCBsb2cpICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoZ2V0RXhjZXB0aW9uVG9rZW5GbigpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdiA9IGE7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwcm9wID0gY2hhaW4uc2xpY2UoMCwgcG9zKTsKICAgICAgICBsZXQgdiA9IG93bmVyW3Byb3BdOwogICAgICAgIGNoYWluID0gY2hhaW4uc2xpY2UocG9zICsgMSk7CiAgICAgICAgaWYgKCB2ICkgewogICAgICAgICAgICBtYWtlUHJveHkodiwgY2hhaW4pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG93bmVyLCBwcm9wKTsKICAgICAgICBpZiAoIGRlc2MgJiYgZGVzYy5zZXQgIT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG93bmVyLCBwcm9wLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB2OyB9LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgIHYgPSBhOwogICAgICAgICAgICAgICAgaWYgKCBhIGluc3RhbmNlb2YgT2JqZWN0ICkgewogICAgICAgICAgICAgICAgICAgIG1ha2VQcm94eShhLCBjaGFpbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CiAgICBjb25zdCBvd25lciA9IHdpbmRvdzsKICAgIG1ha2VQcm94eShvd25lciwgY2hhaW4pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-prune-inbound-object.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBnZXRFeGNlcHRpb25Ub2tlbkZuKCkgewogICAgY29uc3QgdG9rZW4gPSBnZXRSYW5kb21Ub2tlbkZuKCk7CiAgICBjb25zdCBvZSA9IHNlbGYub25lcnJvcjsKICAgIHNlbGYub25lcnJvciA9IGZ1bmN0aW9uKG1zZywgLi4uYXJncykgewogICAgICAgIGlmICggdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgJiYgbXNnLmluY2x1ZGVzKHRva2VuKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoIG9lIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIHJldHVybiBvZS5jYWxsKHRoaXMsIG1zZywgLi4uYXJncyk7CiAgICAgICAgfQogICAgfS5iaW5kKCk7CiAgICByZXR1cm4gdG9rZW47Cn0KZnVuY3Rpb24gbWF0Y2hlc1N0YWNrVHJhY2VGbigKICAgIG5lZWRsZURldGFpbHMsCiAgICBsb2dMZXZlbCA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBleGNlcHRpb25Ub2tlbiA9IGdldEV4Y2VwdGlvblRva2VuRm4oKTsKICAgIGNvbnN0IGVycm9yID0gbmV3IHNhZmUuRXJyb3IoZXhjZXB0aW9uVG9rZW4pOwogICAgY29uc3QgZG9jVVJMID0gbmV3IFVSTChzZWxmLmxvY2F0aW9uLmhyZWYpOwogICAgZG9jVVJMLmhhc2ggPSAnJzsKICAgIC8vIE5vcm1hbGl6ZSBzdGFjayB0cmFjZQogICAgY29uc3QgcmVMaW5lID0gLyguKj9AKT8oXFMrKSg6XGQrKTpcZCtcKT8kLzsKICAgIGNvbnN0IGxpbmVzID0gW107CiAgICBmb3IgKCBsZXQgbGluZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKGVycm9yLnN0YWNrLCAvW1xuXHJdKy8pICkgewogICAgICAgIGlmICggbGluZS5pbmNsdWRlcyhleGNlcHRpb25Ub2tlbikgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwogICAgICAgIGNvbnN0IG1hdGNoID0gc2FmZS5SZWdFeHBfZXhlYy5jYWxsKHJlTGluZSwgbGluZSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgY29udGludWU7IH0KICAgICAgICBsZXQgdXJsID0gbWF0Y2hbMl07CiAgICAgICAgaWYgKCB1cmwuc3RhcnRzV2l0aCgnKCcpICkgeyB1cmwgPSB1cmwuc2xpY2UoMSk7IH0KICAgICAgICBpZiAoIHVybCA9PT0gZG9jVVJMLmhyZWYgKSB7CiAgICAgICAgICAgIHVybCA9ICdpbmxpbmVTY3JpcHQnOwogICAgICAgIH0gZWxzZSBpZiAoIHVybC5zdGFydHNXaXRoKCc8YW5vbnltb3VzPicpICkgewogICAgICAgICAgICB1cmwgPSAnaW5qZWN0ZWRTY3JpcHQnOwogICAgICAgIH0KICAgICAgICBsZXQgZm4gPSBtYXRjaFsxXSAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgID8gbWF0Y2hbMV0uc2xpY2UoMCwgLTEpCiAgICAgICAgICAgIDogbGluZS5zbGljZSgwLCBtYXRjaC5pbmRleCkudHJpbSgpOwogICAgICAgIGlmICggZm4uc3RhcnRzV2l0aCgnYXQnKSApIHsgZm4gPSBmbi5zbGljZSgyKS50cmltKCk7IH0KICAgICAgICBsZXQgcm93Y29sID0gbWF0Y2hbM107CiAgICAgICAgbGluZXMucHVzaCgnICcgKyBgJHtmbn0gJHt1cmx9JHtyb3djb2x9OjFgLnRyaW0oKSk7CiAgICB9CiAgICBsaW5lc1swXSA9IGBzdGFja0RlcHRoOiR7bGluZXMubGVuZ3RoLTF9YDsKICAgIGNvbnN0IHN0YWNrID0gbGluZXMuam9pbignXHQnKTsKICAgIGNvbnN0IHIgPSBuZWVkbGVEZXRhaWxzLm1hdGNoQWxsICE9PSB0cnVlICYmCiAgICAgICAgc2FmZS50ZXN0UGF0dGVybihuZWVkbGVEZXRhaWxzLCBzdGFjayk7CiAgICBpZiAoCiAgICAgICAgbG9nTGV2ZWwgPT09ICdhbGwnIHx8CiAgICAgICAgbG9nTGV2ZWwgPT09ICdtYXRjaCcgJiYgciB8fAogICAgICAgIGxvZ0xldmVsID09PSAnbm9tYXRjaCcgJiYgIXIKICAgICkgewogICAgICAgIHNhZmUudWJvTG9nKHN0YWNrLnJlcGxhY2UoL1x0L2csICdcbicpKTsKICAgIH0KICAgIHJldHVybiByOwp9CmZ1bmN0aW9uIHNhZmVTZWxmKCkgewogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmICkgewogICAgICAgIHJldHVybiBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmOwogICAgfQogICAgY29uc3Qgc2VsZiA9IGdsb2JhbFRoaXM7CiAgICBjb25zdCBzYWZlID0gewogICAgICAgICdBcnJheV9mcm9tJzogQXJyYXkuZnJvbSwKICAgICAgICAnRXJyb3InOiBzZWxmLkVycm9yLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZ0ZuJzogc2VsZi5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nJzogdGhpc0FyZyA9PiBzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nRm4uY2FsbCh0aGlzQXJnKSwKICAgICAgICAnTWF0aF9mbG9vcic6IE1hdGguZmxvb3IsCiAgICAgICAgJ01hdGhfbWF4JzogTWF0aC5tYXgsCiAgICAgICAgJ01hdGhfbWluJzogTWF0aC5taW4sCiAgICAgICAgJ01hdGhfcmFuZG9tJzogTWF0aC5yYW5kb20sCiAgICAgICAgJ09iamVjdCc6IE9iamVjdCwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnR5JzogT2JqZWN0LmRlZmluZVByb3BlcnR5LmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnRpZXMnOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9mcm9tRW50cmllcyc6IE9iamVjdC5mcm9tRW50cmllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2hhc093bic6IE9iamVjdC5oYXNPd24uYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfdG9TdHJpbmcnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdSZWdFeHAnOiBzZWxmLlJlZ0V4cCwKICAgICAgICAnUmVnRXhwX3Rlc3QnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUudGVzdCwKICAgICAgICAnUmVnRXhwX2V4ZWMnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUuZXhlYywKICAgICAgICAnUmVxdWVzdF9jbG9uZSc6IHNlbGYuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUsCiAgICAgICAgJ1N0cmluZyc6IHNlbGYuU3RyaW5nLAogICAgICAgICdTdHJpbmdfZnJvbUNoYXJDb2RlJzogU3RyaW5nLmZyb21DaGFyQ29kZSwKICAgICAgICAnU3RyaW5nX3NwbGl0JzogU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwKICAgICAgICAnWE1MSHR0cFJlcXVlc3QnOiBzZWxmLlhNTEh0dHBSZXF1ZXN0LAogICAgICAgICdhZGRFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciwKICAgICAgICAncmVtb3ZlRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ2ZldGNoJzogc2VsZi5mZXRjaCwKICAgICAgICAnSlNPTic6IHNlbGYuSlNPTiwKICAgICAgICAnSlNPTl9wYXJzZUZuJzogc2VsZi5KU09OLnBhcnNlLAogICAgICAgICdKU09OX3N0cmluZ2lmeUZuJzogc2VsZi5KU09OLnN0cmluZ2lmeSwKICAgICAgICAnSlNPTl9wYXJzZSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fcGFyc2VGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5JzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9zdHJpbmdpZnlGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ2xvZyc6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksCiAgICAgICAgLy8gUHJvcGVydGllcwogICAgICAgIGxvZ0xldmVsOiAwLAogICAgICAgIC8vIE1ldGhvZHMKICAgICAgICBtYWtlTG9nUHJlZml4KC4uLmFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyICYmIGBbJHthcmdzLmpvaW4oJyBcdTIwNUQgJyl9XWAgfHwgJyc7CiAgICAgICAgfSwKICAgICAgICB1Ym9Mb2coLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignaW5mbycsIC4uLmFyZ3MpOwogICAgICAgICAgICAKICAgICAgICB9LAogICAgICAgIHVib0VyciguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdlcnJvcicsIC4uLmFyZ3MpOwogICAgICAgIH0sCiAgICAgICAgZXNjYXBlUmVnZXhDaGFycyhzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpOwogICAgICAgIH0sCiAgICAgICAgaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXRjaEFsbDogdHJ1ZSwgZXhwZWN0OiB0cnVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZXhwZWN0ID0gKG9wdGlvbnMuY2FuTmVnYXRlICE9PSB0cnVlIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID09PSBmYWxzZSk7CiAgICAgICAgICAgIGlmICggZXhwZWN0ID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gfHwgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG9wdGlvbnMuZmxhZ3MgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsgcGF0dGVybiwgZXhwZWN0IH07CiAgICAgICAgfSwKICAgICAgICB0ZXN0UGF0dGVybihkZXRhaWxzLCBoYXlzdGFjaykgewogICAgICAgICAgICBpZiAoIGRldGFpbHMubWF0Y2hBbGwgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIGlmICggZGV0YWlscy5yZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJlZ0V4cF90ZXN0LmNhbGwoZGV0YWlscy5yZSwgaGF5c3RhY2spID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMoZGV0YWlscy5wYXR0ZXJuKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgfSwKICAgICAgICBwYXR0ZXJuVG9SZWdleChwYXR0ZXJuLCBmbGFncyA9IHVuZGVmaW5lZCwgdmVyYmF0aW0gPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgeyByZXR1cm4gL14vOyB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgewogICAgICAgICAgICAgICAgY29uc3QgcmVTdHIgPSB0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybik7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh2ZXJiYXRpbSA/IGBeJHtyZVN0cn0kYCA6IHJlU3RyLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gL14vOwogICAgICAgIH0sCiAgICAgICAgZ2V0RXh0cmFBcmdzKGFyZ3MsIG9mZnNldCA9IDApIHsKICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGFyZ3Muc2xpY2Uob2Zmc2V0KS5yZWR1Y2UoKG91dCwgdiwgaSwgYSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCAoaSAmIDEpID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gYVtpKzFdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gL15cZCskLy50ZXN0KHJhd1ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHJhd1ZhbHVlLCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgOiByYXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChbIGFbaV0sIHZhbHVlIF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5PYmplY3RfZnJvbUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUoZm4sIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICAgIH0sCiAgICAgICAgb2ZmSWRsZShpZCkgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbElkbGVDYWxsYmFjayhpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgIH0KICAgIH07CiAgICBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmID0gc2FmZTsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gc2FmZTsgfQogICAgLy8gVGhpcyBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGxvZ2dlciBpcyBvcGVuZWQKICAgIHNhZmUubG9nTGV2ZWwgPSBzY3JpcHRsZXRHbG9iYWxzLmxvZ0xldmVsIHx8IDE7CiAgICBsZXQgbGFzdExvZ1R5cGUgPSAnJzsKICAgIGxldCBsYXN0TG9nVGV4dCA9ICcnOwogICAgbGV0IGxhc3RMb2dUaW1lID0gMDsKICAgIHNhZmUudG9Mb2dUZXh0ID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0ZXh0ID0gYFske2RvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lIHx8IGRvY3VtZW50LmxvY2F0aW9uLmhyZWZ9XSR7YXJncy5qb2luKCcgJyl9YDsKICAgICAgICBpZiAoIHRleHQgPT09IGxhc3RMb2dUZXh0ICYmIHR5cGUgPT09IGxhc3RMb2dUeXBlICkgewogICAgICAgICAgICBpZiAoIChEYXRlLm5vdygpIC0gbGFzdExvZ1RpbWUpIDwgNTAwMCApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGxhc3RMb2dUeXBlID0gdHlwZTsKICAgICAgICBsYXN0TG9nVGV4dCA9IHRleHQ7CiAgICAgICAgbGFzdExvZ1RpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgYmMgPSBuZXcgc2VsZi5Ccm9hZGNhc3RDaGFubmVsKHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQpOwogICAgICAgIGxldCBiY0J1ZmZlciA9IFtdOwogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJjQnVmZmVyLnB1c2goeyB0eXBlLCB0ZXh0IH0pOwogICAgICAgIH07CiAgICAgICAgYmMub25tZXNzYWdlID0gZXYgPT4gewogICAgICAgICAgICBjb25zdCBtc2cgPSBldi5kYXRhOwogICAgICAgICAgICBzd2l0Y2ggKCBtc2cgKSB7CiAgICAgICAgICAgIGNhc2UgJ2lhbXJlYWR5ISc6CiAgICAgICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBiY0J1ZmZlci5mb3JFYWNoKCh7IHR5cGUsIHRleHQgfSkgPT4KICAgICAgICAgICAgICAgICAgICBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYmNCdWZmZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb09uZSc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvVHdvJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGJjLnBvc3RNZXNzYWdlKCdhcmV5b3VyZWFkeT8nKTsKICAgIH0gY2F0Y2ggewogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHNhZmUubG9nKGB1Qk8gJHt0ZXh0fWApOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gc2FmZTsKfQpmdW5jdGlvbiBvYmplY3RQcnVuZUZuKAogICAgb2JqLAogICAgcmF3UHJ1bmVQYXRocywKICAgIHJhd05lZWRsZVBhdGhzLAogICAgc3RhY2tOZWVkbGVEZXRhaWxzID0geyBtYXRjaEFsbDogdHJ1ZSB9LAogICAgZXh0cmFBcmdzID0ge30KKSB7CiAgICBpZiAoIHR5cGVvZiByYXdQcnVuZVBhdGhzICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHBydW5lUGF0aHMgPSByYXdQcnVuZVBhdGhzICE9PSAnJwogICAgICAgID8gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChyYXdQcnVuZVBhdGhzLCAvICsvKQogICAgICAgIDogW107CiAgICBjb25zdCBuZWVkbGVQYXRocyA9IHBydW5lUGF0aHMubGVuZ3RoICE9PSAwICYmIHJhd05lZWRsZVBhdGhzICE9PSAnJwogICAgICAgID8gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChyYXdOZWVkbGVQYXRocywgLyArLykKICAgICAgICA6IFtdOwogICAgaWYgKCBzdGFja05lZWRsZURldGFpbHMubWF0Y2hBbGwgIT09IHRydWUgKSB7CiAgICAgICAgaWYgKCBtYXRjaGVzU3RhY2tUcmFjZUZuKHN0YWNrTmVlZGxlRGV0YWlscywgZXh0cmFBcmdzLmxvZ3N0YWNrKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3MgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBvYmplY3RQcnVuZUZuLm11c3RQcm9jZXNzID0gKHJvb3QsIG5lZWRsZVBhdGhzKSA9PiB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IG5lZWRsZVBhdGggb2YgbmVlZGxlUGF0aHMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKHJvb3QsIG5lZWRsZVBhdGgpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgIH0KICAgIGlmICggcHJ1bmVQYXRocy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgbGV0IG91dGNvbWUgPSAnbm9tYXRjaCc7CiAgICBpZiAoIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3Mob2JqLCBuZWVkbGVQYXRocykgKSB7CiAgICAgICAgZm9yICggY29uc3QgcGF0aCBvZiBwcnVuZVBhdGhzICkgewogICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG9iaiwgcGF0aCwgdHJ1ZSkgKSB7CiAgICAgICAgICAgICAgICBvdXRjb21lID0gJ21hdGNoJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICggb3V0Y29tZSA9PT0gJ21hdGNoJyApIHsgcmV0dXJuIG9iajsgfQp9CmZ1bmN0aW9uIG9iamVjdEZpbmRPd25lckZuKAogICAgcm9vdCwKICAgIHBhdGgsCiAgICBwcnVuZSA9IGZhbHNlCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBsZXQgb3duZXIgPSByb290OwogICAgbGV0IGNoYWluID0gcGF0aDsKICAgIGZvciAoOzspIHsKICAgICAgICBpZiAoIHR5cGVvZiBvd25lciAhPT0gJ29iamVjdCcgfHwgb3duZXIgPT09IG51bGwgICkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICBjb25zdCBwb3MgPSBjaGFpbi5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgewogICAgICAgICAgICBpZiAoIHBydW5lID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzYWZlLk9iamVjdF9oYXNPd24ob3duZXIsIGNoYWluKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCBjaGFpbiA9PT0gJyonICkgewogICAgICAgICAgICAgICAgZm9yICggY29uc3Qga2V5IGluIG93bmVyICkgewogICAgICAgICAgICAgICAgICAgIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBrZXkpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJba2V5XTsKICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHNhZmUuT2JqZWN0X2hhc093bihvd25lciwgY2hhaW4pICkgewogICAgICAgICAgICAgICAgZGVsZXRlIG93bmVyW2NoYWluXTsKICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByb3AgPSBjaGFpbi5zbGljZSgwLCBwb3MpOwogICAgICAgIGNvbnN0IG5leHQgPSBjaGFpbi5zbGljZShwb3MgKyAxKTsKICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKICAgICAgICBpZiAoIHByb3AgPT09ICdbLV0nICYmIEFycmF5LmlzQXJyYXkob3duZXIpICkgewogICAgICAgICAgICBsZXQgaSA9IG93bmVyLmxlbmd0aDsKICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG93bmVyW2ldLCBuZXh0KSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBvd25lci5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwogICAgICAgIH0KICAgICAgICBpZiAoIHByb3AgPT09ICd7LX0nICYmIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0ICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3duZXIpICkgewogICAgICAgICAgICAgICAgaWYgKCBvYmplY3RGaW5kT3duZXJGbihvd25lcltrZXldLCBuZXh0KSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJba2V5XTsKICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICgKICAgICAgICAgICAgcHJvcCA9PT0gJ1tdJyAmJiBBcnJheS5pc0FycmF5KG93bmVyKSB8fAogICAgICAgICAgICBwcm9wID09PSAne30nICYmIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0IHx8CiAgICAgICAgICAgIHByb3AgPT09ICcqJyAmJiBvd25lciBpbnN0YW5jZW9mIE9iamVjdAogICAgICAgICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3duZXIpICkgewogICAgICAgICAgICAgICAgaWYgKG9iamVjdEZpbmRPd25lckZuKG93bmVyW2tleV0sIG5leHQsIHBydW5lKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwogICAgICAgIH0KICAgICAgICBpZiAoIHNhZmUuT2JqZWN0X2hhc093bihvd25lciwgcHJvcCkgPT09IGZhbHNlICkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICBvd25lciA9IG93bmVyW3Byb3BdOwogICAgICAgIGNoYWluID0gY2hhaW4uc2xpY2UocG9zICsgMSk7CiAgICB9Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRQcnVuZUluYm91bmRPYmplY3QoCiAgICBlbnRyeVBvaW50ID0gJycsCiAgICBhcmdQb3MgPSAnJywKICAgIHJhd1BydW5lUGF0aHMgPSAnJywKICAgIHJhd05lZWRsZVBhdGhzID0gJycKKSB7CiAgICBpZiAoIGVudHJ5UG9pbnQgPT09ICcnICkgeyByZXR1cm47IH0KICAgIGxldCBjb250ZXh0ID0gZ2xvYmFsVGhpczsKICAgIGxldCBwcm9wID0gZW50cnlQb2ludDsKICAgIGZvciAoOzspIHsKICAgICAgICBjb25zdCBwb3MgPSBwcm9wLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IGJyZWFrOyB9CiAgICAgICAgY29udGV4dCA9IGNvbnRleHRbcHJvcC5zbGljZSgwLCBwb3MpXTsKICAgICAgICBpZiAoIGNvbnRleHQgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBwcm9wID0gcHJvcC5zbGljZShwb3MrMSk7CiAgICB9CiAgICBpZiAoIHR5cGVvZiBjb250ZXh0W3Byb3BdICE9PSAnZnVuY3Rpb24nICkgeyByZXR1cm47IH0KICAgIGNvbnN0IGFyZ0luZGV4ID0gcGFyc2VJbnQoYXJnUG9zKTsKICAgIGlmICggaXNOYU4oYXJnSW5kZXgpICkgeyByZXR1cm47IH0KICAgIGlmICggYXJnSW5kZXggPCAxICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCA0KTsKICAgIGNvbnN0IG5lZWRsZVBhdGhzID0gW107CiAgICBpZiAoIHJhd1BydW5lUGF0aHMgIT09ICcnICkgewogICAgICAgIG5lZWRsZVBhdGhzLnB1c2goLi4uc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChyYXdQcnVuZVBhdGhzLCAvICsvKSk7CiAgICB9CiAgICBpZiAoIHJhd05lZWRsZVBhdGhzICE9PSAnJyApIHsKICAgICAgICBuZWVkbGVQYXRocy5wdXNoKC4uLnNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocmF3TmVlZGxlUGF0aHMsIC8gKy8pKTsKICAgIH0KICAgIGNvbnN0IHN0YWNrTmVlZGxlID0gc2FmZS5pbml0UGF0dGVybihleHRyYUFyZ3Muc3RhY2tUb01hdGNoIHx8ICcnLCB7IGNhbk5lZ2F0ZTogdHJ1ZSB9KTsKICAgIGNvbnN0IG11c3RQcm9jZXNzID0gcm9vdCA9PiB7CiAgICAgICAgZm9yICggY29uc3QgbmVlZGxlUGF0aCBvZiBuZWVkbGVQYXRocyApIHsKICAgICAgICAgICAgaWYgKCBvYmplY3RGaW5kT3duZXJGbihyb290LCBuZWVkbGVQYXRoKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShjb250ZXh0W3Byb3BdLCB7CiAgICAgICAgYXBwbHk6IGZ1bmN0aW9uKHRhcmdldCwgdGhpc0FyZywgYXJncykgewogICAgICAgICAgICBjb25zdCB0YXJnZXRBcmcgPSBhcmdJbmRleCA8PSBhcmdzLmxlbmd0aAogICAgICAgICAgICAgICAgPyBhcmdzW2FyZ0luZGV4LTFdCiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKCB0YXJnZXRBcmcgaW5zdGFuY2VvZiBPYmplY3QgJiYgbXVzdFByb2Nlc3ModGFyZ2V0QXJnKSApIHsKICAgICAgICAgICAgICAgIGxldCBvYmpCZWZvcmUgPSB0YXJnZXRBcmc7CiAgICAgICAgICAgICAgICBpZiAoIGV4dHJhQXJncy5kb250T3ZlcndyaXRlICkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iakJlZm9yZSA9IHNhZmUuSlNPTl9wYXJzZShzYWZlLkpTT05fc3RyaW5naWZ5KHRhcmdldEFyZykpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgICAgICAgICBvYmpCZWZvcmUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCBvYmpCZWZvcmUgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmpBZnRlciA9IG9iamVjdFBydW5lRm4oCiAgICAgICAgICAgICAgICAgICAgICAgIG9iakJlZm9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgcmF3UHJ1bmVQYXRocywKICAgICAgICAgICAgICAgICAgICAgICAgcmF3TmVlZGxlUGF0aHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTmVlZGxlLAogICAgICAgICAgICAgICAgICAgICAgICBleHRyYUFyZ3MKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnSW5kZXgtMV0gPSBvYmpBZnRlciB8fCBvYmpCZWZvcmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKTsKICAgICAgICB9LAogICAgfSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"trusted-prune-outbound-object.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBnZXRFeGNlcHRpb25Ub2tlbkZuKCkgewogICAgY29uc3QgdG9rZW4gPSBnZXRSYW5kb21Ub2tlbkZuKCk7CiAgICBjb25zdCBvZSA9IHNlbGYub25lcnJvcjsKICAgIHNlbGYub25lcnJvciA9IGZ1bmN0aW9uKG1zZywgLi4uYXJncykgewogICAgICAgIGlmICggdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgJiYgbXNnLmluY2x1ZGVzKHRva2VuKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoIG9lIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIHJldHVybiBvZS5jYWxsKHRoaXMsIG1zZywgLi4uYXJncyk7CiAgICAgICAgfQogICAgfS5iaW5kKCk7CiAgICByZXR1cm4gdG9rZW47Cn0KZnVuY3Rpb24gb2JqZWN0RmluZE93bmVyRm4oCiAgICByb290LAogICAgcGF0aCwKICAgIHBydW5lID0gZmFsc2UKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGxldCBvd25lciA9IHJvb3Q7CiAgICBsZXQgY2hhaW4gPSBwYXRoOwogICAgZm9yICg7OykgewogICAgICAgIGlmICggdHlwZW9mIG93bmVyICE9PSAnb2JqZWN0JyB8fCBvd25lciA9PT0gbnVsbCAgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIGNvbnN0IHBvcyA9IGNoYWluLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7CiAgICAgICAgICAgIGlmICggcHJ1bmUgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNhZmUuT2JqZWN0X2hhc093bihvd25lciwgY2hhaW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBtb2RpZmllZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIGNoYWluID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgaW4gb3duZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzYWZlLk9iamVjdF9oYXNPd24ob3duZXIsIGtleSkgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvd25lcltrZXldOwogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBjaGFpbikgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJbY2hhaW5dOwogICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb2RpZmllZDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcHJvcCA9IGNoYWluLnNsaWNlKDAsIHBvcyk7CiAgICAgICAgY29uc3QgbmV4dCA9IGNoYWluLnNsaWNlKHBvcyArIDEpOwogICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGlmICggcHJvcCA9PT0gJ1stXScgJiYgQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgIGxldCBpID0gb3duZXIubGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKICAgICAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ob3duZXJbaV0sIG5leHQpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG93bmVyLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICggcHJvcCA9PT0gJ3stfScgJiYgb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvd25lcikgKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG93bmVyW2tleV0sIG5leHQpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGRlbGV0ZSBvd25lcltrZXldOwogICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmb3VuZDsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICBwcm9wID09PSAnW10nICYmIEFycmF5LmlzQXJyYXkob3duZXIpIHx8CiAgICAgICAgICAgIHByb3AgPT09ICd7fScgJiYgb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgfHwKICAgICAgICAgICAgcHJvcCA9PT0gJyonICYmIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0CiAgICAgICAgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvd25lcikgKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqZWN0RmluZE93bmVyRm4ob3duZXJba2V5XSwgbmV4dCwgcHJ1bmUpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBwcm9wKSA9PT0gZmFsc2UgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIG93bmVyID0gb3duZXJbcHJvcF07CiAgICAgICAgY2hhaW4gPSBjaGFpbi5zbGljZShwb3MgKyAxKTsKICAgIH0KfQpmdW5jdGlvbiBtYXRjaGVzU3RhY2tUcmFjZUZuKAogICAgbmVlZGxlRGV0YWlscywKICAgIGxvZ0xldmVsID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGV4Y2VwdGlvblRva2VuID0gZ2V0RXhjZXB0aW9uVG9rZW5GbigpOwogICAgY29uc3QgZXJyb3IgPSBuZXcgc2FmZS5FcnJvcihleGNlcHRpb25Ub2tlbik7CiAgICBjb25zdCBkb2NVUkwgPSBuZXcgVVJMKHNlbGYubG9jYXRpb24uaHJlZik7CiAgICBkb2NVUkwuaGFzaCA9ICcnOwogICAgLy8gTm9ybWFsaXplIHN0YWNrIHRyYWNlCiAgICBjb25zdCByZUxpbmUgPSAvKC4qP0ApPyhcUyspKDpcZCspOlxkK1wpPyQvOwogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGZvciAoIGxldCBsaW5lIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwoZXJyb3Iuc3RhY2ssIC9bXG5ccl0rLykgKSB7CiAgICAgICAgaWYgKCBsaW5lLmluY2x1ZGVzKGV4Y2VwdGlvblRva2VuKSApIHsgY29udGludWU7IH0KICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBzYWZlLlJlZ0V4cF9leGVjLmNhbGwocmVMaW5lLCBsaW5lKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyBjb250aW51ZTsgfQogICAgICAgIGxldCB1cmwgPSBtYXRjaFsyXTsKICAgICAgICBpZiAoIHVybC5zdGFydHNXaXRoKCcoJykgKSB7IHVybCA9IHVybC5zbGljZSgxKTsgfQogICAgICAgIGlmICggdXJsID09PSBkb2NVUkwuaHJlZiApIHsKICAgICAgICAgICAgdXJsID0gJ2lubGluZVNjcmlwdCc7CiAgICAgICAgfSBlbHNlIGlmICggdXJsLnN0YXJ0c1dpdGgoJzxhbm9ueW1vdXM+JykgKSB7CiAgICAgICAgICAgIHVybCA9ICdpbmplY3RlZFNjcmlwdCc7CiAgICAgICAgfQogICAgICAgIGxldCBmbiA9IG1hdGNoWzFdICE9PSB1bmRlZmluZWQKICAgICAgICAgICAgPyBtYXRjaFsxXS5zbGljZSgwLCAtMSkKICAgICAgICAgICAgOiBsaW5lLnNsaWNlKDAsIG1hdGNoLmluZGV4KS50cmltKCk7CiAgICAgICAgaWYgKCBmbi5zdGFydHNXaXRoKCdhdCcpICkgeyBmbiA9IGZuLnNsaWNlKDIpLnRyaW0oKTsgfQogICAgICAgIGxldCByb3djb2wgPSBtYXRjaFszXTsKICAgICAgICBsaW5lcy5wdXNoKCcgJyArIGAke2ZufSAke3VybH0ke3Jvd2NvbH06MWAudHJpbSgpKTsKICAgIH0KICAgIGxpbmVzWzBdID0gYHN0YWNrRGVwdGg6JHtsaW5lcy5sZW5ndGgtMX1gOwogICAgY29uc3Qgc3RhY2sgPSBsaW5lcy5qb2luKCdcdCcpOwogICAgY29uc3QgciA9IG5lZWRsZURldGFpbHMubWF0Y2hBbGwgIT09IHRydWUgJiYKICAgICAgICBzYWZlLnRlc3RQYXR0ZXJuKG5lZWRsZURldGFpbHMsIHN0YWNrKTsKICAgIGlmICgKICAgICAgICBsb2dMZXZlbCA9PT0gJ2FsbCcgfHwKICAgICAgICBsb2dMZXZlbCA9PT0gJ21hdGNoJyAmJiByIHx8CiAgICAgICAgbG9nTGV2ZWwgPT09ICdub21hdGNoJyAmJiAhcgogICAgKSB7CiAgICAgICAgc2FmZS51Ym9Mb2coc3RhY2sucmVwbGFjZSgvXHQvZywgJ1xuJykpOwogICAgfQogICAgcmV0dXJuIHI7Cn0KZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBvYmplY3RQcnVuZUZuKAogICAgb2JqLAogICAgcmF3UHJ1bmVQYXRocywKICAgIHJhd05lZWRsZVBhdGhzLAogICAgc3RhY2tOZWVkbGVEZXRhaWxzID0geyBtYXRjaEFsbDogdHJ1ZSB9LAogICAgZXh0cmFBcmdzID0ge30KKSB7CiAgICBpZiAoIHR5cGVvZiByYXdQcnVuZVBhdGhzICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHBydW5lUGF0aHMgPSByYXdQcnVuZVBhdGhzICE9PSAnJwogICAgICAgID8gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChyYXdQcnVuZVBhdGhzLCAvICsvKQogICAgICAgIDogW107CiAgICBjb25zdCBuZWVkbGVQYXRocyA9IHBydW5lUGF0aHMubGVuZ3RoICE9PSAwICYmIHJhd05lZWRsZVBhdGhzICE9PSAnJwogICAgICAgID8gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChyYXdOZWVkbGVQYXRocywgLyArLykKICAgICAgICA6IFtdOwogICAgaWYgKCBzdGFja05lZWRsZURldGFpbHMubWF0Y2hBbGwgIT09IHRydWUgKSB7CiAgICAgICAgaWYgKCBtYXRjaGVzU3RhY2tUcmFjZUZuKHN0YWNrTmVlZGxlRGV0YWlscywgZXh0cmFBcmdzLmxvZ3N0YWNrKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3MgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBvYmplY3RQcnVuZUZuLm11c3RQcm9jZXNzID0gKHJvb3QsIG5lZWRsZVBhdGhzKSA9PiB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IG5lZWRsZVBhdGggb2YgbmVlZGxlUGF0aHMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKHJvb3QsIG5lZWRsZVBhdGgpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgIH0KICAgIGlmICggcHJ1bmVQYXRocy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgbGV0IG91dGNvbWUgPSAnbm9tYXRjaCc7CiAgICBpZiAoIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3Mob2JqLCBuZWVkbGVQYXRocykgKSB7CiAgICAgICAgZm9yICggY29uc3QgcGF0aCBvZiBwcnVuZVBhdGhzICkgewogICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG9iaiwgcGF0aCwgdHJ1ZSkgKSB7CiAgICAgICAgICAgICAgICBvdXRjb21lID0gJ21hdGNoJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICggb3V0Y29tZSA9PT0gJ21hdGNoJyApIHsgcmV0dXJuIG9iajsgfQp9CgogIChmdW5jdGlvbiB0cnVzdGVkUHJ1bmVPdXRib3VuZE9iamVjdCgKICAgIHByb3BDaGFpbiA9ICcnLAogICAgcmF3UHJ1bmVQYXRocyA9ICcnLAogICAgcmF3TmVlZGxlUGF0aHMgPSAnJwopIHsKICAgIGlmICggcHJvcENoYWluID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMyk7CiAgICBwcm94eUFwcGx5Rm4ocHJvcENoYWluLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgY29uc3Qgb2JqQmVmb3JlID0gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgaWYgKCBvYmpCZWZvcmUgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm4gb2JqQmVmb3JlOyB9CiAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBvYmplY3RQcnVuZUZuKAogICAgICAgICAgICBvYmpCZWZvcmUsCiAgICAgICAgICAgIHJhd1BydW5lUGF0aHMsCiAgICAgICAgICAgIHJhd05lZWRsZVBhdGhzLAogICAgICAgICAgICB7IG1hdGNoQWxsOiB0cnVlIH0sCiAgICAgICAgICAgIGV4dHJhQXJncwogICAgICAgICk7CiAgICAgICAgcmV0dXJuIG9iakFmdGVyIHx8IG9iakJlZm9yZTsKICAgIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"json-prune.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBnZXRFeGNlcHRpb25Ub2tlbkZuKCkgewogICAgY29uc3QgdG9rZW4gPSBnZXRSYW5kb21Ub2tlbkZuKCk7CiAgICBjb25zdCBvZSA9IHNlbGYub25lcnJvcjsKICAgIHNlbGYub25lcnJvciA9IGZ1bmN0aW9uKG1zZywgLi4uYXJncykgewogICAgICAgIGlmICggdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgJiYgbXNnLmluY2x1ZGVzKHRva2VuKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoIG9lIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIHJldHVybiBvZS5jYWxsKHRoaXMsIG1zZywgLi4uYXJncyk7CiAgICAgICAgfQogICAgfS5iaW5kKCk7CiAgICByZXR1cm4gdG9rZW47Cn0KZnVuY3Rpb24gb2JqZWN0RmluZE93bmVyRm4oCiAgICByb290LAogICAgcGF0aCwKICAgIHBydW5lID0gZmFsc2UKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGxldCBvd25lciA9IHJvb3Q7CiAgICBsZXQgY2hhaW4gPSBwYXRoOwogICAgZm9yICg7OykgewogICAgICAgIGlmICggdHlwZW9mIG93bmVyICE9PSAnb2JqZWN0JyB8fCBvd25lciA9PT0gbnVsbCAgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIGNvbnN0IHBvcyA9IGNoYWluLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7CiAgICAgICAgICAgIGlmICggcHJ1bmUgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNhZmUuT2JqZWN0X2hhc093bihvd25lciwgY2hhaW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBtb2RpZmllZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIGNoYWluID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgaW4gb3duZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzYWZlLk9iamVjdF9oYXNPd24ob3duZXIsIGtleSkgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvd25lcltrZXldOwogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBjaGFpbikgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJbY2hhaW5dOwogICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb2RpZmllZDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcHJvcCA9IGNoYWluLnNsaWNlKDAsIHBvcyk7CiAgICAgICAgY29uc3QgbmV4dCA9IGNoYWluLnNsaWNlKHBvcyArIDEpOwogICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGlmICggcHJvcCA9PT0gJ1stXScgJiYgQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgIGxldCBpID0gb3duZXIubGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKICAgICAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ob3duZXJbaV0sIG5leHQpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG93bmVyLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICggcHJvcCA9PT0gJ3stfScgJiYgb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvd25lcikgKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG93bmVyW2tleV0sIG5leHQpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGRlbGV0ZSBvd25lcltrZXldOwogICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmb3VuZDsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICBwcm9wID09PSAnW10nICYmIEFycmF5LmlzQXJyYXkob3duZXIpIHx8CiAgICAgICAgICAgIHByb3AgPT09ICd7fScgJiYgb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgfHwKICAgICAgICAgICAgcHJvcCA9PT0gJyonICYmIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0CiAgICAgICAgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvd25lcikgKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqZWN0RmluZE93bmVyRm4ob3duZXJba2V5XSwgbmV4dCwgcHJ1bmUpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBwcm9wKSA9PT0gZmFsc2UgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIG93bmVyID0gb3duZXJbcHJvcF07CiAgICAgICAgY2hhaW4gPSBjaGFpbi5zbGljZShwb3MgKyAxKTsKICAgIH0KfQpmdW5jdGlvbiBtYXRjaGVzU3RhY2tUcmFjZUZuKAogICAgbmVlZGxlRGV0YWlscywKICAgIGxvZ0xldmVsID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGV4Y2VwdGlvblRva2VuID0gZ2V0RXhjZXB0aW9uVG9rZW5GbigpOwogICAgY29uc3QgZXJyb3IgPSBuZXcgc2FmZS5FcnJvcihleGNlcHRpb25Ub2tlbik7CiAgICBjb25zdCBkb2NVUkwgPSBuZXcgVVJMKHNlbGYubG9jYXRpb24uaHJlZik7CiAgICBkb2NVUkwuaGFzaCA9ICcnOwogICAgLy8gTm9ybWFsaXplIHN0YWNrIHRyYWNlCiAgICBjb25zdCByZUxpbmUgPSAvKC4qP0ApPyhcUyspKDpcZCspOlxkK1wpPyQvOwogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGZvciAoIGxldCBsaW5lIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwoZXJyb3Iuc3RhY2ssIC9bXG5ccl0rLykgKSB7CiAgICAgICAgaWYgKCBsaW5lLmluY2x1ZGVzKGV4Y2VwdGlvblRva2VuKSApIHsgY29udGludWU7IH0KICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBzYWZlLlJlZ0V4cF9leGVjLmNhbGwocmVMaW5lLCBsaW5lKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyBjb250aW51ZTsgfQogICAgICAgIGxldCB1cmwgPSBtYXRjaFsyXTsKICAgICAgICBpZiAoIHVybC5zdGFydHNXaXRoKCcoJykgKSB7IHVybCA9IHVybC5zbGljZSgxKTsgfQogICAgICAgIGlmICggdXJsID09PSBkb2NVUkwuaHJlZiApIHsKICAgICAgICAgICAgdXJsID0gJ2lubGluZVNjcmlwdCc7CiAgICAgICAgfSBlbHNlIGlmICggdXJsLnN0YXJ0c1dpdGgoJzxhbm9ueW1vdXM+JykgKSB7CiAgICAgICAgICAgIHVybCA9ICdpbmplY3RlZFNjcmlwdCc7CiAgICAgICAgfQogICAgICAgIGxldCBmbiA9IG1hdGNoWzFdICE9PSB1bmRlZmluZWQKICAgICAgICAgICAgPyBtYXRjaFsxXS5zbGljZSgwLCAtMSkKICAgICAgICAgICAgOiBsaW5lLnNsaWNlKDAsIG1hdGNoLmluZGV4KS50cmltKCk7CiAgICAgICAgaWYgKCBmbi5zdGFydHNXaXRoKCdhdCcpICkgeyBmbiA9IGZuLnNsaWNlKDIpLnRyaW0oKTsgfQogICAgICAgIGxldCByb3djb2wgPSBtYXRjaFszXTsKICAgICAgICBsaW5lcy5wdXNoKCcgJyArIGAke2ZufSAke3VybH0ke3Jvd2NvbH06MWAudHJpbSgpKTsKICAgIH0KICAgIGxpbmVzWzBdID0gYHN0YWNrRGVwdGg6JHtsaW5lcy5sZW5ndGgtMX1gOwogICAgY29uc3Qgc3RhY2sgPSBsaW5lcy5qb2luKCdcdCcpOwogICAgY29uc3QgciA9IG5lZWRsZURldGFpbHMubWF0Y2hBbGwgIT09IHRydWUgJiYKICAgICAgICBzYWZlLnRlc3RQYXR0ZXJuKG5lZWRsZURldGFpbHMsIHN0YWNrKTsKICAgIGlmICgKICAgICAgICBsb2dMZXZlbCA9PT0gJ2FsbCcgfHwKICAgICAgICBsb2dMZXZlbCA9PT0gJ21hdGNoJyAmJiByIHx8CiAgICAgICAgbG9nTGV2ZWwgPT09ICdub21hdGNoJyAmJiAhcgogICAgKSB7CiAgICAgICAgc2FmZS51Ym9Mb2coc3RhY2sucmVwbGFjZSgvXHQvZywgJ1xuJykpOwogICAgfQogICAgcmV0dXJuIHI7Cn0KZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIG9iamVjdFBydW5lRm4oCiAgICBvYmosCiAgICByYXdQcnVuZVBhdGhzLAogICAgcmF3TmVlZGxlUGF0aHMsCiAgICBzdGFja05lZWRsZURldGFpbHMgPSB7IG1hdGNoQWxsOiB0cnVlIH0sCiAgICBleHRyYUFyZ3MgPSB7fQopIHsKICAgIGlmICggdHlwZW9mIHJhd1BydW5lUGF0aHMgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcHJ1bmVQYXRocyA9IHJhd1BydW5lUGF0aHMgIT09ICcnCiAgICAgICAgPyBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHJhd1BydW5lUGF0aHMsIC8gKy8pCiAgICAgICAgOiBbXTsKICAgIGNvbnN0IG5lZWRsZVBhdGhzID0gcHJ1bmVQYXRocy5sZW5ndGggIT09IDAgJiYgcmF3TmVlZGxlUGF0aHMgIT09ICcnCiAgICAgICAgPyBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHJhd05lZWRsZVBhdGhzLCAvICsvKQogICAgICAgIDogW107CiAgICBpZiAoIHN0YWNrTmVlZGxlRGV0YWlscy5tYXRjaEFsbCAhPT0gdHJ1ZSApIHsKICAgICAgICBpZiAoIG1hdGNoZXNTdGFja1RyYWNlRm4oc3RhY2tOZWVkbGVEZXRhaWxzLCBleHRyYUFyZ3MubG9nc3RhY2spID09PSBmYWxzZSApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggb2JqZWN0UHJ1bmVGbi5tdXN0UHJvY2VzcyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3MgPSAocm9vdCwgbmVlZGxlUGF0aHMpID0+IHsKICAgICAgICAgICAgZm9yICggY29uc3QgbmVlZGxlUGF0aCBvZiBuZWVkbGVQYXRocyApIHsKICAgICAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ocm9vdCwgbmVlZGxlUGF0aCkgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9OwogICAgfQogICAgaWYgKCBwcnVuZVBhdGhzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICBsZXQgb3V0Y29tZSA9ICdub21hdGNoJzsKICAgIGlmICggb2JqZWN0UHJ1bmVGbi5tdXN0UHJvY2VzcyhvYmosIG5lZWRsZVBhdGhzKSApIHsKICAgICAgICBmb3IgKCBjb25zdCBwYXRoIG9mIHBydW5lUGF0aHMgKSB7CiAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ob2JqLCBwYXRoLCB0cnVlKSApIHsKICAgICAgICAgICAgICAgIG91dGNvbWUgPSAnbWF0Y2gnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCBvdXRjb21lID09PSAnbWF0Y2gnICkgeyByZXR1cm4gb2JqOyB9Cn0KCiAgKGZ1bmN0aW9uIGpzb25QcnVuZSgKICAgIHJhd1BydW5lUGF0aHMgPSAnJywKICAgIHJhd05lZWRsZVBhdGhzID0gJycsCiAgICBzdGFja05lZWRsZSA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ2pzb24tcHJ1bmUnLCByYXdQcnVuZVBhdGhzLCByYXdOZWVkbGVQYXRocywgc3RhY2tOZWVkbGUpOwogICAgY29uc3Qgc3RhY2tOZWVkbGVEZXRhaWxzID0gc2FmZS5pbml0UGF0dGVybihzdGFja05lZWRsZSwgeyBjYW5OZWdhdGU6IHRydWUgfSk7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDMpOwogICAgSlNPTi5wYXJzZSA9IG5ldyBQcm94eShKU09OLnBhcnNlLCB7CiAgICAgICAgYXBwbHk6IGZ1bmN0aW9uKHRhcmdldCwgdGhpc0FyZywgYXJncykgewogICAgICAgICAgICBjb25zdCBvYmpCZWZvcmUgPSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncyk7CiAgICAgICAgICAgIGlmICggcmF3UHJ1bmVQYXRocyA9PT0gJycgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIHNhZmUuSlNPTl9zdHJpbmdpZnkob2JqQmVmb3JlLCBudWxsLCAyKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgb2JqQWZ0ZXIgPSBvYmplY3RQcnVuZUZuKAogICAgICAgICAgICAgICAgb2JqQmVmb3JlLAogICAgICAgICAgICAgICAgcmF3UHJ1bmVQYXRocywKICAgICAgICAgICAgICAgIHJhd05lZWRsZVBhdGhzLAogICAgICAgICAgICAgICAgc3RhY2tOZWVkbGVEZXRhaWxzLAogICAgICAgICAgICAgICAgZXh0cmFBcmdzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggb2JqQWZ0ZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIG9iakJlZm9yZTsgfQogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdQcnVuZWQnKTsKICAgICAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYEFmdGVyIHBydW5pbmc6XG4ke3NhZmUuSlNPTl9zdHJpbmdpZnkob2JqQWZ0ZXIsIG51bGwsIDIpfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvYmpBZnRlcjsKICAgICAgICB9LAogICAgfSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"json-prune-fetch-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBnZXRFeGNlcHRpb25Ub2tlbkZuKCkgewogICAgY29uc3QgdG9rZW4gPSBnZXRSYW5kb21Ub2tlbkZuKCk7CiAgICBjb25zdCBvZSA9IHNlbGYub25lcnJvcjsKICAgIHNlbGYub25lcnJvciA9IGZ1bmN0aW9uKG1zZywgLi4uYXJncykgewogICAgICAgIGlmICggdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgJiYgbXNnLmluY2x1ZGVzKHRva2VuKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoIG9lIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIHJldHVybiBvZS5jYWxsKHRoaXMsIG1zZywgLi4uYXJncyk7CiAgICAgICAgfQogICAgfS5iaW5kKCk7CiAgICByZXR1cm4gdG9rZW47Cn0KZnVuY3Rpb24gb2JqZWN0RmluZE93bmVyRm4oCiAgICByb290LAogICAgcGF0aCwKICAgIHBydW5lID0gZmFsc2UKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGxldCBvd25lciA9IHJvb3Q7CiAgICBsZXQgY2hhaW4gPSBwYXRoOwogICAgZm9yICg7OykgewogICAgICAgIGlmICggdHlwZW9mIG93bmVyICE9PSAnb2JqZWN0JyB8fCBvd25lciA9PT0gbnVsbCAgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIGNvbnN0IHBvcyA9IGNoYWluLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7CiAgICAgICAgICAgIGlmICggcHJ1bmUgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNhZmUuT2JqZWN0X2hhc093bihvd25lciwgY2hhaW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBtb2RpZmllZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIGNoYWluID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgaW4gb3duZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzYWZlLk9iamVjdF9oYXNPd24ob3duZXIsIGtleSkgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvd25lcltrZXldOwogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBjaGFpbikgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJbY2hhaW5dOwogICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb2RpZmllZDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcHJvcCA9IGNoYWluLnNsaWNlKDAsIHBvcyk7CiAgICAgICAgY29uc3QgbmV4dCA9IGNoYWluLnNsaWNlKHBvcyArIDEpOwogICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGlmICggcHJvcCA9PT0gJ1stXScgJiYgQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgIGxldCBpID0gb3duZXIubGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKICAgICAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ob3duZXJbaV0sIG5leHQpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG93bmVyLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICggcHJvcCA9PT0gJ3stfScgJiYgb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvd25lcikgKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG93bmVyW2tleV0sIG5leHQpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGRlbGV0ZSBvd25lcltrZXldOwogICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmb3VuZDsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICBwcm9wID09PSAnW10nICYmIEFycmF5LmlzQXJyYXkob3duZXIpIHx8CiAgICAgICAgICAgIHByb3AgPT09ICd7fScgJiYgb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgfHwKICAgICAgICAgICAgcHJvcCA9PT0gJyonICYmIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0CiAgICAgICAgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvd25lcikgKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqZWN0RmluZE93bmVyRm4ob3duZXJba2V5XSwgbmV4dCwgcHJ1bmUpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBwcm9wKSA9PT0gZmFsc2UgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIG93bmVyID0gb3duZXJbcHJvcF07CiAgICAgICAgY2hhaW4gPSBjaGFpbi5zbGljZShwb3MgKyAxKTsKICAgIH0KfQpmdW5jdGlvbiBtYXRjaGVzU3RhY2tUcmFjZUZuKAogICAgbmVlZGxlRGV0YWlscywKICAgIGxvZ0xldmVsID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGV4Y2VwdGlvblRva2VuID0gZ2V0RXhjZXB0aW9uVG9rZW5GbigpOwogICAgY29uc3QgZXJyb3IgPSBuZXcgc2FmZS5FcnJvcihleGNlcHRpb25Ub2tlbik7CiAgICBjb25zdCBkb2NVUkwgPSBuZXcgVVJMKHNlbGYubG9jYXRpb24uaHJlZik7CiAgICBkb2NVUkwuaGFzaCA9ICcnOwogICAgLy8gTm9ybWFsaXplIHN0YWNrIHRyYWNlCiAgICBjb25zdCByZUxpbmUgPSAvKC4qP0ApPyhcUyspKDpcZCspOlxkK1wpPyQvOwogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGZvciAoIGxldCBsaW5lIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwoZXJyb3Iuc3RhY2ssIC9bXG5ccl0rLykgKSB7CiAgICAgICAgaWYgKCBsaW5lLmluY2x1ZGVzKGV4Y2VwdGlvblRva2VuKSApIHsgY29udGludWU7IH0KICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBzYWZlLlJlZ0V4cF9leGVjLmNhbGwocmVMaW5lLCBsaW5lKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyBjb250aW51ZTsgfQogICAgICAgIGxldCB1cmwgPSBtYXRjaFsyXTsKICAgICAgICBpZiAoIHVybC5zdGFydHNXaXRoKCcoJykgKSB7IHVybCA9IHVybC5zbGljZSgxKTsgfQogICAgICAgIGlmICggdXJsID09PSBkb2NVUkwuaHJlZiApIHsKICAgICAgICAgICAgdXJsID0gJ2lubGluZVNjcmlwdCc7CiAgICAgICAgfSBlbHNlIGlmICggdXJsLnN0YXJ0c1dpdGgoJzxhbm9ueW1vdXM+JykgKSB7CiAgICAgICAgICAgIHVybCA9ICdpbmplY3RlZFNjcmlwdCc7CiAgICAgICAgfQogICAgICAgIGxldCBmbiA9IG1hdGNoWzFdICE9PSB1bmRlZmluZWQKICAgICAgICAgICAgPyBtYXRjaFsxXS5zbGljZSgwLCAtMSkKICAgICAgICAgICAgOiBsaW5lLnNsaWNlKDAsIG1hdGNoLmluZGV4KS50cmltKCk7CiAgICAgICAgaWYgKCBmbi5zdGFydHNXaXRoKCdhdCcpICkgeyBmbiA9IGZuLnNsaWNlKDIpLnRyaW0oKTsgfQogICAgICAgIGxldCByb3djb2wgPSBtYXRjaFszXTsKICAgICAgICBsaW5lcy5wdXNoKCcgJyArIGAke2ZufSAke3VybH0ke3Jvd2NvbH06MWAudHJpbSgpKTsKICAgIH0KICAgIGxpbmVzWzBdID0gYHN0YWNrRGVwdGg6JHtsaW5lcy5sZW5ndGgtMX1gOwogICAgY29uc3Qgc3RhY2sgPSBsaW5lcy5qb2luKCdcdCcpOwogICAgY29uc3QgciA9IG5lZWRsZURldGFpbHMubWF0Y2hBbGwgIT09IHRydWUgJiYKICAgICAgICBzYWZlLnRlc3RQYXR0ZXJuKG5lZWRsZURldGFpbHMsIHN0YWNrKTsKICAgIGlmICgKICAgICAgICBsb2dMZXZlbCA9PT0gJ2FsbCcgfHwKICAgICAgICBsb2dMZXZlbCA9PT0gJ21hdGNoJyAmJiByIHx8CiAgICAgICAgbG9nTGV2ZWwgPT09ICdub21hdGNoJyAmJiAhcgogICAgKSB7CiAgICAgICAgc2FmZS51Ym9Mb2coc3RhY2sucmVwbGFjZSgvXHQvZywgJ1xuJykpOwogICAgfQogICAgcmV0dXJuIHI7Cn0KZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG9iamVjdFBydW5lRm4oCiAgICBvYmosCiAgICByYXdQcnVuZVBhdGhzLAogICAgcmF3TmVlZGxlUGF0aHMsCiAgICBzdGFja05lZWRsZURldGFpbHMgPSB7IG1hdGNoQWxsOiB0cnVlIH0sCiAgICBleHRyYUFyZ3MgPSB7fQopIHsKICAgIGlmICggdHlwZW9mIHJhd1BydW5lUGF0aHMgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcHJ1bmVQYXRocyA9IHJhd1BydW5lUGF0aHMgIT09ICcnCiAgICAgICAgPyBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHJhd1BydW5lUGF0aHMsIC8gKy8pCiAgICAgICAgOiBbXTsKICAgIGNvbnN0IG5lZWRsZVBhdGhzID0gcHJ1bmVQYXRocy5sZW5ndGggIT09IDAgJiYgcmF3TmVlZGxlUGF0aHMgIT09ICcnCiAgICAgICAgPyBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHJhd05lZWRsZVBhdGhzLCAvICsvKQogICAgICAgIDogW107CiAgICBpZiAoIHN0YWNrTmVlZGxlRGV0YWlscy5tYXRjaEFsbCAhPT0gdHJ1ZSApIHsKICAgICAgICBpZiAoIG1hdGNoZXNTdGFja1RyYWNlRm4oc3RhY2tOZWVkbGVEZXRhaWxzLCBleHRyYUFyZ3MubG9nc3RhY2spID09PSBmYWxzZSApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggb2JqZWN0UHJ1bmVGbi5tdXN0UHJvY2VzcyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3MgPSAocm9vdCwgbmVlZGxlUGF0aHMpID0+IHsKICAgICAgICAgICAgZm9yICggY29uc3QgbmVlZGxlUGF0aCBvZiBuZWVkbGVQYXRocyApIHsKICAgICAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ocm9vdCwgbmVlZGxlUGF0aCkgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9OwogICAgfQogICAgaWYgKCBwcnVuZVBhdGhzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICBsZXQgb3V0Y29tZSA9ICdub21hdGNoJzsKICAgIGlmICggb2JqZWN0UHJ1bmVGbi5tdXN0UHJvY2VzcyhvYmosIG5lZWRsZVBhdGhzKSApIHsKICAgICAgICBmb3IgKCBjb25zdCBwYXRoIG9mIHBydW5lUGF0aHMgKSB7CiAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ob2JqLCBwYXRoLCB0cnVlKSApIHsKICAgICAgICAgICAgICAgIG91dGNvbWUgPSAnbWF0Y2gnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCBvdXRjb21lID09PSAnbWF0Y2gnICkgeyByZXR1cm4gb2JqOyB9Cn0KZnVuY3Rpb24gbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIC4uLm9ianMpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbWF0Y2hlZCA9IFtdOwogICAgZm9yICggY29uc3Qgb2JqIG9mIG9ianMgKSB7CiAgICAgICAgaWYgKCBvYmogaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgIGZvciAoIGNvbnN0IFsgcHJvcCwgZGV0YWlscyBdIG9mIHByb3BOZWVkbGVzICkgewogICAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpbcHJvcF07CiAgICAgICAgICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgewogICAgICAgICAgICAgICAgdHJ5IHsgdmFsdWUgPSBzYWZlLkpTT05fc3RyaW5naWZ5KHZhbHVlKTsgfQogICAgICAgICAgICAgICAgY2F0Y2ggeyB9CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBzYWZlLnRlc3RQYXR0ZXJuKGRldGFpbHMsIHZhbHVlKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBtYXRjaGVkLnB1c2goYCR7cHJvcH06ICR7dmFsdWV9YCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hdGNoZWQ7Cn0KZnVuY3Rpb24gY29sbGF0ZUZldGNoQXJndW1lbnRzRm4ocmVzb3VyY2UsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcHJvcHMgPSBbCiAgICAgICAgJ2JvZHknLCAnY2FjaGUnLCAnY3JlZGVudGlhbHMnLCAnZHVwbGV4JywgJ2hlYWRlcnMnLAogICAgICAgICdpbnRlZ3JpdHknLCAna2VlcGFsaXZlJywgJ21ldGhvZCcsICdtb2RlJywgJ3ByaW9yaXR5JywKICAgICAgICAncmVkaXJlY3QnLCAncmVmZXJyZXInLCAncmVmZXJyZXJQb2xpY3knLCAndXJsJwogICAgXTsKICAgIGNvbnN0IG91dCA9IHt9OwogICAgaWYgKCBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzID0gKHNyYywgb3V0KSA9PiB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IHByb3Agb2YgcHJvcHMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNyY1twcm9wXSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0W3Byb3BdID0gc3JjW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGlmICgKICAgICAgICB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnIHx8CiAgICAgICAgc2FmZS5PYmplY3RfdG9TdHJpbmcuY2FsbChyZXNvdXJjZSkgIT09ICdbb2JqZWN0IFJlcXVlc3RdJwogICAgKSB7CiAgICAgICAgb3V0LnVybCA9IGAke3Jlc291cmNlfWA7CiAgICB9IGVsc2UgewogICAgICAgIGxldCBjbG9uZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjbG9uZSA9IHNhZmUuUmVxdWVzdF9jbG9uZS5jYWxsKHJlc291cmNlKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMoY2xvbmUgfHwgcmVzb3VyY2UsIG91dCk7CiAgICB9CiAgICBpZiAoIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKG9wdGlvbnMsIG91dCk7CiAgICB9CiAgICByZXR1cm4gb3V0Owp9CgogIChmdW5jdGlvbiBqc29uUHJ1bmVGZXRjaFJlc3BvbnNlKAogICAgcmF3UHJ1bmVQYXRocyA9ICcnLAogICAgcmF3TmVlZGxlUGF0aHMgPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdqc29uLXBydW5lLWZldGNoLXJlc3BvbnNlJywgcmF3UHJ1bmVQYXRocywgcmF3TmVlZGxlUGF0aHMpOwogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAyKTsKICAgIGNvbnN0IHByb3BOZWVkbGVzID0gcGFyc2VQcm9wZXJ0aWVzVG9NYXRjaEZuKGV4dHJhQXJncy5wcm9wc1RvTWF0Y2gsICd1cmwnKTsKICAgIGNvbnN0IHN0YWNrTmVlZGxlID0gc2FmZS5pbml0UGF0dGVybihleHRyYUFyZ3Muc3RhY2tUb01hdGNoIHx8ICcnLCB7IGNhbk5lZ2F0ZTogdHJ1ZSB9KTsKICAgIGNvbnN0IGxvZ2FsbCA9IHJhd1BydW5lUGF0aHMgPT09ICcnOwogICAgY29uc3QgYXBwbHlIYW5kbGVyID0gZnVuY3Rpb24odGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgY29uc3QgZmV0Y2hQcm9taXNlID0gUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpOwogICAgICAgIGlmICggcHJvcE5lZWRsZXMuc2l6ZSAhPT0gMCApIHsKICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbiguLi5hcmdzKTsKICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCBwcm9wcyk7CiAgICAgICAgICAgIGlmICggbWF0Y2hlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gZmV0Y2hQcm9taXNlOyB9CiAgICAgICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBNYXRjaGVkICJwcm9wc1RvTWF0Y2giOlxuXHQke21hdGNoZWQuam9pbignXG5cdCcpfWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmZXRjaFByb21pc2UudGhlbihyZXNwb25zZUJlZm9yZSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzcG9uc2VCZWZvcmUuY2xvbmUoKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS50aGVuKG9iakJlZm9yZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBvYmpCZWZvcmUgIT09ICdvYmplY3QnICkgeyByZXR1cm4gcmVzcG9uc2VCZWZvcmU7IH0KICAgICAgICAgICAgICAgIGlmICggbG9nYWxsICkgewogICAgICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgc2FmZS5KU09OX3N0cmluZ2lmeShvYmpCZWZvcmUsIG51bGwsIDIpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VCZWZvcmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBvYmpBZnRlciA9IG9iamVjdFBydW5lRm4oCiAgICAgICAgICAgICAgICAgICAgb2JqQmVmb3JlLAogICAgICAgICAgICAgICAgICAgIHJhd1BydW5lUGF0aHMsCiAgICAgICAgICAgICAgICAgICAgcmF3TmVlZGxlUGF0aHMsCiAgICAgICAgICAgICAgICAgICAgc3RhY2tOZWVkbGUsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFBcmdzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2Ygb2JqQWZ0ZXIgIT09ICdvYmplY3QnICkgeyByZXR1cm4gcmVzcG9uc2VCZWZvcmU7IH0KICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1BydW5lZCcpOwogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VBZnRlciA9IFJlc3BvbnNlLmpzb24ob2JqQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlQmVmb3JlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZUJlZm9yZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlQmVmb3JlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJlc3BvbnNlQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICBvazogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUub2sgfSwKICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkOiB7IHZhbHVlOiByZXNwb25zZUJlZm9yZS5yZWRpcmVjdGVkIH0sCiAgICAgICAgICAgICAgICAgICAgdHlwZTogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudHlwZSB9LAogICAgICAgICAgICAgICAgICAgIHVybDogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudXJsIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUFmdGVyOwogICAgICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJlZm9yZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgc2FmZS51Ym9FcnIobG9nUHJlZml4LCAnRXJyb3I6JywgcmVhc29uKTsKICAgICAgICAgICAgcmV0dXJuIGZldGNoUHJvbWlzZTsKICAgICAgICB9KTsKICAgIH07CiAgICBzZWxmLmZldGNoID0gbmV3IFByb3h5KHNlbGYuZmV0Y2gsIHsKICAgICAgICBhcHBseTogYXBwbHlIYW5kbGVyCiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"json-prune-xhr-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBnZXRFeGNlcHRpb25Ub2tlbkZuKCkgewogICAgY29uc3QgdG9rZW4gPSBnZXRSYW5kb21Ub2tlbkZuKCk7CiAgICBjb25zdCBvZSA9IHNlbGYub25lcnJvcjsKICAgIHNlbGYub25lcnJvciA9IGZ1bmN0aW9uKG1zZywgLi4uYXJncykgewogICAgICAgIGlmICggdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgJiYgbXNnLmluY2x1ZGVzKHRva2VuKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoIG9lIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIHJldHVybiBvZS5jYWxsKHRoaXMsIG1zZywgLi4uYXJncyk7CiAgICAgICAgfQogICAgfS5iaW5kKCk7CiAgICByZXR1cm4gdG9rZW47Cn0KZnVuY3Rpb24gb2JqZWN0RmluZE93bmVyRm4oCiAgICByb290LAogICAgcGF0aCwKICAgIHBydW5lID0gZmFsc2UKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGxldCBvd25lciA9IHJvb3Q7CiAgICBsZXQgY2hhaW4gPSBwYXRoOwogICAgZm9yICg7OykgewogICAgICAgIGlmICggdHlwZW9mIG93bmVyICE9PSAnb2JqZWN0JyB8fCBvd25lciA9PT0gbnVsbCAgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIGNvbnN0IHBvcyA9IGNoYWluLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7CiAgICAgICAgICAgIGlmICggcHJ1bmUgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNhZmUuT2JqZWN0X2hhc093bihvd25lciwgY2hhaW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBtb2RpZmllZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIGNoYWluID09PSAnKicgKSB7CiAgICAgICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgaW4gb3duZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBzYWZlLk9iamVjdF9oYXNPd24ob3duZXIsIGtleSkgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvd25lcltrZXldOwogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBjaGFpbikgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJbY2hhaW5dOwogICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb2RpZmllZDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcHJvcCA9IGNoYWluLnNsaWNlKDAsIHBvcyk7CiAgICAgICAgY29uc3QgbmV4dCA9IGNoYWluLnNsaWNlKHBvcyArIDEpOwogICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGlmICggcHJvcCA9PT0gJ1stXScgJiYgQXJyYXkuaXNBcnJheShvd25lcikgKSB7CiAgICAgICAgICAgIGxldCBpID0gb3duZXIubGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAoIGktLSApIHsKICAgICAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ob3duZXJbaV0sIG5leHQpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG93bmVyLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICggcHJvcCA9PT0gJ3stfScgJiYgb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvd25lcikgKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG93bmVyW2tleV0sIG5leHQpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGRlbGV0ZSBvd25lcltrZXldOwogICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmb3VuZDsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICBwcm9wID09PSAnW10nICYmIEFycmF5LmlzQXJyYXkob3duZXIpIHx8CiAgICAgICAgICAgIHByb3AgPT09ICd7fScgJiYgb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgfHwKICAgICAgICAgICAgcHJvcCA9PT0gJyonICYmIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0CiAgICAgICAgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvd25lcikgKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqZWN0RmluZE93bmVyRm4ob3duZXJba2V5XSwgbmV4dCwgcHJ1bmUpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBwcm9wKSA9PT0gZmFsc2UgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIG93bmVyID0gb3duZXJbcHJvcF07CiAgICAgICAgY2hhaW4gPSBjaGFpbi5zbGljZShwb3MgKyAxKTsKICAgIH0KfQpmdW5jdGlvbiBtYXRjaGVzU3RhY2tUcmFjZUZuKAogICAgbmVlZGxlRGV0YWlscywKICAgIGxvZ0xldmVsID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGV4Y2VwdGlvblRva2VuID0gZ2V0RXhjZXB0aW9uVG9rZW5GbigpOwogICAgY29uc3QgZXJyb3IgPSBuZXcgc2FmZS5FcnJvcihleGNlcHRpb25Ub2tlbik7CiAgICBjb25zdCBkb2NVUkwgPSBuZXcgVVJMKHNlbGYubG9jYXRpb24uaHJlZik7CiAgICBkb2NVUkwuaGFzaCA9ICcnOwogICAgLy8gTm9ybWFsaXplIHN0YWNrIHRyYWNlCiAgICBjb25zdCByZUxpbmUgPSAvKC4qP0ApPyhcUyspKDpcZCspOlxkK1wpPyQvOwogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGZvciAoIGxldCBsaW5lIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwoZXJyb3Iuc3RhY2ssIC9bXG5ccl0rLykgKSB7CiAgICAgICAgaWYgKCBsaW5lLmluY2x1ZGVzKGV4Y2VwdGlvblRva2VuKSApIHsgY29udGludWU7IH0KICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBzYWZlLlJlZ0V4cF9leGVjLmNhbGwocmVMaW5lLCBsaW5lKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyBjb250aW51ZTsgfQogICAgICAgIGxldCB1cmwgPSBtYXRjaFsyXTsKICAgICAgICBpZiAoIHVybC5zdGFydHNXaXRoKCcoJykgKSB7IHVybCA9IHVybC5zbGljZSgxKTsgfQogICAgICAgIGlmICggdXJsID09PSBkb2NVUkwuaHJlZiApIHsKICAgICAgICAgICAgdXJsID0gJ2lubGluZVNjcmlwdCc7CiAgICAgICAgfSBlbHNlIGlmICggdXJsLnN0YXJ0c1dpdGgoJzxhbm9ueW1vdXM+JykgKSB7CiAgICAgICAgICAgIHVybCA9ICdpbmplY3RlZFNjcmlwdCc7CiAgICAgICAgfQogICAgICAgIGxldCBmbiA9IG1hdGNoWzFdICE9PSB1bmRlZmluZWQKICAgICAgICAgICAgPyBtYXRjaFsxXS5zbGljZSgwLCAtMSkKICAgICAgICAgICAgOiBsaW5lLnNsaWNlKDAsIG1hdGNoLmluZGV4KS50cmltKCk7CiAgICAgICAgaWYgKCBmbi5zdGFydHNXaXRoKCdhdCcpICkgeyBmbiA9IGZuLnNsaWNlKDIpLnRyaW0oKTsgfQogICAgICAgIGxldCByb3djb2wgPSBtYXRjaFszXTsKICAgICAgICBsaW5lcy5wdXNoKCcgJyArIGAke2ZufSAke3VybH0ke3Jvd2NvbH06MWAudHJpbSgpKTsKICAgIH0KICAgIGxpbmVzWzBdID0gYHN0YWNrRGVwdGg6JHtsaW5lcy5sZW5ndGgtMX1gOwogICAgY29uc3Qgc3RhY2sgPSBsaW5lcy5qb2luKCdcdCcpOwogICAgY29uc3QgciA9IG5lZWRsZURldGFpbHMubWF0Y2hBbGwgIT09IHRydWUgJiYKICAgICAgICBzYWZlLnRlc3RQYXR0ZXJuKG5lZWRsZURldGFpbHMsIHN0YWNrKTsKICAgIGlmICgKICAgICAgICBsb2dMZXZlbCA9PT0gJ2FsbCcgfHwKICAgICAgICBsb2dMZXZlbCA9PT0gJ21hdGNoJyAmJiByIHx8CiAgICAgICAgbG9nTGV2ZWwgPT09ICdub21hdGNoJyAmJiAhcgogICAgKSB7CiAgICAgICAgc2FmZS51Ym9Mb2coc3RhY2sucmVwbGFjZSgvXHQvZywgJ1xuJykpOwogICAgfQogICAgcmV0dXJuIHI7Cn0KZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG9iamVjdFBydW5lRm4oCiAgICBvYmosCiAgICByYXdQcnVuZVBhdGhzLAogICAgcmF3TmVlZGxlUGF0aHMsCiAgICBzdGFja05lZWRsZURldGFpbHMgPSB7IG1hdGNoQWxsOiB0cnVlIH0sCiAgICBleHRyYUFyZ3MgPSB7fQopIHsKICAgIGlmICggdHlwZW9mIHJhd1BydW5lUGF0aHMgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcHJ1bmVQYXRocyA9IHJhd1BydW5lUGF0aHMgIT09ICcnCiAgICAgICAgPyBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHJhd1BydW5lUGF0aHMsIC8gKy8pCiAgICAgICAgOiBbXTsKICAgIGNvbnN0IG5lZWRsZVBhdGhzID0gcHJ1bmVQYXRocy5sZW5ndGggIT09IDAgJiYgcmF3TmVlZGxlUGF0aHMgIT09ICcnCiAgICAgICAgPyBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHJhd05lZWRsZVBhdGhzLCAvICsvKQogICAgICAgIDogW107CiAgICBpZiAoIHN0YWNrTmVlZGxlRGV0YWlscy5tYXRjaEFsbCAhPT0gdHJ1ZSApIHsKICAgICAgICBpZiAoIG1hdGNoZXNTdGFja1RyYWNlRm4oc3RhY2tOZWVkbGVEZXRhaWxzLCBleHRyYUFyZ3MubG9nc3RhY2spID09PSBmYWxzZSApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggb2JqZWN0UHJ1bmVGbi5tdXN0UHJvY2VzcyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3MgPSAocm9vdCwgbmVlZGxlUGF0aHMpID0+IHsKICAgICAgICAgICAgZm9yICggY29uc3QgbmVlZGxlUGF0aCBvZiBuZWVkbGVQYXRocyApIHsKICAgICAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ocm9vdCwgbmVlZGxlUGF0aCkgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9OwogICAgfQogICAgaWYgKCBwcnVuZVBhdGhzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICBsZXQgb3V0Y29tZSA9ICdub21hdGNoJzsKICAgIGlmICggb2JqZWN0UHJ1bmVGbi5tdXN0UHJvY2VzcyhvYmosIG5lZWRsZVBhdGhzKSApIHsKICAgICAgICBmb3IgKCBjb25zdCBwYXRoIG9mIHBydW5lUGF0aHMgKSB7CiAgICAgICAgICAgIGlmICggb2JqZWN0RmluZE93bmVyRm4ob2JqLCBwYXRoLCB0cnVlKSApIHsKICAgICAgICAgICAgICAgIG91dGNvbWUgPSAnbWF0Y2gnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCBvdXRjb21lID09PSAnbWF0Y2gnICkgeyByZXR1cm4gb2JqOyB9Cn0KZnVuY3Rpb24gbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIC4uLm9ianMpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbWF0Y2hlZCA9IFtdOwogICAgZm9yICggY29uc3Qgb2JqIG9mIG9ianMgKSB7CiAgICAgICAgaWYgKCBvYmogaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgIGZvciAoIGNvbnN0IFsgcHJvcCwgZGV0YWlscyBdIG9mIHByb3BOZWVkbGVzICkgewogICAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpbcHJvcF07CiAgICAgICAgICAgIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgewogICAgICAgICAgICAgICAgdHJ5IHsgdmFsdWUgPSBzYWZlLkpTT05fc3RyaW5naWZ5KHZhbHVlKTsgfQogICAgICAgICAgICAgICAgY2F0Y2ggeyB9CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBzYWZlLnRlc3RQYXR0ZXJuKGRldGFpbHMsIHZhbHVlKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICBtYXRjaGVkLnB1c2goYCR7cHJvcH06ICR7dmFsdWV9YCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hdGNoZWQ7Cn0KCiAgKGZ1bmN0aW9uIGpzb25QcnVuZVhoclJlc3BvbnNlKAogICAgcmF3UHJ1bmVQYXRocyA9ICcnLAogICAgcmF3TmVlZGxlUGF0aHMgPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdqc29uLXBydW5lLXhoci1yZXNwb25zZScsIHJhd1BydW5lUGF0aHMsIHJhd05lZWRsZVBhdGhzKTsKICAgIGNvbnN0IHhockluc3RhbmNlcyA9IG5ldyBXZWFrTWFwKCk7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDIpOwogICAgY29uc3QgcHJvcE5lZWRsZXMgPSBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4oZXh0cmFBcmdzLnByb3BzVG9NYXRjaCwgJ3VybCcpOwogICAgY29uc3Qgc3RhY2tOZWVkbGUgPSBzYWZlLmluaXRQYXR0ZXJuKGV4dHJhQXJncy5zdGFja1RvTWF0Y2ggfHwgJycsIHsgY2FuTmVnYXRlOiB0cnVlIH0pOwogICAgc2VsZi5YTUxIdHRwUmVxdWVzdCA9IGNsYXNzIGV4dGVuZHMgc2VsZi5YTUxIdHRwUmVxdWVzdCB7CiAgICAgICAgb3BlbihtZXRob2QsIHVybCwgLi4uYXJncykgewogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geyBtZXRob2QsIHVybCB9OwogICAgICAgICAgICBsZXQgb3V0Y29tZSA9ICdtYXRjaCc7CiAgICAgICAgICAgIGlmICggcHJvcE5lZWRsZXMuc2l6ZSAhPT0gMCApIHsKICAgICAgICAgICAgICAgIGlmICggbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHhockRldGFpbHMpID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9ICdub21hdGNoJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG91dGNvbWUgPT09ICdtYXRjaCcgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYE1hdGNoZWQgb3B0aW9uYWwgInByb3BzVG9NYXRjaCIsICIke2V4dHJhQXJncy5wcm9wc1RvTWF0Y2h9ImApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgeGhySW5zdGFuY2VzLnNldCh0aGlzLCB4aHJEZXRhaWxzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3VwZXIub3BlbihtZXRob2QsIHVybCwgLi4uYXJncyk7CiAgICAgICAgfQogICAgICAgIGdldCByZXNwb25zZSgpIHsKICAgICAgICAgICAgY29uc3QgaW5uZXJSZXNwb25zZSA9IHN1cGVyLnJlc3BvbnNlOwogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geGhySW5zdGFuY2VzLmdldCh0aGlzKTsKICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJSZXNwb25zZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZXNwb25zZUxlbmd0aCA9IHR5cGVvZiBpbm5lclJlc3BvbnNlID09PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgPyBpbm5lclJlc3BvbnNlLmxlbmd0aAogICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscy5sYXN0UmVzcG9uc2VMZW5ndGggIT09IHJlc3BvbnNlTGVuZ3RoICkgewogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5yZXNwb25zZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHhockRldGFpbHMubGFzdFJlc3BvbnNlTGVuZ3RoID0gcmVzcG9uc2VMZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzLnJlc3BvbnNlICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geGhyRGV0YWlscy5yZXNwb25zZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgb2JqQmVmb3JlOwogICAgICAgICAgICBpZiAoIHR5cGVvZiBpbm5lclJlc3BvbnNlID09PSAnb2JqZWN0JyApIHsKICAgICAgICAgICAgICAgIG9iakJlZm9yZSA9IGlubmVyUmVzcG9uc2U7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiBpbm5lclJlc3BvbnNlID09PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb2JqQmVmb3JlID0gc2FmZS5KU09OX3BhcnNlKGlubmVyUmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB0eXBlb2Ygb2JqQmVmb3JlICE9PSAnb2JqZWN0JyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoeGhyRGV0YWlscy5yZXNwb25zZSA9IGlubmVyUmVzcG9uc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG9iakFmdGVyID0gb2JqZWN0UHJ1bmVGbigKICAgICAgICAgICAgICAgIG9iakJlZm9yZSwKICAgICAgICAgICAgICAgIHJhd1BydW5lUGF0aHMsCiAgICAgICAgICAgICAgICByYXdOZWVkbGVQYXRocywKICAgICAgICAgICAgICAgIHN0YWNrTmVlZGxlLAogICAgICAgICAgICAgICAgZXh0cmFBcmdzCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGxldCBvdXRlclJlc3BvbnNlOwogICAgICAgICAgICBpZiAoIHR5cGVvZiBvYmpBZnRlciA9PT0gJ29iamVjdCcgKSB7CiAgICAgICAgICAgICAgICBvdXRlclJlc3BvbnNlID0gdHlwZW9mIGlubmVyUmVzcG9uc2UgPT09ICdzdHJpbmcnCiAgICAgICAgICAgICAgICAgICAgPyBzYWZlLkpTT05fc3RyaW5naWZ5KG9iakFmdGVyKQogICAgICAgICAgICAgICAgICAgIDogb2JqQWZ0ZXI7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdQcnVuZWQnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG91dGVyUmVzcG9uc2UgPSBpbm5lclJlc3BvbnNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoeGhyRGV0YWlscy5yZXNwb25zZSA9IG91dGVyUmVzcG9uc2UpOwogICAgICAgIH0KICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucmVzcG9uc2U7CiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgcmVzcG9uc2UgIT09ICdzdHJpbmcnCiAgICAgICAgICAgICAgICA/IHN1cGVyLnJlc3BvbnNlVGV4dAogICAgICAgICAgICAgICAgOiByZXNwb25zZTsKICAgICAgICB9CiAgICB9Owp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"evaldata-prune.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBnZXRFeGNlcHRpb25Ub2tlbkZuKCkgewogICAgY29uc3QgdG9rZW4gPSBnZXRSYW5kb21Ub2tlbkZuKCk7CiAgICBjb25zdCBvZSA9IHNlbGYub25lcnJvcjsKICAgIHNlbGYub25lcnJvciA9IGZ1bmN0aW9uKG1zZywgLi4uYXJncykgewogICAgICAgIGlmICggdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgJiYgbXNnLmluY2x1ZGVzKHRva2VuKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoIG9lIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIHJldHVybiBvZS5jYWxsKHRoaXMsIG1zZywgLi4uYXJncyk7CiAgICAgICAgfQogICAgfS5iaW5kKCk7CiAgICByZXR1cm4gdG9rZW47Cn0KZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIG9iamVjdEZpbmRPd25lckZuKAogICAgcm9vdCwKICAgIHBhdGgsCiAgICBwcnVuZSA9IGZhbHNlCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBsZXQgb3duZXIgPSByb290OwogICAgbGV0IGNoYWluID0gcGF0aDsKICAgIGZvciAoOzspIHsKICAgICAgICBpZiAoIHR5cGVvZiBvd25lciAhPT0gJ29iamVjdCcgfHwgb3duZXIgPT09IG51bGwgICkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICBjb25zdCBwb3MgPSBjaGFpbi5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgewogICAgICAgICAgICBpZiAoIHBydW5lID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzYWZlLk9iamVjdF9oYXNPd24ob3duZXIsIGNoYWluKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCBjaGFpbiA9PT0gJyonICkgewogICAgICAgICAgICAgICAgZm9yICggY29uc3Qga2V5IGluIG93bmVyICkgewogICAgICAgICAgICAgICAgICAgIGlmICggc2FmZS5PYmplY3RfaGFzT3duKG93bmVyLCBrZXkpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJba2V5XTsKICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHNhZmUuT2JqZWN0X2hhc093bihvd25lciwgY2hhaW4pICkgewogICAgICAgICAgICAgICAgZGVsZXRlIG93bmVyW2NoYWluXTsKICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByb3AgPSBjaGFpbi5zbGljZSgwLCBwb3MpOwogICAgICAgIGNvbnN0IG5leHQgPSBjaGFpbi5zbGljZShwb3MgKyAxKTsKICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKICAgICAgICBpZiAoIHByb3AgPT09ICdbLV0nICYmIEFycmF5LmlzQXJyYXkob3duZXIpICkgewogICAgICAgICAgICBsZXQgaSA9IG93bmVyLmxlbmd0aDsKICAgICAgICAgICAgd2hpbGUgKCBpLS0gKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG93bmVyW2ldLCBuZXh0KSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBvd25lci5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwogICAgICAgIH0KICAgICAgICBpZiAoIHByb3AgPT09ICd7LX0nICYmIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0ICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3duZXIpICkgewogICAgICAgICAgICAgICAgaWYgKCBvYmplY3RGaW5kT3duZXJGbihvd25lcltrZXldLCBuZXh0KSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBkZWxldGUgb3duZXJba2V5XTsKICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGlmICgKICAgICAgICAgICAgcHJvcCA9PT0gJ1tdJyAmJiBBcnJheS5pc0FycmF5KG93bmVyKSB8fAogICAgICAgICAgICBwcm9wID09PSAne30nICYmIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0IHx8CiAgICAgICAgICAgIHByb3AgPT09ICcqJyAmJiBvd25lciBpbnN0YW5jZW9mIE9iamVjdAogICAgICAgICkgewogICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3duZXIpICkgewogICAgICAgICAgICAgICAgaWYgKG9iamVjdEZpbmRPd25lckZuKG93bmVyW2tleV0sIG5leHQsIHBydW5lKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwogICAgICAgIH0KICAgICAgICBpZiAoIHNhZmUuT2JqZWN0X2hhc093bihvd25lciwgcHJvcCkgPT09IGZhbHNlICkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICBvd25lciA9IG93bmVyW3Byb3BdOwogICAgICAgIGNoYWluID0gY2hhaW4uc2xpY2UocG9zICsgMSk7CiAgICB9Cn0KZnVuY3Rpb24gbWF0Y2hlc1N0YWNrVHJhY2VGbigKICAgIG5lZWRsZURldGFpbHMsCiAgICBsb2dMZXZlbCA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBleGNlcHRpb25Ub2tlbiA9IGdldEV4Y2VwdGlvblRva2VuRm4oKTsKICAgIGNvbnN0IGVycm9yID0gbmV3IHNhZmUuRXJyb3IoZXhjZXB0aW9uVG9rZW4pOwogICAgY29uc3QgZG9jVVJMID0gbmV3IFVSTChzZWxmLmxvY2F0aW9uLmhyZWYpOwogICAgZG9jVVJMLmhhc2ggPSAnJzsKICAgIC8vIE5vcm1hbGl6ZSBzdGFjayB0cmFjZQogICAgY29uc3QgcmVMaW5lID0gLyguKj9AKT8oXFMrKSg6XGQrKTpcZCtcKT8kLzsKICAgIGNvbnN0IGxpbmVzID0gW107CiAgICBmb3IgKCBsZXQgbGluZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKGVycm9yLnN0YWNrLCAvW1xuXHJdKy8pICkgewogICAgICAgIGlmICggbGluZS5pbmNsdWRlcyhleGNlcHRpb25Ub2tlbikgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwogICAgICAgIGNvbnN0IG1hdGNoID0gc2FmZS5SZWdFeHBfZXhlYy5jYWxsKHJlTGluZSwgbGluZSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgY29udGludWU7IH0KICAgICAgICBsZXQgdXJsID0gbWF0Y2hbMl07CiAgICAgICAgaWYgKCB1cmwuc3RhcnRzV2l0aCgnKCcpICkgeyB1cmwgPSB1cmwuc2xpY2UoMSk7IH0KICAgICAgICBpZiAoIHVybCA9PT0gZG9jVVJMLmhyZWYgKSB7CiAgICAgICAgICAgIHVybCA9ICdpbmxpbmVTY3JpcHQnOwogICAgICAgIH0gZWxzZSBpZiAoIHVybC5zdGFydHNXaXRoKCc8YW5vbnltb3VzPicpICkgewogICAgICAgICAgICB1cmwgPSAnaW5qZWN0ZWRTY3JpcHQnOwogICAgICAgIH0KICAgICAgICBsZXQgZm4gPSBtYXRjaFsxXSAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgID8gbWF0Y2hbMV0uc2xpY2UoMCwgLTEpCiAgICAgICAgICAgIDogbGluZS5zbGljZSgwLCBtYXRjaC5pbmRleCkudHJpbSgpOwogICAgICAgIGlmICggZm4uc3RhcnRzV2l0aCgnYXQnKSApIHsgZm4gPSBmbi5zbGljZSgyKS50cmltKCk7IH0KICAgICAgICBsZXQgcm93Y29sID0gbWF0Y2hbM107CiAgICAgICAgbGluZXMucHVzaCgnICcgKyBgJHtmbn0gJHt1cmx9JHtyb3djb2x9OjFgLnRyaW0oKSk7CiAgICB9CiAgICBsaW5lc1swXSA9IGBzdGFja0RlcHRoOiR7bGluZXMubGVuZ3RoLTF9YDsKICAgIGNvbnN0IHN0YWNrID0gbGluZXMuam9pbignXHQnKTsKICAgIGNvbnN0IHIgPSBuZWVkbGVEZXRhaWxzLm1hdGNoQWxsICE9PSB0cnVlICYmCiAgICAgICAgc2FmZS50ZXN0UGF0dGVybihuZWVkbGVEZXRhaWxzLCBzdGFjayk7CiAgICBpZiAoCiAgICAgICAgbG9nTGV2ZWwgPT09ICdhbGwnIHx8CiAgICAgICAgbG9nTGV2ZWwgPT09ICdtYXRjaCcgJiYgciB8fAogICAgICAgIGxvZ0xldmVsID09PSAnbm9tYXRjaCcgJiYgIXIKICAgICkgewogICAgICAgIHNhZmUudWJvTG9nKHN0YWNrLnJlcGxhY2UoL1x0L2csICdcbicpKTsKICAgIH0KICAgIHJldHVybiByOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBvYmplY3RQcnVuZUZuKAogICAgb2JqLAogICAgcmF3UHJ1bmVQYXRocywKICAgIHJhd05lZWRsZVBhdGhzLAogICAgc3RhY2tOZWVkbGVEZXRhaWxzID0geyBtYXRjaEFsbDogdHJ1ZSB9LAogICAgZXh0cmFBcmdzID0ge30KKSB7CiAgICBpZiAoIHR5cGVvZiByYXdQcnVuZVBhdGhzICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHBydW5lUGF0aHMgPSByYXdQcnVuZVBhdGhzICE9PSAnJwogICAgICAgID8gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChyYXdQcnVuZVBhdGhzLCAvICsvKQogICAgICAgIDogW107CiAgICBjb25zdCBuZWVkbGVQYXRocyA9IHBydW5lUGF0aHMubGVuZ3RoICE9PSAwICYmIHJhd05lZWRsZVBhdGhzICE9PSAnJwogICAgICAgID8gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChyYXdOZWVkbGVQYXRocywgLyArLykKICAgICAgICA6IFtdOwogICAgaWYgKCBzdGFja05lZWRsZURldGFpbHMubWF0Y2hBbGwgIT09IHRydWUgKSB7CiAgICAgICAgaWYgKCBtYXRjaGVzU3RhY2tUcmFjZUZuKHN0YWNrTmVlZGxlRGV0YWlscywgZXh0cmFBcmdzLmxvZ3N0YWNrKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3MgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBvYmplY3RQcnVuZUZuLm11c3RQcm9jZXNzID0gKHJvb3QsIG5lZWRsZVBhdGhzKSA9PiB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IG5lZWRsZVBhdGggb2YgbmVlZGxlUGF0aHMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKHJvb3QsIG5lZWRsZVBhdGgpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgIH0KICAgIGlmICggcHJ1bmVQYXRocy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgbGV0IG91dGNvbWUgPSAnbm9tYXRjaCc7CiAgICBpZiAoIG9iamVjdFBydW5lRm4ubXVzdFByb2Nlc3Mob2JqLCBuZWVkbGVQYXRocykgKSB7CiAgICAgICAgZm9yICggY29uc3QgcGF0aCBvZiBwcnVuZVBhdGhzICkgewogICAgICAgICAgICBpZiAoIG9iamVjdEZpbmRPd25lckZuKG9iaiwgcGF0aCwgdHJ1ZSkgKSB7CiAgICAgICAgICAgICAgICBvdXRjb21lID0gJ21hdGNoJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICggb3V0Y29tZSA9PT0gJ21hdGNoJyApIHsgcmV0dXJuIG9iajsgfQp9CgogIChmdW5jdGlvbiBldmFsZGF0YVBydW5lKAogICAgcmF3UHJ1bmVQYXRocyA9ICcnLAogICAgcmF3TmVlZGxlUGF0aHMgPSAnJwopIHsKICAgIHByb3h5QXBwbHlGbignZXZhbCcsIGZ1bmN0aW9uKGNvbnRleHQpIHsKICAgICAgICBjb25zdCBiZWZvcmUgPSBjb250ZXh0LnJlZmxlY3QoKTsKICAgICAgICBpZiAoIHR5cGVvZiBiZWZvcmUgIT09ICdvYmplY3QnICkgeyByZXR1cm4gYmVmb3JlOyB9CiAgICAgICAgaWYgKCBiZWZvcmUgPT09IG51bGwgKSB7IHJldHVybiBudWxsOyB9CiAgICAgICAgY29uc3QgYWZ0ZXIgPSBvYmplY3RQcnVuZUZuKGJlZm9yZSwgcmF3UHJ1bmVQYXRocywgcmF3TmVlZGxlUGF0aHMpOwogICAgICAgIHJldHVybiBhZnRlciB8fCBiZWZvcmU7CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"noeval-if.js","aliases":["prevent-eval-if.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQoKICAoZnVuY3Rpb24gbm9FdmFsSWYoCiAgICBuZWVkbGUgPSAnJwopIHsKICAgIGlmICggdHlwZW9mIG5lZWRsZSAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ25vZXZhbC1pZicsIG5lZWRsZSk7CiAgICBjb25zdCByZU5lZWRsZSA9IHNhZmUucGF0dGVyblRvUmVnZXgobmVlZGxlKTsKICAgIHByb3h5QXBwbHlGbignZXZhbCcsIGZ1bmN0aW9uKGNvbnRleHQpIHsKICAgICAgICBjb25zdCB7IGNhbGxBcmdzIH0gPSBjb250ZXh0OwogICAgICAgIGNvbnN0IGEgPSBTdHJpbmcoY2FsbEFyZ3NbMF0pOwogICAgICAgIGlmICggbmVlZGxlICE9PSAnJyAmJiByZU5lZWRsZS50ZXN0KGEpICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdQcmV2ZW50ZWQ6XG4nLCBhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIG5lZWRsZSA9PT0gJycgfHwgc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ05vdCBwcmV2ZW50ZWQ6XG4nLCBhKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOwogICAgfSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"prevent-addEventListener.js","aliases":["addEventListener-defuser.js","aeld.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHJ1bkF0KGZuLCB3aGVuKSB7CiAgICBjb25zdCBpbnRGcm9tUmVhZHlTdGF0ZSA9IHN0YXRlID0+IHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gewogICAgICAgICAgICAnbG9hZGluZyc6IDEsICdhc2FwJzogMSwKICAgICAgICAgICAgJ2ludGVyYWN0aXZlJzogMiwgJ2VuZCc6IDIsICcyJzogMiwKICAgICAgICAgICAgJ2NvbXBsZXRlJzogMywgJ2lkbGUnOiAzLCAnMyc6IDMsCiAgICAgICAgfTsKICAgICAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5pc0FycmF5KHN0YXRlKSA/IHN0YXRlIDogWyBzdGF0ZSBdOwogICAgICAgIGZvciAoIGNvbnN0IHRva2VuIG9mIHRva2VucyApIHsKICAgICAgICAgICAgY29uc3QgcHJvcCA9IGAke3Rva2VufWA7CiAgICAgICAgICAgIGlmICggT2JqZWN0Lmhhc093bih0YXJnZXRzLCBwcm9wKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIHJldHVybiB0YXJnZXRzW3Byb3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBjb25zdCBydW5BdCA9IGludEZyb21SZWFkeVN0YXRlKHdoZW4pOwogICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSBydW5BdCApIHsKICAgICAgICBmbigpOyByZXR1cm47CiAgICB9CiAgICBjb25zdCBvblN0YXRlQ2hhbmdlID0gKCApID0+IHsKICAgICAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpIDwgcnVuQXQgKSB7IHJldHVybjsgfQogICAgICAgIGZuKCk7CiAgICAgICAgc2FmZS5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKICAgIH07CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGFyZ3MgPSBbICdyZWFkeXN0YXRlY2hhbmdlJywgb25TdGF0ZUNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlIH0gXTsKICAgIHNhZmUuYWRkRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7Cn0KZnVuY3Rpb24gcHJveHlBcHBseUZuKAogICAgdGFyZ2V0ID0gJycsCiAgICBoYW5kbGVyID0gJycKKSB7CiAgICBsZXQgY29udGV4dCA9IGdsb2JhbFRoaXM7CiAgICBsZXQgcHJvcCA9IHRhcmdldDsKICAgIGZvciAoOzspIHsKICAgICAgICBjb25zdCBwb3MgPSBwcm9wLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IGJyZWFrOyB9CiAgICAgICAgY29udGV4dCA9IGNvbnRleHRbcHJvcC5zbGljZSgwLCBwb3MpXTsKICAgICAgICBpZiAoIGNvbnRleHQgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBwcm9wID0gcHJvcC5zbGljZShwb3MrMSk7CiAgICB9CiAgICBjb25zdCBmbiA9IGNvbnRleHRbcHJvcF07CiAgICBpZiAoIHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuOyB9CiAgICBpZiAoIHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMgPSBbXTsKICAgICAgICBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPSBjbGFzcyB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5pdCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0KGNhbGxGbiwgY2FsbEFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEZuID0gY2FsbEZuOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmNvbnN0cnVjdCh0aGlzLmNhbGxGbiwgdGhpcy5jYWxsQXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IHRoaXMuY2FsbEFyZ3MgPSB0aGlzLnByaXZhdGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0aWMgZmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMucG9wKCkuaW5pdCguLi5hcmdzKQogICAgICAgICAgICAgICAgICAgIDogbmV3IHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMgPSBbXTsKICAgICAgICBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIHRoaXNBcmcsIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxBcmdzID0gY2FsbEFyZ3M7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWZsZWN0KCkgewogICAgICAgICAgICAgICAgY29uc3QgciA9IFJlZmxlY3QuYXBwbHkodGhpcy5jYWxsRm4sIHRoaXMudGhpc0FyZywgdGhpcy5jYWxsQXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IHRoaXMudGhpc0FyZyA9IHRoaXMuY2FsbEFyZ3MgPSB0aGlzLnByaXZhdGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLmxlbmd0aCAhPT0gMAogICAgICAgICAgICAgICAgICAgID8gcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucG9wKCkuaW5pdCguLi5hcmdzKQogICAgICAgICAgICAgICAgICAgIDogbmV3IHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5pc0N0b3IgPSBuZXcgTWFwKCk7CiAgICB9CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuaGFzKHRhcmdldCkgPT09IGZhbHNlICkgewogICAgICAgIHByb3h5QXBwbHlGbi5pc0N0b3Iuc2V0KHRhcmdldCwgZm4ucHJvdG90eXBlPy5jb25zdHJ1Y3RvciA9PT0gZm4pOwogICAgfQogICAgY29uc3QgZm5TdHIgPSBmbi50b1N0cmluZygpOwogICAgY29uc3QgdG9TdHJpbmcgPSAoZnVuY3Rpb24gdG9TdHJpbmcoKSB7IHJldHVybiBmblN0cjsgfSkuYmluZChudWxsKTsKICAgIGNvbnN0IHByb3h5RGV0YWlscyA9IHsKICAgICAgICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIocHJveHlBcHBseUZuLkFwcGx5Q29udGV4dC5mYWN0b3J5KHRhcmdldCwgdGhpc0FyZywgYXJncykpOwogICAgICAgIH0sCiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICBpZiAoIHByb3AgPT09ICd0b1N0cmluZycgKSB7IHJldHVybiB0b1N0cmluZzsgfQogICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTsKICAgICAgICB9LAogICAgfTsKICAgIGlmICggcHJveHlBcHBseUZuLmlzQ3Rvci5nZXQodGFyZ2V0KSApIHsKICAgICAgICBwcm94eURldGFpbHMuY29uc3RydWN0ID0gZnVuY3Rpb24odGFyZ2V0LCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dC5mYWN0b3J5KHRhcmdldCwgYXJncykpOwogICAgICAgIH07CiAgICB9CiAgICBjb250ZXh0W3Byb3BdID0gbmV3IFByb3h5KGZuLCBwcm94eURldGFpbHMpOwp9CgogIChmdW5jdGlvbiBwcmV2ZW50QWRkRXZlbnRMaXN0ZW5lcigKICAgIHR5cGUgPSAnJywKICAgIHBhdHRlcm4gPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAyKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgncHJldmVudC1hZGRFdmVudExpc3RlbmVyJywgdHlwZSwgcGF0dGVybik7CiAgICBjb25zdCByZVR5cGUgPSBzYWZlLnBhdHRlcm5Ub1JlZ2V4KHR5cGUsIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICBjb25zdCByZVBhdHRlcm4gPSBzYWZlLnBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4pOwogICAgY29uc3QgdGFyZ2V0U2VsZWN0b3IgPSBleHRyYUFyZ3MuZWxlbWVudHMgfHwgdW5kZWZpbmVkOwogICAgY29uc3QgZWxlbWVudE1hdGNoZXMgPSBlbGVtID0+IHsKICAgICAgICBpZiAoIHRhcmdldFNlbGVjdG9yID09PSAnd2luZG93JyApIHsgcmV0dXJuIGVsZW0gPT09IHdpbmRvdzsgfQogICAgICAgIGlmICggdGFyZ2V0U2VsZWN0b3IgPT09ICdkb2N1bWVudCcgKSB7IHJldHVybiBlbGVtID09PSBkb2N1bWVudDsgfQogICAgICAgIGlmICggZWxlbSAmJiBlbGVtLm1hdGNoZXMgJiYgZWxlbS5tYXRjaGVzKHRhcmdldFNlbGVjdG9yKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBjb25zdCBlbGVtcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0YXJnZXRTZWxlY3RvcikpOwogICAgICAgIHJldHVybiBlbGVtcy5pbmNsdWRlcyhlbGVtKTsKICAgIH07CiAgICBjb25zdCBlbGVtZW50RGV0YWlscyA9IGVsZW0gPT4gewogICAgICAgIGlmICggZWxlbSBpbnN0YW5jZW9mIFdpbmRvdyApIHsgcmV0dXJuICd3aW5kb3cnOyB9CiAgICAgICAgaWYgKCBlbGVtIGluc3RhbmNlb2YgRG9jdW1lbnQgKSB7IHJldHVybiAnZG9jdW1lbnQnOyB9CiAgICAgICAgaWYgKCBlbGVtIGluc3RhbmNlb2YgRWxlbWVudCA9PT0gZmFsc2UgKSB7IHJldHVybiAnPyc7IH0KICAgICAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91QmxvY2tPcmlnaW4vdUFzc2V0cy9kaXNjdXNzaW9ucy8xNzkwNyNkaXNjdXNzaW9uY29tbWVudC05ODcxMDc5CiAgICAgICAgY29uc3QgaWQgPSBTdHJpbmcoZWxlbS5pZCk7CiAgICAgICAgaWYgKCBpZCAhPT0gJycgKSB7IHBhcnRzLnB1c2goYCMke0NTUy5lc2NhcGUoaWQpfWApOyB9CiAgICAgICAgZm9yICggbGV0IGkgPSAwOyBpIDwgZWxlbS5jbGFzc0xpc3QubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYC4ke0NTUy5lc2NhcGUoZWxlbS5jbGFzc0xpc3QuaXRlbShpKSl9YCk7CiAgICAgICAgfQogICAgICAgIGZvciAoIGxldCBpID0gMDsgaSA8IGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7IGkrKyApIHsKICAgICAgICAgICAgY29uc3QgYXR0ciA9IGVsZW0uYXR0cmlidXRlcy5pdGVtKGkpOwogICAgICAgICAgICBpZiAoIGF0dHIubmFtZSA9PT0gJ2lkJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgaWYgKCBhdHRyLm5hbWUgPT09ICdjbGFzcycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIHBhcnRzLnB1c2goYFske0NTUy5lc2NhcGUoYXR0ci5uYW1lKX09IiR7YXR0ci52YWx1ZX0iXWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFydHMuam9pbignJyk7CiAgICB9OwogICAgY29uc3Qgc2hvdWxkUHJldmVudCA9ICh0aGlzQXJnLCB0eXBlLCBoYW5kbGVyKSA9PiB7CiAgICAgICAgY29uc3QgbWF0Y2hlc1R5cGUgPSBzYWZlLlJlZ0V4cF90ZXN0LmNhbGwocmVUeXBlLCB0eXBlKTsKICAgICAgICBjb25zdCBtYXRjaGVzSGFuZGxlciA9IHNhZmUuUmVnRXhwX3Rlc3QuY2FsbChyZVBhdHRlcm4sIGhhbmRsZXIpOwogICAgICAgIGNvbnN0IG1hdGNoZXNFaXRoZXIgPSBtYXRjaGVzVHlwZSB8fCBtYXRjaGVzSGFuZGxlcjsKICAgICAgICBjb25zdCBtYXRjaGVzQm90aCA9IG1hdGNoZXNUeXBlICYmIG1hdGNoZXNIYW5kbGVyOwogICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgJiYgbWF0Y2hlc0VpdGhlciApIHsKICAgICAgICAgICAgZGVidWdnZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZGVidWdnZXIKICAgICAgICB9CiAgICAgICAgaWYgKCBtYXRjaGVzQm90aCAmJiB0YXJnZXRTZWxlY3RvciAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBpZiAoIGVsZW1lbnRNYXRjaGVzKHRoaXNBcmcpID09PSBmYWxzZSApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXRjaGVzQm90aDsKICAgIH07CiAgICBjb25zdCBwcm94eUZuID0gZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IHsgY2FsbEFyZ3MsIHRoaXNBcmcgfSA9IGNvbnRleHQ7CiAgICAgICAgbGV0IHQsIGg7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdCA9IFN0cmluZyhjYWxsQXJnc1swXSk7CiAgICAgICAgICAgIGlmICggdHlwZW9mIGNhbGxBcmdzWzFdID09PSAnZnVuY3Rpb24nICkgewogICAgICAgICAgICAgICAgaCA9IFN0cmluZyhzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nKGNhbGxBcmdzWzFdKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiBjYWxsQXJnc1sxXSA9PT0gJ29iamVjdCcgJiYgY2FsbEFyZ3NbMV0gIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiBjYWxsQXJnc1sxXS5oYW5kbGVFdmVudCA9PT0gJ2Z1bmN0aW9uJyApIHsKICAgICAgICAgICAgICAgICAgICBoID0gU3RyaW5nKHNhZmUuRnVuY3Rpb25fdG9TdHJpbmcoY2FsbEFyZ3NbMV0uaGFuZGxlRXZlbnQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGggPSBTdHJpbmcoY2FsbEFyZ3NbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIGlmICggdHlwZSA9PT0gJycgJiYgcGF0dGVybiA9PT0gJycgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYENhbGxlZDogJHt0fVxuJHtofVxuJHtlbGVtZW50RGV0YWlscyh0aGlzQXJnKX1gKTsKICAgICAgICB9IGVsc2UgaWYgKCBzaG91bGRQcmV2ZW50KHRoaXNBcmcsIHQsIGgpICkgewogICAgICAgICAgICByZXR1cm4gc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgUHJldmVudGVkOiAke3R9XG4ke2h9XG4ke2VsZW1lbnREZXRhaWxzKHRoaXNBcmcpfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICB9OwogICAgcnVuQXQoKCApID0+IHsKICAgICAgICBwcm94eUFwcGx5Rm4oJ0V2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyJywgcHJveHlGbik7CiAgICAgICAgaWYgKCBleHRyYUFyZ3MucHJvdGVjdCApIHsKICAgICAgICAgICAgY29uc3QgeyBhZGRFdmVudExpc3RlbmVyIH0gPSBFdmVudFRhcmdldC5wcm90b3R5cGU7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudFRhcmdldC5wcm90b3R5cGUsICdhZGRFdmVudExpc3RlbmVyJywgewogICAgICAgICAgICAgICAgc2V0KCkgeyB9LAogICAgICAgICAgICAgICAgZ2V0KCkgeyByZXR1cm4gYWRkRXZlbnRMaXN0ZW5lcjsgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcHJveHlBcHBseUZuKCdkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyJywgcHJveHlGbik7CiAgICAgICAgaWYgKCBleHRyYUFyZ3MucHJvdGVjdCApIHsKICAgICAgICAgICAgY29uc3QgeyBhZGRFdmVudExpc3RlbmVyIH0gPSBkb2N1bWVudDsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCAnYWRkRXZlbnRMaXN0ZW5lcicsIHsKICAgICAgICAgICAgICAgIHNldCgpIHsgfSwKICAgICAgICAgICAgICAgIGdldCgpIHsgcmV0dXJuIGFkZEV2ZW50TGlzdGVuZXI7IH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfSwgZXh0cmFBcmdzLnJ1bkF0KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"prevent-dialog.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBwcmV2ZW50RGlhbG9nKAogICAgc2VsZWN0b3IgPSAnJywKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgncHJldmVudC1kaWFsb2cnLCBzZWxlY3Rvcik7CiAgICBjb25zdCBwcmV2ZW50ID0gKCApID0+IHsKICAgICAgICBkZWJvdW5jZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgZWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBkaWFsb2cke3NlbGVjdG9yfWApOwogICAgICAgIGZvciAoIGNvbnN0IGVsZW0gb2YgZWxlbXMgKSB7CiAgICAgICAgICAgIGlmICggdHlwZW9mIGVsZW0uY2xvc2UgIT09ICdmdW5jdGlvbicgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggZWxlbS5vcGVuID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgZWxlbS5jbG9zZSgpOwogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdDbG9zZWQnKTsKICAgICAgICB9CiAgICB9OwogICAgbGV0IGRlYm91bmNlcjsKICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCApID0+IHsKICAgICAgICBpZiAoIGRlYm91bmNlciAhPT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBkZWJvdW5jZXIgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocHJldmVudCk7CiAgICB9KTsKICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHsKICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICBzdWJ0cmVlOiB0cnVlLAogICAgfSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"prevent-fetch.js","aliases":["no-fetch-if.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCBpbXBsaWNpdCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG5lZWRsZXMgPSBuZXcgTWFwKCk7CiAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gdW5kZWZpbmVkIHx8IHByb3BzVG9NYXRjaCA9PT0gJycgKSB7IHJldHVybiBuZWVkbGVzOyB9CiAgICBjb25zdCBvcHRpb25zID0geyBjYW5OZWdhdGU6IHRydWUgfTsKICAgIGZvciAoIGNvbnN0IG5lZWRsZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHByb3BzVG9NYXRjaCwgL1xzKy8pICkgewogICAgICAgIGxldCBbIHByb3AsIHBhdHRlcm4gXSA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwobmVlZGxlLCAnOicpOwogICAgICAgIGlmICggcHJvcCA9PT0gJycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgJiYgL1teJFx3IC1dLy50ZXN0KHByb3ApICkgewogICAgICAgICAgICBwcm9wID0gYCR7cHJvcH06JHtwYXR0ZXJufWA7CiAgICAgICAgICAgIHBhdHRlcm4gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmICggcGF0dGVybiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBuZWVkbGVzLnNldChwcm9wLCBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgICB9IGVsc2UgaWYgKCBpbXBsaWNpdCAhPT0gJycgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KGltcGxpY2l0LCBzYWZlLmluaXRQYXR0ZXJuKHByb3AsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZGxlczsKfQpmdW5jdGlvbiBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgLi4ub2JqcykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBtYXRjaGVkID0gW107CiAgICBmb3IgKCBjb25zdCBvYmogb2Ygb2JqcyApIHsKICAgICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgZm9yICggY29uc3QgWyBwcm9wLCBkZXRhaWxzIF0gb2YgcHJvcE5lZWRsZXMgKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkodmFsdWUpOyB9CiAgICAgICAgICAgICAgICBjYXRjaCB7IH0KICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4oZGV0YWlscywgdmFsdWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG1hdGNoZWQucHVzaChgJHtwcm9wfTogJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0Y2hlZDsKfQpmdW5jdGlvbiBnZW5lcmF0ZUNvbnRlbnRGbih0cnVzdGVkLCBkaXJlY3RpdmUpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcmFuZG9taXplID0gbGVuID0+IHsKICAgICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgICBsZXQgdGV4dFNpemUgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgY29uc3QgcyA9IHNhZmUuTWF0aF9yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7CiAgICAgICAgICAgIGNodW5rcy5wdXNoKHMpOwogICAgICAgICAgICB0ZXh0U2l6ZSArPSBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCB0ZXh0U2l6ZSA8IGxlbiApOwogICAgICAgIHJldHVybiBjaHVua3Muam9pbignICcpLnNsaWNlKDAsIGxlbik7CiAgICB9OwogICAgaWYgKCBkaXJlY3RpdmUgPT09ICd0cnVlJyApIHsKICAgICAgICByZXR1cm4gcmFuZG9taXplKDEwKTsKICAgIH0KICAgIGlmICggZGlyZWN0aXZlID09PSAnZW1wdHlPYmonICkgewogICAgICAgIHJldHVybiAne30nOwogICAgfQogICAgaWYgKCBkaXJlY3RpdmUgPT09ICdlbXB0eUFycicgKSB7CiAgICAgICAgcmV0dXJuICdbXSc7CiAgICB9CiAgICBpZiAoIGRpcmVjdGl2ZSA9PT0gJ2VtcHR5U3RyJyApIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBpZiAoIGRpcmVjdGl2ZS5zdGFydHNXaXRoKCdsZW5ndGg6JykgKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSAvXmxlbmd0aDooXGQrKSg/Oi0oXGQrKSk/JC8uZXhlYyhkaXJlY3RpdmUpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiAnJzsgfQogICAgICAgIGNvbnN0IG1pbiA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7CiAgICAgICAgY29uc3QgZXh0ZW50ID0gc2FmZS5NYXRoX21heChwYXJzZUludChtYXRjaFsyXSwgMTApIHx8IDAsIG1pbikgLSBtaW47CiAgICAgICAgY29uc3QgbGVuID0gc2FmZS5NYXRoX21pbihtaW4gKyBleHRlbnQgKiBzYWZlLk1hdGhfcmFuZG9tKCksIDUwMDAwMCk7CiAgICAgICAgcmV0dXJuIHJhbmRvbWl6ZShsZW4gfCAwKTsKICAgIH0KICAgIGlmICggZGlyZWN0aXZlLnN0YXJ0c1dpdGgoJ3dhcjonKSApIHsKICAgICAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMud2FyT3JpZ2luID09PSB1bmRlZmluZWQgKSB7IHJldHVybiAnJzsgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsKICAgICAgICAgICAgY29uc3Qgd2FyT3JpZ2luID0gc2NyaXB0bGV0R2xvYmFscy53YXJPcmlnaW47CiAgICAgICAgICAgIGNvbnN0IHdhck5hbWUgPSBkaXJlY3RpdmUuc2xpY2UoNCk7CiAgICAgICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gWyB3YXJPcmlnaW4sICcvJywgd2FyTmFtZSBdOwogICAgICAgICAgICBjb25zdCB3YXJTZWNyZXQgPSBzY3JpcHRsZXRHbG9iYWxzLndhclNlY3JldDsKICAgICAgICAgICAgaWYgKCB3YXJTZWNyZXQgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIGZ1bGxwYXRoLnB1c2goJz9zZWNyZXQ9Jywgd2FyU2VjcmV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB3YXJYSFIgPSBuZXcgc2FmZS5YTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICB3YXJYSFIucmVzcG9uc2VUeXBlID0gJ3RleHQnOwogICAgICAgICAgICB3YXJYSFIub25sb2FkZW5kID0gZXYgPT4gewogICAgICAgICAgICAgICAgcmVzb2x2ZShldi50YXJnZXQucmVzcG9uc2VUZXh0IHx8ICcnKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2FyWEhSLm9wZW4oJ0dFVCcsIGZ1bGxwYXRoLmpvaW4oJycpKTsKICAgICAgICAgICAgd2FyWEhSLnNlbmQoKTsKICAgICAgICB9KS5jYXRjaCgoICkgPT4gJycpOwogICAgfQogICAgaWYgKCB0cnVzdGVkICkgewogICAgICAgIHJldHVybiBkaXJlY3RpdmU7CiAgICB9CiAgICByZXR1cm4gJyc7Cn0KZnVuY3Rpb24gY29sbGF0ZUZldGNoQXJndW1lbnRzRm4ocmVzb3VyY2UsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcHJvcHMgPSBbCiAgICAgICAgJ2JvZHknLCAnY2FjaGUnLCAnY3JlZGVudGlhbHMnLCAnZHVwbGV4JywgJ2hlYWRlcnMnLAogICAgICAgICdpbnRlZ3JpdHknLCAna2VlcGFsaXZlJywgJ21ldGhvZCcsICdtb2RlJywgJ3ByaW9yaXR5JywKICAgICAgICAncmVkaXJlY3QnLCAncmVmZXJyZXInLCAncmVmZXJyZXJQb2xpY3knLCAndXJsJwogICAgXTsKICAgIGNvbnN0IG91dCA9IHt9OwogICAgaWYgKCBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzID0gKHNyYywgb3V0KSA9PiB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IHByb3Agb2YgcHJvcHMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNyY1twcm9wXSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0W3Byb3BdID0gc3JjW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGlmICgKICAgICAgICB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnIHx8CiAgICAgICAgc2FmZS5PYmplY3RfdG9TdHJpbmcuY2FsbChyZXNvdXJjZSkgIT09ICdbb2JqZWN0IFJlcXVlc3RdJwogICAgKSB7CiAgICAgICAgb3V0LnVybCA9IGAke3Jlc291cmNlfWA7CiAgICB9IGVsc2UgewogICAgICAgIGxldCBjbG9uZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjbG9uZSA9IHNhZmUuUmVxdWVzdF9jbG9uZS5jYWxsKHJlc291cmNlKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMoY2xvbmUgfHwgcmVzb3VyY2UsIG91dCk7CiAgICB9CiAgICBpZiAoIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKG9wdGlvbnMsIG91dCk7CiAgICB9CiAgICByZXR1cm4gb3V0Owp9CmZ1bmN0aW9uIHByZXZlbnRGZXRjaEZuKAogICAgdHJ1c3RlZCA9IGZhbHNlLAogICAgcHJvcHNUb01hdGNoID0gJycsCiAgICByZXNwb25zZUJvZHkgPSAnJywKICAgIHJlc3BvbnNlVHlwZSA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBzZXRUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0OwogICAgY29uc3Qgc2NyaXB0bGV0TmFtZSA9IGAke3RydXN0ZWQgPyAndHJ1c3RlZC0nIDogJyd9cHJldmVudC1mZXRjaGA7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoCiAgICAgICAgc2NyaXB0bGV0TmFtZSwKICAgICAgICBwcm9wc1RvTWF0Y2gsCiAgICAgICAgcmVzcG9uc2VCb2R5LAogICAgICAgIHJlc3BvbnNlVHlwZQogICAgKTsKICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgNCk7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsICd1cmwnKTsKICAgIGNvbnN0IHZhbGlkUmVzcG9uc2VQcm9wcyA9IHsKICAgICAgICBvazogWyBmYWxzZSwgdHJ1ZSBdLAogICAgICAgIHN0YXR1c1RleHQ6IFsgJycsICdOb3QgRm91bmQnIF0sCiAgICAgICAgdHlwZTogWyAnYmFzaWMnLCAnY29ycycsICdkZWZhdWx0JywgJ2Vycm9yJywgJ29wYXF1ZScgXSwKICAgIH07CiAgICBjb25zdCByZXNwb25zZVByb3BzID0gewogICAgICAgIHN0YXR1c1RleHQ6IHsgdmFsdWU6ICdPSycgfSwKICAgIH07CiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSB7fTsKICAgIGlmICggL15cey4qXH0kLy50ZXN0KHJlc3BvbnNlVHlwZSkgKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoSlNPTi5wYXJzZShyZXNwb25zZVR5cGUpKS5mb3JFYWNoKChbIHAsIHYgXSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCBwID09PSAnaGVhZGVycycgJiYgdHJ1c3RlZCApIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlc3BvbnNlSGVhZGVycywgdik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCB2YWxpZFJlc3BvbnNlUHJvcHNbcF0gPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHZhbGlkUmVzcG9uc2VQcm9wc1twXS5pbmNsdWRlcyh2KSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9wc1twXSA9IHsgdmFsdWU6IHYgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsgfQogICAgfSBlbHNlIGlmICggcmVzcG9uc2VUeXBlICE9PSAnJyApIHsKICAgICAgICBpZiAoIHZhbGlkUmVzcG9uc2VQcm9wcy50eXBlLmluY2x1ZGVzKHJlc3BvbnNlVHlwZSkgKSB7CiAgICAgICAgICAgIHJlc3BvbnNlUHJvcHMudHlwZSA9IHsgdmFsdWU6IHJlc3BvbnNlVHlwZSB9OwogICAgICAgIH0KICAgIH0KICAgIHByb3h5QXBwbHlGbignZmV0Y2gnLCBmdW5jdGlvbiBmZXRjaChjb250ZXh0KSB7CiAgICAgICAgY29uc3QgeyBjYWxsQXJncyB9ID0gY29udGV4dDsKICAgICAgICBjb25zdCBkZXRhaWxzID0gY29sbGF0ZUZldGNoQXJndW1lbnRzRm4oLi4uY2FsbEFyZ3MpOwogICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgfHwgcHJvcHNUb01hdGNoID09PSAnJyAmJiByZXNwb25zZUJvZHkgPT09ICcnICkgewogICAgICAgICAgICBjb25zdCBvdXQgPSBBcnJheS5mcm9tKE9iamVjdC5lbnRyaWVzKGRldGFpbHMpKS5tYXAoYSA9PiBgJHthWzBdfToke2FbMV19YCk7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYENhbGxlZDogJHtvdXQuam9pbignXG4nKX1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKCBwcm9wc1RvTWF0Y2ggPT09ICcnICYmIHJlc3BvbnNlQm9keSA9PT0gJycgKSB7CiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCBkZXRhaWxzKTsKICAgICAgICBpZiAoIG1hdGNoZWQgPT09IHVuZGVmaW5lZCB8fCBtYXRjaGVkLmxlbmd0aCA9PT0gMCApIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGdlbmVyYXRlQ29udGVudEZuKHRydXN0ZWQsIHJlc3BvbnNlQm9keSkpLnRoZW4odGV4dCA9PiB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYFByZXZlbnRlZCB3aXRoIHJlc3BvbnNlICIke3RleHR9ImApOwogICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2VIZWFkZXJzKTsKICAgICAgICAgICAgaWYgKCBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID0gdGV4dC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UodGV4dCwgeyBoZWFkZXJzIH0pOwogICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oCiAgICAgICAgICAgICAgICB7IHVybDogeyB2YWx1ZTogZGV0YWlscy51cmwgfSB9LAogICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9wcwogICAgICAgICAgICApOwogICAgICAgICAgICBzYWZlLk9iamVjdF9kZWZpbmVQcm9wZXJ0aWVzKHJlc3BvbnNlLCBwcm9wcyk7CiAgICAgICAgICAgIGlmICggZXh0cmFBcmdzLnRocm90dGxlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCApID0+IHsgcmVzb2x2ZShyZXNwb25zZSk7IH0sIGV4dHJhQXJncy50aHJvdHRsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKICAoZnVuY3Rpb24gcHJldmVudEZldGNoKC4uLmFyZ3MpIHsKICAgIHByZXZlbnRGZXRjaEZuKGZhbHNlLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-prevent-fetch.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCBpbXBsaWNpdCA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG5lZWRsZXMgPSBuZXcgTWFwKCk7CiAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gdW5kZWZpbmVkIHx8IHByb3BzVG9NYXRjaCA9PT0gJycgKSB7IHJldHVybiBuZWVkbGVzOyB9CiAgICBjb25zdCBvcHRpb25zID0geyBjYW5OZWdhdGU6IHRydWUgfTsKICAgIGZvciAoIGNvbnN0IG5lZWRsZSBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHByb3BzVG9NYXRjaCwgL1xzKy8pICkgewogICAgICAgIGxldCBbIHByb3AsIHBhdHRlcm4gXSA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwobmVlZGxlLCAnOicpOwogICAgICAgIGlmICggcHJvcCA9PT0gJycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgJiYgL1teJFx3IC1dLy50ZXN0KHByb3ApICkgewogICAgICAgICAgICBwcm9wID0gYCR7cHJvcH06JHtwYXR0ZXJufWA7CiAgICAgICAgICAgIHBhdHRlcm4gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmICggcGF0dGVybiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBuZWVkbGVzLnNldChwcm9wLCBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgICB9IGVsc2UgaWYgKCBpbXBsaWNpdCAhPT0gJycgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KGltcGxpY2l0LCBzYWZlLmluaXRQYXR0ZXJuKHByb3AsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbmVlZGxlczsKfQpmdW5jdGlvbiBtYXRjaE9iamVjdFByb3BlcnRpZXNGbihwcm9wTmVlZGxlcywgLi4ub2JqcykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBtYXRjaGVkID0gW107CiAgICBmb3IgKCBjb25zdCBvYmogb2Ygb2JqcyApIHsKICAgICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgZm9yICggY29uc3QgWyBwcm9wLCBkZXRhaWxzIF0gb2YgcHJvcE5lZWRsZXMgKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9zdHJpbmdpZnkodmFsdWUpOyB9CiAgICAgICAgICAgICAgICBjYXRjaCB7IH0KICAgICAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgY29udGludWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4oZGV0YWlscywgdmFsdWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG1hdGNoZWQucHVzaChgJHtwcm9wfTogJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF0Y2hlZDsKfQpmdW5jdGlvbiBnZW5lcmF0ZUNvbnRlbnRGbih0cnVzdGVkLCBkaXJlY3RpdmUpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcmFuZG9taXplID0gbGVuID0+IHsKICAgICAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgICAgICBsZXQgdGV4dFNpemUgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgY29uc3QgcyA9IHNhZmUuTWF0aF9yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7CiAgICAgICAgICAgIGNodW5rcy5wdXNoKHMpOwogICAgICAgICAgICB0ZXh0U2l6ZSArPSBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCB0ZXh0U2l6ZSA8IGxlbiApOwogICAgICAgIHJldHVybiBjaHVua3Muam9pbignICcpLnNsaWNlKDAsIGxlbik7CiAgICB9OwogICAgaWYgKCBkaXJlY3RpdmUgPT09ICd0cnVlJyApIHsKICAgICAgICByZXR1cm4gcmFuZG9taXplKDEwKTsKICAgIH0KICAgIGlmICggZGlyZWN0aXZlID09PSAnZW1wdHlPYmonICkgewogICAgICAgIHJldHVybiAne30nOwogICAgfQogICAgaWYgKCBkaXJlY3RpdmUgPT09ICdlbXB0eUFycicgKSB7CiAgICAgICAgcmV0dXJuICdbXSc7CiAgICB9CiAgICBpZiAoIGRpcmVjdGl2ZSA9PT0gJ2VtcHR5U3RyJyApIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBpZiAoIGRpcmVjdGl2ZS5zdGFydHNXaXRoKCdsZW5ndGg6JykgKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSAvXmxlbmd0aDooXGQrKSg/Oi0oXGQrKSk/JC8uZXhlYyhkaXJlY3RpdmUpOwogICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IHJldHVybiAnJzsgfQogICAgICAgIGNvbnN0IG1pbiA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7CiAgICAgICAgY29uc3QgZXh0ZW50ID0gc2FmZS5NYXRoX21heChwYXJzZUludChtYXRjaFsyXSwgMTApIHx8IDAsIG1pbikgLSBtaW47CiAgICAgICAgY29uc3QgbGVuID0gc2FmZS5NYXRoX21pbihtaW4gKyBleHRlbnQgKiBzYWZlLk1hdGhfcmFuZG9tKCksIDUwMDAwMCk7CiAgICAgICAgcmV0dXJuIHJhbmRvbWl6ZShsZW4gfCAwKTsKICAgIH0KICAgIGlmICggZGlyZWN0aXZlLnN0YXJ0c1dpdGgoJ3dhcjonKSApIHsKICAgICAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMud2FyT3JpZ2luID09PSB1bmRlZmluZWQgKSB7IHJldHVybiAnJzsgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsKICAgICAgICAgICAgY29uc3Qgd2FyT3JpZ2luID0gc2NyaXB0bGV0R2xvYmFscy53YXJPcmlnaW47CiAgICAgICAgICAgIGNvbnN0IHdhck5hbWUgPSBkaXJlY3RpdmUuc2xpY2UoNCk7CiAgICAgICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gWyB3YXJPcmlnaW4sICcvJywgd2FyTmFtZSBdOwogICAgICAgICAgICBjb25zdCB3YXJTZWNyZXQgPSBzY3JpcHRsZXRHbG9iYWxzLndhclNlY3JldDsKICAgICAgICAgICAgaWYgKCB3YXJTZWNyZXQgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIGZ1bGxwYXRoLnB1c2goJz9zZWNyZXQ9Jywgd2FyU2VjcmV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB3YXJYSFIgPSBuZXcgc2FmZS5YTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICB3YXJYSFIucmVzcG9uc2VUeXBlID0gJ3RleHQnOwogICAgICAgICAgICB3YXJYSFIub25sb2FkZW5kID0gZXYgPT4gewogICAgICAgICAgICAgICAgcmVzb2x2ZShldi50YXJnZXQucmVzcG9uc2VUZXh0IHx8ICcnKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2FyWEhSLm9wZW4oJ0dFVCcsIGZ1bGxwYXRoLmpvaW4oJycpKTsKICAgICAgICAgICAgd2FyWEhSLnNlbmQoKTsKICAgICAgICB9KS5jYXRjaCgoICkgPT4gJycpOwogICAgfQogICAgaWYgKCB0cnVzdGVkICkgewogICAgICAgIHJldHVybiBkaXJlY3RpdmU7CiAgICB9CiAgICByZXR1cm4gJyc7Cn0KZnVuY3Rpb24gY29sbGF0ZUZldGNoQXJndW1lbnRzRm4ocmVzb3VyY2UsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcHJvcHMgPSBbCiAgICAgICAgJ2JvZHknLCAnY2FjaGUnLCAnY3JlZGVudGlhbHMnLCAnZHVwbGV4JywgJ2hlYWRlcnMnLAogICAgICAgICdpbnRlZ3JpdHknLCAna2VlcGFsaXZlJywgJ21ldGhvZCcsICdtb2RlJywgJ3ByaW9yaXR5JywKICAgICAgICAncmVkaXJlY3QnLCAncmVmZXJyZXInLCAncmVmZXJyZXJQb2xpY3knLCAndXJsJwogICAgXTsKICAgIGNvbnN0IG91dCA9IHt9OwogICAgaWYgKCBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzID0gKHNyYywgb3V0KSA9PiB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IHByb3Agb2YgcHJvcHMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNyY1twcm9wXSA9PT0gdW5kZWZpbmVkICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgb3V0W3Byb3BdID0gc3JjW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGlmICgKICAgICAgICB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnIHx8CiAgICAgICAgc2FmZS5PYmplY3RfdG9TdHJpbmcuY2FsbChyZXNvdXJjZSkgIT09ICdbb2JqZWN0IFJlcXVlc3RdJwogICAgKSB7CiAgICAgICAgb3V0LnVybCA9IGAke3Jlc291cmNlfWA7CiAgICB9IGVsc2UgewogICAgICAgIGxldCBjbG9uZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjbG9uZSA9IHNhZmUuUmVxdWVzdF9jbG9uZS5jYWxsKHJlc291cmNlKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMoY2xvbmUgfHwgcmVzb3VyY2UsIG91dCk7CiAgICB9CiAgICBpZiAoIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICkgewogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKG9wdGlvbnMsIG91dCk7CiAgICB9CiAgICByZXR1cm4gb3V0Owp9CmZ1bmN0aW9uIHByZXZlbnRGZXRjaEZuKAogICAgdHJ1c3RlZCA9IGZhbHNlLAogICAgcHJvcHNUb01hdGNoID0gJycsCiAgICByZXNwb25zZUJvZHkgPSAnJywKICAgIHJlc3BvbnNlVHlwZSA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBzZXRUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0OwogICAgY29uc3Qgc2NyaXB0bGV0TmFtZSA9IGAke3RydXN0ZWQgPyAndHJ1c3RlZC0nIDogJyd9cHJldmVudC1mZXRjaGA7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoCiAgICAgICAgc2NyaXB0bGV0TmFtZSwKICAgICAgICBwcm9wc1RvTWF0Y2gsCiAgICAgICAgcmVzcG9uc2VCb2R5LAogICAgICAgIHJlc3BvbnNlVHlwZQogICAgKTsKICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgNCk7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsICd1cmwnKTsKICAgIGNvbnN0IHZhbGlkUmVzcG9uc2VQcm9wcyA9IHsKICAgICAgICBvazogWyBmYWxzZSwgdHJ1ZSBdLAogICAgICAgIHN0YXR1c1RleHQ6IFsgJycsICdOb3QgRm91bmQnIF0sCiAgICAgICAgdHlwZTogWyAnYmFzaWMnLCAnY29ycycsICdkZWZhdWx0JywgJ2Vycm9yJywgJ29wYXF1ZScgXSwKICAgIH07CiAgICBjb25zdCByZXNwb25zZVByb3BzID0gewogICAgICAgIHN0YXR1c1RleHQ6IHsgdmFsdWU6ICdPSycgfSwKICAgIH07CiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSB7fTsKICAgIGlmICggL15cey4qXH0kLy50ZXN0KHJlc3BvbnNlVHlwZSkgKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoSlNPTi5wYXJzZShyZXNwb25zZVR5cGUpKS5mb3JFYWNoKChbIHAsIHYgXSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCBwID09PSAnaGVhZGVycycgJiYgdHJ1c3RlZCApIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlc3BvbnNlSGVhZGVycywgdik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCB2YWxpZFJlc3BvbnNlUHJvcHNbcF0gPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBpZiAoIHZhbGlkUmVzcG9uc2VQcm9wc1twXS5pbmNsdWRlcyh2KSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9wc1twXSA9IHsgdmFsdWU6IHYgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsgfQogICAgfSBlbHNlIGlmICggcmVzcG9uc2VUeXBlICE9PSAnJyApIHsKICAgICAgICBpZiAoIHZhbGlkUmVzcG9uc2VQcm9wcy50eXBlLmluY2x1ZGVzKHJlc3BvbnNlVHlwZSkgKSB7CiAgICAgICAgICAgIHJlc3BvbnNlUHJvcHMudHlwZSA9IHsgdmFsdWU6IHJlc3BvbnNlVHlwZSB9OwogICAgICAgIH0KICAgIH0KICAgIHByb3h5QXBwbHlGbignZmV0Y2gnLCBmdW5jdGlvbiBmZXRjaChjb250ZXh0KSB7CiAgICAgICAgY29uc3QgeyBjYWxsQXJncyB9ID0gY29udGV4dDsKICAgICAgICBjb25zdCBkZXRhaWxzID0gY29sbGF0ZUZldGNoQXJndW1lbnRzRm4oLi4uY2FsbEFyZ3MpOwogICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgfHwgcHJvcHNUb01hdGNoID09PSAnJyAmJiByZXNwb25zZUJvZHkgPT09ICcnICkgewogICAgICAgICAgICBjb25zdCBvdXQgPSBBcnJheS5mcm9tKE9iamVjdC5lbnRyaWVzKGRldGFpbHMpKS5tYXAoYSA9PiBgJHthWzBdfToke2FbMV19YCk7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYENhbGxlZDogJHtvdXQuam9pbignXG4nKX1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKCBwcm9wc1RvTWF0Y2ggPT09ICcnICYmIHJlc3BvbnNlQm9keSA9PT0gJycgKSB7CiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCBkZXRhaWxzKTsKICAgICAgICBpZiAoIG1hdGNoZWQgPT09IHVuZGVmaW5lZCB8fCBtYXRjaGVkLmxlbmd0aCA9PT0gMCApIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGdlbmVyYXRlQ29udGVudEZuKHRydXN0ZWQsIHJlc3BvbnNlQm9keSkpLnRoZW4odGV4dCA9PiB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYFByZXZlbnRlZCB3aXRoIHJlc3BvbnNlICIke3RleHR9ImApOwogICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2VIZWFkZXJzKTsKICAgICAgICAgICAgaWYgKCBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID0gdGV4dC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UodGV4dCwgeyBoZWFkZXJzIH0pOwogICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oCiAgICAgICAgICAgICAgICB7IHVybDogeyB2YWx1ZTogZGV0YWlscy51cmwgfSB9LAogICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9wcwogICAgICAgICAgICApOwogICAgICAgICAgICBzYWZlLk9iamVjdF9kZWZpbmVQcm9wZXJ0aWVzKHJlc3BvbnNlLCBwcm9wcyk7CiAgICAgICAgICAgIGlmICggZXh0cmFBcmdzLnRocm90dGxlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCApID0+IHsgcmVzb2x2ZShyZXNwb25zZSk7IH0sIGV4dHJhQXJncy50aHJvdHRsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgICAgfSk7CiAgICB9KTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZFByZXZlbnRGZXRjaCguLi5hcmdzKSB7CiAgICBwcmV2ZW50RmV0Y2hGbih0cnVlLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"prevent-innerHTML.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBwcmV2ZW50SW5uZXJIVE1MKAogICAgc2VsZWN0b3IgPSAnJywKICAgIHBhdHRlcm4gPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdwcmV2ZW50LWlubmVySFRNTCcsIHNlbGVjdG9yLCBwYXR0ZXJuKTsKICAgIGNvbnN0IG1hdGNoZXIgPSBzYWZlLmluaXRQYXR0ZXJuKHBhdHRlcm4sIHsgY2FuTmVnYXRlOiB0cnVlIH0pOwogICAgY29uc3QgY3VycmVudCA9IHNhZmUuT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgJ2lubmVySFRNTCcpOwogICAgaWYgKCBjdXJyZW50ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2hvdWxkUHJldmVudFNldCA9IChlbGVtLCBhKSA9PiB7CiAgICAgICAgaWYgKCBzZWxlY3RvciAhPT0gJycgKSB7CiAgICAgICAgICAgIGlmICggdHlwZW9mIGVsZW0ubWF0Y2hlcyAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgICAgIGlmICggZWxlbS5tYXRjaGVzKHNlbGVjdG9yKSA9PT0gZmFsc2UgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc2FmZS50ZXN0UGF0dGVybihtYXRjaGVyLCBgJHthfWApOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgJ2lubmVySFRNTCcsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gY3VycmVudC5nZXQKICAgICAgICAgICAgICAgID8gY3VycmVudC5nZXQuY2FsbCh0aGlzKQogICAgICAgICAgICAgICAgOiBjdXJyZW50LnZhbHVlOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgIGlmICggc2hvdWxkUHJldmVudFNldCh0aGlzLCBhKSApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1ByZXZlbnRlZCcpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBjdXJyZW50LnNldCApIHsKICAgICAgICAgICAgICAgIGN1cnJlbnQuc2V0LmNhbGwodGhpcywgYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYEFzc2lnbmVkOlxuJHthfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQudmFsdWUgPSBhOwogICAgICAgIH0sCiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"prevent-setTimeout.js","aliases":["no-setTimeout-if.js","nostif.js","setTimeout-defuser.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmNsYXNzIFJhbmdlUGFyc2VyIHsKICAgIGNvbnN0cnVjdG9yKHMpIHsKICAgICAgICB0aGlzLm5vdCA9IHMuY2hhckF0KDApID09PSAnISc7CiAgICAgICAgaWYgKCB0aGlzLm5vdCApIHsgcyA9IHMuc2xpY2UoMSk7IH0KICAgICAgICBpZiAoIHMgPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBwb3MgPSBzLmluZGV4T2YoJy0nKTsKICAgICAgICBpZiAoIHBvcyAhPT0gMCApIHsKICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLm1heCA9IHBhcnNlSW50KHMsIDEwKSB8fCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIHBvcyAhPT0gLTEgKSB7CiAgICAgICAgICAgIHRoaXMubWF4ID0gcGFyc2VJbnQocy5zbGljZShwb3MgKyAxKSwgMTApIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSOwogICAgICAgIH0KICAgIH0KICAgIHVuYm91bmQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluID09PSB1bmRlZmluZWQgJiYgdGhpcy5tYXggPT09IHVuZGVmaW5lZDsKICAgIH0KICAgIHRlc3QodikgewogICAgICAgIGNvbnN0IG4gPSBNYXRoLm1pbihNYXRoLm1heChOdW1iZXIodikgfHwgMCwgMCksIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTsKICAgICAgICBpZiAoIHRoaXMubWluID09PSB0aGlzLm1heCApIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLm1pbiA9PT0gdW5kZWZpbmVkIHx8IG4gPT09IHRoaXMubWluKSAhPT0gdGhpcy5ub3Q7CiAgICAgICAgfQogICAgICAgIGlmICggdGhpcy5taW4gPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgcmV0dXJuIChuIDw9IHRoaXMubWF4KSAhPT0gdGhpcy5ub3Q7CiAgICAgICAgfQogICAgICAgIGlmICggdGhpcy5tYXggPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgcmV0dXJuIChuID49IHRoaXMubWluKSAhPT0gdGhpcy5ub3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiAobiA+PSB0aGlzLm1pbiAmJiBuIDw9IHRoaXMubWF4KSAhPT0gdGhpcy5ub3Q7CiAgICB9Cn0KZnVuY3Rpb24gcHJveHlBcHBseUZuKAogICAgdGFyZ2V0ID0gJycsCiAgICBoYW5kbGVyID0gJycKKSB7CiAgICBsZXQgY29udGV4dCA9IGdsb2JhbFRoaXM7CiAgICBsZXQgcHJvcCA9IHRhcmdldDsKICAgIGZvciAoOzspIHsKICAgICAgICBjb25zdCBwb3MgPSBwcm9wLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IGJyZWFrOyB9CiAgICAgICAgY29udGV4dCA9IGNvbnRleHRbcHJvcC5zbGljZSgwLCBwb3MpXTsKICAgICAgICBpZiAoIGNvbnRleHQgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBwcm9wID0gcHJvcC5zbGljZShwb3MrMSk7CiAgICB9CiAgICBjb25zdCBmbiA9IGNvbnRleHRbcHJvcF07CiAgICBpZiAoIHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuOyB9CiAgICBpZiAoIHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMgPSBbXTsKICAgICAgICBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPSBjbGFzcyB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5pdCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0KGNhbGxGbiwgY2FsbEFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEZuID0gY2FsbEZuOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmNvbnN0cnVjdCh0aGlzLmNhbGxGbiwgdGhpcy5jYWxsQXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IHRoaXMuY2FsbEFyZ3MgPSB0aGlzLnByaXZhdGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0aWMgZmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMucG9wKCkuaW5pdCguLi5hcmdzKQogICAgICAgICAgICAgICAgICAgIDogbmV3IHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMgPSBbXTsKICAgICAgICBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIHRoaXNBcmcsIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxBcmdzID0gY2FsbEFyZ3M7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWZsZWN0KCkgewogICAgICAgICAgICAgICAgY29uc3QgciA9IFJlZmxlY3QuYXBwbHkodGhpcy5jYWxsRm4sIHRoaXMudGhpc0FyZywgdGhpcy5jYWxsQXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IHRoaXMudGhpc0FyZyA9IHRoaXMuY2FsbEFyZ3MgPSB0aGlzLnByaXZhdGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLmxlbmd0aCAhPT0gMAogICAgICAgICAgICAgICAgICAgID8gcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucG9wKCkuaW5pdCguLi5hcmdzKQogICAgICAgICAgICAgICAgICAgIDogbmV3IHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5pc0N0b3IgPSBuZXcgTWFwKCk7CiAgICB9CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuaGFzKHRhcmdldCkgPT09IGZhbHNlICkgewogICAgICAgIHByb3h5QXBwbHlGbi5pc0N0b3Iuc2V0KHRhcmdldCwgZm4ucHJvdG90eXBlPy5jb25zdHJ1Y3RvciA9PT0gZm4pOwogICAgfQogICAgY29uc3QgZm5TdHIgPSBmbi50b1N0cmluZygpOwogICAgY29uc3QgdG9TdHJpbmcgPSAoZnVuY3Rpb24gdG9TdHJpbmcoKSB7IHJldHVybiBmblN0cjsgfSkuYmluZChudWxsKTsKICAgIGNvbnN0IHByb3h5RGV0YWlscyA9IHsKICAgICAgICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIocHJveHlBcHBseUZuLkFwcGx5Q29udGV4dC5mYWN0b3J5KHRhcmdldCwgdGhpc0FyZywgYXJncykpOwogICAgICAgIH0sCiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICBpZiAoIHByb3AgPT09ICd0b1N0cmluZycgKSB7IHJldHVybiB0b1N0cmluZzsgfQogICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTsKICAgICAgICB9LAogICAgfTsKICAgIGlmICggcHJveHlBcHBseUZuLmlzQ3Rvci5nZXQodGFyZ2V0KSApIHsKICAgICAgICBwcm94eURldGFpbHMuY29uc3RydWN0ID0gZnVuY3Rpb24odGFyZ2V0LCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dC5mYWN0b3J5KHRhcmdldCwgYXJncykpOwogICAgICAgIH07CiAgICB9CiAgICBjb250ZXh0W3Byb3BdID0gbmV3IFByb3h5KGZuLCBwcm94eURldGFpbHMpOwp9CgogIChmdW5jdGlvbiBwcmV2ZW50U2V0VGltZW91dCgKICAgIG5lZWRsZVJhdyA9ICcnLAogICAgZGVsYXlSYXcgPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdwcmV2ZW50LXNldFRpbWVvdXQnLCBuZWVkbGVSYXcsIGRlbGF5UmF3KTsKICAgIGNvbnN0IG5lZWRsZU5vdCA9IG5lZWRsZVJhdy5jaGFyQXQoMCkgPT09ICchJzsKICAgIGNvbnN0IHJlTmVlZGxlID0gc2FmZS5wYXR0ZXJuVG9SZWdleChuZWVkbGVOb3QgPyBuZWVkbGVSYXcuc2xpY2UoMSkgOiBuZWVkbGVSYXcpOwogICAgY29uc3QgcmFuZ2UgPSBuZXcgUmFuZ2VQYXJzZXIoZGVsYXlSYXcpOwogICAgcHJveHlBcHBseUZuKCdzZXRUaW1lb3V0JywgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IHsgY2FsbEFyZ3MgfSA9IGNvbnRleHQ7CiAgICAgICAgY29uc3QgYSA9IGNhbGxBcmdzWzBdIGluc3RhbmNlb2YgRnVuY3Rpb24KICAgICAgICAgICAgPyBzYWZlLlN0cmluZyhzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nKGNhbGxBcmdzWzBdKSkKICAgICAgICAgICAgOiBzYWZlLlN0cmluZyhjYWxsQXJnc1swXSk7CiAgICAgICAgY29uc3QgYiA9IGNhbGxBcmdzWzFdOwogICAgICAgIGlmICggbmVlZGxlUmF3ID09PSAnJyAmJiByYW5nZS51bmJvdW5kKCkgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYENhbGxlZDpcbiR7YX1cbiR7Yn1gKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIH0KICAgICAgICBpZiAoIHJlTmVlZGxlLnRlc3QoYSkgIT09IG5lZWRsZU5vdCAmJiByYW5nZS50ZXN0KGIpICkgewogICAgICAgICAgICBjYWxsQXJnc1swXSA9IGZ1bmN0aW9uKCl7fTsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgUHJldmVudGVkOlxuJHthfVxuJHtifWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"prevent-setInterval.js","aliases":["no-setInterval-if.js","nosiif.js","setInterval-defuser.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmNsYXNzIFJhbmdlUGFyc2VyIHsKICAgIGNvbnN0cnVjdG9yKHMpIHsKICAgICAgICB0aGlzLm5vdCA9IHMuY2hhckF0KDApID09PSAnISc7CiAgICAgICAgaWYgKCB0aGlzLm5vdCApIHsgcyA9IHMuc2xpY2UoMSk7IH0KICAgICAgICBpZiAoIHMgPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBwb3MgPSBzLmluZGV4T2YoJy0nKTsKICAgICAgICBpZiAoIHBvcyAhPT0gMCApIHsKICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLm1heCA9IHBhcnNlSW50KHMsIDEwKSB8fCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIHBvcyAhPT0gLTEgKSB7CiAgICAgICAgICAgIHRoaXMubWF4ID0gcGFyc2VJbnQocy5zbGljZShwb3MgKyAxKSwgMTApIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSOwogICAgICAgIH0KICAgIH0KICAgIHVuYm91bmQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWluID09PSB1bmRlZmluZWQgJiYgdGhpcy5tYXggPT09IHVuZGVmaW5lZDsKICAgIH0KICAgIHRlc3QodikgewogICAgICAgIGNvbnN0IG4gPSBNYXRoLm1pbihNYXRoLm1heChOdW1iZXIodikgfHwgMCwgMCksIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTsKICAgICAgICBpZiAoIHRoaXMubWluID09PSB0aGlzLm1heCApIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLm1pbiA9PT0gdW5kZWZpbmVkIHx8IG4gPT09IHRoaXMubWluKSAhPT0gdGhpcy5ub3Q7CiAgICAgICAgfQogICAgICAgIGlmICggdGhpcy5taW4gPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgcmV0dXJuIChuIDw9IHRoaXMubWF4KSAhPT0gdGhpcy5ub3Q7CiAgICAgICAgfQogICAgICAgIGlmICggdGhpcy5tYXggPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgcmV0dXJuIChuID49IHRoaXMubWluKSAhPT0gdGhpcy5ub3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiAobiA+PSB0aGlzLm1pbiAmJiBuIDw9IHRoaXMubWF4KSAhPT0gdGhpcy5ub3Q7CiAgICB9Cn0KZnVuY3Rpb24gcHJveHlBcHBseUZuKAogICAgdGFyZ2V0ID0gJycsCiAgICBoYW5kbGVyID0gJycKKSB7CiAgICBsZXQgY29udGV4dCA9IGdsb2JhbFRoaXM7CiAgICBsZXQgcHJvcCA9IHRhcmdldDsKICAgIGZvciAoOzspIHsKICAgICAgICBjb25zdCBwb3MgPSBwcm9wLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IGJyZWFrOyB9CiAgICAgICAgY29udGV4dCA9IGNvbnRleHRbcHJvcC5zbGljZSgwLCBwb3MpXTsKICAgICAgICBpZiAoIGNvbnRleHQgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBwcm9wID0gcHJvcC5zbGljZShwb3MrMSk7CiAgICB9CiAgICBjb25zdCBmbiA9IGNvbnRleHRbcHJvcF07CiAgICBpZiAoIHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuOyB9CiAgICBpZiAoIHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMgPSBbXTsKICAgICAgICBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPSBjbGFzcyB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5pdCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0KGNhbGxGbiwgY2FsbEFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEZuID0gY2FsbEZuOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmNvbnN0cnVjdCh0aGlzLmNhbGxGbiwgdGhpcy5jYWxsQXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IHRoaXMuY2FsbEFyZ3MgPSB0aGlzLnByaXZhdGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0aWMgZmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMucG9wKCkuaW5pdCguLi5hcmdzKQogICAgICAgICAgICAgICAgICAgIDogbmV3IHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMgPSBbXTsKICAgICAgICBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIHRoaXNBcmcsIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxBcmdzID0gY2FsbEFyZ3M7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWZsZWN0KCkgewogICAgICAgICAgICAgICAgY29uc3QgciA9IFJlZmxlY3QuYXBwbHkodGhpcy5jYWxsRm4sIHRoaXMudGhpc0FyZywgdGhpcy5jYWxsQXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IHRoaXMudGhpc0FyZyA9IHRoaXMuY2FsbEFyZ3MgPSB0aGlzLnByaXZhdGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLmxlbmd0aCAhPT0gMAogICAgICAgICAgICAgICAgICAgID8gcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucG9wKCkuaW5pdCguLi5hcmdzKQogICAgICAgICAgICAgICAgICAgIDogbmV3IHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5pc0N0b3IgPSBuZXcgTWFwKCk7CiAgICB9CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuaGFzKHRhcmdldCkgPT09IGZhbHNlICkgewogICAgICAgIHByb3h5QXBwbHlGbi5pc0N0b3Iuc2V0KHRhcmdldCwgZm4ucHJvdG90eXBlPy5jb25zdHJ1Y3RvciA9PT0gZm4pOwogICAgfQogICAgY29uc3QgZm5TdHIgPSBmbi50b1N0cmluZygpOwogICAgY29uc3QgdG9TdHJpbmcgPSAoZnVuY3Rpb24gdG9TdHJpbmcoKSB7IHJldHVybiBmblN0cjsgfSkuYmluZChudWxsKTsKICAgIGNvbnN0IHByb3h5RGV0YWlscyA9IHsKICAgICAgICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIocHJveHlBcHBseUZuLkFwcGx5Q29udGV4dC5mYWN0b3J5KHRhcmdldCwgdGhpc0FyZywgYXJncykpOwogICAgICAgIH0sCiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICBpZiAoIHByb3AgPT09ICd0b1N0cmluZycgKSB7IHJldHVybiB0b1N0cmluZzsgfQogICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTsKICAgICAgICB9LAogICAgfTsKICAgIGlmICggcHJveHlBcHBseUZuLmlzQ3Rvci5nZXQodGFyZ2V0KSApIHsKICAgICAgICBwcm94eURldGFpbHMuY29uc3RydWN0ID0gZnVuY3Rpb24odGFyZ2V0LCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dC5mYWN0b3J5KHRhcmdldCwgYXJncykpOwogICAgICAgIH07CiAgICB9CiAgICBjb250ZXh0W3Byb3BdID0gbmV3IFByb3h5KGZuLCBwcm94eURldGFpbHMpOwp9CgogIChmdW5jdGlvbiBwcmV2ZW50U2V0SW50ZXJ2YWwoCiAgICBuZWVkbGVSYXcgPSAnJywKICAgIGRlbGF5UmF3ID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgncHJldmVudC1zZXRJbnRlcnZhbCcsIG5lZWRsZVJhdywgZGVsYXlSYXcpOwogICAgY29uc3QgbmVlZGxlTm90ID0gbmVlZGxlUmF3LmNoYXJBdCgwKSA9PT0gJyEnOwogICAgY29uc3QgcmVOZWVkbGUgPSBzYWZlLnBhdHRlcm5Ub1JlZ2V4KG5lZWRsZU5vdCA/IG5lZWRsZVJhdy5zbGljZSgxKSA6IG5lZWRsZVJhdyk7CiAgICBjb25zdCByYW5nZSA9IG5ldyBSYW5nZVBhcnNlcihkZWxheVJhdyk7CiAgICBwcm94eUFwcGx5Rm4oJ3NldEludGVydmFsJywgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGNvbnN0IHsgY2FsbEFyZ3MgfSA9IGNvbnRleHQ7CiAgICAgICAgY29uc3QgYSA9IGNhbGxBcmdzWzBdIGluc3RhbmNlb2YgRnVuY3Rpb24KICAgICAgICAgICAgPyBzYWZlLlN0cmluZyhzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nKGNhbGxBcmdzWzBdKSkKICAgICAgICAgICAgOiBzYWZlLlN0cmluZyhjYWxsQXJnc1swXSk7CiAgICAgICAgY29uc3QgYiA9IGNhbGxBcmdzWzFdOwogICAgICAgIGlmICggbmVlZGxlUmF3ID09PSAnJyAmJiByYW5nZS51bmJvdW5kKCkgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYENhbGxlZDpcbiR7YX1cbiR7Yn1gKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIH0KICAgICAgICBpZiAoIHJlTmVlZGxlLnRlc3QoYSkgIT09IG5lZWRsZU5vdCAmJiByYW5nZS50ZXN0KGIpICkgewogICAgICAgICAgICBjYWxsQXJnc1swXSA9IGZ1bmN0aW9uKCl7fTsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgUHJldmVudGVkOlxuJHthfVxuJHtifWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"prevent-requestAnimationFrame.js","aliases":["no-requestAnimationFrame-if.js","norafif.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQoKICAoZnVuY3Rpb24gcHJldmVudFJlcXVlc3RBbmltYXRpb25GcmFtZSgKICAgIG5lZWRsZVJhdyA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ3ByZXZlbnQtcmVxdWVzdEFuaW1hdGlvbkZyYW1lJywgbmVlZGxlUmF3KTsKICAgIGNvbnN0IG5lZWRsZU5vdCA9IG5lZWRsZVJhdy5jaGFyQXQoMCkgPT09ICchJzsKICAgIGNvbnN0IHJlTmVlZGxlID0gc2FmZS5wYXR0ZXJuVG9SZWdleChuZWVkbGVOb3QgPyBuZWVkbGVSYXcuc2xpY2UoMSkgOiBuZWVkbGVSYXcpOwogICAgcHJveHlBcHBseUZuKCdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgY29uc3QgeyBjYWxsQXJncyB9ID0gY29udGV4dDsKICAgICAgICBjb25zdCBhID0gY2FsbEFyZ3NbMF0gaW5zdGFuY2VvZiBGdW5jdGlvbgogICAgICAgICAgICA/IHNhZmUuU3RyaW5nKHNhZmUuRnVuY3Rpb25fdG9TdHJpbmcoY2FsbEFyZ3NbMF0pKQogICAgICAgICAgICA6IHNhZmUuU3RyaW5nKGNhbGxBcmdzWzBdKTsKICAgICAgICBpZiAoIG5lZWRsZVJhdyA9PT0gJycgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYENhbGxlZDpcbiR7YX1gKTsKICAgICAgICB9IGVsc2UgaWYgKCByZU5lZWRsZS50ZXN0KGEpICE9PSBuZWVkbGVOb3QgKSB7CiAgICAgICAgICAgIGNhbGxBcmdzWzBdID0gZnVuY3Rpb24oKXt9OwogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBQcmV2ZW50ZWQ6XG4ke2F9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"set-constant.js","aliases":["set.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gdmFsaWRhdGVDb25zdGFudEZuKHRydXN0ZWQsIHJhdywgZXh0cmFBcmdzID0ge30pIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgbGV0IHZhbHVlOwogICAgaWYgKCByYXcgPT09ICd1bmRlZmluZWQnICkgewogICAgICAgIHZhbHVlID0gdW5kZWZpbmVkOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnZmFsc2UnICkgewogICAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICd0cnVlJyApIHsKICAgICAgICB2YWx1ZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICdudWxsJyApIHsKICAgICAgICB2YWx1ZSA9IG51bGw7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICInJyIgfHwgcmF3ID09PSAnJyApIHsKICAgICAgICB2YWx1ZSA9ICcnOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnW10nIHx8IHJhdyA9PT0gJ2VtcHR5QXJyJyApIHsKICAgICAgICB2YWx1ZSA9IFtdOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAne30nIHx8IHJhdyA9PT0gJ2VtcHR5T2JqJyApIHsKICAgICAgICB2YWx1ZSA9IHt9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnbm9vcEZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXt9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAndHJ1ZUZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRydWU7IH07CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICdmYWxzZUZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXsgcmV0dXJuIGZhbHNlOyB9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAndGhyb3dGdW5jJyApIHsKICAgICAgICB2YWx1ZSA9IGZ1bmN0aW9uKCl7IHRocm93ICcnOyB9OwogICAgfSBlbHNlIGlmICggL14tP1xkKyQvLnRlc3QocmF3KSApIHsKICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHJhdyk7CiAgICAgICAgaWYgKCBpc05hTihyYXcpICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIE1hdGguYWJzKHJhdykgPiAweDdGRkYgKSB7IHJldHVybjsgfQogICAgfSBlbHNlIGlmICggdHJ1c3RlZCApIHsKICAgICAgICBpZiAoIHJhdy5zdGFydHNXaXRoKCdqc29uOicpICkgewogICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9wYXJzZShyYXcuc2xpY2UoNSkpOyB9IGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfSBlbHNlIGlmICggcmF3LnN0YXJ0c1dpdGgoJ3snKSAmJiByYXcuZW5kc1dpdGgoJ30nKSApIHsKICAgICAgICAgICAgdHJ5IHsgdmFsdWUgPSBzYWZlLkpTT05fcGFyc2UocmF3KS52YWx1ZTsgfSBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCBleHRyYUFyZ3MuYXMgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICBpZiAoIGV4dHJhQXJncy5hcyA9PT0gJ2Z1bmN0aW9uJyApIHsKICAgICAgICAgICAgcmV0dXJuICggKSA9PiB2YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKCBleHRyYUFyZ3MuYXMgPT09ICdjYWxsYmFjaycgKSB7CiAgICAgICAgICAgIHJldHVybiAoICkgPT4gKCggKSA9PiB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmICggZXh0cmFBcmdzLmFzID09PSAncmVzb2x2ZWQnICkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKCBleHRyYUFyZ3MuYXMgPT09ICdyZWplY3RlZCcgKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIHNhZmVTZWxmKCkgewogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmICkgewogICAgICAgIHJldHVybiBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmOwogICAgfQogICAgY29uc3Qgc2VsZiA9IGdsb2JhbFRoaXM7CiAgICBjb25zdCBzYWZlID0gewogICAgICAgICdBcnJheV9mcm9tJzogQXJyYXkuZnJvbSwKICAgICAgICAnRXJyb3InOiBzZWxmLkVycm9yLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZ0ZuJzogc2VsZi5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nJzogdGhpc0FyZyA9PiBzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nRm4uY2FsbCh0aGlzQXJnKSwKICAgICAgICAnTWF0aF9mbG9vcic6IE1hdGguZmxvb3IsCiAgICAgICAgJ01hdGhfbWF4JzogTWF0aC5tYXgsCiAgICAgICAgJ01hdGhfbWluJzogTWF0aC5taW4sCiAgICAgICAgJ01hdGhfcmFuZG9tJzogTWF0aC5yYW5kb20sCiAgICAgICAgJ09iamVjdCc6IE9iamVjdCwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnR5JzogT2JqZWN0LmRlZmluZVByb3BlcnR5LmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnRpZXMnOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9mcm9tRW50cmllcyc6IE9iamVjdC5mcm9tRW50cmllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2hhc093bic6IE9iamVjdC5oYXNPd24uYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfdG9TdHJpbmcnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdSZWdFeHAnOiBzZWxmLlJlZ0V4cCwKICAgICAgICAnUmVnRXhwX3Rlc3QnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUudGVzdCwKICAgICAgICAnUmVnRXhwX2V4ZWMnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUuZXhlYywKICAgICAgICAnUmVxdWVzdF9jbG9uZSc6IHNlbGYuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUsCiAgICAgICAgJ1N0cmluZyc6IHNlbGYuU3RyaW5nLAogICAgICAgICdTdHJpbmdfZnJvbUNoYXJDb2RlJzogU3RyaW5nLmZyb21DaGFyQ29kZSwKICAgICAgICAnU3RyaW5nX3NwbGl0JzogU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwKICAgICAgICAnWE1MSHR0cFJlcXVlc3QnOiBzZWxmLlhNTEh0dHBSZXF1ZXN0LAogICAgICAgICdhZGRFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciwKICAgICAgICAncmVtb3ZlRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ2ZldGNoJzogc2VsZi5mZXRjaCwKICAgICAgICAnSlNPTic6IHNlbGYuSlNPTiwKICAgICAgICAnSlNPTl9wYXJzZUZuJzogc2VsZi5KU09OLnBhcnNlLAogICAgICAgICdKU09OX3N0cmluZ2lmeUZuJzogc2VsZi5KU09OLnN0cmluZ2lmeSwKICAgICAgICAnSlNPTl9wYXJzZSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fcGFyc2VGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5JzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9zdHJpbmdpZnlGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ2xvZyc6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksCiAgICAgICAgLy8gUHJvcGVydGllcwogICAgICAgIGxvZ0xldmVsOiAwLAogICAgICAgIC8vIE1ldGhvZHMKICAgICAgICBtYWtlTG9nUHJlZml4KC4uLmFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyICYmIGBbJHthcmdzLmpvaW4oJyBcdTIwNUQgJyl9XWAgfHwgJyc7CiAgICAgICAgfSwKICAgICAgICB1Ym9Mb2coLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignaW5mbycsIC4uLmFyZ3MpOwogICAgICAgICAgICAKICAgICAgICB9LAogICAgICAgIHVib0VyciguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdlcnJvcicsIC4uLmFyZ3MpOwogICAgICAgIH0sCiAgICAgICAgZXNjYXBlUmVnZXhDaGFycyhzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpOwogICAgICAgIH0sCiAgICAgICAgaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXRjaEFsbDogdHJ1ZSwgZXhwZWN0OiB0cnVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZXhwZWN0ID0gKG9wdGlvbnMuY2FuTmVnYXRlICE9PSB0cnVlIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID09PSBmYWxzZSk7CiAgICAgICAgICAgIGlmICggZXhwZWN0ID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gfHwgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG9wdGlvbnMuZmxhZ3MgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsgcGF0dGVybiwgZXhwZWN0IH07CiAgICAgICAgfSwKICAgICAgICB0ZXN0UGF0dGVybihkZXRhaWxzLCBoYXlzdGFjaykgewogICAgICAgICAgICBpZiAoIGRldGFpbHMubWF0Y2hBbGwgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIGlmICggZGV0YWlscy5yZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJlZ0V4cF90ZXN0LmNhbGwoZGV0YWlscy5yZSwgaGF5c3RhY2spID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMoZGV0YWlscy5wYXR0ZXJuKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgfSwKICAgICAgICBwYXR0ZXJuVG9SZWdleChwYXR0ZXJuLCBmbGFncyA9IHVuZGVmaW5lZCwgdmVyYmF0aW0gPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgeyByZXR1cm4gL14vOyB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgewogICAgICAgICAgICAgICAgY29uc3QgcmVTdHIgPSB0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybik7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh2ZXJiYXRpbSA/IGBeJHtyZVN0cn0kYCA6IHJlU3RyLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gL14vOwogICAgICAgIH0sCiAgICAgICAgZ2V0RXh0cmFBcmdzKGFyZ3MsIG9mZnNldCA9IDApIHsKICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGFyZ3Muc2xpY2Uob2Zmc2V0KS5yZWR1Y2UoKG91dCwgdiwgaSwgYSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCAoaSAmIDEpID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gYVtpKzFdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gL15cZCskLy50ZXN0KHJhd1ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHJhd1ZhbHVlLCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgOiByYXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChbIGFbaV0sIHZhbHVlIF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5PYmplY3RfZnJvbUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUoZm4sIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICAgIH0sCiAgICAgICAgb2ZmSWRsZShpZCkgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbElkbGVDYWxsYmFjayhpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgIH0KICAgIH07CiAgICBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmID0gc2FmZTsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gc2FmZTsgfQogICAgLy8gVGhpcyBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGxvZ2dlciBpcyBvcGVuZWQKICAgIHNhZmUubG9nTGV2ZWwgPSBzY3JpcHRsZXRHbG9iYWxzLmxvZ0xldmVsIHx8IDE7CiAgICBsZXQgbGFzdExvZ1R5cGUgPSAnJzsKICAgIGxldCBsYXN0TG9nVGV4dCA9ICcnOwogICAgbGV0IGxhc3RMb2dUaW1lID0gMDsKICAgIHNhZmUudG9Mb2dUZXh0ID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0ZXh0ID0gYFske2RvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lIHx8IGRvY3VtZW50LmxvY2F0aW9uLmhyZWZ9XSR7YXJncy5qb2luKCcgJyl9YDsKICAgICAgICBpZiAoIHRleHQgPT09IGxhc3RMb2dUZXh0ICYmIHR5cGUgPT09IGxhc3RMb2dUeXBlICkgewogICAgICAgICAgICBpZiAoIChEYXRlLm5vdygpIC0gbGFzdExvZ1RpbWUpIDwgNTAwMCApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGxhc3RMb2dUeXBlID0gdHlwZTsKICAgICAgICBsYXN0TG9nVGV4dCA9IHRleHQ7CiAgICAgICAgbGFzdExvZ1RpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgYmMgPSBuZXcgc2VsZi5Ccm9hZGNhc3RDaGFubmVsKHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQpOwogICAgICAgIGxldCBiY0J1ZmZlciA9IFtdOwogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJjQnVmZmVyLnB1c2goeyB0eXBlLCB0ZXh0IH0pOwogICAgICAgIH07CiAgICAgICAgYmMub25tZXNzYWdlID0gZXYgPT4gewogICAgICAgICAgICBjb25zdCBtc2cgPSBldi5kYXRhOwogICAgICAgICAgICBzd2l0Y2ggKCBtc2cgKSB7CiAgICAgICAgICAgIGNhc2UgJ2lhbXJlYWR5ISc6CiAgICAgICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBiY0J1ZmZlci5mb3JFYWNoKCh7IHR5cGUsIHRleHQgfSkgPT4KICAgICAgICAgICAgICAgICAgICBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYmNCdWZmZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb09uZSc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvVHdvJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGJjLnBvc3RNZXNzYWdlKCdhcmV5b3VyZWFkeT8nKTsKICAgIH0gY2F0Y2ggewogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHNhZmUubG9nKGB1Qk8gJHt0ZXh0fWApOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gc2FmZTsKfQpmdW5jdGlvbiBydW5BdChmbiwgd2hlbikgewogICAgY29uc3QgaW50RnJvbVJlYWR5U3RhdGUgPSBzdGF0ZSA9PiB7CiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IHsKICAgICAgICAgICAgJ2xvYWRpbmcnOiAxLCAnYXNhcCc6IDEsCiAgICAgICAgICAgICdpbnRlcmFjdGl2ZSc6IDIsICdlbmQnOiAyLCAnMic6IDIsCiAgICAgICAgICAgICdjb21wbGV0ZSc6IDMsICdpZGxlJzogMywgJzMnOiAzLAogICAgICAgIH07CiAgICAgICAgY29uc3QgdG9rZW5zID0gQXJyYXkuaXNBcnJheShzdGF0ZSkgPyBzdGF0ZSA6IFsgc3RhdGUgXTsKICAgICAgICBmb3IgKCBjb25zdCB0b2tlbiBvZiB0b2tlbnMgKSB7CiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBgJHt0b2tlbn1gOwogICAgICAgICAgICBpZiAoIE9iamVjdC5oYXNPd24odGFyZ2V0cywgcHJvcCkgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0c1twcm9wXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgY29uc3QgcnVuQXQgPSBpbnRGcm9tUmVhZHlTdGF0ZSh3aGVuKTsKICAgIGlmICggaW50RnJvbVJlYWR5U3RhdGUoZG9jdW1lbnQucmVhZHlTdGF0ZSkgPj0gcnVuQXQgKSB7CiAgICAgICAgZm4oKTsgcmV0dXJuOwogICAgfQogICAgY29uc3Qgb25TdGF0ZUNoYW5nZSA9ICggKSA9PiB7CiAgICAgICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA8IHJ1bkF0ICkgeyByZXR1cm47IH0KICAgICAgICBmbigpOwogICAgICAgIHNhZmUucmVtb3ZlRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7CiAgICB9OwogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBhcmdzID0gWyAncmVhZHlzdGF0ZWNoYW5nZScsIG9uU3RhdGVDaGFuZ2UsIHsgY2FwdHVyZTogdHJ1ZSB9IF07CiAgICBzYWZlLmFkZEV2ZW50TGlzdGVuZXIuYXBwbHkoZG9jdW1lbnQsIGFyZ3MpOwp9CmZ1bmN0aW9uIHNldENvbnN0YW50Rm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBjaGFpbiA9ICcnLAogICAgcmF3VmFsdWUgPSAnJwopIHsKICAgIGlmICggY2hhaW4gPT09ICcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdzZXQtY29uc3RhbnQnLCBjaGFpbiwgcmF3VmFsdWUpOwogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAzKTsKICAgIGZ1bmN0aW9uIHNldENvbnN0YW50KGNoYWluLCByYXdWYWx1ZSkgewogICAgICAgIGNvbnN0IHRyYXBwZWRQcm9wID0gKCggKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGNoYWluLmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgICAgIGlmICggcG9zID09PSAtMSApIHsgcmV0dXJuIGNoYWluOyB9CiAgICAgICAgICAgIHJldHVybiBjaGFpbi5zbGljZShwb3MrMSk7CiAgICAgICAgfSkoKTsKICAgICAgICBjb25zdCBjbG9ha0Z1bmMgPSBmbiA9PiB7CiAgICAgICAgICAgIHNhZmUuT2JqZWN0X2RlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgdmFsdWU6IHRyYXBwZWRQcm9wIH0pOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5KGZuLCB7CiAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIHByb3AgIT09ICd0b1N0cmluZycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgIGlmICggcHJvcCAhPT0gJ3RvU3RyaW5nJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgIGlmICggcHJvcCA9PT0gJ3RvU3RyaW5nJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBmdW5jdGlvbiAke3RyYXBwZWRQcm9wfSgpIHsgW25hdGl2ZSBjb2RlXSB9YDsKICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgaWYgKCB0cmFwcGVkUHJvcCA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRoaXNTY3JpcHQgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0OwogICAgICAgIGxldCBub3JtYWxWYWx1ZSA9IHZhbGlkYXRlQ29uc3RhbnRGbih0cnVzdGVkLCByYXdWYWx1ZSwgZXh0cmFBcmdzKTsKICAgICAgICBpZiAoIHJhd1ZhbHVlID09PSAnbm9vcEZ1bmMnIHx8IHJhd1ZhbHVlID09PSAndHJ1ZUZ1bmMnIHx8IHJhd1ZhbHVlID09PSAnZmFsc2VGdW5jJyApIHsKICAgICAgICAgICAgbm9ybWFsVmFsdWUgPSBjbG9ha0Z1bmMobm9ybWFsVmFsdWUpOwogICAgICAgIH0KICAgICAgICBsZXQgYWJvcnRlZCA9IGZhbHNlOwogICAgICAgIGNvbnN0IG11c3RBYm9ydCA9IGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgaWYgKCB0cnVzdGVkICkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgICAgaWYgKCBhYm9ydGVkICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBhYm9ydGVkID0KICAgICAgICAgICAgICAgICh2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCkgJiYKICAgICAgICAgICAgICAgIChub3JtYWxWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG5vcm1hbFZhbHVlICE9PSBudWxsKSAmJgogICAgICAgICAgICAgICAgKHR5cGVvZiB2ICE9PSB0eXBlb2Ygbm9ybWFsVmFsdWUpOwogICAgICAgICAgICBpZiAoIGFib3J0ZWQgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBBYm9ydGVkIGJlY2F1c2UgdmFsdWUgc2V0IHRvICR7dn1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWJvcnRlZDsKICAgICAgICB9OwogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91QmxvY2tPcmlnaW4vdUJsb2NrLWlzc3Vlcy9pc3N1ZXMvMTU2CiAgICAgICAgLy8gICBTdXBwb3J0IG11bHRpcGxlIHRyYXBwZXJzIGZvciB0aGUgc2FtZSBwcm9wZXJ0eS4KICAgICAgICBjb25zdCB0cmFwUHJvcCA9IGZ1bmN0aW9uKG93bmVyLCBwcm9wLCBjb25maWd1cmFibGUsIGhhbmRsZXIpIHsKICAgICAgICAgICAgaWYgKCBoYW5kbGVyLmluaXQoY29uZmlndXJhYmxlID8gb3duZXJbcHJvcF0gOiBub3JtYWxWYWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3Qgb2Rlc2MgPSBzYWZlLk9iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3duZXIsIHByb3ApOwogICAgICAgICAgICBsZXQgcHJldkdldHRlciwgcHJldlNldHRlcjsKICAgICAgICAgICAgaWYgKCBvZGVzYyBpbnN0YW5jZW9mIHNhZmUuT2JqZWN0ICkgewogICAgICAgICAgICAgICAgb3duZXJbcHJvcF0gPSBub3JtYWxWYWx1ZTsKICAgICAgICAgICAgICAgIGlmICggb2Rlc2MuZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldkdldHRlciA9IG9kZXNjLmdldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggb2Rlc2Muc2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldlNldHRlciA9IG9kZXNjLnNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc2FmZS5PYmplY3RfZGVmaW5lUHJvcGVydHkob3duZXIsIHByb3AsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGUsCiAgICAgICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByZXZHZXR0ZXIgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZHZXR0ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlci5nZXR0ZXIoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNldChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJldlNldHRlciAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlNldHRlcihhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnNldHRlcihhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1RyYXAgaW5zdGFsbGVkJyk7CiAgICAgICAgICAgIH0gY2F0Y2goZXgpIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvRXJyKGxvZ1ByZWZpeCwgZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCB0cmFwQ2hhaW4gPSBmdW5jdGlvbihvd25lciwgY2hhaW4pIHsKICAgICAgICAgICAgY29uc3QgcG9zID0gY2hhaW4uaW5kZXhPZignLicpOwogICAgICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7CiAgICAgICAgICAgICAgICB0cmFwUHJvcChvd25lciwgY2hhaW4sIGZhbHNlLCB7CiAgICAgICAgICAgICAgICAgICAgdjogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtdXN0QWJvcnQodikgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnYgPSB2OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldHRlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZG9jdW1lbnQuY3VycmVudFNjcmlwdCA9PT0gdGhpc1NjcmlwdCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnUHJvcGVydHkgcmVhZCcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzZXR0ZXI6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtdXN0QWJvcnQoYSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsVmFsdWUgPSBhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBjaGFpbi5zbGljZSgwLCBwb3MpOwogICAgICAgICAgICBjb25zdCB2ID0gb3duZXJbcHJvcF07CiAgICAgICAgICAgIGNoYWluID0gY2hhaW4uc2xpY2UocG9zICsgMSk7CiAgICAgICAgICAgIGlmICggdiBpbnN0YW5jZW9mIHNhZmUuT2JqZWN0IHx8IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgdHJhcENoYWluKHYsIGNoYWluKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cmFwUHJvcChvd25lciwgcHJvcCwgdHJ1ZSwgewogICAgICAgICAgICAgICAgdjogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgICAgIHRoaXMudiA9IHY7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0dGVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNldHRlcjogZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudiA9IGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBhIGluc3RhbmNlb2Ygc2FmZS5PYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYXBDaGFpbihhLCBjaGFpbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHRyYXBDaGFpbih3aW5kb3csIGNoYWluKTsKICAgIH0KICAgIHJ1bkF0KCggKSA9PiB7CiAgICAgICAgc2V0Q29uc3RhbnQoY2hhaW4sIHJhd1ZhbHVlKTsKICAgIH0sIGV4dHJhQXJncy5ydW5BdCk7Cn0KCiAgKGZ1bmN0aW9uIHNldENvbnN0YW50KAogICAgLi4uYXJncwopIHsKICAgIHNldENvbnN0YW50Rm4oZmFsc2UsIC4uLmFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-set-constant.js","aliases":["trusted-set.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gdmFsaWRhdGVDb25zdGFudEZuKHRydXN0ZWQsIHJhdywgZXh0cmFBcmdzID0ge30pIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgbGV0IHZhbHVlOwogICAgaWYgKCByYXcgPT09ICd1bmRlZmluZWQnICkgewogICAgICAgIHZhbHVlID0gdW5kZWZpbmVkOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnZmFsc2UnICkgewogICAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICd0cnVlJyApIHsKICAgICAgICB2YWx1ZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICdudWxsJyApIHsKICAgICAgICB2YWx1ZSA9IG51bGw7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICInJyIgfHwgcmF3ID09PSAnJyApIHsKICAgICAgICB2YWx1ZSA9ICcnOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnW10nIHx8IHJhdyA9PT0gJ2VtcHR5QXJyJyApIHsKICAgICAgICB2YWx1ZSA9IFtdOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAne30nIHx8IHJhdyA9PT0gJ2VtcHR5T2JqJyApIHsKICAgICAgICB2YWx1ZSA9IHt9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnbm9vcEZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXt9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAndHJ1ZUZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRydWU7IH07CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICdmYWxzZUZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXsgcmV0dXJuIGZhbHNlOyB9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAndGhyb3dGdW5jJyApIHsKICAgICAgICB2YWx1ZSA9IGZ1bmN0aW9uKCl7IHRocm93ICcnOyB9OwogICAgfSBlbHNlIGlmICggL14tP1xkKyQvLnRlc3QocmF3KSApIHsKICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHJhdyk7CiAgICAgICAgaWYgKCBpc05hTihyYXcpICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIE1hdGguYWJzKHJhdykgPiAweDdGRkYgKSB7IHJldHVybjsgfQogICAgfSBlbHNlIGlmICggdHJ1c3RlZCApIHsKICAgICAgICBpZiAoIHJhdy5zdGFydHNXaXRoKCdqc29uOicpICkgewogICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9wYXJzZShyYXcuc2xpY2UoNSkpOyB9IGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfSBlbHNlIGlmICggcmF3LnN0YXJ0c1dpdGgoJ3snKSAmJiByYXcuZW5kc1dpdGgoJ30nKSApIHsKICAgICAgICAgICAgdHJ5IHsgdmFsdWUgPSBzYWZlLkpTT05fcGFyc2UocmF3KS52YWx1ZTsgfSBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCBleHRyYUFyZ3MuYXMgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICBpZiAoIGV4dHJhQXJncy5hcyA9PT0gJ2Z1bmN0aW9uJyApIHsKICAgICAgICAgICAgcmV0dXJuICggKSA9PiB2YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKCBleHRyYUFyZ3MuYXMgPT09ICdjYWxsYmFjaycgKSB7CiAgICAgICAgICAgIHJldHVybiAoICkgPT4gKCggKSA9PiB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmICggZXh0cmFBcmdzLmFzID09PSAncmVzb2x2ZWQnICkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKCBleHRyYUFyZ3MuYXMgPT09ICdyZWplY3RlZCcgKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIHNhZmVTZWxmKCkgewogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmICkgewogICAgICAgIHJldHVybiBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmOwogICAgfQogICAgY29uc3Qgc2VsZiA9IGdsb2JhbFRoaXM7CiAgICBjb25zdCBzYWZlID0gewogICAgICAgICdBcnJheV9mcm9tJzogQXJyYXkuZnJvbSwKICAgICAgICAnRXJyb3InOiBzZWxmLkVycm9yLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZ0ZuJzogc2VsZi5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nJzogdGhpc0FyZyA9PiBzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nRm4uY2FsbCh0aGlzQXJnKSwKICAgICAgICAnTWF0aF9mbG9vcic6IE1hdGguZmxvb3IsCiAgICAgICAgJ01hdGhfbWF4JzogTWF0aC5tYXgsCiAgICAgICAgJ01hdGhfbWluJzogTWF0aC5taW4sCiAgICAgICAgJ01hdGhfcmFuZG9tJzogTWF0aC5yYW5kb20sCiAgICAgICAgJ09iamVjdCc6IE9iamVjdCwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnR5JzogT2JqZWN0LmRlZmluZVByb3BlcnR5LmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnRpZXMnOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9mcm9tRW50cmllcyc6IE9iamVjdC5mcm9tRW50cmllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2hhc093bic6IE9iamVjdC5oYXNPd24uYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfdG9TdHJpbmcnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdSZWdFeHAnOiBzZWxmLlJlZ0V4cCwKICAgICAgICAnUmVnRXhwX3Rlc3QnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUudGVzdCwKICAgICAgICAnUmVnRXhwX2V4ZWMnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUuZXhlYywKICAgICAgICAnUmVxdWVzdF9jbG9uZSc6IHNlbGYuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUsCiAgICAgICAgJ1N0cmluZyc6IHNlbGYuU3RyaW5nLAogICAgICAgICdTdHJpbmdfZnJvbUNoYXJDb2RlJzogU3RyaW5nLmZyb21DaGFyQ29kZSwKICAgICAgICAnU3RyaW5nX3NwbGl0JzogU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwKICAgICAgICAnWE1MSHR0cFJlcXVlc3QnOiBzZWxmLlhNTEh0dHBSZXF1ZXN0LAogICAgICAgICdhZGRFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciwKICAgICAgICAncmVtb3ZlRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ2ZldGNoJzogc2VsZi5mZXRjaCwKICAgICAgICAnSlNPTic6IHNlbGYuSlNPTiwKICAgICAgICAnSlNPTl9wYXJzZUZuJzogc2VsZi5KU09OLnBhcnNlLAogICAgICAgICdKU09OX3N0cmluZ2lmeUZuJzogc2VsZi5KU09OLnN0cmluZ2lmeSwKICAgICAgICAnSlNPTl9wYXJzZSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fcGFyc2VGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5JzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9zdHJpbmdpZnlGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ2xvZyc6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksCiAgICAgICAgLy8gUHJvcGVydGllcwogICAgICAgIGxvZ0xldmVsOiAwLAogICAgICAgIC8vIE1ldGhvZHMKICAgICAgICBtYWtlTG9nUHJlZml4KC4uLmFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyICYmIGBbJHthcmdzLmpvaW4oJyBcdTIwNUQgJyl9XWAgfHwgJyc7CiAgICAgICAgfSwKICAgICAgICB1Ym9Mb2coLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignaW5mbycsIC4uLmFyZ3MpOwogICAgICAgICAgICAKICAgICAgICB9LAogICAgICAgIHVib0VyciguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdlcnJvcicsIC4uLmFyZ3MpOwogICAgICAgIH0sCiAgICAgICAgZXNjYXBlUmVnZXhDaGFycyhzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpOwogICAgICAgIH0sCiAgICAgICAgaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXRjaEFsbDogdHJ1ZSwgZXhwZWN0OiB0cnVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZXhwZWN0ID0gKG9wdGlvbnMuY2FuTmVnYXRlICE9PSB0cnVlIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID09PSBmYWxzZSk7CiAgICAgICAgICAgIGlmICggZXhwZWN0ID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gfHwgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG9wdGlvbnMuZmxhZ3MgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsgcGF0dGVybiwgZXhwZWN0IH07CiAgICAgICAgfSwKICAgICAgICB0ZXN0UGF0dGVybihkZXRhaWxzLCBoYXlzdGFjaykgewogICAgICAgICAgICBpZiAoIGRldGFpbHMubWF0Y2hBbGwgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIGlmICggZGV0YWlscy5yZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJlZ0V4cF90ZXN0LmNhbGwoZGV0YWlscy5yZSwgaGF5c3RhY2spID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMoZGV0YWlscy5wYXR0ZXJuKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgfSwKICAgICAgICBwYXR0ZXJuVG9SZWdleChwYXR0ZXJuLCBmbGFncyA9IHVuZGVmaW5lZCwgdmVyYmF0aW0gPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgeyByZXR1cm4gL14vOyB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgewogICAgICAgICAgICAgICAgY29uc3QgcmVTdHIgPSB0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybik7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh2ZXJiYXRpbSA/IGBeJHtyZVN0cn0kYCA6IHJlU3RyLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gL14vOwogICAgICAgIH0sCiAgICAgICAgZ2V0RXh0cmFBcmdzKGFyZ3MsIG9mZnNldCA9IDApIHsKICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGFyZ3Muc2xpY2Uob2Zmc2V0KS5yZWR1Y2UoKG91dCwgdiwgaSwgYSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCAoaSAmIDEpID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gYVtpKzFdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gL15cZCskLy50ZXN0KHJhd1ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHJhd1ZhbHVlLCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgOiByYXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChbIGFbaV0sIHZhbHVlIF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5PYmplY3RfZnJvbUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUoZm4sIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICAgIH0sCiAgICAgICAgb2ZmSWRsZShpZCkgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbElkbGVDYWxsYmFjayhpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgIH0KICAgIH07CiAgICBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmID0gc2FmZTsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gc2FmZTsgfQogICAgLy8gVGhpcyBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGxvZ2dlciBpcyBvcGVuZWQKICAgIHNhZmUubG9nTGV2ZWwgPSBzY3JpcHRsZXRHbG9iYWxzLmxvZ0xldmVsIHx8IDE7CiAgICBsZXQgbGFzdExvZ1R5cGUgPSAnJzsKICAgIGxldCBsYXN0TG9nVGV4dCA9ICcnOwogICAgbGV0IGxhc3RMb2dUaW1lID0gMDsKICAgIHNhZmUudG9Mb2dUZXh0ID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0ZXh0ID0gYFske2RvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lIHx8IGRvY3VtZW50LmxvY2F0aW9uLmhyZWZ9XSR7YXJncy5qb2luKCcgJyl9YDsKICAgICAgICBpZiAoIHRleHQgPT09IGxhc3RMb2dUZXh0ICYmIHR5cGUgPT09IGxhc3RMb2dUeXBlICkgewogICAgICAgICAgICBpZiAoIChEYXRlLm5vdygpIC0gbGFzdExvZ1RpbWUpIDwgNTAwMCApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGxhc3RMb2dUeXBlID0gdHlwZTsKICAgICAgICBsYXN0TG9nVGV4dCA9IHRleHQ7CiAgICAgICAgbGFzdExvZ1RpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgYmMgPSBuZXcgc2VsZi5Ccm9hZGNhc3RDaGFubmVsKHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQpOwogICAgICAgIGxldCBiY0J1ZmZlciA9IFtdOwogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJjQnVmZmVyLnB1c2goeyB0eXBlLCB0ZXh0IH0pOwogICAgICAgIH07CiAgICAgICAgYmMub25tZXNzYWdlID0gZXYgPT4gewogICAgICAgICAgICBjb25zdCBtc2cgPSBldi5kYXRhOwogICAgICAgICAgICBzd2l0Y2ggKCBtc2cgKSB7CiAgICAgICAgICAgIGNhc2UgJ2lhbXJlYWR5ISc6CiAgICAgICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBiY0J1ZmZlci5mb3JFYWNoKCh7IHR5cGUsIHRleHQgfSkgPT4KICAgICAgICAgICAgICAgICAgICBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYmNCdWZmZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb09uZSc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvVHdvJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGJjLnBvc3RNZXNzYWdlKCdhcmV5b3VyZWFkeT8nKTsKICAgIH0gY2F0Y2ggewogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHNhZmUubG9nKGB1Qk8gJHt0ZXh0fWApOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gc2FmZTsKfQpmdW5jdGlvbiBydW5BdChmbiwgd2hlbikgewogICAgY29uc3QgaW50RnJvbVJlYWR5U3RhdGUgPSBzdGF0ZSA9PiB7CiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IHsKICAgICAgICAgICAgJ2xvYWRpbmcnOiAxLCAnYXNhcCc6IDEsCiAgICAgICAgICAgICdpbnRlcmFjdGl2ZSc6IDIsICdlbmQnOiAyLCAnMic6IDIsCiAgICAgICAgICAgICdjb21wbGV0ZSc6IDMsICdpZGxlJzogMywgJzMnOiAzLAogICAgICAgIH07CiAgICAgICAgY29uc3QgdG9rZW5zID0gQXJyYXkuaXNBcnJheShzdGF0ZSkgPyBzdGF0ZSA6IFsgc3RhdGUgXTsKICAgICAgICBmb3IgKCBjb25zdCB0b2tlbiBvZiB0b2tlbnMgKSB7CiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBgJHt0b2tlbn1gOwogICAgICAgICAgICBpZiAoIE9iamVjdC5oYXNPd24odGFyZ2V0cywgcHJvcCkgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0c1twcm9wXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgY29uc3QgcnVuQXQgPSBpbnRGcm9tUmVhZHlTdGF0ZSh3aGVuKTsKICAgIGlmICggaW50RnJvbVJlYWR5U3RhdGUoZG9jdW1lbnQucmVhZHlTdGF0ZSkgPj0gcnVuQXQgKSB7CiAgICAgICAgZm4oKTsgcmV0dXJuOwogICAgfQogICAgY29uc3Qgb25TdGF0ZUNoYW5nZSA9ICggKSA9PiB7CiAgICAgICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA8IHJ1bkF0ICkgeyByZXR1cm47IH0KICAgICAgICBmbigpOwogICAgICAgIHNhZmUucmVtb3ZlRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7CiAgICB9OwogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBhcmdzID0gWyAncmVhZHlzdGF0ZWNoYW5nZScsIG9uU3RhdGVDaGFuZ2UsIHsgY2FwdHVyZTogdHJ1ZSB9IF07CiAgICBzYWZlLmFkZEV2ZW50TGlzdGVuZXIuYXBwbHkoZG9jdW1lbnQsIGFyZ3MpOwp9CmZ1bmN0aW9uIHNldENvbnN0YW50Rm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBjaGFpbiA9ICcnLAogICAgcmF3VmFsdWUgPSAnJwopIHsKICAgIGlmICggY2hhaW4gPT09ICcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdzZXQtY29uc3RhbnQnLCBjaGFpbiwgcmF3VmFsdWUpOwogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAzKTsKICAgIGZ1bmN0aW9uIHNldENvbnN0YW50KGNoYWluLCByYXdWYWx1ZSkgewogICAgICAgIGNvbnN0IHRyYXBwZWRQcm9wID0gKCggKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGNoYWluLmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgICAgIGlmICggcG9zID09PSAtMSApIHsgcmV0dXJuIGNoYWluOyB9CiAgICAgICAgICAgIHJldHVybiBjaGFpbi5zbGljZShwb3MrMSk7CiAgICAgICAgfSkoKTsKICAgICAgICBjb25zdCBjbG9ha0Z1bmMgPSBmbiA9PiB7CiAgICAgICAgICAgIHNhZmUuT2JqZWN0X2RlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgdmFsdWU6IHRyYXBwZWRQcm9wIH0pOwogICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5KGZuLCB7CiAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIHByb3AgIT09ICd0b1N0cmluZycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgIGlmICggcHJvcCAhPT0gJ3RvU3RyaW5nJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgIGlmICggcHJvcCA9PT0gJ3RvU3RyaW5nJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBmdW5jdGlvbiAke3RyYXBwZWRQcm9wfSgpIHsgW25hdGl2ZSBjb2RlXSB9YDsKICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgaWYgKCB0cmFwcGVkUHJvcCA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRoaXNTY3JpcHQgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0OwogICAgICAgIGxldCBub3JtYWxWYWx1ZSA9IHZhbGlkYXRlQ29uc3RhbnRGbih0cnVzdGVkLCByYXdWYWx1ZSwgZXh0cmFBcmdzKTsKICAgICAgICBpZiAoIHJhd1ZhbHVlID09PSAnbm9vcEZ1bmMnIHx8IHJhd1ZhbHVlID09PSAndHJ1ZUZ1bmMnIHx8IHJhd1ZhbHVlID09PSAnZmFsc2VGdW5jJyApIHsKICAgICAgICAgICAgbm9ybWFsVmFsdWUgPSBjbG9ha0Z1bmMobm9ybWFsVmFsdWUpOwogICAgICAgIH0KICAgICAgICBsZXQgYWJvcnRlZCA9IGZhbHNlOwogICAgICAgIGNvbnN0IG11c3RBYm9ydCA9IGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgaWYgKCB0cnVzdGVkICkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgICAgaWYgKCBhYm9ydGVkICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBhYm9ydGVkID0KICAgICAgICAgICAgICAgICh2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCkgJiYKICAgICAgICAgICAgICAgIChub3JtYWxWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG5vcm1hbFZhbHVlICE9PSBudWxsKSAmJgogICAgICAgICAgICAgICAgKHR5cGVvZiB2ICE9PSB0eXBlb2Ygbm9ybWFsVmFsdWUpOwogICAgICAgICAgICBpZiAoIGFib3J0ZWQgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBBYm9ydGVkIGJlY2F1c2UgdmFsdWUgc2V0IHRvICR7dn1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWJvcnRlZDsKICAgICAgICB9OwogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91QmxvY2tPcmlnaW4vdUJsb2NrLWlzc3Vlcy9pc3N1ZXMvMTU2CiAgICAgICAgLy8gICBTdXBwb3J0IG11bHRpcGxlIHRyYXBwZXJzIGZvciB0aGUgc2FtZSBwcm9wZXJ0eS4KICAgICAgICBjb25zdCB0cmFwUHJvcCA9IGZ1bmN0aW9uKG93bmVyLCBwcm9wLCBjb25maWd1cmFibGUsIGhhbmRsZXIpIHsKICAgICAgICAgICAgaWYgKCBoYW5kbGVyLmluaXQoY29uZmlndXJhYmxlID8gb3duZXJbcHJvcF0gOiBub3JtYWxWYWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgY29uc3Qgb2Rlc2MgPSBzYWZlLk9iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3duZXIsIHByb3ApOwogICAgICAgICAgICBsZXQgcHJldkdldHRlciwgcHJldlNldHRlcjsKICAgICAgICAgICAgaWYgKCBvZGVzYyBpbnN0YW5jZW9mIHNhZmUuT2JqZWN0ICkgewogICAgICAgICAgICAgICAgb3duZXJbcHJvcF0gPSBub3JtYWxWYWx1ZTsKICAgICAgICAgICAgICAgIGlmICggb2Rlc2MuZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldkdldHRlciA9IG9kZXNjLmdldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggb2Rlc2Muc2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldlNldHRlciA9IG9kZXNjLnNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc2FmZS5PYmplY3RfZGVmaW5lUHJvcGVydHkob3duZXIsIHByb3AsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGUsCiAgICAgICAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByZXZHZXR0ZXIgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZHZXR0ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlci5nZXR0ZXIoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNldChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJldlNldHRlciAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlNldHRlcihhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnNldHRlcihhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1RyYXAgaW5zdGFsbGVkJyk7CiAgICAgICAgICAgIH0gY2F0Y2goZXgpIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvRXJyKGxvZ1ByZWZpeCwgZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCB0cmFwQ2hhaW4gPSBmdW5jdGlvbihvd25lciwgY2hhaW4pIHsKICAgICAgICAgICAgY29uc3QgcG9zID0gY2hhaW4uaW5kZXhPZignLicpOwogICAgICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7CiAgICAgICAgICAgICAgICB0cmFwUHJvcChvd25lciwgY2hhaW4sIGZhbHNlLCB7CiAgICAgICAgICAgICAgICAgICAgdjogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtdXN0QWJvcnQodikgKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnYgPSB2OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldHRlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZG9jdW1lbnQuY3VycmVudFNjcmlwdCA9PT0gdGhpc1NjcmlwdCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnUHJvcGVydHkgcmVhZCcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzZXR0ZXI6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtdXN0QWJvcnQoYSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsVmFsdWUgPSBhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBjaGFpbi5zbGljZSgwLCBwb3MpOwogICAgICAgICAgICBjb25zdCB2ID0gb3duZXJbcHJvcF07CiAgICAgICAgICAgIGNoYWluID0gY2hhaW4uc2xpY2UocG9zICsgMSk7CiAgICAgICAgICAgIGlmICggdiBpbnN0YW5jZW9mIHNhZmUuT2JqZWN0IHx8IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgdHJhcENoYWluKHYsIGNoYWluKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cmFwUHJvcChvd25lciwgcHJvcCwgdHJ1ZSwgewogICAgICAgICAgICAgICAgdjogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgICAgIHRoaXMudiA9IHY7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0dGVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNldHRlcjogZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudiA9IGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBhIGluc3RhbmNlb2Ygc2FmZS5PYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYXBDaGFpbihhLCBjaGFpbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHRyYXBDaGFpbih3aW5kb3csIGNoYWluKTsKICAgIH0KICAgIHJ1bkF0KCggKSA9PiB7CiAgICAgICAgc2V0Q29uc3RhbnQoY2hhaW4sIHJhd1ZhbHVlKTsKICAgIH0sIGV4dHJhQXJncy5ydW5BdCk7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRTZXRDb25zdGFudCgKICAgIC4uLmFyZ3MKKSB7CiAgICBzZXRDb25zdGFudEZuKHRydWUsIC4uLmFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-replace-argument.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgY2xhc3MgQXJnbGlzdFBhcnNlciB7CiAgICBjb25zdHJ1Y3RvcihzZXBhcmF0b3JDaGFyID0gJywnLCBtdXN0UXVvdGUgPSBmYWxzZSkgewogICAgICAgIHRoaXMuc2VwYXJhdG9yQ2hhciA9IHRoaXMuYWN0dWFsU2VwYXJhdG9yQ2hhciA9IHNlcGFyYXRvckNoYXI7CiAgICAgICAgdGhpcy5zZXBhcmF0b3JDb2RlID0gdGhpcy5hY3R1YWxTZXBhcmF0b3JDb2RlID0gc2VwYXJhdG9yQ2hhci5jaGFyQ29kZUF0KDApOwogICAgICAgIHRoaXMubXVzdFF1b3RlID0gbXVzdFF1b3RlOwogICAgICAgIHRoaXMucXVvdGVCZWcgPSAwOyB0aGlzLnF1b3RlRW5kID0gMDsKICAgICAgICB0aGlzLmFyZ0JlZyA9IDA7IHRoaXMuYXJnRW5kID0gMDsKICAgICAgICB0aGlzLnNlcGFyYXRvckJlZyA9IDA7IHRoaXMuc2VwYXJhdG9yRW5kID0gMDsKICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IGZhbHNlOwogICAgICAgIHRoaXMuZmFpbGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5yZVdoaXRlc3BhY2VTdGFydCA9IC9eXHMrLzsKICAgICAgICB0aGlzLnJlV2hpdGVzcGFjZUVuZCA9IC8oPzpefFxTKShccyspJC87CiAgICAgICAgdGhpcy5yZU9kZFRyYWlsaW5nRXNjYXBlID0gLyg/Ol58W15cXF0pKD86XFxcXCkqXFwkLzsKICAgICAgICB0aGlzLnJlVHJhaWxpbmdFc2NhcGVDaGFycyA9IC9cXCskLzsKICAgIH0KICAgIG5leHRBcmcocGF0dGVybiwgYmVnID0gMCkgewogICAgICAgIGNvbnN0IGxlbiA9IHBhdHRlcm4ubGVuZ3RoOwogICAgICAgIHRoaXMucXVvdGVCZWcgPSBiZWcgKyB0aGlzLmxlZnRXaGl0ZXNwYWNlQ291bnQocGF0dGVybi5zbGljZShiZWcpKTsKICAgICAgICB0aGlzLmZhaWxlZCA9IGZhbHNlOwogICAgICAgIGNvbnN0IHFjID0gcGF0dGVybi5jaGFyQ29kZUF0KHRoaXMucXVvdGVCZWcpOwogICAgICAgIGlmICggcWMgPT09IDB4MjIgLyogIiAqLyB8fCBxYyA9PT0gMHgyNyAvKiAnICovIHx8IHFjID09PSAweDYwIC8qIGAgKi8gKSB7CiAgICAgICAgICAgIHRoaXMuaW5kZXhPZk5leHRBcmdTZXBhcmF0b3IocGF0dGVybiwgcWMpOwogICAgICAgICAgICBpZiAoIHRoaXMuYXJnRW5kICE9PSBsZW4gKSB7CiAgICAgICAgICAgICAgICB0aGlzLnF1b3RlRW5kID0gdGhpcy5hcmdFbmQgKyAxOwogICAgICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3JCZWcgPSB0aGlzLnNlcGFyYXRvckVuZCA9IHRoaXMucXVvdGVFbmQ7CiAgICAgICAgICAgICAgICB0aGlzLnNlcGFyYXRvckVuZCArPSB0aGlzLmxlZnRXaGl0ZXNwYWNlQ291bnQocGF0dGVybi5zbGljZSh0aGlzLnF1b3RlRW5kKSk7CiAgICAgICAgICAgICAgICBpZiAoIHRoaXMuc2VwYXJhdG9yRW5kID09PSBsZW4gKSB7IHJldHVybiB0aGlzOyB9CiAgICAgICAgICAgICAgICBpZiAoIHBhdHRlcm4uY2hhckNvZGVBdCh0aGlzLnNlcGFyYXRvckVuZCkgPT09IHRoaXMuc2VwYXJhdG9yQ29kZSApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcGFyYXRvckVuZCArPSAxOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuaW5kZXhPZk5leHRBcmdTZXBhcmF0b3IocGF0dGVybiwgdGhpcy5zZXBhcmF0b3JDb2RlKTsKICAgICAgICB0aGlzLnNlcGFyYXRvckJlZyA9IHRoaXMuc2VwYXJhdG9yRW5kID0gdGhpcy5hcmdFbmQ7CiAgICAgICAgaWYgKCB0aGlzLnNlcGFyYXRvckJlZyA8IGxlbiApIHsKICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3JFbmQgKz0gMTsKICAgICAgICB9CiAgICAgICAgdGhpcy5hcmdFbmQgLT0gdGhpcy5yaWdodFdoaXRlc3BhY2VDb3VudChwYXR0ZXJuLnNsaWNlKDAsIHRoaXMuc2VwYXJhdG9yQmVnKSk7CiAgICAgICAgdGhpcy5xdW90ZUVuZCA9IHRoaXMuYXJnRW5kOwogICAgICAgIGlmICggdGhpcy5tdXN0UXVvdGUgKSB7CiAgICAgICAgICAgIHRoaXMuZmFpbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBub3JtYWxpemVBcmcocywgY2hhciA9ICcnKSB7CiAgICAgICAgaWYgKCBjaGFyID09PSAnJyApIHsgY2hhciA9IHRoaXMuYWN0dWFsU2VwYXJhdG9yQ2hhcjsgfQogICAgICAgIGxldCBvdXQgPSAnJzsKICAgICAgICBsZXQgcG9zID0gMDsKICAgICAgICB3aGlsZSAoIChwb3MgPSBzLmxhc3RJbmRleE9mKGNoYXIpKSAhPT0gLTEgKSB7CiAgICAgICAgICAgIG91dCA9IHMuc2xpY2UocG9zKSArIG91dDsKICAgICAgICAgICAgcyA9IHMuc2xpY2UoMCwgcG9zKTsKICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLnJlVHJhaWxpbmdFc2NhcGVDaGFycy5leGVjKHMpOwogICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBjb25zdCB0YWlsID0gKG1hdGNoWzBdLmxlbmd0aCAmIDEpICE9PSAwCiAgICAgICAgICAgICAgICA/IG1hdGNoWzBdLnNsaWNlKDAsIC0xKQogICAgICAgICAgICAgICAgOiBtYXRjaFswXTsKICAgICAgICAgICAgb3V0ID0gdGFpbCArIG91dDsKICAgICAgICAgICAgcyA9IHMuc2xpY2UoMCwgLW1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGlmICggb3V0ID09PSAnJyApIHsgcmV0dXJuIHM7IH0KICAgICAgICByZXR1cm4gcyArIG91dDsKICAgIH0KICAgIGxlZnRXaGl0ZXNwYWNlQ291bnQocykgewogICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5yZVdoaXRlc3BhY2VTdGFydC5leGVjKHMpOwogICAgICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbCA/IDAgOiBtYXRjaFswXS5sZW5ndGg7CiAgICB9CiAgICByaWdodFdoaXRlc3BhY2VDb3VudChzKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLnJlV2hpdGVzcGFjZUVuZC5leGVjKHMpOwogICAgICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbCA/IDAgOiBtYXRjaFsxXS5sZW5ndGg7CiAgICB9CiAgICBpbmRleE9mTmV4dEFyZ1NlcGFyYXRvcihwYXR0ZXJuLCBzZXBhcmF0b3JDb2RlKSB7CiAgICAgICAgdGhpcy5hcmdCZWcgPSB0aGlzLmFyZ0VuZCA9IHNlcGFyYXRvckNvZGUgIT09IHRoaXMuc2VwYXJhdG9yQ29kZQogICAgICAgICAgICA/IHRoaXMucXVvdGVCZWcgKyAxCiAgICAgICAgICAgIDogdGhpcy5xdW90ZUJlZzsKICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IGZhbHNlOwogICAgICAgIGlmICggc2VwYXJhdG9yQ29kZSAhPT0gdGhpcy5hY3R1YWxTZXBhcmF0b3JDb2RlICkgewogICAgICAgICAgICB0aGlzLmFjdHVhbFNlcGFyYXRvckNvZGUgPSBzZXBhcmF0b3JDb2RlOwogICAgICAgICAgICB0aGlzLmFjdHVhbFNlcGFyYXRvckNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHNlcGFyYXRvckNvZGUpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoIHRoaXMuYXJnRW5kIDwgcGF0dGVybi5sZW5ndGggKSB7CiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHBhdHRlcm4uaW5kZXhPZih0aGlzLmFjdHVhbFNlcGFyYXRvckNoYXIsIHRoaXMuYXJnRW5kKTsKICAgICAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgewogICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmFyZ0VuZCA9IHBhdHRlcm4ubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHRoaXMucmVPZGRUcmFpbGluZ0VzY2FwZS50ZXN0KHBhdHRlcm4uc2xpY2UoMCwgcG9zKSkgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmFyZ0VuZCA9IHBvcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLmFyZ0VuZCA9IHBvcyArIDE7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIHZhbGlkYXRlQ29uc3RhbnRGbih0cnVzdGVkLCByYXcsIGV4dHJhQXJncyA9IHt9KSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGxldCB2YWx1ZTsKICAgIGlmICggcmF3ID09PSAndW5kZWZpbmVkJyApIHsKICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgIH0gZWxzZSBpZiAoIHJhdyA9PT0gJ2ZhbHNlJyApIHsKICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAndHJ1ZScgKSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnbnVsbCcgKSB7CiAgICAgICAgdmFsdWUgPSBudWxsOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAiJyciIHx8IHJhdyA9PT0gJycgKSB7CiAgICAgICAgdmFsdWUgPSAnJzsKICAgIH0gZWxzZSBpZiAoIHJhdyA9PT0gJ1tdJyB8fCByYXcgPT09ICdlbXB0eUFycicgKSB7CiAgICAgICAgdmFsdWUgPSBbXTsKICAgIH0gZWxzZSBpZiAoIHJhdyA9PT0gJ3t9JyB8fCByYXcgPT09ICdlbXB0eU9iaicgKSB7CiAgICAgICAgdmFsdWUgPSB7fTsKICAgIH0gZWxzZSBpZiAoIHJhdyA9PT0gJ25vb3BGdW5jJyApIHsKICAgICAgICB2YWx1ZSA9IGZ1bmN0aW9uKCl7fTsKICAgIH0gZWxzZSBpZiAoIHJhdyA9PT0gJ3RydWVGdW5jJyApIHsKICAgICAgICB2YWx1ZSA9IGZ1bmN0aW9uKCl7IHJldHVybiB0cnVlOyB9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnZmFsc2VGdW5jJyApIHsKICAgICAgICB2YWx1ZSA9IGZ1bmN0aW9uKCl7IHJldHVybiBmYWxzZTsgfTsKICAgIH0gZWxzZSBpZiAoIHJhdyA9PT0gJ3Rocm93RnVuYycgKSB7CiAgICAgICAgdmFsdWUgPSBmdW5jdGlvbigpeyB0aHJvdyAnJzsgfTsKICAgIH0gZWxzZSBpZiAoIC9eLT9cZCskLy50ZXN0KHJhdykgKSB7CiAgICAgICAgdmFsdWUgPSBwYXJzZUludChyYXcpOwogICAgICAgIGlmICggaXNOYU4ocmF3KSApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBNYXRoLmFicyhyYXcpID4gMHg3RkZGICkgeyByZXR1cm47IH0KICAgIH0gZWxzZSBpZiAoIHRydXN0ZWQgKSB7CiAgICAgICAgaWYgKCByYXcuc3RhcnRzV2l0aCgnanNvbjonKSApIHsKICAgICAgICAgICAgdHJ5IHsgdmFsdWUgPSBzYWZlLkpTT05fcGFyc2UocmF3LnNsaWNlKDUpKTsgfSBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0gZWxzZSBpZiAoIHJhdy5zdGFydHNXaXRoKCd7JykgJiYgcmF3LmVuZHNXaXRoKCd9JykgKSB7CiAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3BhcnNlKHJhdykudmFsdWU7IH0gY2F0Y2ggeyByZXR1cm47IH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICggZXh0cmFBcmdzLmFzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgaWYgKCBleHRyYUFyZ3MuYXMgPT09ICdmdW5jdGlvbicgKSB7CiAgICAgICAgICAgIHJldHVybiAoICkgPT4gdmFsdWU7CiAgICAgICAgfSBlbHNlIGlmICggZXh0cmFBcmdzLmFzID09PSAnY2FsbGJhY2snICkgewogICAgICAgICAgICByZXR1cm4gKCApID0+ICgoICkgPT4gdmFsdWUpOwogICAgICAgIH0gZWxzZSBpZiAoIGV4dHJhQXJncy5hcyA9PT0gJ3Jlc29sdmVkJyApIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmICggZXh0cmFBcmdzLmFzID09PSAncmVqZWN0ZWQnICkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KZnVuY3Rpb24gcHJveHlBcHBseUZuKAogICAgdGFyZ2V0ID0gJycsCiAgICBoYW5kbGVyID0gJycKKSB7CiAgICBsZXQgY29udGV4dCA9IGdsb2JhbFRoaXM7CiAgICBsZXQgcHJvcCA9IHRhcmdldDsKICAgIGZvciAoOzspIHsKICAgICAgICBjb25zdCBwb3MgPSBwcm9wLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IGJyZWFrOyB9CiAgICAgICAgY29udGV4dCA9IGNvbnRleHRbcHJvcC5zbGljZSgwLCBwb3MpXTsKICAgICAgICBpZiAoIGNvbnRleHQgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBwcm9wID0gcHJvcC5zbGljZShwb3MrMSk7CiAgICB9CiAgICBjb25zdCBmbiA9IGNvbnRleHRbcHJvcF07CiAgICBpZiAoIHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuOyB9CiAgICBpZiAoIHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCA9PT0gdW5kZWZpbmVkICkgewogICAgICAgIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMgPSBbXTsKICAgICAgICBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPSBjbGFzcyB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5pdCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0KGNhbGxGbiwgY2FsbEFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEZuID0gY2FsbEZuOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmNvbnN0cnVjdCh0aGlzLmNhbGxGbiwgdGhpcy5jYWxsQXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IHRoaXMuY2FsbEFyZ3MgPSB0aGlzLnByaXZhdGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0aWMgZmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMucG9wKCkuaW5pdCguLi5hcmdzKQogICAgICAgICAgICAgICAgICAgIDogbmV3IHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMgPSBbXTsKICAgICAgICBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIHRoaXNBcmcsIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxBcmdzID0gY2FsbEFyZ3M7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWZsZWN0KCkgewogICAgICAgICAgICAgICAgY29uc3QgciA9IFJlZmxlY3QuYXBwbHkodGhpcy5jYWxsRm4sIHRoaXMudGhpc0FyZywgdGhpcy5jYWxsQXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IHRoaXMudGhpc0FyZyA9IHRoaXMuY2FsbEFyZ3MgPSB0aGlzLnByaXZhdGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLmxlbmd0aCAhPT0gMAogICAgICAgICAgICAgICAgICAgID8gcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucG9wKCkuaW5pdCguLi5hcmdzKQogICAgICAgICAgICAgICAgICAgIDogbmV3IHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5pc0N0b3IgPSBuZXcgTWFwKCk7CiAgICB9CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuaGFzKHRhcmdldCkgPT09IGZhbHNlICkgewogICAgICAgIHByb3h5QXBwbHlGbi5pc0N0b3Iuc2V0KHRhcmdldCwgZm4ucHJvdG90eXBlPy5jb25zdHJ1Y3RvciA9PT0gZm4pOwogICAgfQogICAgY29uc3QgZm5TdHIgPSBmbi50b1N0cmluZygpOwogICAgY29uc3QgdG9TdHJpbmcgPSAoZnVuY3Rpb24gdG9TdHJpbmcoKSB7IHJldHVybiBmblN0cjsgfSkuYmluZChudWxsKTsKICAgIGNvbnN0IHByb3h5RGV0YWlscyA9IHsKICAgICAgICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIocHJveHlBcHBseUZuLkFwcGx5Q29udGV4dC5mYWN0b3J5KHRhcmdldCwgdGhpc0FyZywgYXJncykpOwogICAgICAgIH0sCiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICBpZiAoIHByb3AgPT09ICd0b1N0cmluZycgKSB7IHJldHVybiB0b1N0cmluZzsgfQogICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTsKICAgICAgICB9LAogICAgfTsKICAgIGlmICggcHJveHlBcHBseUZuLmlzQ3Rvci5nZXQodGFyZ2V0KSApIHsKICAgICAgICBwcm94eURldGFpbHMuY29uc3RydWN0ID0gZnVuY3Rpb24odGFyZ2V0LCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dC5mYWN0b3J5KHRhcmdldCwgYXJncykpOwogICAgICAgIH07CiAgICB9CiAgICBjb250ZXh0W3Byb3BdID0gbmV3IFByb3h5KGZuLCBwcm94eURldGFpbHMpOwp9CmZ1bmN0aW9uIHBhcnNlUmVwbGFjZUZuKHMpIHsKICAgIGlmICggcy5jaGFyQ29kZUF0KDApICE9PSAweDJGIC8qIC8gKi8gKSB7IHJldHVybjsgfQogICAgY29uc3QgcGFyc2VyID0gbmV3IEFyZ2xpc3RQYXJzZXIoJy8nKTsKICAgIHBhcnNlci5uZXh0QXJnKHMsIDEpOwogICAgbGV0IHBhdHRlcm4gPSBzLnNsaWNlKHBhcnNlci5hcmdCZWcsIHBhcnNlci5hcmdFbmQpOwogICAgaWYgKCBwYXJzZXIudHJhbnNmb3JtICkgewogICAgICAgIHBhdHRlcm4gPSBwYXJzZXIubm9ybWFsaXplQXJnKHBhdHRlcm4pOwogICAgfQogICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBwYXJzZXIubmV4dEFyZyhzLCBwYXJzZXIuc2VwYXJhdG9yRW5kKTsKICAgIGxldCByZXBsYWNlbWVudCA9IHMuc2xpY2UocGFyc2VyLmFyZ0JlZywgcGFyc2VyLmFyZ0VuZCk7CiAgICBpZiAoIHBhcnNlci5zZXBhcmF0b3JFbmQgPT09IHBhcnNlci5zZXBhcmF0b3JCZWcgKSB7IHJldHVybjsgfQogICAgaWYgKCBwYXJzZXIudHJhbnNmb3JtICkgewogICAgICAgIHJlcGxhY2VtZW50ID0gcGFyc2VyLm5vcm1hbGl6ZUFyZyhyZXBsYWNlbWVudCk7CiAgICB9CiAgICBjb25zdCBmbGFncyA9IHMuc2xpY2UocGFyc2VyLnNlcGFyYXRvckVuZCk7CiAgICB0cnkgewogICAgICAgIHJldHVybiB7IHJlOiBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKSwgcmVwbGFjZW1lbnQgfTsKICAgIH0gY2F0Y2ggewogICAgfQp9CgogIChmdW5jdGlvbiB0cnVzdGVkUmVwbGFjZUFyZ3VtZW50KAogICAgcHJvcENoYWluID0gJycsCiAgICBhcmdwb3NSYXcgPSAnJywKICAgIGFyZ3JhdyA9ICcnCikgewogICAgaWYgKCBwcm9wQ2hhaW4gPT09ICcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCd0cnVzdGVkLXJlcGxhY2UtYXJndW1lbnQnLCBwcm9wQ2hhaW4sIGFyZ3Bvc1JhdywgYXJncmF3KTsKICAgIGNvbnN0IGFyZ29mZnNldCA9IHBhcnNlSW50KGFyZ3Bvc1JhdywgMTApIHx8IDA7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDMpOwogICAgbGV0IHJlcGxhY2VyOwogICAgaWYgKCBhcmdyYXcuc3RhcnRzV2l0aCgncmVwbDovJykgKSB7CiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VSZXBsYWNlRm4oYXJncmF3LnNsaWNlKDUpKTsKICAgICAgICBpZiAoIHBhcnNlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICByZXBsYWNlciA9IGFyZyA9PiBgJHthcmd9YC5yZXBsYWNlKHJlcGxhY2VyLnJlLCByZXBsYWNlci5yZXBsYWNlbWVudCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBsYWNlciwgcGFyc2VkKTsKICAgIH0gZWxzZSBpZiAoIGFyZ3Jhdy5zdGFydHNXaXRoKCdhZGQ6JykgKSB7CiAgICAgICAgY29uc3QgZGVsdGEgPSBwYXJzZUZsb2F0KGFyZ3Jhdy5zbGljZSg0KSk7CiAgICAgICAgaWYgKCBpc05hTihkZWx0YSkgKSB7IHJldHVybjsgfQogICAgICAgIHJlcGxhY2VyID0gYXJnID0+IE51bWJlcihhcmcpICsgZGVsdGE7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHZhbHVlID0gdmFsaWRhdGVDb25zdGFudEZuKHRydWUsIGFyZ3JhdywgZXh0cmFBcmdzKTsKICAgICAgICByZXBsYWNlciA9ICggKSA9PiB2YWx1ZTsKICAgIH0KICAgIGNvbnN0IHJlQ29uZGl0aW9uID0gZXh0cmFBcmdzLmNvbmRpdGlvbgogICAgICAgID8gc2FmZS5wYXR0ZXJuVG9SZWdleChleHRyYUFyZ3MuY29uZGl0aW9uKQogICAgICAgIDogL14vOwogICAgY29uc3QgZ2V0QXJnID0gY29udGV4dCA9PiB7CiAgICAgICAgaWYgKCBhcmdwb3NSYXcgPT09ICd0aGlzJyApIHsgcmV0dXJuIGNvbnRleHQudGhpc0FyZzsgfQogICAgICAgIGNvbnN0IHsgY2FsbEFyZ3MgfSA9IGNvbnRleHQ7CiAgICAgICAgY29uc3QgYXJncG9zID0gYXJnb2Zmc2V0ID49IDAgPyBhcmdvZmZzZXQgOiBjYWxsQXJncy5sZW5ndGggLSBhcmdvZmZzZXQ7CiAgICAgICAgaWYgKCBhcmdwb3MgPCAwIHx8IGFyZ3BvcyA+PSBjYWxsQXJncy5sZW5ndGggKSB7IHJldHVybjsgfQogICAgICAgIGNvbnRleHQucHJpdmF0ZSA9IHsgYXJncG9zIH07CiAgICAgICAgcmV0dXJuIGNhbGxBcmdzW2FyZ3Bvc107CiAgICB9OwogICAgY29uc3Qgc2V0QXJnID0gKGNvbnRleHQsIHZhbHVlKSA9PiB7CiAgICAgICAgaWYgKCBhcmdwb3NSYXcgPT09ICd0aGlzJyApIHsKICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPT0gY29udGV4dC50aGlzQXJnICkgewogICAgICAgICAgICAgICAgY29udGV4dC50aGlzQXJnID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCBjb250ZXh0LnByaXZhdGUgKSB7CiAgICAgICAgICAgIGNvbnRleHQuY2FsbEFyZ3NbY29udGV4dC5wcml2YXRlLmFyZ3Bvc10gPSB2YWx1ZTsKICAgICAgICB9CiAgICB9OwogICAgcHJveHlBcHBseUZuKHByb3BDaGFpbiwgZnVuY3Rpb24oY29udGV4dCkgewogICAgICAgIGlmICggYXJncG9zUmF3ID09PSAnJyApIHsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgQXJndW1lbnRzOlxuJHtjb250ZXh0LmNhbGxBcmdzLmpvaW4oJ1xuJyl9YCk7CiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYXJnQmVmb3JlID0gZ2V0QXJnKGNvbnRleHQpOwogICAgICAgIGlmICggZXh0cmFBcmdzLmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICBpZiAoIHNhZmUuUmVnRXhwX3Rlc3QuY2FsbChyZUNvbmRpdGlvbiwgYXJnQmVmb3JlKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYXJnQWZ0ZXIgPSByZXBsYWNlcihhcmdCZWZvcmUpOwogICAgICAgIGlmICggYXJnQWZ0ZXIgIT09IGFyZ0JlZm9yZSApIHsKICAgICAgICAgICAgc2V0QXJnKGNvbnRleHQsIGFyZ0FmdGVyKTsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgUmVwbGFjZWQgYXJndW1lbnQ6XG5CZWZvcmU6ICR7SlNPTi5zdHJpbmdpZnkoYXJnQmVmb3JlKX1cbkFmdGVyOiAke2FyZ0FmdGVyfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"spoof-css.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBzcG9vZkNTUygKICAgIHNlbGVjdG9yLAogICAgLi4uYXJncwopIHsKICAgIGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICBpZiAoIHNlbGVjdG9yID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCB0b0NhbWVsQ2FzZSA9IHMgPT4gcy5yZXBsYWNlKC8tW2Etel0vZywgcyA9PiBzLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpKTsKICAgIGNvbnN0IHByb3BUb1ZhbHVlTWFwID0gbmV3IE1hcCgpOwogICAgY29uc3QgcHJpdmF0ZVByb3BUb1ZhbHVlTWFwID0gbmV3IE1hcCgpOwogICAgZm9yICggbGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMiApIHsKICAgICAgICBjb25zdCBwcm9wID0gdG9DYW1lbENhc2UoYXJnc1tpKzBdKTsKICAgICAgICBpZiAoIHByb3AgPT09ICcnICkgeyBicmVhazsgfQogICAgICAgIGNvbnN0IHZhbHVlID0gYXJnc1tpKzFdOwogICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsgYnJlYWs7IH0KICAgICAgICBpZiAoIHByb3AuY2hhckNvZGVBdCgwKSA9PT0gMHg1RiAvKiBfICovICkgewogICAgICAgICAgICBwcml2YXRlUHJvcFRvVmFsdWVNYXAuc2V0KHByb3AsIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9wVG9WYWx1ZU1hcC5zZXQocHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdzcG9vZi1jc3MnLCBzZWxlY3RvciwgLi4uYXJncyk7CiAgICBjb25zdCBpbnN0YW5jZVByb3BlcnRpZXMgPSBbICdjc3NUZXh0JywgJ2xlbmd0aCcsICdwYXJlbnRSdWxlJyBdOwogICAgY29uc3Qgc3Bvb2ZTdHlsZSA9IChwcm9wLCByZWFsKSA9PiB7CiAgICAgICAgY29uc3Qgbm9ybWFsUHJvcCA9IHRvQ2FtZWxDYXNlKHByb3ApOwogICAgICAgIGNvbnN0IHNob3VsZFNwb29mID0gcHJvcFRvVmFsdWVNYXAuaGFzKG5vcm1hbFByb3ApOwogICAgICAgIGNvbnN0IHZhbHVlID0gc2hvdWxkU3Bvb2YgPyBwcm9wVG9WYWx1ZU1hcC5nZXQobm9ybWFsUHJvcCkgOiByZWFsOwogICAgICAgIGlmICggc2hvdWxkU3Bvb2YgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYFNwb29maW5nICR7cHJvcH0gdG8gJHt2YWx1ZX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKICAgIGNvbnN0IGNsb2Fja0Z1bmMgPSAoZm4sIHRoaXNBcmcsIG5hbWUpID0+IHsKICAgICAgICBjb25zdCB0cmFwID0gZm4uYmluZCh0aGlzQXJnKTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHJhcCwgJ25hbWUnLCB7IHZhbHVlOiBuYW1lIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFwLCAndG9TdHJpbmcnLCB7CiAgICAgICAgICAgIHZhbHVlOiAoICkgPT4gYGZ1bmN0aW9uICR7bmFtZX0oKSB7IFtuYXRpdmUgY29kZV0gfWAKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdHJhcDsKICAgIH07CiAgICBzZWxmLmdldENvbXB1dGVkU3R5bGUgPSBuZXcgUHJveHkoc2VsZi5nZXRDb21wdXRlZFN0eWxlLCB7CiAgICAgICAgYXBwbHk6IGZ1bmN0aW9uKHRhcmdldCwgdGhpc0FyZywgYXJncykgewogICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIKICAgICAgICAgICAgaWYgKCBwcml2YXRlUHJvcFRvVmFsdWVNYXAuaGFzKCdfZGVidWcnKSApIHsgZGVidWdnZXI7IH0KICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncyk7CiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gbmV3IFdlYWtTZXQoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpOwogICAgICAgICAgICBpZiAoIHRhcmdldEVsZW1lbnRzLmhhcyhhcmdzWzBdKSA9PT0gZmFsc2UgKSB7IHJldHVybiBzdHlsZTsgfQogICAgICAgICAgICBjb25zdCBwcm94aWVkU3R5bGUgPSBuZXcgUHJveHkoc3R5bGUsIHsKICAgICAgICAgICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiB0YXJnZXRbcHJvcF0gPT09ICdmdW5jdGlvbicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJvcCA9PT0gJ2dldFByb3BlcnR5VmFsdWUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb2Fja0Z1bmMoZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZShwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwb29mU3R5bGUocHJvcCwgdGFyZ2V0W3Byb3BdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRhcmdldCwgJ2dldFByb3BlcnR5VmFsdWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvYWNrRnVuYyh0YXJnZXRbcHJvcF0sIHRhcmdldCwgcHJvcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggaW5zdGFuY2VQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3ApICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwb29mU3R5bGUocHJvcCwgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgIGlmICggcHJvcFRvVmFsdWVNYXAuaGFzKHByb3ApICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wVG9WYWx1ZU1hcC5nZXQocHJvcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHByb3hpZWRTdHlsZTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC50b1N0cmluZy5iaW5kKHRhcmdldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH0pOwogICAgRWxlbWVudC5wcm90b3R5cGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID0gbmV3IFByb3h5KEVsZW1lbnQucHJvdG90eXBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCwgewogICAgICAgIGFwcGx5OiBmdW5jdGlvbih0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyCiAgICAgICAgICAgIGlmICggcHJpdmF0ZVByb3BUb1ZhbHVlTWFwLmhhcygnX2RlYnVnJykgKSB7IGRlYnVnZ2VyOyB9CiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncyk7CiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gbmV3IFdlYWtTZXQoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpOwogICAgICAgICAgICBpZiAoIHRhcmdldEVsZW1lbnRzLmhhcyh0aGlzQXJnKSA9PT0gZmFsc2UgKSB7IHJldHVybiByZWN0OyB9CiAgICAgICAgICAgIGxldCB7IHgsIHksIGhlaWdodCwgd2lkdGggfSA9IHJlY3Q7CiAgICAgICAgICAgIGlmICggcHJpdmF0ZVByb3BUb1ZhbHVlTWFwLmhhcygnX3JlY3R4JykgKSB7CiAgICAgICAgICAgICAgICB4ID0gcGFyc2VGbG9hdChwcml2YXRlUHJvcFRvVmFsdWVNYXAuZ2V0KCdfcmVjdHgnKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBwcml2YXRlUHJvcFRvVmFsdWVNYXAuaGFzKCdfcmVjdHknKSApIHsKICAgICAgICAgICAgICAgIHkgPSBwYXJzZUZsb2F0KHByaXZhdGVQcm9wVG9WYWx1ZU1hcC5nZXQoJ19yZWN0eScpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHByaXZhdGVQcm9wVG9WYWx1ZU1hcC5oYXMoJ19yZWN0dycpICkgewogICAgICAgICAgICAgICAgd2lkdGggPSBwYXJzZUZsb2F0KHByaXZhdGVQcm9wVG9WYWx1ZU1hcC5nZXQoJ19yZWN0dycpKTsKICAgICAgICAgICAgfSBlbHNlIGlmICggcHJvcFRvVmFsdWVNYXAuaGFzKCd3aWR0aCcpICkgewogICAgICAgICAgICAgICAgd2lkdGggPSBwYXJzZUZsb2F0KHByb3BUb1ZhbHVlTWFwLmdldCgnd2lkdGgnKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBwcml2YXRlUHJvcFRvVmFsdWVNYXAuaGFzKCdfcmVjdGgnKSApIHsKICAgICAgICAgICAgICAgIGhlaWdodCA9IHBhcnNlRmxvYXQocHJpdmF0ZVByb3BUb1ZhbHVlTWFwLmdldCgnX3JlY3RoJykpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCBwcm9wVG9WYWx1ZU1hcC5oYXMoJ2hlaWdodCcpICkgewogICAgICAgICAgICAgICAgaGVpZ2h0ID0gcGFyc2VGbG9hdChwcm9wVG9WYWx1ZU1hcC5nZXQoJ2hlaWdodCcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IHNlbGYuRE9NUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC50b1N0cmluZy5iaW5kKHRhcmdldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"set-cookie.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0Q29va2llRm4oCiAgICBuYW1lID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGZvciAoIGNvbnN0IHMgb2Ygc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChkb2N1bWVudC5jb29raWUsIC9ccyo7XHMqLykgKSB7CiAgICAgICAgY29uc3QgcG9zID0gcy5pbmRleE9mKCc9Jyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBjb250aW51ZTsgfQogICAgICAgIGlmICggcy5zbGljZSgwLCBwb3MpICE9PSBuYW1lICkgeyBjb250aW51ZTsgfQogICAgICAgIHJldHVybiBzLnNsaWNlKHBvcysxKS50cmltKCk7CiAgICB9Cn0KZnVuY3Rpb24gc2V0Q29va2llRm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBuYW1lID0gJycsCiAgICB2YWx1ZSA9ICcnLAogICAgZXhwaXJlcyA9ICcnLAogICAgcGF0aCA9ICcnLAogICAgb3B0aW9ucyA9IHt9LAopIHsKICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjYxNiNzZWN0aW9uLTIuMgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3VCbG9ja09yaWdpbi91QmxvY2staXNzdWVzL2lzc3Vlcy8yNzc3CiAgICBpZiAoIHRydXN0ZWQgPT09IGZhbHNlICYmIC9bXiEjJCUmJyorXC0uMC05QS1aW1xdXl9gYS16fH5dLy50ZXN0KG5hbWUpICkgewogICAgICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7CiAgICB9CiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjEuMQogICAgLy8gVGhlIGNoYXJhY3RlcnMgWyIsXSBhcmUgZ2l2ZW4gYSBwYXNzIGZyb20gdGhlIFJGQyByZXF1aXJlbWVudHMgYmVjYXVzZQogICAgLy8gYXBwYXJlbnRseSBicm93c2VycyBkbyBub3QgZm9sbG93IHRoZSBSRkMgdG8gdGhlIGxldHRlci4KICAgIGlmICggL1teIC06PC1bXF0tfl0vLnRlc3QodmFsdWUpICkgewogICAgICAgIHZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKICAgIH0KCiAgICBjb25zdCBjb29raWVCZWZvcmUgPSBnZXRDb29raWVGbihuYW1lKTsKICAgIGlmICggY29va2llQmVmb3JlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kb250T3ZlcndyaXRlICkgeyByZXR1cm47IH0KICAgIGlmICggY29va2llQmVmb3JlID09PSB2YWx1ZSAmJiBvcHRpb25zLnJlbG9hZCApIHsgcmV0dXJuOyB9CgogICAgY29uc3QgY29va2llUGFydHMgPSBbIG5hbWUsICc9JywgdmFsdWUgXTsKICAgIGlmICggZXhwaXJlcyAhPT0gJycgKSB7CiAgICAgICAgY29va2llUGFydHMucHVzaCgnOyBleHBpcmVzPScsIGV4cGlyZXMpOwogICAgfQoKICAgIGlmICggcGF0aCA9PT0gJycgKSB7IHBhdGggPSAnLyc7IH0KICAgIGVsc2UgaWYgKCBwYXRoID09PSAnbm9uZScgKSB7IHBhdGggPSAnJzsgfQogICAgaWYgKCBwYXRoICE9PSAnJyAmJiBwYXRoICE9PSAnLycgKSB7IHJldHVybjsgfQogICAgaWYgKCBwYXRoID09PSAnLycgKSB7CiAgICAgICAgY29va2llUGFydHMucHVzaCgnOyBwYXRoPS8nKTsKICAgIH0KCiAgICBpZiAoIHRydXN0ZWQgKSB7CiAgICAgICAgaWYgKCBvcHRpb25zLmRvbWFpbiApIHsKICAgICAgICAgICAgbGV0IGRvbWFpbiA9IG9wdGlvbnMuZG9tYWluOwogICAgICAgICAgICBpZiAoIC9eXC8uK1wvLy50ZXN0KGRvbWFpbikgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBiYXNlVVJMID0gbmV3IFVSTChkb2N1bWVudC5iYXNlVVJJKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlRG9tYWluID0gbmV3IFJlZ0V4cChkb21haW4uc2xpY2UoMSwgLTEpKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVEb21haW4uZXhlYyhiYXNlVVJMLmhvc3RuYW1lKTsKICAgICAgICAgICAgICAgIGRvbWFpbiA9IG1hdGNoID8gbWF0Y2hbMF0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkb21haW4gKSB7CiAgICAgICAgICAgICAgICBjb29raWVQYXJ0cy5wdXNoKGA7IGRvbWFpbj0ke2RvbWFpbn1gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb29raWVQYXJ0cy5wdXNoKCc7IFNlY3VyZScpOwogICAgfSBlbHNlIGlmICggL15fXyhIb3N0fFNlY3VyZSktLy50ZXN0KG5hbWUpICkgewogICAgICAgIGNvb2tpZVBhcnRzLnB1c2goJzsgU2VjdXJlJyk7CiAgICB9CgogICAgdHJ5IHsKICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWVQYXJ0cy5qb2luKCcnKTsKICAgIH0gY2F0Y2ggewogICAgfQoKICAgIGNvbnN0IGRvbmUgPSBnZXRDb29raWVGbihuYW1lKSA9PT0gdmFsdWU7CiAgICBpZiAoIGRvbmUgJiYgb3B0aW9ucy5yZWxvYWQgKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQoKICAgIHJldHVybiBkb25lOwp9CmZ1bmN0aW9uIHNhZmVTZWxmKCkgewogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmICkgewogICAgICAgIHJldHVybiBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmOwogICAgfQogICAgY29uc3Qgc2VsZiA9IGdsb2JhbFRoaXM7CiAgICBjb25zdCBzYWZlID0gewogICAgICAgICdBcnJheV9mcm9tJzogQXJyYXkuZnJvbSwKICAgICAgICAnRXJyb3InOiBzZWxmLkVycm9yLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZ0ZuJzogc2VsZi5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nJzogdGhpc0FyZyA9PiBzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nRm4uY2FsbCh0aGlzQXJnKSwKICAgICAgICAnTWF0aF9mbG9vcic6IE1hdGguZmxvb3IsCiAgICAgICAgJ01hdGhfbWF4JzogTWF0aC5tYXgsCiAgICAgICAgJ01hdGhfbWluJzogTWF0aC5taW4sCiAgICAgICAgJ01hdGhfcmFuZG9tJzogTWF0aC5yYW5kb20sCiAgICAgICAgJ09iamVjdCc6IE9iamVjdCwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnR5JzogT2JqZWN0LmRlZmluZVByb3BlcnR5LmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnRpZXMnOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9mcm9tRW50cmllcyc6IE9iamVjdC5mcm9tRW50cmllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2hhc093bic6IE9iamVjdC5oYXNPd24uYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfdG9TdHJpbmcnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdSZWdFeHAnOiBzZWxmLlJlZ0V4cCwKICAgICAgICAnUmVnRXhwX3Rlc3QnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUudGVzdCwKICAgICAgICAnUmVnRXhwX2V4ZWMnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUuZXhlYywKICAgICAgICAnUmVxdWVzdF9jbG9uZSc6IHNlbGYuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUsCiAgICAgICAgJ1N0cmluZyc6IHNlbGYuU3RyaW5nLAogICAgICAgICdTdHJpbmdfZnJvbUNoYXJDb2RlJzogU3RyaW5nLmZyb21DaGFyQ29kZSwKICAgICAgICAnU3RyaW5nX3NwbGl0JzogU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwKICAgICAgICAnWE1MSHR0cFJlcXVlc3QnOiBzZWxmLlhNTEh0dHBSZXF1ZXN0LAogICAgICAgICdhZGRFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciwKICAgICAgICAncmVtb3ZlRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ2ZldGNoJzogc2VsZi5mZXRjaCwKICAgICAgICAnSlNPTic6IHNlbGYuSlNPTiwKICAgICAgICAnSlNPTl9wYXJzZUZuJzogc2VsZi5KU09OLnBhcnNlLAogICAgICAgICdKU09OX3N0cmluZ2lmeUZuJzogc2VsZi5KU09OLnN0cmluZ2lmeSwKICAgICAgICAnSlNPTl9wYXJzZSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fcGFyc2VGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5JzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9zdHJpbmdpZnlGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ2xvZyc6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksCiAgICAgICAgLy8gUHJvcGVydGllcwogICAgICAgIGxvZ0xldmVsOiAwLAogICAgICAgIC8vIE1ldGhvZHMKICAgICAgICBtYWtlTG9nUHJlZml4KC4uLmFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyICYmIGBbJHthcmdzLmpvaW4oJyBcdTIwNUQgJyl9XWAgfHwgJyc7CiAgICAgICAgfSwKICAgICAgICB1Ym9Mb2coLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignaW5mbycsIC4uLmFyZ3MpOwogICAgICAgICAgICAKICAgICAgICB9LAogICAgICAgIHVib0VyciguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdlcnJvcicsIC4uLmFyZ3MpOwogICAgICAgIH0sCiAgICAgICAgZXNjYXBlUmVnZXhDaGFycyhzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpOwogICAgICAgIH0sCiAgICAgICAgaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXRjaEFsbDogdHJ1ZSwgZXhwZWN0OiB0cnVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZXhwZWN0ID0gKG9wdGlvbnMuY2FuTmVnYXRlICE9PSB0cnVlIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID09PSBmYWxzZSk7CiAgICAgICAgICAgIGlmICggZXhwZWN0ID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gfHwgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG9wdGlvbnMuZmxhZ3MgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsgcGF0dGVybiwgZXhwZWN0IH07CiAgICAgICAgfSwKICAgICAgICB0ZXN0UGF0dGVybihkZXRhaWxzLCBoYXlzdGFjaykgewogICAgICAgICAgICBpZiAoIGRldGFpbHMubWF0Y2hBbGwgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIGlmICggZGV0YWlscy5yZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJlZ0V4cF90ZXN0LmNhbGwoZGV0YWlscy5yZSwgaGF5c3RhY2spID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMoZGV0YWlscy5wYXR0ZXJuKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgfSwKICAgICAgICBwYXR0ZXJuVG9SZWdleChwYXR0ZXJuLCBmbGFncyA9IHVuZGVmaW5lZCwgdmVyYmF0aW0gPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgeyByZXR1cm4gL14vOyB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgewogICAgICAgICAgICAgICAgY29uc3QgcmVTdHIgPSB0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybik7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh2ZXJiYXRpbSA/IGBeJHtyZVN0cn0kYCA6IHJlU3RyLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gL14vOwogICAgICAgIH0sCiAgICAgICAgZ2V0RXh0cmFBcmdzKGFyZ3MsIG9mZnNldCA9IDApIHsKICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGFyZ3Muc2xpY2Uob2Zmc2V0KS5yZWR1Y2UoKG91dCwgdiwgaSwgYSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCAoaSAmIDEpID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gYVtpKzFdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gL15cZCskLy50ZXN0KHJhd1ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHJhd1ZhbHVlLCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgOiByYXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChbIGFbaV0sIHZhbHVlIF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5PYmplY3RfZnJvbUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUoZm4sIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICAgIH0sCiAgICAgICAgb2ZmSWRsZShpZCkgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbElkbGVDYWxsYmFjayhpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgIH0KICAgIH07CiAgICBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmID0gc2FmZTsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gc2FmZTsgfQogICAgLy8gVGhpcyBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGxvZ2dlciBpcyBvcGVuZWQKICAgIHNhZmUubG9nTGV2ZWwgPSBzY3JpcHRsZXRHbG9iYWxzLmxvZ0xldmVsIHx8IDE7CiAgICBsZXQgbGFzdExvZ1R5cGUgPSAnJzsKICAgIGxldCBsYXN0TG9nVGV4dCA9ICcnOwogICAgbGV0IGxhc3RMb2dUaW1lID0gMDsKICAgIHNhZmUudG9Mb2dUZXh0ID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0ZXh0ID0gYFske2RvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lIHx8IGRvY3VtZW50LmxvY2F0aW9uLmhyZWZ9XSR7YXJncy5qb2luKCcgJyl9YDsKICAgICAgICBpZiAoIHRleHQgPT09IGxhc3RMb2dUZXh0ICYmIHR5cGUgPT09IGxhc3RMb2dUeXBlICkgewogICAgICAgICAgICBpZiAoIChEYXRlLm5vdygpIC0gbGFzdExvZ1RpbWUpIDwgNTAwMCApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGxhc3RMb2dUeXBlID0gdHlwZTsKICAgICAgICBsYXN0TG9nVGV4dCA9IHRleHQ7CiAgICAgICAgbGFzdExvZ1RpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgYmMgPSBuZXcgc2VsZi5Ccm9hZGNhc3RDaGFubmVsKHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQpOwogICAgICAgIGxldCBiY0J1ZmZlciA9IFtdOwogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJjQnVmZmVyLnB1c2goeyB0eXBlLCB0ZXh0IH0pOwogICAgICAgIH07CiAgICAgICAgYmMub25tZXNzYWdlID0gZXYgPT4gewogICAgICAgICAgICBjb25zdCBtc2cgPSBldi5kYXRhOwogICAgICAgICAgICBzd2l0Y2ggKCBtc2cgKSB7CiAgICAgICAgICAgIGNhc2UgJ2lhbXJlYWR5ISc6CiAgICAgICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBiY0J1ZmZlci5mb3JFYWNoKCh7IHR5cGUsIHRleHQgfSkgPT4KICAgICAgICAgICAgICAgICAgICBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYmNCdWZmZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb09uZSc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvVHdvJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGJjLnBvc3RNZXNzYWdlKCdhcmV5b3VyZWFkeT8nKTsKICAgIH0gY2F0Y2ggewogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHNhZmUubG9nKGB1Qk8gJHt0ZXh0fWApOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gc2FmZTsKfQpmdW5jdGlvbiBnZXRTYWZlQ29va2llVmFsdWVzRm4oKSB7CiAgICByZXR1cm4gWwogICAgICAgICdhY2NlcHQnLCAncmVqZWN0JywKICAgICAgICAnYWNjZXB0ZWQnLCAncmVqZWN0ZWQnLCAnbm90YWNjZXB0ZWQnLAogICAgICAgICdhbGxvdycsICdkaXNhbGxvdycsICdkZW55JywKICAgICAgICAnYWxsb3dlZCcsICdkZW5pZWQnLAogICAgICAgICdhcHByb3ZlZCcsICdkaXNhcHByb3ZlZCcsCiAgICAgICAgJ2NoZWNrZWQnLCAndW5jaGVja2VkJywKICAgICAgICAnZGlzbWlzcycsICdkaXNtaXNzZWQnLAogICAgICAgICdlbmFibGUnLCAnZGlzYWJsZScsCiAgICAgICAgJ2VuYWJsZWQnLCAnZGlzYWJsZWQnLAogICAgICAgICdlc3NlbnRpYWwnLCAnbm9uZXNzZW50aWFsJywKICAgICAgICAnZm9yYmlkZGVuJywgJ2ZvcmV2ZXInLAogICAgICAgICdoaWRlJywgJ2hpZGRlbicsCiAgICAgICAgJ25lY2Vzc2FyeScsICdyZXF1aXJlZCcsCiAgICAgICAgJ29rJywKICAgICAgICAnb24nLCAnb2ZmJywKICAgICAgICAndHJ1ZScsICd0JywgJ2ZhbHNlJywgJ2YnLAogICAgICAgICd5ZXMnLCAneScsICdubycsICduJywKICAgICAgICAnYWxsJywgJ25vbmUnLCAnZnVuY3Rpb25hbCcsCiAgICAgICAgJ2dyYW50ZWQnLCAnZG9uZScsCiAgICAgICAgJ2RlY2xpbmUnLCAnZGVjbGluZWQnLAogICAgICAgICdjbG9zZWQnLCAnbmV4dCcsICdtYW5kYXRvcnknLAogICAgICAgICdkaXNhZ3JlZScsICdhZ3JlZScsCiAgICBdOwp9CgogIChmdW5jdGlvbiBzZXRDb29raWUoCiAgICBuYW1lID0gJycsCiAgICB2YWx1ZSA9ICcnLAogICAgcGF0aCA9ICcnCikgewogICAgaWYgKCBuYW1lID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgnc2V0LWNvb2tpZScsIG5hbWUsIHZhbHVlLCBwYXRoKTsKICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgbWF0Y2ggPSAvXigiPykoLispXDEkLy5leGVjKG5vcm1hbGl6ZWQpOwogICAgY29uc3QgdW5xdW90ZWQgPSBtYXRjaCAmJiBtYXRjaFsyXSB8fCBub3JtYWxpemVkOwogICAgY29uc3QgdmFsaWRWYWx1ZXMgPSBnZXRTYWZlQ29va2llVmFsdWVzRm4oKTsKICAgIGlmICggdmFsaWRWYWx1ZXMuaW5jbHVkZXModW5xdW90ZWQpID09PSBmYWxzZSApIHsKICAgICAgICBpZiAoIC9eLT9cZCskLy50ZXN0KHVucXVvdGVkKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IG4gPSBwYXJzZUludCh2YWx1ZSwgMTApIHx8IDA7CiAgICAgICAgaWYgKCBuIDwgLTMyNzY3IHx8IG4gPiAzMjc2NyApIHsgcmV0dXJuOyB9CiAgICB9CgogICAgY29uc3QgZG9uZSA9IHNldENvb2tpZUZuKAogICAgICAgIGZhbHNlLAogICAgICAgIG5hbWUsCiAgICAgICAgdmFsdWUsCiAgICAgICAgJycsCiAgICAgICAgcGF0aCwKICAgICAgICBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDMpCiAgICApOwoKICAgIGlmICggZG9uZSApIHsKICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdEb25lJyk7CiAgICB9Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"set-cookie-reload.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCkgewogICAgcmV0dXJuIFsKICAgICAgICAnYWNjZXB0JywgJ3JlamVjdCcsCiAgICAgICAgJ2FjY2VwdGVkJywgJ3JlamVjdGVkJywgJ25vdGFjY2VwdGVkJywKICAgICAgICAnYWxsb3cnLCAnZGlzYWxsb3cnLCAnZGVueScsCiAgICAgICAgJ2FsbG93ZWQnLCAnZGVuaWVkJywKICAgICAgICAnYXBwcm92ZWQnLCAnZGlzYXBwcm92ZWQnLAogICAgICAgICdjaGVja2VkJywgJ3VuY2hlY2tlZCcsCiAgICAgICAgJ2Rpc21pc3MnLCAnZGlzbWlzc2VkJywKICAgICAgICAnZW5hYmxlJywgJ2Rpc2FibGUnLAogICAgICAgICdlbmFibGVkJywgJ2Rpc2FibGVkJywKICAgICAgICAnZXNzZW50aWFsJywgJ25vbmVzc2VudGlhbCcsCiAgICAgICAgJ2ZvcmJpZGRlbicsICdmb3JldmVyJywKICAgICAgICAnaGlkZScsICdoaWRkZW4nLAogICAgICAgICduZWNlc3NhcnknLCAncmVxdWlyZWQnLAogICAgICAgICdvaycsCiAgICAgICAgJ29uJywgJ29mZicsCiAgICAgICAgJ3RydWUnLCAndCcsICdmYWxzZScsICdmJywKICAgICAgICAneWVzJywgJ3knLCAnbm8nLCAnbicsCiAgICAgICAgJ2FsbCcsICdub25lJywgJ2Z1bmN0aW9uYWwnLAogICAgICAgICdncmFudGVkJywgJ2RvbmUnLAogICAgICAgICdkZWNsaW5lJywgJ2RlY2xpbmVkJywKICAgICAgICAnY2xvc2VkJywgJ25leHQnLCAnbWFuZGF0b3J5JywKICAgICAgICAnZGlzYWdyZWUnLCAnYWdyZWUnLAogICAgXTsKfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KZnVuY3Rpb24gc2V0Q29va2llRm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBuYW1lID0gJycsCiAgICB2YWx1ZSA9ICcnLAogICAgZXhwaXJlcyA9ICcnLAogICAgcGF0aCA9ICcnLAogICAgb3B0aW9ucyA9IHt9LAopIHsKICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjYxNiNzZWN0aW9uLTIuMgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3VCbG9ja09yaWdpbi91QmxvY2staXNzdWVzL2lzc3Vlcy8yNzc3CiAgICBpZiAoIHRydXN0ZWQgPT09IGZhbHNlICYmIC9bXiEjJCUmJyorXC0uMC05QS1aW1xdXl9gYS16fH5dLy50ZXN0KG5hbWUpICkgewogICAgICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7CiAgICB9CiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjEuMQogICAgLy8gVGhlIGNoYXJhY3RlcnMgWyIsXSBhcmUgZ2l2ZW4gYSBwYXNzIGZyb20gdGhlIFJGQyByZXF1aXJlbWVudHMgYmVjYXVzZQogICAgLy8gYXBwYXJlbnRseSBicm93c2VycyBkbyBub3QgZm9sbG93IHRoZSBSRkMgdG8gdGhlIGxldHRlci4KICAgIGlmICggL1teIC06PC1bXF0tfl0vLnRlc3QodmFsdWUpICkgewogICAgICAgIHZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKICAgIH0KCiAgICBjb25zdCBjb29raWVCZWZvcmUgPSBnZXRDb29raWVGbihuYW1lKTsKICAgIGlmICggY29va2llQmVmb3JlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kb250T3ZlcndyaXRlICkgeyByZXR1cm47IH0KICAgIGlmICggY29va2llQmVmb3JlID09PSB2YWx1ZSAmJiBvcHRpb25zLnJlbG9hZCApIHsgcmV0dXJuOyB9CgogICAgY29uc3QgY29va2llUGFydHMgPSBbIG5hbWUsICc9JywgdmFsdWUgXTsKICAgIGlmICggZXhwaXJlcyAhPT0gJycgKSB7CiAgICAgICAgY29va2llUGFydHMucHVzaCgnOyBleHBpcmVzPScsIGV4cGlyZXMpOwogICAgfQoKICAgIGlmICggcGF0aCA9PT0gJycgKSB7IHBhdGggPSAnLyc7IH0KICAgIGVsc2UgaWYgKCBwYXRoID09PSAnbm9uZScgKSB7IHBhdGggPSAnJzsgfQogICAgaWYgKCBwYXRoICE9PSAnJyAmJiBwYXRoICE9PSAnLycgKSB7IHJldHVybjsgfQogICAgaWYgKCBwYXRoID09PSAnLycgKSB7CiAgICAgICAgY29va2llUGFydHMucHVzaCgnOyBwYXRoPS8nKTsKICAgIH0KCiAgICBpZiAoIHRydXN0ZWQgKSB7CiAgICAgICAgaWYgKCBvcHRpb25zLmRvbWFpbiApIHsKICAgICAgICAgICAgbGV0IGRvbWFpbiA9IG9wdGlvbnMuZG9tYWluOwogICAgICAgICAgICBpZiAoIC9eXC8uK1wvLy50ZXN0KGRvbWFpbikgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBiYXNlVVJMID0gbmV3IFVSTChkb2N1bWVudC5iYXNlVVJJKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlRG9tYWluID0gbmV3IFJlZ0V4cChkb21haW4uc2xpY2UoMSwgLTEpKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVEb21haW4uZXhlYyhiYXNlVVJMLmhvc3RuYW1lKTsKICAgICAgICAgICAgICAgIGRvbWFpbiA9IG1hdGNoID8gbWF0Y2hbMF0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkb21haW4gKSB7CiAgICAgICAgICAgICAgICBjb29raWVQYXJ0cy5wdXNoKGA7IGRvbWFpbj0ke2RvbWFpbn1gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb29raWVQYXJ0cy5wdXNoKCc7IFNlY3VyZScpOwogICAgfSBlbHNlIGlmICggL15fXyhIb3N0fFNlY3VyZSktLy50ZXN0KG5hbWUpICkgewogICAgICAgIGNvb2tpZVBhcnRzLnB1c2goJzsgU2VjdXJlJyk7CiAgICB9CgogICAgdHJ5IHsKICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWVQYXJ0cy5qb2luKCcnKTsKICAgIH0gY2F0Y2ggewogICAgfQoKICAgIGNvbnN0IGRvbmUgPSBnZXRDb29raWVGbihuYW1lKSA9PT0gdmFsdWU7CiAgICBpZiAoIGRvbmUgJiYgb3B0aW9ucy5yZWxvYWQgKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQoKICAgIHJldHVybiBkb25lOwp9CmZ1bmN0aW9uIGdldENvb2tpZUZuKAogICAgbmFtZSA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBmb3IgKCBjb25zdCBzIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwoZG9jdW1lbnQuY29va2llLCAvXHMqO1xzKi8pICkgewogICAgICAgIGNvbnN0IHBvcyA9IHMuaW5kZXhPZignPScpOwogICAgICAgIGlmICggcG9zID09PSAtMSApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHMuc2xpY2UoMCwgcG9zKSAhPT0gbmFtZSApIHsgY29udGludWU7IH0KICAgICAgICByZXR1cm4gcy5zbGljZShwb3MrMSkudHJpbSgpOwogICAgfQp9CmZ1bmN0aW9uIHNldENvb2tpZSgKICAgIG5hbWUgPSAnJywKICAgIHZhbHVlID0gJycsCiAgICBwYXRoID0gJycKKSB7CiAgICBpZiAoIG5hbWUgPT09ICcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdzZXQtY29va2llJywgbmFtZSwgdmFsdWUsIHBhdGgpOwogICAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCBtYXRjaCA9IC9eKCI/KSguKylcMSQvLmV4ZWMobm9ybWFsaXplZCk7CiAgICBjb25zdCB1bnF1b3RlZCA9IG1hdGNoICYmIG1hdGNoWzJdIHx8IG5vcm1hbGl6ZWQ7CiAgICBjb25zdCB2YWxpZFZhbHVlcyA9IGdldFNhZmVDb29raWVWYWx1ZXNGbigpOwogICAgaWYgKCB2YWxpZFZhbHVlcy5pbmNsdWRlcyh1bnF1b3RlZCkgPT09IGZhbHNlICkgewogICAgICAgIGlmICggL14tP1xkKyQvLnRlc3QodW5xdW90ZWQpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KHZhbHVlLCAxMCkgfHwgMDsKICAgICAgICBpZiAoIG4gPCAtMzI3NjcgfHwgbiA+IDMyNzY3ICkgeyByZXR1cm47IH0KICAgIH0KCiAgICBjb25zdCBkb25lID0gc2V0Q29va2llRm4oCiAgICAgICAgZmFsc2UsCiAgICAgICAgbmFtZSwKICAgICAgICB2YWx1ZSwKICAgICAgICAnJywKICAgICAgICBwYXRoLAogICAgICAgIHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMykKICAgICk7CgogICAgaWYgKCBkb25lICkgewogICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0RvbmUnKTsKICAgIH0KfQoKICAoZnVuY3Rpb24gc2V0Q29va2llUmVsb2FkKG5hbWUsIHZhbHVlLCBwYXRoLCAuLi5hcmdzKSB7CiAgICBzZXRDb29raWUobmFtZSwgdmFsdWUsIHBhdGgsICdyZWxvYWQnLCAnMScsIC4uLmFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-set-cookie.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0Q29va2llRm4oCiAgICBuYW1lID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGZvciAoIGNvbnN0IHMgb2Ygc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChkb2N1bWVudC5jb29raWUsIC9ccyo7XHMqLykgKSB7CiAgICAgICAgY29uc3QgcG9zID0gcy5pbmRleE9mKCc9Jyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBjb250aW51ZTsgfQogICAgICAgIGlmICggcy5zbGljZSgwLCBwb3MpICE9PSBuYW1lICkgeyBjb250aW51ZTsgfQogICAgICAgIHJldHVybiBzLnNsaWNlKHBvcysxKS50cmltKCk7CiAgICB9Cn0KZnVuY3Rpb24gc2V0Q29va2llRm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBuYW1lID0gJycsCiAgICB2YWx1ZSA9ICcnLAogICAgZXhwaXJlcyA9ICcnLAogICAgcGF0aCA9ICcnLAogICAgb3B0aW9ucyA9IHt9LAopIHsKICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjYxNiNzZWN0aW9uLTIuMgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3VCbG9ja09yaWdpbi91QmxvY2staXNzdWVzL2lzc3Vlcy8yNzc3CiAgICBpZiAoIHRydXN0ZWQgPT09IGZhbHNlICYmIC9bXiEjJCUmJyorXC0uMC05QS1aW1xdXl9gYS16fH5dLy50ZXN0KG5hbWUpICkgewogICAgICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7CiAgICB9CiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjEuMQogICAgLy8gVGhlIGNoYXJhY3RlcnMgWyIsXSBhcmUgZ2l2ZW4gYSBwYXNzIGZyb20gdGhlIFJGQyByZXF1aXJlbWVudHMgYmVjYXVzZQogICAgLy8gYXBwYXJlbnRseSBicm93c2VycyBkbyBub3QgZm9sbG93IHRoZSBSRkMgdG8gdGhlIGxldHRlci4KICAgIGlmICggL1teIC06PC1bXF0tfl0vLnRlc3QodmFsdWUpICkgewogICAgICAgIHZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKICAgIH0KCiAgICBjb25zdCBjb29raWVCZWZvcmUgPSBnZXRDb29raWVGbihuYW1lKTsKICAgIGlmICggY29va2llQmVmb3JlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kb250T3ZlcndyaXRlICkgeyByZXR1cm47IH0KICAgIGlmICggY29va2llQmVmb3JlID09PSB2YWx1ZSAmJiBvcHRpb25zLnJlbG9hZCApIHsgcmV0dXJuOyB9CgogICAgY29uc3QgY29va2llUGFydHMgPSBbIG5hbWUsICc9JywgdmFsdWUgXTsKICAgIGlmICggZXhwaXJlcyAhPT0gJycgKSB7CiAgICAgICAgY29va2llUGFydHMucHVzaCgnOyBleHBpcmVzPScsIGV4cGlyZXMpOwogICAgfQoKICAgIGlmICggcGF0aCA9PT0gJycgKSB7IHBhdGggPSAnLyc7IH0KICAgIGVsc2UgaWYgKCBwYXRoID09PSAnbm9uZScgKSB7IHBhdGggPSAnJzsgfQogICAgaWYgKCBwYXRoICE9PSAnJyAmJiBwYXRoICE9PSAnLycgKSB7IHJldHVybjsgfQogICAgaWYgKCBwYXRoID09PSAnLycgKSB7CiAgICAgICAgY29va2llUGFydHMucHVzaCgnOyBwYXRoPS8nKTsKICAgIH0KCiAgICBpZiAoIHRydXN0ZWQgKSB7CiAgICAgICAgaWYgKCBvcHRpb25zLmRvbWFpbiApIHsKICAgICAgICAgICAgbGV0IGRvbWFpbiA9IG9wdGlvbnMuZG9tYWluOwogICAgICAgICAgICBpZiAoIC9eXC8uK1wvLy50ZXN0KGRvbWFpbikgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBiYXNlVVJMID0gbmV3IFVSTChkb2N1bWVudC5iYXNlVVJJKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlRG9tYWluID0gbmV3IFJlZ0V4cChkb21haW4uc2xpY2UoMSwgLTEpKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVEb21haW4uZXhlYyhiYXNlVVJMLmhvc3RuYW1lKTsKICAgICAgICAgICAgICAgIGRvbWFpbiA9IG1hdGNoID8gbWF0Y2hbMF0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkb21haW4gKSB7CiAgICAgICAgICAgICAgICBjb29raWVQYXJ0cy5wdXNoKGA7IGRvbWFpbj0ke2RvbWFpbn1gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb29raWVQYXJ0cy5wdXNoKCc7IFNlY3VyZScpOwogICAgfSBlbHNlIGlmICggL15fXyhIb3N0fFNlY3VyZSktLy50ZXN0KG5hbWUpICkgewogICAgICAgIGNvb2tpZVBhcnRzLnB1c2goJzsgU2VjdXJlJyk7CiAgICB9CgogICAgdHJ5IHsKICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWVQYXJ0cy5qb2luKCcnKTsKICAgIH0gY2F0Y2ggewogICAgfQoKICAgIGNvbnN0IGRvbmUgPSBnZXRDb29raWVGbihuYW1lKSA9PT0gdmFsdWU7CiAgICBpZiAoIGRvbmUgJiYgb3B0aW9ucy5yZWxvYWQgKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQoKICAgIHJldHVybiBkb25lOwp9CmZ1bmN0aW9uIHNhZmVTZWxmKCkgewogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmICkgewogICAgICAgIHJldHVybiBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmOwogICAgfQogICAgY29uc3Qgc2VsZiA9IGdsb2JhbFRoaXM7CiAgICBjb25zdCBzYWZlID0gewogICAgICAgICdBcnJheV9mcm9tJzogQXJyYXkuZnJvbSwKICAgICAgICAnRXJyb3InOiBzZWxmLkVycm9yLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZ0ZuJzogc2VsZi5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nJzogdGhpc0FyZyA9PiBzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nRm4uY2FsbCh0aGlzQXJnKSwKICAgICAgICAnTWF0aF9mbG9vcic6IE1hdGguZmxvb3IsCiAgICAgICAgJ01hdGhfbWF4JzogTWF0aC5tYXgsCiAgICAgICAgJ01hdGhfbWluJzogTWF0aC5taW4sCiAgICAgICAgJ01hdGhfcmFuZG9tJzogTWF0aC5yYW5kb20sCiAgICAgICAgJ09iamVjdCc6IE9iamVjdCwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnR5JzogT2JqZWN0LmRlZmluZVByb3BlcnR5LmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnRpZXMnOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9mcm9tRW50cmllcyc6IE9iamVjdC5mcm9tRW50cmllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2hhc093bic6IE9iamVjdC5oYXNPd24uYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfdG9TdHJpbmcnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdSZWdFeHAnOiBzZWxmLlJlZ0V4cCwKICAgICAgICAnUmVnRXhwX3Rlc3QnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUudGVzdCwKICAgICAgICAnUmVnRXhwX2V4ZWMnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUuZXhlYywKICAgICAgICAnUmVxdWVzdF9jbG9uZSc6IHNlbGYuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUsCiAgICAgICAgJ1N0cmluZyc6IHNlbGYuU3RyaW5nLAogICAgICAgICdTdHJpbmdfZnJvbUNoYXJDb2RlJzogU3RyaW5nLmZyb21DaGFyQ29kZSwKICAgICAgICAnU3RyaW5nX3NwbGl0JzogU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwKICAgICAgICAnWE1MSHR0cFJlcXVlc3QnOiBzZWxmLlhNTEh0dHBSZXF1ZXN0LAogICAgICAgICdhZGRFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciwKICAgICAgICAncmVtb3ZlRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ2ZldGNoJzogc2VsZi5mZXRjaCwKICAgICAgICAnSlNPTic6IHNlbGYuSlNPTiwKICAgICAgICAnSlNPTl9wYXJzZUZuJzogc2VsZi5KU09OLnBhcnNlLAogICAgICAgICdKU09OX3N0cmluZ2lmeUZuJzogc2VsZi5KU09OLnN0cmluZ2lmeSwKICAgICAgICAnSlNPTl9wYXJzZSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fcGFyc2VGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5JzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9zdHJpbmdpZnlGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ2xvZyc6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksCiAgICAgICAgLy8gUHJvcGVydGllcwogICAgICAgIGxvZ0xldmVsOiAwLAogICAgICAgIC8vIE1ldGhvZHMKICAgICAgICBtYWtlTG9nUHJlZml4KC4uLmFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyICYmIGBbJHthcmdzLmpvaW4oJyBcdTIwNUQgJyl9XWAgfHwgJyc7CiAgICAgICAgfSwKICAgICAgICB1Ym9Mb2coLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignaW5mbycsIC4uLmFyZ3MpOwogICAgICAgICAgICAKICAgICAgICB9LAogICAgICAgIHVib0VyciguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdlcnJvcicsIC4uLmFyZ3MpOwogICAgICAgIH0sCiAgICAgICAgZXNjYXBlUmVnZXhDaGFycyhzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpOwogICAgICAgIH0sCiAgICAgICAgaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXRjaEFsbDogdHJ1ZSwgZXhwZWN0OiB0cnVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZXhwZWN0ID0gKG9wdGlvbnMuY2FuTmVnYXRlICE9PSB0cnVlIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID09PSBmYWxzZSk7CiAgICAgICAgICAgIGlmICggZXhwZWN0ID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gfHwgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG9wdGlvbnMuZmxhZ3MgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsgcGF0dGVybiwgZXhwZWN0IH07CiAgICAgICAgfSwKICAgICAgICB0ZXN0UGF0dGVybihkZXRhaWxzLCBoYXlzdGFjaykgewogICAgICAgICAgICBpZiAoIGRldGFpbHMubWF0Y2hBbGwgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIGlmICggZGV0YWlscy5yZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJlZ0V4cF90ZXN0LmNhbGwoZGV0YWlscy5yZSwgaGF5c3RhY2spID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMoZGV0YWlscy5wYXR0ZXJuKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgfSwKICAgICAgICBwYXR0ZXJuVG9SZWdleChwYXR0ZXJuLCBmbGFncyA9IHVuZGVmaW5lZCwgdmVyYmF0aW0gPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgeyByZXR1cm4gL14vOyB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgewogICAgICAgICAgICAgICAgY29uc3QgcmVTdHIgPSB0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybik7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh2ZXJiYXRpbSA/IGBeJHtyZVN0cn0kYCA6IHJlU3RyLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gL14vOwogICAgICAgIH0sCiAgICAgICAgZ2V0RXh0cmFBcmdzKGFyZ3MsIG9mZnNldCA9IDApIHsKICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGFyZ3Muc2xpY2Uob2Zmc2V0KS5yZWR1Y2UoKG91dCwgdiwgaSwgYSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCAoaSAmIDEpID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gYVtpKzFdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gL15cZCskLy50ZXN0KHJhd1ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHJhd1ZhbHVlLCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgOiByYXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChbIGFbaV0sIHZhbHVlIF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5PYmplY3RfZnJvbUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUoZm4sIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICAgIH0sCiAgICAgICAgb2ZmSWRsZShpZCkgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbElkbGVDYWxsYmFjayhpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgIH0KICAgIH07CiAgICBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmID0gc2FmZTsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gc2FmZTsgfQogICAgLy8gVGhpcyBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGxvZ2dlciBpcyBvcGVuZWQKICAgIHNhZmUubG9nTGV2ZWwgPSBzY3JpcHRsZXRHbG9iYWxzLmxvZ0xldmVsIHx8IDE7CiAgICBsZXQgbGFzdExvZ1R5cGUgPSAnJzsKICAgIGxldCBsYXN0TG9nVGV4dCA9ICcnOwogICAgbGV0IGxhc3RMb2dUaW1lID0gMDsKICAgIHNhZmUudG9Mb2dUZXh0ID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0ZXh0ID0gYFske2RvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lIHx8IGRvY3VtZW50LmxvY2F0aW9uLmhyZWZ9XSR7YXJncy5qb2luKCcgJyl9YDsKICAgICAgICBpZiAoIHRleHQgPT09IGxhc3RMb2dUZXh0ICYmIHR5cGUgPT09IGxhc3RMb2dUeXBlICkgewogICAgICAgICAgICBpZiAoIChEYXRlLm5vdygpIC0gbGFzdExvZ1RpbWUpIDwgNTAwMCApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGxhc3RMb2dUeXBlID0gdHlwZTsKICAgICAgICBsYXN0TG9nVGV4dCA9IHRleHQ7CiAgICAgICAgbGFzdExvZ1RpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgYmMgPSBuZXcgc2VsZi5Ccm9hZGNhc3RDaGFubmVsKHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQpOwogICAgICAgIGxldCBiY0J1ZmZlciA9IFtdOwogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJjQnVmZmVyLnB1c2goeyB0eXBlLCB0ZXh0IH0pOwogICAgICAgIH07CiAgICAgICAgYmMub25tZXNzYWdlID0gZXYgPT4gewogICAgICAgICAgICBjb25zdCBtc2cgPSBldi5kYXRhOwogICAgICAgICAgICBzd2l0Y2ggKCBtc2cgKSB7CiAgICAgICAgICAgIGNhc2UgJ2lhbXJlYWR5ISc6CiAgICAgICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBiY0J1ZmZlci5mb3JFYWNoKCh7IHR5cGUsIHRleHQgfSkgPT4KICAgICAgICAgICAgICAgICAgICBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYmNCdWZmZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb09uZSc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvVHdvJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGJjLnBvc3RNZXNzYWdlKCdhcmV5b3VyZWFkeT8nKTsKICAgIH0gY2F0Y2ggewogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHNhZmUubG9nKGB1Qk8gJHt0ZXh0fWApOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gc2FmZTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZFNldENvb2tpZSgKICAgIG5hbWUgPSAnJywKICAgIHZhbHVlID0gJycsCiAgICBvZmZzZXRFeHBpcmVzU2VjID0gJycsCiAgICBwYXRoID0gJycKKSB7CiAgICBpZiAoIG5hbWUgPT09ICcnICkgeyByZXR1cm47IH0KCiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgnc2V0LWNvb2tpZScsIG5hbWUsIHZhbHVlLCBwYXRoKTsKICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZSgpOwoKICAgIGlmICggdmFsdWUuaW5jbHVkZXMoJyRub3ckJykgKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCckbm93JCcsIHRpbWUuZ2V0VGltZSgpKTsKICAgIH0KICAgIGlmICggdmFsdWUuaW5jbHVkZXMoJyRjdXJyZW50RGF0ZSQnKSApIHsKICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoJyRjdXJyZW50RGF0ZSQnLCB0aW1lLnRvVVRDU3RyaW5nKCkpOwogICAgfQogICAgaWYgKCB2YWx1ZS5pbmNsdWRlcygnJGN1cnJlbnRJU09EYXRlJCcpICkgewogICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnJGN1cnJlbnRJU09EYXRlJCcsIHRpbWUudG9JU09TdHJpbmcoKSk7CiAgICB9CgogICAgbGV0IGV4cGlyZXMgPSAnJzsKICAgIGlmICggb2Zmc2V0RXhwaXJlc1NlYyAhPT0gJycgKSB7CiAgICAgICAgaWYgKCBvZmZzZXRFeHBpcmVzU2VjID09PSAnMWRheScgKSB7CiAgICAgICAgICAgIHRpbWUuc2V0RGF0ZSh0aW1lLmdldERhdGUoKSArIDEpOwogICAgICAgIH0gZWxzZSBpZiAoIG9mZnNldEV4cGlyZXNTZWMgPT09ICcxeWVhcicgKSB7CiAgICAgICAgICAgIHRpbWUuc2V0RnVsbFllYXIodGltZS5nZXRGdWxsWWVhcigpICsgMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCAvXlxkKyQvLnRlc3Qob2Zmc2V0RXhwaXJlc1NlYykgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgdGltZS5zZXRTZWNvbmRzKHRpbWUuZ2V0U2Vjb25kcygpICsgcGFyc2VJbnQob2Zmc2V0RXhwaXJlc1NlYywgMTApKTsKICAgICAgICB9CiAgICAgICAgZXhwaXJlcyA9IHRpbWUudG9VVENTdHJpbmcoKTsKICAgIH0KCiAgICBjb25zdCBkb25lID0gc2V0Q29va2llRm4oCiAgICAgICAgdHJ1ZSwKICAgICAgICBuYW1lLAogICAgICAgIHZhbHVlLAogICAgICAgIGV4cGlyZXMsCiAgICAgICAgcGF0aCwKICAgICAgICBzYWZlU2VsZigpLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDQpCiAgICApOwoKICAgIGlmICggZG9uZSApIHsKICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdEb25lJyk7CiAgICB9Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"trusted-set-cookie-reload.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHNldENvb2tpZUZuKAogICAgdHJ1c3RlZCA9IGZhbHNlLAogICAgbmFtZSA9ICcnLAogICAgdmFsdWUgPSAnJywKICAgIGV4cGlyZXMgPSAnJywKICAgIHBhdGggPSAnJywKICAgIG9wdGlvbnMgPSB7fSwKKSB7CiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzI2MTYjc2VjdGlvbi0yLjIKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91QmxvY2tPcmlnaW4vdUJsb2NrLWlzc3Vlcy9pc3N1ZXMvMjc3NwogICAgaWYgKCB0cnVzdGVkID09PSBmYWxzZSAmJiAvW14hIyQlJicqK1wtLjAtOUEtWltcXV5fYGEtenx+XS8udGVzdChuYW1lKSApIHsKICAgICAgICBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpOwogICAgfQogICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNC4xLjEKICAgIC8vIFRoZSBjaGFyYWN0ZXJzIFsiLF0gYXJlIGdpdmVuIGEgcGFzcyBmcm9tIHRoZSBSRkMgcmVxdWlyZW1lbnRzIGJlY2F1c2UKICAgIC8vIGFwcGFyZW50bHkgYnJvd3NlcnMgZG8gbm90IGZvbGxvdyB0aGUgUkZDIHRvIHRoZSBsZXR0ZXIuCiAgICBpZiAoIC9bXiAtOjwtW1xdLX5dLy50ZXN0KHZhbHVlKSApIHsKICAgICAgICB2YWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CiAgICB9CgogICAgY29uc3QgY29va2llQmVmb3JlID0gZ2V0Q29va2llRm4obmFtZSk7CiAgICBpZiAoIGNvb2tpZUJlZm9yZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZG9udE92ZXJ3cml0ZSApIHsgcmV0dXJuOyB9CiAgICBpZiAoIGNvb2tpZUJlZm9yZSA9PT0gdmFsdWUgJiYgb3B0aW9ucy5yZWxvYWQgKSB7IHJldHVybjsgfQoKICAgIGNvbnN0IGNvb2tpZVBhcnRzID0gWyBuYW1lLCAnPScsIHZhbHVlIF07CiAgICBpZiAoIGV4cGlyZXMgIT09ICcnICkgewogICAgICAgIGNvb2tpZVBhcnRzLnB1c2goJzsgZXhwaXJlcz0nLCBleHBpcmVzKTsKICAgIH0KCiAgICBpZiAoIHBhdGggPT09ICcnICkgeyBwYXRoID0gJy8nOyB9CiAgICBlbHNlIGlmICggcGF0aCA9PT0gJ25vbmUnICkgeyBwYXRoID0gJyc7IH0KICAgIGlmICggcGF0aCAhPT0gJycgJiYgcGF0aCAhPT0gJy8nICkgeyByZXR1cm47IH0KICAgIGlmICggcGF0aCA9PT0gJy8nICkgewogICAgICAgIGNvb2tpZVBhcnRzLnB1c2goJzsgcGF0aD0vJyk7CiAgICB9CgogICAgaWYgKCB0cnVzdGVkICkgewogICAgICAgIGlmICggb3B0aW9ucy5kb21haW4gKSB7CiAgICAgICAgICAgIGxldCBkb21haW4gPSBvcHRpb25zLmRvbWFpbjsKICAgICAgICAgICAgaWYgKCAvXlwvLitcLy8udGVzdChkb21haW4pICkgewogICAgICAgICAgICAgICAgY29uc3QgYmFzZVVSTCA9IG5ldyBVUkwoZG9jdW1lbnQuYmFzZVVSSSk7CiAgICAgICAgICAgICAgICBjb25zdCByZURvbWFpbiA9IG5ldyBSZWdFeHAoZG9tYWluLnNsaWNlKDEsIC0xKSk7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHJlRG9tYWluLmV4ZWMoYmFzZVVSTC5ob3N0bmFtZSk7CiAgICAgICAgICAgICAgICBkb21haW4gPSBtYXRjaCA/IG1hdGNoWzBdIDogdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZG9tYWluICkgewogICAgICAgICAgICAgICAgY29va2llUGFydHMucHVzaChgOyBkb21haW49JHtkb21haW59YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29va2llUGFydHMucHVzaCgnOyBTZWN1cmUnKTsKICAgIH0gZWxzZSBpZiAoIC9eX18oSG9zdHxTZWN1cmUpLS8udGVzdChuYW1lKSApIHsKICAgICAgICBjb29raWVQYXJ0cy5wdXNoKCc7IFNlY3VyZScpOwogICAgfQoKICAgIHRyeSB7CiAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llUGFydHMuam9pbignJyk7CiAgICB9IGNhdGNoIHsKICAgIH0KCiAgICBjb25zdCBkb25lID0gZ2V0Q29va2llRm4obmFtZSkgPT09IHZhbHVlOwogICAgaWYgKCBkb25lICYmIG9wdGlvbnMucmVsb2FkICkgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgIH0KCiAgICByZXR1cm4gZG9uZTsKfQpmdW5jdGlvbiBnZXRDb29raWVGbigKICAgIG5hbWUgPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgZm9yICggY29uc3QgcyBvZiBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKGRvY3VtZW50LmNvb2tpZSwgL1xzKjtccyovKSApIHsKICAgICAgICBjb25zdCBwb3MgPSBzLmluZGV4T2YoJz0nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCBzLnNsaWNlKDAsIHBvcykgIT09IG5hbWUgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgcmV0dXJuIHMuc2xpY2UocG9zKzEpLnRyaW0oKTsKICAgIH0KfQpmdW5jdGlvbiB0cnVzdGVkU2V0Q29va2llKAogICAgbmFtZSA9ICcnLAogICAgdmFsdWUgPSAnJywKICAgIG9mZnNldEV4cGlyZXNTZWMgPSAnJywKICAgIHBhdGggPSAnJwopIHsKICAgIGlmICggbmFtZSA9PT0gJycgKSB7IHJldHVybjsgfQoKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdzZXQtY29va2llJywgbmFtZSwgdmFsdWUsIHBhdGgpOwogICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKCk7CgogICAgaWYgKCB2YWx1ZS5pbmNsdWRlcygnJG5vdyQnKSApIHsKICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoJyRub3ckJywgdGltZS5nZXRUaW1lKCkpOwogICAgfQogICAgaWYgKCB2YWx1ZS5pbmNsdWRlcygnJGN1cnJlbnREYXRlJCcpICkgewogICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnJGN1cnJlbnREYXRlJCcsIHRpbWUudG9VVENTdHJpbmcoKSk7CiAgICB9CiAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckY3VycmVudElTT0RhdGUkJykgKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCckY3VycmVudElTT0RhdGUkJywgdGltZS50b0lTT1N0cmluZygpKTsKICAgIH0KCiAgICBsZXQgZXhwaXJlcyA9ICcnOwogICAgaWYgKCBvZmZzZXRFeHBpcmVzU2VjICE9PSAnJyApIHsKICAgICAgICBpZiAoIG9mZnNldEV4cGlyZXNTZWMgPT09ICcxZGF5JyApIHsKICAgICAgICAgICAgdGltZS5zZXREYXRlKHRpbWUuZ2V0RGF0ZSgpICsgMSk7CiAgICAgICAgfSBlbHNlIGlmICggb2Zmc2V0RXhwaXJlc1NlYyA9PT0gJzF5ZWFyJyApIHsKICAgICAgICAgICAgdGltZS5zZXRGdWxsWWVhcih0aW1lLmdldEZ1bGxZZWFyKCkgKyAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIC9eXGQrJC8udGVzdChvZmZzZXRFeHBpcmVzU2VjKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgICAgICB0aW1lLnNldFNlY29uZHModGltZS5nZXRTZWNvbmRzKCkgKyBwYXJzZUludChvZmZzZXRFeHBpcmVzU2VjLCAxMCkpOwogICAgICAgIH0KICAgICAgICBleHBpcmVzID0gdGltZS50b1VUQ1N0cmluZygpOwogICAgfQoKICAgIGNvbnN0IGRvbmUgPSBzZXRDb29raWVGbigKICAgICAgICB0cnVlLAogICAgICAgIG5hbWUsCiAgICAgICAgdmFsdWUsCiAgICAgICAgZXhwaXJlcywKICAgICAgICBwYXRoLAogICAgICAgIHNhZmVTZWxmKCkuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgNCkKICAgICk7CgogICAgaWYgKCBkb25lICkgewogICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0RvbmUnKTsKICAgIH0KfQoKICAoZnVuY3Rpb24gdHJ1c3RlZFNldENvb2tpZVJlbG9hZChuYW1lLCB2YWx1ZSwgb2Zmc2V0RXhwaXJlc1NlYywgcGF0aCwgLi4uYXJncykgewogICAgdHJ1c3RlZFNldENvb2tpZShuYW1lLCB2YWx1ZSwgb2Zmc2V0RXhwaXJlc1NlYywgcGF0aCwgJ3JlbG9hZCcsICcxJywgLi4uYXJncyk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"remove-cookie.js","aliases":["cookie-remover.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiByZW1vdmVDb29raWUoCiAgICBuZWVkbGUgPSAnJwopIHsKICAgIGlmICggdHlwZW9mIG5lZWRsZSAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCByZU5hbWUgPSBzYWZlLnBhdHRlcm5Ub1JlZ2V4KG5lZWRsZSk7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDEpOwogICAgY29uc3QgdGhyb3R0bGUgPSAoZm4sIG1zID0gNTAwKSA9PiB7CiAgICAgICAgaWYgKCB0aHJvdHRsZS50aW1lciAhPT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICB0aHJvdHRsZS50aW1lciA9IHNldFRpbWVvdXQoKCApID0+IHsKICAgICAgICAgICAgdGhyb3R0bGUudGltZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGZuKCk7CiAgICAgICAgfSwgbXMpOwogICAgfTsKICAgIGNvbnN0IGJhc2VVUkwgPSBuZXcgVVJMKGRvY3VtZW50LmJhc2VVUkkpOwogICAgbGV0IHRhcmdldERvbWFpbiA9IGV4dHJhQXJncy5kb21haW47CiAgICBpZiAoIHRhcmdldERvbWFpbiAmJiAvXlwvLitcLy8udGVzdCh0YXJnZXREb21haW4pICkgewogICAgICAgIGNvbnN0IHJlRG9tYWluID0gbmV3IFJlZ0V4cCh0YXJnZXREb21haW4uc2xpY2UoMSwgLTEpKTsKICAgICAgICBjb25zdCBtYXRjaCA9IHJlRG9tYWluLmV4ZWMoYmFzZVVSTC5ob3N0bmFtZSk7CiAgICAgICAgdGFyZ2V0RG9tYWluID0gbWF0Y2ggPyBtYXRjaFswXSA6IHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IHJlbW92ZSA9ICggKSA9PiB7CiAgICAgICAgc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChkb2N1bWVudC5jb29raWUsICc7JykuZm9yRWFjaChjb29raWVTdHIgPT4gewogICAgICAgICAgICBjb25zdCBwb3MgPSBjb29raWVTdHIuaW5kZXhPZignPScpOwogICAgICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBjb29raWVOYW1lID0gY29va2llU3RyLnNsaWNlKDAsIHBvcykudHJpbSgpOwogICAgICAgICAgICBpZiAoIHJlTmFtZS50ZXN0KGNvb2tpZU5hbWUpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IHBhcnQxID0gY29va2llTmFtZSArICc9JzsKICAgICAgICAgICAgY29uc3QgcGFydDJhID0gYDsgZG9tYWluPSR7YmFzZVVSTC5ob3N0bmFtZX1gOwogICAgICAgICAgICBjb25zdCBwYXJ0MmIgPSBgOyBkb21haW49LiR7YmFzZVVSTC5ob3N0bmFtZX1gOwogICAgICAgICAgICBsZXQgcGFydDJjLCBwYXJ0MmQ7CiAgICAgICAgICAgIGlmICggdGFyZ2V0RG9tYWluICkgewogICAgICAgICAgICAgICAgcGFydDJjID0gYDsgZG9tYWluPSR7dGFyZ2V0RG9tYWlufWA7CiAgICAgICAgICAgICAgICBwYXJ0MmQgPSBgOyBkb21haW49LiR7dGFyZ2V0RG9tYWlufWA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIGRvY3VtZW50LmRvbWFpbiApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmRvbWFpbjsKICAgICAgICAgICAgICAgIGlmICggZG9tYWluICE9PSBiYXNlVVJMLmhvc3RuYW1lICkgewogICAgICAgICAgICAgICAgICAgIHBhcnQyYyA9IGA7IGRvbWFpbj0uJHtkb21haW59YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggZG9tYWluLnN0YXJ0c1dpdGgoJ3d3dy4nKSApIHsKICAgICAgICAgICAgICAgICAgICBwYXJ0MmQgPSBgOyBkb21haW49JHtkb21haW4ucmVwbGFjZSgnd3d3JywgJycpfWA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGFydDMgPSAnOyBwYXRoPS8nOwogICAgICAgICAgICBjb25zdCBwYXJ0NCA9ICc7IE1heC1BZ2U9LTEwMDA7IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQnOwogICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBwYXJ0MSArIHBhcnQ0OwogICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBwYXJ0MSArIHBhcnQyYSArIHBhcnQ0OwogICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBwYXJ0MSArIHBhcnQyYiArIHBhcnQ0OwogICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBwYXJ0MSArIHBhcnQzICsgcGFydDQ7CiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IHBhcnQxICsgcGFydDJhICsgcGFydDMgKyBwYXJ0NDsKICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gcGFydDEgKyBwYXJ0MmIgKyBwYXJ0MyArIHBhcnQ0OwogICAgICAgICAgICBpZiAoIHBhcnQyYyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gcGFydDEgKyBwYXJ0MmMgKyBwYXJ0MyArIHBhcnQ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggcGFydDJkICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBwYXJ0MSArIHBhcnQyZCArIHBhcnQzICsgcGFydDQ7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CiAgICByZW1vdmUoKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCByZW1vdmUpOwogICAgaWYgKCB0eXBlb2YgZXh0cmFBcmdzLndoZW4gIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHN1cHBvcnRlZEV2ZW50VHlwZXMgPSBbICdzY3JvbGwnLCAna2V5ZG93bicgXTsKICAgIGNvbnN0IGV2ZW50VHlwZXMgPSBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKGV4dHJhQXJncy53aGVuLCAvXHMvKTsKICAgIGZvciAoIGNvbnN0IHR5cGUgb2YgZXZlbnRUeXBlcyApIHsKICAgICAgICBpZiAoIHN1cHBvcnRlZEV2ZW50VHlwZXMuaW5jbHVkZXModHlwZSkgPT09IGZhbHNlICkgeyBjb250aW51ZTsgfQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgKCApID0+IHsKICAgICAgICAgICAgdGhyb3R0bGUocmVtb3ZlKTsKICAgICAgICB9LCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICB9Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"set-local-storage-item.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCkgewogICAgcmV0dXJuIFsKICAgICAgICAnYWNjZXB0JywgJ3JlamVjdCcsCiAgICAgICAgJ2FjY2VwdGVkJywgJ3JlamVjdGVkJywgJ25vdGFjY2VwdGVkJywKICAgICAgICAnYWxsb3cnLCAnZGlzYWxsb3cnLCAnZGVueScsCiAgICAgICAgJ2FsbG93ZWQnLCAnZGVuaWVkJywKICAgICAgICAnYXBwcm92ZWQnLCAnZGlzYXBwcm92ZWQnLAogICAgICAgICdjaGVja2VkJywgJ3VuY2hlY2tlZCcsCiAgICAgICAgJ2Rpc21pc3MnLCAnZGlzbWlzc2VkJywKICAgICAgICAnZW5hYmxlJywgJ2Rpc2FibGUnLAogICAgICAgICdlbmFibGVkJywgJ2Rpc2FibGVkJywKICAgICAgICAnZXNzZW50aWFsJywgJ25vbmVzc2VudGlhbCcsCiAgICAgICAgJ2ZvcmJpZGRlbicsICdmb3JldmVyJywKICAgICAgICAnaGlkZScsICdoaWRkZW4nLAogICAgICAgICduZWNlc3NhcnknLCAncmVxdWlyZWQnLAogICAgICAgICdvaycsCiAgICAgICAgJ29uJywgJ29mZicsCiAgICAgICAgJ3RydWUnLCAndCcsICdmYWxzZScsICdmJywKICAgICAgICAneWVzJywgJ3knLCAnbm8nLCAnbicsCiAgICAgICAgJ2FsbCcsICdub25lJywgJ2Z1bmN0aW9uYWwnLAogICAgICAgICdncmFudGVkJywgJ2RvbmUnLAogICAgICAgICdkZWNsaW5lJywgJ2RlY2xpbmVkJywKICAgICAgICAnY2xvc2VkJywgJ25leHQnLCAnbWFuZGF0b3J5JywKICAgICAgICAnZGlzYWdyZWUnLCAnYWdyZWUnLAogICAgXTsKfQpmdW5jdGlvbiBzZXRMb2NhbFN0b3JhZ2VJdGVtRm4oCiAgICB3aGljaCA9ICdsb2NhbCcsCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBrZXkgPSAnJywKICAgIHZhbHVlID0gJycsCiAgICBvcHRpb25zID0ge30KKSB7CiAgICBpZiAoIGtleSA9PT0gJycgKSB7IHJldHVybjsgfQoKICAgIC8vIEZvciBpbmNyZWFzZWQgY29tcGF0aWJpbGl0eSB3aXRoIEFkR3VhcmQKICAgIGlmICggdmFsdWUgPT09ICdlbXB0eUFycicgKSB7CiAgICAgICAgdmFsdWUgPSAnW10nOwogICAgfSBlbHNlIGlmICggdmFsdWUgPT09ICdlbXB0eU9iaicgKSB7CiAgICAgICAgdmFsdWUgPSAne30nOwogICAgfQoKICAgIGNvbnN0IHRydXN0ZWRWYWx1ZXMgPSBbCiAgICAgICAgJycsCiAgICAgICAgJ3VuZGVmaW5lZCcsICdudWxsJywKICAgICAgICAne30nLCAnW10nLCAnIiInLAogICAgICAgICckcmVtb3ZlJCcsCiAgICAgICAgLi4uZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCksCiAgICBdOwoKICAgIGlmICggdHJ1c3RlZCApIHsKICAgICAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckbm93JCcpICkgewogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoJyRub3ckJywgRGF0ZS5ub3coKSk7CiAgICAgICAgfQogICAgICAgIGlmICggdmFsdWUuaW5jbHVkZXMoJyRjdXJyZW50RGF0ZSQnKSApIHsKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCckY3VycmVudERhdGUkJywgYCR7RGF0ZSgpfWApOwogICAgICAgIH0KICAgICAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckY3VycmVudElTT0RhdGUkJykgKSB7CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnJGN1cnJlbnRJU09EYXRlJCcsIChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGNvbnN0IG1hdGNoID0gL14oIj8pKC4rKVwxJC8uZXhlYyhub3JtYWxpemVkKTsKICAgICAgICBjb25zdCB1bnF1b3RlZCA9IG1hdGNoICYmIG1hdGNoWzJdIHx8IG5vcm1hbGl6ZWQ7CiAgICAgICAgaWYgKCB0cnVzdGVkVmFsdWVzLmluY2x1ZGVzKHVucXVvdGVkKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIGlmICggL14tP1xkKyQvLnRlc3QodW5xdW90ZWQpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludCh1bnF1b3RlZCwgMTApIHx8IDA7CiAgICAgICAgICAgIGlmICggbiA8IC0zMjc2NyB8fCBuID4gMzI3NjcgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgIH0KCiAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTsKCiAgICB0cnkgewogICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBzZWxmW2Ake3doaWNofVN0b3JhZ2VgXTsKICAgICAgICBpZiAoIHZhbHVlID09PSAnJHJlbW92ZSQnICkgewogICAgICAgICAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHNhZmUucGF0dGVyblRvUmVnZXgoa2V5LCB1bmRlZmluZWQsIHRydWUgKTsKICAgICAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBbXTsKICAgICAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gc3RvcmFnZS5sZW5ndGg7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdG9yYWdlLmtleShpKTsKICAgICAgICAgICAgICAgIGlmICggcGF0dGVybi50ZXN0KGtleSkgKSB7IHRvUmVtb3ZlLnB1c2goa2V5KTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZGlmaWVkID0gdG9SZW1vdmUubGVuZ3RoICE9PSAwOwogICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgb2YgdG9SZW1vdmUgKSB7CiAgICAgICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSBgJHt2YWx1ZX1gOwogICAgICAgICAgICBtb2RpZmllZCA9IGFmdGVyICE9PSBiZWZvcmU7CiAgICAgICAgICAgIGlmICggbW9kaWZpZWQgKSB7CiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhZnRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGNhdGNoIHsKICAgIH0KCiAgICBpZiAoIG1vZGlmaWVkICYmIHR5cGVvZiBvcHRpb25zLnJlbG9hZCA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgc2V0VGltZW91dCgoICkgPT4geyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7IH0sIG9wdGlvbnMucmVsb2FkKTsKICAgIH0KfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KCiAgKGZ1bmN0aW9uIHNldExvY2FsU3RvcmFnZUl0ZW0oa2V5ID0gJycsIHZhbHVlID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3Qgb3B0aW9ucyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMikKICAgIHNldExvY2FsU3RvcmFnZUl0ZW1GbignbG9jYWwnLCBmYWxzZSwga2V5LCB2YWx1ZSwgb3B0aW9ucyk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"set-session-storage-item.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCkgewogICAgcmV0dXJuIFsKICAgICAgICAnYWNjZXB0JywgJ3JlamVjdCcsCiAgICAgICAgJ2FjY2VwdGVkJywgJ3JlamVjdGVkJywgJ25vdGFjY2VwdGVkJywKICAgICAgICAnYWxsb3cnLCAnZGlzYWxsb3cnLCAnZGVueScsCiAgICAgICAgJ2FsbG93ZWQnLCAnZGVuaWVkJywKICAgICAgICAnYXBwcm92ZWQnLCAnZGlzYXBwcm92ZWQnLAogICAgICAgICdjaGVja2VkJywgJ3VuY2hlY2tlZCcsCiAgICAgICAgJ2Rpc21pc3MnLCAnZGlzbWlzc2VkJywKICAgICAgICAnZW5hYmxlJywgJ2Rpc2FibGUnLAogICAgICAgICdlbmFibGVkJywgJ2Rpc2FibGVkJywKICAgICAgICAnZXNzZW50aWFsJywgJ25vbmVzc2VudGlhbCcsCiAgICAgICAgJ2ZvcmJpZGRlbicsICdmb3JldmVyJywKICAgICAgICAnaGlkZScsICdoaWRkZW4nLAogICAgICAgICduZWNlc3NhcnknLCAncmVxdWlyZWQnLAogICAgICAgICdvaycsCiAgICAgICAgJ29uJywgJ29mZicsCiAgICAgICAgJ3RydWUnLCAndCcsICdmYWxzZScsICdmJywKICAgICAgICAneWVzJywgJ3knLCAnbm8nLCAnbicsCiAgICAgICAgJ2FsbCcsICdub25lJywgJ2Z1bmN0aW9uYWwnLAogICAgICAgICdncmFudGVkJywgJ2RvbmUnLAogICAgICAgICdkZWNsaW5lJywgJ2RlY2xpbmVkJywKICAgICAgICAnY2xvc2VkJywgJ25leHQnLCAnbWFuZGF0b3J5JywKICAgICAgICAnZGlzYWdyZWUnLCAnYWdyZWUnLAogICAgXTsKfQpmdW5jdGlvbiBzZXRMb2NhbFN0b3JhZ2VJdGVtRm4oCiAgICB3aGljaCA9ICdsb2NhbCcsCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBrZXkgPSAnJywKICAgIHZhbHVlID0gJycsCiAgICBvcHRpb25zID0ge30KKSB7CiAgICBpZiAoIGtleSA9PT0gJycgKSB7IHJldHVybjsgfQoKICAgIC8vIEZvciBpbmNyZWFzZWQgY29tcGF0aWJpbGl0eSB3aXRoIEFkR3VhcmQKICAgIGlmICggdmFsdWUgPT09ICdlbXB0eUFycicgKSB7CiAgICAgICAgdmFsdWUgPSAnW10nOwogICAgfSBlbHNlIGlmICggdmFsdWUgPT09ICdlbXB0eU9iaicgKSB7CiAgICAgICAgdmFsdWUgPSAne30nOwogICAgfQoKICAgIGNvbnN0IHRydXN0ZWRWYWx1ZXMgPSBbCiAgICAgICAgJycsCiAgICAgICAgJ3VuZGVmaW5lZCcsICdudWxsJywKICAgICAgICAne30nLCAnW10nLCAnIiInLAogICAgICAgICckcmVtb3ZlJCcsCiAgICAgICAgLi4uZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCksCiAgICBdOwoKICAgIGlmICggdHJ1c3RlZCApIHsKICAgICAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckbm93JCcpICkgewogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoJyRub3ckJywgRGF0ZS5ub3coKSk7CiAgICAgICAgfQogICAgICAgIGlmICggdmFsdWUuaW5jbHVkZXMoJyRjdXJyZW50RGF0ZSQnKSApIHsKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCckY3VycmVudERhdGUkJywgYCR7RGF0ZSgpfWApOwogICAgICAgIH0KICAgICAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckY3VycmVudElTT0RhdGUkJykgKSB7CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnJGN1cnJlbnRJU09EYXRlJCcsIChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGNvbnN0IG1hdGNoID0gL14oIj8pKC4rKVwxJC8uZXhlYyhub3JtYWxpemVkKTsKICAgICAgICBjb25zdCB1bnF1b3RlZCA9IG1hdGNoICYmIG1hdGNoWzJdIHx8IG5vcm1hbGl6ZWQ7CiAgICAgICAgaWYgKCB0cnVzdGVkVmFsdWVzLmluY2x1ZGVzKHVucXVvdGVkKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIGlmICggL14tP1xkKyQvLnRlc3QodW5xdW90ZWQpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludCh1bnF1b3RlZCwgMTApIHx8IDA7CiAgICAgICAgICAgIGlmICggbiA8IC0zMjc2NyB8fCBuID4gMzI3NjcgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgIH0KCiAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTsKCiAgICB0cnkgewogICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBzZWxmW2Ake3doaWNofVN0b3JhZ2VgXTsKICAgICAgICBpZiAoIHZhbHVlID09PSAnJHJlbW92ZSQnICkgewogICAgICAgICAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHNhZmUucGF0dGVyblRvUmVnZXgoa2V5LCB1bmRlZmluZWQsIHRydWUgKTsKICAgICAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBbXTsKICAgICAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gc3RvcmFnZS5sZW5ndGg7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdG9yYWdlLmtleShpKTsKICAgICAgICAgICAgICAgIGlmICggcGF0dGVybi50ZXN0KGtleSkgKSB7IHRvUmVtb3ZlLnB1c2goa2V5KTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZGlmaWVkID0gdG9SZW1vdmUubGVuZ3RoICE9PSAwOwogICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgb2YgdG9SZW1vdmUgKSB7CiAgICAgICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSBgJHt2YWx1ZX1gOwogICAgICAgICAgICBtb2RpZmllZCA9IGFmdGVyICE9PSBiZWZvcmU7CiAgICAgICAgICAgIGlmICggbW9kaWZpZWQgKSB7CiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhZnRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGNhdGNoIHsKICAgIH0KCiAgICBpZiAoIG1vZGlmaWVkICYmIHR5cGVvZiBvcHRpb25zLnJlbG9hZCA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgc2V0VGltZW91dCgoICkgPT4geyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7IH0sIG9wdGlvbnMucmVsb2FkKTsKICAgIH0KfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KCiAgKGZ1bmN0aW9uIHNldFNlc3Npb25TdG9yYWdlSXRlbShrZXkgPSAnJywgdmFsdWUgPSAnJykgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBvcHRpb25zID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAyKQogICAgc2V0TG9jYWxTdG9yYWdlSXRlbUZuKCdzZXNzaW9uJywgZmFsc2UsIGtleSwgdmFsdWUsIG9wdGlvbnMpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-set-local-storage-item.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCkgewogICAgcmV0dXJuIFsKICAgICAgICAnYWNjZXB0JywgJ3JlamVjdCcsCiAgICAgICAgJ2FjY2VwdGVkJywgJ3JlamVjdGVkJywgJ25vdGFjY2VwdGVkJywKICAgICAgICAnYWxsb3cnLCAnZGlzYWxsb3cnLCAnZGVueScsCiAgICAgICAgJ2FsbG93ZWQnLCAnZGVuaWVkJywKICAgICAgICAnYXBwcm92ZWQnLCAnZGlzYXBwcm92ZWQnLAogICAgICAgICdjaGVja2VkJywgJ3VuY2hlY2tlZCcsCiAgICAgICAgJ2Rpc21pc3MnLCAnZGlzbWlzc2VkJywKICAgICAgICAnZW5hYmxlJywgJ2Rpc2FibGUnLAogICAgICAgICdlbmFibGVkJywgJ2Rpc2FibGVkJywKICAgICAgICAnZXNzZW50aWFsJywgJ25vbmVzc2VudGlhbCcsCiAgICAgICAgJ2ZvcmJpZGRlbicsICdmb3JldmVyJywKICAgICAgICAnaGlkZScsICdoaWRkZW4nLAogICAgICAgICduZWNlc3NhcnknLCAncmVxdWlyZWQnLAogICAgICAgICdvaycsCiAgICAgICAgJ29uJywgJ29mZicsCiAgICAgICAgJ3RydWUnLCAndCcsICdmYWxzZScsICdmJywKICAgICAgICAneWVzJywgJ3knLCAnbm8nLCAnbicsCiAgICAgICAgJ2FsbCcsICdub25lJywgJ2Z1bmN0aW9uYWwnLAogICAgICAgICdncmFudGVkJywgJ2RvbmUnLAogICAgICAgICdkZWNsaW5lJywgJ2RlY2xpbmVkJywKICAgICAgICAnY2xvc2VkJywgJ25leHQnLCAnbWFuZGF0b3J5JywKICAgICAgICAnZGlzYWdyZWUnLCAnYWdyZWUnLAogICAgXTsKfQpmdW5jdGlvbiBzZXRMb2NhbFN0b3JhZ2VJdGVtRm4oCiAgICB3aGljaCA9ICdsb2NhbCcsCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBrZXkgPSAnJywKICAgIHZhbHVlID0gJycsCiAgICBvcHRpb25zID0ge30KKSB7CiAgICBpZiAoIGtleSA9PT0gJycgKSB7IHJldHVybjsgfQoKICAgIC8vIEZvciBpbmNyZWFzZWQgY29tcGF0aWJpbGl0eSB3aXRoIEFkR3VhcmQKICAgIGlmICggdmFsdWUgPT09ICdlbXB0eUFycicgKSB7CiAgICAgICAgdmFsdWUgPSAnW10nOwogICAgfSBlbHNlIGlmICggdmFsdWUgPT09ICdlbXB0eU9iaicgKSB7CiAgICAgICAgdmFsdWUgPSAne30nOwogICAgfQoKICAgIGNvbnN0IHRydXN0ZWRWYWx1ZXMgPSBbCiAgICAgICAgJycsCiAgICAgICAgJ3VuZGVmaW5lZCcsICdudWxsJywKICAgICAgICAne30nLCAnW10nLCAnIiInLAogICAgICAgICckcmVtb3ZlJCcsCiAgICAgICAgLi4uZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCksCiAgICBdOwoKICAgIGlmICggdHJ1c3RlZCApIHsKICAgICAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckbm93JCcpICkgewogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoJyRub3ckJywgRGF0ZS5ub3coKSk7CiAgICAgICAgfQogICAgICAgIGlmICggdmFsdWUuaW5jbHVkZXMoJyRjdXJyZW50RGF0ZSQnKSApIHsKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCckY3VycmVudERhdGUkJywgYCR7RGF0ZSgpfWApOwogICAgICAgIH0KICAgICAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckY3VycmVudElTT0RhdGUkJykgKSB7CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnJGN1cnJlbnRJU09EYXRlJCcsIChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGNvbnN0IG1hdGNoID0gL14oIj8pKC4rKVwxJC8uZXhlYyhub3JtYWxpemVkKTsKICAgICAgICBjb25zdCB1bnF1b3RlZCA9IG1hdGNoICYmIG1hdGNoWzJdIHx8IG5vcm1hbGl6ZWQ7CiAgICAgICAgaWYgKCB0cnVzdGVkVmFsdWVzLmluY2x1ZGVzKHVucXVvdGVkKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIGlmICggL14tP1xkKyQvLnRlc3QodW5xdW90ZWQpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludCh1bnF1b3RlZCwgMTApIHx8IDA7CiAgICAgICAgICAgIGlmICggbiA8IC0zMjc2NyB8fCBuID4gMzI3NjcgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgIH0KCiAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTsKCiAgICB0cnkgewogICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBzZWxmW2Ake3doaWNofVN0b3JhZ2VgXTsKICAgICAgICBpZiAoIHZhbHVlID09PSAnJHJlbW92ZSQnICkgewogICAgICAgICAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHNhZmUucGF0dGVyblRvUmVnZXgoa2V5LCB1bmRlZmluZWQsIHRydWUgKTsKICAgICAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBbXTsKICAgICAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gc3RvcmFnZS5sZW5ndGg7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdG9yYWdlLmtleShpKTsKICAgICAgICAgICAgICAgIGlmICggcGF0dGVybi50ZXN0KGtleSkgKSB7IHRvUmVtb3ZlLnB1c2goa2V5KTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZGlmaWVkID0gdG9SZW1vdmUubGVuZ3RoICE9PSAwOwogICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgb2YgdG9SZW1vdmUgKSB7CiAgICAgICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSBgJHt2YWx1ZX1gOwogICAgICAgICAgICBtb2RpZmllZCA9IGFmdGVyICE9PSBiZWZvcmU7CiAgICAgICAgICAgIGlmICggbW9kaWZpZWQgKSB7CiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhZnRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGNhdGNoIHsKICAgIH0KCiAgICBpZiAoIG1vZGlmaWVkICYmIHR5cGVvZiBvcHRpb25zLnJlbG9hZCA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgc2V0VGltZW91dCgoICkgPT4geyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7IH0sIG9wdGlvbnMucmVsb2FkKTsKICAgIH0KfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRTZXRMb2NhbFN0b3JhZ2VJdGVtKGtleSA9ICcnLCB2YWx1ZSA9ICcnKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG9wdGlvbnMgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDIpCiAgICBzZXRMb2NhbFN0b3JhZ2VJdGVtRm4oJ2xvY2FsJywgdHJ1ZSwga2V5LCB2YWx1ZSwgb3B0aW9ucyk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"trusted-set-session-storage-item.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCkgewogICAgcmV0dXJuIFsKICAgICAgICAnYWNjZXB0JywgJ3JlamVjdCcsCiAgICAgICAgJ2FjY2VwdGVkJywgJ3JlamVjdGVkJywgJ25vdGFjY2VwdGVkJywKICAgICAgICAnYWxsb3cnLCAnZGlzYWxsb3cnLCAnZGVueScsCiAgICAgICAgJ2FsbG93ZWQnLCAnZGVuaWVkJywKICAgICAgICAnYXBwcm92ZWQnLCAnZGlzYXBwcm92ZWQnLAogICAgICAgICdjaGVja2VkJywgJ3VuY2hlY2tlZCcsCiAgICAgICAgJ2Rpc21pc3MnLCAnZGlzbWlzc2VkJywKICAgICAgICAnZW5hYmxlJywgJ2Rpc2FibGUnLAogICAgICAgICdlbmFibGVkJywgJ2Rpc2FibGVkJywKICAgICAgICAnZXNzZW50aWFsJywgJ25vbmVzc2VudGlhbCcsCiAgICAgICAgJ2ZvcmJpZGRlbicsICdmb3JldmVyJywKICAgICAgICAnaGlkZScsICdoaWRkZW4nLAogICAgICAgICduZWNlc3NhcnknLCAncmVxdWlyZWQnLAogICAgICAgICdvaycsCiAgICAgICAgJ29uJywgJ29mZicsCiAgICAgICAgJ3RydWUnLCAndCcsICdmYWxzZScsICdmJywKICAgICAgICAneWVzJywgJ3knLCAnbm8nLCAnbicsCiAgICAgICAgJ2FsbCcsICdub25lJywgJ2Z1bmN0aW9uYWwnLAogICAgICAgICdncmFudGVkJywgJ2RvbmUnLAogICAgICAgICdkZWNsaW5lJywgJ2RlY2xpbmVkJywKICAgICAgICAnY2xvc2VkJywgJ25leHQnLCAnbWFuZGF0b3J5JywKICAgICAgICAnZGlzYWdyZWUnLCAnYWdyZWUnLAogICAgXTsKfQpmdW5jdGlvbiBzZXRMb2NhbFN0b3JhZ2VJdGVtRm4oCiAgICB3aGljaCA9ICdsb2NhbCcsCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBrZXkgPSAnJywKICAgIHZhbHVlID0gJycsCiAgICBvcHRpb25zID0ge30KKSB7CiAgICBpZiAoIGtleSA9PT0gJycgKSB7IHJldHVybjsgfQoKICAgIC8vIEZvciBpbmNyZWFzZWQgY29tcGF0aWJpbGl0eSB3aXRoIEFkR3VhcmQKICAgIGlmICggdmFsdWUgPT09ICdlbXB0eUFycicgKSB7CiAgICAgICAgdmFsdWUgPSAnW10nOwogICAgfSBlbHNlIGlmICggdmFsdWUgPT09ICdlbXB0eU9iaicgKSB7CiAgICAgICAgdmFsdWUgPSAne30nOwogICAgfQoKICAgIGNvbnN0IHRydXN0ZWRWYWx1ZXMgPSBbCiAgICAgICAgJycsCiAgICAgICAgJ3VuZGVmaW5lZCcsICdudWxsJywKICAgICAgICAne30nLCAnW10nLCAnIiInLAogICAgICAgICckcmVtb3ZlJCcsCiAgICAgICAgLi4uZ2V0U2FmZUNvb2tpZVZhbHVlc0ZuKCksCiAgICBdOwoKICAgIGlmICggdHJ1c3RlZCApIHsKICAgICAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckbm93JCcpICkgewogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoJyRub3ckJywgRGF0ZS5ub3coKSk7CiAgICAgICAgfQogICAgICAgIGlmICggdmFsdWUuaW5jbHVkZXMoJyRjdXJyZW50RGF0ZSQnKSApIHsKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCckY3VycmVudERhdGUkJywgYCR7RGF0ZSgpfWApOwogICAgICAgIH0KICAgICAgICBpZiAoIHZhbHVlLmluY2x1ZGVzKCckY3VycmVudElTT0RhdGUkJykgKSB7CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnJGN1cnJlbnRJU09EYXRlJCcsIChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGNvbnN0IG1hdGNoID0gL14oIj8pKC4rKVwxJC8uZXhlYyhub3JtYWxpemVkKTsKICAgICAgICBjb25zdCB1bnF1b3RlZCA9IG1hdGNoICYmIG1hdGNoWzJdIHx8IG5vcm1hbGl6ZWQ7CiAgICAgICAgaWYgKCB0cnVzdGVkVmFsdWVzLmluY2x1ZGVzKHVucXVvdGVkKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIGlmICggL14tP1xkKyQvLnRlc3QodW5xdW90ZWQpID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludCh1bnF1b3RlZCwgMTApIHx8IDA7CiAgICAgICAgICAgIGlmICggbiA8IC0zMjc2NyB8fCBuID4gMzI3NjcgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgIH0KCiAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTsKCiAgICB0cnkgewogICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBzZWxmW2Ake3doaWNofVN0b3JhZ2VgXTsKICAgICAgICBpZiAoIHZhbHVlID09PSAnJHJlbW92ZSQnICkgewogICAgICAgICAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHNhZmUucGF0dGVyblRvUmVnZXgoa2V5LCB1bmRlZmluZWQsIHRydWUgKTsKICAgICAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBbXTsKICAgICAgICAgICAgZm9yICggbGV0IGkgPSAwLCBuID0gc3RvcmFnZS5sZW5ndGg7IGkgPCBuOyBpKysgKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdG9yYWdlLmtleShpKTsKICAgICAgICAgICAgICAgIGlmICggcGF0dGVybi50ZXN0KGtleSkgKSB7IHRvUmVtb3ZlLnB1c2goa2V5KTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZGlmaWVkID0gdG9SZW1vdmUubGVuZ3RoICE9PSAwOwogICAgICAgICAgICBmb3IgKCBjb25zdCBrZXkgb2YgdG9SZW1vdmUgKSB7CiAgICAgICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSBgJHt2YWx1ZX1gOwogICAgICAgICAgICBtb2RpZmllZCA9IGFmdGVyICE9PSBiZWZvcmU7CiAgICAgICAgICAgIGlmICggbW9kaWZpZWQgKSB7CiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhZnRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGNhdGNoIHsKICAgIH0KCiAgICBpZiAoIG1vZGlmaWVkICYmIHR5cGVvZiBvcHRpb25zLnJlbG9hZCA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgc2V0VGltZW91dCgoICkgPT4geyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7IH0sIG9wdGlvbnMucmVsb2FkKTsKICAgIH0KfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRTZXRTZXNzaW9uU3RvcmFnZUl0ZW0oa2V5ID0gJycsIHZhbHVlID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3Qgb3B0aW9ucyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMikKICAgIHNldExvY2FsU3RvcmFnZUl0ZW1Gbignc2Vzc2lvbicsIHRydWUsIGtleSwgdmFsdWUsIG9wdGlvbnMpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"abort-current-script.js","aliases":["acs.js","abort-current-inline-script.js","acis.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBzaG91bGREZWJ1ZyhkZXRhaWxzKSB7CiAgICBpZiAoIGRldGFpbHMgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm4gZmFsc2U7IH0KICAgIHJldHVybiBzY3JpcHRsZXRHbG9iYWxzLmNhbkRlYnVnICYmIGRldGFpbHMuZGVidWc7Cn0KZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIGdldEV4Y2VwdGlvblRva2VuRm4oKSB7CiAgICBjb25zdCB0b2tlbiA9IGdldFJhbmRvbVRva2VuRm4oKTsKICAgIGNvbnN0IG9lID0gc2VsZi5vbmVycm9yOwogICAgc2VsZi5vbmVycm9yID0gZnVuY3Rpb24obXNnLCAuLi5hcmdzKSB7CiAgICAgICAgaWYgKCB0eXBlb2YgbXNnID09PSAnc3RyaW5nJyAmJiBtc2cuaW5jbHVkZXModG9rZW4pICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgIGlmICggb2UgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHsKICAgICAgICAgICAgcmV0dXJuIG9lLmNhbGwodGhpcywgbXNnLCAuLi5hcmdzKTsKICAgICAgICB9CiAgICB9LmJpbmQoKTsKICAgIHJldHVybiB0b2tlbjsKfQpmdW5jdGlvbiBydW5BdEh0bWxFbGVtZW50Rm4oZm4pIHsKICAgIGlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewogICAgICAgIGZuKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoICkgPT4gewogICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICBmbigpOwogICAgfSk7CiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTsKfQpmdW5jdGlvbiBhYm9ydEN1cnJlbnRTY3JpcHRGbigKICAgIHRhcmdldCA9ICcnLAogICAgbmVlZGxlID0gJycsCiAgICBjb250ZXh0ID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiB0YXJnZXQgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGlmICggdGFyZ2V0ID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgnYWJvcnQtY3VycmVudC1zY3JpcHQnLCB0YXJnZXQsIG5lZWRsZSwgY29udGV4dCk7CiAgICBjb25zdCByZU5lZWRsZSA9IHNhZmUucGF0dGVyblRvUmVnZXgobmVlZGxlKTsKICAgIGNvbnN0IHJlQ29udGV4dCA9IHNhZmUucGF0dGVyblRvUmVnZXgoY29udGV4dCk7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDMpOwogICAgY29uc3QgdGhpc1NjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ7CiAgICBjb25zdCBjaGFpbiA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwodGFyZ2V0LCAnLicpOwogICAgbGV0IG93bmVyID0gd2luZG93OwogICAgbGV0IHByb3A7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgcHJvcCA9IGNoYWluLnNoaWZ0KCk7CiAgICAgICAgaWYgKCBjaGFpbi5sZW5ndGggPT09IDAgKSB7IGJyZWFrOyB9CiAgICAgICAgaWYgKCBwcm9wIGluIG93bmVyID09PSBmYWxzZSApIHsgYnJlYWs7IH0KICAgICAgICBvd25lciA9IG93bmVyW3Byb3BdOwogICAgICAgIGlmICggb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgIH0KICAgIGxldCB2YWx1ZTsKICAgIGxldCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvd25lciwgcHJvcCk7CiAgICBpZiAoCiAgICAgICAgZGVzYyBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgfHwKICAgICAgICBkZXNjLmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uID09PSBmYWxzZQogICAgKSB7CiAgICAgICAgdmFsdWUgPSBvd25lcltwcm9wXTsKICAgICAgICBkZXNjID0gdW5kZWZpbmVkOwogICAgfQogICAgY29uc3QgZGVidWcgPSBzaG91bGREZWJ1ZyhleHRyYUFyZ3MpOwogICAgY29uc3QgZXhjZXB0aW9uVG9rZW4gPSBnZXRFeGNlcHRpb25Ub2tlbkZuKCk7CiAgICBjb25zdCBzY3JpcHRUZXh0cyA9IG5ldyBXZWFrTWFwKCk7CiAgICBjb25zdCB0ZXh0Q29udGVudEdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsICd0ZXh0Q29udGVudCcpLmdldDsKICAgIGNvbnN0IGdldFNjcmlwdFRleHQgPSBlbGVtID0+IHsKICAgICAgICBsZXQgdGV4dCA9IHRleHRDb250ZW50R2V0dGVyLmNhbGwoZWxlbSk7CiAgICAgICAgaWYgKCB0ZXh0LnRyaW0oKSAhPT0gJycgKSB7IHJldHVybiB0ZXh0OyB9CiAgICAgICAgaWYgKCBzY3JpcHRUZXh0cy5oYXMoZWxlbSkgKSB7IHJldHVybiBzY3JpcHRUZXh0cy5nZXQoZWxlbSk7IH0KICAgICAgICBjb25zdCBbICwgbWltZSwgY29udGVudCBdID0KICAgICAgICAgICAgL15kYXRhOihbXixdKiksKC4rKSQvLmV4ZWMoZWxlbS5zcmMudHJpbSgpKSB8fAogICAgICAgICAgICBbICcnLCAnJywgJycgXTsKICAgICAgICB0cnkgewogICAgICAgICAgICBzd2l0Y2ggKCB0cnVlICkgewogICAgICAgICAgICBjYXNlIG1pbWUuZW5kc1dpdGgoJztiYXNlNjQnKToKICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLmF0b2IoY29udGVudCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLmRlY29kZVVSSUNvbXBvbmVudChjb250ZW50KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIHNjcmlwdFRleHRzLnNldChlbGVtLCB0ZXh0KTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICBjb25zdCB2YWxpZGF0ZSA9ICggKSA9PiB7CiAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ7CiAgICAgICAgaWYgKCBlIGluc3RhbmNlb2YgSFRNTFNjcmlwdEVsZW1lbnQgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIGUgPT09IHRoaXNTY3JpcHQgKSB7IHJldHVybjsgfQogICAgICAgIGlmICggY29udGV4dCAhPT0gJycgJiYgcmVDb250ZXh0LnRlc3QoZS5zcmMpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyCiAgICAgICAgICAgIGlmICggZGVidWcgPT09ICdub21hdGNoJyB8fCBkZWJ1ZyA9PT0gJ2FsbCcgKSB7IGRlYnVnZ2VyOyB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsID4gMSAmJiBjb250ZXh0ICE9PSAnJyApIHsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgTWF0Y2hlZCBzcmNcbiR7ZS5zcmN9YCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNjcmlwdFRleHQgPSBnZXRTY3JpcHRUZXh0KGUpOwogICAgICAgIGlmICggcmVOZWVkbGUudGVzdChzY3JpcHRUZXh0KSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlcgogICAgICAgICAgICBpZiAoIGRlYnVnID09PSAnbm9tYXRjaCcgfHwgZGVidWcgPT09ICdhbGwnICkgeyBkZWJ1Z2dlcjsgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYE1hdGNoZWQgdGV4dFxuJHtzY3JpcHRUZXh0fWApOwogICAgICAgIH0KICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIKICAgICAgICBpZiAoIGRlYnVnID09PSAnbWF0Y2gnIHx8IGRlYnVnID09PSAnYWxsJyApIHsgZGVidWdnZXI7IH0KICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdBYm9ydGVkJyk7CiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGV4Y2VwdGlvblRva2VuKTsKICAgIH07CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIKICAgIGlmICggZGVidWcgPT09ICdpbnN0YWxsJyApIHsgZGVidWdnZXI7IH0KICAgIHRyeSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG93bmVyLCBwcm9wLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MgaW5zdGFuY2VvZiBPYmplY3QKICAgICAgICAgICAgICAgICAgICA/IGRlc2MuZ2V0LmNhbGwob3duZXIpCiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgaWYgKCBkZXNjIGluc3RhbmNlb2YgT2JqZWN0ICkgewogICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0LmNhbGwob3duZXIsIGEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0gY2F0Y2goZXgpIHsKICAgICAgICBzYWZlLnVib0Vycihsb2dQcmVmaXgsIGBFcnJvcjogJHtleH1gKTsKICAgIH0KfQoKICAoZnVuY3Rpb24gYWJvcnRDdXJyZW50U2NyaXB0KC4uLmFyZ3MpIHsKICAgIHJ1bkF0SHRtbEVsZW1lbnRGbigoICkgPT4gewogICAgICAgIGFib3J0Q3VycmVudFNjcmlwdEZuKC4uLmFyZ3MpOwogICAgfSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"abort-on-property-read.js","aliases":["aopr.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KZnVuY3Rpb24gZ2V0RXhjZXB0aW9uVG9rZW5GbigpIHsKICAgIGNvbnN0IHRva2VuID0gZ2V0UmFuZG9tVG9rZW5GbigpOwogICAgY29uc3Qgb2UgPSBzZWxmLm9uZXJyb3I7CiAgICBzZWxmLm9uZXJyb3IgPSBmdW5jdGlvbihtc2csIC4uLmFyZ3MpIHsKICAgICAgICBpZiAoIHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnICYmIG1zZy5pbmNsdWRlcyh0b2tlbikgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgaWYgKCBvZSBpbnN0YW5jZW9mIEZ1bmN0aW9uICkgewogICAgICAgICAgICByZXR1cm4gb2UuY2FsbCh0aGlzLCBtc2csIC4uLmFyZ3MpOwogICAgICAgIH0KICAgIH0uYmluZCgpOwogICAgcmV0dXJuIHRva2VuOwp9CgogIChmdW5jdGlvbiBhYm9ydE9uUHJvcGVydHlSZWFkKAogICAgY2hhaW4gPSAnJwopIHsKICAgIGlmICggdHlwZW9mIGNoYWluICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICBpZiAoIGNoYWluID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgnYWJvcnQtb24tcHJvcGVydHktcmVhZCcsIGNoYWluKTsKICAgIGNvbnN0IGV4Y2VwdGlvblRva2VuID0gZ2V0RXhjZXB0aW9uVG9rZW5GbigpOwogICAgY29uc3QgYWJvcnQgPSBmdW5jdGlvbigpIHsKICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdBYm9ydGVkJyk7CiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGV4Y2VwdGlvblRva2VuKTsKICAgIH07CiAgICBjb25zdCBtYWtlUHJveHkgPSBmdW5jdGlvbihvd25lciwgY2hhaW4pIHsKICAgICAgICBjb25zdCBwb3MgPSBjaGFpbi5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgewogICAgICAgICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvd25lciwgY2hhaW4pOwogICAgICAgICAgICBpZiAoICFkZXNjIHx8IGRlc2MuZ2V0ICE9PSBhYm9ydCApIHsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvd25lciwgY2hhaW4sIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGFib3J0LAogICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oKXt9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByb3AgPSBjaGFpbi5zbGljZSgwLCBwb3MpOwogICAgICAgIGxldCB2ID0gb3duZXJbcHJvcF07CiAgICAgICAgY2hhaW4gPSBjaGFpbi5zbGljZShwb3MgKyAxKTsKICAgICAgICBpZiAoIHYgKSB7CiAgICAgICAgICAgIG1ha2VQcm94eSh2LCBjaGFpbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3duZXIsIHByb3ApOwogICAgICAgIGlmICggZGVzYyAmJiBkZXNjLnNldCAhPT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3duZXIsIHByb3AsIHsKICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHY7IH0sCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgdiA9IGE7CiAgICAgICAgICAgICAgICBpZiAoIGEgaW5zdGFuY2VvZiBPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgbWFrZVByb3h5KGEsIGNoYWluKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKICAgIGNvbnN0IG93bmVyID0gd2luZG93OwogICAgbWFrZVByb3h5KG93bmVyLCBjaGFpbik7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"abort-on-property-write.js","aliases":["aopw.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBzYWZlU2VsZigpIHsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiApIHsKICAgICAgICByZXR1cm4gc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZjsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSBnbG9iYWxUaGlzOwogICAgY29uc3Qgc2FmZSA9IHsKICAgICAgICAnQXJyYXlfZnJvbSc6IEFycmF5LmZyb20sCiAgICAgICAgJ0Vycm9yJzogc2VsZi5FcnJvciwKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmdGbic6IHNlbGYuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZyc6IHRoaXNBcmcgPT4gc2FmZS5GdW5jdGlvbl90b1N0cmluZ0ZuLmNhbGwodGhpc0FyZyksCiAgICAgICAgJ01hdGhfZmxvb3InOiBNYXRoLmZsb29yLAogICAgICAgICdNYXRoX21heCc6IE1hdGgubWF4LAogICAgICAgICdNYXRoX21pbic6IE1hdGgubWluLAogICAgICAgICdNYXRoX3JhbmRvbSc6IE1hdGgucmFuZG9tLAogICAgICAgICdPYmplY3QnOiBPYmplY3QsCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0eSc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9kZWZpbmVQcm9wZXJ0aWVzJzogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZnJvbUVudHJpZXMnOiBPYmplY3QuZnJvbUVudHJpZXMuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9oYXNPd24nOiBPYmplY3QuaGFzT3duLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X3RvU3RyaW5nJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnUmVnRXhwJzogc2VsZi5SZWdFeHAsCiAgICAgICAgJ1JlZ0V4cF90ZXN0Jzogc2VsZi5SZWdFeHAucHJvdG90eXBlLnRlc3QsCiAgICAgICAgJ1JlZ0V4cF9leGVjJzogc2VsZi5SZWdFeHAucHJvdG90eXBlLmV4ZWMsCiAgICAgICAgJ1JlcXVlc3RfY2xvbmUnOiBzZWxmLlJlcXVlc3QucHJvdG90eXBlLmNsb25lLAogICAgICAgICdTdHJpbmcnOiBzZWxmLlN0cmluZywKICAgICAgICAnU3RyaW5nX2Zyb21DaGFyQ29kZSc6IFN0cmluZy5mcm9tQ2hhckNvZGUsCiAgICAgICAgJ1N0cmluZ19zcGxpdCc6IFN0cmluZy5wcm90b3R5cGUuc3BsaXQsCiAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jzogc2VsZi5YTUxIdHRwUmVxdWVzdCwKICAgICAgICAnYWRkRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLAogICAgICAgICdmZXRjaCc6IHNlbGYuZmV0Y2gsCiAgICAgICAgJ0pTT04nOiBzZWxmLkpTT04sCiAgICAgICAgJ0pTT05fcGFyc2VGbic6IHNlbGYuSlNPTi5wYXJzZSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnlGbic6IHNlbGYuSlNPTi5zdHJpbmdpZnksCiAgICAgICAgJ0pTT05fcGFyc2UnOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3BhcnNlRm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdKU09OX3N0cmluZ2lmeSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fc3RyaW5naWZ5Rm4uY2FsbChzYWZlLkpTT04sIC4uLmFyZ3MpLAogICAgICAgICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLAogICAgICAgIC8vIFByb3BlcnRpZXMKICAgICAgICBsb2dMZXZlbDogMCwKICAgICAgICAvLyBNZXRob2RzCiAgICAgICAgbWFrZUxvZ1ByZWZpeCguLi5hcmdzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlciAmJiBgWyR7YXJncy5qb2luKCcgXHUyMDVEICcpfV1gIHx8ICcnOwogICAgICAgIH0sCiAgICAgICAgdWJvTG9nKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2luZm8nLCAuLi5hcmdzKTsKICAgICAgICAgICAgCiAgICAgICAgfSwKICAgICAgICB1Ym9FcnIoLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignZXJyb3InLCAuLi5hcmdzKTsKICAgICAgICB9LAogICAgICAgIGVzY2FwZVJlZ2V4Q2hhcnMocykgewogICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKTsKICAgICAgICB9LAogICAgICAgIGluaXRQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hBbGw6IHRydWUsIGV4cGVjdDogdHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdCA9IChvcHRpb25zLmNhbk5lZ2F0ZSAhPT0gdHJ1ZSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA9PT0gZmFsc2UpOwogICAgICAgICAgICBpZiAoIGV4cGVjdCA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCgKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzJdIHx8IG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBvcHRpb25zLmZsYWdzICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAodGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHBhdHRlcm4sIGV4cGVjdCB9OwogICAgICAgIH0sCiAgICAgICAgdGVzdFBhdHRlcm4oZGV0YWlscywgaGF5c3RhY2spIHsKICAgICAgICAgICAgaWYgKCBkZXRhaWxzLm1hdGNoQWxsICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoIGRldGFpbHMucmUgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZWdFeHBfdGVzdC5jYWxsKGRldGFpbHMucmUsIGhheXN0YWNrKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKGRldGFpbHMucGF0dGVybikgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgIH0sCiAgICAgICAgcGF0dGVyblRvUmVnZXgocGF0dGVybiwgZmxhZ3MgPSB1bmRlZmluZWQsIHZlcmJhdGltID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsgcmV0dXJuIC9eLzsgfQogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dpbXN1XSopJC8uZXhlYyhwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlU3RyID0gdGhpcy5lc2NhcGVSZWdleENoYXJzKHBhdHRlcm4pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodmVyYmF0aW0gPyBgXiR7cmVTdHJ9JGAgOiByZVN0ciwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0gfHwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC9eLzsKICAgICAgICB9LAogICAgICAgIGdldEV4dHJhQXJncyhhcmdzLCBvZmZzZXQgPSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhcmdzLnNsaWNlKG9mZnNldCkucmVkdWNlKChvdXQsIHYsIGksIGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICggKGkgJiAxKSA9PT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IGFbaSsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IC9eXGQrJC8udGVzdChyYXdWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChyYXdWYWx1ZSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgIDogcmF3VmFsdWU7CiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goWyBhW2ldLCB2YWx1ZSBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuT2JqZWN0X2Zyb21FbnRyaWVzKGVudHJpZXMpOwogICAgICAgIH0sCiAgICAgICAgb25JZGxlKGZuLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayhmbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTsKICAgICAgICB9LAogICAgICAgIG9mZklkbGUoaWQpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICB9CiAgICB9OwogICAgc2NyaXB0bGV0R2xvYmFscy5zYWZlU2VsZiA9IHNhZmU7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuIHNhZmU7IH0KICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBsb2dnZXIgaXMgb3BlbmVkCiAgICBzYWZlLmxvZ0xldmVsID0gc2NyaXB0bGV0R2xvYmFscy5sb2dMZXZlbCB8fCAxOwogICAgbGV0IGxhc3RMb2dUeXBlID0gJyc7CiAgICBsZXQgbGFzdExvZ1RleHQgPSAnJzsKICAgIGxldCBsYXN0TG9nVGltZSA9IDA7CiAgICBzYWZlLnRvTG9nVGV4dCA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgaWYgKCBhcmdzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgdGV4dCA9IGBbJHtkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSB8fCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmfV0ke2FyZ3Muam9pbignICcpfWA7CiAgICAgICAgaWYgKCB0ZXh0ID09PSBsYXN0TG9nVGV4dCAmJiB0eXBlID09PSBsYXN0TG9nVHlwZSApIHsKICAgICAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIGxhc3RMb2dUaW1lKSA8IDUwMDAgKSB7IHJldHVybjsgfQogICAgICAgIH0KICAgICAgICBsYXN0TG9nVHlwZSA9IHR5cGU7CiAgICAgICAgbGFzdExvZ1RleHQgPSB0ZXh0OwogICAgICAgIGxhc3RMb2dUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJjID0gbmV3IHNlbGYuQnJvYWRjYXN0Q2hhbm5lbChzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0KTsKICAgICAgICBsZXQgYmNCdWZmZXIgPSBbXTsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiY0J1ZmZlci5wdXNoKHsgdHlwZSwgdGV4dCB9KTsKICAgICAgICB9OwogICAgICAgIGJjLm9ubWVzc2FnZSA9IGV2ID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXYuZGF0YTsKICAgICAgICAgICAgc3dpdGNoICggbXNnICkgewogICAgICAgICAgICBjYXNlICdpYW1yZWFkeSEnOgogICAgICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgYmNCdWZmZXIuZm9yRWFjaCgoeyB0eXBlLCB0ZXh0IH0pID0+CiAgICAgICAgICAgICAgICAgICAgYmMucG9zdE1lc3NhZ2UoeyB3aGF0OiAnbWVzc2FnZVRvTG9nZ2VyJywgdHlwZSwgdGV4dCB9KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGJjQnVmZmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9PbmUnOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb1R3byc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBiYy5wb3N0TWVzc2FnZSgnYXJleW91cmVhZHk/Jyk7CiAgICB9IGNhdGNoIHsKICAgICAgICBzYWZlLnNlbmRUb0xvZ2dlciA9ICh0eXBlLCAuLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBzYWZlLnRvTG9nVGV4dCh0eXBlLCAuLi5hcmdzKTsKICAgICAgICAgICAgaWYgKCB0ZXh0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBzYWZlLmxvZyhgdUJPICR7dGV4dH1gKTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHNhZmU7Cn0KZnVuY3Rpb24gZ2V0RXhjZXB0aW9uVG9rZW5GbigpIHsKICAgIGNvbnN0IHRva2VuID0gZ2V0UmFuZG9tVG9rZW5GbigpOwogICAgY29uc3Qgb2UgPSBzZWxmLm9uZXJyb3I7CiAgICBzZWxmLm9uZXJyb3IgPSBmdW5jdGlvbihtc2csIC4uLmFyZ3MpIHsKICAgICAgICBpZiAoIHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnICYmIG1zZy5pbmNsdWRlcyh0b2tlbikgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgaWYgKCBvZSBpbnN0YW5jZW9mIEZ1bmN0aW9uICkgewogICAgICAgICAgICByZXR1cm4gb2UuY2FsbCh0aGlzLCBtc2csIC4uLmFyZ3MpOwogICAgICAgIH0KICAgIH0uYmluZCgpOwogICAgcmV0dXJuIHRva2VuOwp9CgogIChmdW5jdGlvbiBhYm9ydE9uUHJvcGVydHlXcml0ZSgKICAgIHByb3AgPSAnJwopIHsKICAgIGlmICggdHlwZW9mIHByb3AgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGlmICggcHJvcCA9PT0gJycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ2Fib3J0LW9uLXByb3BlcnR5LXdyaXRlJywgcHJvcCk7CiAgICBjb25zdCBleGNlcHRpb25Ub2tlbiA9IGdldEV4Y2VwdGlvblRva2VuRm4oKTsKICAgIGxldCBvd25lciA9IHdpbmRvdzsKICAgIGZvciAoOzspIHsKICAgICAgICBjb25zdCBwb3MgPSBwcm9wLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IGJyZWFrOyB9CiAgICAgICAgb3duZXIgPSBvd25lcltwcm9wLnNsaWNlKDAsIHBvcyldOwogICAgICAgIGlmICggb3duZXIgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICBwcm9wID0gcHJvcC5zbGljZShwb3MgKyAxKTsKICAgIH0KICAgIGRlbGV0ZSBvd25lcltwcm9wXTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvd25lciwgcHJvcCwgewogICAgICAgIHNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0Fib3J0ZWQnKTsKICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGV4Y2VwdGlvblRva2VuKTsKICAgICAgICB9CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"adjust-setInterval.js","aliases":["nano-setInterval-booster.js","nano-sib.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBhZGp1c3RTZXRJbnRlcnZhbCgKICAgIG5lZWRsZUFyZyA9ICcnLAogICAgZGVsYXlBcmcgPSAnJywKICAgIGJvb3N0QXJnID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiBuZWVkbGVBcmcgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcmVOZWVkbGUgPSBzYWZlLnBhdHRlcm5Ub1JlZ2V4KG5lZWRsZUFyZyk7CiAgICBsZXQgZGVsYXkgPSBkZWxheUFyZyAhPT0gJyonID8gcGFyc2VJbnQoZGVsYXlBcmcsIDEwKSA6IC0xOwogICAgaWYgKCBpc05hTihkZWxheSkgfHwgaXNGaW5pdGUoZGVsYXkpID09PSBmYWxzZSApIHsgZGVsYXkgPSAxMDAwOyB9CiAgICBsZXQgYm9vc3QgPSBwYXJzZUZsb2F0KGJvb3N0QXJnKTsKICAgIGJvb3N0ID0gaXNOYU4oYm9vc3QpID09PSBmYWxzZSAmJiBpc0Zpbml0ZShib29zdCkKICAgICAgICA/IE1hdGgubWluKE1hdGgubWF4KGJvb3N0LCAwLjAwMSksIDUwKQogICAgICAgIDogMC4wNTsKICAgIHNlbGYuc2V0SW50ZXJ2YWwgPSBuZXcgUHJveHkoc2VsZi5zZXRJbnRlcnZhbCwgewogICAgICAgIGFwcGx5OiBmdW5jdGlvbih0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgWyBhLCBiIF0gPSBhcmdzOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoZGVsYXkgPT09IC0xIHx8IGIgPT09IGRlbGF5KSAmJgogICAgICAgICAgICAgICAgcmVOZWVkbGUudGVzdChhLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgYXJnc1sxXSA9IGIgKiBib29zdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KHRoaXNBcmcsIGFyZ3MpOwogICAgICAgIH0KICAgIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"adjust-setTimeout.js","aliases":["nano-setTimeout-booster.js","nano-stb.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBhZGp1c3RTZXRUaW1lb3V0KAogICAgbmVlZGxlQXJnID0gJycsCiAgICBkZWxheUFyZyA9ICcnLAogICAgYm9vc3RBcmcgPSAnJwopIHsKICAgIGlmICggdHlwZW9mIG5lZWRsZUFyZyAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCByZU5lZWRsZSA9IHNhZmUucGF0dGVyblRvUmVnZXgobmVlZGxlQXJnKTsKICAgIGxldCBkZWxheSA9IGRlbGF5QXJnICE9PSAnKicgPyBwYXJzZUludChkZWxheUFyZywgMTApIDogLTE7CiAgICBpZiAoIGlzTmFOKGRlbGF5KSB8fCBpc0Zpbml0ZShkZWxheSkgPT09IGZhbHNlICkgeyBkZWxheSA9IDEwMDA7IH0KICAgIGxldCBib29zdCA9IHBhcnNlRmxvYXQoYm9vc3RBcmcpOwogICAgYm9vc3QgPSBpc05hTihib29zdCkgPT09IGZhbHNlICYmIGlzRmluaXRlKGJvb3N0KQogICAgICAgID8gTWF0aC5taW4oTWF0aC5tYXgoYm9vc3QsIDAuMDAxKSwgNTApCiAgICAgICAgOiAwLjA1OwogICAgc2VsZi5zZXRUaW1lb3V0ID0gbmV3IFByb3h5KHNlbGYuc2V0VGltZW91dCwgewogICAgICAgIGFwcGx5OiBmdW5jdGlvbih0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgWyBhLCBiIF0gPSBhcmdzOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoZGVsYXkgPT09IC0xIHx8IGIgPT09IGRlbGF5KSAmJgogICAgICAgICAgICAgICAgcmVOZWVkbGUudGVzdChhLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgYXJnc1sxXSA9IGIgKiBib29zdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KHRoaXNBcmcsIGFyZ3MpOwogICAgICAgIH0KICAgIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"prevent-refresh.js","aliases":["refresh-defuser.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBwcmV2ZW50UmVmcmVzaCgKICAgIGRlbGF5ID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiBkZWxheSAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ3ByZXZlbnQtcmVmcmVzaCcsIGRlbGF5KTsKICAgIGNvbnN0IHN0b3AgPSBjb250ZW50ID0+IHsKICAgICAgICB3aW5kb3cuc3RvcCgpOwogICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYFByZXZlbnRlZCAiJHtjb250ZW50fSJgKTsKICAgIH07CiAgICBjb25zdCBkZWZ1c2UgPSAoICkgPT4gewogICAgICAgIGNvbnN0IG1ldGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW2h0dHAtZXF1aXY9InJlZnJlc2giIGldW2NvbnRlbnRdJyk7CiAgICAgICAgaWYgKCBtZXRhID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCBjb250ZW50ID0gbWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAnJzsKICAgICAgICBjb25zdCBtcyA9IGRlbGF5ID09PSAnJwogICAgICAgICAgICA/IE1hdGgubWF4KHBhcnNlRmxvYXQoY29udGVudCkgfHwgMCwgMCkgKiA1MDAKICAgICAgICAgICAgOiAwOwogICAgICAgIGlmICggbXMgPT09IDAgKSB7CiAgICAgICAgICAgIHN0b3AoY29udGVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoICkgPT4geyBzdG9wKGNvbnRlbnQpOyB9LCBtcyk7CiAgICAgICAgfQogICAgfTsKICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGRlZnVzZSwgeyBjYXB0dXJlOiB0cnVlLCBvbmNlOiB0cnVlIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"remove-class.js","aliases":["rc.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHJ1bkF0KGZuLCB3aGVuKSB7CiAgICBjb25zdCBpbnRGcm9tUmVhZHlTdGF0ZSA9IHN0YXRlID0+IHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gewogICAgICAgICAgICAnbG9hZGluZyc6IDEsICdhc2FwJzogMSwKICAgICAgICAgICAgJ2ludGVyYWN0aXZlJzogMiwgJ2VuZCc6IDIsICcyJzogMiwKICAgICAgICAgICAgJ2NvbXBsZXRlJzogMywgJ2lkbGUnOiAzLCAnMyc6IDMsCiAgICAgICAgfTsKICAgICAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5pc0FycmF5KHN0YXRlKSA/IHN0YXRlIDogWyBzdGF0ZSBdOwogICAgICAgIGZvciAoIGNvbnN0IHRva2VuIG9mIHRva2VucyApIHsKICAgICAgICAgICAgY29uc3QgcHJvcCA9IGAke3Rva2VufWA7CiAgICAgICAgICAgIGlmICggT2JqZWN0Lmhhc093bih0YXJnZXRzLCBwcm9wKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIHJldHVybiB0YXJnZXRzW3Byb3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBjb25zdCBydW5BdCA9IGludEZyb21SZWFkeVN0YXRlKHdoZW4pOwogICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSBydW5BdCApIHsKICAgICAgICBmbigpOyByZXR1cm47CiAgICB9CiAgICBjb25zdCBvblN0YXRlQ2hhbmdlID0gKCApID0+IHsKICAgICAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpIDwgcnVuQXQgKSB7IHJldHVybjsgfQogICAgICAgIGZuKCk7CiAgICAgICAgc2FmZS5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKICAgIH07CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGFyZ3MgPSBbICdyZWFkeXN0YXRlY2hhbmdlJywgb25TdGF0ZUNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlIH0gXTsKICAgIHNhZmUuYWRkRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7Cn0KCiAgKGZ1bmN0aW9uIHJlbW92ZUNsYXNzKAogICAgcmF3VG9rZW4gPSAnJywKICAgIHJhd1NlbGVjdG9yID0gJycsCiAgICBiZWhhdmlvciA9ICcnCikgewogICAgaWYgKCB0eXBlb2YgcmF3VG9rZW4gIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGlmICggcmF3VG9rZW4gPT09ICcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdyZW1vdmUtY2xhc3MnLCByYXdUb2tlbiwgcmF3U2VsZWN0b3IsIGJlaGF2aW9yKTsKICAgIGNvbnN0IHRva2VucyA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocmF3VG9rZW4sIC9ccypcfFxzKi8pOwogICAgY29uc3Qgc2VsZWN0b3IgPSB0b2tlbnMKICAgICAgICAubWFwKGEgPT4gYCR7cmF3U2VsZWN0b3J9LiR7Q1NTLmVzY2FwZShhKX1gKQogICAgICAgIC5qb2luKCcsJyk7CiAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYFRhcmdldCBzZWxlY3Rvcjpcblx0JHtzZWxlY3Rvcn1gKTsKICAgIH0KICAgIGNvbnN0IG11c3RTdGF5ID0gL1xic3RheVxiLy50ZXN0KGJlaGF2aW9yKTsKICAgIGxldCB0aW1lcjsKICAgIGNvbnN0IHJtY2xhc3MgPSAoICkgPT4gewogICAgICAgIHRpbWVyID0gdW5kZWZpbmVkOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IG5vZGUgb2Ygbm9kZXMgKSB7CiAgICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoLi4udG9rZW5zKTsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1JlbW92ZWQgY2xhc3MoZXMpJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgaWYgKCBtdXN0U3RheSApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAnY29tcGxldGUnICkgeyByZXR1cm47IH0KICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICB9OwogICAgY29uc3QgbXV0YXRpb25IYW5kbGVyID0gbXV0YXRpb25zID0+IHsKICAgICAgICBpZiAoIHRpbWVyICE9PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIGxldCBza2lwID0gdHJ1ZTsKICAgICAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoICYmIHNraXA7IGkrKyApIHsKICAgICAgICAgICAgY29uc3QgeyB0eXBlLCBhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMgfSA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgICAgaWYgKCB0eXBlID09PSAnYXR0cmlidXRlcycgKSB7IHNraXAgPSBmYWxzZTsgfQogICAgICAgICAgICBmb3IgKCBsZXQgaiA9IDA7IGogPCBhZGRlZE5vZGVzLmxlbmd0aCAmJiBza2lwOyBqKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIGFkZGVkTm9kZXNbal0ubm9kZVR5cGUgPT09IDEgKSB7IHNraXAgPSBmYWxzZTsgYnJlYWs7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKCBsZXQgaiA9IDA7IGogPCByZW1vdmVkTm9kZXMubGVuZ3RoICYmIHNraXA7IGorKyApIHsKICAgICAgICAgICAgICAgIGlmICggcmVtb3ZlZE5vZGVzW2pdLm5vZGVUeXBlID09PSAxICkgeyBza2lwID0gZmFsc2U7IGJyZWFrOyB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCBza2lwICkgeyByZXR1cm47IH0KICAgICAgICB0aW1lciA9IHNhZmUub25JZGxlKHJtY2xhc3MsIHsgdGltZW91dDogNjcgfSk7CiAgICB9OwogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbkhhbmRsZXIpOwogICAgY29uc3Qgc3RhcnQgPSAoICkgPT4gewogICAgICAgIHJtY2xhc3MoKTsKICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWyAnY2xhc3MnIF0sCiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSwKICAgICAgICB9KTsKICAgIH07CiAgICBydW5BdCgoICkgPT4gewogICAgICAgIHN0YXJ0KCk7CiAgICB9LCAvXGJjb21wbGV0ZVxiLy50ZXN0KGJlaGF2aW9yKSA/ICdpZGxlJyA6ICdsb2FkaW5nJyk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"webrtc-if.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiB3ZWJydGNJZigKICAgIGdvb2QgPSAnJwopIHsKICAgIGlmICggdHlwZW9mIGdvb2QgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcmVHb29kID0gc2FmZS5wYXR0ZXJuVG9SZWdleChnb29kKTsKICAgIGNvbnN0IHJ0Y05hbWUgPSB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24KICAgICAgICA/ICdSVENQZWVyQ29ubmVjdGlvbicKICAgICAgICA6ICh3aW5kb3cud2Via2l0UlRDUGVlckNvbm5lY3Rpb24gPyAnd2Via2l0UlRDUGVlckNvbm5lY3Rpb24nIDogJycpOwogICAgaWYgKCBydGNOYW1lID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBsb2cgPSBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpOwogICAgY29uc3QgbmV1dGVyZWRQZWVyQ29ubmVjdGlvbnMgPSBuZXcgV2Vha1NldCgpOwogICAgY29uc3QgaXNHb29kQ29uZmlnID0gZnVuY3Rpb24oaW5zdGFuY2UsIGNvbmZpZykgewogICAgICAgIGlmICggbmV1dGVyZWRQZWVyQ29ubmVjdGlvbnMuaGFzKGluc3RhbmNlKSApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgaWYgKCBjb25maWcgaW5zdGFuY2VvZiBPYmplY3QgPT09IGZhbHNlICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgIGlmICggQXJyYXkuaXNBcnJheShjb25maWcuaWNlU2VydmVycykgPT09IGZhbHNlICkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgIGZvciAoIGNvbnN0IHNlcnZlciBvZiBjb25maWcuaWNlU2VydmVycyApIHsKICAgICAgICAgICAgY29uc3QgdXJscyA9IHR5cGVvZiBzZXJ2ZXIudXJscyA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgID8gWyBzZXJ2ZXIudXJscyBdCiAgICAgICAgICAgICAgICA6IHNlcnZlci51cmxzOwogICAgICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkodXJscykgKSB7CiAgICAgICAgICAgICAgICBmb3IgKCBjb25zdCB1cmwgb2YgdXJscyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIHJlR29vZC50ZXN0KHVybCkgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB0eXBlb2Ygc2VydmVyLnVzZXJuYW1lID09PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIGlmICggcmVHb29kLnRlc3Qoc2VydmVyLnVzZXJuYW1lKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHR5cGVvZiBzZXJ2ZXIuY3JlZGVudGlhbCA9PT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHJlR29vZC50ZXN0KHNlcnZlci5jcmVkZW50aWFsKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXV0ZXJlZFBlZXJDb25uZWN0aW9ucy5hZGQoaW5zdGFuY2UpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CiAgICBjb25zdCBwZWVyQ29ubmVjdGlvbkN0b3IgPSB3aW5kb3dbcnRjTmFtZV07CiAgICBjb25zdCBwZWVyQ29ubmVjdGlvblByb3RvID0gcGVlckNvbm5lY3Rpb25DdG9yLnByb3RvdHlwZTsKICAgIHBlZXJDb25uZWN0aW9uUHJvdG8uY3JlYXRlRGF0YUNoYW5uZWwgPQogICAgICAgIG5ldyBQcm94eShwZWVyQ29ubmVjdGlvblByb3RvLmNyZWF0ZURhdGFDaGFubmVsLCB7CiAgICAgICAgICAgIGFwcGx5OiBmdW5jdGlvbih0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmICggaXNHb29kQ29uZmlnKHRhcmdldCwgYXJnc1sxXSkgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgICAgIGxvZygndUJPOicsIGFyZ3NbMV0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncy5zbGljZSgwLCAxKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpOwogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgd2luZG93W3J0Y05hbWVdID0KICAgICAgICBuZXcgUHJveHkocGVlckNvbm5lY3Rpb25DdG9yLCB7CiAgICAgICAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24odGFyZ2V0LCBhcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAoIGlzR29vZENvbmZpZyh0YXJnZXQsIGFyZ3NbMF0pID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgICAgICBsb2coJ3VCTzonLCBhcmdzWzBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmNvbnN0cnVjdCh0YXJnZXQsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"prevent-xhr.js","aliases":["no-xhr-if.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmZ1bmN0aW9uIGdlbmVyYXRlQ29udGVudEZuKHRydXN0ZWQsIGRpcmVjdGl2ZSkgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCByYW5kb21pemUgPSBsZW4gPT4gewogICAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICAgIGxldCB0ZXh0U2l6ZSA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICBjb25zdCBzID0gc2FmZS5NYXRoX3JhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTsKICAgICAgICAgICAgY2h1bmtzLnB1c2gocyk7CiAgICAgICAgICAgIHRleHRTaXplICs9IHMubGVuZ3RoOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoIHRleHRTaXplIDwgbGVuICk7CiAgICAgICAgcmV0dXJuIGNodW5rcy5qb2luKCcgJykuc2xpY2UoMCwgbGVuKTsKICAgIH07CiAgICBpZiAoIGRpcmVjdGl2ZSA9PT0gJ3RydWUnICkgewogICAgICAgIHJldHVybiByYW5kb21pemUoMTApOwogICAgfQogICAgaWYgKCBkaXJlY3RpdmUgPT09ICdlbXB0eU9iaicgKSB7CiAgICAgICAgcmV0dXJuICd7fSc7CiAgICB9CiAgICBpZiAoIGRpcmVjdGl2ZSA9PT0gJ2VtcHR5QXJyJyApIHsKICAgICAgICByZXR1cm4gJ1tdJzsKICAgIH0KICAgIGlmICggZGlyZWN0aXZlID09PSAnZW1wdHlTdHInICkgewogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGlmICggZGlyZWN0aXZlLnN0YXJ0c1dpdGgoJ2xlbmd0aDonKSApIHsKICAgICAgICBjb25zdCBtYXRjaCA9IC9ebGVuZ3RoOihcZCspKD86LShcZCspKT8kLy5leGVjKGRpcmVjdGl2ZSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuICcnOyB9CiAgICAgICAgY29uc3QgbWluID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTsKICAgICAgICBjb25zdCBleHRlbnQgPSBzYWZlLk1hdGhfbWF4KHBhcnNlSW50KG1hdGNoWzJdLCAxMCkgfHwgMCwgbWluKSAtIG1pbjsKICAgICAgICBjb25zdCBsZW4gPSBzYWZlLk1hdGhfbWluKG1pbiArIGV4dGVudCAqIHNhZmUuTWF0aF9yYW5kb20oKSwgNTAwMDAwKTsKICAgICAgICByZXR1cm4gcmFuZG9taXplKGxlbiB8IDApOwogICAgfQogICAgaWYgKCBkaXJlY3RpdmUuc3RhcnRzV2l0aCgnd2FyOicpICkgewogICAgICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy53YXJPcmlnaW4gPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuICcnOyB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gewogICAgICAgICAgICBjb25zdCB3YXJPcmlnaW4gPSBzY3JpcHRsZXRHbG9iYWxzLndhck9yaWdpbjsKICAgICAgICAgICAgY29uc3Qgd2FyTmFtZSA9IGRpcmVjdGl2ZS5zbGljZSg0KTsKICAgICAgICAgICAgY29uc3QgZnVsbHBhdGggPSBbIHdhck9yaWdpbiwgJy8nLCB3YXJOYW1lIF07CiAgICAgICAgICAgIGNvbnN0IHdhclNlY3JldCA9IHNjcmlwdGxldEdsb2JhbHMud2FyU2VjcmV0OwogICAgICAgICAgICBpZiAoIHdhclNlY3JldCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgZnVsbHBhdGgucHVzaCgnP3NlY3JldD0nLCB3YXJTZWNyZXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHdhclhIUiA9IG5ldyBzYWZlLlhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgIHdhclhIUi5yZXNwb25zZVR5cGUgPSAndGV4dCc7CiAgICAgICAgICAgIHdhclhIUi5vbmxvYWRlbmQgPSBldiA9PiB7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2LnRhcmdldC5yZXNwb25zZVRleHQgfHwgJycpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB3YXJYSFIub3BlbignR0VUJywgZnVsbHBhdGguam9pbignJykpOwogICAgICAgICAgICB3YXJYSFIuc2VuZCgpOwogICAgICAgIH0pLmNhdGNoKCggKSA9PiAnJyk7CiAgICB9CiAgICBpZiAoIHRydXN0ZWQgKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTsKICAgIH0KICAgIHJldHVybiAnJzsKfQpmdW5jdGlvbiBwcmV2ZW50WGhyRm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBwcm9wc1RvTWF0Y2ggPSAnJywKICAgIGRpcmVjdGl2ZSA9ICcnCikgewogICAgaWYgKCB0eXBlb2YgcHJvcHNUb01hdGNoICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHNjcmlwdGxldE5hbWUgPSB0cnVzdGVkID8gJ3RydXN0ZWQtcHJldmVudC14aHInIDogJ3ByZXZlbnQteGhyJzsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeChzY3JpcHRsZXROYW1lLCBwcm9wc1RvTWF0Y2gsIGRpcmVjdGl2ZSk7CiAgICBjb25zdCB4aHJJbnN0YW5jZXMgPSBuZXcgV2Vha01hcCgpOwogICAgY29uc3QgcHJvcE5lZWRsZXMgPSBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCAndXJsJyk7CiAgICBjb25zdCB3YXJPcmlnaW4gPSBzY3JpcHRsZXRHbG9iYWxzLndhck9yaWdpbjsKICAgIGNvbnN0IHNhZmVEaXNwYXRjaEV2ZW50ID0gKHhociwgdHlwZSkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCh0eXBlKSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgfTsKICAgIGNvbnN0IFhIUkJlZm9yZSA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZTsKICAgIHNlbGYuWE1MSHR0cFJlcXVlc3QgPSBjbGFzcyBleHRlbmRzIHNlbGYuWE1MSHR0cFJlcXVlc3QgewogICAgICAgIG9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgeGhySW5zdGFuY2VzLmRlbGV0ZSh0aGlzKTsKICAgICAgICAgICAgaWYgKCB3YXJPcmlnaW4gIT09IHVuZGVmaW5lZCAmJiB1cmwuc3RhcnRzV2l0aCh3YXJPcmlnaW4pICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGhheXN0YWNrID0geyBtZXRob2QsIHVybCB9OwogICAgICAgICAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gJycgJiYgZGlyZWN0aXZlID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYENhbGxlZDogJHtzYWZlLkpTT05fc3RyaW5naWZ5KGhheXN0YWNrLCBudWxsLCAyKX1gKTsKICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vcGVuKG1ldGhvZCwgdXJsLCAuLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCBoYXlzdGFjaykgKSB7CiAgICAgICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0gT2JqZWN0LmFzc2lnbihoYXlzdGFjaywgewogICAgICAgICAgICAgICAgICAgIHhocjogdGhpcywKICAgICAgICAgICAgICAgICAgICBkZWZlcjogYXJncy5sZW5ndGggPT09IDAgfHwgISFhcmdzWzBdLAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtbGVuZ3RoJzogJycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB1cmw6IGhheXN0YWNrLnVybCwKICAgICAgICAgICAgICAgICAgICBwcm9wczogewogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogeyB2YWx1ZTogJycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0OiB7IHZhbHVlOiAnJyB9LAogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVhNTDogeyB2YWx1ZTogbnVsbCB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHhockluc3RhbmNlcy5zZXQodGhpcywgeGhyRGV0YWlscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBzZW5kKC4uLmFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgeGhyRGV0YWlscyA9IHhockluc3RhbmNlcy5nZXQodGhpcyk7CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnNlbmQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGhyRGV0YWlscy5oZWFkZXJzWydkYXRlJ10gPSAobmV3IERhdGUoKSkudG9VVENTdHJpbmcoKTsKICAgICAgICAgICAgbGV0IHhoclRleHQgPSAnJzsKICAgICAgICAgICAgc3dpdGNoICggdGhpcy5yZXNwb25zZVR5cGUgKSB7CiAgICAgICAgICAgIGNhc2UgJ2FycmF5YnVmZmVyJzoKICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2UudmFsdWUgPSBuZXcgQXJyYXlCdWZmZXIoMCk7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYmxvYic6CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLnByb3BzLnJlc3BvbnNlLnZhbHVlID0gbmV3IEJsb2IoW10pOwogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzogewogICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwogICAgICAgICAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZygnJywgJ3RleHQvaHRtbCcpOwogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5wcm9wcy5yZXNwb25zZS52YWx1ZSA9IGRvYzsKICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2VYTUwudmFsdWUgPSBkb2M7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICdqc29uJzoKICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2UudmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2VUZXh0LnZhbHVlID0gJ3t9JzsKICAgICAgICAgICAgICAgIHhockRldGFpbHMuaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgaWYgKCBkaXJlY3RpdmUgPT09ICcnICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgeGhyVGV4dCA9IGdlbmVyYXRlQ29udGVudEZuKHRydXN0ZWQsIHhockRldGFpbHMuZGlyZWN0aXZlKTsKICAgICAgICAgICAgICAgIGlmICggeGhyVGV4dCBpbnN0YW5jZW9mIFByb21pc2UgKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyVGV4dCA9IHhoclRleHQudGhlbih0ZXh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyRGV0YWlscy5wcm9wcy5yZXNwb25zZS52YWx1ZSA9IHRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2VUZXh0LnZhbHVlID0gdGV4dDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgeGhyRGV0YWlscy5wcm9wcy5yZXNwb25zZS52YWx1ZSA9IHhoclRleHQ7CiAgICAgICAgICAgICAgICAgICAgeGhyRGV0YWlscy5wcm9wcy5yZXNwb25zZVRleHQudmFsdWUgPSB4aHJUZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzLmRlZmVyID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHhockRldGFpbHMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IGAke3hockRldGFpbHMucHJvcHMucmVzcG9uc2UudmFsdWV9YC5sZW5ndGg7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4aHJEZXRhaWxzLnhociwgewogICAgICAgICAgICAgICAgICAgIHJlYWR5U3RhdGU6IHsgdmFsdWU6IDQgfSwKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVVSTDogeyB2YWx1ZTogeGhyRGV0YWlscy51cmwgfSwKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHsgdmFsdWU6IDIwMCB9LAogICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHsgdmFsdWU6ICdPSycgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGhyRGV0YWlscy54aHIsIHhockRldGFpbHMucHJvcHMpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSh4aHJUZXh0KS50aGVuKCggKSA9PiB4aHJEZXRhaWxzKS50aGVuKGRldGFpbHMgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGV0YWlscy54aHIsIHsKICAgICAgICAgICAgICAgICAgICByZWFkeVN0YXRlOiB7IHZhbHVlOiAxLCBjb25maWd1cmFibGU6IHRydWUgfSwKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVVSTDogeyB2YWx1ZTogeGhyRGV0YWlscy51cmwgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgc2FmZURpc3BhdGNoRXZlbnQoZGV0YWlscy54aHIsICdyZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZGV0YWlsczsKICAgICAgICAgICAgfSkudGhlbihkZXRhaWxzID0+IHsKICAgICAgICAgICAgICAgIHhockRldGFpbHMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IGAke2RldGFpbHMucHJvcHMucmVzcG9uc2UudmFsdWV9YC5sZW5ndGg7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkZXRhaWxzLnhociwgewogICAgICAgICAgICAgICAgICAgIHJlYWR5U3RhdGU6IHsgdmFsdWU6IDIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LAogICAgICAgICAgICAgICAgICAgIHN0YXR1czogeyB2YWx1ZTogMjAwIH0sCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogeyB2YWx1ZTogJ09LJyB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzYWZlRGlzcGF0Y2hFdmVudChkZXRhaWxzLnhociwgJ3JlYWR5c3RhdGVjaGFuZ2UnKTsKICAgICAgICAgICAgICAgIHJldHVybiBkZXRhaWxzOwogICAgICAgICAgICB9KS50aGVuKGRldGFpbHMgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGV0YWlscy54aHIsIHsKICAgICAgICAgICAgICAgICAgICByZWFkeVN0YXRlOiB7IHZhbHVlOiAzLCBjb25maWd1cmFibGU6IHRydWUgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGV0YWlscy54aHIsIGRldGFpbHMucHJvcHMpOwogICAgICAgICAgICAgICAgc2FmZURpc3BhdGNoRXZlbnQoZGV0YWlscy54aHIsICdyZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZGV0YWlsczsKICAgICAgICAgICAgfSkudGhlbihkZXRhaWxzID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRldGFpbHMueGhyLCB7CiAgICAgICAgICAgICAgICAgICAgcmVhZHlTdGF0ZTogeyB2YWx1ZTogNCB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzYWZlRGlzcGF0Y2hFdmVudChkZXRhaWxzLnhociwgJ3JlYWR5c3RhdGVjaGFuZ2UnKTsKICAgICAgICAgICAgICAgIHNhZmVEaXNwYXRjaEV2ZW50KGRldGFpbHMueGhyLCAnbG9hZCcpOwogICAgICAgICAgICAgICAgc2FmZURpc3BhdGNoRXZlbnQoZGV0YWlscy54aHIsICdsb2FkZW5kJyk7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBQcmV2ZW50ZWQgd2l0aCByZXNwb25zZTpcbiR7ZGV0YWlscy54aHIucmVzcG9uc2V9YCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBnZXRSZXNwb25zZUhlYWRlcihoZWFkZXJOYW1lKSB7CiAgICAgICAgICAgIGNvbnN0IHhockRldGFpbHMgPSB4aHJJbnN0YW5jZXMuZ2V0KHRoaXMpOwogICAgICAgICAgICBpZiAoIHhockRldGFpbHMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlYWR5U3RhdGUgPCB0aGlzLkhFQURFUlNfUkVDRUlWRUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB4aHJEZXRhaWxzLmhlYWRlcnNbaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJyApIHsgcmV0dXJuIHZhbHVlOyB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBnZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB7CiAgICAgICAgICAgIGNvbnN0IHhockRldGFpbHMgPSB4aHJJbnN0YW5jZXMuZ2V0KHRoaXMpOwogICAgICAgICAgICBpZiAoIHhockRldGFpbHMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlYWR5U3RhdGUgPCB0aGlzLkhFQURFUlNfUkVDRUlWRUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgb3V0ID0gW107CiAgICAgICAgICAgIGZvciAoIGNvbnN0IFsgbmFtZSwgdmFsdWUgXSBvZiBPYmplY3QuZW50cmllcyh4aHJEZXRhaWxzLmhlYWRlcnMpICkgewogICAgICAgICAgICAgICAgaWYgKCAhdmFsdWUgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBvdXQucHVzaChgJHtuYW1lfTogJHt2YWx1ZX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG91dC5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKCcnKTsgfQogICAgICAgICAgICByZXR1cm4gb3V0LmpvaW4oJ1xyXG4nKTsKICAgICAgICB9CiAgICB9OwogICAgc2VsZi5YTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3Blbi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBYSFJCZWZvcmUub3Blbi50b1N0cmluZygpOwogICAgfTsKICAgIHNlbGYuWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnNlbmQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWEhSQmVmb3JlLnNlbmQudG9TdHJpbmcoKTsKICAgIH07CiAgICBzZWxmLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5nZXRSZXNwb25zZUhlYWRlci50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBYSFJCZWZvcmUuZ2V0UmVzcG9uc2VIZWFkZXIudG9TdHJpbmcoKTsKICAgIH07CiAgICBzZWxmLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5nZXRBbGxSZXNwb25zZUhlYWRlcnMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWEhSQmVmb3JlLmdldEFsbFJlc3BvbnNlSGVhZGVycy50b1N0cmluZygpOwogICAgfTsKfQoKICAoZnVuY3Rpb24gcHJldmVudFhociguLi5hcmdzKSB7CiAgICByZXR1cm4gcHJldmVudFhockZuKGZhbHNlLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"prevent-window-open.js","aliases":["nowoif.js","no-window-open-if.js","window.open-defuser.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQoKICAoZnVuY3Rpb24gbm9XaW5kb3dPcGVuSWYoCiAgICBwYXR0ZXJuID0gJycsCiAgICBkZWxheSA9ICcnLAogICAgZGVjb3kgPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCduby13aW5kb3ctb3Blbi1pZicsIHBhdHRlcm4sIGRlbGF5LCBkZWNveSk7CiAgICBjb25zdCB0YXJnZXRNYXRjaFJlc3VsdCA9IHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID09PSBmYWxzZTsKICAgIGlmICggdGFyZ2V0TWF0Y2hSZXN1bHQgPT09IGZhbHNlICkgewogICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOwogICAgfQogICAgY29uc3QgcmVQYXR0ZXJuID0gc2FmZS5wYXR0ZXJuVG9SZWdleChwYXR0ZXJuKTsKICAgIGNvbnN0IGF1dG9SZW1vdmVBZnRlciA9IChwYXJzZUZsb2F0KGRlbGF5KSB8fCAwKSAqIDEwMDA7CiAgICBjb25zdCBzZXRUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0OwogICAgY29uc3QgY3JlYXRlRGVjb3kgPSBmdW5jdGlvbih0YWcsIHVybFByb3AsIHVybCkgewogICAgICAgIGNvbnN0IGRlY295RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgICAgICBkZWNveUVsZW1bdXJsUHJvcF0gPSB1cmw7CiAgICAgICAgZGVjb3lFbGVtLnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCcxcHgnLCAnaW1wb3J0YW50Jyk7CiAgICAgICAgZGVjb3lFbGVtLnN0eWxlLnNldFByb3BlcnR5KCdwb3NpdGlvbicsJ2ZpeGVkJywgJ2ltcG9ydGFudCcpOwogICAgICAgIGRlY295RWxlbS5zdHlsZS5zZXRQcm9wZXJ0eSgndG9wJywnLTFweCcsICdpbXBvcnRhbnQnKTsKICAgICAgICBkZWNveUVsZW0uc3R5bGUuc2V0UHJvcGVydHkoJ3dpZHRoJywnMXB4JywgJ2ltcG9ydGFudCcpOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGVjb3lFbGVtKTsKICAgICAgICBzZXRUaW1lb3V0KCggKSA9PiB7IGRlY295RWxlbS5yZW1vdmUoKTsgfSwgYXV0b1JlbW92ZUFmdGVyKTsKICAgICAgICByZXR1cm4gZGVjb3lFbGVtOwogICAgfTsKICAgIGNvbnN0IG5vb3BGdW5jID0gZnVuY3Rpb24oKXt9OwogICAgcHJveHlBcHBseUZuKCdvcGVuJywgZnVuY3Rpb24gb3Blbihjb250ZXh0KSB7CiAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnZGVidWcnICYmIHNhZmUubG9nTGV2ZWwgIT09IDAgKSB7CiAgICAgICAgICAgIGRlYnVnZ2VyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWRlYnVnZ2VyCiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgeyBjYWxsQXJncyB9ID0gY29udGV4dDsKICAgICAgICBjb25zdCBoYXlzdGFjayA9IGNhbGxBcmdzLmpvaW4oJyAnKTsKICAgICAgICBpZiAoIHJlUGF0dGVybi50ZXN0KGhheXN0YWNrKSAhPT0gdGFyZ2V0TWF0Y2hSZXN1bHQgKSB7CiAgICAgICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBBbGxvd2VkICgke2NhbGxBcmdzLmpvaW4oJywgJyl9KWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgICAgICB9CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgUHJldmVudGVkICgke2NhbGxBcmdzLmpvaW4oJywgJyl9KWApOwogICAgICAgIGlmICggZGVsYXkgPT09ICcnICkgeyByZXR1cm4gbnVsbDsgfQogICAgICAgIGlmICggZGVjb3kgPT09ICdibGFuaycgKSB7CiAgICAgICAgICAgIGNhbGxBcmdzWzBdID0gJ2Fib3V0OmJsYW5rJzsKICAgICAgICAgICAgY29uc3QgciA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgICAgICBzZXRUaW1lb3V0KCggKSA9PiB7IHIuY2xvc2UoKTsgfSwgYXV0b1JlbW92ZUFmdGVyKTsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRlY295RWxlbSA9IGRlY295ID09PSAnb2JqJwogICAgICAgICAgICA/IGNyZWF0ZURlY295KCdvYmplY3QnLCAnZGF0YScsIC4uLmNhbGxBcmdzKQogICAgICAgICAgICA6IGNyZWF0ZURlY295KCdpZnJhbWUnLCAnc3JjJywgLi4uY2FsbEFyZ3MpOwogICAgICAgIGxldCBwb3B1cCA9IGRlY295RWxlbS5jb250ZW50V2luZG93OwogICAgICAgIGlmICggdHlwZW9mIHBvcHVwID09PSAnb2JqZWN0JyAmJiBwb3B1cCAhPT0gbnVsbCApIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBvcHVwLCAnY2xvc2VkJywgeyB2YWx1ZTogZmFsc2UgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcG9wdXAgPSBuZXcgUHJveHkoc2VsZiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIHByb3AsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIHByb3AgPT09ICdjbG9zZWQnICkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCAuLi5hcmdzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiByID09PSAnZnVuY3Rpb24nICkgeyByZXR1cm4gbm9vcEZ1bmM7IH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQoLi4uYXJncyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCBzYWZlLmxvZ0xldmVsICE9PSAwICkgewogICAgICAgICAgICBwb3B1cCA9IG5ldyBQcm94eShwb3B1cCwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIHByb3AsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCAuLi5hcmdzKTsKICAgICAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBwb3B1cCAvIGdldCAke3Byb3B9ID09PSAke3J9YCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgciA9PT0gJ2Z1bmN0aW9uJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7IHJldHVybiByLmNhbGwodGFyZ2V0LCAuLi5hcmdzKTsgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIHByb3AsIHZhbHVlLCAuLi5hcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgcG9wdXAgLyBzZXQgJHtwcm9wfSA9ICR7dmFsdWV9YCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUsIC4uLmFyZ3MpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3B1cDsKICAgIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"close-window.js","aliases":["window-close-if.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBjbG9zZVdpbmRvdygKICAgIGFyZzEgPSAnJwopIHsKICAgIGlmICggdHlwZW9mIGFyZzEgIT09ICdzdHJpbmcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgbGV0IHN1YmplY3QgPSAnJzsKICAgIGlmICggL15cLy4qXC8kLy50ZXN0KGFyZzEpICkgewogICAgICAgIHN1YmplY3QgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgIH0gZWxzZSBpZiAoIGFyZzEgIT09ICcnICkgewogICAgICAgIHN1YmplY3QgPSBgJHt3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9JHt3aW5kb3cubG9jYXRpb24uc2VhcmNofWA7CiAgICB9CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlID0gc2FmZS5wYXR0ZXJuVG9SZWdleChhcmcxKTsKICAgICAgICBpZiAoIHJlLnRlc3Qoc3ViamVjdCkgKSB7CiAgICAgICAgICAgIHdpbmRvdy5jbG9zZSgpOwogICAgICAgIH0KICAgIH0gY2F0Y2goZXgpIHsKICAgICAgICBjb25zb2xlLmxvZyhleCk7CiAgICB9Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"window.name-defuser.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgCiAgKGZ1bmN0aW9uIHdpbmRvd05hbWVEZWZ1c2VyKCkgewogICAgaWYgKCB3aW5kb3cgPT09IHdpbmRvdy50b3AgKSB7CiAgICAgICAgd2luZG93Lm5hbWUgPSAnJzsKICAgIH0KfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"overlay-buster.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgCiAgKGZ1bmN0aW9uIG92ZXJsYXlCdXN0ZXIoYWxsRnJhbWVzKSB7CiAgICBpZiAoIGFsbEZyYW1lcyA9PT0gJycgJiYgd2luZG93ICE9PSB3aW5kb3cudG9wICkgeyByZXR1cm47IH0KICAgIHZhciB0c3RhcnQ7CiAgICB2YXIgdHRsID0gMzAwMDA7CiAgICB2YXIgZGVsYXkgPSAwOwogICAgdmFyIGRlbGF5U3RlcCA9IDUwOwogICAgdmFyIGJ1c3RlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKICAgICAgICAgICAgYm9keUVsID0gZG9jdW1lbnQuYm9keSwKICAgICAgICAgICAgdncgPSBNYXRoLm1pbihkb2NFbC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGgpLAogICAgICAgICAgICB2aCA9IE1hdGgubWluKGRvY0VsLmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0KSwKICAgICAgICAgICAgdG9sID0gTWF0aC5taW4odncsIHZoKSAqIDAuMDUsCiAgICAgICAgICAgIGVsID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh2dy8yLCB2aC8yKSwKICAgICAgICAgICAgc3R5bGUsIHJlY3Q7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoIGVsID09PSBudWxsIHx8IGVsLnBhcmVudE5vZGUgPT09IG51bGwgfHwgZWwgPT09IGJvZHlFbCApIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpOwogICAgICAgICAgICBpZiAoIHBhcnNlSW50KHN0eWxlLnpJbmRleCwgMTApID49IDEwMDAgfHwgc3R5bGUucG9zaXRpb24gPT09ICdmaXhlZCcgKSB7CiAgICAgICAgICAgICAgICByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICBpZiAoIHJlY3QubGVmdCA8PSB0b2wgJiYgcmVjdC50b3AgPD0gdG9sICYmICh2dyAtIHJlY3QucmlnaHQpIDw9IHRvbCAmJiAodmggLSByZWN0LmJvdHRvbSkgPCB0b2wgKSB7CiAgICAgICAgICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7CiAgICAgICAgICAgICAgICAgICAgdHN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICBlbCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodncvMiwgdmgvMik7CiAgICAgICAgICAgICAgICAgICAgYm9keUVsLnN0eWxlLnNldFByb3BlcnR5KCdvdmVyZmxvdycsICdhdXRvJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgICAgIGRvY0VsLnN0eWxlLnNldFByb3BlcnR5KCdvdmVyZmxvdycsICdhdXRvJywgJ2ltcG9ydGFudCcpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsID0gZWwucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgaWYgKCAoRGF0ZS5ub3coKSAtIHRzdGFydCkgPCB0dGwgKSB7CiAgICAgICAgICAgIGRlbGF5ID0gTWF0aC5taW4oZGVsYXkgKyBkZWxheVN0ZXAsIDEwMDApOwogICAgICAgICAgICBzZXRUaW1lb3V0KGJ1c3RlciwgZGVsYXkpOwogICAgICAgIH0KICAgIH07CiAgICB2YXIgZG9tUmVhZHkgPSBmdW5jdGlvbihldikgewogICAgICAgIGlmICggZXYgKSB7CiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXYudHlwZSwgZG9tUmVhZHkpOwogICAgICAgIH0KICAgICAgICB0c3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIHNldFRpbWVvdXQoYnVzdGVyLCBkZWxheSk7CiAgICB9OwogICAgaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgKSB7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGRvbVJlYWR5KTsKICAgIH0gZWxzZSB7CiAgICAgICAgZG9tUmVhZHkoKTsKICAgIH0KfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"alert-buster.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgCiAgKGZ1bmN0aW9uIGFsZXJ0QnVzdGVyKCkgewogICAgd2luZG93LmFsZXJ0ID0gbmV3IFByb3h5KHdpbmRvdy5hbGVydCwgewogICAgICAgIGFwcGx5OiBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhhKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC50b1N0cmluZy5iaW5kKHRhcmdldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"nowebrtc.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgCiAgKGZ1bmN0aW9uIG5vV2VicnRjKCkgewogICAgdmFyIHJ0Y05hbWUgPSB3aW5kb3cuUlRDUGVlckNvbm5lY3Rpb24gPyAnUlRDUGVlckNvbm5lY3Rpb24nIDogKAogICAgICAgIHdpbmRvdy53ZWJraXRSVENQZWVyQ29ubmVjdGlvbiA/ICd3ZWJraXRSVENQZWVyQ29ubmVjdGlvbicgOiAnJwogICAgKTsKICAgIGlmICggcnRjTmFtZSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgdmFyIGxvZyA9IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICB2YXIgcGMgPSBmdW5jdGlvbihjZmcpIHsKICAgICAgICBsb2coJ0RvY3VtZW50IHRyaWVkIHRvIGNyZWF0ZSBhbiBSVENQZWVyQ29ubmVjdGlvbjogJW8nLCBjZmcpOwogICAgfTsKICAgIGNvbnN0IG5vb3AgPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICBwYy5wcm90b3R5cGUgPSB7CiAgICAgICAgY2xvc2U6IG5vb3AsCiAgICAgICAgY3JlYXRlRGF0YUNoYW5uZWw6IG5vb3AsCiAgICAgICAgY3JlYXRlT2ZmZXI6IG5vb3AsCiAgICAgICAgc2V0UmVtb3RlRGVzY3JpcHRpb246IG5vb3AsCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgUlRDUGVlckNvbm5lY3Rpb25dJzsKICAgICAgICB9CiAgICB9OwogICAgdmFyIHogPSB3aW5kb3dbcnRjTmFtZV07CiAgICB3aW5kb3dbcnRjTmFtZV0gPSBwYy5iaW5kKHdpbmRvdyk7CiAgICBpZiAoIHoucHJvdG90eXBlICkgewogICAgICAgIHoucHJvdG90eXBlLmNyZWF0ZURhdGFDaGFubmVsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uKCkge30KICAgICAgICAgICAgfTsKICAgICAgICB9LmJpbmQobnVsbCk7CiAgICB9Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"disable-newtab-links.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgCiAgKGZ1bmN0aW9uIGRpc2FibGVOZXd0YWJMaW5rcygpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXYgPT4gewogICAgICAgIGxldCB0YXJnZXQgPSBldi50YXJnZXQ7CiAgICAgICAgd2hpbGUgKCB0YXJnZXQgIT09IG51bGwgKSB7CiAgICAgICAgICAgIGlmICggdGFyZ2V0LmxvY2FsTmFtZSA9PT0gJ2EnICYmIHRhcmdldC5oYXNBdHRyaWJ1dGUoJ3RhcmdldCcpICkgewogICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgfSwgeyBjYXB0dXJlOiB0cnVlIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"xml-prune.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiB4bWxQcnVuZSgKICAgIHNlbGVjdG9yID0gJycsCiAgICBzZWxlY3RvckNoZWNrID0gJycsCiAgICB1cmxQYXR0ZXJuID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgaWYgKCBzZWxlY3RvciA9PT0gJycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ3htbC1wcnVuZScsIHNlbGVjdG9yLCBzZWxlY3RvckNoZWNrLCB1cmxQYXR0ZXJuKTsKICAgIGNvbnN0IHJlVXJsID0gc2FmZS5wYXR0ZXJuVG9SZWdleCh1cmxQYXR0ZXJuKTsKICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMyk7CiAgICBjb25zdCBxdWVyeUFsbCA9ICh4bWxEb2MsIHNlbGVjdG9yKSA9PiB7CiAgICAgICAgY29uc3QgaXNYcGF0aCA9IC9eeHBhdGhcKC4rXCkkLy50ZXN0KHNlbGVjdG9yKTsKICAgICAgICBpZiAoIGlzWHBhdGggPT09IGZhbHNlICkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh4bWxEb2MucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpOwogICAgICAgIH0KICAgICAgICBjb25zdCB4cHIgPSB4bWxEb2MuZXZhbHVhdGUoCiAgICAgICAgICAgIHNlbGVjdG9yLnNsaWNlKDYsIC0xKSwKICAgICAgICAgICAgeG1sRG9jLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICBYUGF0aFJlc3VsdC5VTk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLAogICAgICAgICAgICBudWxsCiAgICAgICAgKTsKICAgICAgICBjb25zdCBvdXQgPSBbXTsKICAgICAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCB4cHIuc25hcHNob3RMZW5ndGg7IGkrKyApIHsKICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHhwci5zbmFwc2hvdEl0ZW0oaSk7CiAgICAgICAgICAgIG91dC5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0OwogICAgfTsKICAgIGNvbnN0IHBydW5lRnJvbURvYyA9IHhtbERvYyA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCBzZWxlY3RvckNoZWNrICE9PSAnJyAmJiB4bWxEb2MucXVlcnlTZWxlY3RvcihzZWxlY3RvckNoZWNrKSA9PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB4bWxEb2M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBleHRyYUFyZ3MubG9nZG9jICkgewogICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBEb2N1bWVudCBpc1xuXHQke3NlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoeG1sRG9jKX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpdGVtcyA9IHF1ZXJ5QWxsKHhtbERvYywgc2VsZWN0b3IpOwogICAgICAgICAgICBpZiAoIGl0ZW1zLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuIHhtbERvYzsgfQogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBSZW1vdmluZyAke2l0ZW1zLmxlbmd0aH0gaXRlbXNgKTsKICAgICAgICAgICAgZm9yICggY29uc3QgaXRlbSBvZiBpdGVtcyApIHsKICAgICAgICAgICAgICAgIGlmICggaXRlbS5ub2RlVHlwZSA9PT0gMSApIHsKICAgICAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICggaXRlbS5ub2RlVHlwZSA9PT0gMiApIHsKICAgICAgICAgICAgICAgICAgICBpdGVtLm93bmVyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoaXRlbS5ub2RlTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGAke2l0ZW0uY29uc3RydWN0b3IubmFtZX0uJHtpdGVtLm5vZGVOYW1lfSByZW1vdmVkYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoKGV4KSB7CiAgICAgICAgICAgIHNhZmUudWJvRXJyKGxvZ1ByZWZpeCwgYEVycm9yOiAke2V4fWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4geG1sRG9jOwogICAgfTsKICAgIGNvbnN0IHBydW5lRnJvbVRleHQgPSB0ZXh0ID0+IHsKICAgICAgICBpZiAoICgvXlxzKjwvLnRlc3QodGV4dCkgJiYgLz5ccyokLy50ZXN0KHRleHQpKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCB4bWxQYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CiAgICAgICAgICAgIGNvbnN0IHhtbERvYyA9IHhtbFBhcnNlci5wYXJzZUZyb21TdHJpbmcodGV4dCwgJ3RleHQveG1sJyk7CiAgICAgICAgICAgIHBydW5lRnJvbURvYyh4bWxEb2MpOwogICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTsKICAgICAgICAgICAgdGV4dCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoeG1sRG9jKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgY29uc3QgdXJsRnJvbUFyZyA9IGFyZyA9PiB7CiAgICAgICAgaWYgKCB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyApIHsgcmV0dXJuIGFyZzsgfQogICAgICAgIGlmICggYXJnIGluc3RhbmNlb2YgUmVxdWVzdCApIHsgcmV0dXJuIGFyZy51cmw7IH0KICAgICAgICByZXR1cm4gU3RyaW5nKGFyZyk7CiAgICB9OwogICAgc2VsZi5mZXRjaCA9IG5ldyBQcm94eShzZWxmLmZldGNoLCB7CiAgICAgICAgYXBwbHk6IGZ1bmN0aW9uKHRhcmdldCwgdGhpc0FyZywgYXJncykgewogICAgICAgICAgICBjb25zdCBmZXRjaFByb21pc2UgPSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncyk7CiAgICAgICAgICAgIGlmICggcmVVcmwudGVzdCh1cmxGcm9tQXJnKGFyZ3NbMF0pKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hQcm9taXNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmZXRjaFByb21pc2UudGhlbihyZXNwb25zZUJlZm9yZSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3BvbnNlQmVmb3JlLmNsb25lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpLnRoZW4odGV4dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VBZnRlciA9IG5ldyBSZXNwb25zZShwcnVuZUZyb21UZXh0KHRleHQpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VCZWZvcmUuc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZUJlZm9yZS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZUJlZm9yZS5oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJlc3BvbnNlQWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2s6IHsgdmFsdWU6IHJlc3BvbnNlQmVmb3JlLm9rIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWQ6IHsgdmFsdWU6IHJlc3BvbnNlQmVmb3JlLnJlZGlyZWN0ZWQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudHlwZSB9LAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHsgdmFsdWU6IHJlc3BvbnNlQmVmb3JlLnVybCB9LAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUFmdGVyOwogICAgICAgICAgICAgICAgfSkuY2F0Y2goKCApID0+CiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCZWZvcmUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0pOwogICAgc2VsZi5YTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IG5ldyBQcm94eShzZWxmLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuLCB7CiAgICAgICAgYXBwbHk6IGFzeW5jICh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpID0+IHsKICAgICAgICAgICAgaWYgKCByZVVybC50ZXN0KHVybEZyb21BcmcoYXJnc1sxXSkpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc0FyZy5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoIHRoaXNBcmcucmVhZHlTdGF0ZSAhPT0gNCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpc0FyZy5yZXNwb25zZVR5cGU7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gJ2RvY3VtZW50JyB8fAogICAgICAgICAgICAgICAgICAgIHR5cGUgPT09ICcnICYmIHRoaXNBcmcucmVzcG9uc2VYTUwgaW5zdGFuY2VvZiBYTUxEb2N1bWVudAogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgcHJ1bmVGcm9tRG9jKHRoaXNBcmcucmVzcG9uc2VYTUwpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcigpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRvdXQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXNBcmcucmVzcG9uc2VYTUwpOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzQXJnLCAncmVzcG9uc2VUZXh0JywgeyB2YWx1ZTogdGV4dG91dCB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIHR5cGVvZiB0aGlzQXJnLnJlc3BvbnNlID09PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXNBcmcsICdyZXNwb25zZScsIHsgdmFsdWU6IHRleHRvdXQgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICB0eXBlID09PSAndGV4dCcgfHwKICAgICAgICAgICAgICAgICAgICB0eXBlID09PSAnJyAmJiB0eXBlb2YgdGhpc0FyZy5yZXNwb25zZVRleHQgPT09ICdzdHJpbmcnCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0aW4gPSB0aGlzQXJnLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0b3V0ID0gcHJ1bmVGcm9tVGV4dCh0ZXh0aW4pOwogICAgICAgICAgICAgICAgICAgIGlmICggdGV4dG91dCA9PT0gdGV4dGluICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpc0FyZywgJ3Jlc3BvbnNlJywgeyB2YWx1ZTogdGV4dG91dCB9KTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpc0FyZywgJ3Jlc3BvbnNlVGV4dCcsIHsgdmFsdWU6IHRleHRvdXQgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKTsKICAgICAgICB9CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"m3u-prune.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQoKICAoZnVuY3Rpb24gbTN1UHJ1bmUoCiAgICBtM3VQYXR0ZXJuID0gJycsCiAgICB1cmxQYXR0ZXJuID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiBtM3VQYXR0ZXJuICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgnbTN1LXBydW5lJywgbTN1UGF0dGVybiwgdXJsUGF0dGVybik7CiAgICBjb25zdCB0b0xvZyA9IFtdOwogICAgY29uc3QgcmVnZXhGcm9tQXJnID0gYXJnID0+IHsKICAgICAgICBpZiAoIGFyZyA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oW2dtc10qKSQvLmV4ZWMoYXJnKTsKICAgICAgICBpZiAoIG1hdGNoICE9PSBudWxsICkgewogICAgICAgICAgICBsZXQgZmxhZ3MgPSBtYXRjaFsyXSB8fCAnJzsKICAgICAgICAgICAgaWYgKCBmbGFncy5pbmNsdWRlcygnbScpICkgeyBmbGFncyArPSAncyc7IH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIGZsYWdzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoCiAgICAgICAgICAgIGFyZy5yZXBsYWNlKC9bLis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpLnJlcGxhY2UoL1wqKy9nLCAnLio/JykKICAgICAgICApOwogICAgfTsKICAgIGNvbnN0IHJlTTN1ID0gcmVnZXhGcm9tQXJnKG0zdVBhdHRlcm4pOwogICAgY29uc3QgcmVVcmwgPSByZWdleEZyb21BcmcodXJsUGF0dGVybik7CiAgICBjb25zdCBwcnVuZVNwbGljZW91dEJsb2NrID0gKGxpbmVzLCBpKSA9PiB7CiAgICAgICAgaWYgKCBsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtQ1VFOlRZUEU9IlNwbGljZU91dCInKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdG9Mb2cucHVzaChgXHQke2xpbmVzW2ldfWApOwogICAgICAgIGxpbmVzW2ldID0gdW5kZWZpbmVkOyBpICs9IDE7CiAgICAgICAgaWYgKCBsaW5lc1tpXS5zdGFydHNXaXRoKCcjRVhULVgtQVNTRVQ6Q0FJRCcpICkgewogICAgICAgICAgICB0b0xvZy5wdXNoKGBcdCR7bGluZXNbaV19YCk7CiAgICAgICAgICAgIGxpbmVzW2ldID0gdW5kZWZpbmVkOyBpICs9IDE7CiAgICAgICAgfQogICAgICAgIGlmICggbGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVC1YLVNDVEUzNTonKSApIHsKICAgICAgICAgICAgdG9Mb2cucHVzaChgXHQke2xpbmVzW2ldfWApOwogICAgICAgICAgICBsaW5lc1tpXSA9IHVuZGVmaW5lZDsgaSArPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoIGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1DVUUtSU4nKSApIHsKICAgICAgICAgICAgdG9Mb2cucHVzaChgXHQke2xpbmVzW2ldfWApOwogICAgICAgICAgICBsaW5lc1tpXSA9IHVuZGVmaW5lZDsgaSArPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoIGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1TQ1RFMzU6JykgKSB7CiAgICAgICAgICAgIHRvTG9nLnB1c2goYFx0JHtsaW5lc1tpXX1gKTsKICAgICAgICAgICAgbGluZXNbaV0gPSB1bmRlZmluZWQ7IGkgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgY29uc3QgcHJ1bmVJbmZCbG9jayA9IChsaW5lcywgaSkgPT4gewogICAgICAgIGlmICggbGluZXNbaV0uc3RhcnRzV2l0aCgnI0VYVElORicpID09PSBmYWxzZSApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgaWYgKCByZU0zdS50ZXN0KGxpbmVzW2krMV0pID09PSBmYWxzZSApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgdG9Mb2cucHVzaCgnRGlzY2FyZGluZycsIGBcdCR7bGluZXNbaV19LCBcdCR7bGluZXNbaSsxXX1gKTsKICAgICAgICBsaW5lc1tpXSA9IGxpbmVzW2krMV0gPSB1bmRlZmluZWQ7IGkgKz0gMjsKICAgICAgICBpZiAoIGxpbmVzW2ldLnN0YXJ0c1dpdGgoJyNFWFQtWC1ESVNDT05USU5VSVRZJykgKSB7CiAgICAgICAgICAgIHRvTG9nLnB1c2goYFx0JHtsaW5lc1tpXX1gKTsKICAgICAgICAgICAgbGluZXNbaV0gPSB1bmRlZmluZWQ7IGkgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgY29uc3QgcHJ1bmVyID0gdGV4dCA9PiB7CiAgICAgICAgaWYgKCAoL15ccyojRVhUTTNVLy50ZXN0KHRleHQpKSA9PT0gZmFsc2UgKSB7IHJldHVybiB0ZXh0OyB9CiAgICAgICAgaWYgKCBtM3VQYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgc2FmZS51Ym9Mb2coYCBDb250ZW50OlxuJHt0ZXh0fWApOwogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKCByZU0zdS5tdWx0aWxpbmUgKSB7CiAgICAgICAgICAgIHJlTTN1Lmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVNM3UuZXhlYyh0ZXh0KTsKICAgICAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBsZXQgZGlzY2FyZCA9IG1hdGNoWzBdOwogICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IHRleHQuc2xpY2UoMCwgbWF0Y2guaW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIC9eW1xuXHJdKy8udGVzdChkaXNjYXJkKSA9PT0gZmFsc2UgJiYKICAgICAgICAgICAgICAgICAgICAvW1xuXHJdKyQvLnRlc3QoYmVmb3JlKSA9PT0gZmFsc2UKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2ZMaW5lID0gL1teXG5ccl0rJC8uZXhlYyhiZWZvcmUpOwogICAgICAgICAgICAgICAgICAgIGlmICggc3RhcnRPZkxpbmUgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZS5zbGljZSgwLCBzdGFydE9mTGluZS5pbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBzdGFydE9mTGluZVswXSArIGRpc2NhcmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGFmdGVyID0gdGV4dC5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgL1tcblxyXSskLy50ZXN0KGRpc2NhcmQpID09PSBmYWxzZSAmJgogICAgICAgICAgICAgICAgICAgIC9eW1xuXHJdKy8udGVzdChhZnRlcikgPT09IGZhbHNlCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRPZkxpbmUgPSAvXlteXG5ccl0rLy5leGVjKGFmdGVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIGVuZE9mTGluZSAhPT0gbnVsbCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5zbGljZShlbmRPZkxpbmUuaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkICs9IGRpc2NhcmQgKyBlbmRPZkxpbmVbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGV4dCA9IGJlZm9yZS50cmltKCkgKyAnXG4nICsgYWZ0ZXIudHJpbSgpOwogICAgICAgICAgICAgICAgcmVNM3UubGFzdEluZGV4ID0gYmVmb3JlLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB0b0xvZy5wdXNoKCdEaXNjYXJkaW5nJywgLi4uc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChkaXNjYXJkLCAvXG4rLykubWFwKHMgPT4gYFx0JHtzfWApKTsKICAgICAgICAgICAgICAgIGlmICggcmVNM3UuZ2xvYmFsID09PSBmYWxzZSApIHsgYnJlYWs7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGluZXMgPSBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHRleHQsIC9cblxyfFxufFxyLyk7CiAgICAgICAgZm9yICggbGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgIGlmICggbGluZXNbaV0gPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgaWYgKCBwcnVuZVNwbGljZW91dEJsb2NrKGxpbmVzLCBpKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgaWYgKCBwcnVuZUluZkJsb2NrKGxpbmVzLCBpKSApIHsgY29udGludWU7IH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmVzLmZpbHRlcihsID0+IGwgIT09IHVuZGVmaW5lZCkuam9pbignXG4nKTsKICAgIH07CiAgICBjb25zdCB1cmxGcm9tQXJnID0gYXJnID0+IHsKICAgICAgICBpZiAoIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICkgeyByZXR1cm4gYXJnOyB9CiAgICAgICAgaWYgKCBhcmcgaW5zdGFuY2VvZiBSZXF1ZXN0ICkgeyByZXR1cm4gYXJnLnVybDsgfQogICAgICAgIHJldHVybiBTdHJpbmcoYXJnKTsKICAgIH07CiAgICBwcm94eUFwcGx5Rm4oJ2ZldGNoJywgYXN5bmMgZnVuY3Rpb24gZmV0Y2goY29udGV4dCkgewogICAgICAgIGNvbnN0IGFyZ3MgPSBjb250ZXh0LmNhbGxBcmdzOwogICAgICAgIGNvbnN0IGZldGNoUHJvbWlzZSA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIGlmICggcmVVcmwudGVzdCh1cmxGcm9tQXJnKGFyZ3NbMF0pKSA9PT0gZmFsc2UgKSB7IHJldHVybiBmZXRjaFByb21pc2U7IH0KICAgICAgICBjb25zdCByZXNwb25zZUJlZm9yZSA9IGF3YWl0IGZldGNoUHJvbWlzZTsKICAgICAgICBjb25zdCByZXNwb25zZUNsb25lID0gcmVzcG9uc2VCZWZvcmUuY2xvbmUoKTsKICAgICAgICBjb25zdCB0ZXh0QmVmb3JlID0gYXdhaXQgcmVzcG9uc2VDbG9uZS50ZXh0KCk7CiAgICAgICAgY29uc3QgdGV4dEFmdGVyID0gcHJ1bmVyKHRleHRCZWZvcmUpOwogICAgICAgIGlmICggdGV4dEFmdGVyID09PSB0ZXh0QmVmb3JlICkgeyByZXR1cm4gcmVzcG9uc2VCZWZvcmU7IH0KICAgICAgICBjb25zdCByZXNwb25zZUFmdGVyID0gbmV3IFJlc3BvbnNlKHRleHRBZnRlciwgewogICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlQmVmb3JlLnN0YXR1cywKICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2VCZWZvcmUuc3RhdHVzVGV4dCwKICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VCZWZvcmUuaGVhZGVycywKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyZXNwb25zZUFmdGVyLCB7CiAgICAgICAgICAgIHVybDogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudXJsIH0sCiAgICAgICAgICAgIHR5cGU6IHsgdmFsdWU6IHJlc3BvbnNlQmVmb3JlLnR5cGUgfSwKICAgICAgICB9KTsKICAgICAgICBpZiAoIHRvTG9nLmxlbmd0aCAhPT0gMCApIHsKICAgICAgICAgICAgdG9Mb2cudW5zaGlmdChsb2dQcmVmaXgpOwogICAgICAgICAgICBzYWZlLnVib0xvZyh0b0xvZy5qb2luKCdcbicpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQWZ0ZXI7CiAgICB9KQogICAgc2VsZi5YTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IG5ldyBQcm94eShzZWxmLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuLCB7CiAgICAgICAgYXBwbHk6IGFzeW5jICh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpID0+IHsKICAgICAgICAgICAgaWYgKCByZVVybC50ZXN0KHVybEZyb21BcmcoYXJnc1sxXSkpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc0FyZy5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoIHRoaXNBcmcucmVhZHlTdGF0ZSAhPT0gNCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpc0FyZy5yZXNwb25zZVR5cGU7CiAgICAgICAgICAgICAgICBpZiAoIHR5cGUgIT09ICcnICYmIHR5cGUgIT09ICd0ZXh0JyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0aW4gPSB0aGlzQXJnLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgIGNvbnN0IHRleHRvdXQgPSBwcnVuZXIodGV4dGluKTsKICAgICAgICAgICAgICAgIGlmICggdGV4dG91dCA9PT0gdGV4dGluICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzQXJnLCAncmVzcG9uc2UnLCB7IHZhbHVlOiB0ZXh0b3V0IH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXNBcmcsICdyZXNwb25zZVRleHQnLCB7IHZhbHVlOiB0ZXh0b3V0IH0pOwogICAgICAgICAgICAgICAgaWYgKCB0b0xvZy5sZW5ndGggIT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgdG9Mb2cudW5zaGlmdChsb2dQcmVmaXgpOwogICAgICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKHRvTG9nLmpvaW4oJ1xuJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKTsKICAgICAgICB9CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"call-nothrow.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBjYWxsTm90aHJvdygKICAgIGNoYWluID0gJycKKSB7CiAgICBpZiAoIHR5cGVvZiBjaGFpbiAhPT0gJ3N0cmluZycgKSB7IHJldHVybjsgfQogICAgaWYgKCBjaGFpbiA9PT0gJycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBwYXJ0cyA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwoY2hhaW4sICcuJyk7CiAgICBsZXQgb3duZXIgPSB3aW5kb3csIHByb3A7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgcHJvcCA9IHBhcnRzLnNoaWZ0KCk7CiAgICAgICAgaWYgKCBwYXJ0cy5sZW5ndGggPT09IDAgKSB7IGJyZWFrOyB9CiAgICAgICAgb3duZXIgPSBvd25lcltwcm9wXTsKICAgICAgICBpZiAoIG93bmVyIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICB9CiAgICBpZiAoIHByb3AgPT09ICcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IGZuID0gb3duZXJbcHJvcF07CiAgICBpZiAoIHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuOyB9CiAgICBvd25lcltwcm9wXSA9IG5ldyBQcm94eShmbiwgewogICAgICAgIGFwcGx5OiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgICAgICAgIGxldCByOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgciA9IFJlZmxlY3QuYXBwbHkoLi4uYXJncyk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByOwogICAgICAgIH0sCiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"remove-node-text.js","aliases":["rmnt.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHJ1bkF0KGZuLCB3aGVuKSB7CiAgICBjb25zdCBpbnRGcm9tUmVhZHlTdGF0ZSA9IHN0YXRlID0+IHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gewogICAgICAgICAgICAnbG9hZGluZyc6IDEsICdhc2FwJzogMSwKICAgICAgICAgICAgJ2ludGVyYWN0aXZlJzogMiwgJ2VuZCc6IDIsICcyJzogMiwKICAgICAgICAgICAgJ2NvbXBsZXRlJzogMywgJ2lkbGUnOiAzLCAnMyc6IDMsCiAgICAgICAgfTsKICAgICAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5pc0FycmF5KHN0YXRlKSA/IHN0YXRlIDogWyBzdGF0ZSBdOwogICAgICAgIGZvciAoIGNvbnN0IHRva2VuIG9mIHRva2VucyApIHsKICAgICAgICAgICAgY29uc3QgcHJvcCA9IGAke3Rva2VufWA7CiAgICAgICAgICAgIGlmICggT2JqZWN0Lmhhc093bih0YXJnZXRzLCBwcm9wKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIHJldHVybiB0YXJnZXRzW3Byb3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBjb25zdCBydW5BdCA9IGludEZyb21SZWFkeVN0YXRlKHdoZW4pOwogICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSBydW5BdCApIHsKICAgICAgICBmbigpOyByZXR1cm47CiAgICB9CiAgICBjb25zdCBvblN0YXRlQ2hhbmdlID0gKCApID0+IHsKICAgICAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpIDwgcnVuQXQgKSB7IHJldHVybjsgfQogICAgICAgIGZuKCk7CiAgICAgICAgc2FmZS5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKICAgIH07CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGFyZ3MgPSBbICdyZWFkeXN0YXRlY2hhbmdlJywgb25TdGF0ZUNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlIH0gXTsKICAgIHNhZmUuYWRkRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7Cn0KZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiByZXBsYWNlTm9kZVRleHRGbigKICAgIG5vZGVOYW1lID0gJycsCiAgICBwYXR0ZXJuID0gJycsCiAgICByZXBsYWNlbWVudCA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ3JlcGxhY2Utbm9kZS10ZXh0LmZuJywgLi4uQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKICAgIGNvbnN0IHJlTm9kZU5hbWUgPSBzYWZlLnBhdHRlcm5Ub1JlZ2V4KG5vZGVOYW1lLCAnaScsIHRydWUpOwogICAgY29uc3QgcmVQYXR0ZXJuID0gc2FmZS5wYXR0ZXJuVG9SZWdleChwYXR0ZXJuLCAnZ21zJyk7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDMpOwogICAgY29uc3QgcmVJbmNsdWRlcyA9IGV4dHJhQXJncy5pbmNsdWRlcyB8fCBleHRyYUFyZ3MuY29uZGl0aW9uCiAgICAgICAgPyBzYWZlLnBhdHRlcm5Ub1JlZ2V4KGV4dHJhQXJncy5pbmNsdWRlcyB8fCBleHRyYUFyZ3MuY29uZGl0aW9uLCAnbXMnKQogICAgICAgIDogbnVsbDsKICAgIGNvbnN0IHJlRXhjbHVkZXMgPSBleHRyYUFyZ3MuZXhjbHVkZXMKICAgICAgICA/IHNhZmUucGF0dGVyblRvUmVnZXgoZXh0cmFBcmdzLmV4Y2x1ZGVzLCAnbXMnKQogICAgICAgIDogbnVsbDsKICAgIGNvbnN0IHN0b3AgPSAodGFrZVJlY29yZCA9IHRydWUpID0+IHsKICAgICAgICBpZiAoIHRha2VSZWNvcmQgKSB7CiAgICAgICAgICAgIGhhbmRsZU11dGF0aW9ucyhvYnNlcnZlci50YWtlUmVjb3JkcygpKTsKICAgICAgICB9CiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1F1aXR0aW5nJyk7CiAgICAgICAgfQogICAgfTsKICAgIGNvbnN0IHRleHRDb250ZW50RmFjdG9yeSA9ICgoICkgPT4gewogICAgICAgIGNvbnN0IG91dCA9IHsgY3JlYXRlU2NyaXB0OiBzID0+IHMgfTsKICAgICAgICBjb25zdCB7IHRydXN0ZWRUeXBlczogdHQgfSA9IHNlbGY7CiAgICAgICAgaWYgKCB0dCBpbnN0YW5jZW9mIE9iamVjdCApIHsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgdHQuZ2V0UHJvcGVydHlUeXBlID09PSAnZnVuY3Rpb24nICkgewogICAgICAgICAgICAgICAgaWYgKCB0dC5nZXRQcm9wZXJ0eVR5cGUoJ3NjcmlwdCcsICd0ZXh0Q29udGVudCcpID09PSAnVHJ1c3RlZFNjcmlwdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR0LmNyZWF0ZVBvbGljeShnZXRSYW5kb21Ub2tlbkZuKCksIG91dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dDsKICAgIH0pKCk7CiAgICBsZXQgc2VkQ291bnQgPSBleHRyYUFyZ3Muc2VkQ291bnQgfHwgMDsKICAgIGNvbnN0IGhhbmRsZU5vZGUgPSBub2RlID0+IHsKICAgICAgICBjb25zdCBiZWZvcmUgPSBub2RlLnRleHRDb250ZW50OwogICAgICAgIGlmICggcmVJbmNsdWRlcyApIHsKICAgICAgICAgICAgcmVJbmNsdWRlcy5sYXN0SW5kZXggPSAwOwogICAgICAgICAgICBpZiAoIHNhZmUuUmVnRXhwX3Rlc3QuY2FsbChyZUluY2x1ZGVzLCBiZWZvcmUpID09PSBmYWxzZSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICB9CiAgICAgICAgaWYgKCByZUV4Y2x1ZGVzICkgewogICAgICAgICAgICByZUV4Y2x1ZGVzLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgIGlmICggc2FmZS5SZWdFeHBfdGVzdC5jYWxsKHJlRXhjbHVkZXMsIGJlZm9yZSkgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgfQogICAgICAgIHJlUGF0dGVybi5sYXN0SW5kZXggPSAwOwogICAgICAgIGlmICggc2FmZS5SZWdFeHBfdGVzdC5jYWxsKHJlUGF0dGVybiwgYmVmb3JlKSA9PT0gZmFsc2UgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgcmVQYXR0ZXJuLmxhc3RJbmRleCA9IDA7CiAgICAgICAgY29uc3QgYWZ0ZXIgPSBwYXR0ZXJuICE9PSAnJwogICAgICAgICAgICA/IGJlZm9yZS5yZXBsYWNlKHJlUGF0dGVybiwgcmVwbGFjZW1lbnQpCiAgICAgICAgICAgIDogcmVwbGFjZW1lbnQ7CiAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IG5vZGUubm9kZU5hbWUgPT09ICdTQ1JJUFQnCiAgICAgICAgICAgID8gdGV4dENvbnRlbnRGYWN0b3J5LmNyZWF0ZVNjcmlwdChhZnRlcikKICAgICAgICAgICAgOiBhZnRlcjsKICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBUZXh0IGJlZm9yZTpcbiR7YmVmb3JlLnRyaW0oKX1gKTsKICAgICAgICB9CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgVGV4dCBhZnRlcjpcbiR7YWZ0ZXIudHJpbSgpfWApOwogICAgICAgIHJldHVybiBzZWRDb3VudCA9PT0gMCB8fCAoc2VkQ291bnQgLT0gMSkgIT09IDA7CiAgICB9OwogICAgY29uc3QgaGFuZGxlTXV0YXRpb25zID0gbXV0YXRpb25zID0+IHsKICAgICAgICBmb3IgKCBjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IG5vZGUgb2YgbXV0YXRpb24uYWRkZWROb2RlcyApIHsKICAgICAgICAgICAgICAgIGlmICggcmVOb2RlTmFtZS50ZXN0KG5vZGUubm9kZU5hbWUpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGlmICggaGFuZGxlTm9kZShub2RlKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIHN0b3AoZmFsc2UpOyByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihoYW5kbGVNdXRhdGlvbnMpOwogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApIHsKICAgICAgICBjb25zdCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcigKICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19URVhUCiAgICAgICAgKTsKICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTsKICAgICAgICAgICAgY291bnQgKz0gMTsKICAgICAgICAgICAgaWYgKCBub2RlID09PSBudWxsICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIHJlTm9kZU5hbWUudGVzdChub2RlLm5vZGVOYW1lKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggbm9kZSA9PT0gZG9jdW1lbnQuY3VycmVudFNjcmlwdCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgaWYgKCBoYW5kbGVOb2RlKG5vZGUpICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBzdG9wKCk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGAke2NvdW50fSBub2RlcyBwcmVzZW50IGJlZm9yZSBpbnN0YWxsaW5nIG11dGF0aW9uIG9ic2VydmVyYCk7CiAgICB9CiAgICBpZiAoIGV4dHJhQXJncy5zdGF5ICkgeyByZXR1cm47IH0KICAgIHJ1bkF0KCggKSA9PiB7CiAgICAgICAgY29uc3QgcXVpdEFmdGVyID0gZXh0cmFBcmdzLnF1aXRBZnRlciB8fCAwOwogICAgICAgIGlmICggcXVpdEFmdGVyICE9PSAwICkgewogICAgICAgICAgICBzZXRUaW1lb3V0KCggKSA9PiB7IHN0b3AoKTsgfSwgcXVpdEFmdGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdG9wKCk7CiAgICAgICAgfQogICAgfSwgJ2ludGVyYWN0aXZlJyk7Cn0KCiAgKGZ1bmN0aW9uIHJlbW92ZU5vZGVUZXh0KAogICAgbm9kZU5hbWUsCiAgICBpbmNsdWRlcywKICAgIC4uLmV4dHJhQXJncwopIHsKICAgIHJlcGxhY2VOb2RlVGV4dEZuKG5vZGVOYW1lLCAnJywgJycsICdpbmNsdWRlcycsIGluY2x1ZGVzIHx8ICcnLCAuLi5leHRyYUFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"prevent-canvas.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CgogIChmdW5jdGlvbiBwcmV2ZW50Q2FudmFzKAogICAgY29udGV4dFR5cGUgPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgcGF0dGVybiA9IHNhZmUuaW5pdFBhdHRlcm4oY29udGV4dFR5cGUsIHsgY2FuTmVnYXRlOiB0cnVlIH0pOwogICAgY29uc3QgcHJvdG8gPSBnbG9iYWxUaGlzLkhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZTsKICAgIHByb3RvLmdldENvbnRleHQgPSBuZXcgUHJveHkocHJvdG8uZ2V0Q29udGV4dCwgewogICAgICAgIGFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncykgewogICAgICAgICAgICBpZiAoIHNhZmUudGVzdFBhdHRlcm4ocGF0dGVybiwgYXJnc1swXSkgKSB7IHJldHVybiBudWxsOyB9CiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncyk7CiAgICAgICAgfQogICAgfSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"multiup.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgCiAgKGZ1bmN0aW9uIG11bHRpdXAoKSB7CiAgICBjb25zdCBoYW5kbGVyID0gZXYgPT4gewogICAgICAgIGNvbnN0IHRhcmdldCA9IGV2LnRhcmdldDsKICAgICAgICBpZiAoIHRhcmdldC5tYXRjaGVzKCdidXR0b25bbGlua10nKSA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IGFuY2VzdG9yID0gdGFyZ2V0LmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICBpZiAoIGFuY2VzdG9yID09PSBudWxsICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIGFuY2VzdG9yICE9PSB0YXJnZXQucGFyZW50RWxlbWVudCApIHsgcmV0dXJuOyB9CiAgICAgICAgY29uc3QgbGluayA9ICh0YXJnZXQuZ2V0QXR0cmlidXRlKCdsaW5rJykgfHwgJycpLnRyaW0oKTsKICAgICAgICBpZiAoIGxpbmsgPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSBsaW5rOwogICAgfTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-replace-node-text.js","aliases":["trusted-rpnt.js","replace-node-text.js","rpnt.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHJ1bkF0KGZuLCB3aGVuKSB7CiAgICBjb25zdCBpbnRGcm9tUmVhZHlTdGF0ZSA9IHN0YXRlID0+IHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gewogICAgICAgICAgICAnbG9hZGluZyc6IDEsICdhc2FwJzogMSwKICAgICAgICAgICAgJ2ludGVyYWN0aXZlJzogMiwgJ2VuZCc6IDIsICcyJzogMiwKICAgICAgICAgICAgJ2NvbXBsZXRlJzogMywgJ2lkbGUnOiAzLCAnMyc6IDMsCiAgICAgICAgfTsKICAgICAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5pc0FycmF5KHN0YXRlKSA/IHN0YXRlIDogWyBzdGF0ZSBdOwogICAgICAgIGZvciAoIGNvbnN0IHRva2VuIG9mIHRva2VucyApIHsKICAgICAgICAgICAgY29uc3QgcHJvcCA9IGAke3Rva2VufWA7CiAgICAgICAgICAgIGlmICggT2JqZWN0Lmhhc093bih0YXJnZXRzLCBwcm9wKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIHJldHVybiB0YXJnZXRzW3Byb3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBjb25zdCBydW5BdCA9IGludEZyb21SZWFkeVN0YXRlKHdoZW4pOwogICAgaWYgKCBpbnRGcm9tUmVhZHlTdGF0ZShkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSBydW5BdCApIHsKICAgICAgICBmbigpOyByZXR1cm47CiAgICB9CiAgICBjb25zdCBvblN0YXRlQ2hhbmdlID0gKCApID0+IHsKICAgICAgICBpZiAoIGludEZyb21SZWFkeVN0YXRlKGRvY3VtZW50LnJlYWR5U3RhdGUpIDwgcnVuQXQgKSB7IHJldHVybjsgfQogICAgICAgIGZuKCk7CiAgICAgICAgc2FmZS5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KGRvY3VtZW50LCBhcmdzKTsKICAgIH07CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGFyZ3MgPSBbICdyZWFkeXN0YXRlY2hhbmdlJywgb25TdGF0ZUNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlIH0gXTsKICAgIHNhZmUuYWRkRXZlbnRMaXN0ZW5lci5hcHBseShkb2N1bWVudCwgYXJncyk7Cn0KZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiByZXBsYWNlTm9kZVRleHRGbigKICAgIG5vZGVOYW1lID0gJycsCiAgICBwYXR0ZXJuID0gJycsCiAgICByZXBsYWNlbWVudCA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ3JlcGxhY2Utbm9kZS10ZXh0LmZuJywgLi4uQXJyYXkuZnJvbShhcmd1bWVudHMpKTsKICAgIGNvbnN0IHJlTm9kZU5hbWUgPSBzYWZlLnBhdHRlcm5Ub1JlZ2V4KG5vZGVOYW1lLCAnaScsIHRydWUpOwogICAgY29uc3QgcmVQYXR0ZXJuID0gc2FmZS5wYXR0ZXJuVG9SZWdleChwYXR0ZXJuLCAnZ21zJyk7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhBcnJheS5mcm9tKGFyZ3VtZW50cyksIDMpOwogICAgY29uc3QgcmVJbmNsdWRlcyA9IGV4dHJhQXJncy5pbmNsdWRlcyB8fCBleHRyYUFyZ3MuY29uZGl0aW9uCiAgICAgICAgPyBzYWZlLnBhdHRlcm5Ub1JlZ2V4KGV4dHJhQXJncy5pbmNsdWRlcyB8fCBleHRyYUFyZ3MuY29uZGl0aW9uLCAnbXMnKQogICAgICAgIDogbnVsbDsKICAgIGNvbnN0IHJlRXhjbHVkZXMgPSBleHRyYUFyZ3MuZXhjbHVkZXMKICAgICAgICA/IHNhZmUucGF0dGVyblRvUmVnZXgoZXh0cmFBcmdzLmV4Y2x1ZGVzLCAnbXMnKQogICAgICAgIDogbnVsbDsKICAgIGNvbnN0IHN0b3AgPSAodGFrZVJlY29yZCA9IHRydWUpID0+IHsKICAgICAgICBpZiAoIHRha2VSZWNvcmQgKSB7CiAgICAgICAgICAgIGhhbmRsZU11dGF0aW9ucyhvYnNlcnZlci50YWtlUmVjb3JkcygpKTsKICAgICAgICB9CiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgIGlmICggc2FmZS5sb2dMZXZlbCA+IDEgKSB7CiAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1F1aXR0aW5nJyk7CiAgICAgICAgfQogICAgfTsKICAgIGNvbnN0IHRleHRDb250ZW50RmFjdG9yeSA9ICgoICkgPT4gewogICAgICAgIGNvbnN0IG91dCA9IHsgY3JlYXRlU2NyaXB0OiBzID0+IHMgfTsKICAgICAgICBjb25zdCB7IHRydXN0ZWRUeXBlczogdHQgfSA9IHNlbGY7CiAgICAgICAgaWYgKCB0dCBpbnN0YW5jZW9mIE9iamVjdCApIHsKICAgICAgICAgICAgaWYgKCB0eXBlb2YgdHQuZ2V0UHJvcGVydHlUeXBlID09PSAnZnVuY3Rpb24nICkgewogICAgICAgICAgICAgICAgaWYgKCB0dC5nZXRQcm9wZXJ0eVR5cGUoJ3NjcmlwdCcsICd0ZXh0Q29udGVudCcpID09PSAnVHJ1c3RlZFNjcmlwdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR0LmNyZWF0ZVBvbGljeShnZXRSYW5kb21Ub2tlbkZuKCksIG91dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dDsKICAgIH0pKCk7CiAgICBsZXQgc2VkQ291bnQgPSBleHRyYUFyZ3Muc2VkQ291bnQgfHwgMDsKICAgIGNvbnN0IGhhbmRsZU5vZGUgPSBub2RlID0+IHsKICAgICAgICBjb25zdCBiZWZvcmUgPSBub2RlLnRleHRDb250ZW50OwogICAgICAgIGlmICggcmVJbmNsdWRlcyApIHsKICAgICAgICAgICAgcmVJbmNsdWRlcy5sYXN0SW5kZXggPSAwOwogICAgICAgICAgICBpZiAoIHNhZmUuUmVnRXhwX3Rlc3QuY2FsbChyZUluY2x1ZGVzLCBiZWZvcmUpID09PSBmYWxzZSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICB9CiAgICAgICAgaWYgKCByZUV4Y2x1ZGVzICkgewogICAgICAgICAgICByZUV4Y2x1ZGVzLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgIGlmICggc2FmZS5SZWdFeHBfdGVzdC5jYWxsKHJlRXhjbHVkZXMsIGJlZm9yZSkgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgfQogICAgICAgIHJlUGF0dGVybi5sYXN0SW5kZXggPSAwOwogICAgICAgIGlmICggc2FmZS5SZWdFeHBfdGVzdC5jYWxsKHJlUGF0dGVybiwgYmVmb3JlKSA9PT0gZmFsc2UgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgcmVQYXR0ZXJuLmxhc3RJbmRleCA9IDA7CiAgICAgICAgY29uc3QgYWZ0ZXIgPSBwYXR0ZXJuICE9PSAnJwogICAgICAgICAgICA/IGJlZm9yZS5yZXBsYWNlKHJlUGF0dGVybiwgcmVwbGFjZW1lbnQpCiAgICAgICAgICAgIDogcmVwbGFjZW1lbnQ7CiAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IG5vZGUubm9kZU5hbWUgPT09ICdTQ1JJUFQnCiAgICAgICAgICAgID8gdGV4dENvbnRlbnRGYWN0b3J5LmNyZWF0ZVNjcmlwdChhZnRlcikKICAgICAgICAgICAgOiBhZnRlcjsKICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBUZXh0IGJlZm9yZTpcbiR7YmVmb3JlLnRyaW0oKX1gKTsKICAgICAgICB9CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgVGV4dCBhZnRlcjpcbiR7YWZ0ZXIudHJpbSgpfWApOwogICAgICAgIHJldHVybiBzZWRDb3VudCA9PT0gMCB8fCAoc2VkQ291bnQgLT0gMSkgIT09IDA7CiAgICB9OwogICAgY29uc3QgaGFuZGxlTXV0YXRpb25zID0gbXV0YXRpb25zID0+IHsKICAgICAgICBmb3IgKCBjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMgKSB7CiAgICAgICAgICAgIGZvciAoIGNvbnN0IG5vZGUgb2YgbXV0YXRpb24uYWRkZWROb2RlcyApIHsKICAgICAgICAgICAgICAgIGlmICggcmVOb2RlTmFtZS50ZXN0KG5vZGUubm9kZU5hbWUpID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGlmICggaGFuZGxlTm9kZShub2RlKSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIHN0b3AoZmFsc2UpOyByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihoYW5kbGVNdXRhdGlvbnMpOwogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CiAgICBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApIHsKICAgICAgICBjb25zdCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcigKICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19URVhUCiAgICAgICAgKTsKICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTsKICAgICAgICAgICAgY291bnQgKz0gMTsKICAgICAgICAgICAgaWYgKCBub2RlID09PSBudWxsICkgeyBicmVhazsgfQogICAgICAgICAgICBpZiAoIHJlTm9kZU5hbWUudGVzdChub2RlLm5vZGVOYW1lKSA9PT0gZmFsc2UgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggbm9kZSA9PT0gZG9jdW1lbnQuY3VycmVudFNjcmlwdCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgaWYgKCBoYW5kbGVOb2RlKG5vZGUpICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICBzdG9wKCk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGAke2NvdW50fSBub2RlcyBwcmVzZW50IGJlZm9yZSBpbnN0YWxsaW5nIG11dGF0aW9uIG9ic2VydmVyYCk7CiAgICB9CiAgICBpZiAoIGV4dHJhQXJncy5zdGF5ICkgeyByZXR1cm47IH0KICAgIHJ1bkF0KCggKSA9PiB7CiAgICAgICAgY29uc3QgcXVpdEFmdGVyID0gZXh0cmFBcmdzLnF1aXRBZnRlciB8fCAwOwogICAgICAgIGlmICggcXVpdEFmdGVyICE9PSAwICkgewogICAgICAgICAgICBzZXRUaW1lb3V0KCggKSA9PiB7IHN0b3AoKTsgfSwgcXVpdEFmdGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdG9wKCk7CiAgICAgICAgfQogICAgfSwgJ2ludGVyYWN0aXZlJyk7Cn0KCiAgKGZ1bmN0aW9uIHJlcGxhY2VOb2RlVGV4dCgKICAgIG5vZGVOYW1lLAogICAgcGF0dGVybiwKICAgIHJlcGxhY2VtZW50LAogICAgLi4uZXh0cmFBcmdzCikgewogICAgcmVwbGFjZU5vZGVUZXh0Rm4obm9kZU5hbWUsIHBhdHRlcm4sIHJlcGxhY2VtZW50LCAuLi5leHRyYUFyZ3MpOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-replace-fetch-response.js","aliases":["trusted-rpfr.js"],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmZ1bmN0aW9uIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuKHJlc291cmNlLCBvcHRpb25zKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHByb3BzID0gWwogICAgICAgICdib2R5JywgJ2NhY2hlJywgJ2NyZWRlbnRpYWxzJywgJ2R1cGxleCcsICdoZWFkZXJzJywKICAgICAgICAnaW50ZWdyaXR5JywgJ2tlZXBhbGl2ZScsICdtZXRob2QnLCAnbW9kZScsICdwcmlvcml0eScsCiAgICAgICAgJ3JlZGlyZWN0JywgJ3JlZmVycmVyJywgJ3JlZmVycmVyUG9saWN5JywgJ3VybCcKICAgIF07CiAgICBjb25zdCBvdXQgPSB7fTsKICAgIGlmICggY29sbGF0ZUZldGNoQXJndW1lbnRzRm4uY29sbGF0ZUtub3duUHJvcHMgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyA9IChzcmMsIG91dCkgPT4gewogICAgICAgICAgICBmb3IgKCBjb25zdCBwcm9wIG9mIHByb3BzICkgewogICAgICAgICAgICAgICAgaWYgKCBzcmNbcHJvcF0gPT09IHVuZGVmaW5lZCApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIG91dFtwcm9wXSA9IHNyY1twcm9wXTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBpZiAoCiAgICAgICAgdHlwZW9mIHJlc291cmNlICE9PSAnb2JqZWN0JyB8fAogICAgICAgIHNhZmUuT2JqZWN0X3RvU3RyaW5nLmNhbGwocmVzb3VyY2UpICE9PSAnW29iamVjdCBSZXF1ZXN0XScKICAgICkgewogICAgICAgIG91dC51cmwgPSBgJHtyZXNvdXJjZX1gOwogICAgfSBlbHNlIHsKICAgICAgICBsZXQgY2xvbmU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2xvbmUgPSBzYWZlLlJlcXVlc3RfY2xvbmUuY2FsbChyZXNvdXJjZSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIGNvbGxhdGVGZXRjaEFyZ3VtZW50c0ZuLmNvbGxhdGVLbm93blByb3BzKGNsb25lIHx8IHJlc291cmNlLCBvdXQpOwogICAgfQogICAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCApIHsKICAgICAgICBjb2xsYXRlRmV0Y2hBcmd1bWVudHNGbi5jb2xsYXRlS25vd25Qcm9wcyhvcHRpb25zLCBvdXQpOwogICAgfQogICAgcmV0dXJuIG91dDsKfQpmdW5jdGlvbiByZXBsYWNlRmV0Y2hSZXNwb25zZUZuKAogICAgdHJ1c3RlZCA9IGZhbHNlLAogICAgcGF0dGVybiA9ICcnLAogICAgcmVwbGFjZW1lbnQgPSAnJywKICAgIHByb3BzVG9NYXRjaCA9ICcnCikgewogICAgaWYgKCB0cnVzdGVkICE9PSB0cnVlICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCdyZXBsYWNlLWZldGNoLXJlc3BvbnNlJywgcGF0dGVybiwgcmVwbGFjZW1lbnQsIHByb3BzVG9NYXRjaCk7CiAgICBpZiAoIHBhdHRlcm4gPT09ICcqJyApIHsgcGF0dGVybiA9ICcuKic7IH0KICAgIGNvbnN0IHJlUGF0dGVybiA9IHNhZmUucGF0dGVyblRvUmVnZXgocGF0dGVybik7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsICd1cmwnKTsKICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgNCk7CiAgICBjb25zdCByZUluY2x1ZGVzID0gZXh0cmFBcmdzLmluY2x1ZGVzID8gc2FmZS5wYXR0ZXJuVG9SZWdleChleHRyYUFyZ3MuaW5jbHVkZXMpIDogbnVsbDsKICAgIHNlbGYuZmV0Y2ggPSBuZXcgUHJveHkoc2VsZi5mZXRjaCwgewogICAgICAgIGFwcGx5OiBmdW5jdGlvbih0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgZmV0Y2hQcm9taXNlID0gUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpOwogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgeyByZXR1cm4gZmV0Y2hQcm9taXNlOyB9CiAgICAgICAgICAgIGlmICggcHJvcE5lZWRsZXMuc2l6ZSAhPT0gMCApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gY29sbGF0ZUZldGNoQXJndW1lbnRzRm4oLi4uYXJncyk7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHByb3BzKTsKICAgICAgICAgICAgICAgIGlmICggbWF0Y2hlZCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gZmV0Y2hQcm9taXNlOyB9CiAgICAgICAgICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYE1hdGNoZWQgInByb3BzVG9NYXRjaCI6XG5cdCR7bWF0Y2hlZC5qb2luKCdcblx0Jyl9YCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZldGNoUHJvbWlzZS50aGVuKHJlc3BvbnNlQmVmb3JlID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzcG9uc2VCZWZvcmUuY2xvbmUoKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCkudGhlbih0ZXh0QmVmb3JlID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIHJlSW5jbHVkZXMgJiYgcmVJbmNsdWRlcy50ZXN0KHRleHRCZWZvcmUpID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlQmVmb3JlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0QWZ0ZXIgPSB0ZXh0QmVmb3JlLnJlcGxhY2UocmVQYXR0ZXJuLCByZXBsYWNlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCB0ZXh0QWZ0ZXIgPT09IHRleHRCZWZvcmUgKSB7IHJldHVybiByZXNwb25zZUJlZm9yZTsgfQogICAgICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ1JlcGxhY2VkJyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VBZnRlciA9IG5ldyBSZXNwb25zZSh0ZXh0QWZ0ZXIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZUJlZm9yZS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlQmVmb3JlLnN0YXR1c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlQmVmb3JlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmVzcG9uc2VBZnRlciwgewogICAgICAgICAgICAgICAgICAgICAgICBvazogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUub2sgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZDogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUucmVkaXJlY3RlZCB9LAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7IHZhbHVlOiByZXNwb25zZUJlZm9yZS50eXBlIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogeyB2YWx1ZTogcmVzcG9uc2VCZWZvcmUudXJsIH0sCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlQWZ0ZXI7CiAgICAgICAgICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICAgICAgICAgICAgICAgIHNhZmUudWJvRXJyKGxvZ1ByZWZpeCwgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VCZWZvcmU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgICAgIHNhZmUudWJvRXJyKGxvZ1ByZWZpeCwgcmVhc29uKTsKICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaFByb21pc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0pOwp9CgogIChmdW5jdGlvbiB0cnVzdGVkUmVwbGFjZUZldGNoUmVzcG9uc2UoLi4uYXJncykgewogICAgcmVwbGFjZUZldGNoUmVzcG9uc2VGbih0cnVlLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-replace-xhr-response.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CgogIChmdW5jdGlvbiB0cnVzdGVkUmVwbGFjZVhoclJlc3BvbnNlKAogICAgcGF0dGVybiA9ICcnLAogICAgcmVwbGFjZW1lbnQgPSAnJywKICAgIHByb3BzVG9NYXRjaCA9ICcnCikgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ3RydXN0ZWQtcmVwbGFjZS14aHItcmVzcG9uc2UnLCBwYXR0ZXJuLCByZXBsYWNlbWVudCwgcHJvcHNUb01hdGNoKTsKICAgIGNvbnN0IHhockluc3RhbmNlcyA9IG5ldyBXZWFrTWFwKCk7CiAgICBpZiAoIHBhdHRlcm4gPT09ICcqJyApIHsgcGF0dGVybiA9ICcuKic7IH0KICAgIGNvbnN0IHJlUGF0dGVybiA9IHNhZmUucGF0dGVyblRvUmVnZXgocGF0dGVybik7CiAgICBjb25zdCBwcm9wTmVlZGxlcyA9IHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsICd1cmwnKTsKICAgIGNvbnN0IGV4dHJhQXJncyA9IHNhZmUuZ2V0RXh0cmFBcmdzKEFycmF5LmZyb20oYXJndW1lbnRzKSwgMyk7CiAgICBjb25zdCByZUluY2x1ZGVzID0gZXh0cmFBcmdzLmluY2x1ZGVzID8gc2FmZS5wYXR0ZXJuVG9SZWdleChleHRyYUFyZ3MuaW5jbHVkZXMpIDogbnVsbDsKICAgIHNlbGYuWE1MSHR0cFJlcXVlc3QgPSBjbGFzcyBleHRlbmRzIHNlbGYuWE1MSHR0cFJlcXVlc3QgewogICAgICAgIG9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgY29uc3Qgb3V0ZXJYaHIgPSB0aGlzOwogICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0geyBtZXRob2QsIHVybCB9OwogICAgICAgICAgICBsZXQgb3V0Y29tZSA9ICdtYXRjaCc7CiAgICAgICAgICAgIGlmICggcHJvcE5lZWRsZXMuc2l6ZSAhPT0gMCApIHsKICAgICAgICAgICAgICAgIGlmICggbWF0Y2hPYmplY3RQcm9wZXJ0aWVzRm4ocHJvcE5lZWRsZXMsIHhockRldGFpbHMpID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9ICdub21hdGNoJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG91dGNvbWUgPT09ICdtYXRjaCcgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYE1hdGNoZWQgInByb3BzVG9NYXRjaCJgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhockluc3RhbmNlcy5zZXQob3V0ZXJYaHIsIHhockRldGFpbHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdXBlci5vcGVuKG1ldGhvZCwgdXJsLCAuLi5hcmdzKTsKICAgICAgICB9CiAgICAgICAgZ2V0IHJlc3BvbnNlKCkgewogICAgICAgICAgICBjb25zdCBpbm5lclJlc3BvbnNlID0gc3VwZXIucmVzcG9uc2U7CiAgICAgICAgICAgIGNvbnN0IHhockRldGFpbHMgPSB4aHJJbnN0YW5jZXMuZ2V0KHRoaXMpOwogICAgICAgICAgICBpZiAoIHhockRldGFpbHMgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbm5lclJlc3BvbnNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlTGVuZ3RoID0gdHlwZW9mIGlubmVyUmVzcG9uc2UgPT09ICdzdHJpbmcnCiAgICAgICAgICAgICAgICA/IGlubmVyUmVzcG9uc2UubGVuZ3RoCiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzLmxhc3RSZXNwb25zZUxlbmd0aCAhPT0gcmVzcG9uc2VMZW5ndGggKSB7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLnJlc3BvbnNlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5sYXN0UmVzcG9uc2VMZW5ndGggPSByZXNwb25zZUxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHhockRldGFpbHMucmVzcG9uc2UgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB4aHJEZXRhaWxzLnJlc3BvbnNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIGlubmVyUmVzcG9uc2UgIT09ICdzdHJpbmcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICh4aHJEZXRhaWxzLnJlc3BvbnNlID0gaW5uZXJSZXNwb25zZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCByZUluY2x1ZGVzICYmIHJlSW5jbHVkZXMudGVzdChpbm5lclJlc3BvbnNlKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHhockRldGFpbHMucmVzcG9uc2UgPSBpbm5lclJlc3BvbnNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB0ZXh0QmVmb3JlID0gaW5uZXJSZXNwb25zZTsKICAgICAgICAgICAgY29uc3QgdGV4dEFmdGVyID0gdGV4dEJlZm9yZS5yZXBsYWNlKHJlUGF0dGVybiwgcmVwbGFjZW1lbnQpOwogICAgICAgICAgICBpZiAoIHRleHRBZnRlciAhPT0gdGV4dEJlZm9yZSApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ01hdGNoJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICh4aHJEZXRhaWxzLnJlc3BvbnNlID0gdGV4dEFmdGVyKTsKICAgICAgICB9CiAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlOwogICAgICAgICAgICBpZiAoIHR5cGVvZiByZXNwb25zZSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICB9CiAgICB9Owp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="},{"name":"trusted-click-element.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHJ1bkF0SHRtbEVsZW1lbnRGbihmbikgewogICAgaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgKSB7CiAgICAgICAgZm4oKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCggKSA9PiB7CiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgIGZuKCk7CiAgICB9KTsKICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlIH0pOwp9CmZ1bmN0aW9uIGdldEFsbExvY2FsU3RvcmFnZUZuKHdoaWNoID0gJ2xvY2FsU3RvcmFnZScpIHsKICAgIGNvbnN0IHN0b3JhZ2UgPSBzZWxmW3doaWNoXTsKICAgIGNvbnN0IG91dCA9IFtdOwogICAgZm9yICggbGV0IGkgPSAwOyBpIDwgc3RvcmFnZS5sZW5ndGg7IGkrKyApIHsKICAgICAgICBjb25zdCBrZXkgPSBzdG9yYWdlLmtleShpKTsKICAgICAgICBjb25zdCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpOwogICAgICAgIHJldHVybiB7IGtleSwgdmFsdWUgfTsKICAgIH0KICAgIHJldHVybiBvdXQ7Cn0KZnVuY3Rpb24gZ2V0QWxsQ29va2llc0ZuKCkgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICByZXR1cm4gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChkb2N1bWVudC5jb29raWUsIC9ccyo7XHMqLykubWFwKHMgPT4gewogICAgICAgIGNvbnN0IHBvcyA9IHMuaW5kZXhPZignPScpOwogICAgICAgIGlmICggcG9zID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIHBvcyA9PT0gLTEgKSB7IHJldHVybiBgJHtzLnRyaW0oKX09YDsgfQogICAgICAgIGNvbnN0IGtleSA9IHMuc2xpY2UoMCwgcG9zKS50cmltKCk7CiAgICAgICAgY29uc3QgdmFsdWUgPSBzLnNsaWNlKHBvcysxKS50cmltKCk7CiAgICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZSB9OwogICAgfSkuZmlsdGVyKHMgPT4gcyAhPT0gdW5kZWZpbmVkKTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZENsaWNrRWxlbWVudCgKICAgIHNlbGVjdG9ycyA9ICcnLAogICAgZXh0cmFNYXRjaCA9ICcnLAogICAgZGVsYXkgPSAnJwopIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCd0cnVzdGVkLWNsaWNrLWVsZW1lbnQnLCBzZWxlY3RvcnMsIGV4dHJhTWF0Y2gsIGRlbGF5KTsKCiAgICBpZiAoIGV4dHJhTWF0Y2ggIT09ICcnICkgewogICAgICAgIGNvbnN0IGFzc2VydGlvbnMgPSBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKGV4dHJhTWF0Y2gsICcsJykubWFwKHMgPT4gewogICAgICAgICAgICBjb25zdCBwb3MxID0gcy5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGNvbnN0IHMxID0gcG9zMSAhPT0gLTEgPyBzLnNsaWNlKDAsIHBvczEpIDogczsKICAgICAgICAgICAgY29uc3Qgbm90ID0gczEuc3RhcnRzV2l0aCgnIScpOwogICAgICAgICAgICBjb25zdCB0eXBlID0gbm90ID8gczEuc2xpY2UoMSkgOiBzMTsKICAgICAgICAgICAgY29uc3QgczIgPSBwb3MxICE9PSAtMSA/IHMuc2xpY2UocG9zMSsxKS50cmltKCkgOiAnJzsKICAgICAgICAgICAgaWYgKCBzMiA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICBjb25zdCBvdXQgPSB7IG5vdCwgdHlwZSB9OwogICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9eXC8oLispXC8oaT8pJC8uZXhlYyhzMik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBvdXQucmUgPSBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBwb3MyID0gczIuaW5kZXhPZignPScpOwogICAgICAgICAgICBjb25zdCBrZXkgPSBwb3MyICE9PSAtMSA/IHMyLnNsaWNlKDAsIHBvczIpLnRyaW0oKSA6IHMyOwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBvczIgIT09IC0xID8gczIuc2xpY2UocG9zMisxKS50cmltKCkgOiAnJzsKICAgICAgICAgICAgb3V0LnJlID0gbmV3IFJlZ0V4cChgXiR7dGhpcy5lc2NhcGVSZWdleENoYXJzKGtleSl9PSR7dGhpcy5lc2NhcGVSZWdleENoYXJzKHZhbHVlKX1gKTsKICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICB9KS5maWx0ZXIoZGV0YWlscyA9PiBkZXRhaWxzICE9PSB1bmRlZmluZWQpOwogICAgICAgIGNvbnN0IGFsbENvb2tpZXMgPSBhc3NlcnRpb25zLnNvbWUobyA9PiBvLnR5cGUgPT09ICdjb29raWUnKQogICAgICAgICAgICA/IGdldEFsbENvb2tpZXNGbigpCiAgICAgICAgICAgIDogW107CiAgICAgICAgY29uc3QgYWxsU3RvcmFnZUl0ZW1zID0gYXNzZXJ0aW9ucy5zb21lKG8gPT4gby50eXBlID09PSAnbG9jYWxTdG9yYWdlJykKICAgICAgICAgICAgPyBnZXRBbGxMb2NhbFN0b3JhZ2VGbigpCiAgICAgICAgICAgIDogW107CiAgICAgICAgY29uc3QgaGFzTmVlZGxlID0gKGhheXN0YWNrLCBuZWVkbGUpID0+IHsKICAgICAgICAgICAgZm9yICggY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgaGF5c3RhY2sgKSB7CiAgICAgICAgICAgICAgICBpZiAoIG5lZWRsZS50ZXN0KGAke2tleX09JHt2YWx1ZX1gKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKICAgICAgICBmb3IgKCBjb25zdCB7IG5vdCwgdHlwZSwgcmUgfSBvZiBhc3NlcnRpb25zICkgewogICAgICAgICAgICBzd2l0Y2ggKCB0eXBlICkgewogICAgICAgICAgICBjYXNlICdjb29raWUnOgogICAgICAgICAgICAgICAgaWYgKCBoYXNOZWVkbGUoYWxsQ29va2llcywgcmUpID09PSBub3QgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2xvY2FsU3RvcmFnZSc6CiAgICAgICAgICAgICAgICBpZiAoIGhhc05lZWRsZShhbGxTdG9yYWdlSXRlbXMsIHJlKSA9PT0gbm90ICkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IGdldFNoYWRvd1Jvb3QgPSBlbGVtID0+IHsKICAgICAgICAvLyBGaXJlZm94CiAgICAgICAgaWYgKCBlbGVtLm9wZW5PckNsb3NlZFNoYWRvd1Jvb3QgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLm9wZW5PckNsb3NlZFNoYWRvd1Jvb3Q7CiAgICAgICAgfQogICAgICAgIC8vIENocm9taXVtCiAgICAgICAgaWYgKCB0eXBlb2YgY2hyb21lID09PSAnb2JqZWN0JyApIHsKICAgICAgICAgICAgaWYgKCBjaHJvbWUuZG9tICYmIGNocm9tZS5kb20ub3Blbk9yQ2xvc2VkU2hhZG93Um9vdCApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWUuZG9tLm9wZW5PckNsb3NlZFNoYWRvd1Jvb3QoZWxlbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVsZW0uc2hhZG93Um9vdDsKICAgIH07CgogICAgY29uc3QgcXVlcnlTZWxlY3RvckV4ID0gKHNlbGVjdG9yLCBjb250ZXh0ID0gZG9jdW1lbnQpID0+IHsKICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rvci5pbmRleE9mKCcgPj4+ICcpOwogICAgICAgIGlmICggcG9zID09PSAtMSApIHsgcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0KICAgICAgICBjb25zdCBvdXRzaWRlID0gc2VsZWN0b3Iuc2xpY2UoMCwgcG9zKS50cmltKCk7CiAgICAgICAgY29uc3QgaW5zaWRlID0gc2VsZWN0b3Iuc2xpY2UocG9zICsgNSkudHJpbSgpOwogICAgICAgIGNvbnN0IGVsZW0gPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3Iob3V0c2lkZSk7CiAgICAgICAgaWYgKCBlbGVtID09PSBudWxsICkgeyByZXR1cm4gbnVsbDsgfQogICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBnZXRTaGFkb3dSb290KGVsZW0pOwogICAgICAgIHJldHVybiBzaGFkb3dSb290ICYmIHF1ZXJ5U2VsZWN0b3JFeChpbnNpZGUsIHNoYWRvd1Jvb3QpOwogICAgfTsKCiAgICBjb25zdCBzdGVwcyA9IHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwoc2VsZWN0b3JzLCAvXHMqLFxzKi8pLm1hcChhID0+IHsKICAgICAgICBpZiAoIC9eXGQrJC8udGVzdChhKSApIHsgcmV0dXJuIHBhcnNlSW50KGEsIDEwKTsgfQogICAgICAgIHJldHVybiBhOwogICAgfSk7CiAgICBpZiAoIHN0ZXBzLmxlbmd0aCA9PT0gMCApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBjbGlja0RlbGF5ID0gcGFyc2VJbnQoZGVsYXksIDEwKSB8fCAxOwogICAgZm9yICggbGV0IGkgPSBzdGVwcy5sZW5ndGgtMTsgaSA+IDA7IGktLSApIHsKICAgICAgICBpZiAoIHR5cGVvZiBzdGVwc1tpXSAhPT0gJ3N0cmluZycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgaWYgKCB0eXBlb2Ygc3RlcHNbaS0xXSAhPT0gJ3N0cmluZycgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgc3RlcHMuc3BsaWNlKGksIDAsIGNsaWNrRGVsYXkpOwogICAgfQogICAgaWYgKCBzdGVwcy5sZW5ndGggPT09IDEgJiYgZGVsYXkgIT09ICcnICkgewogICAgICAgIHN0ZXBzLnVuc2hpZnQoY2xpY2tEZWxheSk7CiAgICB9CiAgICBpZiAoIHR5cGVvZiBzdGVwcy5hdCgtMSkgIT09ICdudW1iZXInICkgewogICAgICAgIHN0ZXBzLnB1c2goMTAwMDApOwogICAgfQoKICAgIGNvbnN0IHdhaXRGb3JUaW1lID0gbXMgPT4gewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgV2FpdGluZyBmb3IgJHttc30gbXNgKTsKICAgICAgICAgICAgd2FpdEZvclRpbWUudGltZXIgPSBzZXRUaW1lb3V0KCggKSA9PiB7CiAgICAgICAgICAgICAgICB3YWl0Rm9yVGltZS50aW1lciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgfSwgbXMpOwogICAgICAgIH0pOwogICAgfTsKICAgIHdhaXRGb3JUaW1lLmNhbmNlbCA9ICggKSA9PiB7CiAgICAgICAgY29uc3QgeyB0aW1lciB9ID0gd2FpdEZvclRpbWU7CiAgICAgICAgaWYgKCB0aW1lciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHdhaXRGb3JUaW1lLnRpbWVyID0gdW5kZWZpbmVkOwogICAgfTsKCiAgICBjb25zdCB3YWl0Rm9yRWxlbWVudCA9IHNlbGVjdG9yID0+IHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBxdWVyeVNlbGVjdG9yRXgoc2VsZWN0b3IpOwogICAgICAgICAgICBpZiAoIGVsZW0gIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBlbGVtLmNsaWNrKCk7CiAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgV2FpdGluZyBmb3IgJHtzZWxlY3Rvcn1gKTsKICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoICkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IHF1ZXJ5U2VsZWN0b3JFeChzZWxlY3Rvcik7CiAgICAgICAgICAgICAgICBpZiAoIGVsZW0gPT09IG51bGwgKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgd2FpdEZvckVsZW1lbnQuY2FuY2VsKCk7CiAgICAgICAgICAgICAgICBlbGVtLmNsaWNrKCk7CiAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHdhaXRGb3JFbGVtZW50Lm9ic2VydmVyID0gb2JzZXJ2ZXI7CiAgICAgICAgfSk7CiAgICB9OwogICAgd2FpdEZvckVsZW1lbnQuY2FuY2VsID0gKCApID0+IHsKICAgICAgICBjb25zdCB7IG9ic2VydmVyIH0gPSB3YWl0Rm9yRWxlbWVudDsKICAgICAgICBpZiAoIG9ic2VydmVyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgIHdhaXRGb3JFbGVtZW50Lm9ic2VydmVyID0gdW5kZWZpbmVkOwogICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgIH07CgogICAgY29uc3Qgd2FpdEZvclRpbWVvdXQgPSBtcyA9PiB7CiAgICAgICAgd2FpdEZvclRpbWVvdXQuY2FuY2VsKCk7CiAgICAgICAgd2FpdEZvclRpbWVvdXQudGltZXIgPSBzZXRUaW1lb3V0KCggKSA9PiB7CiAgICAgICAgICAgIHdhaXRGb3JUaW1lb3V0LnRpbWVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0ZXJtaW5hdGUoKTsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgVGltZWQgb3V0IGFmdGVyICR7bXN9IG1zYCk7CiAgICAgICAgfSwgbXMpOwogICAgfTsKICAgIHdhaXRGb3JUaW1lb3V0LmNhbmNlbCA9ICggKSA9PiB7CiAgICAgICAgaWYgKCB3YWl0Rm9yVGltZW91dC50aW1lciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICBjbGVhclRpbWVvdXQod2FpdEZvclRpbWVvdXQudGltZXIpOwogICAgICAgIHdhaXRGb3JUaW1lb3V0LnRpbWVyID0gdW5kZWZpbmVkOwogICAgfTsKCiAgICBjb25zdCB0ZXJtaW5hdGUgPSAoICkgPT4gewogICAgICAgIHdhaXRGb3JUaW1lLmNhbmNlbCgpOwogICAgICAgIHdhaXRGb3JFbGVtZW50LmNhbmNlbCgpOwogICAgICAgIHdhaXRGb3JUaW1lb3V0LmNhbmNlbCgpOwogICAgfTsKCiAgICBjb25zdCBwcm9jZXNzID0gYXN5bmMgKCApID0+IHsKICAgICAgICB3YWl0Rm9yVGltZW91dChzdGVwcy5wb3AoKSk7CiAgICAgICAgd2hpbGUgKCBzdGVwcy5sZW5ndGggIT09IDAgKSB7CiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwcy5zaGlmdCgpOwogICAgICAgICAgICBpZiAoIHN0ZXAgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgaWYgKCB0eXBlb2Ygc3RlcCA9PT0gJ251bWJlcicgKSB7CiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0Rm9yVGltZShzdGVwKTsKICAgICAgICAgICAgICAgIGlmICggc3RlcCA9PT0gMSApIHsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc3RlcC5zdGFydHNXaXRoKCchJykgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGF3YWl0IHdhaXRGb3JFbGVtZW50KHN0ZXApOwogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBDbGlja2VkICR7c3RlcH1gKTsKICAgICAgICB9CiAgICAgICAgdGVybWluYXRlKCk7CiAgICB9OwoKICAgIHJ1bkF0SHRtbEVsZW1lbnRGbihwcm9jZXNzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-replace-outbound-text.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZFJlcGxhY2VPdXRib3VuZFRleHQoCiAgICBwcm9wQ2hhaW4gPSAnJywKICAgIHJhd1BhdHRlcm4gPSAnJywKICAgIHJhd1JlcGxhY2VtZW50ID0gJycsCiAgICAuLi5hcmdzCikgewogICAgaWYgKCBwcm9wQ2hhaW4gPT09ICcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCd0cnVzdGVkLXJlcGxhY2Utb3V0Ym91bmQtdGV4dCcsIHByb3BDaGFpbiwgcmF3UGF0dGVybiwgcmF3UmVwbGFjZW1lbnQsIC4uLmFyZ3MpOwogICAgY29uc3QgcmVQYXR0ZXJuID0gc2FmZS5wYXR0ZXJuVG9SZWdleChyYXdQYXR0ZXJuKTsKICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcmF3UmVwbGFjZW1lbnQuc3RhcnRzV2l0aCgnanNvbjonKQogICAgICAgID8gc2FmZS5KU09OX3BhcnNlKHJhd1JlcGxhY2VtZW50LnNsaWNlKDUpKQogICAgICAgIDogcmF3UmVwbGFjZW1lbnQ7CiAgICBjb25zdCBleHRyYUFyZ3MgPSBzYWZlLmdldEV4dHJhQXJncyhhcmdzKTsKICAgIGNvbnN0IHJlQ29uZGl0aW9uID0gc2FmZS5wYXR0ZXJuVG9SZWdleChleHRyYUFyZ3MuY29uZGl0aW9uIHx8ICcnKTsKICAgIHByb3h5QXBwbHlGbihwcm9wQ2hhaW4sIGZ1bmN0aW9uKGNvbnRleHQpIHsKICAgICAgICBjb25zdCBlbmNvZGVkVGV4dEJlZm9yZSA9IGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgIGxldCB0ZXh0QmVmb3JlID0gZW5jb2RlZFRleHRCZWZvcmU7CiAgICAgICAgaWYgKCBleHRyYUFyZ3MuZW5jb2RpbmcgPT09ICdiYXNlNjQnICkgewogICAgICAgICAgICB0cnkgeyB0ZXh0QmVmb3JlID0gc2VsZi5hdG9iKGVuY29kZWRUZXh0QmVmb3JlKTsgfQogICAgICAgICAgICBjYXRjaCB7IHJldHVybiBlbmNvZGVkVGV4dEJlZm9yZTsgfQogICAgICAgIH0KICAgICAgICBpZiAoIHJhd1BhdHRlcm4gPT09ICcnICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdEZWNvZGVkIG91dGJvdW5kIHRleHQ6XG4nLCB0ZXh0QmVmb3JlKTsKICAgICAgICAgICAgcmV0dXJuIGVuY29kZWRUZXh0QmVmb3JlOwogICAgICAgIH0KICAgICAgICByZUNvbmRpdGlvbi5sYXN0SW5kZXggPSAwOwogICAgICAgIGlmICggcmVDb25kaXRpb24udGVzdCh0ZXh0QmVmb3JlKSA9PT0gZmFsc2UgKSB7IHJldHVybiBlbmNvZGVkVGV4dEJlZm9yZTsgfQogICAgICAgIGNvbnN0IHRleHRBZnRlciA9IHRleHRCZWZvcmUucmVwbGFjZShyZVBhdHRlcm4sIHJlcGxhY2VtZW50KTsKICAgICAgICBpZiAoIHRleHRBZnRlciA9PT0gdGV4dEJlZm9yZSApIHsgcmV0dXJuIGVuY29kZWRUZXh0QmVmb3JlOyB9CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCAnTWF0Y2hlZCBhbmQgcmVwbGFjZWQnKTsKICAgICAgICBpZiAoIHNhZmUubG9nTGV2ZWwgPiAxICkgewogICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsICdNb2RpZmllZCBkZWNvZGVkIG91dGJvdW5kIHRleHQ6XG4nLCB0ZXh0QWZ0ZXIpOwogICAgICAgIH0KICAgICAgICBsZXQgZW5jb2RlZFRleHRBZnRlciA9IHRleHRBZnRlcjsKICAgICAgICBpZiAoIGV4dHJhQXJncy5lbmNvZGluZyA9PT0gJ2Jhc2U2NCcgKSB7CiAgICAgICAgICAgIGVuY29kZWRUZXh0QWZ0ZXIgPSBzZWxmLmJ0b2EodGV4dEFmdGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVuY29kZWRUZXh0QWZ0ZXI7CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-suppress-native-method.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gZ2V0UmFuZG9tVG9rZW5GbigpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgcmV0dXJuIHNhZmUuU3RyaW5nX2Zyb21DaGFyQ29kZShEYXRlLm5vdygpICUgMjYgKyA5NykgKwogICAgICAgIHNhZmUuTWF0aF9mbG9vcihzYWZlLk1hdGhfcmFuZG9tKCkgKiA5ODI0NTE2NTMgKyA5ODI0NTE2NTMpLnRvU3RyaW5nKDM2KTsKfQpmdW5jdGlvbiBnZXRFeGNlcHRpb25Ub2tlbkZuKCkgewogICAgY29uc3QgdG9rZW4gPSBnZXRSYW5kb21Ub2tlbkZuKCk7CiAgICBjb25zdCBvZSA9IHNlbGYub25lcnJvcjsKICAgIHNlbGYub25lcnJvciA9IGZ1bmN0aW9uKG1zZywgLi4uYXJncykgewogICAgICAgIGlmICggdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycgJiYgbXNnLmluY2x1ZGVzKHRva2VuKSApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoIG9lIGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CiAgICAgICAgICAgIHJldHVybiBvZS5jYWxsKHRoaXMsIG1zZywgLi4uYXJncyk7CiAgICAgICAgfQogICAgfS5iaW5kKCk7CiAgICByZXR1cm4gdG9rZW47Cn0KZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQpmdW5jdGlvbiBtYXRjaGVzU3RhY2tUcmFjZUZuKAogICAgbmVlZGxlRGV0YWlscywKICAgIGxvZ0xldmVsID0gJycKKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGV4Y2VwdGlvblRva2VuID0gZ2V0RXhjZXB0aW9uVG9rZW5GbigpOwogICAgY29uc3QgZXJyb3IgPSBuZXcgc2FmZS5FcnJvcihleGNlcHRpb25Ub2tlbik7CiAgICBjb25zdCBkb2NVUkwgPSBuZXcgVVJMKHNlbGYubG9jYXRpb24uaHJlZik7CiAgICBkb2NVUkwuaGFzaCA9ICcnOwogICAgLy8gTm9ybWFsaXplIHN0YWNrIHRyYWNlCiAgICBjb25zdCByZUxpbmUgPSAvKC4qP0ApPyhcUyspKDpcZCspOlxkK1wpPyQvOwogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGZvciAoIGxldCBsaW5lIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwoZXJyb3Iuc3RhY2ssIC9bXG5ccl0rLykgKSB7CiAgICAgICAgaWYgKCBsaW5lLmluY2x1ZGVzKGV4Y2VwdGlvblRva2VuKSApIHsgY29udGludWU7IH0KICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBzYWZlLlJlZ0V4cF9leGVjLmNhbGwocmVMaW5lLCBsaW5lKTsKICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgeyBjb250aW51ZTsgfQogICAgICAgIGxldCB1cmwgPSBtYXRjaFsyXTsKICAgICAgICBpZiAoIHVybC5zdGFydHNXaXRoKCcoJykgKSB7IHVybCA9IHVybC5zbGljZSgxKTsgfQogICAgICAgIGlmICggdXJsID09PSBkb2NVUkwuaHJlZiApIHsKICAgICAgICAgICAgdXJsID0gJ2lubGluZVNjcmlwdCc7CiAgICAgICAgfSBlbHNlIGlmICggdXJsLnN0YXJ0c1dpdGgoJzxhbm9ueW1vdXM+JykgKSB7CiAgICAgICAgICAgIHVybCA9ICdpbmplY3RlZFNjcmlwdCc7CiAgICAgICAgfQogICAgICAgIGxldCBmbiA9IG1hdGNoWzFdICE9PSB1bmRlZmluZWQKICAgICAgICAgICAgPyBtYXRjaFsxXS5zbGljZSgwLCAtMSkKICAgICAgICAgICAgOiBsaW5lLnNsaWNlKDAsIG1hdGNoLmluZGV4KS50cmltKCk7CiAgICAgICAgaWYgKCBmbi5zdGFydHNXaXRoKCdhdCcpICkgeyBmbiA9IGZuLnNsaWNlKDIpLnRyaW0oKTsgfQogICAgICAgIGxldCByb3djb2wgPSBtYXRjaFszXTsKICAgICAgICBsaW5lcy5wdXNoKCcgJyArIGAke2ZufSAke3VybH0ke3Jvd2NvbH06MWAudHJpbSgpKTsKICAgIH0KICAgIGxpbmVzWzBdID0gYHN0YWNrRGVwdGg6JHtsaW5lcy5sZW5ndGgtMX1gOwogICAgY29uc3Qgc3RhY2sgPSBsaW5lcy5qb2luKCdcdCcpOwogICAgY29uc3QgciA9IG5lZWRsZURldGFpbHMubWF0Y2hBbGwgIT09IHRydWUgJiYKICAgICAgICBzYWZlLnRlc3RQYXR0ZXJuKG5lZWRsZURldGFpbHMsIHN0YWNrKTsKICAgIGlmICgKICAgICAgICBsb2dMZXZlbCA9PT0gJ2FsbCcgfHwKICAgICAgICBsb2dMZXZlbCA9PT0gJ21hdGNoJyAmJiByIHx8CiAgICAgICAgbG9nTGV2ZWwgPT09ICdub21hdGNoJyAmJiAhcgogICAgKSB7CiAgICAgICAgc2FmZS51Ym9Mb2coc3RhY2sucmVwbGFjZSgvXHQvZywgJ1xuJykpOwogICAgfQogICAgcmV0dXJuIHI7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRTdXBwcmVzc05hdGl2ZU1ldGhvZCgKICAgIG1ldGhvZFBhdGggPSAnJywKICAgIHNpZ25hdHVyZSA9ICcnLAogICAgaG93ID0gJycsCiAgICBzdGFjayA9ICcnCikgewogICAgaWYgKCBtZXRob2RQYXRoID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeCgndHJ1c3RlZC1zdXBwcmVzcy1uYXRpdmUtbWV0aG9kJywgbWV0aG9kUGF0aCwgc2lnbmF0dXJlLCBob3csIHN0YWNrKTsKICAgIGNvbnN0IHNpZ25hdHVyZUFyZ3MgPSBzYWZlLlN0cmluZ19zcGxpdC5jYWxsKHNpZ25hdHVyZSwgL1xzKlx8XHMqLykubWFwKHYgPT4gewogICAgICAgIGlmICggL14iLioiJC8udGVzdCh2KSApIHsKICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3BhdHRlcm4nLCByZTogc2FmZS5wYXR0ZXJuVG9SZWdleCh2LnNsaWNlKDEsIC0xKSkgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAvXlwvLitcLyQvLnRlc3QodikgKSB7CiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdwYXR0ZXJuJywgcmU6IHNhZmUucGF0dGVyblRvUmVnZXgodikgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCB2ID09PSAnZmFsc2UnICkgewogICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZXhhY3QnLCB2YWx1ZTogZmFsc2UgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCB2ID09PSAndHJ1ZScgKSB7CiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdleGFjdCcsIHZhbHVlOiB0cnVlIH07CiAgICAgICAgfQogICAgICAgIGlmICggdiA9PT0gJ251bGwnICkgewogICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZXhhY3QnLCB2YWx1ZTogbnVsbCB9OwogICAgICAgIH0KICAgICAgICBpZiAoIHYgPT09ICd1bmRlZmluZWQnICkgewogICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZXhhY3QnLCB2YWx1ZTogdW5kZWZpbmVkIH07CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBzdGFja05lZWRsZSA9IHNhZmUuaW5pdFBhdHRlcm4oc3RhY2ssIHsgY2FuTmVnYXRlOiB0cnVlIH0pOwogICAgcHJveHlBcHBseUZuKG1ldGhvZFBhdGgsIGZ1bmN0aW9uKGNvbnRleHQpIHsKICAgICAgICBjb25zdCB7IGNhbGxBcmdzIH0gPSBjb250ZXh0OwogICAgICAgIGlmICggc2lnbmF0dXJlID09PSAnJyApIHsKICAgICAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgQXJndW1lbnRzOlxuJHtjYWxsQXJncy5qb2luKCdcbicpfWApOwogICAgICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgfQogICAgICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHNpZ25hdHVyZUFyZ3MubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgIGNvbnN0IHNpZ25hdHVyZUFyZyA9IHNpZ25hdHVyZUFyZ3NbaV07CiAgICAgICAgICAgIGlmICggc2lnbmF0dXJlQXJnID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGNvbnN0IHRhcmdldEFyZyA9IGkgPCBjYWxsQXJncy5sZW5ndGggPyBjYWxsQXJnc1tpXSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKCBzaWduYXR1cmVBcmcudHlwZSA9PT0gJ2V4YWN0JyApIHsKICAgICAgICAgICAgICAgIGlmICggdGFyZ2V0QXJnICE9PSBzaWduYXR1cmVBcmcudmFsdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2lnbmF0dXJlQXJnLnR5cGUgPT09ICdwYXR0ZXJuJyApIHsKICAgICAgICAgICAgICAgIGlmICggc2FmZS5SZWdFeHBfdGVzdC5jYWxsKHNpZ25hdHVyZUFyZy5yZSwgdGFyZ2V0QXJnKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmVmbGVjdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggc3RhY2tOZWVkbGUubWF0Y2hBbGwgIT09IHRydWUgKSB7CiAgICAgICAgICAgIGNvbnN0IGxvZ0xldmVsID0gc2FmZS5sb2dMZXZlbCA+IDEgPyAnYWxsJyA6ICcnOwogICAgICAgICAgICBpZiAoIG1hdGNoZXNTdGFja1RyYWNlRm4oc3RhY2tOZWVkbGUsIGxvZ0xldmVsKSA9PT0gZmFsc2UgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCBob3cgPT09ICdkZWJ1ZycgKSB7CiAgICAgICAgICAgIGRlYnVnZ2VyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWRlYnVnZ2VyCiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlZmxlY3QoKTsKICAgICAgICB9CiAgICAgICAgc2FmZS51Ym9Mb2cobG9nUHJlZml4LCBgU3VwcHJlc3NlZDpcbiR7Y2FsbEFyZ3Muam9pbignXG4nKX1gKTsKICAgICAgICBpZiAoIGhvdyA9PT0gJ2Fib3J0JyApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCk7CiAgICAgICAgfQogICAgfSk7Cn0pKC4uLmFyZ3Muc2xpY2UoMCwgbGFzdF9hcmdfaW5kZXgpKQp9"},{"name":"trusted-prevent-xhr.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHBhcnNlUHJvcGVydGllc1RvTWF0Y2hGbihwcm9wc1RvTWF0Y2gsIGltcGxpY2l0ID0gJycpIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbmVlZGxlcyA9IG5ldyBNYXAoKTsKICAgIGlmICggcHJvcHNUb01hdGNoID09PSB1bmRlZmluZWQgfHwgcHJvcHNUb01hdGNoID09PSAnJyApIHsgcmV0dXJuIG5lZWRsZXM7IH0KICAgIGNvbnN0IG9wdGlvbnMgPSB7IGNhbk5lZ2F0ZTogdHJ1ZSB9OwogICAgZm9yICggY29uc3QgbmVlZGxlIG9mIHNhZmUuU3RyaW5nX3NwbGl0LmNhbGwocHJvcHNUb01hdGNoLCAvXHMrLykgKSB7CiAgICAgICAgbGV0IFsgcHJvcCwgcGF0dGVybiBdID0gc2FmZS5TdHJpbmdfc3BsaXQuY2FsbChuZWVkbGUsICc6Jyk7CiAgICAgICAgaWYgKCBwcm9wID09PSAnJyApIHsgY29udGludWU7IH0KICAgICAgICBpZiAoIHBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJiAvW14kXHcgLV0vLnRlc3QocHJvcCkgKSB7CiAgICAgICAgICAgIHByb3AgPSBgJHtwcm9wfToke3BhdHRlcm59YDsKICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG5lZWRsZXMuc2V0KHByb3AsIHNhZmUuaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpOwogICAgICAgIH0gZWxzZSBpZiAoIGltcGxpY2l0ICE9PSAnJyApIHsKICAgICAgICAgICAgbmVlZGxlcy5zZXQoaW1wbGljaXQsIHNhZmUuaW5pdFBhdHRlcm4ocHJvcCwgb3B0aW9ucykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZWVkbGVzOwp9CmZ1bmN0aW9uIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCAuLi5vYmpzKSB7CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IG1hdGNoZWQgPSBbXTsKICAgIGZvciAoIGNvbnN0IG9iaiBvZiBvYmpzICkgewogICAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgY29udGludWU7IH0KICAgICAgICBmb3IgKCBjb25zdCBbIHByb3AsIGRldGFpbHMgXSBvZiBwcm9wTmVlZGxlcyApIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICAgICAgICBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgIGlmICggdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyApIHsKICAgICAgICAgICAgICAgIHRyeSB7IHZhbHVlID0gc2FmZS5KU09OX3N0cmluZ2lmeSh2YWx1ZSk7IH0KICAgICAgICAgICAgICAgIGNhdGNoIHsgfQogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2FmZS50ZXN0UGF0dGVybihkZXRhaWxzLCB2YWx1ZSkgPT09IGZhbHNlICkgeyByZXR1cm47IH0KICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKGAke3Byb3B9OiAke3ZhbHVlfWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGVkOwp9CmZ1bmN0aW9uIGdlbmVyYXRlQ29udGVudEZuKHRydXN0ZWQsIGRpcmVjdGl2ZSkgewogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCByYW5kb21pemUgPSBsZW4gPT4gewogICAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICAgIGxldCB0ZXh0U2l6ZSA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICBjb25zdCBzID0gc2FmZS5NYXRoX3JhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTsKICAgICAgICAgICAgY2h1bmtzLnB1c2gocyk7CiAgICAgICAgICAgIHRleHRTaXplICs9IHMubGVuZ3RoOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoIHRleHRTaXplIDwgbGVuICk7CiAgICAgICAgcmV0dXJuIGNodW5rcy5qb2luKCcgJykuc2xpY2UoMCwgbGVuKTsKICAgIH07CiAgICBpZiAoIGRpcmVjdGl2ZSA9PT0gJ3RydWUnICkgewogICAgICAgIHJldHVybiByYW5kb21pemUoMTApOwogICAgfQogICAgaWYgKCBkaXJlY3RpdmUgPT09ICdlbXB0eU9iaicgKSB7CiAgICAgICAgcmV0dXJuICd7fSc7CiAgICB9CiAgICBpZiAoIGRpcmVjdGl2ZSA9PT0gJ2VtcHR5QXJyJyApIHsKICAgICAgICByZXR1cm4gJ1tdJzsKICAgIH0KICAgIGlmICggZGlyZWN0aXZlID09PSAnZW1wdHlTdHInICkgewogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGlmICggZGlyZWN0aXZlLnN0YXJ0c1dpdGgoJ2xlbmd0aDonKSApIHsKICAgICAgICBjb25zdCBtYXRjaCA9IC9ebGVuZ3RoOihcZCspKD86LShcZCspKT8kLy5leGVjKGRpcmVjdGl2ZSk7CiAgICAgICAgaWYgKCBtYXRjaCA9PT0gbnVsbCApIHsgcmV0dXJuICcnOyB9CiAgICAgICAgY29uc3QgbWluID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTsKICAgICAgICBjb25zdCBleHRlbnQgPSBzYWZlLk1hdGhfbWF4KHBhcnNlSW50KG1hdGNoWzJdLCAxMCkgfHwgMCwgbWluKSAtIG1pbjsKICAgICAgICBjb25zdCBsZW4gPSBzYWZlLk1hdGhfbWluKG1pbiArIGV4dGVudCAqIHNhZmUuTWF0aF9yYW5kb20oKSwgNTAwMDAwKTsKICAgICAgICByZXR1cm4gcmFuZG9taXplKGxlbiB8IDApOwogICAgfQogICAgaWYgKCBkaXJlY3RpdmUuc3RhcnRzV2l0aCgnd2FyOicpICkgewogICAgICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy53YXJPcmlnaW4gPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuICcnOyB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gewogICAgICAgICAgICBjb25zdCB3YXJPcmlnaW4gPSBzY3JpcHRsZXRHbG9iYWxzLndhck9yaWdpbjsKICAgICAgICAgICAgY29uc3Qgd2FyTmFtZSA9IGRpcmVjdGl2ZS5zbGljZSg0KTsKICAgICAgICAgICAgY29uc3QgZnVsbHBhdGggPSBbIHdhck9yaWdpbiwgJy8nLCB3YXJOYW1lIF07CiAgICAgICAgICAgIGNvbnN0IHdhclNlY3JldCA9IHNjcmlwdGxldEdsb2JhbHMud2FyU2VjcmV0OwogICAgICAgICAgICBpZiAoIHdhclNlY3JldCAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgZnVsbHBhdGgucHVzaCgnP3NlY3JldD0nLCB3YXJTZWNyZXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHdhclhIUiA9IG5ldyBzYWZlLlhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgIHdhclhIUi5yZXNwb25zZVR5cGUgPSAndGV4dCc7CiAgICAgICAgICAgIHdhclhIUi5vbmxvYWRlbmQgPSBldiA9PiB7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2LnRhcmdldC5yZXNwb25zZVRleHQgfHwgJycpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB3YXJYSFIub3BlbignR0VUJywgZnVsbHBhdGguam9pbignJykpOwogICAgICAgICAgICB3YXJYSFIuc2VuZCgpOwogICAgICAgIH0pLmNhdGNoKCggKSA9PiAnJyk7CiAgICB9CiAgICBpZiAoIHRydXN0ZWQgKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTsKICAgIH0KICAgIHJldHVybiAnJzsKfQpmdW5jdGlvbiBwcmV2ZW50WGhyRm4oCiAgICB0cnVzdGVkID0gZmFsc2UsCiAgICBwcm9wc1RvTWF0Y2ggPSAnJywKICAgIGRpcmVjdGl2ZSA9ICcnCikgewogICAgaWYgKCB0eXBlb2YgcHJvcHNUb01hdGNoICE9PSAnc3RyaW5nJyApIHsgcmV0dXJuOyB9CiAgICBjb25zdCBzYWZlID0gc2FmZVNlbGYoKTsKICAgIGNvbnN0IHNjcmlwdGxldE5hbWUgPSB0cnVzdGVkID8gJ3RydXN0ZWQtcHJldmVudC14aHInIDogJ3ByZXZlbnQteGhyJzsKICAgIGNvbnN0IGxvZ1ByZWZpeCA9IHNhZmUubWFrZUxvZ1ByZWZpeChzY3JpcHRsZXROYW1lLCBwcm9wc1RvTWF0Y2gsIGRpcmVjdGl2ZSk7CiAgICBjb25zdCB4aHJJbnN0YW5jZXMgPSBuZXcgV2Vha01hcCgpOwogICAgY29uc3QgcHJvcE5lZWRsZXMgPSBwYXJzZVByb3BlcnRpZXNUb01hdGNoRm4ocHJvcHNUb01hdGNoLCAndXJsJyk7CiAgICBjb25zdCB3YXJPcmlnaW4gPSBzY3JpcHRsZXRHbG9iYWxzLndhck9yaWdpbjsKICAgIGNvbnN0IHNhZmVEaXNwYXRjaEV2ZW50ID0gKHhociwgdHlwZSkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCh0eXBlKSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgfTsKICAgIGNvbnN0IFhIUkJlZm9yZSA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZTsKICAgIHNlbGYuWE1MSHR0cFJlcXVlc3QgPSBjbGFzcyBleHRlbmRzIHNlbGYuWE1MSHR0cFJlcXVlc3QgewogICAgICAgIG9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgeGhySW5zdGFuY2VzLmRlbGV0ZSh0aGlzKTsKICAgICAgICAgICAgaWYgKCB3YXJPcmlnaW4gIT09IHVuZGVmaW5lZCAmJiB1cmwuc3RhcnRzV2l0aCh3YXJPcmlnaW4pICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGhheXN0YWNrID0geyBtZXRob2QsIHVybCB9OwogICAgICAgICAgICBpZiAoIHByb3BzVG9NYXRjaCA9PT0gJycgJiYgZGlyZWN0aXZlID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgYENhbGxlZDogJHtzYWZlLkpTT05fc3RyaW5naWZ5KGhheXN0YWNrLCBudWxsLCAyKX1gKTsKICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vcGVuKG1ldGhvZCwgdXJsLCAuLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG1hdGNoT2JqZWN0UHJvcGVydGllc0ZuKHByb3BOZWVkbGVzLCBoYXlzdGFjaykgKSB7CiAgICAgICAgICAgICAgICBjb25zdCB4aHJEZXRhaWxzID0gT2JqZWN0LmFzc2lnbihoYXlzdGFjaywgewogICAgICAgICAgICAgICAgICAgIHhocjogdGhpcywKICAgICAgICAgICAgICAgICAgICBkZWZlcjogYXJncy5sZW5ndGggPT09IDAgfHwgISFhcmdzWzBdLAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSwKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtbGVuZ3RoJzogJycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB1cmw6IGhheXN0YWNrLnVybCwKICAgICAgICAgICAgICAgICAgICBwcm9wczogewogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogeyB2YWx1ZTogJycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0OiB7IHZhbHVlOiAnJyB9LAogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVhNTDogeyB2YWx1ZTogbnVsbCB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHhockluc3RhbmNlcy5zZXQodGhpcywgeGhyRGV0YWlscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4obWV0aG9kLCB1cmwsIC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICBzZW5kKC4uLmFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgeGhyRGV0YWlscyA9IHhockluc3RhbmNlcy5nZXQodGhpcyk7CiAgICAgICAgICAgIGlmICggeGhyRGV0YWlscyA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnNlbmQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGhyRGV0YWlscy5oZWFkZXJzWydkYXRlJ10gPSAobmV3IERhdGUoKSkudG9VVENTdHJpbmcoKTsKICAgICAgICAgICAgbGV0IHhoclRleHQgPSAnJzsKICAgICAgICAgICAgc3dpdGNoICggdGhpcy5yZXNwb25zZVR5cGUgKSB7CiAgICAgICAgICAgIGNhc2UgJ2FycmF5YnVmZmVyJzoKICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2UudmFsdWUgPSBuZXcgQXJyYXlCdWZmZXIoMCk7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYmxvYic6CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLnByb3BzLnJlc3BvbnNlLnZhbHVlID0gbmV3IEJsb2IoW10pOwogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzogewogICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwogICAgICAgICAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZygnJywgJ3RleHQvaHRtbCcpOwogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5wcm9wcy5yZXNwb25zZS52YWx1ZSA9IGRvYzsKICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2VYTUwudmFsdWUgPSBkb2M7CiAgICAgICAgICAgICAgICB4aHJEZXRhaWxzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICdqc29uJzoKICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2UudmFsdWUgPSB7fTsKICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2VUZXh0LnZhbHVlID0gJ3t9JzsKICAgICAgICAgICAgICAgIHhockRldGFpbHMuaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgaWYgKCBkaXJlY3RpdmUgPT09ICcnICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgeGhyVGV4dCA9IGdlbmVyYXRlQ29udGVudEZuKHRydXN0ZWQsIHhockRldGFpbHMuZGlyZWN0aXZlKTsKICAgICAgICAgICAgICAgIGlmICggeGhyVGV4dCBpbnN0YW5jZW9mIFByb21pc2UgKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyVGV4dCA9IHhoclRleHQudGhlbih0ZXh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyRGV0YWlscy5wcm9wcy5yZXNwb25zZS52YWx1ZSA9IHRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHhockRldGFpbHMucHJvcHMucmVzcG9uc2VUZXh0LnZhbHVlID0gdGV4dDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgeGhyRGV0YWlscy5wcm9wcy5yZXNwb25zZS52YWx1ZSA9IHhoclRleHQ7CiAgICAgICAgICAgICAgICAgICAgeGhyRGV0YWlscy5wcm9wcy5yZXNwb25zZVRleHQudmFsdWUgPSB4aHJUZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgeGhyRGV0YWlscy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCB4aHJEZXRhaWxzLmRlZmVyID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHhockRldGFpbHMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IGAke3hockRldGFpbHMucHJvcHMucmVzcG9uc2UudmFsdWV9YC5sZW5ndGg7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4aHJEZXRhaWxzLnhociwgewogICAgICAgICAgICAgICAgICAgIHJlYWR5U3RhdGU6IHsgdmFsdWU6IDQgfSwKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVVSTDogeyB2YWx1ZTogeGhyRGV0YWlscy51cmwgfSwKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHsgdmFsdWU6IDIwMCB9LAogICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHsgdmFsdWU6ICdPSycgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGhyRGV0YWlscy54aHIsIHhockRldGFpbHMucHJvcHMpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSh4aHJUZXh0KS50aGVuKCggKSA9PiB4aHJEZXRhaWxzKS50aGVuKGRldGFpbHMgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGV0YWlscy54aHIsIHsKICAgICAgICAgICAgICAgICAgICByZWFkeVN0YXRlOiB7IHZhbHVlOiAxLCBjb25maWd1cmFibGU6IHRydWUgfSwKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVVSTDogeyB2YWx1ZTogeGhyRGV0YWlscy51cmwgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgc2FmZURpc3BhdGNoRXZlbnQoZGV0YWlscy54aHIsICdyZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZGV0YWlsczsKICAgICAgICAgICAgfSkudGhlbihkZXRhaWxzID0+IHsKICAgICAgICAgICAgICAgIHhockRldGFpbHMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IGAke2RldGFpbHMucHJvcHMucmVzcG9uc2UudmFsdWV9YC5sZW5ndGg7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkZXRhaWxzLnhociwgewogICAgICAgICAgICAgICAgICAgIHJlYWR5U3RhdGU6IHsgdmFsdWU6IDIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LAogICAgICAgICAgICAgICAgICAgIHN0YXR1czogeyB2YWx1ZTogMjAwIH0sCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogeyB2YWx1ZTogJ09LJyB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzYWZlRGlzcGF0Y2hFdmVudChkZXRhaWxzLnhociwgJ3JlYWR5c3RhdGVjaGFuZ2UnKTsKICAgICAgICAgICAgICAgIHJldHVybiBkZXRhaWxzOwogICAgICAgICAgICB9KS50aGVuKGRldGFpbHMgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGV0YWlscy54aHIsIHsKICAgICAgICAgICAgICAgICAgICByZWFkeVN0YXRlOiB7IHZhbHVlOiAzLCBjb25maWd1cmFibGU6IHRydWUgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGV0YWlscy54aHIsIGRldGFpbHMucHJvcHMpOwogICAgICAgICAgICAgICAgc2FmZURpc3BhdGNoRXZlbnQoZGV0YWlscy54aHIsICdyZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZGV0YWlsczsKICAgICAgICAgICAgfSkudGhlbihkZXRhaWxzID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRldGFpbHMueGhyLCB7CiAgICAgICAgICAgICAgICAgICAgcmVhZHlTdGF0ZTogeyB2YWx1ZTogNCB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzYWZlRGlzcGF0Y2hFdmVudChkZXRhaWxzLnhociwgJ3JlYWR5c3RhdGVjaGFuZ2UnKTsKICAgICAgICAgICAgICAgIHNhZmVEaXNwYXRjaEV2ZW50KGRldGFpbHMueGhyLCAnbG9hZCcpOwogICAgICAgICAgICAgICAgc2FmZURpc3BhdGNoRXZlbnQoZGV0YWlscy54aHIsICdsb2FkZW5kJyk7CiAgICAgICAgICAgICAgICBzYWZlLnVib0xvZyhsb2dQcmVmaXgsIGBQcmV2ZW50ZWQgd2l0aCByZXNwb25zZTpcbiR7ZGV0YWlscy54aHIucmVzcG9uc2V9YCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBnZXRSZXNwb25zZUhlYWRlcihoZWFkZXJOYW1lKSB7CiAgICAgICAgICAgIGNvbnN0IHhockRldGFpbHMgPSB4aHJJbnN0YW5jZXMuZ2V0KHRoaXMpOwogICAgICAgICAgICBpZiAoIHhockRldGFpbHMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlYWR5U3RhdGUgPCB0aGlzLkhFQURFUlNfUkVDRUlWRUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB4aHJEZXRhaWxzLmhlYWRlcnNbaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpXTsKICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJyApIHsgcmV0dXJuIHZhbHVlOyB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBnZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB7CiAgICAgICAgICAgIGNvbnN0IHhockRldGFpbHMgPSB4aHJJbnN0YW5jZXMuZ2V0KHRoaXMpOwogICAgICAgICAgICBpZiAoIHhockRldGFpbHMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlYWR5U3RhdGUgPCB0aGlzLkhFQURFUlNfUkVDRUlWRUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgb3V0ID0gW107CiAgICAgICAgICAgIGZvciAoIGNvbnN0IFsgbmFtZSwgdmFsdWUgXSBvZiBPYmplY3QuZW50cmllcyh4aHJEZXRhaWxzLmhlYWRlcnMpICkgewogICAgICAgICAgICAgICAgaWYgKCAhdmFsdWUgKSB7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICBvdXQucHVzaChgJHtuYW1lfTogJHt2YWx1ZX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG91dC5sZW5ndGggIT09IDAgKSB7IG91dC5wdXNoKCcnKTsgfQogICAgICAgICAgICByZXR1cm4gb3V0LmpvaW4oJ1xyXG4nKTsKICAgICAgICB9CiAgICB9OwogICAgc2VsZi5YTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3Blbi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBYSFJCZWZvcmUub3Blbi50b1N0cmluZygpOwogICAgfTsKICAgIHNlbGYuWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnNlbmQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWEhSQmVmb3JlLnNlbmQudG9TdHJpbmcoKTsKICAgIH07CiAgICBzZWxmLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5nZXRSZXNwb25zZUhlYWRlci50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBYSFJCZWZvcmUuZ2V0UmVzcG9uc2VIZWFkZXIudG9TdHJpbmcoKTsKICAgIH07CiAgICBzZWxmLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5nZXRBbGxSZXNwb25zZUhlYWRlcnMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWEhSQmVmb3JlLmdldEFsbFJlc3BvbnNlSGVhZGVycy50b1N0cmluZygpOwogICAgfTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZFByZXZlbnRYaHIoLi4uYXJncykgewogICAgcmV0dXJuIHByZXZlbnRYaHJGbih0cnVlLCAuLi5hcmdzKTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-prevent-dom-bypass.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gc2FmZVNlbGYoKSB7CiAgICBpZiAoIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgKSB7CiAgICAgICAgcmV0dXJuIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGY7CiAgICB9CiAgICBjb25zdCBzZWxmID0gZ2xvYmFsVGhpczsKICAgIGNvbnN0IHNhZmUgPSB7CiAgICAgICAgJ0FycmF5X2Zyb20nOiBBcnJheS5mcm9tLAogICAgICAgICdFcnJvcic6IHNlbGYuRXJyb3IsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nRm4nOiBzZWxmLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZywKICAgICAgICAnRnVuY3Rpb25fdG9TdHJpbmcnOiB0aGlzQXJnID0+IHNhZmUuRnVuY3Rpb25fdG9TdHJpbmdGbi5jYWxsKHRoaXNBcmcpLAogICAgICAgICdNYXRoX2Zsb29yJzogTWF0aC5mbG9vciwKICAgICAgICAnTWF0aF9tYXgnOiBNYXRoLm1heCwKICAgICAgICAnTWF0aF9taW4nOiBNYXRoLm1pbiwKICAgICAgICAnTWF0aF9yYW5kb20nOiBNYXRoLnJhbmRvbSwKICAgICAgICAnT2JqZWN0JzogT2JqZWN0LAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydHknOiBPYmplY3QuZGVmaW5lUHJvcGVydHkuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfZGVmaW5lUHJvcGVydGllcyc6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2Zyb21FbnRyaWVzJzogT2JqZWN0LmZyb21FbnRyaWVzLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2dldE93blByb3BlcnR5RGVzY3JpcHRvcic6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfaGFzT3duJzogT2JqZWN0Lmhhc093bi5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF90b1N0cmluZyc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ1JlZ0V4cCc6IHNlbGYuUmVnRXhwLAogICAgICAgICdSZWdFeHBfdGVzdCc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS50ZXN0LAogICAgICAgICdSZWdFeHBfZXhlYyc6IHNlbGYuUmVnRXhwLnByb3RvdHlwZS5leGVjLAogICAgICAgICdSZXF1ZXN0X2Nsb25lJzogc2VsZi5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSwKICAgICAgICAnU3RyaW5nJzogc2VsZi5TdHJpbmcsCiAgICAgICAgJ1N0cmluZ19mcm9tQ2hhckNvZGUnOiBTdHJpbmcuZnJvbUNoYXJDb2RlLAogICAgICAgICdTdHJpbmdfc3BsaXQnOiBTdHJpbmcucHJvdG90eXBlLnNwbGl0LAogICAgICAgICdYTUxIdHRwUmVxdWVzdCc6IHNlbGYuWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgJ2FkZEV2ZW50TGlzdGVuZXInOiBzZWxmLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyLAogICAgICAgICdyZW1vdmVFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwKICAgICAgICAnZmV0Y2gnOiBzZWxmLmZldGNoLAogICAgICAgICdKU09OJzogc2VsZi5KU09OLAogICAgICAgICdKU09OX3BhcnNlRm4nOiBzZWxmLkpTT04ucGFyc2UsCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5Rm4nOiBzZWxmLkpTT04uc3RyaW5naWZ5LAogICAgICAgICdKU09OX3BhcnNlJzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9wYXJzZUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnSlNPTl9zdHJpbmdpZnknOiAoLi4uYXJncykgPT4gc2FmZS5KU09OX3N0cmluZ2lmeUZuLmNhbGwoc2FmZS5KU09OLCAuLi5hcmdzKSwKICAgICAgICAnbG9nJzogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgbG9nTGV2ZWw6IDAsCiAgICAgICAgLy8gTWV0aG9kcwogICAgICAgIG1ha2VMb2dQcmVmaXgoLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIgJiYgYFske2FyZ3Muam9pbignIFx1MjA1RCAnKX1dYCB8fCAnJzsKICAgICAgICB9LAogICAgICAgIHVib0xvZyguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdpbmZvJywgLi4uYXJncyk7CiAgICAgICAgICAgIAogICAgICAgIH0sCiAgICAgICAgdWJvRXJyKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKCB0aGlzLnNlbmRUb0xvZ2dlciA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBhcmdzID09PSB1bmRlZmluZWQgfHwgYXJnc1swXSA9PT0gJycgKSB7IHJldHVybjsgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Mb2dnZXIoJ2Vycm9yJywgLi4uYXJncyk7CiAgICAgICAgfSwKICAgICAgICBlc2NhcGVSZWdleENoYXJzKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfSwKICAgICAgICBpbml0UGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgaWYgKCBwYXR0ZXJuID09PSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IG1hdGNoQWxsOiB0cnVlLCBleHBlY3Q6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3QgPSAob3B0aW9ucy5jYW5OZWdhdGUgIT09IHRydWUgfHwgcGF0dGVybi5zdGFydHNXaXRoKCchJykgPT09IGZhbHNlKTsKICAgICAgICAgICAgaWYgKCBleHBlY3QgPT09IGZhbHNlICkgewogICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlOiBuZXcgdGhpcy5SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSB8fCBvcHRpb25zLmZsYWdzCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3QsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggb3B0aW9ucy5mbGFncyAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBwYXR0ZXJuLCBleHBlY3QgfTsKICAgICAgICB9LAogICAgICAgIHRlc3RQYXR0ZXJuKGRldGFpbHMsIGhheXN0YWNrKSB7CiAgICAgICAgICAgIGlmICggZGV0YWlscy5tYXRjaEFsbCApIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICAgICAgaWYgKCBkZXRhaWxzLnJlICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVnRXhwX3Rlc3QuY2FsbChkZXRhaWxzLnJlLCBoYXlzdGFjaykgPT09IGRldGFpbHMuZXhwZWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyhkZXRhaWxzLnBhdHRlcm4pID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICB9LAogICAgICAgIHBhdHRlcm5Ub1JlZ2V4KHBhdHRlcm4sIGZsYWdzID0gdW5kZWZpbmVkLCB2ZXJiYXRpbSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7IHJldHVybiAvXi87IH0KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvXlwvKC4rKVwvKFtnaW1zdV0qKSQvLmV4ZWMocGF0dGVybik7CiAgICAgICAgICAgIGlmICggbWF0Y2ggPT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZVN0ciA9IHRoaXMuZXNjYXBlUmVnZXhDaGFycyhwYXR0ZXJuKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHZlcmJhdGltID8gYF4ke3JlU3RyfSRgIDogcmVTdHIsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAvXi87CiAgICAgICAgfSwKICAgICAgICBnZXRFeHRyYUFyZ3MoYXJncywgb2Zmc2V0ID0gMCkgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXJncy5zbGljZShvZmZzZXQpLnJlZHVjZSgob3V0LCB2LCBpLCBhKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIChpICYgMSkgPT09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBhW2krMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAvXlxkKyQvLnRlc3QocmF3VmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmF3VmFsdWUsIDEwKQogICAgICAgICAgICAgICAgICAgICAgICA6IHJhd1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFsgYVtpXSwgdmFsdWUgXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLk9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTsKICAgICAgICB9LAogICAgICAgIG9uSWRsZShmbiwgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2soZm4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgICAgfSwKICAgICAgICBvZmZJZGxlKGlkKSB7CiAgICAgICAgICAgIGlmICggc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgICAgfQogICAgfTsKICAgIHNjcmlwdGxldEdsb2JhbHMuc2FmZVNlbGYgPSBzYWZlOwogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLmJjU2VjcmV0ID09PSB1bmRlZmluZWQgKSB7IHJldHVybiBzYWZlOyB9CiAgICAvLyBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgbG9nZ2VyIGlzIG9wZW5lZAogICAgc2FmZS5sb2dMZXZlbCA9IHNjcmlwdGxldEdsb2JhbHMubG9nTGV2ZWwgfHwgMTsKICAgIGxldCBsYXN0TG9nVHlwZSA9ICcnOwogICAgbGV0IGxhc3RMb2dUZXh0ID0gJyc7CiAgICBsZXQgbGFzdExvZ1RpbWUgPSAwOwogICAgc2FmZS50b0xvZ1RleHQgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgIGlmICggYXJncy5sZW5ndGggPT09IDAgKSB7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHRleHQgPSBgWyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgfHwgZG9jdW1lbnQubG9jYXRpb24uaHJlZn1dJHthcmdzLmpvaW4oJyAnKX1gOwogICAgICAgIGlmICggdGV4dCA9PT0gbGFzdExvZ1RleHQgJiYgdHlwZSA9PT0gbGFzdExvZ1R5cGUgKSB7CiAgICAgICAgICAgIGlmICggKERhdGUubm93KCkgLSBsYXN0TG9nVGltZSkgPCA1MDAwICkgeyByZXR1cm47IH0KICAgICAgICB9CiAgICAgICAgbGFzdExvZ1R5cGUgPSB0eXBlOwogICAgICAgIGxhc3RMb2dUZXh0ID0gdGV4dDsKICAgICAgICBsYXN0TG9nVGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuIHRleHQ7CiAgICB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCBiYyA9IG5ldyBzZWxmLkJyb2FkY2FzdENoYW5uZWwoc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCk7CiAgICAgICAgbGV0IGJjQnVmZmVyID0gW107CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCBiY0J1ZmZlciA9PT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmNCdWZmZXIucHVzaCh7IHR5cGUsIHRleHQgfSk7CiAgICAgICAgfTsKICAgICAgICBiYy5vbm1lc3NhZ2UgPSBldiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV2LmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAoIG1zZyApIHsKICAgICAgICAgICAgY2FzZSAnaWFtcmVhZHkhJzoKICAgICAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIGJjQnVmZmVyLmZvckVhY2goKHsgdHlwZSwgdGV4dCB9KSA9PgogICAgICAgICAgICAgICAgICAgIGJjLnBvc3RNZXNzYWdlKHsgd2hhdDogJ21lc3NhZ2VUb0xvZ2dlcicsIHR5cGUsIHRleHQgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBiY0J1ZmZlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvT25lJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NldFNjcmlwdGxldExvZ0xldmVsVG9Ud28nOgogICAgICAgICAgICAgICAgc2FmZS5sb2dMZXZlbCA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYmMucG9zdE1lc3NhZ2UoJ2FyZXlvdXJlYWR5PycpOwogICAgfSBjYXRjaCB7CiAgICAgICAgc2FmZS5zZW5kVG9Mb2dnZXIgPSAodHlwZSwgLi4uYXJncykgPT4gewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gc2FmZS50b0xvZ1RleHQodHlwZSwgLi4uYXJncyk7CiAgICAgICAgICAgIGlmICggdGV4dCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm47IH0KICAgICAgICAgICAgc2FmZS5sb2coYHVCTyAke3RleHR9YCk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBzYWZlOwp9CmZ1bmN0aW9uIHByb3h5QXBwbHlGbigKICAgIHRhcmdldCA9ICcnLAogICAgaGFuZGxlciA9ICcnCikgewogICAgbGV0IGNvbnRleHQgPSBnbG9iYWxUaGlzOwogICAgbGV0IHByb3AgPSB0YXJnZXQ7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgY29uc3QgcG9zID0gcHJvcC5pbmRleE9mKCcuJyk7CiAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0W3Byb3Auc2xpY2UoMCwgcG9zKV07CiAgICAgICAgaWYgKCBjb250ZXh0IGluc3RhbmNlb2YgT2JqZWN0ID09PSBmYWxzZSApIHsgcmV0dXJuOyB9CiAgICAgICAgcHJvcCA9IHByb3Auc2xpY2UocG9zKzEpOwogICAgfQogICAgY29uc3QgZm4gPSBjb250ZXh0W3Byb3BdOwogICAgaWYgKCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID0gY2xhc3MgewogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluaXQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5pdChjYWxsRm4sIGNhbGxBcmdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxGbiA9IGNhbGxGbjsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5jb25zdHJ1Y3QodGhpcy5jYWxsRm4sIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQoLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzID0gW107CiAgICAgICAgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCB0aGlzQXJnLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsQXJncyA9IGNhbGxBcmdzOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmbGVjdCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBSZWZsZWN0LmFwcGx5KHRoaXMuY2FsbEZuLCB0aGlzLnRoaXNBcmcsIHRoaXMuY2FsbEFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSB0aGlzLnRoaXNBcmcgPSB0aGlzLmNhbGxBcmdzID0gdGhpcy5wcml2YXRlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5sZW5ndGggIT09IDAKICAgICAgICAgICAgICAgICAgICA/IHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnBvcCgpLmluaXQoLi4uYXJncykKICAgICAgICAgICAgICAgICAgICA6IG5ldyBwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yID0gbmV3IE1hcCgpOwogICAgfQogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmhhcyh0YXJnZXQpID09PSBmYWxzZSApIHsKICAgICAgICBwcm94eUFwcGx5Rm4uaXNDdG9yLnNldCh0YXJnZXQsIGZuLnByb3RvdHlwZT8uY29uc3RydWN0b3IgPT09IGZuKTsKICAgIH0KICAgIGNvbnN0IGZuU3RyID0gZm4udG9TdHJpbmcoKTsKICAgIGNvbnN0IHRvU3RyaW5nID0gKGZ1bmN0aW9uIHRvU3RyaW5nKCkgeyByZXR1cm4gZm5TdHI7IH0pLmJpbmQobnVsbCk7CiAgICBjb25zdCBwcm94eURldGFpbHMgPSB7CiAgICAgICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIHRoaXNBcmcsIGFyZ3MpKTsKICAgICAgICB9LAogICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgaWYgKCBwcm9wID09PSAndG9TdHJpbmcnICkgeyByZXR1cm4gdG9TdHJpbmc7IH0KICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7CiAgICAgICAgfSwKICAgIH07CiAgICBpZiAoIHByb3h5QXBwbHlGbi5pc0N0b3IuZ2V0KHRhcmdldCkgKSB7CiAgICAgICAgcHJveHlEZXRhaWxzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHRhcmdldCwgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQ3RvckNvbnRleHQuZmFjdG9yeSh0YXJnZXQsIGFyZ3MpKTsKICAgICAgICB9OwogICAgfQogICAgY29udGV4dFtwcm9wXSA9IG5ldyBQcm94eShmbiwgcHJveHlEZXRhaWxzKTsKfQoKICAoZnVuY3Rpb24gdHJ1c3RlZFByZXZlbnREb21CeXBhc3MoCiAgICBtZXRob2RQYXRoID0gJycsCiAgICB0YXJnZXRQcm9wID0gJycKKSB7CiAgICBpZiAoIG1ldGhvZFBhdGggPT09ICcnICkgeyByZXR1cm47IH0KICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgY29uc3QgbG9nUHJlZml4ID0gc2FmZS5tYWtlTG9nUHJlZml4KCd0cnVzdGVkLXByZXZlbnQtZG9tLWJ5cGFzcycsIG1ldGhvZFBhdGgsIHRhcmdldFByb3ApOwogICAgcHJveHlBcHBseUZuKG1ldGhvZFBhdGgsIGZ1bmN0aW9uKGNvbnRleHQpIHsKICAgICAgICBjb25zdCBlbGVtcyA9IG5ldyBTZXQoY29udGV4dC5jYWxsQXJncy5maWx0ZXIoZSA9PiBlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKTsKICAgICAgICBjb25zdCByID0gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgaWYgKCBlbGVtcy5sZW5ndGggPT09IDAgKSB7IHJldHVybiByOyB9CiAgICAgICAgZm9yICggY29uc3QgZWxlbSBvZiBlbGVtcyApIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICggYCR7ZWxlbS5jb250ZW50V2luZG93fWAgIT09ICdbb2JqZWN0IFdpbmRvd10nICkgeyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgaWYgKCBlbGVtLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiAhPT0gJ2Fib3V0OmJsYW5rJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGVsZW0uY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBzZWxmLmxvY2F0aW9uLmhyZWYgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggdGFyZ2V0UHJvcCAhPT0gJycgKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IG1lID0gc2VsZiwgaXQgPSBlbGVtLmNvbnRlbnRXaW5kb3c7CiAgICAgICAgICAgICAgICAgICAgbGV0IGNoYWluID0gdGFyZ2V0UHJvcDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9IGNoYWluLmluZGV4T2YoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwb3MgPT09IC0xICkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wID0gY2hhaW4uc2xpY2UoMCwgcG9zKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWUgPSBtZVtwcm9wXTsgaXQgPSBpdFtwcm9wXTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW4gPSBjaGFpbi5zbGljZShwb3MrMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGl0W2NoYWluXSA9IG1lW2NoYWluXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW0sICdjb250ZW50V2luZG93JywgeyB2YWx1ZTogc2VsZiB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ0J5cGFzcyBwcmV2ZW50ZWQnKTsKICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHI7CiAgICB9KTsKfSkoLi4uYXJncy5zbGljZSgwLCBsYXN0X2FyZ19pbmRleCkpCn0="},{"name":"trusted-override-element-method.js","aliases":[],"kind":{"mime":"application/javascript"},"content":"ewogIGNvbnN0IGFyZ3MgPSBbInt7MX19IiwgInt7Mn19IiwgInt7M319IiwgInt7NH19IiwgInt7NX19IiwgInt7Nn19IiwgInt7N319IiwgInt7OH19IiwgInt7OX19Il07CiAgbGV0IGxhc3RfYXJnX2luZGV4ID0gMDsKICBmb3IgKGNvbnN0IGFyZ19pbmRleCBpbiBhcmdzKSB7CiAgICBpZiAoYXJnc1thcmdfaW5kZXhdID09PSAne3snICsgKE51bWJlcihhcmdfaW5kZXgpICsgMSkgKyAnfX0nKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgbGFzdF9hcmdfaW5kZXggKz0gMTsKICB9CiAgZnVuY3Rpb24gdmFsaWRhdGVDb25zdGFudEZuKHRydXN0ZWQsIHJhdywgZXh0cmFBcmdzID0ge30pIHsKICAgIGNvbnN0IHNhZmUgPSBzYWZlU2VsZigpOwogICAgbGV0IHZhbHVlOwogICAgaWYgKCByYXcgPT09ICd1bmRlZmluZWQnICkgewogICAgICAgIHZhbHVlID0gdW5kZWZpbmVkOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnZmFsc2UnICkgewogICAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICd0cnVlJyApIHsKICAgICAgICB2YWx1ZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICdudWxsJyApIHsKICAgICAgICB2YWx1ZSA9IG51bGw7CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICInJyIgfHwgcmF3ID09PSAnJyApIHsKICAgICAgICB2YWx1ZSA9ICcnOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnW10nIHx8IHJhdyA9PT0gJ2VtcHR5QXJyJyApIHsKICAgICAgICB2YWx1ZSA9IFtdOwogICAgfSBlbHNlIGlmICggcmF3ID09PSAne30nIHx8IHJhdyA9PT0gJ2VtcHR5T2JqJyApIHsKICAgICAgICB2YWx1ZSA9IHt9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAnbm9vcEZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXt9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAndHJ1ZUZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRydWU7IH07CiAgICB9IGVsc2UgaWYgKCByYXcgPT09ICdmYWxzZUZ1bmMnICkgewogICAgICAgIHZhbHVlID0gZnVuY3Rpb24oKXsgcmV0dXJuIGZhbHNlOyB9OwogICAgfSBlbHNlIGlmICggcmF3ID09PSAndGhyb3dGdW5jJyApIHsKICAgICAgICB2YWx1ZSA9IGZ1bmN0aW9uKCl7IHRocm93ICcnOyB9OwogICAgfSBlbHNlIGlmICggL14tP1xkKyQvLnRlc3QocmF3KSApIHsKICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHJhdyk7CiAgICAgICAgaWYgKCBpc05hTihyYXcpICkgeyByZXR1cm47IH0KICAgICAgICBpZiAoIE1hdGguYWJzKHJhdykgPiAweDdGRkYgKSB7IHJldHVybjsgfQogICAgfSBlbHNlIGlmICggdHJ1c3RlZCApIHsKICAgICAgICBpZiAoIHJhdy5zdGFydHNXaXRoKCdqc29uOicpICkgewogICAgICAgICAgICB0cnkgeyB2YWx1ZSA9IHNhZmUuSlNPTl9wYXJzZShyYXcuc2xpY2UoNSkpOyB9IGNhdGNoIHsgcmV0dXJuOyB9CiAgICAgICAgfSBlbHNlIGlmICggcmF3LnN0YXJ0c1dpdGgoJ3snKSAmJiByYXcuZW5kc1dpdGgoJ30nKSApIHsKICAgICAgICAgICAgdHJ5IHsgdmFsdWUgPSBzYWZlLkpTT05fcGFyc2UocmF3KS52YWx1ZTsgfSBjYXRjaCB7IHJldHVybjsgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCBleHRyYUFyZ3MuYXMgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICBpZiAoIGV4dHJhQXJncy5hcyA9PT0gJ2Z1bmN0aW9uJyApIHsKICAgICAgICAgICAgcmV0dXJuICggKSA9PiB2YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKCBleHRyYUFyZ3MuYXMgPT09ICdjYWxsYmFjaycgKSB7CiAgICAgICAgICAgIHJldHVybiAoICkgPT4gKCggKSA9PiB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmICggZXh0cmFBcmdzLmFzID09PSAncmVzb2x2ZWQnICkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKCBleHRyYUFyZ3MuYXMgPT09ICdyZWplY3RlZCcgKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIHNhZmVTZWxmKCkgewogICAgaWYgKCBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmICkgewogICAgICAgIHJldHVybiBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmOwogICAgfQogICAgY29uc3Qgc2VsZiA9IGdsb2JhbFRoaXM7CiAgICBjb25zdCBzYWZlID0gewogICAgICAgICdBcnJheV9mcm9tJzogQXJyYXkuZnJvbSwKICAgICAgICAnRXJyb3InOiBzZWxmLkVycm9yLAogICAgICAgICdGdW5jdGlvbl90b1N0cmluZ0ZuJzogc2VsZi5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsCiAgICAgICAgJ0Z1bmN0aW9uX3RvU3RyaW5nJzogdGhpc0FyZyA9PiBzYWZlLkZ1bmN0aW9uX3RvU3RyaW5nRm4uY2FsbCh0aGlzQXJnKSwKICAgICAgICAnTWF0aF9mbG9vcic6IE1hdGguZmxvb3IsCiAgICAgICAgJ01hdGhfbWF4JzogTWF0aC5tYXgsCiAgICAgICAgJ01hdGhfbWluJzogTWF0aC5taW4sCiAgICAgICAgJ01hdGhfcmFuZG9tJzogTWF0aC5yYW5kb20sCiAgICAgICAgJ09iamVjdCc6IE9iamVjdCwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnR5JzogT2JqZWN0LmRlZmluZVByb3BlcnR5LmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2RlZmluZVByb3BlcnRpZXMnOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9mcm9tRW50cmllcyc6IE9iamVjdC5mcm9tRW50cmllcy5iaW5kKE9iamVjdCksCiAgICAgICAgJ09iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmJpbmQoT2JqZWN0KSwKICAgICAgICAnT2JqZWN0X2hhc093bic6IE9iamVjdC5oYXNPd24uYmluZChPYmplY3QpLAogICAgICAgICdPYmplY3RfdG9TdHJpbmcnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAogICAgICAgICdSZWdFeHAnOiBzZWxmLlJlZ0V4cCwKICAgICAgICAnUmVnRXhwX3Rlc3QnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUudGVzdCwKICAgICAgICAnUmVnRXhwX2V4ZWMnOiBzZWxmLlJlZ0V4cC5wcm90b3R5cGUuZXhlYywKICAgICAgICAnUmVxdWVzdF9jbG9uZSc6IHNlbGYuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUsCiAgICAgICAgJ1N0cmluZyc6IHNlbGYuU3RyaW5nLAogICAgICAgICdTdHJpbmdfZnJvbUNoYXJDb2RlJzogU3RyaW5nLmZyb21DaGFyQ29kZSwKICAgICAgICAnU3RyaW5nX3NwbGl0JzogU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwKICAgICAgICAnWE1MSHR0cFJlcXVlc3QnOiBzZWxmLlhNTEh0dHBSZXF1ZXN0LAogICAgICAgICdhZGRFdmVudExpc3RlbmVyJzogc2VsZi5FdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciwKICAgICAgICAncmVtb3ZlRXZlbnRMaXN0ZW5lcic6IHNlbGYuRXZlbnRUYXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIsCiAgICAgICAgJ2ZldGNoJzogc2VsZi5mZXRjaCwKICAgICAgICAnSlNPTic6IHNlbGYuSlNPTiwKICAgICAgICAnSlNPTl9wYXJzZUZuJzogc2VsZi5KU09OLnBhcnNlLAogICAgICAgICdKU09OX3N0cmluZ2lmeUZuJzogc2VsZi5KU09OLnN0cmluZ2lmeSwKICAgICAgICAnSlNPTl9wYXJzZSc6ICguLi5hcmdzKSA9PiBzYWZlLkpTT05fcGFyc2VGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ0pTT05fc3RyaW5naWZ5JzogKC4uLmFyZ3MpID0+IHNhZmUuSlNPTl9zdHJpbmdpZnlGbi5jYWxsKHNhZmUuSlNPTiwgLi4uYXJncyksCiAgICAgICAgJ2xvZyc6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksCiAgICAgICAgLy8gUHJvcGVydGllcwogICAgICAgIGxvZ0xldmVsOiAwLAogICAgICAgIC8vIE1ldGhvZHMKICAgICAgICBtYWtlTG9nUHJlZml4KC4uLmFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyICYmIGBbJHthcmdzLmpvaW4oJyBcdTIwNUQgJyl9XWAgfHwgJyc7CiAgICAgICAgfSwKICAgICAgICB1Ym9Mb2coLi4uYXJncykgewogICAgICAgICAgICBpZiAoIHRoaXMuc2VuZFRvTG9nZ2VyID09PSB1bmRlZmluZWQgKSB7IHJldHVybjsgfQogICAgICAgICAgICBpZiAoIGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzWzBdID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0xvZ2dlcignaW5mbycsIC4uLmFyZ3MpOwogICAgICAgICAgICAKICAgICAgICB9LAogICAgICAgIHVib0VyciguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICggdGhpcy5zZW5kVG9Mb2dnZXIgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3NbMF0gPT09ICcnICkgeyByZXR1cm47IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvTG9nZ2VyKCdlcnJvcicsIC4uLmFyZ3MpOwogICAgICAgIH0sCiAgICAgICAgZXNjYXBlUmVnZXhDaGFycyhzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpOwogICAgICAgIH0sCiAgICAgICAgaW5pdFBhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIGlmICggcGF0dGVybiA9PT0gJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXRjaEFsbDogdHJ1ZSwgZXhwZWN0OiB0cnVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZXhwZWN0ID0gKG9wdGlvbnMuY2FuTmVnYXRlICE9PSB0cnVlIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID09PSBmYWxzZSk7CiAgICAgICAgICAgIGlmICggZXhwZWN0ID09PSBmYWxzZSApIHsKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICByZTogbmV3IHRoaXMuUmVnRXhwKAogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gfHwgb3B0aW9ucy5mbGFncwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIG9wdGlvbnMuZmxhZ3MgIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmU6IG5ldyB0aGlzLlJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybiksCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmxhZ3MKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsgcGF0dGVybiwgZXhwZWN0IH07CiAgICAgICAgfSwKICAgICAgICB0ZXN0UGF0dGVybihkZXRhaWxzLCBoYXlzdGFjaykgewogICAgICAgICAgICBpZiAoIGRldGFpbHMubWF0Y2hBbGwgKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIGlmICggZGV0YWlscy5yZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJlZ0V4cF90ZXN0LmNhbGwoZGV0YWlscy5yZSwgaGF5c3RhY2spID09PSBkZXRhaWxzLmV4cGVjdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMoZGV0YWlscy5wYXR0ZXJuKSA9PT0gZGV0YWlscy5leHBlY3Q7CiAgICAgICAgfSwKICAgICAgICBwYXR0ZXJuVG9SZWdleChwYXR0ZXJuLCBmbGFncyA9IHVuZGVmaW5lZCwgdmVyYmF0aW0gPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoIHBhdHRlcm4gPT09ICcnICkgeyByZXR1cm4gL14vOyB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL15cLyguKylcLyhbZ2ltc3VdKikkLy5leGVjKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAoIG1hdGNoID09PSBudWxsICkgewogICAgICAgICAgICAgICAgY29uc3QgcmVTdHIgPSB0aGlzLmVzY2FwZVJlZ2V4Q2hhcnMocGF0dGVybik7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh2ZXJiYXRpbSA/IGBeJHtyZVN0cn0kYCA6IHJlU3RyLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSB8fCB1bmRlZmluZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gL14vOwogICAgICAgIH0sCiAgICAgICAgZ2V0RXh0cmFBcmdzKGFyZ3MsIG9mZnNldCA9IDApIHsKICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGFyZ3Muc2xpY2Uob2Zmc2V0KS5yZWR1Y2UoKG91dCwgdiwgaSwgYSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCAoaSAmIDEpID09PSAwICkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gYVtpKzFdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gL15cZCskLy50ZXN0KHJhd1ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHJhd1ZhbHVlLCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgOiByYXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChbIGFbaV0sIHZhbHVlIF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5PYmplY3RfZnJvbUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgfSwKICAgICAgICBvbklkbGUoZm4sIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICAgIH0sCiAgICAgICAgb2ZmSWRsZShpZCkgewogICAgICAgICAgICBpZiAoIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbmNlbElkbGVDYWxsYmFjayhpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgIH0KICAgIH07CiAgICBzY3JpcHRsZXRHbG9iYWxzLnNhZmVTZWxmID0gc2FmZTsKICAgIGlmICggc2NyaXB0bGV0R2xvYmFscy5iY1NlY3JldCA9PT0gdW5kZWZpbmVkICkgeyByZXR1cm4gc2FmZTsgfQogICAgLy8gVGhpcyBpcyBleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGxvZ2dlciBpcyBvcGVuZWQKICAgIHNhZmUubG9nTGV2ZWwgPSBzY3JpcHRsZXRHbG9iYWxzLmxvZ0xldmVsIHx8IDE7CiAgICBsZXQgbGFzdExvZ1R5cGUgPSAnJzsKICAgIGxldCBsYXN0TG9nVGV4dCA9ICcnOwogICAgbGV0IGxhc3RMb2dUaW1lID0gMDsKICAgIHNhZmUudG9Mb2dUZXh0ID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICBpZiAoIGFyZ3MubGVuZ3RoID09PSAwICkgeyByZXR1cm47IH0KICAgICAgICBjb25zdCB0ZXh0ID0gYFske2RvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lIHx8IGRvY3VtZW50LmxvY2F0aW9uLmhyZWZ9XSR7YXJncy5qb2luKCcgJyl9YDsKICAgICAgICBpZiAoIHRleHQgPT09IGxhc3RMb2dUZXh0ICYmIHR5cGUgPT09IGxhc3RMb2dUeXBlICkgewogICAgICAgICAgICBpZiAoIChEYXRlLm5vdygpIC0gbGFzdExvZ1RpbWUpIDwgNTAwMCApIHsgcmV0dXJuOyB9CiAgICAgICAgfQogICAgICAgIGxhc3RMb2dUeXBlID0gdHlwZTsKICAgICAgICBsYXN0TG9nVGV4dCA9IHRleHQ7CiAgICAgICAgbGFzdExvZ1RpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgYmMgPSBuZXcgc2VsZi5Ccm9hZGNhc3RDaGFubmVsKHNjcmlwdGxldEdsb2JhbHMuYmNTZWNyZXQpOwogICAgICAgIGxldCBiY0J1ZmZlciA9IFtdOwogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICggYmNCdWZmZXIgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgIHJldHVybiBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJjQnVmZmVyLnB1c2goeyB0eXBlLCB0ZXh0IH0pOwogICAgICAgIH07CiAgICAgICAgYmMub25tZXNzYWdlID0gZXYgPT4gewogICAgICAgICAgICBjb25zdCBtc2cgPSBldi5kYXRhOwogICAgICAgICAgICBzd2l0Y2ggKCBtc2cgKSB7CiAgICAgICAgICAgIGNhc2UgJ2lhbXJlYWR5ISc6CiAgICAgICAgICAgICAgICBpZiAoIGJjQnVmZmVyID09PSB1bmRlZmluZWQgKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICBiY0J1ZmZlci5mb3JFYWNoKCh7IHR5cGUsIHRleHQgfSkgPT4KICAgICAgICAgICAgICAgICAgICBiYy5wb3N0TWVzc2FnZSh7IHdoYXQ6ICdtZXNzYWdlVG9Mb2dnZXInLCB0eXBlLCB0ZXh0IH0pCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYmNCdWZmZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2V0U2NyaXB0bGV0TG9nTGV2ZWxUb09uZSc6CiAgICAgICAgICAgICAgICBzYWZlLmxvZ0xldmVsID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZXRTY3JpcHRsZXRMb2dMZXZlbFRvVHdvJzoKICAgICAgICAgICAgICAgIHNhZmUubG9nTGV2ZWwgPSAyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGJjLnBvc3RNZXNzYWdlKCdhcmV5b3VyZWFkeT8nKTsKICAgIH0gY2F0Y2ggewogICAgICAgIHNhZmUuc2VuZFRvTG9nZ2VyID0gKHR5cGUsIC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNhZmUudG9Mb2dUZXh0KHR5cGUsIC4uLmFyZ3MpOwogICAgICAgICAgICBpZiAoIHRleHQgPT09IHVuZGVmaW5lZCApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHNhZmUubG9nKGB1Qk8gJHt0ZXh0fWApOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gc2FmZTsKfQpmdW5jdGlvbiBwcm94eUFwcGx5Rm4oCiAgICB0YXJnZXQgPSAnJywKICAgIGhhbmRsZXIgPSAnJwopIHsKICAgIGxldCBjb250ZXh0ID0gZ2xvYmFsVGhpczsKICAgIGxldCBwcm9wID0gdGFyZ2V0OwogICAgZm9yICg7OykgewogICAgICAgIGNvbnN0IHBvcyA9IHByb3AuaW5kZXhPZignLicpOwogICAgICAgIGlmICggcG9zID09PSAtMSApIHsgYnJlYWs7IH0KICAgICAgICBjb250ZXh0ID0gY29udGV4dFtwcm9wLnNsaWNlKDAsIHBvcyldOwogICAgICAgIGlmICggY29udGV4dCBpbnN0YW5jZW9mIE9iamVjdCA9PT0gZmFsc2UgKSB7IHJldHVybjsgfQogICAgICAgIHByb3AgPSBwcm9wLnNsaWNlKHBvcysxKTsKICAgIH0KICAgIGNvbnN0IGZuID0gY29udGV4dFtwcm9wXTsKICAgIGlmICggdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nICkgeyByZXR1cm47IH0KICAgIGlmICggcHJveHlBcHBseUZuLkN0b3JDb250ZXh0ID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cyA9IFtdOwogICAgICAgIHByb3h5QXBwbHlGbi5DdG9yQ29udGV4dCA9IGNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgdGhpcy5pbml0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluaXQoY2FsbEZuLCBjYWxsQXJncykgewogICAgICAgICAgICAgICAgdGhpcy5jYWxsRm4gPSBjYWxsRm47CiAgICAgICAgICAgICAgICB0aGlzLmNhbGxBcmdzID0gY2FsbEFyZ3M7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWZsZWN0KCkgewogICAgICAgICAgICAgICAgY29uc3QgciA9IFJlZmxlY3QuY29uc3RydWN0KHRoaXMuY2FsbEZuLCB0aGlzLmNhbGxBcmdzKTsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEZuID0gdGhpcy5jYWxsQXJncyA9IHRoaXMucHJpdmF0ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHByb3h5QXBwbHlGbi5jdG9yQ29udGV4dHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBmYWN0b3J5KC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUFwcGx5Rm4uY3RvckNvbnRleHRzLmxlbmd0aCAhPT0gMAogICAgICAgICAgICAgICAgICAgID8gcHJveHlBcHBseUZuLmN0b3JDb250ZXh0cy5wb3AoKS5pbml0KC4uLmFyZ3MpCiAgICAgICAgICAgICAgICAgICAgOiBuZXcgcHJveHlBcHBseUZuLkN0b3JDb250ZXh0KC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cyA9IFtdOwogICAgICAgIHByb3h5QXBwbHlGbi5BcHBseUNvbnRleHQgPSBjbGFzcyB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5pdCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0KGNhbGxGbiwgdGhpc0FyZywgY2FsbEFyZ3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEZuID0gY2FsbEZuOwogICAgICAgICAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZzsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZmxlY3QoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByID0gUmVmbGVjdC5hcHBseSh0aGlzLmNhbGxGbiwgdGhpcy50aGlzQXJnLCB0aGlzLmNhbGxBcmdzKTsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEZuID0gdGhpcy50aGlzQXJnID0gdGhpcy5jYWxsQXJncyA9IHRoaXMucHJpdmF0ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHByb3h5QXBwbHlGbi5hcHBseUNvbnRleHRzLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0aWMgZmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHlBcHBseUZuLmFwcGx5Q29udGV4dHMubGVuZ3RoICE9PSAwCiAgICAgICAgICAgICAgICAgICAgPyBwcm94eUFwcGx5Rm4uYXBwbHlDb250ZXh0cy5wb3AoKS5pbml0KC4uLmFyZ3MpCiAgICAgICAgICAgICAgICAgICAgOiBuZXcgcHJveHlBcHBseUZuLkFwcGx5Q29udGV4dCguLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcHJveHlBcHBseUZuLmlzQ3RvciA9IG5ldyBNYXAoKTsKICAgIH0KICAgIGlmICggcHJveHlBcHBseUZuLmlzQ3Rvci5oYXModGFyZ2V0KSA9PT0gZmFsc2UgKSB7CiAgICAgICAgcHJveHlBcHBseUZuLmlzQ3Rvci5zZXQodGFyZ2V0LCBmbi5wcm90b3R5cGU/LmNvbnN0cnVjdG9yID09PSBmbik7CiAgICB9CiAgICBjb25zdCBmblN0ciA9IGZuLnRvU3RyaW5nKCk7CiAgICBjb25zdCB0b1N0cmluZyA9IChmdW5jdGlvbiB0b1N0cmluZygpIHsgcmV0dXJuIGZuU3RyOyB9KS5iaW5kKG51bGwpOwogICAgY29uc3QgcHJveHlEZXRhaWxzID0gewogICAgICAgIGFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncykgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlcihwcm94eUFwcGx5Rm4uQXBwbHlDb250ZXh0LmZhY3RvcnkodGFyZ2V0LCB0aGlzQXJnLCBhcmdzKSk7CiAgICAgICAgfSwKICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7CiAgICAgICAgICAgIGlmICggcHJvcCA9PT0gJ3RvU3RyaW5nJyApIHsgcmV0dXJuIHRvU3RyaW5nOyB9CiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApOwogICAgICAgIH0sCiAgICB9OwogICAgaWYgKCBwcm94eUFwcGx5Rm4uaXNDdG9yLmdldCh0YXJnZXQpICkgewogICAgICAgIHByb3h5RGV0YWlscy5jb25zdHJ1Y3QgPSBmdW5jdGlvbih0YXJnZXQsIGFyZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIocHJveHlBcHBseUZuLkN0b3JDb250ZXh0LmZhY3RvcnkodGFyZ2V0LCBhcmdzKSk7CiAgICAgICAgfTsKICAgIH0KICAgIGNvbnRleHRbcHJvcF0gPSBuZXcgUHJveHkoZm4sIHByb3h5RGV0YWlscyk7Cn0KCiAgKGZ1bmN0aW9uIHRydXN0ZWRPdmVycmlkZUVsZW1lbnRNZXRob2QoCiAgICBtZXRob2RQYXRoID0gJycsCiAgICBzZWxlY3RvciA9ICcnLAogICAgZGlzcG9zaXRpb24gPSAnJwopIHsKICAgIGlmICggbWV0aG9kUGF0aCA9PT0gJycgKSB7IHJldHVybjsgfQogICAgY29uc3Qgc2FmZSA9IHNhZmVTZWxmKCk7CiAgICBjb25zdCBsb2dQcmVmaXggPSBzYWZlLm1ha2VMb2dQcmVmaXgoJ3RydXN0ZWQtb3ZlcnJpZGUtZWxlbWVudC1tZXRob2QnLCBtZXRob2RQYXRoLCBzZWxlY3RvciwgZGlzcG9zaXRpb24pOwogICAgY29uc3QgZXh0cmFBcmdzID0gc2FmZS5nZXRFeHRyYUFyZ3MoQXJyYXkuZnJvbShhcmd1bWVudHMpLCAzKTsKICAgIHByb3h5QXBwbHlGbihtZXRob2RQYXRoLCBmdW5jdGlvbihjb250ZXh0KSB7CiAgICAgICAgbGV0IG92ZXJyaWRlID0gc2VsZWN0b3IgPT09ICcnOwogICAgICAgIGlmICggb3ZlcnJpZGUgPT09IGZhbHNlICkgewogICAgICAgICAgICBjb25zdCB7IHRoaXNBcmcgfSA9IGNvbnRleHQ7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBvdmVycmlkZSA9IHRoaXNBcmcuY2xvc2VzdChzZWxlY3RvcikgPT09IHRoaXNBcmc7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggb3ZlcnJpZGUgPT09IGZhbHNlICkgewogICAgICAgICAgICByZXR1cm4gY29udGV4dC5yZWZsZWN0KCk7CiAgICAgICAgfQogICAgICAgIHNhZmUudWJvTG9nKGxvZ1ByZWZpeCwgJ092ZXJyaWRkZW4nKTsKICAgICAgICBpZiAoIGRpc3Bvc2l0aW9uID09PSAnJyApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKCBkaXNwb3NpdGlvbiA9PT0gJ2RlYnVnJyAmJiBzYWZlLmxvZ0xldmVsICE9PSAwICkgewogICAgICAgICAgICBkZWJ1Z2dlcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1kZWJ1Z2dlcgogICAgICAgIH0KICAgICAgICBpZiAoIGRpc3Bvc2l0aW9uID09PSAndGhyb3cnICkgewogICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbGlkYXRlQ29uc3RhbnRGbih0cnVlLCBkaXNwb3NpdGlvbiwgZXh0cmFBcmdzKTsKICAgIH0pOwp9KSguLi5hcmdzLnNsaWNlKDAsIGxhc3RfYXJnX2luZGV4KSkKfQ=="}]